12月 03

机器学习之神经网络

Published at Dec 03, 2015 • Machine Learning Cousera

一. 神经网络模型

神经网络可以表达一个复杂且非线性的假设模型,其模型表示(图片见本节最后边):

最左边Layer 1称为输入层;Layer 2称为隐藏层;隐藏层每一个元素也叫做“神经元”,它是由前一层通过“激励函数”计算得来的;最后Layer 3称为输出层;该模型隐藏层比较少,绝大多数的数量不止一个

其中:ai(j)表示第j层的第i个神经元,也称为激励值;激励函数可以选择g(z)=1/(1 + e-z)

备注:激励函数是对类似的非线性函数g(z)的另一种称呼而已

那么:

  • a1(2) = g(Θ10(1)X0 + Θ11(1)x1 + Θ12(1)x2 + Θ13(1)x3)
  • a2(2) = g(Θ20(1)x0 + Θ21(1)x1 + Θ22(1)x2 + Θ23(1)x3)
  • a3(2) = g(Θ20(1)x0 + Θ31(1)x1 + Θ32(1)x2 + Θ33(1)x3)
  • hΘ(x) = a1(3) = g(Θ10(2)a0(2) + Θ11(2)a1(2) + Θ12(2)a2(2) + Θ13(2)a3(2))

其中 Θij(l) 是 第l层 第j个单元 与 第l+1层第i个单元之间的联接参数(其实就是连接线上的权重,注意标号顺序)

ok,一个简单的模型表示出来了,其实还可以精简一点表示:

重新定义如下:

  • a1(2) = g(z1(2))
  • a2(2) = g(z2(2))
  • a3(2) = g(z3(2))
  • hΘ(x) = a1(3) = g(z1(3))
  • z(2) = Θ(1)X

其中,z是x0, x1, x2, x3的加权线性组合

言而总之,我们从输入层的激励开始,然后进行前向传播给隐藏层计算,并进行隐藏层的激励,然后继续传播,计算输出层的激励

所以,神经网络的工作原理是:

其本质做的就是逻辑回归,但不直接用x1, x2, x3作为输入特征,而是用a1, a2, a3,而a1, a2, a3是由Θ(1)所决定的。即不直接使用输入特征来训练逻辑回归,而是自己训练逻辑回归的输入特征a1, a2, a3

Θ(1)不同,会训练出不同复杂而有趣的特征

二. 神经网络的应用

2.1 具体例子

使用神经网络实现x1 AND x2

相应的,可以实现x1 OR x2; x1 XOR x2; x1 XNOR x2。只是,各自的参数权重不同而已

2.2 多类型分类系统

预测的输出值有多个,可以预测多种类型

三. 反向传播算法

神经网络的模型已经被我们表示出来了,那么我们如何学习模型参数?利用反向传播算法

我们要先找到神经网络的代价函数,目的是min它

3.1 神经网络的代价函数

先定义一些字母变量

  • L:神经网络中的层数
  • Sl:第l层神经单元的个数
  • k:输出单元数量;显然,Binary Classification的k为1,multi-class Classification的k就是k,k维向量

既然神经网络的本质就是逻辑回归,我们先来看看逻辑回归的代价函数:

只不过,在神经网络中,输出单元可能不止一个,那么神经网络的代价函数为:

3.2 反向传播算法

为了计算导数项,我们将使用反向传播算法

反向传播算法某种意义上是对每一个结点计算这样的一项:δj(l),即第l层第j个结点的误差

具体计算方法:

让我们来整合一下,当我们拥有大量训练样本的时候,如何实现反向传播算法:

好了,仔细看看上面两张图片,我们的最终目的是计算出了偏导数项。其实就是计算出梯度下降的方向

PS: 我操,步骤好多。参数好多。。

四. 实际中如何使用反向传播算法

4.1 梯度检查(Gradient Checking)

梯度检查,是为了避免反向传播算法实现过程中的小错误;当出现错误时,J(Θ)看似在减小,实则最终值会比没有错误时要高

其核心原理是J(θ)在θ处的偏导数可以约等于(J(θ+ε) - J(θ-ε)) / 2ε,其中ε要足够小,一般去10的-4次方:

这是高中就知道的知识点了,具体应用到梯度检查中就是:

上面图中,我们可以for循环1~n来计算代价函数在每个网络中的参数的偏导数的近似值,记为gradApprox

我们把反向传播算法计算得到的梯度记为DVec

这样,我们比较gradApprox和DVec是否近似相等(一般最多几位小数的差距)

ok,总结一下就是:

  • 先实现反向传播算法,计算出DVec
  • 实现数值梯度检查算法,计算出gradApprox
  • 确定两者给出的值,是接近的
  • 关闭梯度检查(梯度检查计算量相当大),使用反向传播进行神经网络的学习

所以,梯度检查是是用来验证你的方向传播的,不是用来学习参数的

4.2 如何随机初始化Θ?

是否可以将Θ的每个参数都初始化为0?不可以!

这会导致a1(2)永远等于a2(2);所有的隐藏单元都会通过完全相同的输入函数计算出来,这完全是多余的

正确的姿势是:打破这种对称的权重

随机初始化Θij(l)在[-ε, +ε]之间即可,之间的任何一个数

五. 总结回顾

神经网络的知识点还是比较复杂,需要来一波总结

5.1 如何选择神经网络的框架

该选择多少个隐藏层?每个隐藏层拥有多少个神经元?

一般默认

  • 一个隐藏层
  • 或者多于一个隐藏层,每个隐藏层应具备同样数目的神经元(神经元数量并不是越多越好,越多,计算量也越大),最好能和输入特征的维度匹配

比如:3,5,4 或 3,5,5,4 或 3,5,5,5,4

5.2 总结神经网络训练模型的步骤

1.随机初始化权重(即参数)
2.对于训练集中的每一个x(i),使用前向传播算法得到hΘ(x(i))
3.计算代价函数J(Θ)
4.实现反向传播算法,计算J(Θ)在Θj处的偏导数
5.使用梯度检查算法,确保反向传播算法无差错工作;之后,关闭该算法
6.使用梯度下降算法或者其余高级算法(结合反向传播算法),minmizeJ(Θ),得到最优的模型参数Θ

反向传播的目的是为了计算梯度下降的方向