计算机视觉与深度学习系列博客传送门
【计算机视觉与深度学习】线性分类器(一)
【计算机视觉与深度学习】线性分类器(二)
【计算机视觉与深度学习】全连接神经网络(一)

目录

  • 激活函数再探讨
  • 梯度下降算法的改进
    • 梯度下降算法存在的问题
    • 动量法
    • 自适应梯度法,AdaGrad算法与RMSProp算法
    • Adam算法
  • 权值初始化
    • 全零初始化
    • 随机权值初始化
    • Xavier初始化
    • HE初始化 (MSRA)
    • 总结

激活函数再探讨

首先我们来看Sigmoid函数σ(x)=11+e−x\sigma(x)=\frac{1}{1+e^{-x}}σ(x)=1+e−x1​对其求导σ′(x)=σ(x)(1−σ(x))\sigma '(x)=\sigma(x)(1-\sigma(x))σ′(x)=σ(x)(1−σ(x))

当输入值大于10或小于-10的时候,Sigmoid函数的局部梯度都接近0,这是非常不利于网络的梯度流传递的。这就是梯度消失问题,本质上,梯度消失是链式法则的乘法特性导致的。
与之相对应的是梯度爆炸。梯度爆炸也是链式法则的乘法特性导致的,函数“断崖处”的梯度乘上学习率后会是一个非常大的值,从而在更新参数时“飞”出了合理区域,最终会导致算法不收敛。

解决梯度爆炸的一个方案是使用梯度裁剪,把沿梯度方向前进的步长限制在某个值内就可以避免在更新参数时“飞”出合理区域。
我们再看双曲正切函数tanh⁡(x)=sin⁡hxcos⁡hx=ex−e−xex+e−x\tanh(x)=\frac{\sin hx}{\cos hx}=\frac{e^x-e^{-x}}{e^x+e^{-x}}tanh(x)=coshxsinhx​=ex+e−xex−e−x​对其求导tanh⁡′(x)=1−tanh⁡2(x)\tanh'(x)=1-\tanh^2(x)tanh′(x)=1−tanh2(x)

与Sigmoid函数类似,tanh函数的局部梯度特性不利于网络梯度流的反向传递。
接下来是ReLU函数ReLU(x)=max⁡(0,x)ReLU(x)=\max(0,x)ReLU(x)=max(0,x)

当输入大于0时,局部梯度永远不会为0,这比较有利于梯度流的传递。但ReLU函数仍有一些不完美,当输入小于等于0时(当输入为0时函数没有导数,一般规定0处的导数值为0),其导数值为0,因此提出了LeakyReLU函数LeakyReLU(x)=max⁡(αx,x)LeakyReLU(x)=\max(\alpha x,x)LeakyReLU(x)=max(αx,x)

LeakyReLU函数基本没有“死区”,即梯度永远不会为0。之所以说“基本”,是因为函数在0处没有导数,前向计算中输入为0的概率非常小,几乎没有可能,所以函数在0处没有导数对于计算而言没有影响。
对于激活函数的选择,我们应当尽可能地选择ReLU函数或LeakyReLU函数,相比于Sigmoid函数和tanh函数,ReLU函数和LeakyReLU函数会让梯度流的传递更加顺畅,训练过程收敛得更快,也能更有效地防止梯度消失。

梯度下降算法的改进

梯度下降算法存在的问题

在全连接神经网络中,损失函数有一个特性,就是在一个方向上变化迅速,而在另一个方向上变化缓慢。当我们想要优化参数使得损失值更小的时候,若使用梯度下降法,损失值就会在“山壁”间震荡,而往“山谷”底端行进的速度较慢。若我们发现模型收敛速度过慢,只是简单地增大学习率(即步长)是不能加快收敛速度的。

动量法

