在本专栏我主要侧重于讲解Transformer的代码实现,对于原理部分不太了解的同学建议先去研读论文或者博客。原理讲解:https://zhuanlan.zhihu.com/p/338817680
这篇文章我们开始正式进入Transfomer的代码部分讲解了,首先就是文本向量化,需要把文字转化成向量,才能进行数学运算。完整的文本向量化过程,要分为两步,第一步是是把文字转化为一个索引,也就是找到这个字在词表中的索引位置;第二步,就是从随机生成的 lookup table 中,找这个索引对应的向量,作为这个词的表征。
一、词表直观展示
# 词表 我 0 天 1 安 2 门 3 烤 4 鸡 5 # lookup table [[ 0.8876, -0.4091, -0.6816], [-1.4386, 0.3714, -1.5079], [ 0.7514, 0.5945, 0.9892], [ 0.7097, -0.2346, -0.1921], [ 0.9248, 1.4994, -2.5817], [-1.8989, -0.7199, -1.7468]]
二、代码直观展示文本向量化过程
import math
import torch
from torch import nn
# 实例化类,10*8的向量,10个词,每个词的向量维度为8
emb = nn.Embedding(10, 8)
# lookup table
print(emb.weight)
# 单个词向量
print(emb(torch.tensor([1])))
# 两个句子
print(emb(torch.tensor([
[1, 2, 3],
[1, 5, 0],
])))
# 指定填充id
emb = nn.Embedding(10, 8, padding_idx=0)
三、封装embeding类
class Embeddings(nn.Module):
def __init__(self, vocab_size, d_model):
super().__init__()
# Embedding层
self.lut = nn.Embedding(vocab_size, d_model)
# Embedding维数
self.d_model = d_model
def forward(self, x):
# 返回x对应的embedding矩阵,需要乘以math.sqrt(d_model)
return self.lut(x) * math.sqrt(self.d_model)
emb = Embeddings(10, 8)
inputs = torch.tensor([
[1, 2, 3],
[4, 5, 0],
])
output1 = emb(inputs)
print(output1)