机器学习算法可以看做是对于Logistic Regression的一种升级版,其主要的思想是构建分层的神经网络结构,层与层之间以非线性映射的方法进行连接,通过这种多层的非线性关系来拟合复杂的Decision Boundary。
一个神经网络至少包含输入层和输出层,可以有一个或多个隐藏层。隐藏层就是处于输入层和输出层之间、对外不可见的层。一般来讲,隐藏层越多,学习的效果越好,但是相应的学习计算代价就越大。
对于一个神经网络,其学习参数的个数是由层数和每层中节点个数决定的。每相邻两层有一个参数矩阵
Θ
,若前一层有节点
m
个(不包含bias节点),当前层由节点
首先给出模型,输入为一个
m×k
的矩阵
X
,代表有
a2=hΘ(a1)=g(Θa1)
其中
a2
并不包含bias分量,在计算下一层值时需要额外添加;而
g(z)
表示一个非线性函数,本课程中采用的是sigmoid函数
g(z)=11+e−z
Cost Function的定义与Logistic Regression相似,不过需要对 k 个输出同时求和:
根据之前的经验,有了Cost Function,只要再分别计算出它关于每个参数 θ 的偏导数就可以使用Gradient Decent或类似的优化方法来进行学习了。这里计算偏导数使用的是Backpropagation算法。
算法的思想是,如果对于每一个参数直接求导则运算量太大,希望通过递推的方式来求得所有的偏导数。通过分析可以发现, h′Θ(x)=hΘ(x)(1−hΘ(x))x′ ,带入 J′(Θ) 可以得到对输出层对应的参数矩阵 Θ 有
J′(Θ)=1m∑i=1m∑j=1k(hΘ(xi)−yi,j)xi
其中最后一个
xi
是由于对最后一个矩阵中元素求导得到的,也就是最后一个隐藏层节点的值。若是要对最后一个隐藏层中元素求导,则最后一项应变为对
Θxi
中
xi
求导,因此应得到
xi(1−xi)Θai
,这里
ai
是倒数第二个隐藏层节点的值。
由此,对倒数第二个参数矩阵求导的结果应为:
J′(Θ)=1m∑i=1m∑j=1k(hΘ(xi)−yi,j)xi(1−xi)Θai
若要继续对之前的
Θ
求导,那么可以根据这个思路继续对
ai
求导即可。总结规律可以发现,如果我们记
J′(Θi)=1m∑i=1m∑j=1kδi,jxi
,那么就有
δi−1,sl=δi,jxi(1−xi)Θi
根据这个就可以用递推的方式得到所有的
J′(Θ)
。
这就是Backpropagation的主要思想。除此之外,还可以使用数值方法计算每一个 J′(Θ) ,即
J′(θ)=J(θ+ϵ)−J(θ−ϵ)2ϵ
这里取
ϵ
足够小(如
10−4
),对于第一遍使用BP方法得到的
J′(Θ)
进行验证,可以保证运算的正确性。这就是Gradient Checking,但是当确定正确之后应当将其关闭,因为数值方法运算非常非常慢。
还有一个需要注意的问题就是在选择初始化 Θ 的时候,不能使用全部相同的值,否则会导致神经网络节点之间没有差异性,从而学习失败。一般使用随机矩阵的方法来生成,如
init_theta = 2*epsilon*rand(m,n) - epsilon
。还有就是做Regularization的时候
λ
的取值有一个经验公式,即
6√n√m+1−−−−−√
。
使用了Octave中的fmincg方法进行学习,得到了不错的效果。
有机会要研究一下神经网络背后的原理。