diff --git a/README.md b/README.md index c3dbd5a..49a0c02 100644 --- a/README.md +++ b/README.md @@ -74,17 +74,17 @@ This work is licensed under a [Creative Commons Attribution-NonCommercial 4.0 In -[知乎文章][zhihu] +Copyright © Scruel. All Rights Reserved. -By: Scruel +[知乎文章][zhihu] [zhihu]: https://zhuanlan.zhihu.com/p/32781741 [baidupan]: https://pan.baidu.com/s/1mkmnRIC -[bilibili_zh]: http://www.bilibili.com/video/av9912938?bbid=F8173D95-FF96-47EF-B7F4-0779D698B8051978infoc -[bilibili_en1]: https://www.bilibili.com/video/av17624209/?from=search&seid=15848135050308500663 -[bilibili_en2]: https://www.bilibili.com/video/av17624412/?from=search&seid=15848135050308500663 +[bilibili_zh]: http://www.bilibili.com/video/av9912938 +[bilibili_en1]: https://www.bilibili.com/video/av17624209 +[bilibili_en2]: https://www.bilibili.com/video/av17624412/ [GitHub with MathJax]: https://chrome.google.com/webstore/detail/ioemnmodlmafdkllaclgeombjnmnbima [Typora]: https://typora.io/ [honor code]: https://www.coursera.org/learn/machine-learning/supplement/nh65Z/machine-learning-honor-code diff --git a/week4.html b/week4.html index 1870ebd..e217e5a 100644 --- a/week4.html +++ b/week4.html @@ -2,7 +2,7 @@
-8 神经网络:表达(Neural Networks: Representation)8.1 非线性假设(Non-linear Hypotheses)8.2 神经网络和大脑(Neurons and the Brain)8.3 模型表示1(Model Representation I)8.4 模型表示2(Model Representation II)8.5 例子和直观理解1(Examples and Intuitions I)8.6 例子和直观理解2(Examples and Intuitions II)8.7 多类别分类(Multiclass Classification)
理论上我们可以用多项式函数去近似任意函数(泰勒极数(Taylor series)),从而可得到任意问题的拟合曲线。
在实际处理时,特征量通常会很多,如果再构造高阶多项式等,特征数量将会急剧增加,这使得回归模型的复杂度太高,可见并不合适。神经网络无需构造高阶多项式,在特征量很大时也可以处理的很好。
那特征能有多大呢?下面是一个计算机视觉中的例子:

如上图,如果选取一小块 像素的灰度图片(一个像素只有亮度一个值),选择每个像素点作为特征,则特征总量 (换成 RGB(一个像素有三个值),则 ),如果将其两两组合作为新特征,则特征数量将为 。
脑科学家通过对动物实验,发现大脑中专用于处理听觉信号的脑皮层也能处理其他诸如视觉等信号,即如果切断其与耳朵的联系,将其与眼睛相连,则这块负责听觉的脑皮层区域也能接受并处理视觉信号,从而学会“看”。脑科学家通过这类换源实验,就推论假设大脑的学习算法只有一种(“one learning algorithm” hypothesis)。那么如果能找出这种学习算法并应用于计算机中,那梦想中和人一样的人工智能就成真了。
神经网络就源于模拟人类大脑,但其需要的计算量很大。随着计算机硬件性能的提高,神经网络逐渐从衰落变为流行,如今已广泛地被应用在各行各业中。
下图是根据研究做的一些应用(有兴趣可回顾视频):

BrainPort 系统:帮助失明人士通过摄像头以及舌尖感官“看”东西

触觉皮带:在朝北时蜂鸣器会发出声响,可使人拥有方向感(声音信号转换为方向信号)。
既然神经网络模仿的是大脑神经元,那就先看一下大脑的神经元长什么样吧:

想象一下印刷厂中流水线的工人(机器人也算哦),每个工人都有特定的任务,比如装订,塑封,贴防伪标识等等,工人们看到书本并处理完自己的任务后,就回放回传送带,紧接着传送带就传给下一个环节的工人,如此不断重复从而完成一个又一个环节,直到一本书印制完成。
那么类比一下,把上图中的细胞核(nucleus)类比成工人,轴突(axon)类比传送带,树突(dendrite)则比类比成工人的双眼。一个又一个细胞体,从树突接收需要处理的信息,对其进行处理后,再经由轴突通过电信号把处理完的信息传递出去,直到理解信息的内容。当然啦,我们大脑的实际上还要更为复杂,而且一个人的神经元数目就比地球上所有流水线的工人之和还要多呢~
人工神经网络中,树突对应输入(input),细胞核对应激活单元(activation unit),轴突对应输出(output)。
我们一般把神经网络划分为三部分(注意,不是只有三层!),即输入层(input layer),隐藏层(hidden layer)和输出层(output layer)。

图中的一个圈表示神经网络中的一个激活单元,输入层对应输入单元,隐藏层对应中间单元,输出层则对应输出单元。中间激活单元应用激活函数(activation_function)处理数据。
下面列出一些已有概念在神经网络中的别称:
: 第 层的第 个激活单元
: 从第 层映射到第 层时的权重矩阵。
: 从第 层的第 个单元映射到第 层的第 个单元的权重
: 第 层的激活单元数目(不包含偏置单元)
注意:
依据本节所给模型,有:

对第 层的所有激活单元应用激活函数,从而得到第 层激活单元的值:
对第 层的所有激活单元应用激活函数,从而得到输出:
上面的计算过程被称为前向传播(Forward propagation),即从输入层开始,一层一层地向下计算并传递结果。
再回顾一下逻辑回归:
是不是除了符号表示,其他都完全一样?其实神经网络就好似回归模型,只不过输入变成了中间单元 。从输入 开始,下一层的每个激活单元都包含了上一层的所有信息(单元值),通过最优化算法不断迭代计算,激活单元能得出关于输入 的更多信息,这就好像是在给假设函数加多项式。隐藏层的这些单元好似升级版的初始特征,从而能给出更好的预测。
向量化实现
定义 ,,
,
则有
预测结果即
即有 ,
,,通过该式即可计算神经网络中每一层的值。
扩展到所有样本实例:
,这时 是一个 维矩阵。
: 训练集中的样本实例数量
: 第二层神经网络中激活单元的数量
当然,神经网络不仅限于三层,每层的激活单元数量也并不固定:

为了更好的理解神经网络,举例单层神经网络进行逻辑运算的例子。
下面的例子中, 为二进制数。
逻辑与(AND)运算(都为真值则结果才为真)神经网络:

,。
回顾 sigmoid 函数图像,根据输入则有上图中右边的表格,即 。这样就实现了一个能够进行与运算的神经网络。

再举一例,逻辑或(OR)运算(有一个真值则结果就为真)神经网络:

下面逐步构建复杂一点的神经网络

如上图,我们分别构建了三个单层神经网络,将这三个网络组合起来,可得到一个新的神经网络,其可完成逻辑运算中的异或(XNOR)操作:

这里的组合即为
,,
可见,特征值能不断升级,并抽取出更多信息,直到计算出结果。而如此不断组合,我们就可以逐渐构造出越来越复杂、强大的神经网络,比如用于手写识别的神经网络。
之前讨论的都是预测结果为单值情况下的神经网络,要实现多类别分类,其实只要修改一下输出层,让输出层包含多个输出单元即可。
举一个 4 分类问题的实例:

有四种分类情况,那么就让输出层包含 4 个输出单元即可,则 为 4 维向量。
神经网络中的多分类算法算是对 one-vs-all 思想的扩展,定义预测结果一共有 4 种情况:

如果预测结果 ,那么表示 ,即分为第 3 类,对应于图中的摩托车(Motorcycle)。
总结一下
多分类问题,要分为 类,就在输出层放置 个输出单元,对于单个样本实例,预测向量 为 维向量,我们则依据这个预测向量,得出该实例属于哪个类 。注意,神经网络中的预测和结果都是 维向量,而不再只是一个实数了。
8 神经网络:表达(Neural Networks: Representation)8.1 非线性假设(Non-linear Hypotheses)8.2 神经网络和大脑(Neurons and the Brain)8.3 模型表示1(Model Representation I)8.4 模型表示2(Model Representation II)8.5 例子和直观理解1(Examples and Intuitions I)8.6 例子和直观理解2(Examples and Intuitions II)8.7 多类别分类(Multiclass Classification)
理论上我们可以用多项式函数去近似任意函数(泰勒极数(Taylor series)),从而可得到任意问题的拟合曲线。
在实际处理时,特征量通常会很多,如果再构造高阶多项式等,特征数量将会急剧增加,这使得回归模型的复杂度太高,可见并不合适。神经网络无需构造高阶多项式,在特征量很大时也可以处理的很好。
那特征能有多大呢?下面是一个计算机视觉中的例子:

如上图,如果选取一小块 像素的灰度图片(一个像素只有亮度一个值),选择每个像素点作为特征,则特征总量 (换成 RGB(一个像素有三个值),则 ),如果将其两两组合作为新特征,则特征数量将为 。
脑科学家通过对动物实验,发现大脑中专用于处理听觉信号的脑皮层也能处理其他诸如视觉等信号,即如果切断其与耳朵的联系,将其与眼睛相连,则这块负责听觉的脑皮层区域也能接受并处理视觉信号,从而学会“看”。脑科学家通过这类换源实验,就推论假设大脑的学习算法只有一种(“one learning algorithm” hypothesis)。那么如果能找出这种学习算法并应用于计算机中,那梦想中和人一样的人工智能就成真了。
神经网络就源于模拟人类大脑,但其需要的计算量很大。随着计算机硬件性能的提高,神经网络逐渐从衰落变为流行,如今已广泛地被应用在各行各业中。
下图是根据研究做的一些应用(有兴趣可回顾视频):

BrainPort 系统:帮助失明人士通过摄像头以及舌尖感官“看”东西

触觉皮带:在朝北时蜂鸣器会发出声响,可使人拥有方向感(声音信号转换为方向信号)。
既然神经网络模仿的是大脑神经元,那就先看一下大脑的神经元长什么样吧:

想象一下印刷厂中流水线的工人(机器人也算哦),每个工人都有特定的任务,比如装订,塑封,贴防伪标识等等,工人们看到书本并处理完自己的任务后,就回放回传送带,紧接着传送带就传给下一个环节的工人,如此不断重复从而完成一个又一个环节,直到一本书印制完成。
那么类比一下,把上图中的细胞核(nucleus)类比成工人,轴突(axon)类比传送带,树突(dendrite)则比类比成工人的双眼。一个又一个细胞体,从树突接收需要处理的信息,对其进行处理后,再经由轴突通过电信号把处理完的信息传递出去,直到理解信息的内容。当然啦,我们大脑的实际上还要更为复杂,而且一个人的神经元数目就比地球上所有流水线的工人之和还要多呢~
人工神经网络中,树突对应输入(input),细胞核对应激活单元(activation unit),轴突对应输出(output)。
我们一般把神经网络划分为三部分(注意,不是只有三层!),即输入层(input layer),隐藏层(hidden layer)和输出层(output layer)。

图中的一个圈表示神经网络中的一个激活单元,输入层对应输入单元,隐藏层对应中间单元,输出层则对应输出单元。中间激活单元应用激活函数(activation_function)处理数据。
下面列出一些已有概念在神经网络中的别称:
: 第 层的第 个激活单元
: 从第 层映射到第 层时的权重矩阵。
: 从第 层的第 个单元映射到第 层的第 个单元的权重
: 第 层的激活单元数目(不包含偏置单元)
注意:
依据本节所给模型,有:

对输入层(Layer 1)的所有激活单元应用激活函数,从而得到隐藏层(Layer 2)中激活单元的值:
对 Layer 2 中的所有激活单元应用激活函数,从而得到输出:
上面的计算过程被称为前向传播(Forward propagation),即从输入层开始,一层一层地向下计算并传递结果。
再回顾一下逻辑回归:
是不是除了符号表示,其他都完全一样?其实神经网络就好似回归模型,只不过输入变成了中间单元 。从输入 开始,下一层的每个激活单元都包含了上一层的所有信息(单元值),通过最优化算法不断迭代计算,激活单元能得出关于输入 的更多信息,这就好像是在给假设函数加多项式。隐藏层的这些单元好似升级版的初始特征,从而能给出更好的预测。
向量化实现
定义 ,,
,
则有
预测结果即
即有 ,
,,通过该式即可计算神经网络中每一层的值。
扩展到所有样本实例:
,这时 是一个 维矩阵。
: 训练集中的样本实例数量
: 第二层神经网络中激活单元的数量
当然,神经网络可有多层,每层的激活单元数量也并不固定:

我们习惯于将输入层称为神经网络的第 0 层,如上图的神经网络被称为三层网络。
为了更好的理解神经网络,举例单层神经网络进行逻辑运算的例子。
下面的例子中, 为二进制数。
逻辑与(AND)运算(都为真值则结果才为真)神经网络:

,。
回顾 sigmoid 函数图像,根据输入则有上图中右边的表格,即 。这样就实现了一个能够进行与运算的神经网络。

再举一例,逻辑或(OR)运算(有一个真值则结果就为真)神经网络:

下面逐步构建复杂一点的神经网络

如上图,我们分别构建了三个单层神经网络,将这三个网络组合起来,可得到一个新的神经网络,其可完成逻辑运算中的异或(XNOR)操作:

这里的组合即为
,,
可见,特征值能不断升级,并抽取出更多信息,直到计算出结果。而如此不断组合,我们就可以逐渐构造出越来越复杂、强大的神经网络,比如用于手写识别的神经网络。
之前讨论的都是预测结果为单值情况下的神经网络,要实现多类别分类,其实只要修改一下输出层,让输出层包含多个输出单元即可。
举一个 4 分类问题的实例:

有四种分类情况,那么就让输出层包含 4 个输出单元即可,则 为 4 维向量。
神经网络中的多分类算法算是对 one-vs-all 思想的扩展,定义预测结果一共有 4 种情况:

如果预测结果 ,那么表示 ,即分为第 3 类,对应于图中的摩托车(Motorcycle)。
总结一下
多分类问题,要分为 类,就在输出层放置 个输出单元,对于单个样本实例,预测向量 为 维向量,我们则依据这个预测向量,得出该实例属于哪个类 。注意,神经网络中的预测和结果都是 维向量,而不再只是一个实数了。
9 神经网络: 学习(Neural Networks: Learning)9.1 代价函数(Cost Function)9.2 反向传播算法(Backpropagation Algorithm)9.3 直观理解反向传播(Backpropagation Intuition)9.4 实现注意点: 参数展开(Implementation Note: Unrolling Parameters)9.5 梯度检验(Gradient Checking)9.6 随机初始化(Random Initialization)9.7 综合起来(Putting It Together)9.8 自主驾驶(Autonomous Driving)
神经网络的分类问题有两种:
二元分类问题(0/1分类)
只有一个输出单元 ()
多元()分类问题
输出单元不止一个()
神经网络的代价函数公式:
: 神经网络的总层数
: 第 层激活单元的数量(不包含偏置单元)
: 分为第 个分类()的概率
: 输出层的输出单元数量,即类数 - 1
: 第 个训练样本的第 个分量值
: 维向量
注:此处符号表达和第四周的内容有异有同,暂时先按照视频来,有必要的话可以做下统一.
公式可长可长了是吧,但是不是有些熟悉?对照下逻辑回归中的代价函数:
在神经网络的代价函数中,
: 即 维向量
: 即 维矩阵
再次可见,神经网络背后的思想是和逻辑回归一样的,但由于计算复杂,实际上神经网络的代价函数 是一个非凸(non-convex)函数。
类似于回归模型中的梯度下降算法,为了求解神经网络最优化问题,我们也要计算 ,以此 。
在神经网络中,代价函数看上去虽然不复杂,但要注意到其中 的求取实际上是由前向传播算法求得,即需从输入层开始,根据每层间的权重矩阵 依次计算激活单元的值 。 在最优化代价函数时,我们必然也需要最优化每一层的权重矩阵,再次强调一下,算法最优化的是权重,而不是输入。

反向传播算法用于计算每一层权重矩阵的偏导 ,算法实际上是对代价函数求导的拆解。
对于给定训练集 ,初始化每层间的误差和矩阵 ,即令所有的 ,使得每个 为一个全零矩阵。
接下来遍历所有样本实例,对于每一个样本实例,有下列步骤:
运行前向传播算法,得到初始预测 。
运行反向传播算法,从输出层开始计算每一层预测的误差(error),以此来求取偏导。

输出层的误差即为预测与训练集结果的之间的差值:,
对于隐藏层中每一层的误差,都通过上一层的误差来计算:
隐藏层中, 即为增加偏置单元后的 , 与 维度匹配,得以完成矩阵运算。
即对于隐藏层,有 添加偏置单元
解得 ,
则有 。
求导前的公式不同于视频内容,经核实为视频内容错误。推导请阅下节。
根据以上公式计算依次每一层的误差 。
依次求解并累加误差 ,向量化实现即
遍历全部样本实例,求解完 后,最后则求得偏导
: 第 层的误差向量
: 第 层的第 个激活单元的误差
: 从第 层的第 个单元映射到第 层的第 个单元的权重代价的偏导(所有样本实例之和)
: 的样本均值与正则化项之和
注:无需计算 ,因为输入没有误差。
这就是反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。
应用反向传播(BP)算法的神经网络被称为 BP 网络,也称前馈网络(向前反馈)。
《机器学习》一书中提到的 BP 网络强大之处:
任何布尔函数都可由两层神经网络准确表达,但所需的中间单元的数量随输入呈指数级增长;
任何连续函数都可由两层神经网络以任意精度逼近;
任何函数都可由三层神经网络以任意程度逼近。
这节给出了反向传播算法中误差的数学意义:
视频内容实际在上文都涉及到了,上节也做了解释:
反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。
不过,这块还是有些不好理解,可回顾视频。
前文提到输入层没有偏差,所以没有 ,同样的,偏置单元的值始终为 1,也没有误差,故一般会选择忽略偏置单元项的误差。
神经网络中代价函数求导的推导过程:
代价函数无正则化项时:
再次的,为了方便起见,这里假设样本只有一个,则有:
忆及 ,,代入后整理后可得:

再次为了便于计算,我们用到如上图这个四层神经网络。
忆及 ,我们有
观察考虑各变量与 之间的关系,有
要计算 的偏导,就要按照关系不断往前看,每一次回头看,就称为一次反向传播。
把回头看的关系说的“微积分一点”,那就是 的微小改变会引起 的改变, 的微小改变会引起 的改变, 的微小改变又会引起 的改变,关系方向也可以反过来写:。
如果你还记得微积分(不然你应该也不会看到这里(*^_^*)~),听起来像不像在暗示链式求导?
令 ,则有 关于 的偏导:
再次忆及 ,则
则对于输出层,我们证得 。
再次忆及 ,
即证得
对于任意的输出层 及 ,有 关系不变,故证得:
好了,接下来来看一下 关于 的偏导
仍然观察考虑各变量与 之间的关系,有
易求得
即
有 添加偏置单元 ,则 ,
证明时为先求导后添加偏置单元,与前向传播算法顺序一致,实际实现时,求导和添加偏置单元的顺序可作调换,由于一般选择忽略偏置单元的误差,所以并不影响结果。
即证得
对于任意的隐藏层 及权重矩阵 ,有 关系不变,故证得:
再添回为了计算方便去掉的 和正则化项(时刻记住偏置单元不正则化)等,即可得上节中 的偏导。
证明结束,留个课后作业呀,自己来计算一下 关于 的偏导,是不是能得到同样的结果?
在 Octave/Matlab 中,如果要使用类似于 fminunc 等高级最优化函数,其函数参数、函数返回值等都为且只为向量,而由于神经网络中的权重是多维矩阵,所以需要用到参数展开这个技巧。
说白了,这个技巧就是把多个矩阵转换为一个长长的向量,便于传入函数,之后再根据矩阵维度,转回矩阵即可。
Octave/Matlab 代码:
xxxxxxxxxx91% 多个矩阵展开为一个向量2Theta1 = ones(11, 10); % 创建维度为 11 * 10 的矩阵3Theta2 = ones(2, 4) * 2; % 创建维度为 2 * 4 的矩阵4ThetaVec = [Theta1(:); Theta2(:)]; % 将上面两个矩阵展开为向量56% 从一个向量重构还原回多个矩阵7Theta1 = reshape(ThetaVec(1:110), 11, 10)8Theta2 = reshape(ThetaVec(111:118), 2, 4)9% Theta2 = reshape(ThetaVec(111:(111 + 2 * 4) - 1), 2, 4)
reshape(A,m,n): 将向量 A 重构为 m * n 维矩阵。
由于神经网络模型中的反向传播算法较为复杂,在小细节非常容易出错,从而无法得到最优解,故引入梯度检验。
梯度检验采用数值估算(Numerical estimation)梯度的方法,被用于验证反向传播算法的正确性。

把视 为一个实数,数值估算梯度的原理如上图所示,即有
其中, 为极小值,由于太小时容易出现数值运算问题,一般取 。
对于矩阵 ,有
Octave/Matlab 代码:
xxxxxxxxxx81epsilon = 1e-4;2for i = 1:n,3 thetaPlus = theta;4 thetaPlus(i) += epsilon;5 thetaMinus = theta;6 thetaMinus(i) -= epsilon;7 gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon);8end在得出 gradApprox 梯度向量后,将其同之前计算的偏导 比较,如果相等或很接近,即说明算法没有问题。
在确认算法没有问题后(一般只需运行一次),由于数值估计的梯度检验效率很低,所以一定要禁用它。
逻辑回归中,初始参数向量全为 0 没什么问题,在神经网络中,情况就不一样了。
初始权重如果全为 0,忆及 ,则隐藏层除了偏置单元,都为 0,而每个单元求导的值也都一样,这就相当于是在不断重复计算同一结果,也就是算着算着,一堆特征在每一层都变成只有一个特征(虽然有很多单元,但值都相等),这样,神经网络的性能和效果都会大打折扣,故需要随机初始化初始权重。
随机初始化权重矩阵也为实现细节之一,用于打破对称性(Symmetry Breaking),使得 。
Octave/Matlab 代码:
当然,初始权重的波动也不能太大,一般限定在极小值 范围内,即 。
xxxxxxxxxx51If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.23Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;4Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;5Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
rand(m,n): 返回一个在区间 (0,1) 内均匀分布的随机矩阵。: 和梯度下降中的 没有联系,这里只是一个任意实数,给定了权重矩阵初始化值的范围。
一般来说,应用神经网络有如下步骤:
神经网络的建模(后续补充)
默认情况下,隐藏层至少要有一层,也可以有多层,层数越多一般意味着效果越好,计算量越大。
训练神经网络
随机初始化初始权重矩阵
应用前向传播算法计算初始预测
计算代价函数 的值
应用后向传播宣发计算 的偏导数
使用梯度检验检查算法的正确性,别忘了用完就禁用它
丢给最优化函数最小化代价函数
由于神经网络的代价函数非凸,最优化时不一定会收敛在全局最小值处,高级最优化函数能确保收敛在某个局部最小值处。

