단어 임베딩 위치 인코딩 구현(pytorch 기반)

배경 소개

Transformers 아키텍처에서는 단어 벡터의 입력에 원래 단어에 해당하는 위치 정보를 추가하여 훈련용 모델에 대한 입력으로 사용해야 하는데, 특정 위치 인코딩을 어떻게 구현하나요? 이 블로그에서는 해당 단계를 귀하와 공유할 것입니다.

위치 인코딩 공식

단어 벡터의 위치를 ​​인코딩하는 방법은 여러 가지가 있는데, 여기서는 삼각함수를 이용한 위치 인코딩 공식을 소개한다.

PE(pos,2i)=\sin (pos/10000^{2i/d_{모델}})

PE(pos,2i+1)=\cos(pos/10000^{2i/d_{모델}})

PE는 위치 임베딩 위치 인코딩(Position Embedding Position Encoding)을 의미하며, pos는 단어의 위치와 d_{모델}단어 벡터의 차원을 나타내고, i는 단어 벡터의 i번째 차원을 나타낸다.

그런 다음 공식에 따라 위치 인코딩을 위한 코드를 구현합니다.

암호

환경 의존 라이브러리

import torch
import math
import numpy as np
import matplotlib.pyplot as plt

위치 인코딩 정보를 얻는 함수 정의

def generate_word_embeding(max_len,d_model):
    # 初始化位置信息
    pos = torch.arange(max_len).unsqueeze(1)
    
    # 初始化位置编码矩阵
    result = torch.zeros(max_len,d_model)

    # 获得公式对应的值
    coding = torch.exp(torch.arange(0,d_model,2)*(-math.log(10000.0))/d_model)
    result[:,0::2] = torch.sin(pos*coding)
    result[:,1::2] = torch.cos(pos*coding)

    # 为了与原编码直接相加,格式为[B,seq_len,d_model],需要再增加一个维度
    return result.unsqueeze(0)

max_len이 100이고 d_model이 20이라고 가정하면 pos의 차원은 [100,1], result의 차원은 [100,20], 코딩의 차원은 [1,d_model/2], result[: ,0::2]는 결과의 0번째 열부터 시작하여 수식의 PE(pos,2i)에 해당하는 모든 열에 값을 할당하는 것을 의미하며 마찬가지로 result[:,1::2]는 PE에 해당합니다. (pos) 공식에서 ,2i+1)

위치 인코딩 정보 시각화

좀 더 직관적인 느낌을 주기 위해 위치 인코딩 정보를 시각화합니다.

d = 6
pos_code = generate_word_embeding(100,d)
print(pos_code.shape)
plt.plot(np.arange(100),pos_code[0,:,0:d])
plt.legend(['dim=%d'%p for p in range(d)])
plt.show()

단어의 시간적 길이를 6으로 설정하고, 해당 시간적 순서로 각 차원의 위치 코딩 정보를 표시한다.

각 시계열 위치는 각 차원에 대한 삼각함수 변환규칙에 해당함을 알 수 있으며, 훈련용 모델에 투입한 후 학습을 통해 해당 위치에 대한 지식을 얻을 수 있다.

누구나 토론하고 교류할 수 있습니다~


추천

출처blog.csdn.net/weixin_57506268/article/details/135348417