赞
踩
传统的RNN网络
训练速度:无法加速训练,并行等
Self-Attention机制(注意力),一段话中,不是每个词都重要,我们只需要关注重要的部分。如:等下我们把这些活干完,下班后我们一起去吃饭吧,我请客。是不是对于听的人来说主要是“一起吃饭,我请客”。
word2vec:训练好词向量就永久不变了,不同的语境相同的词相同的向量,但这合理吗?就想我们在生气的时候说的傻子,和开心的时候说傻子,意思是完全不一样的,
如上,传入一段文本,如果我们没有强调注意什么,那么词向量结果可能是平行的,如果我们强调“eating”,那么“eating”这个词的词向量就会有所不同。
如果是人为的加权,告诉计算机哪个重要,这显然是不合实际的,应该让计算机自己发现哪些重要。
“it”在第一句中是指代“animal”,表示它太累了没有过去。
“it”在第二句中指代“street”,表示路太窄了没有过去。
这里关注的是“animal”,我们希望即使是第二句,“animal”对结果的影响越大。
如下图:
先转换成向量,构建三个矩阵Q、K、V,求出来第一个词编码的时候怎么找到上下文。右边的W就是权重。
这三个矩阵具体做什么:
X是输入内容,结果W后,形成Q、K、V不同矩阵的特征向量。
q与k的内积表示有多匹配,如果Xa与Xb之间无关的时候,那么其在坐标系上的表示是垂直的;如果有关系,则非垂直,则有夹角有内积,相关性越大,则夹角越小,内积越大。
加上dk是因为计算内积会因为向量维度越长,向量维度越大,越大影响就越大,影响不应该根据维度的长宽改变,所以应该除掉向量维度的影响。
这样就能计算出来了结果,这个就是Self-Attention机制,内积大的就重要,小的就不重要。
每个词的Q会跟整个序列中每个K计算得分,然后基于得分再分配特征
这样就解决了word2vec训练完后词向量不变的问题,每次都跟其它组合项进行计算,从而改变权重和词向量。
再看一遍整体流程
这样第一个词就编码完成,后面的第二、第N个词也是如此操作。
总结:Attention依靠内积来求得每个词和每个K的得分,且并行求。
之前卷积中,我们利用fillter(w)来将X映射成更多的特征表达,再取最大的进行降维,在这里也是同样道理。
Multi-Head架构图如下
不同的注意力结果,得到的特征向量表达也是不同的。
堆叠多层:
由于输入输出都是向量,也就是可以堆叠更多层,计算方法都是相同的,只是增加了多层。
位置信息:在self-attention中,每个词都会考虑整个序列的加权,所以其出现位置并不会对结果产生什么影响,相当于放哪都无所谓,但是这跟实际就有些不符合了,我们希望模型能对位置有额外的认识。
POSITIONAL ENCODING:将余弦和正弦的周期表达信号,当作位置信息。
Add与Normalize
Batch Size:将其一行,让其均值为0,标准差为1
Layer:让其一列,变成均值为0,标准差为1
残差连接:X如果处理完残差变小,则使用该X,如果残差反而大了,则使用原有的X。也就是堆叠的层数中,我们保证了堆叠的过程中,结果一定不会比原来差。
最终输出结果
Encode端
Decode端
这就是Transformer的整体结构。而Transformer和BERT的关系是…,我们接着往下看
也就是下图的部分
如何训练BERT
MASK的部分就相当于分类中的训练标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。