LLMの中身は複雑です。ただし、複雑さの半分は用語が作っています。
「行列」は日常語では店の前にできる人の列ですし、「層」は同じ論文の中で3つの違うものを指しています。中身を理解する前に、言葉の交通整理で消耗する構造になっている。
なので、先に言葉を決めてから始めます。 そのうえで、途中を飛ばさずに下から順に——文章が切られるところから、層を何十枚も通り抜けるところまでを追います。
先に、この記事で使う言葉を決めておきます
| 語 | この記事での意味 |
|---|---|
| 層 | 1回ぶんの処理工程。周りの語から情報を混ぜ、掛ける数で動かし、桁をそろえる——ここまでで1つ |
| 1枚目の層/40枚目の層 | どの層かを番号で言う |
| 入口に近い層/出口に近い層 | どの層かをおおまかに言う |
| 位置 | 意味空間の中での、点の場所。層には使わない |
| ヘッド | 層の中で、周りの語から情報を混ぜる担当 |
| 隠れ状態(英語では hidden state) | 層のあいだを流れていく数値の並び。「隠れ」は秘密の意味ではなく、入口と出口の間にあって外から見えないという意味 |
この割り当ては、この記事が勝手に決めたものです。 他の解説を読むと、同じ語が別の意味で使われています。2017年の論文Attention Is All You Needは、N = 6 identical layers(積み重ねの1枚)とも、two sub-layers(その中の部品)とも、parallel attention layers, or heads(ヘッド)とも書いていて、1本の論文の中で3つの単位をlayerと呼んでいます。
混乱は分野の側にあります。 この記事では1つに絞りますが、外で読むときは別の使い方に出会うと思ってください。
① 文章は、まず短い断片に切られる
「犬が走る」と入力したとします。まず、これが短い断片に切り分けられます。1つ1つをトークンと呼びます。
区切り方は単語とは一致しません。日本語では「走る」が「走」と「る」に割れることもあります(→『LLMは日本語を単語に割っていない』)。ここでは話を単純にして、「犬」「が」「走る」の3つに切れたとして進めます。
② 切られた断片は、表から数値の並びに置き換えられる
コンピュータは「犬」という字のままでは計算できません。数値の並びに置き換えます。
このために、語彙の数だけ行がある表が用意されています。仮に語彙5万語、1行あたり1024個の数値なら、こういう形です。
1列目 2列目 3列目 … 1024列目
犬 0.31 -0.72 0.05 … 0.44
猫 0.28 -0.68 0.11 … 0.39
走る -0.15 0.22 -0.83 … 0.07
(5万行つづく)
「犬」が来たら、犬の行をまるごと取り出します。 これで1024個の数値が得られます。
その1024個に、1個ずつの意味はありません
「1列目が動物らしさ」のような対応はしていません。1024個そろって初めて、意味空間の中の1点を指します。
緯度と経度の2個で地球上の1点が決まるように、1024個で意味空間の1点が決まる。その1点が「犬」の場所です(→『言葉が数字になるまで——ベクトルと、意味の学習』)。
表の中の数値も、掛ける数も、まとめて「パラメータ」
学習によって値が決まった数値を、1つ1つパラメータと呼びます。上の表の中身も、これから登場する掛ける数も、全部これです。
LLMの名前に付く「12B」「31B」は、このパラメータが何個あるかを表しています。Bは10億を意味するbillionの頭文字なので、31Bなら310億個です。
この個数はモデル全体の合計で、入力した文章の長さでは増えません。 学習が終わった時点で値が固定されるからです。
③ 層は、その点を動かす装置
さて、1024個の数値——意味空間の1点——ができました。ここからが層です。
層は、入ってきた1024個を、別の1024個にして返します。 個数は変わりません。変わるのは点の場所です。
なぜ動かすのか。表から取り出した直後の点は、その語を単体で見たときの場所だからです。文の中でどういう意味で使われているかは、まだ入っていません。
「はし」という語なら、取り出した直後は橋・箸・端が混ざったあたりにいます。周りに「川」「架かる」があれば、層を通るたびに、その点が「橋」の場所へ寄っていく(→『AttentionとTransformer——LLMの中で実際に起きている計算』)。
動かし方は「掛けて足す」だけ
数を3個に減らして、実際にやってみます。
入ってきた数値: 2 5 1
ここから出ていく数値の1個目を作ります。やることは、それぞれに掛ける数を決めて、全部足すだけです。
2 × 0.1 = 0.2
5 × -0.3 = -1.5
1 × 0.8 = 0.8
足して → -0.5 ← 出ていく数値の1個目
掛ける数が3個要りました。 入ってきた数値が3個だからです。出ていく数値の1個を作るのに、入ってきた数値を全部見るので、その個数ぶんだけ掛ける数が要ります。
出ていく数値も3個欲しければ、同じ作業をあと2回。掛ける数の中身は毎回違います。
1個目用: 0.1 -0.3 0.8
2個目用: 0.5 0.2 -0.1
3個目用:-0.7 0.4 0.3
3個組が3組で、合計9個。 これが3×3です。
1024個なら、1024個組が1024組で、1,048,576個(約105万個)。この105万個が、その層で点をどう動かすかを決めている数です。
この105万個を、縦横1024×1024のマス目に並べて置いたものを「行列」と呼びます。 名前が付いているだけで、中身は数値が並んだ表です。
掛け算をしても、個数は増えません
ここを取り違えやすいところです。掛け算は105万回しますが、得られる数値は1024個です。
上の3個の例で確かめられます。掛け算は3回しましたが、3つの答えを足して1個にまとめている。 増えた分を足し算が畳んで戻しています。
だから40枚の層を通しても、流れているのは1024個のままです。 形が変わらないから、次の層に渡せます。
④ どの語からどれだけ取り込むかは、その場で計算される
層の中では、その語だけでなく、文中の他の語の点も見ています。 この仕組みがAttentionで、担当する部品をヘッドと呼びます。
「走る」の点を動かすとき、「犬」からどれだけ取り込むかを決める必要があります。この割合を配分と呼ぶことにします。
配分の決め方は、その語が発する問い合わせと、各語が掲げる見出しの、合い具合を測るというものです。この2つには、2017年の論文が付けたQuery(クエリ)、Key(キー)という名前があります。定着した日本語訳が無く、他の解説でも英語のまま書かれているので、ここでもクエリ・キーと呼びます。
- クエリ:この語が何を探しているか。「走る」なら「誰が走るのか」
- キー:この語が自分は何者かと掲げているもの。「犬」なら「私は動作の主になれる」
この2つが噛み合えば、配分が大きくなります。 測り方はここでも「掛けて足す」で、その点数を合計が1になるように割り振り直したものが配分です。実際の数を並べた計算は『Attentionは、クエリとキーを突き合わせて、どの語からどれだけ情報を取り込むかを決めている』に書きました。
配分はどこにも保存されていません。 文が違えば毎回違う配分になります。固定されているのは「どうやってクエリを作るか」という手順のほうです。だから同じモデルで「川に架かるはし」と「ご飯を食べるはし」を読ませると、同じ掛ける数から違う配分が計算されます。
そしてヘッドは1つではありません。 同じ層に何十個も並んでいて、あるヘッドは主語を探し、別のヘッドは時制を見ます。
⑤ これを何十枚も繰り返す
1枚の層がやっているのは、まとめるとこれだけです。
- 文中の語の点を、同時に受け取る
- 語ごとに、どこからどれだけ取り込むかを決める(ヘッド)
- その配分で他の語の点を掛けて足す(点が動く)
- さらに掛ける数で動かす
- 数値の桁をそろえ直す
- 次の層へ渡す
5番目が要るのは、掛けて足すたびに値が膨らむからです。そろえ直さないと、何十枚も通るうちに桁が暴れて計算が壊れます。
そして1枚で正しい場所まで動かすことはできません。 1枚が動かす量は小さく、少しずつ寄せていきます。GPT-3で96枚、Llama 3の405Bモデルで126枚(→『LLMの「層」とは何か——器は設計者が決め、中身は誰も決めていない』)。
入口に近い層は語の表面的な性質を、出口に近い層は文全体の関係を扱う傾向があると知られています。ただし「ここは品詞担当」という割り当てを設計者が決めたわけではありません。 訓練が終わってから調べたら、そうなっていた——という順序です。
全体を通すと、こうなります
「犬が走る」
↓ ① 短い断片に切る →「犬」「が」「走る」
↓ ② 表から行を取り出す → 各語が1024個の数値になる
↓
┌── 1枚目の層 ──┐ 混ぜる → 動かす → 桁をそろえる
└─────────────────┘
↓ 3語ぶんの1024個
⋮ (何十枚も)
↓ 3語ぶんの1024個
┌── 40枚目の層 ─┐
└─────────────────┘
↓
次に来る語の予測
語の数も、1語あたりの数値の個数も、最初から最後まで変わりません。 変わっているのは、それぞれの点がどこにいるかだけです。
膨大なのは、流れている数ではなく置いてある数
最後に、大きさの話を整理します。
| 大きさ | |
|---|---|
| 流れている数値 | 1語あたり1024個。層を何枚通しても変わらない |
| 置いてある掛ける数 | 1枚の層で105万個以上 × 層の枚数 → 数十億〜数百億個 |
「310億パラメータ」は下の行です。 モデルのファイルが何十ギガバイトにもなるのは、この掛ける数を全部保存しているからであって、流れているデータが膨らむからではありません。
ただし、流れているほうも、やり取りが長くなれば嵩みます。 語が増えればその数だけ点が増えるからです。手元でモデルを動かすときに、モデルのファイルの大きさに加えて作業用の余裕が要るのは、これが理由です。
まとめ
- LLMの中でやっていることは2つ。 語を数値の並びに変えることと、その並びを何十回も書き換えること
- 1024個の数値は、意味空間の中の1点を指している。 1個ずつには意味がない
- 層は、その点を動かす装置。 動かし方は「掛ける数を決めて、掛けて足す」だけ
- 掛け算で増えた分は、足し算で1個に畳まれる。 だから個数は増えない
- どの語からどれだけ取り込むかは、その場で計算される。 固定されているのは計算の手順のほう
- 1枚では足りないので、何十枚も通して少しずつ寄せる