Dance with Agents

LLMの中でやっていることは2つだけ。語を数値の並びに変え、その並びを何十回も書き換えている

ミディアム専門用語を名前のまま使います。初出で解説を添えるので、順に読めば追えます

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枚の層がやっているのは、まとめるとこれだけです。

  1. 文中の語の点を、同時に受け取る
  2. 語ごとに、どこからどれだけ取り込むかを決める(ヘッド)
  3. その配分で他の語の点を掛けて足す(点が動く)
  4. さらに掛ける数で動かす
  5. 数値の桁をそろえ直す
  6. 次の層へ渡す

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枚では足りないので、何十枚も通して少しずつ寄せる

LLMの仕組みの記事

LLMの仕組みのページへ →