改进梯度下降算法存在的问题,一个最简单的想法就是减少“山壁”间的震荡,加快前往“谷底”的速度,因此我们可以利用累加历史梯度信息来更新梯度,这就是动量法。
在小批量梯度下降算法上进行改进。在迭代前设置动量系数μ\muμ,初始化速度v=0v=0v=0。此前的迭代过程中,更新权值是令θ:=θ−αg\theta:=\theta-\alpha gθ:=θ−αg其中α\alphaα为学习率,ggg为计算出的梯度。使用动量法,每次迭代过程中,令速度更新为v:=μv+gv:=\mu v+gv:=μv+g再利用更新的速度更新权值θ:=θ−αv\theta:=\theta -\alpha vθ:=θ−αv
对于动量系数μ\muμ,其取值范围为[0,1)[0,1)[0,1),当μ=0\mu=0μ=0时,动量法等价于梯度下降算法。一般我们设置μ=0.9\mu=0.9μ=0.9。
使用动量法的好处在于,历史梯度信息累加过程中,震荡方向相互抵消,而前往“谷底”的方向得到加强,进而加快了模型的收敛速度。
动量法还能解决一些常见现象带来的问题,例如损失函数常具有不太好的局部最小点或鞍点(高维空间非常常见),在这些点的位置上,梯度为0,若使用梯度下降算法更新参数会认为模型已经收敛,参数不会再更新。如果使用动量法,由于动量的存在,算法可以冲出局部最小点和鞍点,进而找到更优解。

自适应梯度法,AdaGrad算法与RMSProp算法

自适应梯度法与动量法的思路不同。梯度幅度平方较大的方向是震荡方向,梯度幅度平方较小的方向是平坦方向。自适应梯度法通过减小震荡方向步长、增大平坦方向步长的方法来减小震荡,加速通往“谷底”。
AdaGrad算法是一种自适应梯度算法,下面在小批量梯度下降算法上进行改进实现AdaGrad算法。
在迭代前设置小常数δ\deltaδ(用于被小数除时的数值稳定,一般设置为10−510^{-5}10−5),初始化累积变量r=0r=0r=0。在迭代过程中,计算出梯度ggg,累计平方梯度r:=r+g2r:=r+g^2r:=r+g2再利用累积平方梯度更新权值w:=w−αr+δgw:=w-\frac{\alpha}{\sqrt r+\delta}gw:=w−r​+δα​g其中α\alphaα为学习率。由于震荡方向的累积平方梯度较大,将其开根号后作为分母,计算得出的值就会是一个比较小的值。同理,平坦方向计算得出的值是一个比较大的值。这样就加快了模型收敛速度。
但是,AdaGrad算法也存在不足,随着累积时间的变长,累积变量rrr将会是一个非常大的值,此时更新参数的步长就会变得非常小,从而失去了调节作用。为了解决这一问题,RMSProp算法被提出。
RMSProp算法也是一种自适应梯度算法。在迭代前设置衰减速率ρ\rhoρ,小常数δ\deltaδ(一般设置为10−510^{-5}10−5),初始化累积变量r=0r=0r=0。与AdaGrad算法不同,RMSProp算法在迭代过程中累积平方梯度r:=ρr+(1−ρ)g2r:=\rho r+(1-\rho)g^2r:=ρr+(1−ρ)g2再利用累积平方梯度更新权值w:=w−αr+δgw:=w-\frac{\alpha}{\sqrt r+\delta}gw:=w−r​+δα​g其中α\alphaα为学习率。衰减速率ρ\rhoρ的取值范围为[0,1)[0,1)[0,1),它削弱了历史梯度信息,一般设置ρ=0.999\rho=0.999ρ=0.999。

Adam算法

Adam算法是动量法和自适应梯度法的思想结合而成的产物。在迭代前设置衰减速率ρ\rhoρ(一般设置为0.9990.9990.999),动量系数μ\muμ(一般设置为0.90.90.9),小常数δ\deltaδ(一般设置为10−510^{-5}10−5),初始化累积变量r=0,v=0r=0,v=0r=0,v=0。在迭代过程中,计算梯度ggg,累积梯度v:=μv+(1−μ)gv:=\mu v+(1-\mu)gv:=μv+(1−μ)g累积平方梯度r:=ρr+(1−ρ)g2r:=\rho r+(1-\rho)g^2r:=ρr+(1−ρ)g2修正偏差v~=v1−μt\widetilde{v}=\frac{v}{1-\mu^{t}}v=1−μtv​ r~=r1−ρt\widetilde{r}=\frac{r}{1-\rho^t}r=1−ρtr​更新权值θ:=θ−αr~+δv~\theta :=\theta-\frac{\alpha}{\sqrt{\widetilde{r}}+\delta}\widetilde{v}θ:=θ−r​+δα​v修正偏差步骤可以极大缓解算法初期的冷启动问题。算法初期,计算出的梯度ggg比较小,如果不进行修正会减慢算法的收敛速度。

权值初始化

全零初始化

使用全零初始化,网络中不同的神经元有相同的输出,进行同样的参数更新,因此,这些神经元学习的参数都一样,本质上等价于一个神经元。

