动手学深度学习v2笔记-Day6

动手学深度学习v2

Day 6


0x00 数值稳定性

一个d层的神经网络,计算其梯度(复合函数求导)
∂ l ∂ w t = ∂ l ∂ h d ∂ h d ∂ h d − 1 . . . ∂ h t + 1 ∂ h t ∂ h t ∂ w t \frac {\partial l} {\partial w^t} = \frac {\partial l} {\partial h^d} \frac {\partial h^d} {\partial h^{d-1}} ...\frac {\partial h^{t+1}} {\partial h^t}\frac {\partial h^t} {\partial w^t} wtl=hdlhd1hd...htht+1wtht
那么中间有 d − t d-t dt次的矩阵乘法,即:
∏ i = t d − 1 ∂ h i + 1 ∂ h i \prod_{i=t}^{d-1}\frac {\partial h^{i+1}} {\partial h^i} i=td1hihi+1
这导致了神经网络的两个问题如下:

  • 梯度爆炸
    如果每一次的导数为1.5 次数100次,那么连乘之后的结果有 4 ∗ 1 0 17 4*10^{17} 41017
    这个数值非常巨大,可能导致值超出值域(16位浮点数尤其严重)
    对学习率敏感,学习率过大导致参数值更大导致梯度更大,学习率太小导致训练没什么进展(意思就是调学习率很困难)
  • 梯度消失
    如果每一次的导数为0.8 次数100次,那么连乘之后的结果有 2 ∗ 1 0 − 10 2*10^{-10} 21010
    这个梯度就基本可以忽略了,基本为0,训练不会有进展了(对16位浮点数尤为严重)
    对于底部层尤为严重,神经网络无法变得更深,只有顶部可以正常训练

0x01 模型初始化

目标:让梯度值在合理的范围内

  • 乘法变加法
  • 梯度归一化
  • 梯度裁剪(强制去掉范围外的数值,类似四舍五入)
  • 合理的权重初始化和激活函数

1.让每一层的方差是一个常数
将每层的输出和梯度都看做是随机变量,并且让他们的均值和方差保持一致

2.权重初始化

  • 在合理的区间内随机初始化参数
  • 训练开始的时候更容易存在数值不稳定的问题

这里往后的内容完全看不懂,留到后续有时间再看

3.检查常用的激活函数
泰勒展开然后做线性调整

你可能感兴趣的:(动手学深度学习v2笔记,深度学习,学习,机器学习)