描述了神经网络在于自动驾驶领域的应用实例,用于打鸡血,笔记略。
9 神经网络: 学习(Neural Networks: Learning)9.1 代价函数(Cost Function)9.2 反向传播算法(Backpropagation Algorithm)9.3 直观理解反向传播(Backpropagation Intuition)9.4 实现注意点: 参数展开(Implementation Note: Unrolling Parameters)9.5 梯度检验(Gradient Checking)9.6 随机初始化(Random Initialization)9.7 综合起来(Putting It Together)9.8 自主驾驶(Autonomous Driving)
神经网络的分类问题有两种:
二元分类问题(0/1分类)
只有一个输出单元 ()
多元()分类问题
输出单元不止一个()
神经网络的代价函数公式:
: 神经网络的总层数
: 第 层激活单元的数量(不包含偏置单元)
: 分为第 个分类()的概率
: 输出层的输出单元数量,即类数 - 1
: 第 个训练样本的第 个分量值
: 维向量
注:此处符号表达和第四周的内容有异有同,暂时先按照视频来,有必要的话可以做下统一.
公式可长可长了是吧,但是不是有些熟悉?对照下逻辑回归中的代价函数:
在神经网络的代价函数中,
: 即 维向量
: 即 维矩阵
再次可见,神经网络背后的思想是和逻辑回归一样的,但由于计算复杂,实际上神经网络的代价函数 是一个非凸(non-convex)函数。
类似于回归模型中的梯度下降算法,为了求解神经网络最优化问题,我们也要计算 ,以此 。
在神经网络中,代价函数看上去虽然不复杂,但要注意到其中 的求取实际上是由前向传播算法求得,即需从输入层开始,根据每层间的权重矩阵 依次计算激活单元的值 。 在最优化代价函数时,我们必然也需要最优化每一层的权重矩阵,再次强调一下,算法最优化的是权重,而不是输入。

