背景:「LLM自作入門」(LLM from Scratch(ChatGPTでは、Raschka本と言ってきた))を読んでミニマムLLMを作る(その2)
課題:「2.8章 単語の位置をエンコードする」まで読んで来た。トークンの位置は絶対位置情報を使い、乱数で生成した位置組み込み(pos_embeddings)をトークンのテンソルに加算すると書かれている。が・・・トークンのテンソルに足してしまったら位置なんて分からないのでは??という疑問と、「3.3章 Self-Attentionを使って入力の異なる部分に注意を払う」がどう関係しているのか、分からなくなった
取り組み:ChatGPTに「LLM from Scratchを勉強しているが上記が理解できない」と聞いてみる
結論:ChatGPTではLLM本の内容を詳しく理解していた(どの章かもわかっているようだ)。数学的な式を出されて自分は一旦思考が止まったが、①絶対位置情報は乱数(ユニークなベクトル)で重みが加算されていることが重要で、絶対的な距離を直接表現するために使っているのではない、②SelfAttentionでドット積で、トークン同士の近似性を計算するが、この時、距離情報が加算された状態でドット積が演算されることが重要*1
| 疑問 | 回答 |
|---|---|
| 距離情報の加算とAttention計算の関係(距離を足した新しいトークンのテンソルを使ってAttention計算するのか?) | 距離情報が加算されたトークンをAttentionでドット積で類似性を計算する |
| 距離情報を加算して情報が消えてしまい意味ないのでは? | 距離情報の距離とは単語間の数値的な距離ではない。乱数で生成されたユニークなベクトルであることが重要。Attention計算で距離を含めて演算するので意味ないことがない |
なおLLM本では演算方法はドット積と書かれているが、ChatGPTによると正確には内積であるの回答
詳細:
距離情報は、以下のプログラムでテンソルを計算して、トークンIDのテンソル(256次元のテンソル)に加算してしまう。
pos_embedding_layer = torch.nn.Embedding(length,dim) pos_embeddings = pos_embedding_layer(torch.arange(context_length)) input_embeddings = token_embeddings + pos_embeddigs # トークンの256次元のテンソルに重み情報を加算
だが、、加算すると位置情報が埋もれてしまうのでは?という疑問と、3.3章でのドット積でトークン間の近さを計算する時に距離情報がどう働いているのか分からなかった。ChatGPTに対して本の題名(Build A Larget Language Model from Scratch)と、分からない点を章番号を指定して質問すると、かなり細かく回答してきた。これまでだったら、意味わからず、誰にも相談できず、とりあえず置いといて進むしかなかったけど、ChatGPTは本の内容をかなり詳細に理解しており、分からない点を具体的に質問すると詳しく説明してくれる。
ChatGPTは加算とAttentionの計算の過程をベクトル式で回答してきた。ただ、、議論が進むと、正しさの根拠を数式で表現してくるので、また数式レベルで再度勉強が必要になる。

(位置情報はドット積に参加している・・・まぁ加算したから参加しているだろう。だけど仮に位置情報が一致したり近いベクトル(テンソル?)だった時に、Attentionの演算結果にどう影響を及ぼすのか?まで理解できず)。加算されたベクトル(テンソル?)のドット積がどういう計算になるのがポイントだろうか(分配法則のような計算になるのか)。遅いので今日はここまでとしたい。後日QAを続けるにはどうしたらいいかをChatGPTに質問したら、以下のプロンプトで聞いてくれとの回答
Raschka本 絶対位置埋め込み=学習可能Embeddingを加算 → QKドット積で内積空間が歪む → 次:RoPE / ALiBiとの本質的違い
この歪むというのも、、ちょっと分かりづらくて、歪むって何?と聞くと、分かりやすく表現しましたとか言ってきた。ChatGPTとつっこんだ議論するには、線形代数を復習する必要があるのかも。
LLM本は読者の数学的な知識を考慮して、細かい所は説明せず、プログラムの記述で代用していると思う(詳細な仕組みの説明はせず、プログラムだとこう書きます。動きますよね?に留められていると思う)。実装上の正しさを数式を使って説明し始めると、また専門書レベルになってしまい、路頭に迷う。なのでプログラムのレベルで説明するにとどめるという割り切りはまぁ有効なのかとも思う。実装上の根拠に疑問を感じたら、各自で次のステップ(より細かいレベルの理解)に進んでねということかと。
■まとめ
これまで独学で勉強しても分からない所でつまづいて、勉強が止まったりした。今は生成AIのお陰で、理解できない箇所を質問するといろいろサポートしてくる。質問や相談はできるが、やはり本質的に難しいのか理解が進まず、何度も質問していると生成AIは数式を出して説明してくる。またここで止まってしまう。まずは線形代数の基礎をもういちどやり直す必要があるのかも。
■補足
トークンの位置情報の扱い方として以下の種類あるそうです(ChatGPTより)
- RoPE(回転で相対距離を内積に埋め込む)
- ALiBi(距離に比例したバイアス)
- Relative Positional Encoding
- 絶対位置埋め込み(learnable absolute positional embedding)(LLM本の方式)
*1:重要とはChatGPTから説明を受けたレベルであり、自分はどのように重要なのか?が理解できていない