假设我们现在需要计算一个函数f(x,y,z)=(x+y)*z,在x = -2,y = 5,z = -4时的梯度,那么首先可以做出如下所示的计算图。
将x = -2,y = 5,z = -4带入,其中,令x+y = q ,一步步计算,很容易就能得出f(-2,5,-4) = -12 。
这就是前向传播(计算图上部分绿色打印字体与蓝色手写字体),前向传播是从输入一步步向前计算输出,而反向传播则是从输出反向一点点推出输入的梯度(计算图下红色的部分)。
注:这里的反向传播假设输出端接受之前回传的梯度为1(也可以是输出对输出求导=1)观察上述反向传播,不难发现,在输出端梯度的模值,经过回传扩大了3、4倍。这是由于反向传播结果的数值大小不止取决于求导的式子,很大程度上也取决于输入的模值。当计算图每次输入的模值都大于1,那么经过很多层回传,梯度将不可避免地呈几何倍数增长(每次都变成3、4倍,重复上万次,想象一下310000有多大……),直到Nan。这就是梯度爆炸现象。
当然反过来,如果我们每个阶段输入的模恒小于1,那么梯度也将不可避免地呈几何倍数下降(比如每次都变成原来的三分之一,重复一万次就是3-10000),直到0。这就是梯度消失现象。值得一提的是,由于人为的参数设置,梯度更倾向于消失而不是爆炸。
转自:https://www.zhihu.com/question/64494691/answer/786270699