反向传播算法用于计算每一层权重矩阵的偏导 ,算法实际上是对代价函数求导的拆解。
对于给定训练集 ,初始化每层间的误差和矩阵 ,即令所有的 ,使得每个 为一个全零矩阵。
接下来遍历所有样本实例,对于每一个样本实例,有下列步骤:
运行前向传播算法,得到初始预测 。
运行反向传播算法,从输出层开始计算每一层预测的误差(error),以此来求取偏导。

输出层的误差即为预测与训练集结果的之间的差值:,
对于隐藏层中每一层的误差,都通过上一层的误差来计算:
隐藏层中, 即为增加偏置单元后的 , 与 维度匹配,得以完成矩阵运算。
即对于隐藏层,有 添加偏置单元
解得 ,
则有 。
求导前的公式不同于视频内容,经核实为视频内容错误。推导请阅下节。
根据以上公式计算依次每一层的误差 。
依次求解并累加误差 ,向量化实现即
遍历全部样本实例,求解完 后,最后则求得偏导
: 第 层的误差向量
: 第 层的第 个激活单元的误差
: 从第 层的第 个单元映射到第 层的第 个单元的权重代价的偏导(所有样本实例之和)
: 的样本均值与正则化项之和
注:无需计算 ,因为输入没有误差。
这就是反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。
应用反向传播(BP)算法的神经网络被称为 BP 网络,也称前馈网络(向前反馈)。
《机器学习》一书中提到的 BP 网络强大之处:
任何布尔函数都可由两层神经网络准确表达,但所需的中间单元的数量随输入呈指数级增长;
任何连续函数都可由两层神经网络以任意精度逼近;
任何函数都可由三层神经网络以任意程度逼近。
这节给出了反向传播算法中误差的数学意义:
视频内容实际在上文都涉及到了,上节也做了解释:
反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。
不过,这块还是有些不好理解,可回顾视频。
前文提到输入层没有偏差,所以没有 ,同样的,偏置单元的值始终为 1,也没有误差,故一般会选择忽略偏置单元项的误差。
神经网络中代价函数求导的推导过程:
代价函数无正则化项时:
再次的,为了方便起见,这里假设样本只有一个,则有:
忆及 ,,代入后整理后可得:

