交叉熵代价函数

1. 交叉熵理论

交叉熵与熵相对,如同协方差与方差。

熵考察的是单个的信息(分布)的期望:

H(p)=i=1np(xi)logp(xi)

交叉熵考察的是两个的信息(分布)的期望:

H(p,q)=i=1np(xi)logq(xi)

详见 wiki Cross entropy

y = tf.placeholder(dtype=tf.float32, shape=[None, 10])

.....

scores = tf.matmul(h, w) + b
probs = tf.nn.softmax(scores) 
loss = -tf.reduce_sum(y*tf.log(probs))

2. 交叉熵代价函数

LH(x,z)=k=1dxklogzk+(1xk)log(1zk)

x 表示原始信号, z 表示重构信号,以向量形式表示长度均为 d ,又可轻易地将其改造为向量内积的形式。

3. 交叉熵与 KL 散度(也叫相对熵)

所谓相对,自然在两个随机变量之间。又称互熵,Kullback–Leibler divergence(K-L 散度)等。设 p(x) 和 q(x) 是 X 取值的两个概率分布,则 p 对 q 的相对熵为:

DKL(p||q)===i=1np(xi)logp(xi)q(xi)i=1np(xi)logp(xi)i=1np(xi)logq(xi)H(p)+H(p,q)

(在稀疏型自编码器损失函数的定义中,基于 KL 散度的惩罚项常常定义成如下的形式:

H(ρ||ρ^)=j=1m[ρjlog(ρ^j)+(1ρj)log(1ρ^j)]

其中: ρ^=1ki=1khi (遍历的是层内的所有输出, mj=1 则是遍历所有的层))

4. 神经网络中的交叉熵代价函数

为神经网络引入交叉熵代价函数,是为了弥补 sigmoid 型函数的导数形式易发生饱和(saturate,梯度更新的较慢)的缺陷。

首先来看平方误差函数(squared-loss function),对于一个神经元(单输入单输出),定义其代价函数:

C=(ay)22

其中 a=σ(z),z=wx+b ,然后根据对权值( w )和偏置(b)的偏导(为说明问题的需要,不妨将 x=1,y=0 ):
Cw=(ay)σ(z)x=aσ(z)Cb=(ay)σ(z)=aσ(z)

根据偏导计算权值和偏置的更新:

w=wηCw=wηaσ(z)b=bηCb=bηaσ(z)

无论如何简化,sigmoid 型函数的导数形式 σ(z) 始终阴魂不散,上文说了 σ(z) 较容易达到饱和,这会严重降低参数更新的效率。

为了解决参数更新效率下降这一问题,我们使用交叉熵代价函数替换传统的平方误差函数。

对于多输入单输出的神经元结构而言,如下图所示:


这里写图片描述

我们将其损失函数定义为:

C=1nxylna+(1y)ln(1a)

其中 a=σ(z),z=jwjxj+b

最终求导得:

Cw=1nxxj(σ(z)y)Cb=1nx(σ(z)y)

就避免了 σ(z) 参与参数更新、影响更新效率的问题;

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