サイン波位置エンコーディングの生成方法
メニューを表示するにはスワイプしてください
サイン波的な位置エンコーディングは、リカレンスやシーケンス認識層を使用しなくても、トランスフォーマーモデルが単語の順序や位置を認識できるようにする手法。各位置は、埋め込み次元全体にわたるサインとコサイン値の独自パターンで表現される。
以下のコードを見てみましょう。
1234567891011121314151617import numpy as np def get_sinusoidal_positional_encoding(seq_length, embed_dim): position = np.arange(seq_length)[:, np.newaxis] div_term = np.exp( np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim) ) pe = np.zeros((seq_length, embed_dim)) pe[:, 0::2] = np.sin(position * div_term) pe[:, 1::2] = np.cos(position * div_term) return pe # Example usage: seq_length = 6 embed_dim = 8 encoding = get_sinusoidal_positional_encoding(seq_length, embed_dim) print(encoding)
サイン波的な位置エンコーディングを生成するコードは、以下のステップで理解できる:
1. position配列の作成
position = np.arange(seq_length)[:, np.newaxis]
- 入力シーケンス内の各位置を表す列ベクトルを作成。各行は0から始まる位置を示す。
- シーケンスが6トークンの場合、この配列は列として
[0, 1, 2, 3, 4, 5]となる。
2. 周波数スケーリング項の計算
div_term = np.exp(
np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim)
)
- 偶数の埋め込み次元ごとにスケーリング係数を計算。
- 各次元が異なる周波数を持つようにし、短距離・長距離の位置パターンの両方を捉えることができる。
10000.0を使うことで周波数が広がり、位置の変化が各次元に異なる影響を与える。
3. 位置エンコーディング行列の初期化
pe = np.zeros((seq_length, embed_dim))
- 各位置ごとに1行、各埋め込み次元ごとに1列のゼロ行列を作成。
4. サイン・コサイン値で行列を埋める
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
- 偶数列には
position * div_termのサイン値を格納。 - 奇数列には
position * div_termのコサイン値を格納。 - この交互パターンにより、各位置が独自の値の組み合わせとなり、位置や次元ごとに滑らかにパターンが変化する。
5. 位置エンコーディングの返却
return pe
- 結果の行列は、シーケンス内の各位置に対して固有のエンコーディングを提供。
- このエンコーディングを単語埋め込みに加えることで、トランスフォーマーモデルがトークンの順序を認識できるようになる。
すべて明確でしたか?
フィードバックありがとうございます!
セクション 1. 章 7
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 1. 章 7