1.Input Embedding
Inputs在字典中找到对应的嵌入表示(batchsize*seqlen*model_dim)
词嵌入矩阵需要根据语料库来确定第一个维度(字典里面有多少个词)
#已知如下语料,给出其词嵌入
corpus = ["he is an old worker", "english is a useful tool", "the cinema is far away"]
cibiao=[]
for i in corpus:
for j in i.split():
cibiao.append(j)
set(cibiao)#去重
cibiao_dict={}
#利用enumerate添加索引
for i in enumerate(set(cibiao)):
print(i[1])
cibiao_dict[i[1]]=i[0]#字典的赋值;old赋值为0
cibiao_dict
定义Input Embedding层
class Embeddings(nn.Module):
def __init__(self, d_model, vocab):
# d_model:词嵌入维度
# vocab:字典大小
super(Embeddings, self).__init__()
self.lut = nn.Embedding(vocab, d_model)
self.d_model = d_model
def forward(self, x):#根据索引找到对应的词向量
return self.lut(x) * math.sqrt(self.d_model)
我们现在确定了字典里面有1000个词;此时batchsize*seqlen*model_dim=2*4*512
d_model = 512 # embedding_size
vocab = 1000 # 词典大小
x=torch.tensor([[100, 2, 421, 508], [491, 998, 1, 221]], dtype=torch.long)
emb = Embeddings(d_model, vocab)
embr = emb(x)
print(embr.shape)
2.position Embedding层
非常强硬的加入了所在的位置信息,其中pos表示行的信息,单词在句子中所在的位置(从0到seqlen-1)
i表示列的信息(从0到model_dim/2-1)
可以利用循环得到这个矩阵
import numpy as np
import matplotlib.pyplot as plot
def getPositionEncoding(seq_len,dim,n=10000):
PE = np.zeros(shape=(seq_len,dim))
#PE=np.zeros((seq_len,dim))
for pos in range(seq_len):
for i in range(int(dim/2)):
denominator=np.power(n,2*i/dim)
PE[pos,2*i]=np.sin(pos/denominator)