十、神经网络参数的反向传播算法


它能在给定训练集时为神经网络拟合参数。

1.代价函数

在这里插入图片描述
L表示神经网络的总层数
s L s_L sL表示第L层的单元数,不包括偏差单元

我们在神经网络中使用的代价函数是逻辑回归中使用的代价函数的一般形式:
在这里插入图片描述
神经网络的代价函数中不再是有一个逻辑回归输出单元,取而代之的是K个。如果是二元分类问题,K=1。K是输出单元的个数
( h θ ( x ) ) i (h_\theta(x))_i (hθ(x))i表示第i个输出。也就是说 h θ ( x ) h_\theta(x) hθ(x)是一个K维向量,这里的下标i表示选择输出神经网络输出向量中的第i个元素。

2.反向传播算法

反向传播(Backpropagation)在神经网络中是一个非常重要的部分。它的主要作用是最小化代价函数(cost function),也就是提高神经网络的准确性。和在线性回归和逻辑回归中一样,需要采用梯度下降(Gradient descent)法来最优化代价函数。
该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数

总的代价函数

在这里插入图片描述
上图是我们的代价函数,我们的目标是找到θ使得J(θ)取得最小值,为了使用梯度下降法或是其他算法,我们需要获得输入参数θ并计算J(θ)和这些偏导项。

第二项是一个正则化项,其目的是减小权重的幅度,防止过度拟合。

我们从只有一个训练样本的训练集开始,也就是实数对:
在这里插入图片描述
首先我们应用前向传播算法计算一下在给定输入的时候假设函数是否真的会输出结果。
具体来说这里的 a ( 1 ) a^{(1)} a(1)就是第一层的激活值,所以假设它为 x x x
a ( 2 ) a^{(2)} a(2)就是第二层的激活值,它是被计算出来的。
a ( 4 ) a^{(4)} a(4)就是输出的假设函数。
这样我们就实现了把前向传播算法向量化,这使得我们可以计算神经网络结构里的每一个神经元激活值。

接下来为了计算导数项,我们采取一种叫做反向传播(Backpropagation)的算法。

反向传播算法

在这里插入图片描述
反向传播算法就是从直观上说,对每一个节点,我们计算这样一项 δ j ( l ) δ_j^{(l)} δj(l)代表第 j j j层第 l l l个节点的误差。(PS: a j ( l ) a_j^{(l)} aj(l)代表第 j j j层第 l l l个节点的激活值)。
所以这个 δ j ( l ) δ_j^{(l)} δj(l)项,在某种程度上就捕捉到了我们在这个神经节点的激活值的误差。
有误差,所以我们可能希望这个节点的激活值稍微不一样。

具体来讲,我们用图中这个有四层的神经网络做例子,对于每一个输出单元我们将计算 δ δ δ项。

所以第四层的第 j j j个单元的 δ δ δ就等于这个单元的激活值减去训练样本里的真实值0。 ??? 这一项也可以写成假设的输出值和训练集y值的差。
y j y_j yj就是我们训练集里的向量y的第j个元素的值。

如果你把 δ 、 a 、 y δ、a、y δay都看做向量,那么你可以同样这样写,平且得出一个向量化的表达式,也就是 δ ( 4 ) = a ( 4 ) − y δ^{(4)}=a^{(4)}-y δ(4)=a(4)y。这里的每一个值都是一个向量,并且向量维数等于输出单元的数目。

神经网络前面几层的误差项δ如图所示:
注意是点乘

g ′ ( z ( 3 ) ) g'(z^{(3)}) g(z(3))其实是对激活函数g在输入值为 z ( 3 ) z^{(3)} z(3)的时候所求的导数,它等于 a ( 3 ) ⋅ ∗ ( 1 − a ( 3 ) ) a^{(3)}·*(1-a^{(3)}) a(3)(1a(3)),这个1是以1为元素的向量, a ( 3 ) a^{(3)} a(3)就是第三层的激活向量。同理 δ ( 2 ) δ^{(2)} δ(2)也是这样,没有 δ ( 1 ) δ^{(1)} δ(1)

反向传播算法的名字源自我们从输出层开始计算 δ δ δ项,然后再返回上一层,相当于把输出层的误差方向传播给了上一层,再传给上一层,这就是反向传播的意思。

偏导(证明略):

∂ ∂ θ j ( l ) J ( θ ) = a j ( l ) δ j ( l ) \frac{\partial}{\partial\theta_j^{(l)}}J(\theta)=a_j^{(l)}δ_j^{(l)} θj(l)J(θ)=aj(l)δj(l)
这里我们忽略了λ(标准化项),λ项=0,之后我们再完善正则项细节。//λ=0表示忽略正则化项。

反向传播算法来计算参数的偏导数:

