0
点赞
收藏
分享

微信扫一扫

机器学习笔记5(Transformer)

代码敲到深夜 2022-03-31 阅读 55
深度学习

1.Batch Normalization

问题引入:当function为y=w1*x1+w2*x2+b时,若输入x1很小x2很大,则当w1和w2变化相同的Δw时,体现在y上的变化量却很不相同,这不利于我们的参数学习优化

因此我们需要使用normalization将输入进行正则化来消除由于参数差距过大带来的影响,normalization即将每一个输入减去均值后除标准差,即

当batch normalization运用到deep learning时,一般会在activation function之前进行normalization,这么做的原因为:一般我们采用的激活函数,如hyperbolic tangent(双曲正切,tanh),sigmoid,都会有饱和区域(saturation region),如果activation function的输入落在了饱和区域,在反向传播时很可能会造成梯度消失(gradient vanish)的问题。所以我们会希望输入落在微分比较大也就是0的附近。而在激活层之前做normalization使得平均值为0标准差为1,在一定程度上可以使得输入落在0附近的概率更大。

 这样得到的z序列的均值为0,方差为1,我们有时候不希望均值为0方差为1因此我们可以增加两个参数γ和β进行更新:

 

测试过程中由于没有batch,因此我们无法计算均值和方差,在此我们可以采用训练过程中的均值和方差,将训练过程中所有batch的μ和σ都保存下来,然后按权重求和得到用于testing的μ和σ。

batch normalization的好处:

1.由于BN解决了Internal Covariate Shift的问题,使得网络训练可以设置更大的learning rate,从而可以减少网络训练时间。
2.在一定程度上可以防止gradient vanishing(梯度消失)。
3.减小参数的初始化对网络学习的影响。例如我们将某层参数的初始化扩大K倍,那对应的这一层的输出也增大K倍,但是这层的输出做了BN之后的输出不会改变,如下图:

图十三

4.BN会减少regularization(正则化)的需求,即在一定程度上对抗overfitting。

2.Transformer

transformer的模型架构与seq2seq模型很相似,主要用于NLP领域,旨在处理顺序数据,以及翻译和文本摘要,多标签分类问题等,与RNN不同的是RNN输入需要按顺序输入,而Transformer可以同时输入。

seq2seq的架构主要由一个encoder(编码器)和decoder(解码器)组成,seq2seq主要是为了解决输入和输出长度不确定的情况。Encoder吃一个seq, 处理的结果丢给decoder,然后decoder来决定输出一个什么样的seq 

encoder:将输入(文字、语音、视频等)编码为单个向量,这个向量可以看成是全部输入的抽象表示。

decoder:接受encoder输出的向量,逐步解码,一次输出一个结果,每次输出会影响下一次的输出,开头加入<BOS>表示开始解码,<EOS>表示输出结束。

Encoder的实现:

Encoder就是通过多层block(模块),将输入转换成向量。每一个block又包括self-attention和fully connect等网络结构。

Block的内部细节:

考虑所有输入向量后的输出向量,b是原来的输入向量,经过残差网络和标准化后,送到完全连接神经网络,再经过残差网络和标准化后得到输出

 

 Encoder整体步骤:

 

1. 在inputs的地方加上了positional encoding,之前有讲过如果你只用self-attention,没有未知的资讯,所以需要加上positional的information。

2. Multi-Head Attention:这里就是self-attention的block,然后专门强调说它是Multi-Head的self-attention。

3. Add&Norm:residual加上layer normalization

batch normalization:对不同的example不同feature的同一个dimention去计算平均值和标准差。
layer normalization:对同一个example中同一个feature的不同dimention去计算平均值和标准差。

4. Feed Forward: 是FC的feed forward network

5. N×:block会重复N次。

还可以对encoder进行改进,改变norm的位置:

Decoder的实现:

 decoder主要实现有两种,分为AT(autoregressive)和NAT(non-autoregressive)

AT:(以语音辨别为例)

通过一个one-hot vector作为启动向量,接受encoder输出的向量,经过解码器和softmax之后得到一个向量,输出向量的长度和字体库大小相同。再对比已知字体库,相似度最高的就是最后输出的字体。再把自己的输出当做下一个的输入。

 Decoder的具体结构:

decoder和encoder的区别在于decoder中使用的是Masked Multi-Head Attention而encoder中使用的是self-attention,decoder多一层self-attention,而且多出来的这层有两个输入来自encoder,一个输入来自decoder前面网络的输出。

self-attention和masked self-attention的区别为:

self-attention中的b1、b2、b3、b4分别都接受a1,a2,a3,a4所有的资讯;而masked self-attention中的b1只接受a1的资讯,b2只接受a1、a2的资讯,b3只接受a1、a2、a3的资讯,b4接受a1,a2,a3,a4的资讯。

在decoder里面使用masked self-attention的原因是一个接一个输入,输入了a1才会产生b1即a2,所以在计算b1的时候还没有a2、a3、a4。

我们如何判断是否到了结束的地方呢,需要加入结束标志,因此在decoder中包括启动变量和结束变量,例如结束标志为end:

NAT VS AT :

a.AT只有一个启动向量,需要多个步骤才能完成解码;NAT有多个启动向量,只需要一个步骤就能完成解码。

b.我们不知道输出长度,那怎么确定NAT的输出长度,放多少个BOS呢?答:方法一是用其他的预测模型预测输出长度,方法二是放很多个BOS,输出很长的序列,在end之后的字体就忽略掉。

c.NAT是平行化的,输出长度可控,比AT更加稳定。

d.NAT的效果比AT差,因为multi-modality(多通道)

Encoder和Decoder之间的通信:

 

Cross attention是连接Encoder跟Decoder之间的桥梁,从图中可以看出,这个模块的输入部分,有两个箭头来自encoder,一个来自decoder。 

cross attention的内部实现细节如下:

decoder就是产生一个q,去encoder那边抽取资讯出来当作接下来decoder里面的Fully-Connected 的Network的Input。具体来说就是,q和k1、k2、k3去计算分数,然后在和v1、v2、v3做Weighted Sum做加权,加起来得到v’,然后交给Fully-Connected处理。

Tips:

1.copy mechanism:

复制一些词汇当作输出,没必要自己产生。

2.Guided Attention:

它要做的事情就是要求机器去领导这个Attention的过程,要求机器去做attention的时候是有固定的方式的。 

 (3)Beam Search

 

该算法是用一个比较有效的方法找到一个估测的解决方案,红色的路径是贪心算法,但是绿色的路径是最好的,束搜索就是尽可能找到一个最好的路径。

beam search适用于答案比较唯一的问题,例如语音辨识等。

beam search则不适用于需要机器有创造性的问题,例如根据前文编写故事、语音合成;甚至在上述问题中,加入noise之后结果更好。

举报

相关推荐

0 条评论