Transformer的理解与代码
首先将一些资料写在这:
b站博主:nlp从入门到放弃 的transfomer相关视频,以下的代码也于其讲述的大差不差,大家可以去他的视频找所有的代码
1 对transformer原理理解
整个transformer的架构可以分为:解码器(encoder)和编码器(decoder);其中又可以划分为多个模块:位置嵌入、多头自注意力模块、残差结构、layernorm层、前馈网络等。
图一 transfomer整体架构
1.1位置编码以及词嵌入
1)词嵌入指的是将一个单词(字)映射成多维度,在transformer论文中将每个字映射成了512维,比如说:[‘我’ ,'是 ', ‘女’,‘生’](1*4的向量)映射成一个 4 * 512 的向量,每一个字都有512个维度;
使用 pytorch里的方法:
nn.Embedding('字的类别数', '映射维度')
2)位置编码
图二 位置编码公式
如上,在偶数位的字用sin,奇数位的字用cos;
代码编写如下:
# 位置编码层
class PositionEncoding(nn.Module):
def __init__(self, d_model, dropout=0.1, max_len=1000): # de_model 是映射维度,需要与字的维度一样(512);max_len 一句话最长有几个字
super(PositionEncoding, self).__init__()
self.dropout = nn.Dropout(p=dropout) # 使用dropout 减少过拟合
pe = torch.zeros(max_len, d_model) # 生成 tensor[1000, 512] ,值为0
position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) # 生成tensor[1000, 1] ,值为0~999
div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)) # 位置公式里的公因子
pe[:, 0::2] = torch.sin(position * div_term) # 位置公式的算法 postion * 公因子,偶数位置用sin
pe[:, 1::2] = torch.cos(position * div_term) # 奇数位置用cos
pe = pe