全连接神经网络
0.像素表示
如(r1,g1,b1,r2,g2,b2…rn,gn,bn)这样
1.多层感知机
全连接神经网络
max()叫激活函数。
激活函数不能去掉,去掉就退化成线性分类器。
全连接神经网络的权值
w1可以看做模板,它可以有比类别数更多的分类,就是一个类别可以有多个模板。
比如10中类别的动物,w1可以有50中模板甚至更多,即同一类动物可以有多个模板,把与x得到的结果与w2融合,找到最大的,得出结果。
线性分类器的w行数和类别数相同,而全连接神经网络中只需最外层w的行数和类别数相同。
全连接神经网络与线性不可分
线性分类器可用于分离线性可分的,但是线性分类器不能把线性不可分的分开,此时就需要有全连接神经网络这样的模型。
全连接神经网络绘制与命名
每个x相互独立为单独的输入。
2.激活函数
激活函数
常用的激活函数
sigmoid函数的范围为(0,1);
tanh函数的范围是(-1,1);而且是中心对称的;
网络结构设计
用不用隐层,用一个还是用几个隐层?(深度设计)
每隐层设置多少个神经元比较合适?(宽度设计)
没有确定的答案。
依据分类任务的难易程度来调整神经网络模型的复杂程度。分 类任务越难,我们设计的神经网络结构就应该越深、越宽。但是, 需要注意的是对训练集分类精度最高的全连接神经网络模型,在 真实场景下识别性能未必是最好的(过拟合) 。
全连接神经网络小结
3.softmax与交叉熵
softmax函数
softmax函数是把分类的结果得分转换成各种结果的概率。
交叉熵
在此处交叉熵的意义在于衡量两个分布的不相似度。
计算交叉熵之前要用softmax方法做归一化处理。
相对熵中的p和q是不能交换的,p和q之间不能交距离,只能叫散度,因为二者不满足可交换性。
熵表示的信息量的大小。
比如:中国和巴西踢足球,巴西赢的概率为1,平的概率为0,输的概率为0,这种事情没有信息量,确定性极强,熵为0;
当每种概率都是1/n时,此时熵是最大的,因为结果是不确定的。
通过熵,交叉熵,相对熵的公式可以看出:交叉熵=熵+相对熵
又因为真实分布的熵为0,此时交叉熵等于相对熵。
因为相对熵又称为KL散度,表示的是两个随机分布之间的差异,且交叉熵等于相对熵,所以可用交叉熵来表示两个随机分布之间的差异。
4.对比多类支撑向量机损失
交叉熵损失 vs 多类支撑向量机损失
很明显,计算出来的交叉熵损失和多类支撑向量机损失的值是不同的。
采用交叉熵损失训练的结果是,某一项分数高时,还要尽可能去压低其余项的分数;
采用多类支撑向量机损失训练的结果是,某一项分数高时,只比其余项高出1即可。
在使用多类支撑向量机损失时,可能会出现loss值几乎没有变但是分类精度却提高了,比如:
【0.35,0.33,0.32】和【0.33,0.35,0.32】,两则计算出的loss值差距很小,但是分类的结果却完全不同。
5.计算图与反向传播
计算图
计算图是一种有向图,它用来表达输入、输出以及中 间变量之间的计算关系,图中的每个节点对应着一种数学运算。
当多层神经网络时,写出求导后的表达式是不容易的,引入计算图可以实现复杂函数的求导问题。
通过计算图计算某处的值,要知道三点:
- 上图中1处的值,即z=x+y处的z值是多少;
- 上图中2处求导的表达式,即z^2求导的表达式
- 上图中3处的导数的值;
反向传播
总结:
- 通过正向计算出各处的值;
- 能反向计算是因为有了链式法则;
- 反向传播最后一个导数为1,因为f对f求导还是1;
- 所求处的梯度=上游梯度*局部梯度;
- 上游梯度是指所求处右侧的梯度;局部梯度为所求处右侧圆圈式子里的梯度;
- 局部梯度的式子若为+1,即为x+1,若为*-1,即为-x,以此类推;
存在的问题:因为是相乘操作,当梯度都特别小时,乘着乘着就可能出现梯度消失的情况;
计算图的颗粒度
计算图的颗粒度:每一个门可以是一个很复杂的函数,也可以是简单的加减乘除;函数越复杂代表颗粒度越大;
简单函数的好处是都可以按照基源去操作,坏处是要严格按照链路一步一步去计算;
复杂的函数颗粒度较大,但计算效率较高;
计算图中常见的门单元
- 加法门:左边每个分支的值都等于右边的值;
- 乘法门:两数互换,再相乘;
- 拷贝门:左边等于右边的和;
- max门:把右边的值赋给左边最大的,其余为0;
6.再看激活函数
梯度消失
通过观察sigmoid函数和tanh函数的图像可知,当x超出一定值后梯度为0,由于链式法则是相乘的就会出现梯度消失的情况。
为了解决这一问题就出现了Leakly ReLU函数
Leakly ReLU函数在x>0的情况下梯度恒为1,在x<0的情况下恒为0.01;效果较好;
梯度爆炸
梯度爆炸会导致错过良好的w值;
通过限制步长的方法来解决梯度爆炸;
激活函数选择总结
尽量选择ReLU函数或者Leakly ReLU函数,相对于Sigmoid/tanh, ReLU函数或者Leakly ReLU函数会让梯度流更加顺畅,训练过程收敛 得更快。
由于Sigmoid/tanh函数的特性,一般情况下不会在隐层中使用,但可能会用在输出层,把结果控制在某一个范围中。
7.动量法与自适应梯度(梯度算法的改进)
梯度下降算法存在的问题
当存在多个w时,传统梯度下降算法会在陡峭处w会来回震荡,而平坦处的w优化缓慢;
仅仅增大步长并不能加快算法收敛的速度,因为w=w-步长*某点处梯度,增加步长会使陡峭的地方震荡幅度增大(因为陡峭处的梯度值的绝对值较大),平坦的地方进展仍然缓慢(因为平坦处的梯度值的绝对值较小);
动量法
动量是有方向的,梯度也是有方向的;
在陡峭的地方,梯度方向是不断变化的,当把一定的梯度累加在一起可能是在某一个方向上一个很小的数;在平坦的地方,梯度的方向是一定的,虽然它是一个很小的数,但是累加起来就是一个较大的数,从而实现梯度较快更新的目的;
动量法累加梯度信息是图中3处,并不是2处,2处是小批量随机梯度下降算法的累加;
动量系数u控制历史信息是不是要被衰减;
若u=0时就退化成梯度下降算法;若u=1时就会不断的加大历史的影响,即v=v+g,即使梯度下降算法走到平坦的区域(g=0)时,v仍然不等于0,那么权值会仍然更新下去,但若v=0.9时,v=0.9v,一定次数后v的值将会非常小。
u的值一般使用0.9;
因为鞍点和局部最小值点的导数都为0,又因为w=w-步长*导数,则w更新不动了,此时通常就认为收敛了,但这是不对的;
加入动量以后,即使局部梯度为0,即g=0,但是v=uv+g不为0,并不会马上停止更新,此时就有可能冲出局部最小点或鞍点 ,找到更优的解。
自适应梯度与RMSProp
自适应梯度算法就是在陡峭的地方用小步长,在平坦的地方用大步长。
通过计算梯度平方和找出震荡方向和平坦方向,在4中表达式可以看出较大的r学习率较小,较小的r学习率较大,从而达到减少震荡更快达到谷底的目的。
存在问题:因为r一直在累加,当加到很大时,学习率就会趋近于0,失去调节作用;
RMSProp解决了AdaGrad存在的问题,因为r前面存在ρ,当r加到一定的次数,前面的r就会衰减变得非常小,进而保证r的值永远不会很大。
ρ=0时,仅仅考虑当前梯度的强度;
ρ=1时,r=r,又r初始为0,显示不可能;
ρ一般取0.999;
保留的次数越多,p的值就应该越大,例如:保留一百个数p的值应为0.99(1-1/100=0.99),可以此类推(只是大概而已);
ADAM
ADAM是动量法和自适应梯度下降算法的结合;
图中3处体现了动量法,图中4处体现了自适应梯度下降算法,图中5处解决了程序初期的冷启动问题;
图中5处解决程序刚开始运行时的冷启动问题:当第一次执行程序,u=0.9,v=0,t=1时:图中3处v=0.1g,若此时去更新梯度则实际步长是非常小的,更新较慢,在图中5处进行修正偏差,u=0.9,t=1此时修正后的v=g,从而解决了程序刚开始执行时梯度更新较慢的问题,随着t的增大,u的t次方趋近于0,从而修正偏差逐渐失去作用,不会对开始一段时间后的更新产生影响;r的更新同理。
t代表程序第t次执行;
一般情况下,u=0.9,ρ=0.999,这两个是经验值,可以直接用。
总结
动量法:采用累加梯度的思想,降低陡峭处w的变化幅度,增强平坦处w的变化幅度;
自适用梯度和RMSProp:自适应梯度算法的思想是减小陡峭处的步长,增大平坦处的步长,从而提高优化效率,但是存在问题(因为r一直在累加增大,当r太大时,就会对步长失去调节作用),为解决这个问题就出现了RMSProp算法,它通过给r设置衰减系数的方法,从而防止r的值不会变的很大。
ADAM:ADAM算法是动量法和自适用梯度算法的结合,又加入了修正偏差,解决了冷启动问题(程序刚开始执行时,梯度更新较慢)。
在一般情况下使用ADAM算法,但是它没有动量法+小批量梯度下降算法手动调优的效果好。ADAM算法在大部分任务下可以速度很快。
在实际使用过程中,有可能先用ADAM算法初始学习一下,学不动了用动量法+SGD手动调;也有可能先用动量法+SGD先学习一下,然后用ADAM做后面的加速。
8.权值初始化
全零初始化
全零初始化会使不同的神经元有相同的输出,不能进行正向传播和反向传播;
随机权值初始化
如采用较小的随机正态分布采样,通过双曲正切激活函数的图像可知,激活后几乎所有值趋近于0,在经过激活函数所有值就为0,在后面的隐层不能进行正向传播;
如采用较大的随机正态分布采样,通过双曲正切激活函数的图像可知,激活后几乎所有值趋近于1和-1,此时局部神经元梯度为0,不能进行反向传播;
Xavier初试化
(此处公式推导的原理还不明白)
N为输入的神经元个数;
HE初始化
权值初始化小结
9.批归一化
批归一化就是把输入先调整成0均值1方差的样子,然后再调整成与输入具有相同的分布。
批归一化在非线性激活之前。
γ和β是参数,是通过训练得到的;
经过减均值,除方差后,数据会集中在均值两侧,此时梯度较好,几乎不会出现为0的情况;
批归一化的作用是使数据集中在激活函数的中间位置,使梯度不会出现为0的情况;
10.欠拟合、过拟合与Dropout
过拟合
过拟合——是指学习时选择的模型所包含的参数过多,以至于出现这一模 型对已知数据预测的很好,但对未知数据预测得很差的现象。这种情况下 模型可能只是记住了训练集数据,而不是学习到了数据特征。
一般当出现在验证集上误差增大时即为训练最优状态。
调节模型大小
调节模型的宽度和深度;
正则化
L2正则损失对于大数值的权值向量进行严厉惩罚,鼓励更加分散的权重向量, 使模型倾向于使用所有输入特征做决策,此时的模型泛化性能好;
使分界面变得平滑,不那么复杂;
随机失活
随机失活鼓励权值分散,因为当某些较大的权值被失活时就可能造成神经网络的瘫痪。
解释三:Dropout可以看作模型的集成,因为随机失活,每个随机失活剩余的模型就不同(则可以看作多个模型的集成),可能会出现不同的分类结果,可以找到分类结果出现最多的那次(相当于投票)。
欠拟合
欠拟合——模型描述能力太弱,以至于不能很好地学习到数据中的规律。 产生欠拟合的原因通常是模型过于简单。
11.模型正则与超参数优化
神经网络中的超参数
网络结构——隐层神经元个数,网络层数,非线性单元选择等;
优化相关——学习率、dropout比率、正则项强度等;