【机器学习】神经网络代价函数和反向传播算法

news/2025/1/8 15:22:42/

神经网络的代价函数

接下来我会再规定若干符号代表的含义:
L L L表示神经网络的总层数
s i s_i si表示的是第i层的神经元数量

如果神经网络处理的是一个二元分类问题,那么他的第L层就只会有一个节点;如果处理的是一个多元分类问题,那么需要分为K类则在第L层会有K个节点

神经网络中使用的代价函数我们之前学过Logistics回归的代价函数的一般形式,其中Logistics回归的代价函数如下:(带有正则化项)
J ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) l o g h θ ( x ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J(\theta)=-\frac{1}{m} \left [ \sum_{i=1}^{m}y^{(i)}logh_\theta (x^{(i)} )+(1-y^{(i)})log(1-h_\theta (x^{(i)}))\right ]+\frac{\lambda }{2m} \sum_{j=1}^{n}\theta _j^2 J(θ)=m1[i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]+2mλj=1nθj2

那么神经网络的代价函数为
J ( θ ) = − 1 m [ ∑ i = 1 m ∑ k = 1 K y k ( i ) l o g ( h θ ( x ( i ) ) ) k + ( 1 − y k ( i ) ) l o g ( 1 − ( h θ ( x ( i ) ) ) k ) ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( θ j i ( l ) ) 2 J(\theta)=-\frac{1}{m} \left [ \sum_{i=1}^{m}\sum_{k=1}^{K} y_k^{(i)}log(h_\theta (x^{(i)} ))_k+(1-y_k^{(i)})log(1-(h_\theta (x^{(i)}))_k)\right ] +\frac{\lambda }{2m} \sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}} (\theta_{ji}^{(l)})^2 J(θ)=m1[i=1mk=1Kyk(i)log(hθ(x(i)))k+(1yk(i))log(1(hθ(x(i)))k)]+2mλl=1L1i=1slj=1sl+1(θji(l))2

我们来分析下神经网络的代价函数,在代价函数中,一般假设函数 h ( x ) h(x) h(x)表示的是神经网络经过拟合后的输出值,而y是样本实际的结果,因为多分类的神经网络中,式子中的y不只是只有一种输出结果,而是有k种输出结果,因此需要计算K个输出单元的和,这就是为什么需要 ∑ k = 1 K \sum_{k=1}^{K} k=1K的原因。

老实说,代价函数这方面我也不太整的明白,我跟的教程并没有给出足够严谨的说明,但是好在实际使用时是直接有函数接口调用的,另外我还会找额外的书籍去补一补这一方面,等着更新吧(挖坑

反向传播算法

单个实例的反向传播

上面我们知道了神经网络的代价函数:这为我们衡量一个神经网络的假设结果是否准确提供了方法。那么如何通过调整参数 θ \theta θ使得代价函数 J ( Θ ) J(\Theta) J(Θ)最小化呢?在神经网络中,我们使用反向传播算法来实现。

这需要计算 J ( Θ ) J(\Theta) J(Θ) ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) Θij(l)J(Θ),其中 J ( Θ ) J(\Theta) J(Θ)的计算方法已经在上一节给出了,接下来的内容大部分精力都在讨论如何计算 ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) Θij(l)J(Θ)

先假设只有一个训练实例 ( x , y ) (x,y) (x,y),试着针对这个实例进行训练,首先我们需要使用之前学的前向传播算法,获得其最终假设函数的结果。
在这里插入图片描述
其前向传播的过程如下:
a ( 1 ) = x z ( 2 ) = Θ ( 1 ) a ( 1 ) a ( 2 ) = g ( z ( 2 ) ) ( a d d a 0 ( 2 ) ) z ( 3 ) = Θ ( 2 ) a ( 2 ) a ( 3 ) = g ( z ( 3 ) ) ( a d d a 0 ( 3 ) ) z ( 4 ) = Θ ( 3 ) a ( 3 ) a ( 4 ) = h Θ ( x ) = g ( z ( 4 ) ) a^{(1)}=x\\z^{(2)}=\Theta^{(1)}a^{(1)}\\a^{(2)}=g(z^{(2)})\:(add \:a_0^{(2)})\\z^{(3)}=\Theta^{(2)}a^{(2)}\\a^{(3)}=g(z^{(3)})\:(add \:a_0^{(3)})\\z^{(4)}=\Theta^{(3)}a^{(3)}\\a^{(4)}=h_\Theta(x)=g(z^{(4)}) a(1)=xz(2)=Θ(1)a(1)a(2)=g(z(2))(adda0(2))z(3)=Θ(2)a(2)a(3)=g(z(3))(adda0(3))z(4)=Θ(3)a(3)a(4)=hΘ(x)=g(z(4))
注意:其中 a ( 1 ) a^{(1)} a(1)是一个向量,其他的亦是,这是一个向量化的前向传播过程

