埋め込みは関数ではなくルックアップ
トークナイザーの後の最初の層
トークナイザーはモデルに整数IDを渡します:[256, 1842, 7301, ...]。トランスフォーマーが最初に行うことは、各IDをd_model個の浮動小数点からなるベクトルに変換することです。このベクトルはd_model次元の空間(ANDREA-120Mでは768次元)に存在します。
埋め込み層は関数ではなくルックアップテーブルです。 巨大な行列を想像してください:
shape: (V, d_model)
row 0: [e_0_0, e_0_1, ..., e_0_767]
row 1: [e_1_0, e_1_1, ..., e_1_767]
...
row 8448: [e_8448_0, e_8448_1, ..., e_8448_767]
トークンID i が、行 i を選択します。直接的な配列アクセスです。算術演算も活性化関数もありません。単なるインデックスです。
学習可能な浮動小数点数
この表の各エントリは、最初は小さなランダムな浮動小数点数(通常、d_model の平方根でスケーリングされた正規分布からサンプリング)として始まります。バックプロパゲーションは、バッチ内でそのトークンIDが出現するたびに各行を更新します。学習後、類似したトークン(cat、dog、pet)は似たベクトルになり、無関係なトークン(cat、Tuesday、xylophone)はベクトル空間内で大きく離れた位置に配置されます。
ANDREA-120M トークン埋め込みコスト
| 数量 | 値 |
|---|---|
| V | 8,449 |
| d_model | 768 |
| パラメータ | 6,488,832 |
トークン埋め込みテーブルだけで約650万のパラメータが存在し、これはANDREA-120M全体の約5.4%を占めます。各語彙スロットには768個の浮動小数点値が割り当てられます。
埋め込みテーブルのサイズ計算
内積は類似度を測る
ベクトルは矢印として
768次元のベクトルは人間には想像できない空間に存在しますが、同じ代数はどの次元でも成り立ちます。トランスフォーマーにとって重要な2つの演算があります:
大きさ(矢印の長さ):
||v|| = sqrt(v_0² + v_1² + ... + v_767²)
ドット積(2つの矢印の間の整列度):
u · v = u_0 × v_0 + u_1 × v_1 + ... + u_767 × v_767
ドット積が示すこと
任意の次元で成り立つ2つの事実:
- u · v = ||u|| × ||v|| × cos(theta), ここで theta は2つのベクトルの間の角度。
- 同じ方向を向くベクトルは大きな正の内積を与える。
- 反対方向を向くベクトルは大きな負の内積を与える。
- 直角のベクトルは内積がゼロになる。
内積 = 正規化されていない類似度。 cat と dog の学習済みトークン埋め込みは、バックプロパゲーションがそれらを近づけたため、高い内積を持つ(どちらもペット関連の文脈を予測する)。cat と Tuesday は、異なる文脈を予測するため、ほぼ直交する。
なぜTransformerは注意を向けるのか
Activity 5 (grow_a_language_model_attention) は、ドット積からアテンションを構築します。クエリベクトルとキー・ベクトルのドット積がスコアを生み、それが次のトークンを予測する際にどの過去トークンが重要かを示します。埋め込みとドット積が、Transformer内部のすべての相互作用を担っています。
類似度を予測する
ANDREAは学習済み位置埋め込みを使用する
問題
トークン埋め込みは、モデルにこの位置にどの単語が存在するかを伝えますが、その単語がどこに位置するかは伝えません。位置情報がない場合、Transformerは the cat sat on a mat と mat a on sat cat the を同一視します。同じトークン集合であり、順序の信号がありません。
Transformerの文献には3つの解決策が存在します:
正弦波(Vaswani 2017). 正弦波と余弦波に基づく固定の数学的公式。位置0は特定の768次元ベクトルを取得し、位置1は別のベクトルを取得します。学習されず、更新もされません。公式により任意の位置に一般化できます。
RoPE (Rotary Position Embedding). 位置に基づいてクエリとキーのベクトルを回転させる。LLaMAやQwenで使用。追加のパラメータは不要で、回転はアテンションに組み込まれている。
Learned. 形状が (T, d_model) の別個の埋め込みテーブル(T はコンテキスト長)。各行はトークン埋め込みと同様にバックプロパゲーションで学習される。
ANDREA's Choice: Learned
ANDREA は microGPT から learned-position の手法を引き継いでおり、microGPT は nanoGPT、nanoGPT は GPT-2 から引き継いでいる。理由:
- シンプルさ。 アテンションに特殊な数学は不要。位置テーブルはトークンテーブルと同じように見える。
- カスタム CUDA との互換性。 ANDREA の microgpt_cuda.cu エンジンは、2 つの埋め込みルックアップを同一に扱う。sin/cos カーネルは不要。
- 固定コンテキストに十分。 ANDREA は T を 1024 に制限。学習済みテーブルは固定長シーケンスに十分対応する。
ANDREA-120M 位置埋め込みコスト
| 数量 | 値 |
|---|---|
| T (context) | 1,024 |
| d_model | 768 |
| Parameters | 786,432 |
位置埋め込み用の0.79Mパラメータ。トークン埋め込みと合わせると: 6.49M + 0.79M = 合計7.27Mの埋め込みパラメータ(ANDREA-120M)。
組み合わせ方
入力シーケンス内の各位置 t において:
x_t = token_embedding[token_id_t] + position_embedding[t]
2つの768次元ベクトルを要素ごとに加算した結果が x_t となり、最初の Transformer ブロックに流れ込みます。以降、モデルはこれらを分離せず、結合された信号を学習して利用します。
Learned Versus Sinusoidal
Where Embedding Parameters Live
A Full ANDREA-120M Embedding Layer
| Component | Shape | Parameters |
|---|---|---|
| トークン埋め込みテーブル | 8,449 × 768 | 6,488,832 |
| 位置埋め込みテーブル | 1,024 × 768 | 786,432 |
| 合計 | 7,275,264 |
約730万パラメータ。ANDREA-120Mの総パラメータ数は約1億2千万。埋め込み層だけで全体の6%。残りの94%はトランスフォーマーブロック(アテンション+MLP、アクティビティ5〜7で解説)。
独立埋め込み vs 共有埋め込み
多くのTransformer設計(GPT-2を含む)では、トークン埋め込みと最終出力射影を結びつけます:同じ V × d_model 行列が入力と出力(語彙に対するlogits)の両方で使用されます。結びつけにより V × d_model パラメータが節約され、しばしば品質が向上します。
ANDREAは結びつけていない埋め込みを使用します:入力埋め込みと出力射影は別々の行列として訓練されます。Activity 7 (grow_a_language_model_transformer_block) で最終層を扱います。
これまでの順伝播
入力:トークンID [256, 1842, 7301, ...](1024個)。各IDは768次元ベクトルを参照します。各位置も768次元ベクトルを参照します。要素ごとに加算します。結果:トークン+位置ベクトルの (1024, 768) 行列 x です。x は transformer block 1 へ流れます。
Activity 5 (grow_a_language_model_attention) では、block 1 が実行する内容を扱います:因果マスクとsoftmaxを伴うスケール化ドット積注意。