深度学习总结笔记(二)

一、人工神经网络

1、神经元

人工神经元是构成人工神经网络的基本单元。人工神经元和感知器非常类似,我们说感知器的时候通常认为它的激活函数为阶跃函数,而神经元使用一个非线性的激活函数,典型的激活函数有sigmoid型函数、非线性斜面函数等。

单个神经元模型如图:

 

假定神经元接受n 个输入x = (x1, x2, ..., xn),用状态z 表示一个神经元所获得的输入信号x 的加权和,输出值为a


其中,wn维的权重向量,b 是偏置。

2、激活函数

Sigmoid型激活函数主要有Logistic函数σ(x)和tanh函数。

 

函数图形如下:

 

Logistic函数输出值在(0,1)区间内,tanh函数输出值在(-1,1)区间。

sigmoid 型函数对中间区域的信号有增益,对两侧区的信号有抑制。这样的特点也和生物神经元类似,对一些输入有兴奋作用,另一些输入(两侧区)有抑制作用。和感知器的阶跃激活函数相比,sigmoid 型函数更符合生物神经元的特性,同时也有更好的数学性质很好。

除了sigmoid 型函数,在神经网络中还有一些其它的非线性激活函数。

一种是rectifier 函数,定义为:

rectifier(x) = max(0, x)

神经科学家发现神经元具有单侧抑制、宽兴奋边界、稀疏激活性等特性。而rectifier 函数就具备很好的稀疏性,并且整个网络只有比较、加、乘操作,计算上也更加高效。使用rectifier 函数的深度神经网络可以不需要非监督的预训练过程。

采用rectifier 函数的单元也叫作修正线性单元(rectified linear unitReLU)。

另一种是softplus 函数,定义为

softplus(x) = log(1 + ex)

softplus 函数可以看作是rectifier 函数的平滑版本,其导数刚好是logistic 函数。softplus 虽然也有具有单侧抑制、宽兴奋边界的特性,却没有稀疏激活性。

 

3、前馈神经网络

多个神经元连接在一起组成神经网络。各神经元分别属于不同的层。每一层的神经元可以接收前一层神经元的信号,并产生信号输出到下一层。第一层叫输入层,最后一层叫输出层,其它中间层叫做隐藏层。

 

一种简单的多层神经网络是前馈神经网络,整个网络中无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示。

前馈神经网络通过如下公式进行信息传播:

 

4、反向传播算法

1)何谓反向传播算法

对于有一个带标签的含有m个样例的样本集,我们可以用批量梯度下降的方法求解神经网络。对于单个样本(xy)它的代价函数如下:

 

上式是一个方差代价函数。对于一个含有m个样本的数据集,它的整体代价函数可以被定义为:

 

                                                  

其中是权重衰减项,为了减小权重幅度,防止过拟合。

为了求出J(W,b)的最小值,我们采用梯度下降法来最小化损失函数。

首先需要将所有参数初始化为一个接近于0的随机数值,而不是全部设为0。如果每一个参数都初始化为相同的值,那么网络中所有同一层的参数和输出都会有相同的值,网络无法通过训练达到收敛。

网络的训练是一个迭代过程,函数的梯度是函数减小最快的方向,所以用以下公式来更新参数:

 

其中α是学习效率,即每次移动的步长。

是单个训练样本对应的代价函数J(W,b;x,y)的偏导数。计算出这两个偏导数之后,就可以根据它们求解出整体样本代价函数J(W,b)的偏导数:

 

注意的是,权重衰减项只作用于W而不是b

接下来我们来计算每个节点的残差项,残差项表示第l层的神经元对最终误差的影响,也反映了最终的输出对第l 层的神经元对最终误差的敏感程度。

对于输出层节点:

 

而隐藏层的节点残差项计算结果如下:(推导过程略)

 

可以看出,l 层的误差项可以通过第l +1 层的误差项计算得到。这就是误差的反向传播

在计算出每一层的误差项之后,我们就可以得到每一层参数的梯度。

 

因此,前馈神经网络的训练过程可以分为以下三步:

