前馈神经网络

神经网络

根据之前的学习,可以了解到使用非线性的多项式项,能够帮助我们建立更好的分类模型。假设我们有非常多的特征,例如100个变量,我们希望用这100个特征来构建一个非线性的多项式模型,结果将是数量非常庞大的特征组合,这对于一般的逻辑回归来说需要计算的特征太多了。普通的逻辑回归模型不能有效地处理这么多的特征,这时候我们需要神经网络。

神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器。而现在我们在机器学习领域谈论神经网络指的是“神经网络学习”。

神经网络模型

神经网络的的基本单元是神经元,神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。这些神经元(也叫激活单元,activation unit)采纳一些特征作为输出,并且根据本身的模型提供一个输出。

上图是一个以逻辑回归模型作为自身学习模型的神经元示例 ,$x0,x_1,x_2$ 是神经元的输入。$g(z)$ 作为预测结果$h\theta(x)$,称为神经元的输出。$g(z)$ 被称作激活函数( activation function), 可以控制这个神经元是否被激活(比如逻辑回归中的 sigmoid 函数 $\sigma(z)$)其中 $x_0$ 称为偏执单元(bias unit),$-\theta_0$ 为偏执(或者称为阈值,threshold)。阈值控制着神经元何时被激活。参数$\theta_i$又可被称为权重$w_i$(weight)

md2

上图是一个简单的神经网络,分为输入层,隐藏层,输出层。其中 $x1,x_2,x_3$ 是输入单元,我们将原始数据输入给它们;$a^{(2)}_1,a^{(2)}_2,a^{(2)}_3$ 是中间单元,它们负责将数据进行处理,然后呈递到下一层; 最后是输出单元,它负责计算假设 $h\Theta(x)$。

$a^{(l)}_i$代表第$l$层的第$i$个激活单元;

$s_l$代表着第$l$层的神经元个数;

$\theta^{(j)}$代表从第$j$层映射到第$j+1$层时的权重的矩阵,大小为$s_{j+1}\times s_j$

对于上图所示的模型,激活单元和输出分别表达为:

每一个$a$都是由上一层所有的$x$和每一个 $\Theta$ 所对应的决定的,我们把这样从左到右来计算出每个激活单元$a^{(l)}_i$的算法称为前向传播算法(forward propagation) 。

反向传播算法(Back Propagation Alogorithm)

我们通过神经网络模型得出了一个预测结果 $h\Theta(x)$,可是这个结果可能与真实的结果 $y$ 相差得很远,然而这个愚蠢结果是通过输入层 $x_i$ 与很多的参数 $\Theta^{(l)}{jk}$ 共同计算得出的,所以我们若是想优化神经网络的预测结果,就得不断调整参数,使输出结果得到最优。这是我们就需要通过反向传播算法不断通过训练来获得更优的参数。

我们先看一个简单的神经网络:

其中:

假设现在有一组样本 ${(x,y)}$,显然需要不断调整这六个参数,运用梯度下降的方法来让这个网络模型得到最优:

其中的代价函数 $J(\Theta)$ 为:

先调整第三层的 $\Theta^{(3)}_1$:

再计算 $a^{(4)}$ 偏置项 $\Theta^{(3)}_0$:

好了,现在已经求出第3层参数的偏导,下面继续往前求第2层参数的偏导 $\Theta^{(2)}_1$:

计算 $a^{(3)}_1$ 偏置项 $\Theta^{(2)}_0$:

继续往前求第1层参数的偏导 $\Theta^{(1)}_1$:

计算$a^{(2)}_1$偏置项 $\Theta^{(1)}_0$:

好了,现在计算出了这个神经网络模型的所有参数的偏导,就可以代入梯度下降的迭代公式就能达到最优。但是参数越靠前,式子就越长,我们可以简化一下这个式子:

令:

则:

下面有一个复杂的4层神经网络:

其中:

假设现在有$m$组样本 ${(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)})\cdots(x^{(i)},y^{(i)})\cdots}$,代价函数 $J(\Theta)$ 为:

先找出一组样本 $(x,y)$,$y\in \Bbb R^3$,先调整第三层的 $\Theta^{(3)}_{jk}$:

再计算 $a^{(4)}j$ 偏置项 $\Theta^{(3)}{j0}$:

再向前计算第二层的 $\Theta^{(2)}_{jk}$:

计算 $a^{(3)}_1$ 偏置项 $\Theta^{(2)}_0$:

再往前求也是差不多的样子,我就不写了😵。在上面用到了一个简便写法:

则:

现在把正则化考虑在内,代价函数为:

则 $\Theta^{(l)}_{jk}$ 的偏导数为:

如上,就是反向传播算法的大致推导过程。

随机初始化

我们的目标是针对参数 $\Theta$ 来求代价函数 $J(\Theta)$ 的最小值。为了初始化神经网络,我们需要将每一个参数设置为一个很小的,接近零的随机值(比如使用正态分布 $N(0,\epsilon^2)$ 生成的随机值,其中设 $\epsilon=0.01$),之后对目标函数使用诸如梯度下降法的最优化算法。如果所有参数都用相同的值作为初始值(比如都为$0$),那么所有隐藏层单元最终会得到与输入值有关的,值相同的函数。随机初始化的目的是使对称失效

梯度检验

当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,也就是代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度数值检验(Numerical Gradient Checking)的方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们需要的。

对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的$\theta$ ,我们计算出在 $\theta-\epsilon$ 处和 $\theta+\epsilon$ 的代价值($\epsilon$ 是一个非常小的值,通常选取 $\epsilon=0.001$),然后求两个代价的平均,用以估计在 $\theta$ 处的代价值。

当 $\theta$ 是一个向量时,我们则需要对通过反向传播算法对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,例如下面是一个只针对 $\theta_i$ 进行检验: