Coursera 机器学习(by Andrew Ng)课程学习笔记 Week 5——神经网络(二)

此系列为 Coursera 网站机器学习课程个人学习笔记(仅供参考)
课程网址:https://www.coursera.org/learn/machine-learning
参考资料:http://blog.csdn.net/SCUT_Arucee/article/details/50176159


一、神经网络的代价函数

1.1 神经网络的模型参数

假设我们有下图这样的神经网络:

我们定义以下符号:

     m 组训练数据(x(1),y(1))(x(2),y(2))(x(m),y(m))
     L 神经网络总的层数;
     sl l 层的单元数 (不包括偏差单元);
     K 输出层的单元数。

① 对于两类分类问题:
y=0or1 ,只有一个输出单元, hΘ(x)R ,故 SL=1 ,即 K=1
② 对于多类分类问题:
y 是一个向量,yRk hΘ(x)Rk SL=K(K3)


1.2 神经网络的代价函数

我们先来回忆一下逻辑回归代价函数的一般形式:

在此基础上,我们可以得到神经网络的代价函数。对于神经网络来说,输出不再是只有一个逻辑回归输出单元,取而代之的是有 K 个。

定义 hΘ(x)i hΘ(x) 的第 i(1iK) 个输出:

注意:
两个求和符号是将输出层每一个神经元的逻辑回归代价相加起来;
三个求和符号是将整个网络中所有参数 Θ (除去偏置单元的)的平方相加起来(下标从1开始)。

三个求和符号部分中的参数解释:
l 用于控制层数,即Θ(l) 是第 l 层到第 l+1 层的权重矩阵; i 用于控制 Θ(l) 当前所在的行; j 用于控制Θ(l) 当前所在的列。注意这里 j 1 开始取,因为 Θ(l) 每一行的第一个元素( j=0 的列)都是偏差项,我们不正则化偏差项。


二、反向传播(Backpropagation)

2.1 误差的计算

我们接下来介绍一种反向传播的算法来最小化神经网络的代价函数。
使用梯度下降或其他算法某种高级优化算法求 minΘJ(Θ) ,都需要我们自行给出 J(Θ) Θ(l)i,jJ(Θ) 的代码。
J(Θ) 我们上面已经给出了计算公式,接下来主要来看偏导项怎么求。

为了简便,我们假设只有一个训练样本 (x,y)
下图所示为前向传播的计算过程,我们先来看看前向传播的输出结果:

对每一个结点我们需要计算它们的误差, δ(l)j ,表示第 l 层第 j 个结点的误差。
上图例子中神经网络一共有4层,对于每一个输出单元( l=4 ):

δ(4)j=a(4)jyj

其中, a(4)j 是第4层第 j 个结点的激励值,也可以写作 (hΘ(x))j yj 是训练样本的真实值。我们也可以将 δ(4) a(4) y 看作向量(维数都等于输出单元的个数),上面的式子改写为:

δ(4)=a(4)y

得到 δ(4) 以后,我们需要依次计算前面几层的误差项,计算公式如下:

δ(3)=(Θ(3))Tδ(4).g(z(3))
δ(2)=(Θ(2))Tδ(3).g(z(2))

这里 . (element-wise multiplication )就是matlab里的点乘,指的是向量(矩阵)中的元素对应相乘。后面的 g(z(l)) 导数项算出来的结果就是 a(l).(1a(l))

第一层是输入层,不会存在误差,我们并不想改变这些值,所以我们只计算到 δ(2)
这样,我们就通过输出层的误差 δ(4) 得到第三层的误差项,再利用第三层的误差项得到第二层的,也就是相当于我们将输出层的误差反向传播给了第三层,再传播给第二层,这就是反向传播的意思。

我们总结一下反向传播的算法。


2.2 反向传播算法描述

数据集: {(x(1),y(1)),(x(2),y(2)),,(x(m),y(m))}

  • Δ(l)i,j=0 ( for all lij )( Δ δ 的大写形式)

  • 对训练样本 1m

    令 a(1)=x(i)

    利用前向传播计算 a(l) ,其中 l=2,3,,L

    计算输出层(第 L 层)误差 δ(L)=a(L)y(i)

    利用反向传播计算 δ(L1)δ(L2)δ(2) (注意没有 δ(1) );

     Δ(l)i,j:=Δ(l)i,j+a(l)jδ(l+1)i (或用向量化表示, Δ(l):=Δ(l)+δ(l+1)(a(l))T );

  • D(l)i,j:=1m(Δ(l)i,j+λΘ(l)i,j), if j0

  • D(l)i,j:=1mΔ(l)i,j, if j=0

D(l)i,j 即为代价函数的偏导项, Θ(l)i,jJ(Θ)D(l)i,j 。得到偏导项的表达式后就可以将其用于梯度下降或其他的优化算法中了。


2.3 深入理解反向传播

回忆之前神经网络的代价函数:

假设只有一个输出单元( K=1 )的情况,忽略正则化( λ=0 ),对于一个训练样本 (x(t),y(t)) ,则:

更直观来讲, δ(l)j a(l)j (第 l 层第 j 个神经元)的误差,也就是是单个样本的代价 cost(t) 关于这些中间项 z 的偏微分:

回想一下,我们的导数是与代价函数相切的直线的斜率,斜率越陡说明参数设置越不正确。
我们来看下图中的神经网络并理解如何计算 δ(l)j

举例说明,在上图中,为了计算 δ(2)2 的值,我们将权值 Θ(2)12 Θ(2)22 分别与其对应的 δ 值相乘,我们得到: δ(2)2=Θ(2)12δ(3)1+Θ(2)22δ(3)2

