机器学习基础(六)—— 交叉熵代价函数(cross-entropy error)

交叉熵代价函数

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) 参与参数更新、影响更新效率的问题;

  • 19
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值