再次为了便于计算,我们用到如上图这个三层(输入层一般不计数)神经网络。
忆及 ,我们有
观察考虑各变量与 之间的关系,有
要计算 的偏导,就要按照关系不断往前看,每一次回头看,就称为一次反向传播。
把回头看的关系说的“微积分一点”,那就是 的微小改变会引起 的改变, 的微小改变会引起 的改变, 的微小改变又会引起 的改变,关系方向也可以反过来写:。
如果你还记得微积分(不然你应该也不会看到这里(*^_^*)~),听起来像不像在暗示链式求导?
令 ,则有 关于 的偏导:
再次忆及 ,则
则对于输出层,我们证得 。
再次忆及 ,
即证得
对于任意的输出层 及 ,有 关系不变,故证得:
好了,接下来来看一下 关于 的偏导
仍然观察考虑各变量与 之间的关系,有
易求得
即
有 添加偏置单元 ,则 ,
证明时为先求导后添加偏置单元,与前向传播算法顺序一致,实际实现时,求导和添加偏置单元的顺序可作调换,由于一般选择忽略偏置单元的误差,所以并不影响结果。
即证得
对于任意的隐藏层 及权重矩阵 ,有 关系不变,故证得:
再添回为了计算方便去掉的 和正则化项(时刻记住偏置单元不正则化)等,即可得上节中 的偏导。
证明结束,留个课后作业呀,自己来计算一下 关于 的偏导,是不是能得到同样的结果?
在 Octave/Matlab 中,如果要使用类似于 fminunc 等高级最优化函数,其函数参数、函数返回值等都为且只为向量,而由于神经网络中的权重是多维矩阵,所以需要用到参数展开这个技巧。
说白了,这个技巧就是把多个矩阵转换为一个长长的向量,便于传入函数,之后再根据矩阵维度,转回矩阵即可。
Octave/Matlab 代码:
xxxxxxxxxx91% 多个矩阵展开为一个向量2Theta1 = ones(11, 10); % 创建维度为 11 * 10 的矩阵3Theta2 = ones(2, 4) * 2; % 创建维度为 2 * 4 的矩阵4ThetaVec = [Theta1(:); Theta2(:)]; % 将上面两个矩阵展开为向量56% 从一个向量重构还原回多个矩阵7Theta1 = reshape(ThetaVec(1:110), 11, 10)8Theta2 = reshape(ThetaVec(111:118), 2, 4)9% Theta2 = reshape(ThetaVec(111:(111 + 2 * 4) - 1), 2, 4)
reshape(A,m,n): 将向量 A 重构为 m * n 维矩阵。
由于神经网络模型中的反向传播算法较为复杂,在小细节非常容易出错,从而无法得到最优解,故引入梯度检验。
梯度检验采用数值估算(Numerical estimation)梯度的方法,被用于验证反向传播算法的正确性。