如果要得到每一个 δ(l)j 的值,我们可以从右边开始计算。我们可以将每一条连接线看作参数 Θij 。从右向左,计算某一个 δ(l)j ,我们将与之右侧相连所有的权值 Θ 乘以对应的 δ 。例如: δ(3)2=Θ(3)12δ(4)1


三、反向传播算法的实践

3.1 unrolling parameter

这一部分我们会讲一个在实现中需要注意的细节,怎样将矩阵转化为向量,以便高级最优化算法中使用。
在神经网络中,我们经常会对一些矩阵进行处理:

Θ(1),Θ(2),Θ(3),
D(1),D(2),D(3),

为了能够使用优化函数,例如fminunc(),我们会将矩阵展开成一个长长的向量:

thetaVector = [ Theta1(:); Theta2(:); Theta3(:); ]
deltaVector = [ D1(:); D2(:); D3(:) ]

如果Theta1的维数为10x11,Theta2为10x11,Theta3为1x11,则可以从“展开”后的向量获取原始矩阵,如下所示:

Theta1 = reshape(thetaVector(1:110),10,11)
Theta2 = reshape(thetaVector(111:220),10,11)
Theta3 = reshape(thetaVector(221:231),1,11)

3.2 梯度检验(Gradient Checking)

利用前面所说的前向传播和后向传播计算梯度时容易出现一些小错误而不被发现,导致表面上代价函数可能在减小,但你最后得到的结果可能与实际有很大的误差,这时候就需要进行梯度检验来检验我们计算的梯度是否是我们所需要的。

这里需要提出梯度的数值估计这个概念。

如下图所示的函数:

我们想得到 Θ 点函数切线的斜率(如蓝色直线),可以用红色直线的斜率来估计:

ΘJ(Θ)J(Θ+ϵ)J(Θϵ)2ϵ

一般选用 ϵ=104

对于多个 Θ 矩阵,我们可以估计每一个 Θj 的偏导项:

ΘJ(Θj)J(Θ1,,Θj+ϵ,,Θn)(Θ1,,Θjϵ,,Θn)2ϵ

octave的代码如下:

epsilon = 1e-4;
for i = 1:n,
  thetaPlus = theta;
  thetaPlus(i) += epsilon;
  thetaMinus = theta;
  thetaMinus(i) -= epsilon;
  gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;

接下来我们要检验的就是下式是否成立:

如果成立,则说明反向传播算法是正确的。

下面总结一下需要注意的问题:

梯度检验的实现要点(步骤):

 1、使用后向传播计算DVec(偏导数向量)
 2、计算数值梯度的估计值gradApprox
 3、确保DVec和gradApprox值相近
 4、关闭梯度检验,再使用后向传播进行学习

注意:在训练分类器之前一定要关闭梯度检验,如果没有关闭,则在梯度下降的每次迭代中都进行数值梯度的计算,代码运行将十分缓慢。梯度的数值估计相对于后向传播计算梯度来说是较大的工作量,我们使用数值估计的初衷仅仅是为了检验后向传播的实现是否正确。


3.3 随机初始化

运用梯度下降或者其他高级优化算法来求解 minΘJ(Θ) 时,需要对 Θ 进行初始化。
在逻辑回归中,我们可以将所有的 θ 初始化为一个全 0 的向量,但是在神经网络中我们不能这么做。
如果对于所有的 i,j,l,我们初始化 Θ(l)ij=0 ,则:

a(1)2=a(2)2,δ(1)2=δ(2)2
Θ(1)10J(Θ)=Θ(1)20J(Θ)

这样一来,每次更新后,两个参数 Θ 都是一样的(会得到非零的值,但是这两个值是相等的),其它参数值也是如此。
这其实相当于,当有多个隐藏单元时,所有的隐藏单元只表示同一种特征,其他完全是多余的(实际上,只要初始的 θ 值都相同,就无法破坏这种可怕的对称性)。

故神经网络对权重采用随机初始化,来破坏这种对称性。让每一个 Θ(l)ij [ϵ,ϵ] 中随机一个值(这里的 ϵ 和梯度检验里的 ϵ 不是同一个东西)。

用代码表示如下:

If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.

Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;

其中 rand(10,11) 表示生成一个 10×11 的矩阵,并用 (0,1) 之间的任意数值随机初始化。


3.4 神经网络总结

1.选择一个网络结构

  • 输入层单元数:特征 x(i) 的维数

  • 输出层单元数:分类的类别数。
    多类别分类问题输出层有多个单元,输出的 y 不是一个数了,而是由一些 0 和一个 1 组成的向量。

  • 隐藏层数目:默认使用1个隐藏层,如果隐藏层数目多于1个,则每个隐藏层应该有相同的单元个数。
    隐藏层单元数越多,效果越好,通常取稍大于输入特征的数目。

2.训练神经网络

  • 构建一个神经网络,对权重随机初始化

  • 对训练数据中任意 x(i),利用前向传播计算得到 hΘ(x(i))

  • 计算代价函数 J(Θ)

  • 利用反向传播计算偏导项 Θ(l)ijJ(Θ)

  • 使用梯度检验比较后向传播计算得到的 Θ(l)ijJ(Θ) 和数值估计得到的 J(Θ) 的梯度是否接近,然后关闭梯度检验。

  • 使用梯度下降或其他高级优化算法和反向传播相结合去求解 minΘJ(Θ) ,得到最优的参数 Θ
    对于神经网络来说, J( Theta) 是非凸函数,使用梯度下降可能得到的不是全局最小值,但这影响不大,一般来说得到的会是很小的局部最小值。

3.神经网络对新的输入分类

  • 对于新的输入 x ,结合训练出的权重Θ,利用前向传播得到输出层的 hΘ(x) ,给出分类结果。

附课后习题答案

答案:AC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值