输入输出对模型回传梯度的影响

TL;DR: 输入会影响梯度,输出基本上也都会有影响

输入

如果是线性网络的话,输入其实就是梯度,例如对于函数 y = kx+b 来说,forward时,输入x求y,backward时,求k的梯度,其实就是x。

而目前大部分的网络其最内部的函数就是线性函数(网络模型可以看作多层的嵌套函数)

输出

如果单从一个线性函数 y=kx+b 来说,求k的梯度确实没用到y,但是:

1. 目前的网络基本都是多层的,即上一个网络的输出就是下一个网络的输入。又由于链式求导法则,即从下一个网络开始,前面的网络梯度都会受到影响。

2. 对于一些激活函数来说,其梯度的计算本身就带有其输出值,例如对于sigmoid函数来说,它的公式为:

其导数为:

可以看到,它的导数中就包含它的函数值,所以如果使用了这类激活函数,输出也是会影响backward的梯度的。

梯度消失

由于链式求导法则的原因,一旦一个网络的梯度等于或接近0,因为其前面的网络计算梯度时都需要乘以这个梯度,故大概率也会接近0,这会引起梯度消失。

例如在一个嵌套网络中:A->B->C->D,表示前一个网络的输出是下一个网络的输入,假设这里网络C的输出为0,D网络只是一个线性输出层,则D网络的梯度很有可能为0,根据链式求导法则,A、B、C的网络梯度也是0,模型就更新不了了。

另外,如果C网络使用leru这种激活函数,如果它的输入小于0,那么它的梯度就等于0,其前面的网络梯度也就为0了,这之前的网络也就无法更新了。对于其他激活函数同理。

是不是要避免输出0?

那倒也不是,模型输出0可能表示这个特征对模型不重要或者不敏感,特征提取的本质也可以说是一个筛子,专门筛选有用的特征(例如自编码模型,仅通过提取的少量特征就能还原输入),或者说是一个特征压缩的过程

事实上,对于深度神经网络来说,其越到后面特征就越稀疏,这也体现了特征压缩的过程。

Leave a Comment