5月31日到6月6日

1.Encoder-Decoder框架
下图所示为一个抽象的文本处理领域的Encoder-Decoder框架
抽象的文本处理领域的Encoder-Decoder框架
文本处理领域的Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对<Source,Target>,我们的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。Source和Target可以是同一种语言,也可以是两种不同的语言。而Source和Target分别由各自的单词序列构成:
在这里插入图片描述
Encoder顾名思义就是对输入句子Source进行编码,将输入句子通过非线性变换转化为中间语义表示C:
在这里插入图片描述
对于解码器Decoder来说,其任务是根据句子Source的中间语义表示C和之前已经生成的历史信息
在这里插入图片描述
来生成i时刻要生成的单词
在这里插入图片描述


在这里插入图片描述

目标句子Target中每个单词的生成过程如下:
在这里插入图片描述
其中f是Decoder的非线性变换函数。从这里可以看出,在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子Source的语义编码C都是一样的,没有任何区别。

而语义编码C是由句子Source的每个单词经过Encoder 编码产生的,这意味着不论是生成哪个单词,y1,y2还是y3,其实句子Source中任意单词对生成某个目标单词yi来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。这类似于人类看到眼前的画面,但是眼中却没有注意焦点一样。
没有引入注意力的模型在输入句子比较短的时候问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息.

目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。理解Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci。增加了注意力模型的Encoder-Decoder框架理解起来如下图所示。
在这里插入图片描述
即生成目标句子单词的过程成了下面的形式:
在这里插入图片描述

2.Attention机制:输出Target句子中某个单词和输入Source句子每个单词的对齐模型
深度学习中的注意力机制核心目标是从众多信息中选择出对当前任务目标更关键的信息。
在这里插入图片描述
将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。
在这里插入图片描述
其中,Lx=||Source||代表Source的长度。
聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。

也可以将Attention机制看作一种软寻址(Soft Addressing):Source可以看作存储器内存储的内容,元素由地址Key和值Value组成,当前有个Key=Query的查询,目的是取出存储器中对应的Value值,即Attention数值。通过Query和存储器内元素Key的地址进行相似性比较来寻址,之所以说是软寻址,指的不像一般寻址只从存储内容里面找出一条内容,而是可能从每个Key地址都会取出内容,取出内容的重要性根据Query和Key的相似性来决定,之后对Value进行加权求和,这样就可以取出最终的Value值,也即Attention值。

Attention机制的具体计算过程
(1)根据Query和Key计算权重系数(第一个阶段根据Query和Key计算两者的相似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理)
(2)根据权重系数对Value进行加权求和
在这里插入图片描述
transformer中的attention
在这里插入图片描述
3.Self-Attention机制(intra Attention)

在一般任务的Encoder-Decoder框架中,输入Source和输出Target内容是不一样的,比如对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,Attention机制发生在Target的元素Query和Source中的所有元素之间。
Self Attention指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,
计算句子中每个单词与其他所有单词之间的联系。
在这里插入图片描述
在这里插入图片描述
Self Attention可以捕获同一个句子中单词之间的一些句法特征(比如上上图展示的有一定距离的短语结构)或者语义特征(比如上图展示的its的指代对象Law)。

引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。

但是Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增加计算的并行性也有直接帮助作用。

在这里插入图片描述
在这里插入图片描述

4.multi-head attention机制
在这里插入图片描述
在这里插入图片描述
在得到多个Z向量后,最后一步就是将多个Z需要映射成我们之前的大小 :we need a way to condense these eight down into a single matrix
在这里插入图片描述
5.多层感知机(MLP)
多层感知器(Multi-Layer Perceptron,MLP)也叫人工神经网络(Artificial Neural Network,ANN),除了输入输出层,它中间可以有多个隐层。

接下来,我们给出一个单隐层的神经网络,以此来看一下神经网络的具体流程。大致模型如图所示:
在这里插入图片描述
首先我们先对图中的参数做一个解释:

其中,第0层(输入层),我们将x1,x2和x3向量化为X;

0层和1层(隐层)之间,存在权重w1(x1到各个隐层),w2…w4,向量化为W[1],其中[1]表示第1层的权重,偏置b同理;

对于第1层,计算公式为:

Z[1] = W[1]X + b[1]