在这里插入图片描述
假设我们有m个样本的训练集
1.设置 Δ i j ( l ) = 0 Δ_{ij}^{(l)}=0 Δij(l)=0
2.遍历训练集,For i=1 to m ,对第i个循环而言取训练样本 ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i))
2.1.设置 a ( 1 ) a^{(1)} a(1)也就是输入层的激活函数等于 x ( i ) x^{(i)} x(i) x ( i ) x^{(i)} x(i)是我们第i个训练样本的输入值
2.2.运用正向传播来计算第二层的激活值,直到最后一层L层
2.3.然后用样本的输出值 y ( i ) y^{(i)} y(i),计算输出值对应的误差项( δ ( L ) = a ( L ) − y ( i ) δ^{(L)}=a^{(L)}-y^{(i)} δ(L)=a(L)y(i)),也就是假设的输出值减去目标输出
2.4.然后运用反向传播算法来计算 δ ( L − 1 ) , , , , δ ( 2 ) δ^{(L-1)},,,,δ^{(2)} δ(L1),,,,δ(2)
2.5.这些大写的Δ来累加我们前面写好的偏导数项(PS:这个式子也可以写成向量形式)
3.按图中方式计算大写D,它就是J(θ)的偏导
PS:Δ就是δ的大写

反向传播算法更新参数θ

θ i j ( l ) = θ i j ( l ) − α ∂ ∂ θ i j ( l ) J ( θ ) θ_{ij}^{(l)}=θ_{ij}^{(l)}-α\frac{\partial}{\partial\theta_{ij}^{(l)}}J(\theta) θij(l)=θij(l)αθij(l)J(θ)
也有的把θ写作w和b
w i j ( l ) w_{ij}^{(l)} wij(l) 第l层第j个单元与第l+1层第i个单元之间的链接参数
b i ( l ) b_{i}^{(l)} bi(l) 第l层的偏置与第l+1层第i个单元之间的链接参数

3.理解反向传播

前向传播算法的步骤:
在这里插入图片描述
1.输入 x i x_i xi
2.由输入层传到隐藏层,计算出加权z,由z计算出激活值a。注意是z
3.传播下去直到输出层,输出值为 a 1 ( 4 ) a_1^{(4)} a1(4)
计算加权z的方法在图中。
反向传播算法相对于前向传播算法只是计算方向不一样,反向传播算法从右往左计算。

举例:
在这里插入图片描述
cost(i)是第i个样本的代价函数,可以近似地看作方差,表示了神经网络预测样本值的准确程度,也就是网络的输出值与实际值的方差,也就是网络的输出值与实际观测值 y ( i ) y^{(i)} y(i)的接近程度。

反向传播的过程:
在这里插入图片描述
一种直观的理解就是反向传播算法就是在计算这些 δ j ( l ) δ_j^{(l)} δj(l)
δ δ δ实际上是代价函数关于这些所计算出的中间项的偏导数,它们衡量的是为了影响这些中间值,我们想要改变神经网络中的权重的程度,进而影响整个神经网络的输出 h θ ( x ) h_\theta(x) hθ(x),并影响所有的代价函数。
计算 δ δ δ的方法在图中
计算 δ δ δ不包括偏置单元

4.展开参数

把参数从矩阵展开成向量,以便我们在高级最优化步骤中的使用需要。
(燃油灰色的是octave的代码)
在这里插入图片描述
在神经网络中,θ、D都是矩阵,怎么取出这些矩阵并把它们展开成向量,让我们能传入θ并得到梯度返回值。
举例:
在这里插入图片描述
当参数以矩阵的形式存储时,进行正反向传播会更加方便。
向量表示的优点是当你使用一些高级的优化算法时,这些算法通常要求把所有的参数要展开成一个长向量的形式。

5.梯度检测

解决反向传播算法中的bug,验证反向传播算法/梯度下降的正确性

θ是实数:
在这里插入图片描述
θ是向量:
在这里插入图片描述
这就是斜率嘛。

Octave里估算导数的代码(梯度检测代码):
在这里插入图片描述
假设值i从1到n,n是参数向量θ的维度。θ是神经网络中所有参数的集合。
图中第一步是为了让所有的thetaPlus都赋上theta值,第二步thetaPlus(i) 要加上 EPSILON(ε)。
然后对thetaMinus进行类似的操作,只不过它是减去EPSILON(ε)。
gradApprox(i) 就约等于我们要求的J(θ)关于θ_i在这一点的偏导数。

for循环来完成对神经网络中代价函数的所有参数的偏导数的计算
然后gradApprox与我们在反向传播中得到的梯度进行比较。DVec是我们从反向传播中得到的导数。如果这两个导数是一样的或者非常接近,那么我们就可以确认反向传播的实现是正确的。

总步骤:
在这里插入图片描述
1.通过反向传播算法来计算DVec (DVec可能是矩阵D们的展开形式)
2.实现数值上的梯度检验,计算出gradApprox
3.确保gradApprox与DVec相似,只有几位小数的差距
4.在使用你的代码进行学习或说训练网络之前,重要的是关掉梯度检验,不要用前面的公式去计算gradApprox。这是因为这段之前所说的梯度检验的代码是一个计算量非常大的查询,而反向传播算法(计算DVec,也就是 D ( 1 ) , D ( 2 ) , D ( 3 ) D^{(1)},D^{(2)},D^{(3)} D(1),D(2),D(3))是一个高性能计算导数的方法,一旦你通过检验确定反向传播的实现是正确的就应该关掉梯度检验。