接下来就是采用反向传播的时候了,反向传播实际上是在逐层计算神经网络的各层的假设结果和实际结果的误差。规定 δ j ( l ) \delta_j^{(l)} δj(l)为第l层第j个节点的神经节点的激活值的误差,那么对于上述的例子有: δ j ( 4 ) = a j ( 4 ) − y j \delta_j^{(4)}=a_j^{(4)}-y_j δj(4)=aj(4)yj,也就是将算法的输出值减去该样例的答案yj

当然,你也可以使用向量化表达,比如: δ ( 4 ) = a ( 4 ) − y \delta^{(4)}=a^{(4)}-y δ(4)=a(4)y,这个式子里的每一个元素都是一个向量,我们可以按照这种逻辑写出网络中前面几层的误差项 δ \delta δ,如下:
δ ( 4 ) = a ( 4 ) − y δ ( 3 ) = ( Θ ( 3 ) ) T δ ( 4 ) . ∗ g ′ ( z ( 3 ) ) δ ( 2 ) = ( Θ ( 2 ) ) T δ ( 3 ) . ∗ g ′ ( z ( 2 ) ) \delta^{(4)}=a^{(4)}-y\\\delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}.*g'(z^{(3)})\\\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}.*g'(z^{(2)}) δ(4)=a(4)yδ(3)=(Θ(3))Tδ(4).g(z(3))δ(2)=(Θ(2))Tδ(3).g(z(2))其中 g ′ ( z ( i ) ) = a ( i ) . ∗ ( 1 − a ( i ) ) g'(z^{(i)})=a^{(i)}.*(1-a^{(i)}) g(z(i))=a(i).(1a(i)),这是Logistics激活函数的导数。另外误差项 δ 1 \delta_1 δ1是不存在的,因为第一层是输入层,没有误差可言。而通过式子 ∂ ∂ Θ i j ( l ) J ( Θ ) = a j ( l ) δ i ( l + 1 ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=a_j^{(l)}\delta_i^{(l+1)} Θij(l)J(Θ)=aj(l)δi(l+1)我们就可以通过式子和 a a a计算出其导数项。(注意的是,现在模型尚未引入正则化的 λ \lambda λ项,因为此时考虑正则化会比较复杂,我们后面再完成正则化工作)

多实例反向传播

现在我们试着训练一个拥有多个实例的 ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) {(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})} (x(1),y(1)),(x(2),y(2)),...,(x(m),y(m)),定义一个变量 Δ i j ( l ) = 0 ( f o r a l l l , i , j ) \Delta_{ij}^{(l)}=0\:(for\:all\: l,i,j) Δij(l)=0(foralll,i,j)这个 Δ \Delta Δ表示的是误差,它的用处是用于计算导数 ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) Θij(l)J(Θ),上面单实例中,对于第l层的节点j,只会有一个实例产生误差项目 δ \delta δ,因此 Δ = δ \Delta=\delta Δ=δ,但是在有m个实例的多实例反向传播中,一个节点会经过m个实例的验证,因此 Δ \Delta Δ等于m个单实例误差 δ \delta δ的和。

令i从1遍历到m,依次执行以下操作:

  • a ( 1 ) = x ( i ) a^{(1)}=x^{(i)} a(1)=x(i)
  • 使用正向传播j计算每一层的激活值 a ( l ) a^{(l)} a(l)
  • 使用 y ( i ) y^{(i)} y(i)计算 δ ( L ) = a ( L ) − y ( i ) \delta^{(L)}=a^{(L)}-y^{(i)} δ(L)=a(L)y(i),计算输出层的误差
  • 并且使用该法计算各层的误差 δ ( L − 1 ) , δ ( L − 2 ) , . . . , δ ( 2 ) \delta^{(L-1)},\delta^{(L-2)},...,\delta^{(2)} δ(L1),δ(L2),...,δ(2)
  • 接着 Δ i j ( l ) : = Δ i j ( l ) + a j ( l ) δ i ( l + 1 ) \Delta_{ij}^{(l)}:=\Delta_{ij}^{(l)}+a_j^{(l)}\delta_i^{(l+1)} Δij(l):=Δij(l)+aj(l)δi(l+1)

