目录
最近遇到交叉熵作为损失函数的情况,且在花书刚好看到KL散度一节,故写一下学习笔记。
KL散度的定义
KL散度的具体定义参考花书3.13节,
DKL(P∥Q)=Ex∼P[logQ(x)P(x)]=Ex∼P[logP(x)−logQ(x)],
DKL(P∥Q)用于衡量两个分布P、Q之间的差异大小,DKL≥0,并且越接近0说明p与q这两个分布越近似,当且仅当p与q完全一致时KL散度取0。
图例3.6已经很好地说明了机器学习损失函数为何采用DKL(p∥q)而不是DKL(q∥p),这两者是不对称的。已知分布p(x),求一个分布q(x)来近似p(x),q∗右上角的∗符号表示最优值。这里可以看成已知x的类别分布p(x),拟学习一个算法y^去预测x的类别,y^所给类别预测的概率分布为q(x),y^上方的尖号表示对y的预测(猜测)值,学习目标是使q(x)尽可能地近似p(x)。当采用DKL(q∥p)时,q∗不仅可以放在左峰(如右图),也可以放在右峰(未画出),右图给人感觉有点“丢失”了一半的信息。
KL散度与交叉熵
DKL(P∥Q)=Ex∼p[logq(x)p(x)]=x∑p(x)⋅logq(x)p(x) (E表示数学期望,变量连续时使用∫符号)=x∑p(x)logp(x)−x∑p(x)logq(x)=−H(p)+CE(p,q), (CE表示Cross Entropy,即交叉熵)
由于p(x)已经固定,所以−H(p)是一个常数,我们的目标是优化DKL(P∥Q),把常数省略掉,相当于直接优化CE(p,q),即交叉熵部分。
针对第i个样本xi,其类别分布为y(xi,k),算法y^对其类别的预测分布为y^(xi,k),其中k={1,…,m}表示总共有m种类别,有
CE(y(xi,{1,…,m}),y^(xi,{1,…,m}))=−k∑y(x,k)logy^(x,k),
上述等式已给出单个样例的损失函数,而对于批量(整个)数据集D={(x1,y1),(x2,y2),…,(xn,yn)},有
CE(y(D),y^(D))=−i=1∑nk=1∑my(xi,k)logy^(xi,k)。
Acknowledge
参考自:
交叉熵与KL散度
感谢@LittleSasuke
感谢花书作者以及所有做出巨大贡献的人