(1)先前馈计算每一层的状态和激活值,直到最后一层;

(2)反向传播计算每一层的误差;

(3)计算每一层参数的偏导数,并更新参数。

(2)梯度消失问题

根据误差反向传播的迭代公式

 

误差从输出层反向传播时,在每一层都要乘以该层的激活函数的导数。而对于logistic函数和tanh函数,它们的导数值域都小于1.

 

也就是说,这些误差经过每一层传递都会不断衰减。当网络层数很深时,梯度就会不停的衰减,甚至消失,使得整个网络很难训练。这就是所谓的梯度消失问题。

减轻梯度消失问题的一个方法是使用线性激活函数(例如rectifler函数)或者近似线性函数(例如softmax函数)。这样,激活函数的导数为1,误差可以很好的传播,训练速度得到提高。

二、卷积神经网络

卷积神经网络(CNN)是一种前馈神经网络,它是受生物学上感受野Receptive Field)的机制提出来的。比如在视觉神经系统中,一个神经元的感受野是指视网膜上的特定区域,只有这个区域内的刺激才能够激活该神经元。

卷积神经网络有三个结构上的特性:局部连接,权重共享以及空间或时间上的次采样。这些特性使得卷积神经网络具有一定程度上的平移、缩放和扭曲不变性。

1、特点

1)局部连接

与全连接神经网络相比,卷积神经网络的一个主要特征是采用了局部连接(稀疏连接)。第l 层的每一个神经元都只和第l 1 层的一个局部窗口内的神经元相连,构成一个局部连接网络。这与生物学上感受野的特征是一致的。

当处理一幅图像时,输入图像可能包含成千上万个像素点,但是我们可以只通过几十到上百个像素点的核来检测我们需要的特征例如图像的边缘。这样我们需要的存储的参数大大减少,计算量也减小。

 

(上)卷积神经网络,可以看到,每一个输出单元只受3个输入单元的影响。(下)全连接神经网络。

在卷积神经网络中,虽然直接连接都是很稀疏的,但是处在深层的神经元可能与绝大部分输入是间接交互的,它们的感受野比处在浅层单元的感受野更大,如下图所示。这允许网络可以通过稀疏交互来高效地表示多个变量的复杂交互。

 

(2)参数共享

在卷积神经网络中,卷积层的每一个卷积滤波器重复的作用于整个感受野中,对输入图像进行卷积,卷积结果构成了输入图像的特征图,提取出图像的局部特征。每一个卷积滤波器共享相同的参数,包括相同的权重矩阵和偏置项。

这保证了我们只需要学习一个参数集合,而不是对每一个位置都需要学习一个单独的参数集合。这虽然没有改变前向传播的运行时间,但它大大减少了需要存储的参数数目。

对于卷积,参数共享的特殊形式使得神经网络具有平移等变性。即使图像有小的平移,提取到的特征依然保持不变。当处理时间序列数据时,这意味着通过卷积可以得到一个由输入中不同时刻所组成的时间轴。如果我们把输入中的一个事件向后延时,在输出中仍然会有相同的表示,只是时间延后了。图像与此类似,卷积产生了一个二维映射来表明某些特征在输入中出现的位置。如果我们移动输入的对象,它的表示也会在输出中移动同样的量。

当然在某些情况下,我们并不希望对整幅图进行参数共享,参数可以通过我们想要提取的特征进行调整。

2、池化

1)卷积网络结构

卷积神经网络的卷积层通常包含三级。在第一级中,卷积层并行地进行多个卷积运算来产生一组线性激活函数。在第二级中,非线性的激活函数如整流线性单元函数等作用在第一级中的每一个线性输出上。这一级有时也被称为探测级(detector stage)。在第三级中,我们使用池化函数(pooling function) 函数来更进一步地调整卷积层的输出。

 

这是典型卷积神经网络层的组件。有两组常用的术语用于描述这些层。() 在这组术语中,卷积网络被视为少量相对复杂的层,每层具有许多‘级’。在这组术语中,核张量与网络层之间存在一一对应关系。() 在这组术语中,卷积网络被视为更大数量的简单层;每一个处理步骤都被认为是一个独立的层。这意味着不是每个‘层’ 都有参数。

