深度学习-BP的链式求导、梯度爆炸和梯度消失

2,602 阅读1分钟

首先来思考一下,一个简单的DNN中,梯度与哪些因素有关?

先来一个简单的3层神经网络

image.png

第一层的输出为

hi=σ(ui)=σ(k=1Kwkixk+bi)h_i = \sigma(u_i) = \sigma(\sum_{k=1}^{K}w_{ki}x_k+b_i)

第二层的输出为

hj=σ(uj)=σ(i=1Iwijhi+bj)h_j^{'} = \sigma(u_j^{'})=\sigma(\sum_{i=1}^{I}w_{ij}^{'}h_i+b_j)

损失函数为

E=CE(yj;hj)=yjlog(hj)+(1yj)log(1hj)E = CE(y_j;h_j^{'}) = y_jlog(h_j^{'}) + (1 - y_j)log(1-h_j^{'})

求导:

对第二层求导

δEδwij=δEδhjδhjδujδujδwij\frac {\delta E}{\delta w_{ij}^{'}} = \frac {\delta E}{\delta h_j^{'}}\frac {\delta h_j^{'}}{\delta u_j^{'}}\frac {\delta u_j^{'}}{\delta w_{ij}^{'}}

一共三个部分,一个部分一个部分来

交叉熵求导

δEδhj=(yj)hj(yj)(1hj)=yjhjhj(1hj)\frac {\delta E}{\delta h_j^{'}} = \frac { (y_j)}{h_j^{'}}\frac { (y_j)}{(1- h_j^{'})} = \frac {y_j - h_j^{'}}{{h_j^{'}}(1- h_j^{'})}

激活函数求导(假设是sigmoid)

δhjδuj=hj(1hj)\frac {\delta h_j^{'}}{\delta u_j^{'}} = h_j^{'}(1-h_j^{'})

最后对权重求导

δujδwij=hi\frac {\delta u_j^{'}}{\delta w_{ij}^{'}} = h_i

三个部分合并到一起即为第二层的权重

δEδwij=(yjhj)hi\frac {\delta E}{\delta w_{ij}^{'}} = (y_j - h_j^{'})h_i

可以看到该层的权重与输入值hih_i、输出值hjh_j^{'}还有标签yjy_j有关。

对第一层求导

过程类似,结果为

δEδwki=(yjhj)wijhi(1hi)xki\frac {\delta E}{\delta w_{ki}} = (y_j-h_j^{'})w_{ij}^{'}h_i(1-h_i)x_{ki}

可以看到,某一层的梯度与

  1. 后一层的输出值
  2. 标签
  3. 后一层权重
  4. 激活函数求导(hi(1hi)h_i(1-h_i)其实就是sigmoid的导数)
  5. 输入值 相关

这里可以引申出为什么会梯度爆炸/梯度消失 爆炸:

  1. 权重初始化不合理,反向传播过程中后一层的权重会影响本层的梯度,权重均值大于1就会爆炸 消失:
  2. 激活函数的导数值,例如sigmoid,在0附近的导数最大,但也仅有0.25,层层传递下去就🈚️了