正常情况
graph LR
Input:X-->L1["Layer1:f1(X,w1)"]
L1-->L2["Layer2:f2(X,w2)"]
L2-->Y
令真实值为y=f2(X,w2),损失函数为L(Y,y)=Y−y,考虑的简单一点。
正常情况下反传梯度后的梯度更新如下:
w2=w2−η∂w2∂L
w1=w1−η∂f1∂Lw1∂f1
显然当层数n较大时,w1的梯度更新会变为以下形式:
w1=w1−η∂fn−1∂L...w1∂f1
从上式可看出,当网络层数较大时,梯度的链式相乘容易引起梯度爆炸或消失,从而导致模型训练失败。
ResNet的情况
graph LR
Input:X-->L1["Layer1:f1(X,w1)"]
L1---O1(( ))
O1-->L2["Layer2:f2(X,w2)"]
L2--->O2(( ))
O2-->Y
O1-->O2
此时Y=f2[f1(X,w1),w2]+f1(X,w1),损失函数依然为L(Y,y),反传梯度后的梯度更新如下:
w2=w2−η∂w2∂L=w2−η∂w2∂f2
w1=w1−η[∂f1∂f2∂w1∂f1+∂w1∂f1]
此时便将乘法转为了加法,当ResNet层数n较大时,w1的梯度更新变为了以下形式:
w1=w1−η[∂fn−1∂fn...∂w1∂f1+∂fn−2∂fn−1...∂w1∂f1+...+∂w1∂f1]
方括号中的最后一项∂w1∂f1保证了梯度不会因为相乘而太大或归0,从而使得ResNet能够训练1000层的深度神经网络。