(2)池化函数

卷积层虽然可以显著减少连接的个数,但是每一个特征映射的神经元个数并没有显著减少。这样,如果后面接一个分类器,分类器的输入维数依然很高,很容易出现过拟合。为了解决这个问题,在卷积神经网络一般会在卷积层之后再加上一个池化(Pooling)操作,也就是子采样(Subsampling),构成一个子采样层。子采样层可以来大大降低特征的维数,避免过拟合。

池化函数采用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。例如最大池化函数max pooling)给出相邻矩形区域里的最大值。

不管采用什么样的池化函数,平移不变性始终成立。当输入进行少量平移时,经过池化函数的大多数输出并不会发生改变。这对当我们关心某个特征是否出现而并不关心它出现的具体位置时十分有用。

 

上图是最大池化函数不变性的解释。() 下面一行显示非线性的输出。上面一行显示最大池化的输出,每个池的宽度为三个像素并且池化区域的步幅为一个像素。() 相同网络的视图,不过对输入右移了一个像素。下面一行的所有值都发生了改变,但上面一行只有一半的值发生了改变,这是因为最大池化单元只对周围的最大值比较敏感,而不是对精确的位置。

(3)池化的作用

池化函数除了可以对卷积特征进行降维,减小计算复杂度之外,在很多任务中,池化对于处理不同大小的输入具有重要作用。例如我们想对不同大小的图像进行分类时,分类层的输入必须是固定的大小,而这通常通过调整池化区域的偏置大小来实现,这样分类层总是能接收到相同数量的统计特征而不管最初的输入大小了。

三、循环神经网络

在前馈神经网络模型中,连接存在层与层之间,每层的节点之间是无连接的。循环神经网络(RNN)通过使用带自反馈的神经元,能够处理任意长度的序列。循环神经网络已经被广泛应用在语音识别、语言模型以及自然语言生成等任务上。

1、简单循环网络

 

将循环网络按时间展开:

 

假设时刻t 时,输入为xt,隐层状态为htht 不仅和当前时刻的输入相关,也和上一个时刻的隐层状态相关。

一般我们使用如下函数:

这里,f 是非线性函数,通常为logistic 函数或tanh 函数。

这里每一步使用的参数Uwb都是一样的,也就是说每个步骤的参数都是共享的,这是循环神经网络的重要特点。

2seq2seq模型

RNN的展开图可以看到,循环神经网络的输入和输出必须要是等长的。然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。

为此,我们采用一种结构叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。

Encoder-Decoder结构先将输入数据编码成一个上下文向量c

 

得到c有多种方式,最简单的方法就是把Encoder的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到c,也可以对所有的隐状态做变换。

拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。具体做法就是将c当做之前的初始状态h0输入到Decoder中:

 

还有一种做法是将c当做每一步的输入:

 

这种Encoder-Decoder结构在实际应用中非常广泛,例如机器翻译、文本摘要、语音识别等。

3、梯度计算

循环神经网络的参数训练可以通过随时间进行反向传播(BPTT)算法。

 

假设循环神经网络在每个时刻t 都有一个监督信息,损失为Jt。则整个序列的损失为

根据链式法则可以求出损失J关于U的梯度:

 

我们定义,则上面公式括号里变为。如果γ>1,当时,,会造成系统不稳定,这就是所谓的梯度爆炸问题。相反,如果γ<1,当时,,会出现和深度前馈神经网络类似的梯度消失问题。

所以简单循环网络只能处理短时间的依赖关系。

4、长短时记忆网络

对于简单RNN不能处理长期依赖问题,我们可以采用长短时记忆网络(LSTM)。长短时记忆网络的思路比较简单。原始RNN的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。那么,假如我们再增加一个状态,即c,让它来保存长期的状态,那么问题不就解决了么?如下图:

 

新增加的状态c,称为单元状态(cell state)。我们把上图按照时间维度展开:

 

