埋め込みと位置エンコーディング

PyTorchで学ぶTransformerモデル

James Chapman

Curriculum Manager, DataCamp

トランスフォーマーにおける埋め込みと位置エンコーディング

 

  • 埋め込み: トークン → 埋め込みベクトル
  • 位置エンコーディング: トークン位置 + 埋め込みベクトル → 位置エンコーディング

トランスフォーマーアーキテクチャ上でトークン埋め込みと位置エンコーディングのコンポーネントをハイライトした図。

PyTorchで学ぶTransformerモデル

シーケンスの埋め込み

「Hello」「world」「!」の3つのトークン。

PyTorchで学ぶTransformerモデル

シーケンスの埋め込み

モデルの語彙に基づき、3つのトークンをトークンIDに変換した様子。

PyTorchで学ぶTransformerモデル

シーケンスの埋め込み

トークンIDを指定の次元数のベクトルに埋め込んだ様子。

PyTorchで学ぶTransformerモデル
import torch
import math
import torch.nn as nn

class InputEmbeddings(nn.Module):

def __init__(self, vocab_size: int, d_model: int) -> None: super().__init__() self.d_model = d_model self.vocab_size = vocab_size self.embedding = nn.Embedding(vocab_size, d_model)
def forward(self, x): return self.embedding(x) * math.sqrt(self.d_model)
  • 標準的な手法: $\sqrt{d_{model}}$ によるスケーリング
PyTorchで学ぶTransformerモデル

埋め込みの作成

embedding_layer = InputEmbeddings(vocab_size=10_000, d_model=512)

embedded_output = embedding_layer(torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]]))
print(embedded_output.shape)
torch.Size([2, 4, 512])
PyTorchで学ぶTransformerモデル

位置エンコーディング

トークン埋め込みと位置埋め込みを加算し、位置情報を入力埋め込みに付加している様子。

PyTorchで学ぶTransformerモデル

位置エンコーディング

奇数インデックスの位置埋め込みはsin関数、偶数インデックスはcos関数で計算される様子。

PyTorchで学ぶTransformerモデル

sin(x)

sin関数のグラフ。

 

$$ PE_{(pos, 2i)}=\sin(\frac{pos}{10000^{2i/d_{model}}}) $$

cos(x)

cos関数のグラフ。

 

$$ PE_{(pos, 2i+1)}=\cos(\frac{pos}{10000^{2i/d_{model}}}) $$

PyTorchで学ぶTransformerモデル

位置エンコーダーの構築

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_seq_length):
        super().__init__()

        pe = torch.zeros(max_seq_length, d_model)

position = torch.arange(0, max_seq_length, dtype=torch.float).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2, dtype=torch.float) * -(math.log(10000.0) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term)
self.register_buffer('pe', pe.unsqueeze(0))
def forward(self, x): return x + self.pe[:, :x.size(1)]
PyTorchで学ぶTransformerモデル

位置エンコーディングの作成

pos_encoding_layer = PositionalEncoding(d_model=512, max_seq_length=4)

pos_encoded_output = pos_encoding_layer(embedded_output)
print(pos_encoded_output.shape)
torch.Size([2, 4, 512])
PyTorchで学ぶTransformerモデル

では、練習しましょう!

PyTorchで学ぶTransformerモデル

Preparing Video For Download...