提示:本篇博客主要针对下列问题进行展开,关于问题回答是个人的见解,若有不对的地方还望批评指正,感谢~
- 问题1: Transformer中的softmax计算为什么需要除以 d k d_k dk?
- 问题2: Transformer中attention score计算时候如何mask掉padding位置?
- 问题3: 为什么Transformer中加入了positional embedding?
- 问题4: Transformer为什么需要一个position embedding?
- 问题5: Transformer中的残差网络结构作用是什么?
前言
本篇博客主要记录Transformer相关原理篇章2的学习,并针对篇章小测给出了自己的见解。学习地址指路
一、知识点记录
1.1 Attention机制与seq2seq的主要不同点:
编码器会把更多的数据传递给解码器。编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而不是只传递最后一个 hidden state。
注意力模型的解码器在产生输出之前,为了把注意力集中在与该时间步相关的输入部分。做了如下的处理:
1、查看所有接收到的编码器的 hidden state。
2、给每个 hidden state一个分数
3、将每个 hidden state乘以经过 softmax 的对应的分数,从而,高分对应的 hidden state会被放大,而低分对应的 hidden state会被缩小。
1.2 多头注意力机制(multi-head attention)
如下两个方面增强了 attention 层的能力:
1、扩展了模型关注不同位置的能力
2、多头注意力机制赋予 attention 层多个“子表示空间”。
1.3 代码实现矩阵计算 Attention
由于篇幅问题这里不张贴代码,【代码部分见链接】Attention代码实现
知识点小结:
- PyTorch中view()函数作用:是将一个多行的Tensor,拼接成一行
- PyTorch中permute()函数作用:变换tensor维度
import torch
x = torch.randn(2, 3, 5)
print(x.size())
print(x.permute(2, 0, 1).size())
# permute(2, 0, 1)是序号,表示2与5交换位置
------------------------输出如下-----------------------------------
>>>torch.Size([2, 3, 5])
>>>torch.Size([5, 2, 3])
二、问题回答
1、Transformer中的softmax计算为什么需要除以 d k d_k dk?
也可以除以其他数,除以一个数是为了在反向传播时,求取梯度更加稳定。
2、Transformer中attention score计算时候如何mask掉padding位置?
定义 MultiheadAttention 的对象后,调用时传入的参数如下 forward(query, key, value, key_padding_mask=None, need_weights=True, attn_mask=None)
key_padding_mask:如果提供了这个参数,那么计算 attention score 时,忽略 Key 矩阵中某些 padding 元素,不参与计算 attention。形状是 (N,S)。其中 N 是 batch size,S 是输入序列长度。
- 如果 key_padding_mask 是 ByteTensor,那么非 0 元素对应的位置会被忽略
- 如果 key_padding_mask 是 BoolTensor,那么 True 对应的位置会被忽略
3、为什么Transformer中加入了positional embedding?
因为先前的RNN模型中天然的包含了输入信息的位置信息因此不需要额外的添加位置信息,然而Transformer中并没有包含输入信息的位置信息,因此加入了positional embedding来表示序列中单词顺序的方法
4、Transformer为什么需要一个position embedding?
因为输入的文本是一个序列,一句话的前后位置大多数情况下是不能更改的,因此需要我们对位置信息进行考虑,先前模型的核心大多是以RNN为主,RNN是一种序列模型,天然就具备了对位置信息的考虑,因此不需要额外的考虑,然而Transformer以Attention机制为核心,没有考虑到输入文本的位置信息,因此采用了position embedding的方法,额外的将位置信息添加到模型里面。
5、Transformer中的残差网络结构作用是什么?
LayerNorm是针对同一个样本的所有单词去做缩放,一是解决梯度消失的问题,二是解决权重矩阵的退化问题。
总结
通过对问题的回答,加深了对transform模型的理解,之后的学习中应该学习一下这种学习方式,多问自己几个“为什么?”,最后感谢datawhale的开源学习。