深度神经⽹络为何很难训练

简介: 深度神经⽹络为何很难训练

系列文章:


上一章提到了神经网络的一种普遍性,比如说不管目标函数是怎样的,神经网络总是能够对任何可能的输入得到一个近似的输出。


普遍性告诉我们神经⽹络能计算任何函数;而实际经验依据提⽰深度⽹络最能适⽤于学习能够解决许多现实世界问题的函数


而且理论上我们只要一个隐藏层就可以计算任何函数,第一章我们就用如下的网络结构完成了一个手写字识别的模型:

5.png

这时候,大家心中可能都会有这样一个想法,如果加大网络的深度,模型的识别准确率是否会提高?

6.png

随即我们会基于反向传播的随机梯度下降来训练神经网络,但实际上这会产生一些问题,因为我们的深度神经网络并没有比浅层网络好很多。那么此处就引出了一个问题,为什么深度神经网络相对训练困难?


仔细研究会发现:


  • 如果网络后面层学习状况好的时候,前面的层次经常会在训练时停滞不前

  • 反之情况也会发生,前面层训练良好,后面停滞不前

实际上,我们发现在深度神经⽹络中使⽤基于梯度下降的学习⽅法本⾝存在着内在不稳定性,这种不稳定性使得先前或者后⾯神经网络层的学习过程阻滞。


消失的梯度问题


我们在第一章识别手写字曾经以MNIST数字分类问题做过示例,接下来我们同样通过这个样例来看看我们的神经网络在训练过程中究竟哪里出了问题。


简单回顾一下,之前我们的训练样本路径为/pylab/datasets/mnist.pkl.gz,相关案例代码在pylab都可以找到(我稍做了改动以支持Python3)。

import mnist_loader
import network2
training_data, validation_data, test_data = mnist_loader.load_data_wrapper()
# 输入层 784
# 隐藏层 30
# 输出层 10
sizes = [784, 30, 10]
net = network2.Network(sizes=sizes)
# 随机梯度下降开始训练
net.SGD(
    training_data,
    30,
    10,
    0.1,
    lmbda=5.0,
    evaluation_data=validation_data,
    monitor_evaluation_accuracy=True,
)
"""
Epoch 0 training complete
Accuracy on evaluation data: 9280 / 10000
Epoch 1 training complete
Accuracy on evaluation data: 9391 / 10000
......
Epoch 28 training complete
Accuracy on evaluation data: 9626 / 10000
Epoch 29 training complete
Accuracy on evaluation data: 9647 / 1000
"""

最终我们得到了分类的准确率为 96.47%,如果加深网络的层数会不会提升准确率呢?我们分别尝试一下几种情况:

# 准确率 96.8%
net = network2.Network([784, 30, 30, 10])
# 准确率 96.42%
net = network2.Network([784, 30, 30, 30, 10])
# 准确率 96.28%
net = network2.Network([784, 30, 30, 30, 30, 10])

这说明一种情况,尽管我们加深神经网络的层数以让其学到更复杂的分类函数,但是并没有带来更好的分类表现(但也没有变得更差)。


那么为什么会造成这种情况,这是我们接下来需要思考的问题。可以考虑先假设额外的隐藏层的确能够在原理上起到作⽤,问题是我们的学习算法没有发现正确的权值和偏置。


下图(基于[784, 30, 30, 10]网络)表⽰了每个神经元权重和偏置在神经⽹络学习时的变化速率,图中的每个神经元有⼀个条形统计图,表⽰这个神经元在⽹络进⾏学习时改变的速度。更⼤的条意味着更快的速度,而小的条则表⽰变化缓慢。

7.png

可以发现,第⼆个隐藏层上的条基本上都要⽐第⼀个隐藏层上的条要⼤;所以,在第⼆个隐藏层的神经元将学习得更加快速。这并不是巧合,前⾯的层学习速度确实低于后⾯的层。


我们可以继续观察学习速度的变化,下方分别是2~4个隐藏层的学习速度变化图:

8.png9.png10.png

同样的情况出现了,前⾯的隐藏层的学习速度要低于后⾯的隐藏层。这⾥,第⼀层的学习速度和最后⼀层要差了两个数量级,也就是⽐第四层慢了 100 倍。


我们可以得出一个结果,在某些深度神经⽹络中,在我们隐藏层反向传播的时候梯度倾向于变小;这意味着在前⾯的隐藏层中的神经元学习速度要慢于后⾯的隐藏层,这个现象也被称作是消失的梯度问题


导致梯度消失的原因


核心原因在于深度神经网络中的梯度不稳定性,会造成前面层中梯度消失或者梯度爆炸


看下面这个既简单的深度神经网络,每⼀层都只有⼀ 个单⼀的神经元:

11.png

首先回顾几个计算公式:


  • 第个神经元的输出: 其中就是Sigmoid函数

让我们通过公式追踪一下的变化趋势:

以小见大一下,对于上述式子,可以做一下拆解:


故:

其实可以直观地看出上述表达式是一系列如的乘积,其中有sigmoid的导数,我们可以观察一下的函数图像():

12.png


绘图代码:

import matplotlib.pyplot as plt
import numpy as np
def sigmoid_d(x):
    y = 1 / (1 + np.exp(-x))
    return y * (1 - y)