我们可以看出,在t时刻,LSTM的输入有三个:当前时刻网络的输入值Xt、上一时刻LSTM的输出值ht-1、以及上一时刻的单元状态Ct-1LSTM的输出有两个:当前时刻LSTM输出值ht、和当前时刻的单元状态Ct。注意xhc都是向量。

LSTM的关键,就是怎样控制长期状态cLSTM用两个门来控制单元状态c的内容,一个是遗忘门forget gate),它决定了上一时刻的单元状态Ct-1有多少保留到当前时刻Ct;另一个是输入门input gate),它决定了当前时刻网络的输入Xt有多少保存到单元状态CtLSTM输出门output gate)来控制单元状态Ct有多少输出到LSTM的当前输出值ht

 

在时刻tLSTM的更新方式如下:

 

这里,xt 是当前时刻的输入,σlogistic 函数,Vi、Vf 、Vo 是对角矩阵

更新过程示意图:

 

四、数据预处理

我们已知深度学习的训练过程包含无监督预训练有监督微调两部分。在预训练过程之前,我们首先要对数据进行预处理操作,预处理也属于无监督的学习算法。无监督学习是指从不需要人为注释样本的分布中抽取信息。该术语通常与密度估计相关,学习从分布中采样,学习从分布中去噪,需要数据分布的流形,或是将数据中相关的样本聚类。

1、表示学习

一个经典的无监督学习任务是找到数据的‘最佳’ 表示。‘最佳’ 可以是不同的表示,但是一般来说,是指该表示在比本身表示的信息更简单或更易访问而受到一些惩罚或限制的情况下,尽可能保存关于x 更多的信息。

有很多方式定义较简单的表示。最常见的三种包括低维表示,稀疏表示,独立表示。

低维表示尝试将x 中的信息尽可能压缩在一个较小的表示中。

稀疏表示将数据集嵌入到输入项大多数为零的表示中。稀疏表示通常用于需要增加表示维数的情况,使得大部分为零的表示不会丢失很多信息。这会使得表示的整体结构倾向于将数据分布在表示空间的坐标轴上。

独立表示试图解开数据分布中变动的来源,使得表示的维度是统计独的。

当然这三个标准并非相互排斥的。低维表示通常会产生比原始的高维数据具有较少或较弱依赖关系的元素。这是因为减少表示大小的一种方式是找到并消除冗余。识别并去除更多的冗余使得降维算法在丢失更少信息的同时显现更大的压缩。

2、主成分分析

1)数据降维

主成分分析(PCA)是一种能够极大提升无监督特征学习速度的数据降维算法。当我们处理图像时,因为图像中相邻像素相关性强,输入数据存在大量冗余。PCA算法可以将输入向量转换为一个维数低很多的近似向量,而且误差非常小。

采用二维数据为例,假设输入数据集表示为,我们要把数据从二维降到一维。

 