随机权值初始化

使用包含10个隐藏层(每个隐藏层包含500个神经元)和1个输出层的网络进行实验,使用双曲正切激活函数,权值分别采样自N(0,0.01)\mathcal N(0,0.01)N(0,0.01)和N(0,1)\mathcal N(0,1)N(0,1)的高斯分布,实验结果如下图所示。


实验表明,使用随机权值初始化并不能保证网络能够正常地被训练。

Xavier初始化

我们希望网络各层的激活值和局部梯度的方差在传播过程中尽量保持一致,以保证网络中正向和反向的数据流动。
一个神经元,其输入为z1,z2,...,zNz_1,z_2,...,z_Nz1​,z2​,...,zN​,这NNN个输入是独立同分布的;其权值为w1,w2,...,wNw_1,w_2,...,w_Nw1​,w2​,...,wN​,它们也是独立同分布的;w\bm ww和z\bm zz是独立的,其激活函数为fff,则输出y\bm yy的表达式为y=f(w1z1+w2z2+...+wNzN)\bm y=f(\bm w_1 \bm z_1+\bm w_2 \bm z_2+...+\bm w_N \bm z_N)y=f(w1​z1​+w2​z2​+...+wN​zN​)这就是Xavier初始化。
Xavier初始化的目标是使网络各层的激活值和局部梯度的方差在传播过程中尽量保持一致,即寻找w\bm ww的分布使得输出yyy与输入z\bm zz的方差一致。假设fff为双曲正切函数,w1,w2,...,wNw_1,w_2,...,w_Nw1​,w2​,...,wN​独立同分布,z1,z2,...,zNz_1,z_2,...,z_Nz1​,z2​,...,zN​独立同分布,w\bm ww和z\bm zz独立且均值都为000,则有
Var(y)=Var(∑i=1Nwizi)=∑i=1NVar(wizi)=∑i=1N[E(wi)]2Var(zi)+[E(zi)]2Var(wi)+Var(wi)Var(zi)=∑i=1NVar(wi)Var(zi)=nVar(wi)Var(zi)\begin{aligned} Var(\bm y)&=Var(\sum_{i=1}^{N}w_iz_i) \\ &=\sum_{i=1}^{N}Var(w_iz_i) \\ &=\sum_{i=1}^{N}[E(w_i)]^2Var(z_i)+[E(z_i)]^2Var(w_i)+Var(w_i)Var(z_i) \\ &=\sum_{i=1}^{N}Var(w_i)Var(z_i) \\ &=nVar(w_i)Var(z_i) \end{aligned}Var(y)​=Var(i=1∑N​wi​zi​)=i=1∑N​Var(wi​zi​)=i=1∑N​[E(wi​)]2Var(zi​)+[E(zi​)]2Var(wi​)+Var(wi​)Var(zi​)=i=1∑N​Var(wi​)Var(zi​)=nVar(wi​)Var(zi​)​
Var(w)=1NVar(\bm w)=\frac{1}{N}Var(w)=N1​时,y\bm yy的方差与z\bm zz的方差一致。
使用包含10个隐藏层(每个隐藏层包含500个神经元)和1个输出层的网络进行实验,使用双曲正切激活函数,权值采样自N(0,1/N)\mathcal N(0,1/N)N(0,1/N)的高斯分布,其中NNN为输入,得到下面的实验结果。

改变激活函数为ReLU函数,得到下面的实验结果。

根据实验结果可知,Xavier初始化方法不太适合ReLU激活函数。

HE初始化 (MSRA)

HE初始化与Xavier初始化的不同在于权值采样自N(0,2/N)\mathcal N(0,2/N)N(0,2/N)的高斯分布,其中NNN为输入。使用包含10个隐藏层(每个隐藏层包含500个神经元)和1个输出层的网络进行实验,使用ReLU激活函数进行实验,结果如下。

总结

好的初始化方法可以防止前向传播过程中的信息消失,也可以解决反向传播过程中的梯度消失。当激活函数选择Sigmoid函数或tanh函数时,建议使用Xavier初始化方法;当激活函数选择ReLU函数或LeakyReLU函数时,建议使用HE初始化方法。

