ng机器学习视频笔记(七)

——神经网络的代价函数、反向传播、梯度检验、随机初始化

 (转载请附上本文链接——linhxx)

 

一、代价函数

         同其他算法一样,为了获得最优化的神经网络,也要定义代价函数。

         神经网络的输出的结果有两类,一类是只有0和1,称为二分分类(Binary classification),另一种有多个结果,称为多分类。其中,多个结果时,表示方式和平时不太一样。例如,y的结果范围在0~5,则表示y=2,用的是矩阵y=[0 1 0 0 0]T来表示,如下图:

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

  代价函数可以类比logistic回归的代价函数,logistic回归是在输出结果两个的情况下的公式,而神经网络将其拓展到k维的一般化形式,其中,总层数用L表示,Sl表示第l层的神经元的数量,K表示输出的结果个数。公式如下:

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

二、反向传播算法初涉感悟

关于bp算法,我目前也没太搞懂,就这当前知道的内容,就这吴恩达大神的ppt,说一说我的理解。这个算法在神经网络中非常重要,后面有更多理解后会继续讨论bp算法。

反向传播算法(back propagation algorithm,又称BP算法),目的是为了更方便的求解代价函数的最小值。

首先,反向传播相对的,叫做前向传播(front propagation),即对于神经网络的层次,从第一层开始,根据输入的训练样本,逐个的推导出输出结果公式h(x)的过程。

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

而反向传播,目的是为了求解代价函数的偏导数,以在梯度下降算法中使用。反向传播,是从后往前推的,根据最后一层的h(x)与最终样本的y的值的差,求出最后一层的误差Δ。接着在输出层的前一层,利用输出层的误差Δ,计算出本层的误差。以此类推。第一层(即输入层)不需要计算,因为输入层就是样本,计算误差没有意义。

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

总的来说,计算公式如下:其中l表示第l层,这是一个循环,遍历所有的输入的样本,最终得到的结果D即为偏导数的结果,也即代价函数J的偏导数的计算结果。

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

 

三、进一步分析FP与BP

1、FP

         就着某一层的神经元而言,以下图第二排中间那个红圈的神经元为例,其值是前一层(即输入层)经过一些权重(即θ)后线性组合得到的。其他的神经元的计算公式也都可以类推得到。

         这样,就可以前向传播的方式,根据输入的样本若干个x,最终得到输出的h(x)的式子。

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

2、BP

         BP是反向的求解过程,目的是求得代价函数J的每个偏导数。前面一层的每个神经元的偏导数,都是由后面一层推导出来的。

         这也是反向传播速度较快的一个原因。由于前面一层的神经元,都需要用到后面一层的每个神经元的偏倒公式,而反向传播,相当于把后一层的每个神经元的偏导数的结果,直接保存在当个神经元中,前面一层的神经元计算偏差的时候,只要直接拿过来乘就可以,不需要再次计算偏导数。

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

四、梯度检验

         梯度检验(gradient checking),目的是为了校验BP算法的准确性,其本质是采用另一种方式来计算偏导数。这个计算方式速度很慢,因此仅仅用于校验,确认无误后通常不会在代码执行过程中再次执行这个校验。

         梯度检验的求偏倒方式,采用最初的偏导数的定义,即横坐标变化了一个微小的值时,求出纵坐标的变化程度,以及两者的商,即为倒数。

         这里ε采用很小的一个数,如10-4,另外采用的是两倍的ε,称为双侧拆分求导,这种方式求得的结果比单侧拆分(下图打叉部分)精确度要高。

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

         对于多个变量,则每个遍量去求偏倒,公式如下:

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

         求得这些偏倒后,再与BP算法求得的D进行比较,如果相近则表示结果一致。

         需要注意的是,这种算法计算量非常大,速度很慢,因此仅仅作为校验,校验完后真正上线的代码不能执行这个内容。

 

五、随机初始化

         使用梯度下降,涉及到初始点在哪的问题。神经网络初始不能所有θ都为0,求证过程如下:

         如果初始θ都为0,则所有的输入变量xi都对后面的隐藏神经元不起作用,会导致所有的隐藏神经元结果都一样。递推下去,每次循环的时候都会求得一样的隐藏神经元,最终所有的θ都会是一样的。这是不正确的。

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

         为了解决此问题,神经网络里面采用了随机初始化(random initialization)方法,即初始的时候,另每个θ的范围都在一个很小的正负ε之间。这个ε和上面梯度检验的ε没有任何关系,只是符号一样,都表示一个很小的数而已。

 ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化

 

 

六、小结

         要获得可靠的神经网络,分为两大步骤:确定神经网络的架构、训练神经网络。

1、确定神经网络的架构

         架构的意思是神经网络的连接模式,根据输入样本特征值x的个数、输出的种类数,需要确定隐藏层的数量。

         通常,每个隐藏层的神经元数量都一致,且稍大于特征值数量;另外,隐藏层数量通常越多越好,但是太多隐藏层会导致计算量太大。

         另外需要注意的是,多个结果时,表示方式和平时不太一样。例如,y的结果范围在0~5,则表示y=2,用的是矩阵y=[0 1 0 0 0]T来表示。

2、训练神经网络

         步骤如下:

         1)随机初始化所有的权重θ。

         2)执行前向传播(FP算法),得到关于x的式子h(x)。

         3)计算代价函数J(θ)。

         4)执行后向传播(BP算法),计算J(θ)的偏导数。这里BP算法,目的即在于确认梯度下降算法的最佳的下降方向。

         5)梯度检验法检查后向传播结果的正确性,检查完后删除梯度检验法相关的代码。

         6)使用梯度下降或者其他高级算法,配合BP算法,得到最小化的J(θ)。这里得到的J(θ)是非凸函数(non-convex),即其存在多个极小值,因此梯度下降算法只能求得其中的一个局部最小值,但是正确运用BP算法,这个对结果影响不大。

 

七、个人感悟

1、关于BP算法

         神经网络的BP算法感觉还是比较复杂,学习的过程中感觉没完全学懂BP算法,里面的部分公式为什么那么列。但是我决定先往后学,让自己对机器学习有个更全面的认识。后面有打算学深度学习,到时候会继续研究这个算法的。

2、其他

         神经网络实际上像是编程实现一系列的黑盒子,然后让代码通过输入后的一系列处理,得到输出值。目前先这么理解,不会那么的抽象。

 

——written by linhxx

 

更多最新文章,欢迎关注微信公众号“决胜机器学习”,或扫描右边二维码。ng机器学习视频笔记(七)  ——神经网络的代价函数、反向传播、梯度检验、随机初始化