impotent:
确保在训练你的分类器(多次迭代)前禁用梯度检查代码
如果你在每次梯度下降迭代(或在每次代价函数的内部循环里)都运行一次梯度检验,您的代码将非常缓慢。
那该什么时候使用梯度检测呢?
一旦验证了反向传播算法是正确的,就在训练之前关掉

6.随机初始化

在这里插入图片描述
当你执行一个算法例如梯度下降法或者高级优化算法时,我们需要为变量θ选取一些初始值。
一种方法是全部设为零:
在这里插入图片描述
在逻辑回归中这样做是允许的,但实际上在训练网络时,将所有参数初始化为0起不到任何作用。
以这个神经网络为例:
在这里插入图片描述
如果我们把参数都设为0,那就意味着从第一层到第二层的权重全为0,也就是说隐藏单元 a 1 ( 2 ) 和 a 2 ( 2 ) a_1^{(2)}和a_2^{(2)} a1(2)a2(2)是以同一个输入函数来计算的,则 a 1 ( 2 ) = a 2 ( 2 ) a_1^{(2)}=a_2^{(2)} a1(2)=a2(2) δ 1 ( 2 ) = δ 2 ( 2 ) δ_1^{(2)}=δ_2^{(2)} δ1(2)=δ2(2),神经网络中代价函数关于这两条蓝色权重的偏导数将会相等: ∂ ∂ θ 01 ( 1 ) J ( θ ) = ∂ ∂ θ 02 ( 1 ) J ( θ ) \frac{\partial}{\partial\theta_{01}^{(1)}}J(\theta)=\frac{\partial}{\partial\theta_{02}^{(1)}}J(\theta) θ01(1)J(θ)=θ02(1)J(θ)。这就意味着即使在每一次的梯度下降更新中第一条蓝色的权重将被更新为学习率乘以 ∂ ∂ θ 01 ( 1 ) J ( θ ) \frac{\partial}{\partial\theta_{01}^{(1)}}J(\theta) θ01(1)J(θ),第二条蓝色的权重将被更新为学习率乘以 ∂ ∂ θ 02 ( 1 ) J ( θ ) \frac{\partial}{\partial\theta_{02}^{(1)}}J(\theta) θ02(1)J(θ)。也就是说对这两条蓝色权重进行梯度下降更新,最后这两条蓝色的权重将会相等。绿色红色同理。所以说这个网络搞不出来什么有意思的函数。
对参数进行初始化的时候要使用随机初始化的思想。

随机初始化:
在这里插入图片描述
INIT_EPSILON:ε。这里的ε和梯度检验中的ε没有关系。

7.总结

做个回顾

选择架构

在这里插入图片描述
当训练神经网络时,第一件事是选择一个架构,如上图的三种。怎么选择:
首先我们已经定义了输入单元的数量,一旦你确定了特征集 x ( i ) x^{(i)} x(i),输入单元的数量就等于特征集的维度。
如果是分类问题,那么输出单元的个数由你的类别个数决定。注意输出写成向量的形式。如果有十个分类:
在这里插入图片描述
对于选择隐藏层单元个数,最常见的一种是一层隐藏层,如果超过一层,通常每层的神经网络单元个数相等。通常情况下隐藏单元越多越好,一般是1到几倍。

训练神经网络的步骤

在这里插入图片描述
在这里插入图片描述
1.构建一个神经网络,然后随机初始化权重
2.执行前向传播算法,对任意输入 x ( i ) x^{(i)} x(i),得到 h θ ( x ( i ) ) h_θ(x^{(i)}) hθ(x(i)),也就是一个输出值y的向量
3.执行代码计算代价函数J(θ)
4.执行反向传播算法计算偏导数
具体来说,使用反向传播,就要对所有样本进行一个for循环的遍历,输入 x ( i ) x^{(i)} x(i)执行正向传播和反向传播,我们就能得到神经网络每一层中每一个单元对应的激活值a和δ项。
Δ ( l ) = Δ ( l ) + δ ( l + 1 ) ( a ( l ) ) T Δ^{(l)}=Δ^{(l)}+δ^{(l+1)}(a^{(l)})^T Δ(l)=Δ(l)+δ(l+1)(a(l))T
5.使用梯度检测来比较这些已经得到的偏导数项。把反向传播算法得到的偏导数与用数值得到的偏导数对比。然后关闭梯度检测。
6.使用一个最优算法,如梯度下降法或更高级的算法,与反向传播算法相结合,反向传播算法计算出了偏导数,然后我们用这个算法最小化代价函数J(θ)。(PS:神经网络的代价函数是非凸函数,理论上有可能收敛于局部最小值)

梯度下降法在神经网络中的作用

在这里插入图片描述
如图,在最低点,对应一组参数θ,如果我们取这个点的θ值,计算出的 h θ ( x ( i ) ) ≈ y ( i ) h_\theta(x^{(i)})≈y^{(i)} hθ(x(i))y(i),对应的代价函数(z轴)很小。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值