引言
第四周和第五周课程,讲的主要是神经网络。(两周合一起主要是第四周课程内容实在是太少了)
神经网络
神经网络是一种很古老的技术,限于以前的计算能力和数据量,神经网络一直不能有很好的发展。
现在就不同了,计算能力和数据量都上去了,神经网络也得到了很好的发展。
总而言之就是,神经网络大法好。于我个人而言我还是很喜欢神经网络的,因为真的可以避免很多数学问题XD。
神经网络总是像这样,分为三层,输入层,隐含层,输出层。当然隐含层里面还可以有很多层。
对于这样一个神经网络,有很多需要定义的东西:
a
定义为隐含层的单元,上标j
表示第几层,下标i
表示第几个。
θ
表示本层和下一层之间的连接权值,也可以叫参数。
因为每层还有一个不画出来的bias
量,所以θ
的大小是(下一层的单元数)乘以(本层单元数+1)。
前向传播
以上面那个神经网络为例:
将输入x
换成a
,然后其余的用向量来表示,这样就形成了前向传播,就是从前面往后面算出输出值。
神经网络代价函数
神经网络的代价函数是根据逻辑回归的代价函数变化而来:
下标k
对应的是第k
个输出。
反向传播
下面是整个类似于计算流程一样的东西:
反向传播就是从输出层开始,一层一层的反向计算误差,进而计算每一个权重的偏导,以用于各种优化函数。
注意的是,在matlab里面,进行优化使用的时候,要把所有的θ和δ
拼在一起,变成一个向量,而不是矩阵。在求偏导和J
的时候再还原成矩阵。
梯度检查
在使用梯度下降的时候,里面有很多细节会产生各种各样的BUG。什么?很多BUG?这是我们都想避免的,所以使用这样的梯度检查算法,可以帮你避免很多看似正确运行实际上却又很多BUG的情况。
首先考虑一个简单的情况,对于单一确定的θ
,有如下形式来求近似的双边导数:
在某一个θ
值左右加减一个非常小的值,通常取10^-4
,然后按照下面的式子求导,会发现这个近似值和真实值很接近。
然后考虑更一般的情况,我们有n
个θ
。
用这个近似的梯度和用反向传播计算的梯度进行对比,两者应该是非常接近的。
随机初始化
初值全为零,在逻辑回归里面还可以,但是在神经网络里面可是大忌,会产生一种对称现象。
最好的初始化方法,是让所有的值都随机落在同一个小范围之内。
神经网络建立求解步骤梳理
- 首先你得有一个神经网络
- 确定输入数量
- 确定隐藏层层数和每层单元数
- 确定输出数量
- 优化神经网络
- 首先随机初始化你的所有权重
- 然后利用前向传播计算每一个输入的所有输出的值
- 然后计算代价函数
- 最后当然是用反向传播计算所有的梯度,也可以说偏导
- 利用梯度检查来验证一下反向传播是不是正确,如果正确,就取消掉梯度检查函数
- 用一些优化方法来优化权重,求出最小的代价函数
后记
神经网络大法好!