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之后结果更好。