没有免费的午餐定律:没有任何算法能在任何情况下都是最佳
注意力机制&神经机器翻译(袁源)
ELMo:上下文相关的词向量方式,基于BILSTM的
不用RNN可不可以做NLP,除了传统机器学习,还可以用深度神经网络做,即transformer,使用注意力机制
没有transformer时,机器翻译用的最多的方法是RNN:
Encoder:编码器
Decoder:解码器
关键在于RNN和其中的hidden station,一种语言编码成向量,解码后变成另一种语言
RNN的问题:梯度消失问题,根本原因是本质用了梯度下降
LSTM缓解了梯度消失,但未消除
Feed forward:前馈全连接层
Nx:循环很多次
右侧为最简单的一个encoder和一个decoder,重点讲解内部怎么工作的:
Encoder可以有6层或者12层,甚至更多
Encoder是将一个向量转换成另外一个向量的过程。先通过词嵌入生成词向量,一起输入self-attention,杂糅在一起,再分开进入全连接层,分别生成新的词向量。
这两个向量的区别就是:之前的词之间互相不知道,后来的词互相知道信息
以下为通过self-attention的过程:
自注意力机制,
queries:搜索关键词,查询(找别人)
Keys:键 (被找)& Values:值
认为是在做信息检索,将输入词联系起来了,这样就可以找到单词之间的联系。
将输入向量转换成三个不同的向量,转换方式为乘以矩阵做映射
矩阵是共享的,所有输入(x1、x2)都用同一个矩阵(权值Wq、Wk、Wv,是通过误差相互传递,学习出来的超参数)来转换,说明输入值之间已经有了某种联系。
一个输入需要做3次矩阵计算,代价较高
可用向量化方法提高效率,即将一个一个的计算转换成一个大的矩阵计算,将一个一个的排列,组成一个大矩阵。
比如有100个输入,原本需要300次矩阵计算,现在将100个输入组合成一个大矩阵,则只需要3次矩阵计算。
多头自注意力:用不同版本的权重Wq、Wk、Wv训练,可以得到多个结果,比一个好。
多头会产生多个结果,需要合成成一个:
不同的注意力注意到的内容不一样:
如it是动物,下图中不同颜色的attention注意到了不同的内容。如绿色是it怎么样了:累了,黄色是指代什么:动物。
还需要在输入里加入位置编码:
即不同的单词都有了自己的位置编码,而且有某种规律
其实不一定非要用这种sin、cos方法,可以训练一种方法,只要每个词都有自己的位置编码,而且可以相互分开就可以了。
如下图,自己和自己点乘得到的值是最大的(蓝色),离我越远的点乘后值越小。
这就是位置编码,是一种相对距离,看离我远不远,不是绝对位置。
这里用了残差网络,ResNet:跳跃连接,为了解决层数深的时候,传递的值越来越小的的问题,可将前几层的值直接跳跃传递到后面。
使用layer正则化避免过拟合:
归一化
批处理,为了充分地利用CPU
Batch:考虑全部的batch,做平均
Layer:不考虑别人,只考虑自己这一批次,可以避免相互之间的联系产生的问题
Encoder部分:
损失函数:交叉熵损失
训练技巧:
标签平滑,不用绝对的0、1,而是0.9,剩下的共享
学习率选择,先线性增加,再指数下降
编码、解码的权重乘上的值不一样
编码器用x,解码器用编码器产生的输出
优点:
1、比RNN计算复杂度低
2、向量化并行计算
3、动物过马路可解释
缺点:
1、复制即输入输出一致,做不到;如果位置编码未训练,也不可以
2、图灵完备,即现有的冯诺依曼网络结构下,任何算法用RNN全都可以模拟,transformer不一定能