交叉熵损失函数的概念和理解
觉得有用的话,欢迎一起讨论相互学习~
公式
l o s s = ∑ i ( y i ⋅ l o g ( y _ p r e d i c t e d i ) + ( 1 − y i ) ⋅ l o g ( 1 − y _ p r e d i c t e d i ) ) loss =\sum_{i}{(y_{i} \cdot log(y\_predicted_{i}) +(1-y_{i}) \cdot log(1-y\_predicted_{i}) )} loss=i∑(yi⋅log(y_predictedi)+(1−yi)⋅log(1−y_predictedi))
定义
- 在信息论中,若一个符号字符串中的每个字符的出现概率
P
i
P_{i}
Pi已知,则可用香农熵估计该字符串中每个符号
S
i
S_{i}
Si编码所需的平均最小位数.
H = − ∑ i ( p i ⋅ l o g 2 ( p i ) ) H=-\sum_{i}({p_{i} \cdot log_{2}(p_{i})}) H=−i∑(pi⋅log2(pi)) - 除了数学表达式相似以外,完全可以将这里的熵和其热力学概念联系起来.
- 例如,可计算单次"HELLO"的熵:
p ( " H " ) = p ( " E " ) = p ( " O " ) = 1 / 5 = 0.2 p ( " L " ) = 2 / 5 = 0.4 H = − 3 ∗ 0.2 ∗ l o g 2 ( 0.2 ) − 0.4 ∗ l o g 2 ( 0.4 ) = 1.92193 p("H")=p("E")=p("O")=1/5=0.2\\p("L")=2/5=0.4\\H=-3*0.2*log_{2}(0.2)-0.4*log_{2}(0.4)=1.92193 p("H")=p("E")=p("O")=1/5=0.2p("L")=2/5=0.4H=−3∗0.2∗log2(0.2)−0.4∗log2(0.4)=1.92193 - 因此,采用最优编码方案时,"Hello"中的每个符号需要2位计算单词"Hello"中的每个符号需要2位.
- 在对符号进行编码时,如果假设了其他的概率
q
i
q_{i}
qi而非真实概率
p
i
p_{i}
pi,则对每个符号所需的编码的长度就会更大.这正是交叉熵所发挥作用的时候. 他允许用户以另外一种次优编码方案计算对同一个字符串进行编码所需的平均最小位数.
H = − ∑ i ( p i ⋅ l o g 2 ( q i ) ) H=-\sum_{i}{(p_{i} \cdot log_{2}(q_{i}))} H=−i∑(pi⋅log2(qi)) - 例如,ASCII会对每个符号赋予相同的概率值
q
i
=
1
/
256
q_{i}=1/256
qi=1/256.下面计算采用ASCII编码时单词"HELLO"的交叉熵:
q ( " H " ) = q ( " E " ) = q ( " L " ) = q ( " O " ) = 1 / 256 H = − 3 ∗ 0.2 ∗ l o g 2 ( 1 / 256 ) = 8 q("H")=q("E")=q("L")=q("O")=1/256\\H=-3*0.2*log_{2}(1/256)=8 q("H")=q("E")=q("L")=q("O")=1/256H=−3∗0.2∗log2(1/256)=8
从而采用ASCII编码时,每个字符需要8个位,这与预期完全吻合. - 作为一个损失函数假设p为所期望的输出和概率分布(“编码”),其中实际值 有100%,而其他任何值为0,将q作为由模型计算得到的输出,请牢记,sigmoid函数的输出是一个概率值.
- 有这样一个定理:当p=q时,交叉熵去的最小值.因此可以利用交叉熵比较一个分布与另一个分布的吻合情况.交叉熵越接近与熵,q便是针对p更好的逼近,实际上,模型的输出与期望输出越接近,交叉熵也会越小,这正是损失函数所需要的.
- 在对熵进行最小化时,将 l o g 2 log_{2} log2替换为log完全没有任何问题,因为两者只相差一个常系数.
参考资料
面向机器智能的tensorflow实践