Transformer
参考资料
https://zhuanlan.zhihu.com/p/48508221
http://jalammar.github.io/illustrated-transformer/
也是一种Seq2Seq网络
这种RNN就不能并行运算
self-attention机制进行并行计算,在输入和输出都相同
传统的word2vect缺点:
1)词向量训练好了,就不会变啊
2) 一词多义 上下文不同 词义也不同
整体架构
更准确地讲,Transformer由且仅由self-Attenion和Feed Forward Neural Network组成。
一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建,作者的实验是通过搭建编码器和解码器各6层,总共12层的Encoder-Decoder,并在机器翻译中取得了BLEU值得新高。
1)并行计算要求
2) 解决RNN中 对远距离的词记忆效果弱
Transformer的编码部分是由6个编码器,同样解码有6个解码器组成
每个编码器的结构是先做一个self-attention,得到attention z,然后用一个全连接FNN对z的降维;
输入的序列,先流入第一层self-attention,计算出当前词与其他单词的
两个公式:1)计算attetion 2)FNN 全连接层,两层第一层ReLU,第二层线性激活函数
decoder中
1)Self-Attention:当前翻译和已经翻译的前文之间的关系;
2)Encoder-Decnoder Attention:当前翻译和编码的特征向量之间的关系。
先做词嵌入,算出词向量 论文中:用的词向量维度dK=512
输入如何编码? 输出结构是啥? attenion目的? 怎样组合在一起?
【一、self-attention是什么?】
举例:”The animal didn't cross the street because it was too tired”
根据实际吃的数据,可以看他的上下文,从而确定词义
self-attetion怎么计算?
1)把每一个词编程词向量,文章用的是Xi是512维的,而乘出来后的q,k,v这些新向量是64维的。
这样做的目的是可以持续计算多头
当我得到Q、K、V三个矩阵时,便可以计算每个词与其他词的得分;这里用一个点积运算,可以求出某两个词的相关性;
2)计算socre
3)-4)这里第三和第四步
softmax得分表示出每一个单词在此位置的分量,比如thinking在这个句子中对machine只占0.12
5)将每个词的value*softmax得分,凭直观可以看出只关注那些我们注意的词,而drop-out那些无关的词(只需要乘以一个足够小的数)
6)把softmax*v加起来便可得到当前词对于整个序列而言的attetion
======================================================================
【附录】 关于计算attention进一步解释
要把分值转换成一个概率,所以这里用到一个softmax,便可以得到一个词与其他词的分值,然后与其他词value做点积,便可得到self-attention的值
一个关于self-attention的流程
这个的最后用softmax输出与z做一个点积运算 求sum,单个词的对其他词的attention,然后在乘以V(实际特征信息)
【三、位置信息表达】
词的位置会产生影响,所以add一个vector到输入的嵌入层,引入的这个vector要能够表达出整个序列词的顺序,还有不同词之间的distance信息;
【四、残差块】
【Decoder】
decoder多了一个encoder-decoder attetion层
- self-attention略有不同
decoder如何处理encoder的编码结果
- 加入mask机制: decoder是做预测的,要根据之前的输出预测当前的,所以在把当前的mask掉;
Bert
按照官网给出的Bert技术牛皮,一方面因为是unsupervised,另一方面是因为用于预训练NLP的深度双向系统
与训练表示既可以是context-free 也可是 contexual
context-free: word2vec 和 glove
I made a bank deposit中 对bank的理解 bert会看bank的前后,而其他模型要么只看左边,要么只看右边
pre-training & fine-tunings
难的是对词的编码,就是transfomer的encoder部分;
如何训练bert
方法二:
end2end训练方式