使用Softmax /交叉熵进行反向传播


40

我试图了解反向传播如何用于softmax /交叉熵输出层。

交叉熵误差函数为

E(t,o)=jtjlogoj

分别以和为目标,并在神经元处输出。总和在输出层的每个神经元上。本身是softmax函数的结果:tojoj

oj=softmax(zj)=ezjjezj

同样,总和在输出层的每个神经元上,是神经元的输入:zjj

zj=iwijoi+b

那是前一层中所有神经元的总和,其对应的输出为,权重朝向神经元加上偏差。oiwijjb

现在,要更新连接输出层中的神经元和上一层中的神经元的权重,我需要使用链式规则来计算误差函数的偏导数:wijji

Ewij=Eojojzjzjwij

用作为神经元的输入。zjj

最后一个词很简单。由于和之间只有一个权重,因此导数为:ij

zjwij=oi

第一项是关于输出的误差函数的:oj

Eoj=tjoj

中间项是softmax函数相对于其输入更难:zj

ojzj=zjezjjezj

假设我们有三个对应于类输出神经元则为:o b = s o f t m a x b a,b,cob=softmax(b)

ob=ezbez=ezbeza+ezb+ezc

及其使用商法则的推导:

=小号ö˚F一个Xb-小号ö˚F一个X2b=Öb-ø 2 b =Öb1-ÒbÔĴ

obzb=ezbez(ezb)2(jez)2=ezbez(ezb)2(ez)2
=softmax(b)softmax2(b)=obob2=ob(1ob)
返回用于反向传播的中间术语,这意味着:
ojzj=oj(1oj)

放在一起我得到

Ewij=tjojoj(1oj)oi=tj(1oj)oi

这意味着,如果此类的目标是,那么我将不更新其权重。听起来不对。tj=0

通过对此进行调查,我发现人们对于softmax推导有两个变体,一个在其中,另一个在,就像这里这里ji=jij

但是我对此毫无意义。另外,我什至不确定这是否是导致我出错的原因,这就是为什么我发布所有计算结果的原因。我希望有人可以向我澄清我缺少什么或出错了。


给定的链接正在计算相对于输入的导数,而您正在计算相对于权重的导数。
Jenkar '16

Answers:


35

注意:我不是反向传播专家,但是现在阅读了一点,我认为以下警告是适当的。在神经网络上阅读论文或书籍时,通常使用标准求和/索引符号矩阵符号多索引符号(包括张量-张量导数的最后两种的混合形式)的混合形式来编写导数)。通常的目的是应该“从上下文中理解”,因此您必须要小心!

我注意到您的推导过程中存在一些不一致之处。我实际上并不做神经网络,因此以下内容可能不正确。但是,这就是我要解决的问题。

首先,您需要考虑中的总和,并且不能假设每个项仅取决于一个权重。因此,采取的梯度相对于组分的,我们有 E k z E = j t j log o jEEkz

E=jtjlogojEzk=jtjlogojzk

然后,将为 我们有 其中是克罗内克三角洲。那么softmax分母的梯度为 ,得出 或展开日志 注意,导数是关于,任意oj

oj=1Ωezj,Ω=iezilogoj=zjlogΩ
logojzk=δjk1ΩΩzk
δjk
Ωzk=ieziδik=ezk
logojzk=δjkok
ojzk=oj(δjkok)
zk分量,它给出项(仅当时才)。zδjk=1k=j

这样的梯度相对于是然后 其中 是常数(对于给定的向量)。Ez

Ezk=jtj(okδjk)=ok(jtj)tkEzk=okτtk
τ=jtjt

这显示出与您的结果的第一个区别:不再乘以。请注意,对于为“单热” 的典型情况,我们有(如您的第一个链接中所述)。tkoktτ=1

第二个矛盾,如果我理解正确的话是,“ ”输入到似乎不太可能是“ ”,也就是从SOFTMAX输出。我认为这实际上是网络体系结构中的“更进一步”?ozo

调用此向量,我们得到 y

zk=iwikyi+bkzkwpq=iyiwikwpq=iyiδipδkq=δkqyp

最后,要获得相对于权重矩阵的梯度,我们使用链规则 给出最终表达式(假设一个) -hot,即) 其中是(在您的示例中)最低级别的输入。Ew

Ewpq=kEzkzkwpq=k(okτtk)δkqyp=yp(oqτtq)
tτ=1
Ewij=yi(ojtj)
y