上图可以看出数据变化的Large varianceu1)和Small varianceu2),我们先计算输入x的协方差矩阵:(假设x的均值为0

可以证明,u1就是协方差矩阵的主特征向量,u2是次特征向量。

将协方差矩阵所有的特征向量按列排放,组成矩阵U,另记为对应的特征值。

 

我们把x用(u1u2)基表达为:

 

把训练数据集旋转到(u1u2)基后,数据的主方向就是旋转数据的第一维。

 

更一般地,如果要把数据降到k维表示,只需选取的前k个成分,分别对应前k个数据变化的主方向。

(2)选择主成分个数

对于高维数据来说,如何选择主成分个数k呢?如果k过大,数据压缩率不高,在极限情况k=n时,等于是在使用原始数据;相反地,如果k过小,那数据的近似误差太大。

决定k值时,我们通常会考虑不同k值可保留的方差百分比。设表示特征值,对应于特征向量,那么如果我们保留前k个成分,则方差百分比可计算为:

 

 

在上面的二维示例中,λ1=7.29,λ2=0.69,因此如果保留k=1个主成分,等于我们保留了7.29/(7.29+0.69)=0.913,即91.3%的方差。

在处理图像数据中,一个惯常的经验法则是选择k以保留99%的方差,即

 

(3)对图像数据应用PCA

为使PCA能有效工作,我们通常希望所有的特征x1,x2,...,xn都有相似的取值范围,并将其取值范围规整化为零均值和单位方差。

由于自然图像具有平稳性,即图像每一部分的统计性质都一致。即使不进行方差归一化操作,不同特征的方差值也满足相似性。而根据应用,在大多数情况下,我们并不关注所输入图像的整体明亮程度。比如在对象识别任务中,图像的整体明亮程度并不会影响我们对图像中物体的识别。那我们可以通过减去图像块的平均亮度值来进行均值规整化。

3、白化

还有一个与PCA相关的预处理步骤称为白化。白化的目的是降低输入的冗余性。我们通过白化使得学习算法的输入具有以下性质:

(1)特征之间相关性较低

(2)所有特征具有相同的方差

其实在PCA旋转变换时实际上已经消除了之间的相关性,得到的数据表示的协方差矩阵为对角阵:

 

说明特征间彼此无关。

为了使每个输入特征具有单位方差,我们可以使用作为缩放因子来缩放每个特征:

 

这样协方差矩阵就变成了单位阵。我们可以将PCA与白化结合起来,这样处理后的数据最后的少量成分总是接近于0,因而舍弃这些成分不会带来很大的问题。

实践中实现PCA白化时,有时一些特征值λi在数值上接近于0,这样才缩放步骤除以时可能导致数据上溢。我们可以使用少量的正则化实现缩放过程,加上一个很小的常数ε:

 

x在区间[-1,1]上时,一般取值ε

五、深度网络训练

l深度网络的训练过程具体如下:

1无监督预训练:使用自下而上的非监督学习(就是从底层开始,一层一层的往顶层训练):——特征学习

2有监督微调:自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调)。

1、自编码器

自编码器是神经网络的一种,是一种无监督的特征学习算法,经过训练后尝试将输入复制到输出,即

 

自动编码器内部有一个隐含层h,可以产生编码(code) 来表示输入。该网络可以看作由两部分组成:一个编码器函数h = f(x) 和一个生成重构的解码器y= g(h)。如果一个自动编码器学会简单地设置g(f(x)) = x,那么这个自动编码器不会很有用。这通常需要强加一些约束,比如限定隐藏层神经元的数量,使自动编码器只能近似地复制,并只能复制类似训练数据的输入。这些约束强制模型划定输入数据不同方面的主次顺序,因此它往往能学习到数据的有用特性。

(1)稀疏自编码器

当编码维度小于输入维度时,学习欠完备的表示会强制自编码器捕捉训练数据中最显著的特征。但是当隐藏层神经元数量较大(可能比输入像素的个数还要多),我们仍然可以给自编码神经网络施加一些其他的限制条件来发现输入数据中的结构,例如稀疏性限制。稀疏性可以被简单地解释如下:如果当神经元的输出接近1时我们认为它被激活,而输出0时认为它被抑制,那么使神经元大部分的时间都是被抑制的限制称作稀疏性限制。当使用tanh函数作为激活函数时,则认为输出为-1时神经元时被抑制的。

学习过程可以简单地描述为最小化一个损失函数,惩罚g(f(x))x的差异,如均方误差。在稀疏自编码器中,为了限制隐藏神经元的活跃度必须接近于0,我们还会在损失函数中添加一个额外的惩罚因子,使得隐藏神经元的平均活跃度保持在较小范围内。


我们可以简单地将惩罚项Ω(h)视为加到前馈网络中的正则项,惩罚因子的具体形式有很多种,例如相对熵的形式:

 

这里ρ是稀疏性参数,通常是一个接近于0的较小的值;是隐藏神经元的平均激活度。

 

(2)栈式自编码器

栈式自编码器是一个由多层系数自编码器组成的神经网络,其前一层自编码器的输出作为其后一层自编码器的输入。对于一个n层栈式自编码器神经网络,假定表示第k个自编码器对应的参数,那么该栈式自编码器的编码过程就是按照从前往后的顺序执行每一层自编码器的编码步骤:

 

同理,栈式自编码器的解码过程就是,按照从后往前的顺序执行每一层自编码器的解码步骤:

 

