0 写在前面

本文为了让初学者更加简单、直观地理解神经网络在训练中的技巧,以及明白为什么这样做能有效地提高训练效率,将神经网络中的本质过程一一阐述,弄清楚这些原理对初学者大有裨益。

本博客的内容绝大部分摘录于[日]斋藤康毅的《深度学习入门——基于Python的理论与实现》

1 输出层函数与损失函数的联系

神经网络在进行反向传播时,经过输出层函数得到预测输出与监督数据的差分yi−tiy_i - t_iyi​−ti​,其中yiy_iyi​表示预测数据,tit_iti​表示监督数据。神经网络的反向传播会把这个差分表示的误差传递给前面的层,这是神经网络学习中的重要性质。这样“漂亮”结果并不是偶然,实际上有如下的对应关系,使得反向传播能得到yi−tiy_i - t_iyi​−ti​的结果。

输出层激活函数 损失函数
Softmax 交叉熵
恒等函数(y=x) 平方和误差

还有其他激活函数与损失函数的对应关系都能通过数学解析或计算图推导得到。

2 参数的更新

  1. SGD:朝着当前所在位置的最大梯度前进,易陷入局部最优,梯度的方向可能并没有指向全局最优的方向。
  2. Momentum:引入超参数“阻力系数”,模拟小球在斜坡上滚动的物理过程。能克服SGD优化非均向(anisotropic)函数时低效。
  3. AdaGrad:学习率衰减的参数更新方法,Ada来源于Adaptive。希望随着学习的进行,学习率逐渐减小。AdaGrad会为参数的每个元素适当地调整学习率,参数中被大幅更新的元素的学习率会变小。
  4. Adam:融合了Momentum和AdaGrad的方法。除了学习速率又引入两个Momentum超参数。我认为参数的更新虽然得到了一定的优化,但是多引入了两个超参数,这使得人为因素的介入会极大地影响训练效果。

3 权重的初始值

权重的初始值必须多样化,避免设置为相同的值,这使得其拥有了对称性,导致在误差反向传播中所有的权重值都会进行相同的更新,从而使神经网络无法正常学习。为了防止“权重归一化”,必须随机生成初始值。

这里我们做一个简单的实验,观察权重初始值是如何影响隐藏层激活值的分布的。这个实验参考了Stanford的课程CS231n

使用标准差为1的高斯分布初始化权重,激活函数使用Sigmoid,观察五层神经网络的隐层输出。

各层的激活值偏向0-1分布,随着输出不断靠近0或1,它的导数值之间接近0。因此,偏向0和1的数据分布会造成反向传播中梯度的值不断变小,最后消失。这个问题称为 “梯度消失”,深度学习中梯度消失的问题可能会更加严重。

将标准差设置为0.01,进行相同的实验,得到下图各层的激活值分布。

因为不像刚才的例子偏向0和1,所以不会发生梯度消失的问题,但是及果汁的分布有所偏向,说明在表现力上会有很大问题即“表现力受限”。因为如果有多个神经元都输出几乎相同的值,那么它们就没有存在的意义了,因为一个神经元就能表达基本相同的事情。
综上,如果传递的是有所偏向的数据,就会出现梯度消失或者“表现力受限”的问题,导致学习可能无法顺利进行。 激活函数使用Sigmoid或tanh等S型曲线函数时,使用“Xavier初始值”,激活函数使用ReLU时,使用“He初始值”。这样可以使得各层的激活值呈现出具有相同广度的分布。


4 正则化

4.1 Batch Normlization

Batch Normalization(以下简称BN)的目的是为了使各层拥有适当地广度,而“强制性”地调整激活值的分布。 为此要在神经网络中插入对数据分布进行正规化的层,即BN层。具体来说就是学习时以mini-batch为单位进行数据均值为0、方差为1的正规化
优点如下:

  1. 可以使学习快速进行
  2. 不那么依赖权重初始值
  3. 有效抑制过拟合(降低DropOut等的必要性)

BN层插入到激活函数之前还是之后在文献[2-3]中已有讨论,我的理解是将此看作一个超参数,根据问题情况调整位置。

4.2 权值衰减

权值衰减也是一种防止过拟合的方法,通过为损失函数加上权重的L1、L2、L∞\infty∞范数,对学习过程中打的权重进行惩罚。其中L2范数最为常用,它会引入一个控制惩罚程度的超参数λ\lambdaλ。

4.3 DropOut

在训练过程中随机删除神经元,被删除的神经元不能进行信号的传递,这样相当于是每次都训练了一个不同的模型,最终得到这些模型的一个综合输出,即它们的平均值,通常来说精度可以提高好几个百分点。需要注意的是正向传播时删除的神经元不能在反向传播时参与计算,即反向传播时信号无法通过删除的神经元。

5 超参数

通俗来说就是包括所有需要人工设置的、具有强烈的主观的参数,如神经元数量、学习速率、batch大小等等。这类参数通常需要花费很大精力才能找到合适训练的,往往需要通过经验来设置,这也是为什么深度学习被称为“炼丹术”的主要原因。现将确定最优参数的步骤归纳如下:

  1. 设定超参数范围。给定一个大致的初始范围。
  2. 从设定的超参数范围中随机采样。
  3. 使用采样道得超参数值进行学习,通过验证数据评估识别精度。注意此步骤需要将eopch设置的很小,这样能极大缩短评估一次所需时间,节约计算资源。
  4. 重复步骤2和3(大约100次),根据它们的识别精度结果,缩小超参数的范围,最终能够得到较为满意的结果。

