李沐论文讲解笔记 之 Transformer

Transformer架构(NLP,机器翻译)

发现同样模型能在其他领域可以应用

Encoder—decoder架构:过去时刻你的输出又是你当前的的输入(自回归auto-regressive)

 N个层重复N次

编码器输出为解码器输入

Masked带掩码的注意力机制:保证输入进来不会看到t时间以后的输入,从而保证训练和预测行为是一致的。

MLP:纯全连接层的神经网络模型

残差连接:输入和输出加在一起  固定长度显示

Layernorm:对于一个二维输入矩阵,每一行为样本batch,每一列为特征feature。把每个行batch变为均值为0,方差为1

Batchnorm:对于一个二维输入矩阵,每一行为样本batch,每一列为特征feature。把每个列feature变为均值为0,方差为1(做法:减去向量,除以标准差)

 

一般输入为三维(序列,有很多元素)的样本,那么Layernorm切横的batch,Batchnorm竖的。Layernorm(用的更多):

因为batchnorm算出来均值和方差抖动比较大(假如出现了很长,那么之前的均值和方差就不适用),但是Layernorm都算的自己的均值和方差,不存在这个问题。更稳定

注意力机制:

有一个value,一个key。假如有一个query,靠近第一个,那么第一二个权重比较大,最后一个比较小。

虽然key value没有改变,但是随着query的改变,权重不一样,所以输出不一样。

不同的相似函数导致不同的注意力版本

 

Transformer用到的注意力机制版本:

Query对每个key做内积

Query写成矩阵(即可能不止一个query),和一个key,相乘得到一个n*m,每一行是query对所有key的内积值,再除以  根号dk(向量大小,即它的长度。因为值比较大,那么他们之间差距会变大,那么这个大的做出来softmax更接近1,其他更接近0。这样会导致值向两端靠拢,这样得到的梯度比较小,就会跑不动。在transformer中dk一般比较大512,所以除以dk)做softmax(softmax:希望做出来的值,置信的更靠近1),相乘得到长为dv(一共做了两次矩阵乘法)。那么每一行就是我们需要的输出。

 

两种注意力机制:加性、点积的注意力机制(此处用的点乘,因为实现起来更简单高效)

 

Masked带掩码的注意力机制:保证输入进来不会看到t时间以后的输入,从而保证训练和预测行为是一致的。

具体做法 : 换成一个非常大的复数,这样后面的数做softmax的时候做出来非常接近0,只对前面的值1~t-1有效果

多头注意力机制:不如说我把整个query呀, keyvalue呀投影到一个低维度(这个维度是可以学的,学h次学到不同方法,有点类似卷积网络的多个输出通道),投影h次,再做h次的注意力函数,并在一起做最终输出。此处h=8

512/8=64,即投影64维度上计算注意力函数。在并起来投影回来。

 

如何使用注意力层:

编码器中:

自注意力机制:key,value,query都是同一个东西,就是自己本身,分成三个。N个query,每个一个输出,有n个输出,输出维度也为d。其实输出是value加权和,权重(权重:该向量和每一个输入的别的向量计算的相似度,图上绿色部分)是query和key的。

输入是长为N的向量

 

不考虑多头和投影情况,那么输出就是输入的加权和,权重来自自己本身和各个向量的相似度。如果是多头,因为有投影,那么会学习h个不一样的距离空间来,使得输出回有一点不一样。

解码器中:

此处不再是自注意力了,而是key value来自编码器输出,query来自解码器上一个attention的输入。

 

也就是对于解码器都要算一个输出,输出来自value(即输入)的加权和,权重粗细取决于query与编码器输出部分的相似度,相似度高,权重会大一点。

 

Feedforward

是一个单隐藏层的MLP,中间隐藏层是吧输入扩大四倍,最后输出再回来。在pytorch上的话就什么都不需要改动,因为在pytorch上输入为3d时候,默认就是在最后一个维度计算。在这里512投影成2048,最后有个残差连接,所以又投影回去为512。

此处Attention的作用是:把整个序列中的信息抓取出来(时序信息,因为当给出一个句子,吧里面顺序打乱,但是attention出来还是一样,不会处理所以需要时序信息。Attention是在输入中,这里的位置加上时序,这个就叫Position Encoding),做一次汇聚aggregation。这里已经抓去了感兴趣的,含有了序列信息,所以在做投影和MLP时候,只需要对每个点独立做就行了。因为在此处attention中序列信息已经汇聚完成,所以可以分开做。这就是transformer如何抽取序列信息,然后把这些信息加工成我最后要的那个语义空间那个向量的过程。

transformer对比RNN:都是用线性层/MLP做语义训练的转换,不一样的是,如何传递序列信息。RNN中把上一个时刻的信息输出传给下一个时刻作为输入(这里本来就是一个有时序的)。transformer通过attention层,然后再全局的去拉到整个序列里面信息,再用MLP做语义的转换。

他们两个的关注点都是在你怎么有效的去使用你的序列的信息。

 

Embedding层

把输入一个个词源token,映射成一个向量。Embedding是将任意一个词,学习一个长为d的向量来表示它,此处d为512。此处乘了根号d,也就是乘根号512是为了最后他的规模差不多。因为在学l2-norm(第二范式,会将向量所有值归一化,向量归一化后其单个值就越小)时候,不管维度多大都会学的比较小,比如是1,也就是权重一大,维度值就会变小。最后加上Position Encoding不会吧长度困住(不会覆盖原本的权重),使得规模差不多相匹配。

Position Encoding:

Attention的作用是:把整个序列中的信息抓取出来(时序信息,因为当给出一个句子,吧里面顺序打乱,但是attention出来还是一样,不会处理所以需要时序信息。Attention是在输入中,这里的位置加上时序,这个就叫Position Encoding)

这个公式是cos 和 sin的一个函数,在-1~1 之间抖动,乘以根号d之后,使得他还是在差不多-1~1之间。这样就可以在输入加入信息了

任何一个值可以用一个长为512的向量记录了时序信息的来表示,告诉了该词的位置。

第四章:为什么用自注意力

自注意力:几个矩阵做运算:query(n行*维度d)*key(也是n行*维度d)矩阵,则算法复杂度为n^2*d。矩阵并行度高(当前操作不需要等待前面步骤完成),一步就能过去所以是1.一个query可以和所有都可以运算一次都能过来,所以长度短为1.

 循环:RNN对特别长的序列做的不够好

卷积:用1D的卷积,kernel为k(3、5等),n为长度,d为输出输入通道数。并行度高,所以比RNN快一点。在k距离内一次能传,在k以外就要一层层传了

受限的自注意力:当做注意力的时候,query只和最近的r个相邻的做运算

所以当序列长度,模型快读差不多,深度都一样的话,前三个就散复杂度都差不多。但attention好像在信息糅合性更好一点。但是实际上attention对整个模型的假设做了更少,需要更大的数据和模型才能训练RNN  CNN同样的效果,所以导致现在基于Tranformer的模型呢都是特别大特别贵。

第五章:实验(略)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值