【PyTorch】nn.Embedding

機械学習では、人間が理解できる文章を機械が理解できる数値記号に変換する必要がある場合が多く、単語や文章をベクトル形式に変換する方法が一般的です。この変換プロセスでは、PyTorch で提供される torch.nn.Embedding インターフェイスを使用して、単語のベクトル化を実現できます. torch.nnEmbedding インターフェイスの使用については、以下で説明します。

1.インターフェース紹介

公式インターフェース アドレス:埋め込み — PyTorch 1.13 ドキュメント

CLASS
torch.nn.Embedding( num_embeddings , embedded_dim , padding_idx=None , max_norm=None , norm_type=2.0 , scale_grad_by_freq=False , sparse=False , _ weight=None , device=None , dtype=None )

torch.nn.Embedding インターフェイス モジュールは基本的に辞書 (ルックアップ テーブル) であり、辞書内の各インデックスは単語の Embedding ベクトル形式に対応します。このベクトルはランダムに初期化されます (正規分布N ( 0 , 1 ) N(0, 1) を満たす)N ( 0 ,1 )ランダムな値)、これは意味を表さないため、word2vec やその他のトレーニング方法の効果はありませんが、この方法を使用して最初に値を割り当ててから学習することができます。

インターフェイスの共通パラメータ

  • num_embeddings ( int ) – 辞書内の単語数

  • embedded_dim ( int ) – 埋め込みベクトルの次元

  • padding_idx ( int , optional ) – 指定された場合、 padding_idx は padding_idx のインデックスに対応する位置を 0 で埋めます

2. インターフェースの使用

# 词语集  
words = ['A', 'B', 'C', 'D', 'E']  
# 词号映射  
word_idx = {
    
    w: idx for idx, w in enumerate(words)}  
# 语句集  
sentences = [  
    'AABBC',  
    'AADDE',  
    'EECAA'  
]  
num_embed = len(words)  # 词典的单词数  
embed_dim = 3  # 嵌入向量的维度(自定义)  
  
embed = nn.Embedding(num_embed, embed_dim)  

# 将句子中的每个单词转成对应的编号
input = []  
for s in sentences:  
    s_idx = [word_idx[w] for w in s]  
    input.append(s_idx)  

# 对语句集中的语句进行 embedding  
input = torch.LongTensor(input)  
print(embed(input))

このうち、入力入力は文集合に番号を付けた数字集合であり、出力結果は各文の埋め込み表現です。

Input:
tensor([[0, 0, 1, 1, 2],
        [0, 0, 3, 3, 4],
        [4, 4, 2, 0, 0]])

Embedding Result:
tensor([[[ 0.3174, -0.1958, -1.1196],
        [ 0.3174, -0.1958, -1.1196],
        [ 0.5466, -0.6627, -2.0538],
        [ 0.5466, -0.6627, -2.0538],
        [ 2.2772, -0.3313,  0.3458]],

       [[ 0.3174, -0.1958, -1.1196],
        [ 0.3174, -0.1958, -1.1196],
        [ 1.0199,  0.1071,  2.3243],
        [ 1.0199,  0.1071,  2.3243],
        [-0.0983, -1.4985, -0.1011]],

       [[-0.0983, -1.4985, -0.1011],
        [-0.0983, -1.4985, -0.1011],
        [ 2.2772, -0.3313,  0.3458],
        [ 0.3174, -0.1958, -1.1196],
        [ 0.3174, -0.1958, -1.1196]]], grad_fn=<EmbeddingBackward0>)

このとき、Embedding Result から、各単語が3次元のベクトル表現に変換されていることがわかります。また、最初に設定された文は5 つの単語で構成されているため、各文は5 つの単語ベクトルで構成されるようにマッピングされます。次元行列。各単語に対応する特定のベクトルを照会する必要がある場合は、embedding.weight を確認できます。ここで、各ベクトルは、インデックスが指す単語に対応します。つまり、対応する単語ベクトルは、embedding.weight に格納され、直接必要に応じて、embedding.weight でクエリを実行します。

print(embed.weight)
Parameter containing:
tensor([[ 0.3174, -0.1958, -1.1196],
        [ 0.5466, -0.6627, -2.0538],
        [ 2.2772, -0.3313,  0.3458],
        [ 1.0199,  0.1071,  2.3243],
        [-0.0983, -1.4985, -0.1011]], requires_grad=True)

おすすめ

転載: blog.csdn.net/zzy_NIC/article/details/128015469