机器学习(十二) ——神经网络代价函数、反向传播、梯度检验、随机初始化

机器学习(十二)——神经网络代价函数、反向传播、梯度检验、随机初始化

(原创内容,转载请注明来源,谢谢)

一、代价函数

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

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

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

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

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

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

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

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

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

三、进一步分析FP与BP

1、FP

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

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

2、BP

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

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

四、梯度检验

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

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

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

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

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

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

五、随机初始化

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

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

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

六、小结

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

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 2018.01.10

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2018-01-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

机器学习(7) -- k-means 聚类

根据大家的提议,从今天起每次算法介绍完之后会给大家一个用python编写的实例刚打架参考 Clustering  9. Clustering     9.1...

3265
来自专栏人工智能

机器学习的第一步:先学会这6种常用算法

【IT168 资讯】机器学习领域不乏算法,但众多的算法中什么是最重要的?哪种是最适合您使用的?哪些又是互补的?使用选定资源的最佳顺序是什么?今天笔者就带大家一起...

17510
来自专栏算法channel

机器学习之线性回归:算法兑现为python代码

? 前面三天推送机器学习线性回归算法之最小二乘法,从假设到原理,详细分析了直接求解和梯度下降两种算法,接下来手动编写python代码实现线性回归的算法吧。 0...

3369
来自专栏码农笔录

BP神经网络基础算法

1225
来自专栏世界第一语言是java

BP神经网络基础算法

1763
来自专栏机器学习算法全栈工程师

Logistic回归基础篇之梯度上升算法

作者:崔家华 编辑:赵一帆 一、前言 本文从Logistic回归的原理开始讲起,补充了书上省略的数学推导。本文可能会略显枯燥,理论居多,Skle...

2744
来自专栏Pytorch实践

Pytorch实现Logistic回归二分类

? 摘要:本文主要介绍使用深度学习框架Pytorch实现简单的Logistic回归模型,进而实现简单的分类问题。 一.逻辑回归简述 逻辑回归实质上是线性回...

65014
来自专栏Bingo的深度学习杂货店

使用Tensorflow实现一个简单的神经网络

输入层、隐藏层、输出层的数目分别为2、3、1; 隐藏层和输出层的激活函数使用的是 ReLU; 训练的样本总数为 512,每次迭代读取的批量为 10; 交叉熵为损...

2424
来自专栏企鹅号快讯

机器学习(三)——k-近邻算法基础

机器学习(三) ——k-近邻算法基础 (原创内容,转载请注明来源,谢谢) 一、概述 k近邻算法(kNN),是监督学习的一种,主要用于分类,通过测量不同特征值之间...

18610
来自专栏企鹅号快讯

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

机器学习(十二) ——神经网络代价函数、反向传播、梯度检验、随机初始化 (原创内容,转载请注明来源,谢谢) 一、代价函数 同其他算法一样,为了获得最优化的神经网...

2327

扫描关注云+社区