把视 为一个实数,数值估算梯度的原理如上图所示,即有
其中, 为极小值,由于太小时容易出现数值运算问题,一般取 。
对于矩阵 ,有
Octave/Matlab 代码:
xxxxxxxxxx81epsilon = 1e-4;2for i = 1:n,3 thetaPlus = theta;4 thetaPlus(i) += epsilon;5 thetaMinus = theta;6 thetaMinus(i) -= epsilon;7 gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon);8end在得出 gradApprox 梯度向量后,将其同之前计算的偏导 比较,如果相等或很接近,即说明算法没有问题。
在确认算法没有问题后(一般只需运行一次),由于数值估计的梯度检验效率很低,所以一定要禁用它。
逻辑回归中,初始参数向量全为 0 没什么问题,在神经网络中,情况就不一样了。
初始权重如果全为 0,忆及 ,则隐藏层除了偏置单元,都为 0,而每个单元求导的值也都一样,这就相当于是在不断重复计算同一结果,也就是算着算着,一堆特征在每一层都变成只有一个特征(虽然有很多单元,但值都相等),这样,神经网络的性能和效果都会大打折扣,故需要随机初始化初始权重。
随机初始化权重矩阵也为实现细节之一,用于打破对称性(Symmetry Breaking),使得 。
Octave/Matlab 代码:
当然,初始权重的波动也不能太大,一般限定在极小值 范围内,即 。
xxxxxxxxxx51If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.23Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;4Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;5Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
rand(m,n): 返回一个在区间 (0,1) 内均匀分布的随机矩阵。: 和梯度下降中的 没有联系,这里只是一个任意实数,给定了权重矩阵初始化值的范围。
一般来说,应用神经网络有如下步骤:
神经网络的建模(后续补充)
默认情况下,隐藏层至少要有一层,也可以有多层,层数越多一般意味着效果越好,计算量越大。
训练神经网络
随机初始化初始权重矩阵
应用前向传播算法计算初始预测
计算代价函数 的值
应用后向传播宣发计算 的偏导数
使用梯度检验检查算法的正确性,别忘了用完就禁用它
丢给最优化函数最小化代价函数
由于神经网络的代价函数非凸,最优化时不一定会收敛在全局最小值处,高级最优化函数能确保收敛在某个局部最小值处。

描述了神经网络在于自动驾驶领域的应用实例,用于打鸡血,笔记略。