反向传播和其他微分算法
输入 x x x提供初始信息,然后传播到每一层的隐藏单元,最终产生输入 y ^ \hat{y} y^,这称之为前向传播。在训练过程中,前向传播可以持续向前,直到它产生一个标量代价函数 J ( θ ) J(\theta) J(θ)。而反向传播算法则允许来自代价函数的信息通过网络向后流动,以便计算梯度(减少数值化求解梯度的计算代价)。实际上,反向传播仅仅是指用于计算梯度的方法,而不是用于多层神经网络的整个学习算法(这种算法叫随机梯度下降,是使用梯度来进行学习)。在学习算法中,我们最常见的是代价函数关于参数的梯度,即 ∇ θ J ( θ ) \nabla _\theta J(\theta) ∇θJ(θ)。其实,它也可以计算任意函数的梯度 ∇ x f ( x , y ) \nabla _x f(x, y) ∇xf(x,y),其中 x x x是待求导数的变量,而 y y y是函数的另外一组输入而已。
计算图:
为了精确描述反向传播算法,需要使用更为精确的计算图语言。这里,我们使用图中的每一个节点来表示一个变量(标量、向量、矩阵、张量)。我们引入操作概念,是指一个或者多个变量的简单函数,可以通过将多个操作复合在一起来描述更为复杂的函数,操作的返回或者输出可以是标量,甚至向量。计算图中的边是有向的。
微积分中的链式法则:
用于计算复合函数的导数。标量的链式法则很直观,我们可以将其扩展到多维空间。假设 x ∈ R m x \in \mathbb{R}^m x∈Rm, y ∈ R n y \in \mathbb{R}^n y∈Rn, z ∈ R z \in \mathbb{R} z∈R, y = g ( x ) y = \mathcal{g}(x) y=g(x), z = f ( y ) z = f(y) z=f(y),那么:
∂ z ∂ x i = ∑ j ∂ z ∂ y j ∂ y j ∂ x i \frac{\partial z}{\partial x_i} = \sum_{j}^{} \frac{\partial z}{\partial y_j} \frac{\partial y_j}{\partial x_i} ∂xi∂z=j∑∂yj∂z∂xi∂yj使用向量记法,等价表示为:
∇ x z = ( ∂ y ∂ x ) T ∇ y z \nabla _x z = (\frac{\partial y}{\partial x} )^T \nabla _y z ∇xz=(∂x∂y)T∇yz上式是向量对向量求偏导得到的矩阵(Jacobian矩阵)的转置,和标量对向量求偏导得到的向量的