如果需要更精炼的方法,可以使用贝叶斯最优化(Bayesian optimization)。贝叶斯最优化运用以贝叶斯定理为中心的数学理论,能够更加严密、高效地进行最优化。详细内容请参考论文“Practical Bayesian Optimization of Machine Learning Algorithm”。

Reference

斋藤康毅. 《深度学习入门——基于python的理论与实现》[M]. 2016

Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.

Mishkin D, Matas J. All you need is a good init[J]. arXiv preprint arXiv:1511.06422, 2015.

神经网络的学习技巧(含损失函数与激活函数关系、初始值、优化函数、DropOut等等)相关推荐

  1. 深度学习——权重的初始值

    权重的初始值 ①权重的初始值十分重要,关系到神经网络的学习是否成功. 可以将权重初始值设置为0吗 为了抑制过拟合.提高泛化能力,采用权值衰减的方法,它是一种以减小权重参数的值为目的进行学习的方法. 在 ...

  2. 深度学习入门笔记(五):神经网络的学习

    专栏--深度学习入门笔记 推荐文章 深度学习入门笔记(一):机器学习基础 深度学习入门笔记(二):神经网络基础 深度学习入门笔记(三):感知机 深度学习入门笔记(四):神经网络 深度学习入门笔记(五) ...

  3. 神经网络的学习(训练):损失函数(均方误差、交叉熵误差)

    1 神经网络学习(训练)步骤: 初始化权值和偏置参数--1 从总训练集抽取一批数据--2 前向传播计算损失.反向传播由损失计算各参数的梯度--3 利用梯度更新参数--4 重复1.2.3 2 神经网络: ...

  4. 002-深度学习数学基础(神经网络、梯度下降、损失函数)

    002-深度学习数学基础(神经网络.梯度下降.损失函数) 这里在进入人工智能的讲解之前,你必须知道几个名词,其实也就是要简单了解一下人工智能的数学基础,不然就真的没办法往下讲了. 本节目录如下: 前言 ...

  5. 卷积神经网络 CNN 学习

    什么是神经网络 人工神经网络(artificial neural network,ANN),简称神经网络(neural network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型. ...

  6. 神经网络基础学习总结

    神经网络基础学习总结 一.基本认识 神经网络(nn),有建立在它之上的许多类型.卷积神经网络,循环神经网络等等,常用于视觉图像处理领域的是卷积神域网络(cnn). LeNet:是一种的用于处理手写数字 ...

  7. 神经网络损失函数特别大_二值神经网络(Binary Neural Networks)最新综述

    作者|秦浩桐.龚睿昊.张祥国 单位|北京航空航天大学 研究方向|网络量化压缩 本文介绍了来自北京航空航天大学刘祥龙副教授研究团队的最新综述文章 Binary Neural Networks: A Su ...

  8. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP

    原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron  python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...

  9. 第12课:优化神经网络——网络初始化技巧与超参数调试

    上一篇,我们主要介绍了神经网络中几种常见的梯度下降优化算法,包括 Mini-Batch.Momentum.Nesterov Momentum.AdaGrad.RMSprop.Adam.Learning ...

最新文章

  1. mysql查询数字比字符串快,与字符串相比,MySQL在where子句中使用数字更快吗?
  2. corosync/openais+pacemaker+drbd+web实现高可用群集
  3. S3C2440 WINCE6将USB DEVICE改成USB HOST,实现两个USB HOST
  4. qt int转换成qstring_Qt 加载cern-root库 并调用root类
  5. 程序员界年度人口普查:6成以上开发者日工作超9小时,且从不运动
  6. 为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname
  7. mysql实验视图及索引_MySQL视图及索引
  8. QQ影音播放.flv文件只有声音没有画面解决办法
  9. php验证手机号码 函数,PHP 匹配电话,手机,400号码 函数 及正则。很管用。
  10. Matlab画图和点标记
  11. 计算机代码画玫瑰,turtle画玫瑰花(示例代码)
  12. 高中信息技术python及答案_(完整)高中信息技术《Python语言》模块试卷
  13. CUDNN历史版本下载地址,可跳过登录下载cudnn
  14. Win10添加右键打开cmd和Powershell窗口(管理员/非管理员)
  15. 如何给图片降噪?图片噪点模糊变清晰的方法分享
  16. 数据库查询记录集转化为树状结构,数组转树状结构
  17. 大型企业局域网安全解决方案
  18. CRM销售系统价格 一套CRM销售系统多少钱
  19. 33、基于CACX和R7F0C004M的瑞萨单片机入门教程
  20. 华硕x45vd安装黑苹果Yosemite 10.10.3记录

热门文章

  1. MDK470A LIC/ERROR R206: NO REGISTRY ACCESS, ADMINISTRATION RIGHTS REQUIRED
  2. iOS应用中检测第三方app是否安装及跳转解决方案
  3. 推荐书籍《流畅的Python》
  4. 回头看看自己这半年走过的路-2012
  5. Matlab中exp函数的用法
  6. RAR Extractor - The Unarchiver Pro for mac(简单小巧的压缩软件)
  7. HTML5设定video视频为背景
  8. SAP系统 月结步骤
  9. 三星HDM Odyssey适配SteamVR
  10. android和java 通过UDP搜索同一局域网内指定网络设备