A[1] = sigmoid(Z[1])

其中Z为输入值的线性组合,A为Z通过激活函数sigmoid的值,对于第1层的输入值为X,输出值为A,也是下一层的输入值;

1层和2层(输出层)之间,与0层和1层之间类似,其计算公式如下:

Z[2] = W[2]A[1] + b[2]

A[2] = sigmoid(Z[2])

yhat = A[2]

其中yhat即为本次神经网络的输出值。

全部训练数据集的损失函数的平均值,即为训练集的代价函数:
在这里插入图片描述
根据上述公式,可以发现代价函数其实是w和b的函数,实际上我们的目标是迭代来计算出最佳的w和b的值(矩阵),使代价函数最小化(接近0),也就是最好的训练结果。

6.全连接
全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接

7.激活函数的选择
对于激活函数的选择,是神经网络中很重要的一步,对比sigmoid函数和tanh函数在不同层的使用效果:

隐藏层:tanh函数的表现要好于sigmoid函数,因为tanh的取值范围在[-1,1]之间,均值为0,实际上起到了归一化(使图像分布在0周围,得到的结果更方便使用梯度下降)的效果。
输出层:对于二分类而言,实际上是在计算yhat的概率,在[0,1]之间,所以sigmoid函数更优。
然而在sigmoid函数和ReLU函数中,当Z很大或很小时,Z的导数会变得很小,趋紧于0,这也称为梯度消失,会影响神经网络的训练效率。

ReLU函数弥补了二者的缺陷,当z>0时,梯度始终为1,从而提高神经网络的运算速度。然而当z<0时,梯度始终为0。但在实际应用中,该缺陷影响不是很大。

Leaky ReLU是对ReLU的补偿,在z<0时,保证梯度不为0。

总结而言

在选择激活函数的时候,如果不知道该选什么的时候就选择ReLU,当然具体训练中,需要我们去探索哪种函数更适合。

8.归一化方法
详情请见博客,非常赞.

归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2018年);

将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,

batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
GroupNorm将channel分组,然后再做归一化;
SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

9.Internal covariate shift

“covariate shift” 。当x是样本空间中的一个样本,y是其标签,covariate shift 就是指的x的变化。covarite shift存在的问题就是:假如训练样本x(0)的概率分布是q(0),测试样本x(1)的概率分布是q(1),通过训练x(0)得到的模型的参数θ会比较适合x(0),不适合测试样本x(1)。这是一个迁移学习的问题。对输入样本进行归一化(或者说规范化),感觉就能一定程度的解决这个问题(个人推测)。

“Internal covariate shift”。这个和“covariate shift”不太一样。大家细想便会发现,对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。

数值偏移和表征偏移。解决Internal Covariate Shift只针对数值偏移,而解决Covariate Shift才针对表征偏移。对于数值偏移,我的理解是数值进行调整,对表面特征影响很小,比如我们把深度神经网络看作是多层的机器学习,假如我们要识别一只猫猫,每一层分别学习猫猫的猫头,猫尾巴,猫脚等,识别猫猫的这些部位的参数的特征,就是表征特征。因此,如果在解决Internal Covariate Shift问题的时候,做了表征偏移,那么深度神经网络就没变法就行识别了。

internal corvariate shift和covariate shift是两回事,前者是网络内部,后者是针对输入数据

10.positional embedding
举个例子。如果没有positional embedding,那么Transformer对于语句"我吃苹果“和”苹果吃我“,在对“吃”编码时所看到的信息是等价的,它会把两个句子看成一样的意义。而在LSTM中,单词是按照时序信息一个一个输入的,就不会有这种问题。所以,Positional embedding就相当于手动给每个字符加上了位置信息

11.梯度消失
我们都知道神经网络中会使用非线性变换。

一般会使用sigmoid函数,得到,这个函数会把数据压缩到开区间(0,1),函数的图像如下:
在这里插入图片描述
可以看到,函数的两侧非常平滑,而且无限的接近0和1,仅仅是中间部分函数接近一条直线。

要知道,神经网络训练的方法是BP算法(反向传播)。BP算法的基础其实就是导数的链式法则,就是有很多乘法会连接在一起。

看sigmoid函数的图像知道了,导数最大是1,而且大多数值都被推向两侧饱和的区域,这些区域的导数很小。

