ゼロから作りながら学ぶLLM第3章読書感想

힘센캥거루
2025년 10월 29일(수정됨)
1
11
challenge

MacBookに大量の水をこぼしてパニックになり、3〜4日無駄にした。

今考えてみると、どうせMacBookは駄目になったし、修理に出すと思って何かをすればよかったと思う。

とにかく少し遅れたけど、最後までやるべきだと思い、第3章の感想を残す。

1. アテンションメカニズム

3章の主な内容はアテンションメカニズムだ。

アテンションは文字通り文のどの部分に注目したいかを示す。

例えば私は昨日ご飯を食べたという文を理解してみよう。

私たちは自然に昨日ご飯食べたのような単語に集中することになる。

このように処理中の単語を理解するためにはどの単語との結合が必要であり、アテンションメカニズムを通じて単語の組み合わせで文脈を理解できるようにする。

ゼロから作りながら学ぶLLM第3章読書感想-1

2. セルフアテンション

セルフアテンションは文中のトークン間の関係を求めるものだ。

すでにトークンを以下のように埋め込みベクトルで実装したとしよう。

import torch

inputs = torch.tensor(
  [[0.43, 0.15, 0.89], # Your     (x^1)
   [0.55, 0.87, 0.66], # journey  (x^2)
   [0.57, 0.85, 0.64], # starts   (x^3)
   [0.22, 0.58, 0.33], # with     (x^4)
   [0.77, 0.25, 0.10], # one      (x^5)
   [0.05, 0.80, 0.55]] # step     (x^6)
)

ここで目的のトークン1つに対して他のトークンのドット積を通じてトークン間の関係をアテンションスコアとして得る。

この時ドット積という概念が新しく見えるかもしれないが、行列でのドット積ベクトルでの内積と同じだ。

ゼロから作りながら学ぶLLM第3章読書感想-2

これは2つのベクトルの方向性が似ているほど大きな値を持ち、互いに直角の場合は0と同じ値を持つということ。

これを通じて2つの埋め込みがどれくらいの類似性を持っているか確認できる。

ベクトル自体を見るのではなく2つのベクトルの類似性を見る理由は、埋め込みを初期化するとき無意味なベクトルをばらまくからだ。

したがってベクトル自体を測定することは意味がない。

ゼロから作りながら学ぶLLM第3章読書感想-3

そしてアテンションの重みの合計が1になるように正規化した後、入力ベクトルとアテンションの重みを掛けて合計する。

アテンションの重みが高いほど文脈ベクトルに与える影響が大きいため、各埋め込みの間でクエリとして入力した埋め込みの適切な位置の方向をベクトルで得ることになる。

これを文脈ベクトルという。

このようにすべての埋め込みに対して計算すると以下のような形のテンソルを得ることになる。

tensor([[0.4421, 0.5931, 0.5790],
        [0.4419, 0.6515, 0.5683],
        [0.4431, 0.6496, 0.5671],
        [0.4304, 0.6298, 0.5510],
        [0.4671, 0.5910, 0.5266],
        [0.4177, 0.6503, 0.5645]])

テンソルの構造自体は2次元だが、内部に含まれている内容は3次元の文脈ベクトルだ。

これを利用して各埋め込みが持つ関係を方向性として表現できる。

3. 訓練可能なセルフアテンション

訓練可能なセルフアテンションではそれぞれのキー、クエリ値をより低い次元に縮小する。

この時最初に処理する値はすべて任意の値だ。

処理後に逆伝播プロセスを通じて更新する。

torch.manual_seed(123)

W_query = torch.nn.Parameter(torch.rand(d_in, d_out), requires_grad=False)
W_key   = torch.nn.Parameter(torch.rand(d_in, d_out), requires_grad=False)
W_value = torch.nn.Parameter(torch.rand(d_in, d_out), requires_grad=False)

上記で最初のquery、key、valueの値を見るとすべてがランダムだということがわかる。

最初の値はすべて意味がないが、その後の訓練を通じて意味のある値に変わる。

この過程を通じてある単語に対する文脈ベクトルを得ることができる。

4. コザルアテンション

コザルアテンションはトークンにマスクをかける方式だ。

未来を予測することで次の文脈を予測できるようにする方式だ。

最初にこの内容を知ったとき、過学習の問題が最初に思い浮かんだが...

ChatGPTの答えは違った。

ゼロから作りながら学ぶLLM第3章読書感想-4

過学習防止はコザルアテンションの副次的なもの。

モデルが実際の言語生成の方向(左→右)通りに文脈を学習するのを助ける。

こうして学習された文脈ベクトルは文の意味を理解し、新しい文を生成し、推論と類推も可能にする。

これを目的とする様々な方法が後に出てくる。

5. 質問

本を読みながらいろいろな考えが浮かんだ。

  • ワンホットエンコーダーよりずっと難しい感じだけど、これをやる理由は何だろう?

  • コザルアテンションをやる理由が過学習のためなのか?

ゼロから作りながら学ぶLLM第3章読書感想-5

ChatGPTと本当に長い間話をしたが、結論は以下の通りだ。

答えを知っている
--> モデルが予測ではなくコピーだけするように
--> 損失がほとんど0になる(計算は可能)
--> 勾配(gradient)がほとんど0
--> アップデートがほとんどない
--> 逆伝播に意味のある変化がない
--> 実質的に学習が進まない

例えば、暗い部屋で物を探そうと手で探るとしよう。

この過程が空間を理解し、物を探す能力を育てる。

しかし、既に物の位置を知っていれば探る必要がないため、結局「探す方法」を学習しない。

言語モデルで未来トークンを見ることも同様に答えを知っていれば学習予測能力を失うことになる。

ゼロから作りながら学ぶLLM第3章読書感想-6

だからコザルアテンション(casual attention)は損失を誘導する関数である。

コザルアテンションは未来を隠して損失を発生させ、その損失を基に文脈ベクトルが更新される。

このように予測誤差を減らす過程の中でモデルは文脈をさらに深く理解し、それに応じて推論、類推、評価能力も発達する。

6. 感想

MacBookに水をこぼして1週間が遅れ、それに焦りが生じた。

それで早く読んで進もうとしたが、そうすることはできなかった。

初めて見る文の一つ一つが難しく新鮮に感じられた。

ゼロから作りながら学ぶLLM第3章読書感想-7

なぜここで次元削減した行列を掛けるのか?なぜここで突然マスキングをするのか?

このような疑問に対する答えを探す過程が非常に長くかったるかった。

AIは質問をするとそこに答えてくれたが、それに対して私が新たに解釈を下すと、それについては常に間違っているというので、何が正しい意味なのか非常に長く考えた。

このような考えの過程が私を成長させてくれるのではないかと考える。

第4章では何がまた学べるのか楽しみだ。

댓글을 불러오는 중...