3. トークン埋め込み
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
トークン埋め込み
テキストデータをトークナイズした後、GPTのような大型言語モデル(LLMs)を訓練するためのデータ準備における次の重要なステップは、トークン埋め込みを作成することです。トークン埋め込みは、(単語やサブワードなどの)離散的なトークンをモデルが処理でき学習できる連続的な数値ベクトルに変換します。本説明では、トークン埋め込み、その初期化、利用方法、およびトークン列の理解を高める位置埋め込みの役割について分解して解説します。
Tip
この第三段階の目的は非常に単純です:語彙内の各トークンに対して、モデルを訓練するために望ましい次元のベクトルを割り当てることです。 語彙の各単語は X 次元空間の一点になります。
初期状態では、空間内の各単語の位置は単に「ランダム」に初期化されており、これらの位置は訓練可能なパラメータです(訓練中に改善されます)。さらに、トークン埋め込みの過程で、(この場合)訓練文中の単語の絶対位置を表す別の埋め込み層が作られます。こうして文中の異なる位置にある同じ単語は異なる表現(意味)を持つようになります。
トークン埋め込みとは何か?
トークン埋め込みは、連続ベクトル空間におけるトークンの数値表現です。語彙内の各トークンは固定次元の一意のベクトルと対応付けられます。これらのベクトルはトークンに関する意味的・構文的情報を捉え、モデルがデータ内の関係性やパターンを理解できるようにします。
- 語彙サイズ(Vocabulary Size): モデルの語彙に含まれる一意のトークンの総数(例:単語、サブワード)。
- 埋め込み次元(Embedding Dimensions): 各トークンのベクトルに含まれる数値(次元)の数。次元が高いほどより微妙な情報を表現できますが、計算資源を多く必要とします。
例:
- 語彙サイズ: 6 トークン [1, 2, 3, 4, 5, 6]
- 埋め込み次元: 3(x, y, z)
トークン埋め込みの初期化
訓練開始時、トークン埋め込みは通常小さなランダム値で初期化されます。これらの初期値は訓練中に調整(ファインチューニング)され、訓練データに基づいてトークンの意味をよりよく表現するようになります。
PyTorch の例:
import torch
# Set a random seed for reproducibility
torch.manual_seed(123)
# Create an embedding layer with 6 tokens and 3 dimensions
embedding_layer = torch.nn.Embedding(6, 3)
# Display the initial weights (embeddings)
print(embedding_layer.weight)
指定されたファイルの内容を貼ってください。内容をいただければ、指示どおりのルールに従って日本語に翻訳して返します。
luaCopy codeParameter containing:
tensor([[ 0.3374, -0.1778, -0.1690],
[ 0.9178, 1.5810, 1.3010],
[ 1.2753, -0.2010, -0.1606],
[-0.4015, 0.9666, -1.1481],
[-1.1589, 0.3255, -0.6315],
[-2.8400, -0.7849, -1.4096]], requires_grad=True)
説明:
- 各行は語彙内のトークンに対応します。
- 各列は埋め込みベクトルの次元を表します。
- 例えば、インデックス
3のトークンは埋め込みベクトル[-0.4015, 0.9666, -1.1481]を持ちます。
トークンの埋め込みにアクセスする方法:
# Retrieve the embedding for the token at index 3
token_index = torch.tensor([3])
print(embedding_layer(token_index))
翻訳する元の英語テキスト(ファイル内容)を貼り付けてください。
tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
解釈:
- インデックス
3のトークンはベクトル[-0.4015, 0.9666, -1.1481]で表されます。 - これらの値はトレーニング可能なパラメータで、モデルはトークンの文脈や意味をよりよく表現するために訓練中に調整します。
トークン埋め込みが訓練中にどのように機能するか
訓練中、入力データの各トークンは対応する埋め込みベクトルに変換されます。これらのベクトルは、注意機構やニューラルネットワーク層など、モデル内のさまざまな計算で使用されます。
例:
- バッチサイズ: 8(同時に処理されるサンプル数)
- 最大シーケンス長: 4(サンプルごとのトークン数)
- 埋め込み次元: 256
データ構造:
- 各バッチは形状
(batch_size, max_length, embedding_dim)の3次元テンソルで表されます。 - この例では形状は
(8, 4, 256)になります。
可視化:
cssCopy codeBatch
┌─────────────┐
│ Sample 1 │
│ ┌─────┐ │
│ │Token│ → [x₁₁, x₁₂, ..., x₁₂₅₆]
│ │ 1 │ │
│ │... │ │
│ │Token│ │
│ │ 4 │ │
│ └─────┘ │
│ Sample 2 │
│ ┌─────┐ │
│ │Token│ → [x₂₁, x₂₂, ..., x₂₂₅₆]
│ │ 1 │ │
│ │... │ │
│ │Token│ │
│ │ 4 │ │
│ └─────┘ │
│ ... │
│ Sample 8 │
│ ┌─────┐ │
│ │Token│ → [x₈₁, x₈₂, ..., x₈₂₅₆]
│ │ 1 │ │
│ │... │ │
│ │Token│ │
│ │ 4 │ │
│ └─────┘ │
└─────────────┘
説明:
- シーケンス内の各トークンは256次元のベクトルで表現されます。
- モデルはこれらの埋め込みを処理して言語パターンを学習し、予測を生成します。
位置埋め込み: トークン埋め込みに文脈を付与する
トークン埋め込みは個々のトークンの意味を捉えますが、シーケンス内でのトークンの位置を本質的に符号化するわけではありません。トークンの順序を理解することは言語理解にとって重要です。ここで位置埋め込みが役立ちます。
位置埋め込みが必要な理由:
- Token Order Matters: 文では意味が語順に依存することが多いです。例えば、「猫がマットの上に座った」と「マットが猫の上に座った」では意味が異なります。
- Embedding Limitation: 位置情報がないと、モデルはトークンを語順を無視した「単語の集合」として扱います。
位置埋め込みの種類:
- 絶対位置埋め込み:
- シーケンスの各位置にユニークな位置ベクトルを割り当てます。
- 例: どのシーケンスでも1つ目のトークンは同じ位置埋め込みを持ち、2つ目のトークンは別の埋め込みを持ち、以下同様です。
- 使用例: OpenAI’s GPT models.
- 相対位置埋め込み:
- トークン間の絶対位置ではなく相対的な距離を符号化します。
- 例: シーケンス内の絶対位置に関係なく、2つのトークンがどれだけ離れているかを示します。
- 使用例: Models like Transformer-XL and some variants of BERT.
位置埋め込みの統合方法:
- 同じ次元数: 位置埋め込みはトークン埋め込みと同じ次元数を持ちます。
- 加算: 位置埋め込みはトークン埋め込みに加算され、全体の次元数を増やすことなくトークンの識別情報と位置情報を結合します。
位置埋め込みを加える例:
例えば、トークン埋め込みベクトルが [0.5, -0.2, 0.1]、位置埋め込みベクトルが [0.1, 0.3, -0.1] の場合、モデルで使用される結合埋め込みは次のようになります:
Combined Embedding = Token Embedding + Positional Embedding
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
= [0.6, 0.1, 0.0]
位置埋め込みの利点:
- Contextual Awareness: モデルはトークンをその位置に基づいて区別できる。
- Sequence Understanding: モデルが文法、構文、および文脈依存の意味を理解できるようにする。
最新のLLMにおける位置埋め込み
Rotary Positional Embeddings (RoPE)
RoPEは、query/keyベクトルの次元ペアに対して位置依存の回転を適用することで位置をエンコードし、絶対位置を相対的な位相差に変換する。これにより埋め込みの次元数を変更せずに相対位置情報を提供し、最近のデコーダ専用のLLMで広く使われている。
トークンと位置の埋め込みがモデル内部でどのように結合されているかについては、the LLM architecture pageを参照してください。
Extending Context Windows in RoPE-Based Models
最近の研究では、コンテキスト長はしばしばトークン埋め込み行列自体ではなく位置エンコーディング方式によって制限されることが示されている。
- Position Interpolation (PI): 位置インデックスを再スケールし、より長いシーケンスを訓練時に見られた範囲にマッピングすることで、最小限のファインチューニングでの拡張を可能にする。例:
# Position Interpolation (PI) intuition
orig_ctx = 2048
new_ctx = 8192
scaled_pos = pos * (orig_ctx / new_ctx)
- YaRN: 計算効率の良い RoPE 拡張戦略で、RoPE のスケーリング/補間を変更して、追加の学習ステップを少なくしてより長いコンテキストへ外挿できるようにする。
コード例
以下は https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb のコード例に従ったものです:
# Use previous code...
# Create dimensional emdeddings
"""
BPE uses a vocabulary of 50257 words
Let's supose we want to use 256 dimensions (instead of the millions used by LLMs)
"""
vocab_size = 50257
output_dim = 256
token_embedding_layer = torch.nn.Embedding(vocab_size, output_dim)
## Generate the dataloader like before
max_length = 4
dataloader = create_dataloader_v1(
raw_text, batch_size=8, max_length=max_length,
stride=max_length, shuffle=False
)
data_iter = iter(dataloader)
inputs, targets = next(data_iter)
# Apply embeddings
token_embeddings = token_embedding_layer(inputs)
print(token_embeddings.shape)
torch.Size([8, 4, 256]) # 8 x 4 x 256
# Generate absolute embeddings
context_length = max_length
pos_embedding_layer = torch.nn.Embedding(context_length, output_dim)
pos_embeddings = pos_embedding_layer(torch.arange(max_length))
input_embeddings = token_embeddings + pos_embeddings
print(input_embeddings.shape) # torch.Size([8, 4, 256])
参考文献
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