完成了这些工作之后,利用上面的结果计算如下的式子
D i j ( l ) : = 1 m Δ i j ( l ) + λ Θ i j ( l ) i f j ≠ 0 D i j ( l ) : = 1 m Δ i j ( l ) i f j = 0 D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)}\:\:if\:j\neq0\\D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)}\:\:if\:j=0 Dij(l):=m1Δij(l)+λΘij(l)ifj=0Dij(l):=m1Δij(l)ifj=0可以看到,这里我们引入了正则化的 λ \lambda λ项,也就是这里的作用是正则化,通过这些我们又可以计算出代价函数 J ( Θ ) J(\Theta) J(Θ)的导数 ∂ ∂ Θ i j ( l ) J ( Θ ) = D i j ( l ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=D_{ij}^{(l)} Θij(l)J(Θ)=Dij(l)。这就是反向传播算法计算代价函数的过程


http://www.ppmy.cn/news/403811.html

相关文章

【AI面试】损失函数(Loss),定义、考虑因素,和怎么来的

神经网络学习的方式,就是不断的试错。知道了错误,然后沿着错误的反方向(梯度方向)不断的优化,就能够不断的缩小与真实世界的差异。 此时,如何评价正确答案与错误答案,错误的有多么的离谱,就需要一个评价指标。这时候,损失和损失函数就运用而生。 开始之前,我们先做…

TableAPI

序言 我个人还是觉得直接使用DataStream更加直观,编程也更有灵活,控制起来也更方便.如果全靠一堆SQL或者方法来替代,你完全没法确定最终会转变成什么算子.编程逻辑不直观.而且肯定会造成跟多的资源浪费,比如状态存储的空间,算子间的转发.cuiyaonan2000163.com TableAPI Table…

最优化方法Python计算:一元函数搜索算法——二次插值法

已知连续函数 f ( x ) f(x) f(x)在 x ∗ x^* x∗近旁存在最优解 x 0 x_0 x0​。对博文《最优化方法Python计算:连续函数的单峰区间计算》讨论的 f ( x ) f(x) f(x)单峰区间的包围算法稍加修改,可算得 f ( x ) f(x) f(x)包含 x 0 x_0 x0​的单峰区间 [ a …

为什么看了那么多测试技术帖,自己都没有提升?

作为测试新手,最爱莫过于看各大牛发的技术贴,这篇很牛叉,那篇也很有道理,似乎自己看着看着也会成为高手。然而几年后,发现自己对专业知识的理解乱的很,里面更有很多自相矛盾的地方,这到底是哪里…

游泳耳机买什么牌子好一点?推荐四款出色的游泳耳机

游泳和跑步类似,短距离冲刺时,大脑没什么想法,而中长距离的有氧运动时,肉体是疲惫的,大脑是异常清晰的,时间却是格外难熬的。如何打发时间,让游泳锻炼变得不无聊,这是我从孩子时期就…

Esxi直通A40显卡给ubuntu20.4系统驱动安装过程记录

Esxi直通A40显卡给ubuntu20.4系统驱动安装过程记录 背景描述 PowerEdge R750(esxi虚拟化) 服务器已有一张T4显卡,后期新增一张A40显卡,开一台ubuntu20.4系统直通A40显卡无法开机! 开机问题解决后安装显卡驱动也各种报…

airpods pro是按压还是触摸_数码产品:airpodspro触摸区域在哪里 触摸感应在哪

最近小编发现大家对于airpodspro触摸区域在哪里 触摸感应在哪都很感兴趣,那么小编也是特地整理了一些跟airpodspro触摸区域在哪里 触摸感应在哪相关的知识,那么今天就来分享给大家关于airpodspro触摸区域在哪里 触摸感应在哪的知识吧。 airpodspro触摸区…

超火的数码产品犀牛rhino模型素材网站合集看过来

你还在为找质量高又精致的数码电子产品模型而发愁吗?看这里,小编早就贴心的为你们准备好咯~关注我,收割更多好看又实用的犀牛模型素材,之后也会陆续更新其他实用的素材哒~ 1、爱给网(高品质 全品类 最推荐)…