2021-09-15

transformer总结笔记

模型结构图

1 Encoder
Encoder由多个相同的layer组成,本实验是N=5,每个layer由两个sub-layer组成,是Multi-Head Attention和全连接的前馈神经网络。其中每一个sub-layer都加了残差和layer-norm。
Multi-Head Attention
在这里插入图片描述
首先,将x向量+postion向量,得到一个新的x向量。将新x向量乘一个权重矩阵W,分别得到Q,K,V向量。实际的过程x是x1,x2…向量组成的矩阵,得到的Q,K,V也是矩阵,这里为了阐述原理,只用的是一个x向量。

Scaled_Dot_Product_Attention
在这里插入图片描述

*softmax(Q0*K0(转置)/scale)V0=Z0

经过softmax这一步,体现了注意力机制的关注度。因为得到的结果是当前词跟每个词的关系密切的程度。比如一共三个值,0.1,0.2,0.7,这样第三个词的关注度更高。
这里阐述的是一个head的结果,多个head的时候,就是对不同的权重矩阵W1,W2,W3等等进行同样的操作,得到Z1,Z2,Z3等等结果。
将Z0,Z1,Z2,Z3,Z4这些矩阵concat连接,最后再乘一个矩阵,就是FFN操作,得到的结果就是Encoder端的输出结果了。个人理解部分:最后再乘一个矩阵是为了使输入变成原来的维度,比如说,最终Z0的维度是[640,32,60]的,Z1,Z2,Z3等多个head的输出结果都是这个维度,concat之后变成了其他维度,列的维度增加了,就无法和最初的x进行残差的操作,就是这一句代码out=out+x;乘一个矩阵使concat之后的矩阵变回原来的维度,才能和x相加,进行残差和layer-norm。
feed-forword netural network(FFN)
在这里插入图片描述

本实验具体实现流程是这样的:

x.shape:(128,32) 维度的
batch-size是128,每句话经过padding有32个字

x经过embedding后的shape(128,32,300) :就是每个字用300维的向量表示,将每个字表示为300维向量是通过sougou.npz预训练实现的。

然后再矩阵乘法得到Q,K,V这里,W: weight矩阵是(300,300),维度变化如下:
x×W=(128,32,300)(300,300)=(128,32,300)=Q
x×W=(128,32,300)
(300,300)=(128,32,300)=K
x×W=(128,32,300)*(300,300)=(128,32,300)=V
Q×K转置=(128,32,32)
scale和softmax维度不变
(Q×K转置)×V=(128,32,300)=Z0
postion_embedding

对于偶数的位置,用sin函数,对于奇数的位置,用cos函数。其中pos指的是每个字的位置索引,i表示所在的维度位置。
使用位置编码的原因是transformer是并行的操作,同时处理一句话中的所有字,如果没有位置编码,无法记录每个字的先后顺序,所以添加位置编码。(个人理解)

具体实现流程如下:
1.1 先将train.txt数据集的数据进行tokenizer,实验中是分成了一个一个的字。
1.2 创建vocab ,使得每个字分别对应一个id值,本实验中共4762个字。
1.3 将每一句话的len变为30,长截短补,补用UNK代替。
1.4 将dev和test数据集进行同样预处理操作。其中train训练集共180000条数据,dev和test分别为10000条数据。
1.5 本实验使用的是embedding_sougouNews.npz预训练向量集,它的shape为(4762,300),和由此可vocab词表相同,vocab是4762个id表示的。作用是将所有的id对应的字转化成300维的向量。最终向量形式是(128,32,300)。
1.6 经过attention操作:
x×W=(128,32,300)(300,300)=(128,32,300)=Q
x×W=(128,32,300)
(300,300)=(128,32,300)=K
x×W=(128,32,300)*(300,300)=(128,32,300)=V
Q×K转置=(128,32,32)
(Q×K转置)×V=(128,32,300)
再乘一个矩阵,本实验矩阵没有使Z0产生维度变化,还是(128,32,300)的。
1.7 经过两层全连接层,也是矩阵乘法 ,第一层hidden个数是1024,维度变化是(128,32,300)乘(1024,300)的矩阵,这里应该是(1024,300)的转置,结果得到(128,32,1024)的维度,其中过relu函数,使之变成非线性的。再经过一层全连接层,(128,32,1024)乘(300,1024)的矩阵相乘,得到(128,32,300)的向量。
1.8 再进行残差和layer-norm操作,因为多个头,重复进行5次这样的操作。
1.9 实验将输出的结果view成(128,9600)的维度
1.10 再乘一个矩阵,矩阵维度应该是(9600,10)得到(128,10)的结果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值