x = np.arange(-4, 4, 0.1)
y = sigmoid_d(x)
plt.plot(x, y)
plt.show()

结合上述公式和函数图像,我们可以得出以下结论:


  1. 由于权重一般是基于均值为0方差为1的高斯分布,所以任何权重总是处于

再结合上面的表达式,当层数越多,乘积项就会越多,就会导致更小,于是就导致了梯度消失。


Sigmoid作为激活函数情况下,由于梯度反向传播中的连乘效应,导致了梯度消失


反之,梯度爆炸的问题就是神经网络前面层比后面层梯度变化快,从而引起了梯度爆炸的问题,比如较大导致了,再结合上面提到的连乘效应,就自然地梯度爆炸了。


在更加复杂⽹络中的不稳定梯度


当我们从简单的神经网络上发现了随着网络层次的加深,会造成网络权值更新不稳定的情况后,也很明确地观察到了梯度消失问题。继续扩展一下,对于那些每层包含很多神经元的更加复杂的网络来说会是怎样的情况呢?

13.png

对于第层的梯度:

根据连乘效应,会导致出现不稳定的梯度,和前面例子一样,会导致前面层的梯度指数级地消失。


其它深度学习的障碍


前面三节主要介绍了一大障碍:不稳定梯度(梯度消失或者梯度爆炸),实际上,不稳定梯度仅仅是深度学习的众多障碍之⼀。


下面会据一些关于什么让训练深度⽹络⾮常困难相关主题的例子,这是个相当复杂的问题:


  • 在 2010 年Glorot && Bengio发现证据表明 sigmoid 函数的选择会导致训练⽹络的 问题。特别地,他们发现sigmoid函数会导致最终层上的激活函数在训练中会聚集在 0,这也导 致了学习的缓慢。他们的⼯作中提出了⼀些取代sigmoid函数的激活函数选择,使得不会被这种聚集性影响性能。

  • 在 2013 年Sutskever, Martens, Dahl 和 Hinton研究了深度学习使⽤随机权重初始化和基于momentumSGD⽅法。两种情形下,好的选择可以获得较⼤的差异的训练效果。

论文地址:


  • Understanding the difficulty of training deep feedforward neural networks

  • 解读——01

  • 解读——02

  • 论文解读:

  • 论文翻译:这里

  • On the importance of initialization and momentum in deep learning
相关文章
|
12天前
|
机器学习/深度学习 计算机视觉 网络架构
为什么卷积现在不火了:CNN研究热度降温的深层原因分析
纵观近年的顶会论文和研究热点,我们不得不承认一个现实:CNN相关的研究论文正在减少,曾经的"主角"似乎正逐渐淡出研究者的视野。
45 11
为什么卷积现在不火了:CNN研究热度降温的深层原因分析
|
3月前
|
机器学习/深度学习 存储 自然语言处理
|
3月前
|
机器学习/深度学习 存储 算法
【类脑计算】突触可塑性模型之Hebbian学习规则和STDP
本文介绍了突触可塑性中的Hebbian学习规则和STDP(Spike-Timing Dependent Plasticity),两种基于神经元活动调节突触强度的机制,其中Hebbian规则强调同时活动的神经元间的连接增强,而STDP则考虑了脉冲时间差异对突触强度的调节作用。
113 2
|
4月前
|
机器学习/深度学习 搜索推荐 知识图谱
图神经网络加持,突破传统推荐系统局限!北大港大联合提出SelfGNN:有效降低信息过载与数据噪声影响
【7月更文挑战第22天】北大港大联手打造SelfGNN,一种结合图神经网络与自监督学习的推荐系统,专攻信息过载及数据噪声难题。SelfGNN通过短期图捕获实时用户兴趣,利用自增强学习提升模型鲁棒性,实现多时间尺度动态行为建模,大幅优化推荐准确度与时效性。经四大真实数据集测试,SelfGNN在准确性和抗噪能力上超越现有模型。尽管如此,高计算复杂度及对图构建质量的依赖仍是待克服挑战。[详细论文](https://arxiv.org/abs/2405.20878)。
80 5
|
机器学习/深度学习 算法 数据可视化
神经⽹络可以计算任何函数的可视化证明
神经⽹络可以计算任何函数的可视化证明
|
自然语言处理 算法 计算机视觉
陈丹琦组掩蔽语言模型研究引争议:15%掩蔽率不是最佳,但40%站得住脚吗?
陈丹琦组掩蔽语言模型研究引争议:15%掩蔽率不是最佳,但40%站得住脚吗?
113 0
|
机器学习/深度学习 算法
基于小波神经网络的短期网络流量数据预测
基于小波神经网络的短期网络流量数据预测
122 0
|
机器学习/深度学习 编解码 算法
简答:如何设计一个深度学习网络来实现帧内预测?
简答:如何设计一个深度学习网络来实现帧内预测?
247 0
简答:如何设计一个深度学习网络来实现帧内预测?
|
机器学习/深度学习 算法 数据挖掘
自适应共振理论网络-1|学习笔记
快速学习自适应共振理论网络-1
自适应共振理论网络-1|学习笔记
|
机器学习/深度学习 存储 算法
自适应共振理论网络-2 | 学习笔记
快速学习自适应共振理论网络-2 。
自适应共振理论网络-2 | 学习笔记
下一篇
无影云桌面