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

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

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

一、代价函数

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

神经网络的输出的结果有两类,一类是只有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 条评论
登录 后参与评论

相关文章

来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4469
来自专栏刘君君

JDK8的HashMap源码学习笔记

3008
来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3417
来自专栏计算机视觉与深度学习基础

Leetcode 114 Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place. For example, Given...

1928
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1192
来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

402
来自专栏Phoenix的Android之旅

Java 集合 Vector

List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全...

642
来自专栏xingoo, 一个梦想做发明家的程序员

AOV网络拓扑排序

这个算法,主要是为输出一个无环图的拓扑序列 算法思想: 主要依赖一个栈,用来存放没有入度的节点,每次读取栈顶元素,并将栈顶元素的后继节点入度减一,如果再次出现入...

1955
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

2507
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1434

扫码关注云+社区