softmax交叉熵损失求导
softmax
为激活函数,C = softmax(o)
为输出,真实标签为y
, 用交叉熵作为损失函数L
,给出损失函数定义,并且给出损失函数L
对o
的求导
交叉熵损失函数定义如下:
L=−∑i=1Cyilog(ci)L = -\\sum_{i=1}^C y_i\\log(c_i)L=−i=1∑Cyilog(ci)
其中,yyy表示真实标签,ccc表示模型的预测输出,CCC表示类别数。
假设模型的输出为ooo,则将ooo输入softmax
函数得到预测输出ccc:
ci=eoi∑j=1Ceojc_i = \\frac{e^{o_i}}{\\sum_{j=1}^C e^{o_j}}ci=∑j=1Ceojeoi
将预测输出ccc代入交叉熵损失函数中,可得到:
L=−∑i=1Cyilog(eoi∑j=1Ceoj)=−∑i=1Cyi(oi−log∑j=1Ceoj)L = -\\sum_{i=1}^C y_i\\log\\left(\\frac{e^{o_i}}{\\sum_{j=1}^C e^{o_j}}\\right) = -\\sum_{i=1}^C y_i(o_i - \\log\\sum_{j=1}^C e^{o_j})L=−i=1∑Cyilog(∑j=1Ceojeoi)=−i=1∑Cyi(oi−logj=1∑Ceoj)
接下来,我们对LLL对oko_kok求导数:
∂L∂ok=−∑i=1Cyi∂(oi−log∑j=1Ceoj)∂ok\\frac{\\partial L}{\\partial o_k} = -\\sum_{i=1}^C y_i \\frac{\\partial(o_i - \\log\\sum_{j=1}^C e^{o_j})}{\\partial o_k}∂ok∂L=−i=1∑Cyi∂ok∂(oi−log∑j=1Ceoj)
当i=ki=ki=k时,
∂(oi−log∑j=1Ceoj)∂ok=1−eok∑j=1Ceoj=1−ck\\frac{\\partial(o_i - \\log\\sum_{j=1}^C e^{o_j})}{\\partial o_k} = 1 - \\frac{e^{o_k}}{\\sum_{j=1}^C e^{o_j}} = 1 - c_k∂ok∂(oi−log∑j=1Ceoj)=1−∑j=1Ceojeok=1−ck
当i≠ki \\neq ki=k时,
∂(oi−log∑j=1Ceoj)∂ok=−eoieok(∑j=1Ceoj)2=−cick\\frac{\\partial(o_i - \\log\\sum_{j=1}^C e^{o_j})}{\\partial o_k} = -\\frac{e^{o_i}e^{o_k}}{(\\sum_{j=1}^C e^{o_j})^2} = -c_ic_k∂ok∂(oi−log∑j=1Ceoj)=−(∑j=1Ceoj)2eoieok=−cick
因此,
∂L∂ok=−yk(1−ck)−∑i≠kyi(−cick)=ck−yk\\frac{\\partial L}{\\partial o_k} = -y_k(1-c_k) - \\sum_{i\\neq k}y_i(-c_ic_k) = c_k - y_k∂ok∂L=−yk(1−ck)−i=k∑yi(−cick)=ck−yk
综上所述,我们可以使用交叉熵损失函数和softmax
作为激活函数,并且可以使用上述公式计算梯度,以便进行反向传播和模型参数更新。
接着上面的假设,若 :
o=px+bo = px+bo=px+b
那么根据链式法则,损失L
对p
的求导结果为
x(ck−yk)x(c_k - y_k)x(ck−yk)
损失L
对b
的求导结果为
ck−ykc_k - y_kck−yk