【计算机视觉与深度学习】全连接神经网络(二)相关推荐

  1. 计算机视觉与深度学习-全连接神经网络

    以下内容是自己学习北京邮电大学鲁鹏副教授计算机视觉与深度学习课程(A02)的一些笔记, 笔者能力有限,如有错误还望各位大佬在评论区批评指正 . 先贴一下课程官网:CV-XUEBA 篇3地址:计算机视觉 ...

  2. 深度学习——全连接层(Fully connected dence layers)原理解析

    深度学习--全连接层(Fully connected dence layers)原理解析 一.简介 全连接层有多个神经元,是一个列向量(单个样本).在计算机视觉领域正常用于深度神经网络的后面几层,用于 ...

  3. 计算机视觉(四)全连接神经网络MLP

    目录 多层感知器/全连接神经网络 一.全连接神经网络绘制 二.激活函数 常用的激活函数 三.网络结构设计 四.损失函数 softmax 交叉熵损失 对比多类支持向量机损失 五.优化算法 计算图与反向传 ...

  4. 深度学习中基本神经网络(二)

    深度学习中的循环神经网络 1. 循环神经网络的引入与简介 1.1 延时神经网络 1.2 同步学习模式和异步学习模式 2. 梯度训练BPTT算法与RTRL算法 2.1 BPTT算法 2.2 RTRL算法 ...

  5. 计算机视觉与深度学习 | 基于DNN神经网络实现人的年龄及性别预测(代码类)

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 最近一段时间,大论文完稿了,可以搞 ...

  6. 几种主要的神经网络----全连接神经网络、前馈神经网络、卷积神经网络、循环神经网络

    几种主要的神经网络 一.全连接神经网络 二.前馈神经网络(Feedforward neural network,FNN) 三.卷积神经网络(Convolutional Neural Network,C ...

  7. 全连接神经网络(DNN)

    最近想要学习深度学习模型,没有一上来就先学习CNN.RNN.LSTM,而是先学习全连接神经网络(Fully Connected Neural Network),原因非常简单,上述所说的各种神经网络都是 ...

  8. 【计算机视觉与深度学习】全连接神经网络(一)

    计算机视觉与深度学习系列博客传送门 [计算机视觉与深度学习]线性分类器(一) [计算机视觉与深度学习]线性分类器(二) 目录 从线性分类器到全连接神经网络 全连接神经网络的权值 全连接神经网络与线性不 ...

  9. 【简易笔记】计算机视觉与深度学习(全连接神经网络、卷积) EP2

    本篇承接上文:计算机视觉与深度学习 EP1 本篇主要内容: 全连接神经网络(P4 - P6) 卷积与卷积神经网络(P7 - P8) 经典网络分析(P9 - P10) 可视化(P12 - P13) 主要 ...

最新文章

  1. 内存分配与数据格式化(malloc与new)
  2. c语言中英文的作用,C语言中英文对照.doc
  3. 2016陕西省省赛 ACM Rui and her functions B 二分
  4. 关于AI你可能不知道的5件事情
  5. 简述linux常见的安全措施,六个常用的Linux安全基本措施
  6. Codewars-The wheat/rice and chessboard problem(棋盘放谷粒)
  7. 登录与注册 艺术与业务 的结合
  8. 第二章 html标记语言,第二章-认识HTML标签
  9. php后台登陆页面代码
  10. java web 的map_javaweb开发过程中小工具系列之将Map转换成对象
  11. 期待已久的Java 9 今日正式发布,新特性解读
  12. 数字三角形问题Java
  13. VS C++ memcpy() 用于double、int、结构体
  14. Dreamweaver文字或图片如何添加空链接代码
  15. 基于操作系统编程与裸机编程的区别
  16. SOUI自定义控件(4)
  17. 应对个人信息保护法律合规,妥善管理个人隐私数据
  18. 60 集合的交集、并集和差集运算
  19. ips细胞治疗糖尿病研究进展综述
  20. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

热门文章

  1. python123《python语言程序设计》程序设计题第一周第二周第三周第四周第五周
  2. 报错:ImportError: Cannot load backend ‘TkAgg‘ which requires the ‘tk‘ interactive
  3. keep 虚拟路线修改器_二次元出圈搞综艺,杨颖、虞书欣、小鬼打造二次元虚拟偶像...
  4. php 微擎钻石投票二开,[模块插件]微擎钻石投票男神女神公众号投票系统完美运营版其他-(微信)小程序...
  5. ESP32系列--第九篇 ADC的使用
  6. 上海房价和东京房价比较
  7. MySql索引优化及Explain工具使用
  8. 关于面试中的TCP和UDP怎么用自己的话给面试官说
  9. c语言教程在线阅读,《C语言基础教程》.doc
  10. ICON结构解析(订正版)