可以预见到,随着网络的加深,梯度后向传播到输入层时,就所剩无几,基本不能引起参数W数值的扰动,这样输入层一侧的网络就学习不到新的特征了参数得不到更新)。

那么怎么办?我暂时看到了四种解决问题的办法。

  1. 第一种很明显,可以通过使用别的激活函数;
  2. 第二种可以使用层归一化;
  3. 第三种是在权重的初始化上下功夫,
  4. 第四种是调整网络的结构。

12.highway network
Highway Network的灵感来自“解决RNN的问题,提出的LSTM结构” 也就是加入“门”结构。

Highway Network主要解决的问题是,网络深度加深,梯度信息回流受阻,造成网络训练困难的问题。

一般一个 feedforward neural network 有L层网络组成,每层网络对输入进行一个非线性映射变换,可以表达如下
在这里插入图片描述
对于高速CNN网络,我们定义一层网络如下 ,其中T和C分别表示 对输入的门控(0到1)和 直接传送。
在这里插入图片描述
为了理解,我们观察到,对于特殊的门值T
在这里插入图片描述
也就是:当门为1的时候,全部输出原x,不用激活。

意义、好处

物理意义:假设所有的门t的均值为0.5的话,就是把所有的原始信息一半激活,一半不变直接输入下一层,保留了很多信息。
反向传播的时候,可以让更多的(梯度)信息直接回流到输入,而不需要经过一个非线性转化。

Highway networks也使用了带有门函数的shortcut。但是这些门函数需要参数,而ResNet的shortcut不需要参数。而且当Highway networks的门函数的shortcut关闭时,相当于没有了残差函数,但是ResNet的shortcut一直保证学习残差函数。而且,当Highway networks的层数急剧增加时,没有表现出准确率的上升了。总之,ResNet可以看成是Highway networks的特例,但是从效果上来看,要比Highway networks好。

13.深度残差网络RESNET
非常赞.
非常赞

网络越深,梯度消失的现象就越来越明显,网络的训练效果也不会很好。 但是现在浅层的网络(shallower network)又无法明显提升网络的识别效果了,所以现在要解决的问题就是怎样在加深网络的情况下又解决梯度消失的问题
在这里插入图片描述
模型增加一个identity mapping(恒等映射),将原始所需要学的函数H(x)转换成F(x)+x,

而作者认为这两种表达的效果相同,但是优化的难度却并不相同,作者假设F(x)的优化 会比H(x)简单的多。

这个Residual block通过shortcut connection实现,通过shortcut将这个block的输入和输出进行一个element-wise的加叠。
作用
这个简单的加法并不会给网络增加额外的参数和计算量,同时却可以大大增加模型的训练速度、提高训练效果
并且当模型的层数加深时,这个简单的结构能够很好的解决退化问题。因为identity map时的梯度可以直接回流到了输入层

对于shortcut的方式,作者提出了三个选项:
A. 使用恒等映射,如果residual block的输入输出维度不一致,对增加的维度用0来填充;
B. 在block输入输出维度一致时使用恒等映射,不一致时使用线性投影以保证维度一致;
C. 对于所有的block均使用线性投影。

对这三个选项都进行了实验,发现虽然C的效果好于B的效果好于A的效果,但是差距很小,因此线性投影并不是必需的,而使用0填充时,可以保证模型的复杂度最低,这对于更深的网络是更加有利的。

ResNet block有两种,一种两层结构,一种三层结构非常赞
在这里插入图片描述
在这里插入图片描述

咱们要求解的映射为:H(x)
现在咱们将这个问题转换为求解网络的残差映射函数,也就是F(x),其中F(x) = H(x)-x。

残差:观测值与估计值之间的差。
这里H(x)就是观测值,x就是估计值(也就是上一层ResNet输出的特征映射)。
我们一般称x为identity Function,它是一个跳跃连接;称F(x)为ResNet Function。

那么咱们要求解的问题变成了H(x) = F(x)+x。

为什么非要经过F(x)之后在求解H(x)