其中,是最深层隐藏单元的激活值,包含我们感兴趣的信息,这个向量也是对输入值的最高阶的表示。

2、分类器

无监督预训练过程在上文所说的栈式自编码器的特征学习过程之后,还要将学习到的特征送入一个分类器中,才能输出最后的预测值。常用的分类器包括Logistic回归和Softmax回归模型,它们属于有监督的学习算法,通过有监督地训练得到一个判别函数,从而对目标值进行预测。

1Logistic回归模型

① Logistic函数

我们已经知道Logistic函数能将实数空间的数映射到(0,1)区间,这正好符合概率的特性

函数图形:

 

在逻辑回归中,训练样本集由m个带标签样本构成:。逻辑回归用来解决二分类问题,因此分类标签为。假设函数:

 

将训练模型参数θ,使它能够最小化Loss函数:

 

Loss函数采用交叉熵形式。

② 交叉熵损失函数

给定一个实例(x, y),真实目标是y,机器学习模型的预测为f(x, θ)。对于分类问题,预测目标y是离散的类别,模型输出f(x,θ)是每个类的条件概率。

假设,模型预测的第i 个类的条件概率P(y = i|x) =,则f(x, θ)满足:

fy(x, θ) 可以看作真实类别y 的似然函数。参数可以直接用最大似然估计来优化。考虑到计算问题,我们经常使用最小化负对数似然,也就是负对数似然损失函数:

L(y, f(x, θ)) = log fy(x, θ)

如果我们用one-hot 向量y 来表示目标类别c,其中只有 yc= 1,其余的向量元素都为0

负对数似然函数也可以写为:

yi也也可以看成是真实类别的分布,这样上述公式恰好是交叉熵的形式。因此,负对数似然损失函数也常叫做交叉熵损失函数(Cross Entropy Loss function)是负对数似然函数的一种改进。

2Softmax回归模型

① Softmax函数

softmax函数经常用在神经网络的最后一层,作为输出层,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类

对于K个标量x1,x2,x3,...,xkSoftmax函数定义为

 

其中zk满足:

 

softmax回归中,类标Y可以取k个不同的值(k>2)。对于训练集

,有

其假设函数为:

 

其中项是为了对概率分布进行归一化处理,使所有概率的和等于1

 

如上图所示,softmax层其实就是将原来输出是3,1,-3通过softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标。

Softmax 回归模型的Loss函数为:

 

其中1{·}是示性函数:1(表达式的值为真)=11{表达式的值为假}=0.

Softmax回归Loss函数与逻辑回归Loss函数有很相似的表示形式,不同的是在Softmax回归Loss函数中对k个可能分类的概率值进行累加。

② Softmax函数的求导

当我们对分类的Loss函数进行改进的时候,我们要通过梯度下降,每次优化一个step大小的梯度,这个时候我们就要求Loss函数对每个权重矩阵的偏导,然后应用链式法则。

Softmax函数一个最大的优点就是它的梯度求导计算过程特别方便。

举一个简单的例子:

 

如图所示,我们能得到下面公式:

z4 = w41*o1+w42*o2+w43*o3

z5 = w51*o1+w52*o2+w53*o3

z6 = w61*o1+w62*o2+w63*o3

z4,z5,z6分别代表结点4,5,6的输出,01,02,03代表是结点1,2,3往后传的输入。

那么我们可以经过softmax函数得到

a4 = e^z4/(e^z4+e^z5+e^z6)

a5 = e^z5/(e^z4+e^z5+e^z6)

a6 = e^z6/(e^z4+e^z5+e^z6)

我们采用交叉熵函数作为Loss函数:

其中y代表我们的真实值,a代表我们softmax求出的值。

虽然Loss函数中出现了累加符号,但实际中我们由于只输出一个预测结果,那么在目标中只有一个结点的值为1,其余结点输出都为0.

假设第j个结点输出为1,那么Loss函数变成了,其中

所以.

我们将Loss函数分别对各结点权重求偏导,例如求Loss的偏导:

