反向传播与随机梯度下降

反向传播实际上就是在传播损失函数对各个网络层的梯度。每层的传入实际是之前各层根据链式法则梯度相乘的结果。反向传播最初传入的Δout是1,Δ通常表示很少量的意思,Δout=1的时候这样在反向传播的时候算出来的dw和dx刚好就是当前梯度,或者可以这样理解Δout是损失函数对自己的梯度为1。反向传播时每层的输入都是前几层梯度相乘的结果(链式法则)也就是说损失函数f_loss(x)对当前层的w的梯度就是当前层的函数f(x)对w的梯度乘以传进来的梯度。f_loss(x)对本层的x的梯度也等于f(x)对x的梯度乘以反向传播进来的梯度,由于正向传播时输入x,参与了每层的计算,所以针对输入x的梯度要不断向前反向传播,直到最初的输入层,而中间层中的各个参数w,每层都是不同的,而且是中途参与的计算,所以反向传播的时候,关于w的梯度,到各自层就结束了,但是关于x的梯度还未传播完,所以要返回本层对x的梯度给下一层用,每层的输出都是损失函数对本层x的梯度,需要注意的是计算MatMul节点的反向传播时要注意矩阵形状,所以需要矩阵转置。反向传播计算的各种梯度就是为了梯度下降做准备工作。深度神经网络中每层都会记录正向传播时该层传入的x,就是为了反向传播的时候计算dw的时候用到。反向传播的时候也会利用w计算出dx来作为下一层的反向传播的输入。

梯度下降的时候代码如下:

class SGD:

def __init__(self, lr=0.01):

self.lr = lr

def update(self, params, grads):

for i in range(len(params)):

params[i] -= self.lr * grads[i]

params 是每层神经网络的w和b,grads 对应的是损失函数对各层参数的梯度。 params[i] -= self.lr * grads[i] 表示每层的w和b都要梯度下降,这是因为反向传播的时候,每层的梯度都是损失函数f_loss(x)对各层权重的导数。

代码来源《深度学习进阶-自然语言处理》第一章

你可能感兴趣的:(深度学习,神经网络,人工智能,深度学习)