第二周的内容介绍了多层感知机(MLP),反向传播以及TensorFlow的基本使用,这里主要回顾多层感知机(MLP)和反向传播的内容。

先来看最简单的神经网络,多层感知机(MLP)

The simplest neural network: MLP

MLP

考虑如下问题:

我们的目标是区分出标记为$+,-$的点,之前的分类模型对应二维平面一条直线,这张图显然是无法用一条直线来分类,但是我们可以画出多条直线,如下所示:

其中$\sigma(x) =\frac{1}{1+e^{-z}}$。现在我们可以利用得到的$(z_1,z_2,z_3)$再进行分类,画图之后可以发现,这样就可以分类了,把上述过程的计算式写出来:

上述过程可以用计算图表示出来:

我们的计算图被称为多层感知机(Multi-layer perceptron,MLP),图中的$x_i$被称为输入层,$z_i$被称为隐藏层,$a$被称为输出层,每个节点是一个神经元,采取的操作都是先对输入进行线性组合,再由激活函数(例如$\sigma(x)$)计算出结果,注意激活函数一般来说不是线性的,否则上述模型相当于普通的感知机。

总结:

现在我们有了模型,接下来的问题是如何计算导数来用梯度下降法进行训练。

Chain rule

我们来看一个计算导数的例子:

利用链式法则,不难得出导数的计算公式,我们查看计算图,不难发现导数的每一项对应了计算图的一条路径,所以可以得到上图中的计算法则,接下来的目标是如何快速计算出这些结果。

back-propagation

来看一个复杂一点的例子:

上述计算式看似很复杂,但是观察后不难发现第2步的式子可以直接带入第三步的计算结果,带入后第三步可以化为如下形式:

所以我们可以利用后一层的导数计算这一层的导数,这个过程就叫做反向传播(back-propagation)。

Matrix derivatives

我们接下来的任务是用矩阵来计算上述导数。

Efficient MLP implementation

我们考虑三个输入,两个神经元,没有偏置项并且激活函数为线性函数的神经网络,计算式如下:

把它的计算过程写成矩阵的形式:

反向传播的时候我们要计算$\frac{\partial L }{\partial W}​$,其中$L(z_1,z_2)​$是损失函数,$\frac{\partial L }{\partial W}​$计算式如下:

计算出上述结果之后,就可以利用随机梯度下降法进行更新:

我们来看$\frac{\partial L }{\partial W} $的每个分量$\frac{\partial L }{\partial w_{i,j}} $

注意$\frac{\partial L }{\partial z} =(\frac{\partial L }{\partial z_1}, \frac{\partial L }{\partial z_2})$,所以$\frac{\partial L }{\partial W} $可以写成如下形式:

如果现在如果有两个输入,可以表达为矩阵形式:

损失函数为

同之前计算过程可知:

我们再来计算$\frac{\partial L_b }{\partial X}$,注意

所以我们来计算$\frac{\partial L(z_{i,1},z_{i,2}) }{\partial X}$的每个分量$\frac{\partial L(z_{i,1},z_{i,2}) }{\partial x_{i,j}}$

从而

可以把上述计算过程写成如下接口:

other cases of matrix derivatives

再来看一些矩阵导数的例子:

现在的问题是如何计算$\frac{\partial C}{\partial A}$,这里老师给出如下定义:

这个量称为张量(tensor),计算式如下

假设

我们来计算$\frac{\partial L}{\partial A} $

这说明我们不需要通过计算$\frac{\partial C}{\partial A}$来计算$\frac{\partial L}{\partial A} $