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