深度学习之循环神经网络(6)梯度弥散和梯度爆炸

 循环神经网络的训练并不稳定,网络的善妒也不能任意加深。那么,为什么循环神经网络会出现训练困难的问题呢?简单回顾梯度推导中的关键表达式:
∂ht∂hi=∏j=1t−1diag(σ′(Wxhxj+1+Whhhj+b))Whh\frac{∂\boldsymbol h_t}{∂\boldsymbol h_i}=\prod_{j=1}^{t-1}diag(σ'(\boldsymbol W_{xh} \boldsymbol x_{j+1}+\boldsymbol W_{hh} \boldsymbol h_j+\boldsymbol b))\boldsymbol W_{hh}∂hi​∂ht​​=j=1∏t−1​diag(σ′(Wxh​xj+1​+Whh​hj​+b))Whh​
也就是说,从时间戳iii到时间戳ttt的梯度∂ht∂hi\frac{∂\boldsymbol h_t}{∂\boldsymbol h_i}∂hi​∂ht​​包含了Whh\boldsymbol W_{hh}Whh​的连乘运算。当Whh\boldsymbol W_{hh}Whh​的最大特征值(Largest Eignvalue)小于1时,多次连乘运算会使得∂ht∂hi\frac{∂\boldsymbol h_t}{∂\boldsymbol h_i}∂hi​∂ht​​的元素值接近于0;当Whh\boldsymbol W_{hh}Whh​的最大特征值大于1时,多次连乘运算会使得∂ht∂hi\frac{∂\boldsymbol h_t}{∂\boldsymbol h_i}∂hi​∂ht​​的元素值爆炸式增长。

 我们可以从下面的两个例子直观地感受一下梯度弥散和梯度爆炸现象的产生,代码如下:

import tensorflow as tfW = tf.ones([2, 2])  # 任意创建某矩阵
eigenvalues = tf.linalg.eigh(W)[0]  # 计算矩阵的特征值
print(eigenvalues)

运行结果如下所示:

tf.Tensor([0.        1.9999999], shape=(2,), dtype=float32)

可以看到,全1矩阵的最大特征值为2。计算W\boldsymbol WW矩阵的W1∼W10\boldsymbol W^1\sim \boldsymbol W^{10}W1∼W10运算结果,并绘制为次方与矩阵的L2-范数的曲线图:

val = [W]
for i in range(10):  # 矩阵相乘n次方val.append([val[-1]@W])
# 计算L2范数
norm = list(map(lambda x: tf.norm(x).numpy(), val))
print(norm)
plt.plot(range(1, 12), norm)
plt.xlabel('n times')
plt.ylabel('L2-norm')
plt.savefig('w_n_times_1.svg')
plt.show()

运行结果如下:

[2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 2048.0]

最大特征值大于1时的矩阵相乘

可以看到,当W\boldsymbol WW矩阵的最大特征值大于1时,矩阵多次相乘会使得结果越来越大。

 考虑最大特征值小于1的情况。例如:

import tensorflow as tfW = tf.ones([2, 2])*0.4  # 任意创建某矩阵
eigenvalues = tf.linalg.eigh(W)[0]  # 计算矩阵的特征值
print(eigenvalues)

运行结果如下所示:

tf.Tensor([0.         0.79999995], shape=(2,), dtype=float32)

可以看到此时的W\boldsymbol WW矩阵最大特征值是0.8。同样的方法,考虑W\boldsymbol WW矩阵的多次相乘运算结果,代码如下:

val = [W]
for i in range(10):  # 矩阵相乘n次方val.append([val[-1]@W])
# 计算L2范数
norm = list(map(lambda x: tf.norm(x).numpy(), val))
print(norm)
plt.plot(range(1, 12), norm)
plt.xlabel('n times')
plt.ylabel('L2-norm')
plt.savefig('w_n_times_0.svg')
plt.show()

运行结果如下所示:

[0.8, 0.64000005, 0.512, 0.40960002, 0.32768002, 0.26214403, 0.20971523, 0.16777219, 0.13421775, 0.107374206, 0.08589937]

最大特征值小于1时的矩阵相乘

它的L2-范数曲线如上图所示。可以看到,当W\boldsymbol WW矩阵的最大特征值小于1时,矩阵多次相乘会使得结果越来越小,接近于0。

注:特征值的作用和意义体现在用矩阵进行列向量的高次变换也就是矩阵的高次方乘以列向量的计算中。数学中的很多变换可以用矩阵的乘法来表示,在这样的变换中,一个列向量(点)ααα变成另一个列向量(点)βββ的过程可以看成是一个矩阵A\boldsymbol AA乘以ααα得到βββ,即Aα=β\boldsymbol Aα=βAα=β,如果把同样的变换连续的重复的做nnn次则需要用矩阵高次方来计算:An⋅α\boldsymbol A^n\cdotαAn⋅α,如果没有特征值和特征向量,此处就要计算矩阵A\boldsymbol AA的nnn次方,这个运算量随着nnn的增加,变得越来越大,很不方便。而利用特征值和特征向量,可以达到简化计算的目的。
参考:什么是最大特征值

 我们把梯度值接近于0的现象叫做梯度弥散(Gradient Vanishing),把梯度值远大于1的现象叫做梯度爆炸(Gradient Exploding)。梯度弥散和梯度爆炸是神经网络优化过程中间比较容易出现的两种情况,也是不利于网络训练的。那么梯度弥散和梯度爆炸具体表现在哪些地方呢?

 考虑梯度下降算法:
θ′=θ−η∇θLθ'=θ-η∇_θ \mathcal Lθ′=θ−η∇θ​L
当出现梯度弥散时,∇θL≈0∇_θ \mathcal L≈0∇θ​L≈0,此时θ′≈θθ'≈θθ′≈θ,也就是说每次梯度更新后参数基本保持不变,神经网络的参数长时间得不到更新,具体表现为L\mathcal LL几乎保持不变,其他评测指标,如准确度,也保持不变。当出现梯度爆炸时,∇θL≫1∇_θ \mathcal L≫1∇θ​L≫1,此时梯度的更新步长η∇θLη∇_θ\mathcal Lη∇θ​L非常大,使得更新后的θ′θ'θ′与θθθ差距很大,网络L出现突变现象,甚至可能出现来回震荡、不收敛的现象。

 通过推导循环神经网络的梯度传播公式,我们发现循环神经网络很容易出现梯度弥散和梯度爆炸的现象。那么怎么解决这两个问题呢?——梯度裁剪

深度学习之循环神经网络(6)梯度弥散和梯度爆炸相关推荐

  1. 深度学习之循环神经网络(7)梯度裁剪

    深度学习之循环神经网络(7)梯度裁剪 1. 张量限幅 2. 限制范数 3. 全局范数裁剪 梯度弥散  梯度爆炸可以通过 梯度裁剪(Gradient Clipping)的方式在一定程度上的解决.梯度裁剪 ...

  2. 深度学习之循环神经网络(3)梯度传播

    深度学习之循环神经网络(3)梯度传播  通过循环神经网络的更新表达式可以看出输出对张量Wxh\boldsymbol W_{xh}Wxh​.Whh\boldsymbol W_{hh}Whh​和偏置b\b ...

  3. 深度学习之循环神经网络(10)GRU简介

    深度学习之循环神经网络(10)GRU简介 1. 复位门 2. 更新门 3. GRU使用方法  LSTM具有更长的记忆能力,在大部分序列任务上面都取得了比基础RNN模型更好的性能表现,更重要的是,LST ...

  4. 深度学习之循环神经网络(4)RNN层使用方法

    深度学习之循环神经网络(4)RNN层使用方法 1. SimpleRNNCell 2. 多层SimpleRNNCell网络 3. SimpleRNN层  在介绍完循环神经网络的算法原理之后,我们来学习如 ...

  5. 深度学习之循环神经网络(12)预训练的词向量

    深度学习之循环神经网络(12)预训练的词向量  在情感分类任务时,Embedding层是从零开始训练的.实际上,对于文本处理任务来说,领域知识大部分是共享的,因此我们能够利用在其它任务上训练好的词向量 ...

  6. 深度学习之循环神经网络(1)序列表示方法

    深度学习之循环神经网络(1)序列表示方法 序列表示方法 Embedding层 2. 预训练的词向量 前面的卷积神经网络利用数据的局部相关性和权值共享的思想大大减少了网络的参数量,非常适合于图片这种具有 ...

  7. 水很深的深度学习-Task05循环神经网络RNN

    循环神经网络 Recurrent Neural Network 参考资料: Unusual-Deep-Learning 零基础入门深度学习(5) - 循环神经网络 史上最小白之RNN详解_Tink19 ...

  8. 【深度学习】循环神经网络(RNN)的tensorflow实现

    [深度学习]循环神经网络(RNN)的tensorflow实现 一.循环神经网络原理 1.1.RNN的网络结构 1.2.RNN的特点 1.3.RNN的训练 二.循环神经网络的tensorflow实现 参 ...

  9. 深度学习原理-----循环神经网络(RNN、LSTM)

    系列文章目录 深度学习原理-----线性回归+梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网 ...

最新文章

  1. 5.7 随机采样最小二乘法
  2. QZEZ第一届“饭吉圆”杯程序设计竞赛
  3. ie手机浏览器_Flash之后是不是该IE浏览器了
  4. 如何利用BI搭建电商数据分析平台
  5. CVPR2021 Oral|开放世界中的目标检测
  6. Xml序列化和反序列化对象-使用MemoryStream-实践
  7. MBR磁盘分区见解笔记
  8. 1400协议是什么和28181区别_支持对接GB28181吗?监控,智能摄像头,国标推流,RTSP...
  9. latex写姓名_LaTeX:拥有(中文)姓名
  10. 安卓UI相关开源项目库汇总
  11. 详细的组态王软件与200 Smart PLC网口通信教程
  12. 嵌入式面试经典30问
  13. 88E1111 100BASE-T百兆工程(part1)
  14. Android中HorizontalScrollView的使用总结
  15. 信息安全精彩视频分享-一张纸入侵企业号星舰
  16. 网上书店黑盒测试_网上书店管理系统
  17. 1631 小鲨鱼在51nod小学
  18. Flutter 自定义控件-仿照安卓和抖音图标绘制
  19. 【算法】10亿int型数,统计只出现一次的数
  20. spring-Cloud-netflix-快速入门(三)-服务间调用

热门文章

  1. android获取屏幕的分辨率方法
  2. Android开发之在Fragment和Activity页面拍照需要注意的地方
  3. 高中计算机计划,高中信息技术教学计划
  4. Oracle一定有sqlplus吗,oracle sqlplus执行sql文件
  5. 【CentOS 7笔记4】,两种修改密码方式#
  6. Oracle 11gR2 RAC Service-Side TAF 配置示例
  7. BZOJ3527:[ZJOI2014]力(FFT)
  8. 004-hadoop家族概述
  9. Java异常处理-----java异常体系
  10. Mongoose Schemas定义中timestamps选项的妙用