神经元模型
M-P神经元模型:一个神经元接收到其他n个神经元传递过来的输入信号,这些信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”(一般是sig(x)阶跃函数或者Sigmoid函数)进行处理以产生神经元的输出
感知机模型:感知机是一个有若干输入和一个输出的模型,通过一些二进制的输入,x1,x2……,然后产生一个二进制的输出。神经元的输出要么是0要么是1,由权重和的值是否小于或者大于某一阈值决定。和权重一样阈值也是一个实数,它是神经元的一个参数。阈值(threshold)可以看作一个固定输入为-1.0和“哑节点”所对应的连接权重,这样权重和阈值的学习就可以统一为权重的学习。用代数式表示为:
激活函数
阶跃函数:sgn(x) = {1, x≥0; 0,x<0}。阶跃函数具有不连续、不光滑的性质。导致感知机上发生微小改变时,可能导致感知机的结果相反。这样的翻转可能造成一系列连锁反应。这样使得通过一点点调试参数和偏差让网络接近期望的行为变得艰难。因此可以通过一个sigmoid函数来解决这个问题。
sigmoid函数:又称挤压函数。当z=wx+b是一个很大的正数时,sigmoid的输出就接近于1,当其为一个很小的负数时,sigmoid输出值接近于0,它的平滑功能使得我们在稍微改变权重或者偏差的时候,神经元的输出值才会有些许改变。
深度神经网络
深度神经网络(Deep Nearal Network):可以理解为有很多隐藏层的神经网络,又被称为深度前馈网络(DFN),多层感知机(MLP)。前馈是指连接图无闭环或者回路。神经网络在感知机模型的基础上做了扩展,总结为:
(1)加入了多层隐藏层,增加了模型表达能力;
(2)输出层神经元可以不止一个,允许多个输出,这样模型可以更灵活的降维和聚类等;
(3)对激活函数进行扩展;感知机的激活函数通常是sing(x),感知机采用Sigmoid,tanx,softmax等加入非线性因素提高模型的表达能力.
DNN的基本结构
按不同层的位置划分,DNN内部的神经网络层可以分为:输入层,隐藏层和输出层,一般第一层是输入层,最后一层是输出层,而中间的层数都是隐藏层。层与层之间是全连接的,即第i层的任意一个神经元一定与第i+1层的任意一个神经元相连。
虽然DNN看起来很复杂,但是从小的局部模型来说,还是和感知机一样,即一个线性关系加上一个激活函数σ(z)。
DNN相关算法
前向传播算法
DNN的前向传播算法是利用若干个权重系数矩阵W,偏倚向量b来和输入值向量x进行一系列线性运算和激活运算,从输入层开始,利用上一层的输出计算下一层的输出,一层层的向后计算,一直到运算到输出层,得到输出结果为值。
反向传播算法
使用前向传播计算训练样本的输出,使用损失函数,来度量训练样本计算出的输出和真实的训练样本标签之间的损失。DNN的反向传播算法(Back Propagation,BP)通过对损失函数用梯度下降法进行迭代优化求极小值,找到合适的隐藏层和输出层对应的线性系数矩阵W,偏倚向量b,让所有的训练样本输入计算出的输出尽可能的等于或接近样本标签。
采用梯度下降法描述反向传播算法。
需要注意的是BP算法目标是最小化训练集中所有样本的累积误差:
但是上面我们介绍的算法每次仅仅针对一个样本更新连接权和阈值,也就是基于单个样本的Ek推导,如果类似的根据累积误差最小化的更新原则,就得到了累计误差逆传播(accumulated error backpropogation)算法。累积BP算法和标准BP算法都很常用。一般来说,标准BP算法往往需要多次数的迭代,累积BP算法直接针对累积误差最小化,它在读取整个训练集D一遍后才对参数进行更新,其更新的频率低很多。但在很多任务中,累积误差下降到一定程度后,进一步下降会非常缓慢。这时标准BP往往会更快获得更好的解。
类似随机梯度下降(SGD)和标准梯度下降之间的区别。
正则化
L1&L2正则化
为了避免过拟合,常用的方法是正则化(regularization)。就是在损失函数中加上一个刻画模型复杂程度的指标。
L1正则化:
L2正则化:
L1正则化和L2正则化原理类似,重点讲述DNN的L2正则化。DNN的L2正则化通常只针对与线性系数矩阵W,而不针对偏倚系数b。
假如每个样本的损失函数是均方差损失函数,则所有的m个样本的损失函数为:
则加上了L2正则化后的损失函数是:
其中,λ即正则化超参数,实际使用时需要调参。而w为所有权重矩阵W的所有列向量。
如果使用上式的损失函数,进行反向传播算法时,流程和没有正则化的反向传播算法完全一样,区别仅仅在于进行梯度下降法时,W的更新公式。反向传播算法中,W的梯度下降更新公式为:
加入L2正则化以后,迭代更新公式变成:
注意到上式中的梯度计算中我忽略了,因为α是常数,而除以m也是常数,所以等同于用了新常数α来代替。类似的L2正则化方法可以用于交叉熵损失函数或者其他的DNN损失函数。
L1、L2正则化基本思想:希望通过限制权重大小,使得模型不能任意拟合训练数据中的随机噪音。
L1与L2正则化区别:
1)L1正则化会让参数变得更稀疏,L2不会。参数变得更稀疏是指会有更多的参数变为0,可以达到类似特征选择的功能;L2正则化不会让参数变得稀疏,原因是当参数很小时,如0.001,这个参数的平方基本忽略,模型不会进一步将此参数调整为0。
2)L1正则化计算公式不可导,L2正则化公式可导。优化时需要计算损失函数的偏导数,所以对含L2正则化损失函数的优化更加简洁;优化带L1正则化的损失函数更加复杂,且优化方法较多。
通过集成学习的思路正则化
除了常见的L1&L2正则化,DNN可以用Bagging的思路来正则化。常用的机器学习Bagging算法中,随机森林是最流行的。它通过随机采样构建若干个相互独立的弱决策树学习器,最后采用加权平均法或者投票法决定集成的输出。在DNN中同样可以使用Bagging的思路。不过和随机森林不同的是,这里不是若干个决策树,而是若干个DNN的网络。
首先对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集训练DNN。即采用前向传播算法和反向传播算法得到N个DNN模型的W,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。
不过用集成学习Bagging的方法有一个问题,就是DNN模型本来就比较复杂,参数很多。现在又变成了N个DNN模型,这样参数又增加了N倍,从而导致训练这样的网络要花更加多的时间和空间。因此一般N的个数不能太多,比如5-10个就可以了。
Dropout正则化
Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。在对训练集中的一批数据进行训练时,随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合一批训练数据。如下图,去掉了一半的隐藏层神经元:
然后用这个去掉隐藏层的神经元的网络来进行一轮迭代,更新所有的W,b。
dropout并不意味着这些神经元永远的消失了。在下一批数据迭代前,会把DNN模型恢复成最初的全连接模型,然后再用随机的方法去掉部分隐藏层的神经元,接着去迭代更新W,b。当然,这次用随机的方法去掉部分隐藏层后的残缺DNN网络和上次的残缺DNN网络并不相同。
总结下dropout的方法: 每轮梯度下降迭代时,它需要将训练数据分成若干批,然后分批进行迭代,每批数据迭代时,需要将原始的DNN模型随机去掉部分隐藏层的神经元,用残缺的DNN模型来迭代更新W,b。每批数据迭代更新完毕后,要将残缺的DNN模型恢复成原始的DNN模型。
dropout和Bagging的正则化思路不同,dropout模型中的W,b是共享的,所有的残缺DNN迭代时,更新的是同一组W,b;而Bagging正则化时每个DNN模型有自己独有的一套W,b参数,相互之间是独立的。相同点是:每次使用基于原始数据集得到的分批的数据集来训练模型。
使用基于dropout的正则化比基于bagging的正则化简单,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。
DNN激活函数
不用激活函数时,每一层输出都是上层输出的线性函数, 无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,引入激活函数相当于加入非线性因素,可以有效避免多层网络等效于单层线性函数,提高模型表达力,使模型更有区分度。激活函数通常有如下一些性质:非线性(提高模型表达力),可微性(方便求梯度),单调性(损失函数为凸函数)
DNN常用的激活函数
梯度爆炸与梯度消失
反向传播的过程中运用了矩阵求导的链式法则,后层的梯度以连乘的方式叠加到前层,当激活函数为sigmoid函数时,由于其饱和特性在输入达到一定值的时候,导数会接近于0,因此使用梯度进行参数更新时,如果连乘的数在每层都是小于1的,梯度则越往前乘越小,最后几乎衰减为0,因此无法对前层的梯度进行更新,这就是梯度消失,而如果每层都是大于1的,则梯度会发生梯度爆炸。
梯度消失会导致隐层的W,b参数随着迭代的进行几乎没有大的改变,甚至不会收敛,因此无法通过加深网络层次来改善神经网络的预测效果。梯度爆炸会导致网络权重的大幅更新,引起网络不稳定,在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值。
Relu函数防止了梯度消失问题,其优点是:
1、不需要计算指数,复杂度较低,仅仅需要一个阈值就能得到激活值;
2、深层网络中,S型激活函数反向传播时会出现梯度消失现象,Relu的非饱和性可以解决这个问题,提供相对宽的激活边界;
3、Relu的单侧抑制会使得一部分神经元的输出为0,提供了网络的稀疏表达,可以缓解过拟合。
缺点:
1、使用Relu激活函数在训练过程中会导致神经元不可逆死亡。因为函数会导致负梯度在经过该ReLU单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际训练中,如果学习率(Learning Rate)设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。
缺点改进:
为了解决训练过程中神经元死亡问题,设计了Relu的变种LReLU,其中当z≤0时,是一个斜率为a的线性函数,这样既实现了单侧抑制,又保留了部分负梯度信息以致不完全丢失。
softmax函数
sigmoid函数适用于二分类问题,当进行多分类任务时,通常使用sigmoid函数,把一个k维的实数向量映射成一个概率值,(a1,a2,a3,a4.....)转变为(b1,b2, b3,b4,......)其中b是0-1的数,根据b的大小来进行多分类的任务,比如取概率值最大的一维作为所属的类别。
将神经网络最后一层的激活函数替换成softmax函数,算出概率最大的一类即为正确类。其损失函数为交叉熵:L(ý,y)= - ∑ yj * log( ýj )。当代价函数最小时,那一个正确分类的概率输出值最大。
将输出层的激活函数从Sigmoid之类的函数转变为Softmax激活函数可以使输出层神经元输出的值在0到1之间,同时所有输出值之和为1,可用于解决多分类问题。同时softmax激活函数的输入值也是一个一维向量。
损失函数
DNN损失函数
常用的损失函数有:平方误差损失函数,交叉熵损失函数,对数似然损失函数
对数似然损失是对预测概率的似然估计,其最小化的本质是利用样本中的已知分布,求解导致这种分布的最佳模型参数,使这种分布出现概率最大。它衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。其标准形式为:。
对数似然损失函数在二分类时可以化简为交叉熵损失函数。交叉熵表示两个概率分布之间的距离,交叉熵越大,两个概率分布距离越远,概率分布越相异;交叉熵越小,两个概率分布距离越近,概率分布越相似,通过交叉熵可以判断哪个预测结果与标准答案更接近。
交叉熵损失函数的计算公式为:
对数损失在多分类问题中的计算公式为:
推导平方误差损失函数相对于输出层的导数:其中最后一项σ′(z)为激活函数的导数。反向传播算法中,每一层向前递推都要乘以σ′(z),得到梯度变化值,当激活函数为S型函数时,如果z 的绝对值较大,函数会趋于饱和,即σ′(z)的绝对值非常小,导致W,b更新到极值的速度较慢,算法收敛速度较慢。当使用交叉熵损失函数时,相对于输出层的导数为:(也可以认为是残差),此时的导数是线性的,因此不会存在学习速度过慢的问题,而且其表示预测值与实际值的误差,误差越大时,梯度越大,参数w和b的调整就越快,训练的速度也就越快。
DNN激活函数和损失函数小结:
如果神经元的输出是线性的,平方损失函数是一种合适的选择,如果输出神经元是S型激活函数,则交叉熵损失函数会有更快的收敛速度。
softmax激活函数与对数似然损失的组合和sigmoid函数与交叉熵的组合相似,所以一般使用sigmoid激活函数与交叉熵进行二分类输出;使用softmax激活函数与对数似然损失进行DNN多分类输出。
参考:
https://www.cnblogs.com/steed/p/7522368.html