其中根据z4 = w41*o1+w42*o2+w43*o3已知,关键在于求出.

这里根据ij是否为同一结点可分为两种情况:

第一种情况:(i=j)

 

 

再与-1/aj相乘为aj-1,形式非常简单,这说明我只要正向求一次得出结果,后反向传梯度的时候,只需要将它结果减1即可,就求出了对该节点的求导

第二种情况:(i!=j)

 

 

 

再与-1/aj相乘为ai,这说明我只要正向求一次得出结果,然后反向传梯度的时候,只需要将它结果保存即可。

③ 权重衰减

Softmax函数有一个不寻常的特点,它有一个冗余的参数集。假设我们从参数向量中减去向量ψ,假设函数变成了:

 

可以看到,从中减去ψ完全不影响假设函数的预测结果。这表明Softmax回归模型中存在冗余的参数。

进一步而言,如果是损失函数J(θ)的极小值点,那么同样也是它的极小值点。这样J(θ)最小值的点不是唯一的。

在实际应用中,我们通过添加一个权重衰减项来修改损失函数:

 

这样损失函数就变成了严格的凸函数,就能保证有唯一的最优解了。

3LogisticSoftmax的关系

logistic具体针对的是二分类问题,而softmax解决的是多分类问题,所以可以理解为logistic函数是softmax函数当类别数=2时的一个特例。

当多个logistic回归通过叠加也可以实现多分类的效果,它们的区别是:

softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;而多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。

3、逐层贪婪训练算法

与浅层神经网络相比,深度神经网络的优势在于,它能以更紧凑简洁的方式来表达比浅层网络大得多的函数集合。比如在处理图像时,我们能够使用深度网络学习到“部分——整体”的分解关系。例如,第一层可以学习到如何将图像中的像素组合在一起来检测边缘;第二层可以将边缘组合起来检测更长的轮廓或者“目标的部件”;在更深的层次上,可以将这些轮廓进一步组合起来以检测更为复杂的特征。

但是如果我们使用浅层神经网络的训练算法:先随机初始化深度网络的权重,然后使用有监督的目标函数在有标签的训练集上进行训练,通过使用梯度下降法来降低训练误差。这种方法不会十分奏效,有如下几方面原因:

(1)数据获取问题:实际中有标签的数据数量有限,我们很难获得足够多的样本来拟合一个复杂模型的参数,这样容易导致过拟合;

(2)局部极值问题:使用监督学习法训练神经网络时,会涉及到一个高度非凸的优化问题(例如最小化训练误差),这种非凸优化问题的搜索区域内充斥着大量“坏”的局部极值,因而使用梯度下降法效果并不好;

(3)梯度弥散问题:在使用反向传播法计算梯度的时候,随着网络层数的增加,梯度的幅度值会急剧减小,这就造成整体的损失函数相对于最初几层的权重的导数非常小,最初几层的权重变化非常缓慢,以至于它们不能从样本中进行有效的学习。

在深度网络中我们采用逐层贪婪的训练算法,每次只训练网络中的一层,即我们首先训练一个只含一个隐藏层的网络,仅当这层训练结束后才开始训练一个有两个隐藏层的网络,以此类推。在每一步中,我们把已经训练好的前k-1层固定,然后增加第k层,每一层的训练可以是有监督的(例如将每一步的分类误差作为目标函数),但更通常使用无监督方法(自编码器)。这些各层单独训练所得到的权重用来初始化最终深度网络的权重,然后再进行微调。

4、有监督微调

深度网络的训练过程不仅包括预训练的过程,还包含采用部分有标签数据来进行有监督微调的过程。监督微调可以使用反向传播算法来优化权重值,其中输出层就是我们的Logistic或者Softmax分类器。如果你只对以分类为目的的微调感兴趣,那么可以直接丢掉栈式自编码器的解码层,直接把最后一个隐藏层输出的特征输入到分类器中,这样分类器的梯度值就可以直接反向传播给编码层了。当然你也可以对预训练阶段得到的整个网络进行微调。

猜你喜欢

转载自blog.csdn.net/zgyggy/article/details/78363713