(2)交互注意力层,只对编码端输出的Padding部分进行Mask:
Encoder的输入是K,将K中的Pad符号传给模型后面,同时忽略Decoder的Q中的Pad。
Encoder和Decoder之间的交互:
一个Encoder的输出与每一个Decoder进行交互:
更细致的过程如下:
二、疑问汇总
1.常见的attention计算方法
2.为什么正弦曲线可以支持处理大于语料库中最长序列长度的序列?
3.序列转导模型是什么?
序列转导就是任何将输入序列转换为输出序列的任务,也就是常说的seq2seq,先行应用包括语音识别、文本转语音、机器翻译、蛋白质二级结构预测。
4.3个评价指标的理解?
5.
三、模型实现
1.实现思路
- 由整体到局部
- 理解数据的流动形状
上一个部分的输出是下一个部分的输入,数据的大小、形状和维度。
2.实现过程
2.Generator:
代码如下:
class Generator(nn.Module): ''' 定义标准线性+softmax生成步骤 ''' def __init__(self, d_model, vocab): super().__init__() self.proj = nn.Linear(d_model, vocab) def forward(self, x): return F.log_softmax(self.proj(x), dim=-1)
log_softmax(self.proj(x), dim=-1)
中,dim为-1与列表类似,表示最后一个维度,例如tensor的维度为torch.Size([2, 3, 4, 5])时,经过dim为-1时,输出的结果变为torch.Size([2, 3, 4])维度。
3.LayerNorm
代码如下:
class LayerNorm(nn.Module): '''构建一个LayerForm模块''' def __init__(self, features, eps=1e-6): super().__init__() self.a_2 = nn.Parameter(torch.ones(features)) self.b_2 = nn.Parameter(torch.zeros(features)) self.eps = eps def forward(self, x): mean = x.mean(-1, keepdim=True) std = x.std(-1, keepdim=True) return self.a_2 * (x - mean) / (std + self.eps) + self.b_2
x.mean(-1, keepdim=True)
中,keepdim=True
表示要计算的维度保留,只不过这个维度的长度变为1,这里就是最后一个维度保留且为1,如果为keepdim=False
(默认值),则表示去掉该维度。
n.train
在训练时会报错,如下:
File "E:\Anaconda3\envs\pytorchbase\Lib\site-packages\torch\nn\modules\module.py", line 1102, in _call_impl return forward_call(*input, **kwargs) File "E:\Anaconda3\envs\pytorchbase\Lib\site-packages\torch\nn\modules\sparse.py", line 158, in forward return F.embedding( File "E:\Anaconda3\envs\pytorchbase\Lib\site-packages\torch\nn\functional.py", line 2044, in embedding return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse) IndexError: index out of range in self
这是因为num_embeddings(词典的词个数)不够大,进行词嵌入的时候字典从1, …, n,映射所有的词(或者字)num_embeddings =n是够用的,但是会考虑pad,pad默认一般是0,所以我们会重新处理一下映射字典0, 1, 2, …, n一共n+1个值,此时num_embeddings=n+1才够映射。
四、延伸学习
1.残差连接
2.KL散度
KL散度,即相对熵或信息散度,是两个概率分布间差异的非对称性度量 。在信息论中,相对熵等价于两个概率分布的信息熵的差值,若其中一个概率分布为真实分布,另一个为理论(拟合)分布,则此时相对熵等于交叉熵与真实分布的信息熵之差,表示使用理论分布拟合真实分布时产生的信息损耗。
总结
Transformer模型是Seq2Seq类模型中一个跨时代的模型,是NLP经典之作,使用自注意力的机制代替了以前的LSTM,从而实现了效果和效率上的提升,并为后来的Bert等众多预训练模型奠定了基础,同时后来也逐渐在CV等众多领域大展拳脚,地位十分重要。