LLMの学習データは、Webページが大半を占めています。Webページと言えばHTMLで書かれているのだから、HTMLはLLMにとって母語のようなものではないか——そう考えるのは自然です。
ところが、公開されている学習データの作り方をたどると、話が違っていました。Webページから来た厖大な文字列の中に、HTMLのタグはほとんど残っていません。 学習の前に、剥がされているからです。
Common Crawlは、同じページを2つの形で配っている
学習データの元になっているのは、Common Crawl(コモンクロール)というWebページの収集事業です。非営利団体が世界中のページを定期的に巡回して集め、誰でも使える形で配っています。
配られる形式が3つあり、そのうち2つが今回の話に関係します(公式の説明)。
| 形式 | 中身 |
|---|---|
| WARC | サーバーから返ってきたそのままの記録。HTMLのタグを含む |
| WET | そこから文字だけを抜き出したもの。タグは含まれない |
同じページが、タグ付きとタグ無しの2通りで用意されているということです。どちらを使うかは、学習データを作る側が選びます。
LLaMAが読んだWebページは、タグ無しの側だった
内訳が公表されている例として、Metaが2023年に発表したLLaMAの論文(arXiv:2302.13971)を見ます。事前学習——最初に行う大量の読み込み——に使ったデータのうち、CommonCrawlが67%、C4が15%で、Webページ由来が合わせて82%を占めます。
この82%が、どちらの形式から作られたのか。論文は、CommonCrawlの処理にCCNetという道具を使ったと書いています。そのCCNetの論文(arXiv:1911.00359)には、こうあります。
We focus on preprocessing the text (WET) format of the common crawl snapshots.
(コモンクロールの、テキスト形式であるWETを前処理の対象とする)
タグ無しの側です。 残り15%のC4も、同じくWebページのテキストから作られています。つまりLLaMAが読んだWebページ82%は、タグが取り除かれた後の文字列でした。
剥がされたのはWebページだけではありません。LLaMAの論文は、技術系のQ&Aサイトについても「HTMLタグを除去した」と明記しています。Wikipediaからも、リンクや書式の指定を取り除いたと書かれています。
抜き直しても、行き先はやはりテキスト
もっとも、WETをそのまま使う作り方は評判が良くありません。ページの端に並ぶメニューや定型の文言まで拾ってしまうからです。
2024年に公開された学習データFineWebの論文(arXiv:2406.17557)は、そこを指摘しています。
we found that WET files retained too much boilerplate and menu text
(WETには、決まり文句やメニューの文字が残りすぎていた)
そこでFineWebは、タグ付きのWARCから自分で抜き直す方法を採りました。使ったのはtrafilatura(トラフィラトゥーラ)という、HTMLから本文だけを取り出すための道具です。
ただし、抜き直した先もやはりテキストです。 この道具の仕事は、ヘッダー・フッター・広告・ナビゲーションを捨てて本文を残すことなので、<div>も<style>も一緒に落ちます。WARCを選んだのは、より良いテキストを得るためであって、タグを残すためではありません。
なお、ここまでは公開されているデータセットの話です。各社が実際に何をしているかは公表されていません。
それでもHTMLを書けるのは、別の経路があるから
とはいえ、LLMはHTMLをよく書きます。剥がされているのなら、どこで覚えたのか。経路が2つ考えられます。
1つ目は、ソースコードの置き場です。 LLaMAの内訳ではGitHubが4.5%を占めます。ここにある.htmlや.cssは、ファイルとして読まれます。この経路は、PythonでもRustでもまったく同じです。HTMLは他のプログラミング言語と同列の入り方をしていて、特別扱いはされていません。
2つ目は、HTMLの解説記事です。 入門記事に載っているコード例は、ブラウザの画面上でも文字として表示されます。だから本文の抽出を通り抜けます。
ここで妙な逆転が起きています。LLMがHTMLを見たのは、HTMLで書かれたページからではなく、HTMLについて書かれたページからだということです。
CSSはもっと極端です。CSSが画面に文字として表示されることは、まずありません。<style>の中も.cssファイルも、本文の抽出では確実に落ちます。CSSは、コードとして読まれた分しか入っていないことになります。
頼んでいないのにMarkdownで返ってくるのは、別の事情
では、母語に当たるものがあるとすれば何か。Markdownのほうが近いと、書いた側は考えています。
Markdownは、剥がす工程を通りません。 GitHubのREADME、各種の説明書、技術系の投稿は、もとからMarkdownで書かれたファイルです。変換を経ずにそのまま読まれます(Markdownそのものについては『Markdownってなんだろう』にまとめました)。
そして出力の側です。LLMは、誰も指示していないのに、見出しの##や箇条書きの- といったMarkdownの記号を使って答えます。 これは事前学習の後に行う事後学習——人の好む答え方に調整する工程——の結果だと考えられます(この工程については『LLMはなぜ何でもできるのか』に書きました)。
ただし各社は事後学習の中身を公表していないので、ここは推測です。 確かなのは、頼んでいなくてもMarkdownで返ってくるという観察のほうです。
読む側と書く側の両方で使われている記法は、いまのところMarkdownだけです。HTMLは、読んだことはあっても、放っておいて出てくる形ではありません。
まとめ
- Common Crawlは、タグ付きのWARCとタグ無しのWETを両方配っている
- LLaMAが読んだWebページ82%は、タグ無しの側。CCNetもC4も、テキストから作られている
- FineWebはWARCから抜き直したが、それはより良いテキストを得るためで、タグを残すためではない
- HTMLとCSSは、GitHubのファイルと、HTMLについて書かれた解説記事から入っている。他のプログラミング言語と同じ経路
- 入力でも出力でも使われている記法はMarkdown。 ただし出力側の理由は、各社が公表していないので推測