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可能表示这个特征对模型不重要或者不敏感,特征提取的本质也可以说是一个筛子,专门筛选有用的特征(例如自编码模型,仅通过提取的少量特征就能还原输入),或者说是一个特征压缩的过程
事实上,对于深度神经网络来说,其越到后面特征就越稀疏,这也体现了特征压缩的过程。