斯坦福公开课——机器学习课程(四)

引言

第四周和第五周课程,讲的主要是神经网络。(两周合一起主要是第四周课程内容实在是太少了)


神经网络

神经网络是一种很古老的技术,限于以前的计算能力和数据量,神经网络一直不能有很好的发展。

现在就不同了,计算能力和数据量都上去了,神经网络也得到了很好的发展。

总而言之就是,神经网络大法好。于我个人而言我还是很喜欢神经网络的,因为真的可以避免很多数学问题XD。


神经网络总是像这样,分为三层,输入层,隐含层,输出层。当然隐含层里面还可以有很多层。

对于这样一个神经网络,有很多需要定义的东西:


a定义为隐含层的单元,上标j表示第几层,下标i表示第几个。

θ表示本层和下一层之间的连接权值,也可以叫参数。

因为每层还有一个不画出来的bias量,所以θ的大小是(下一层的单元数)乘以(本层单元数+1)。

前向传播

以上面那个神经网络为例:


将输入x换成a,然后其余的用向量来表示,这样就形成了前向传播,就是从前面往后面算出输出值。

神经网络代价函数

神经网络的代价函数是根据逻辑回归的代价函数变化而来:


下标k对应的是第k个输出。

反向传播

下面是整个类似于计算流程一样的东西:


反向传播就是从输出层开始,一层一层的反向计算误差,进而计算每一个权重的偏导,以用于各种优化函数。

注意的是,在matlab里面,进行优化使用的时候,要把所有的θ和δ拼在一起,变成一个向量,而不是矩阵。在求偏导和J的时候再还原成矩阵。

梯度检查

在使用梯度下降的时候,里面有很多细节会产生各种各样的BUG。什么?很多BUG?这是我们都想避免的,所以使用这样的梯度检查算法,可以帮你避免很多看似正确运行实际上却又很多BUG的情况。

首先考虑一个简单的情况,对于单一确定的θ,有如下形式来求近似的双边导数:


在某一个θ值左右加减一个非常小的值,通常取10^-4,然后按照下面的式子求导,会发现这个近似值和真实值很接近。

然后考虑更一般的情况,我们有nθ


用这个近似的梯度和用反向传播计算的梯度进行对比,两者应该是非常接近的。

随机初始化

初值全为零,在逻辑回归里面还可以,但是在神经网络里面可是大忌,会产生一种对称现象。

最好的初始化方法,是让所有的值都随机落在同一个小范围之内。


神经网络建立求解步骤梳理

  • 首先你得有一个神经网络
    • 确定输入数量
    • 确定隐藏层层数和每层单元数
    • 确定输出数量
  • 优化神经网络
    • 首先随机初始化你的所有权重
    • 然后利用前向传播计算每一个输入的所有输出的值
    • 然后计算代价函数
    • 最后当然是用反向传播计算所有的梯度,也可以说偏导
    • 利用梯度检查来验证一下反向传播是不是正确,如果正确,就取消掉梯度检查函数
    • 用一些优化方法来优化权重,求出最小的代价函数

后记

神经网络大法好!