第一种解释:咱们开始看图说话:如果是采用一般的卷积神经网络的化,原先咱们要求解的是H(x) = F(x)这个值对不?那么,我们现在假设,在我的网络达到某一个深度的时候,咱们的网络已经达到最优状态了,也就是说,此时的错误率是最低的时候,再往下加深网络的化就会出现退化问题(错误率上升的问题)。咱们现在要更新下一层网络的权值就会变得很麻烦,权值得是一个让下一层网络同样也是最优状态才行。对吧?
但是采用残差网络就能很好的解决这个问题。还是假设当前网络的深度能够使得错误率最低,如果继续增加咱们的ResNet,为了保证下一层的网络状态仍然是最优状态,咱们只需要把令F(x)=0就好啦!因为x是当前输出的最优解,为了让它成为下一层的最优解也就是希望咱们的输出H(x)=x的话,是不是只要让F(x)=0就行了?
当然上面提到的只是理想情况,咱们在真实测试的时候x肯定是很难达到最优的,但是总会有那么一个时刻它能够无限接近最优解。采用ResNet的话,也只用小小的更新F(x)部分的权重值就行啦!不用像一般的卷积层一样大动干戈!
第二种解释:F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化,看到残差网络我第一反应就是差分放大器…
我更like第二种

注意:如果残差映射(F(x))的结果的维度与跳跃连接(x)的维度不同,那咱们是没有办法对它们两个进行相加操作的,必须对x进行升维操作,让他俩的维度相同时才能计算。
升维的方法有两种:
全0填充;
采用1*1卷积,投影法会带来参数

在这里插入图片描述

14.由于网络的加深会造成梯度爆炸和梯度消失的问题。

解决思路:

  • 对输入数据和中间层的数据进行归一化操作,这种方法可以保证网络在反向传播中采用随机梯度下降(SGD),从而让网络达到收敛。(这个方法仅对几十层的网络有用)
  • ResNet。这个网络结构的想法主要源于VLAD(残差的想法来源)和Highway Network(跳跃连接的想法来源)。

15.设计网络的规则:(1).对于输出feature map大小相同的层,有相同数量的filters,即channel数相同;(2). 当feature map大小减半时(池化),filters数量翻倍。

16.激活函数
tanh特征相差明显时的效果会很好。
在特征相差比较复杂或是相差不是特别大时,需要更细微的分类判断的时候,sigmoid效果就好了。
tanh和sigmoid函数存在饱和时梯度值非常小。
由于BP算法反向传播的时候后层的梯度是以乘性方式传递到前层,因此当层数比较多的时候,传到前层的梯度就会非常小,网络权值得不到有效的更新,即梯度耗散。如果该层的权值初始化使得f(x) 处于饱和状态时,网络基本上权值无法更新。

relu函数
优点:
∙ x>0 时,梯度恒为1,无梯度耗散问题,收敛快;
∙ 增大了网络的稀疏性。当x<0 时,该层的输出为0,训练完成后为0的神经元越多,稀疏性越大,提取出来的特征就约具有代表性,泛化能力越强。即得到同样的效果,真正起作用的神经元越少,网络的泛化性能越好
∙ 运算量很小;
缺点:
如果后层的某一个梯度特别大,导致W更新以后变得特别大,导致该层的输入<0,输出为0,这时该层就会‘die’,没有更新。当学习率比较大时可能会有40%的神经元都会在训练开始就‘die’,因此需要对学习率进行一个好的设置。

relu函数为一个双刃剑,既可以形成网络的稀疏性,也可能造成有很多永远处于‘die’的神经元,真实使用的时候最常用的还是ReLU函数,注意学习率的设置以及死亡节点所占的比例即可.

Leaky ReLU函数和Maxout函数改善了ReLU的死亡特性,但是也同时损失了一部分稀疏性,且增加了超参数的数量。

17.transformer
在这里插入图片描述
从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。

自注意力层的输出会传递到前馈(feed-forward)神经网络中。每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络)。

解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层。除此之外,这两个层之间还有一个注意力层,用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。
在这里插入图片描述
Transformer的一个核心特性,在这里输入序列中每个位置的单词都有自己独特的路径流入编码器。在自注意力层中,这些路径之间存在依赖关系。而前馈(feed-forward)层没有这些依赖关系。因此在前馈(feed-forward)层时可以并行执行各种路径。

18.张量
张量 可以理解为容器,装元素就是向量,装一维向量就是矩阵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值