因此,这显示出与您的结果的第二个差异:“ ”应该位于之下的水平(我称,而不是之上的水平(即)。oizyzo

希望这会有所帮助。这个结果看起来更一致吗?

更新:为响应OP中的注释查询,这是第一步的扩展。首先,请注意向量链规则需要求和(请参阅此处)。其次,为确保获得所有梯度分量,应始终在偏导数的分母中为该分量引入新的下标字母。因此,要使用全链规则完全写出渐变,我们有 和 这样

Ewpq=iEoioiwpq
oiwpq=koizkzkwpq
δ一个b
Ewpq=i[Eoi(koizkzkwpq)]
实际上,由于您有很多项,因此总和减少了。尽管它涉及很多“额外的”求和和下标,但使用完整链规则将确保您始终获得正确的结果。δab

我不确定“ Backprop / AutoDiff”社区如何解决这些问题,但是我发现只要尝试使用快捷方式,我都有可能犯错误。因此,我最终按照此处的方法进行操作,用加总下标的方式将所有内容写成和,并始终为每个导数引入新的下标。(类似于我在这里的回答……希望最终至少能给出正确的结果!)
GeoMatt22'9

我个人发现,将所有内容写下来将使您更容易理解。结果对我来说看起来是正确的。
詹卡

尽管我仍在尝试完全理解您的每个步骤,但我得到了一些有价值的见解,这些对我的整体情况有所帮助。我想我需要阅读更多有关导数和和的主题。但是考虑到您的建议以考虑到E中的总和,我
想到

对于两个输出和和交叉熵误差为 然后导数为 符合您的结果...考虑到您在误差和之前没有减号oj1=ezj1Ω Ω=ëž Ĵ 1 +ëž Ĵ 2oj1=ezj1Ω
Ω=ezj1+ezj2
E=(t1logoj1+t2logoj2)=(t1(zj1log(Ω))+t2(zj2log(Ω)))
E(zj1=(t1t1ezj1Ωt2ezj2Ω)=t1+oj1(t1+t2)
micha

但是我还有一个问题:不是 ,通常是反向传播引入的,计算得出:就像要取消。为什么以这种方式导致正确的结果?
Ewij=Eojojzjzjwij
Ewij=Ezjzjwij
oj
micha

12

虽然@ GeoMatt22的答案是正确的,但我个人认为将问题简化为一个玩具示例并绘制图片非常有用:

图形模型。

然后,我定义每个节点正在计算的操作,将和视为对“网络”的输入(是表示数据点类标签的单向矢量):hwt

L=t1logo1t2logo2
o1=exp(y1)exp(y1)+exp(y2)
y1
o2=exp(y2)exp(y1)+exp(y2)
y1=w11h1+w21h2+w31h3
y2=w12h1+w22h2+w32h3

假设我要计算关于的损耗导数。我可以使用图片追溯从损失到我感兴趣的体重的路径(为清楚起见,删除了的第二列):w21w

具有突出显示的向后路径的图形模型。

然后,我可以计算出所需的导数。请注意,有两条通过路径导致,因此我需要对通过它们的导数求和。y1w21

Lo1=t1o1
Lo2=t2o2
o1y1=exp(y1)exp(y1)+exp(y2)(exp(y1)exp(y1)+exp(y2))2=o1(1o1)
o2y1=exp(y2)exp(y1)(exp(y1)+exp(y2))2=o2o1
y1w21=h2

最后,将链式规则放在一起:

Lw21=Lo1o1y1y1w21+Lo2o2y1y1w21=t1o1[o1(1o1)]h2+t2o2(o2o1)h2=h2(t2o1t1+t1o1)=h2(o1(t1+t2)t1)=h2(o1t1)

请注意,在最后一步中,因为矢量是一个单矢量。t1+t2=1t


这终于为我清除了一切!优秀而优雅的解释!!!
SantoshGupta7

2
我很高兴你们都喜欢阅读我的帖子并从中受益!对我来说,写出来并解释它也很有帮助。
Vivek Subramanian

@VivekSubramanian应该改为 吗?
=t1o1[o1(1o1)]h2+t2o2(o2o1)h2
koryakinp '18

您是对的-这是一个错字!我将进行更改。
Vivek Subramanian

我在这里不明白的是,您还为某些神经元分配了logit(未缩放分数)。(o是softmaxed logits(预测),y是您的情况的logits)。但是,通常不是这种情况,不是吗?看这张照片(o_out1是预测,o_in1是对数),那么在这种情况下如何找到相对于y1的o2的偏导数呢?
阿拉特

6

我需要一个字母的大写字母与小写字母不同的字母来代替。因此,让我替换。另外,让我们使用变量来指定上一层的。{oi},{yi}{pi}{oi}

令为对角矩阵,其对角线等于向量,即 使用这个新的矩阵变量和Frobenius内积,我们可以计算 wrt的梯度。 y Y = D i a gy E W z = W p + b d z = d W pYy

Y=Diag(y)
EW
z=Wp+bdz=dWpy=softmax(z)dy=(YyyT)dzE=t:log(y)dE=t:Y1dydE=t:Y1(YyyT)dz=t:(I1yT)dz=t:(I1yT)dWp=(y1TI)tpT:dW=((1Tt)ypTtpT):dWEW=(1Tt)ypTtpT

6

这是我在网上看到的最干净,写得很好的笔记之一,它解释了“在具有反向熵损失函数的反向传播算法中计算导数”


在给定的pdf中,等式22如何变成等式23?就像求和(k!= i)如何得到负号一样。它不应该得到积极的信号吗?像Summation(Fn)(For All K) = Fn(k=i) + Summation(Fn)(k!=i)应根据我的理解发生。
faizan


0

其他答案提供了计算导数的正确方法,但它们并未指出您出了错。实际上,在您的最后一个方程式中始终为1,因为您假设在输出中采用了目标1的那个节点;其他节点的具有不同形式的概率函数,因此导致不同形式的导数,因此您现在应该了解为什么其他人对和区别对待。tjojoji=jij

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.