Pytorch-交叉熵

1、交叉熵的来源

1.1 信息量

一条信息的信息量大小和它的不确定性有很大的关系。一句话如果需要很多外部信息才能确定,我们就称这句话的信息量比较大。比如你听到“云南西双版纳下雪了”,那你需要去看天气预报、问当地人等等查证(因为云南西双版纳从没下过雪)。相反,如果和你说“人一天要吃三顿饭”,那这条信息的信息量就很小,因为这条信息的确定性很高。

那我们就能将事件x_0的信息量定义如下(其中p(x_0)表示事件x_0发生的概率):

I(x_0) = -log(p(x_0)),(1)

-log(x)

1.2 熵

信息量是对于单个事件来说的,但是实际情况一件事有很多种发生的可能,比如掷骰子有可能出现6种情况,明天的天气可能晴、多云或者下雨等等。熵是表示随机变量不确定的度量,是对所有可能发生的事件产生的信息量的期望。公式如下:

H(X) = -\sum_{i=1}^{n} p(x_i)log(p(x_i)),(2)

-xlog(x)的曲线如下:

-xlog(x)

结合熵的公式(2)以及-xlog(x)曲线,当这些所有可能发生事件的概率比较小(接近0)或者比较大(接近1)时,熵的值会比较小;如果事件发生的概率既远离0也远离1时,熵的值就会比较大。

例如,如下三组事件比较:
1)事件概率均等,[0.2500, 0.2500, 0.2500, 0.2500],熵为2;
2)事件概率比较靠近0或者1,[0.1, 0.1, 0.1, 0.7],熵为1.3568;
3)事件概率极其靠近0或者1,[0.001, 0.001, 0.001, 0.999],熵为0.0313.


熵的一种比较特殊的情况就是掷硬币,只有正、反两种情况,该种情况(二项分布或者0-1分布)熵的计算可以简化如下:

H(X) = -\sum_{i=1}^{n} p(x_i)log(p(x_i))= -p(x)log(p(x)) - (1-p(x))log(1-p(x)),(3)

其中,p(x)表示正面概率。

1.3 相对熵

相对熵又称KL散度,用于衡量对于同一个随机变量x的两个分布p(x)q(x)之间的差异。在机器学习中,p(x)常用于描述样本的真实分布,例如[1,0,0,0]表示样本属于第一类,而q(x)则常常用于表示预测的分布,例如[0.7,0.1,0.1,0.1]。显然使用q(x)来描述样本不如p(x)准确,q(x)需要不断地学习来拟合准确的分布p(x)

KL散度的公式如下:

D_{KL}(p||q) = \sum_{i=1}^{n}p(x_i)log(\frac{p(x_i)}{q(x_i)})

KL散度的值越小表示两个分布越接近。

1.4 交叉熵

我们将KL散度的公式进行变形,得到:

D_{KL}(p||q) = \sum_{i=1}^{n}p(x_i)log({p(x_i)}) - \sum_{i=1}^{n} p(x_i)log({q(x_i)}) \\ = - H(p(x)) + [- \sum_{i=1}^{n} p(x_i)log({q(x_i)})]

前半部分就是p(x)的熵,后半部分就是我们的交叉熵:

H(p,q) = - \sum_{i=1}^{n} p(x_i)log({q(x_i)})

机器学习中,我们常常使用KL散度来评估predict和label之间的差别,但是由于KL散度的前半部分是一个常量,所以我们常常将后半部分的交叉熵作为损失函数,其实二者是一样的。

2、交叉熵损失函数比二次代价函数作损失函数要性能优异

交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式。与二次代价函数相比,它能更有效地促进ANN的训练。在介绍交叉熵代价函数之前,本文先简要介绍二次代价函数,以及其存在的不足。

2.1 二次代价函数的不足

ANN的设计目的之一是为了使机器可以像人一样学习知识。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理,我们希望:ANN在训练时,如果预测值与实际值的误差越大,那么在反向传播训练的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛。然而,如果使用二次代价函数训练ANN,看到的实际效果是,如果误差越大,参数调整的幅度可能更小,训练更缓慢。

以一个神经元的二类分类训练为例,进行两次实验(ANN常用的激活函数为sigmoid函数,该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的第一次前向传播后得到不同的输出值,形成不同的代价(误差):

实验1:第一次输出值为0.82
实验2:第一次输出值为0.98

在实验1中,随机初始化参数,使得第一次输出值为0.82(该样本对应的实际值为0);经过300次迭代训练后,输出值由0.82降到0.09,逼近实际值。而在实验2中,第一次输出值为0.98,同样经过300迭代训练,输出值只降到了0.20。

从两次实验的代价曲线中可以看出:实验1的代价随着训练次数增加而快速降低,但实验2的代价在一开始下降得非常缓慢;直观上看,初始的误差越大,收敛得越缓慢。

其实,误差大导致训练缓慢的原因在于使用了二次代价函数。二次代价函数的公式如下:

C = \frac{1}{2n} \sum_{x} ||y(x) - a^{L}(x)||^2

其中,C表示代价,x表示样本,y表示实际值,a表示输出值,n表示样本的总数。为简单起见,同样一个样本为例进行说明,此时二次代价函数为:

C=\frac{(y-a)^2}{2 }

目前训练ANN最有效的算法是反向传播算法。简而言之,训练ANN就是通过反向传播代价,以减少代价为导向,调整参数。参数主要有:神经元之间的连接权重w,以及每个神经元本身的偏置b。调参的方式是采用梯度下降算法(Gradient descent),沿着梯度方向调整参数大小。wb的梯度推导如下:

\frac{\partial C}{\partial w} = (a - y) \sigma ^{'}(z)x

\frac{\partial C}{\partial b} = (a - y) \sigma ^{'}(z)

其中,z表示神经元的输入,\sigma表示激活函数。从以上公式可以看出,wb的梯度跟激活函数的梯度成正比,激活函数的梯度越大,wb的大小调整得越快,训练收敛得就越快。而神经网络常用的激活函数为sigmoid函数,该函数的曲线如下所示:

如图所示,实验2的初始输出值(0.98)对应的梯度明显小于实验1的输出值(0.82),因此实验2的参数梯度下降得比实验1慢。这就是初始的代价(误差)越大,导致训练越慢的原因。与我们的期望不符,即:不能像人一样,错误越大,改正的幅度越大,从而学习得越快。

可能有人会说,那就选择一个梯度不变化或变化不明显的激活函数不就解决问题了吗?那样虽然简单粗暴地解决了这个问题,但可能会引起其他更多更麻烦的问题。而且,类似sigmoid这样的函数(比如tanh函数)有很多优点,非常适合用来做激活函数,具体请自行google之。

2.2 交叉熵代价函数

换个思路,我们不换激活函数,而是换掉二次代价函数,改用交叉熵代价函数:

C = -\frac{1}{n} \sum_{x} [y \log(a) + (1-y) \log(1-a)]

其中,x表示样本,n表示样本的总数。那么,重新计算参数w的梯度:

\frac{\partial C}{\partial w_j} = -\frac{1}{n} \sum_{x}[\frac{y}{\sigma(z)} - \frac{1-y}{1-\sigma(z)}] \frac{\partial \sigma(z)}{\partial w_j} \\ = -\frac{1}{n} \sum_{x}[\frac{y}{\sigma(z)} - \frac{1-y}{1-\sigma(z)}] \sigma ^{'}(z) \frac{\partial z }{\partial w_j} \\ = -\frac{1}{n} \sum_{x}[\frac{y}{\sigma(z)} - \frac{1-y}{1-\sigma(z)}] (1-\sigma(z)\sigma(z)) \frac{\partial z }{\partial w_j } \\ = \frac{1}{n} \sum_{x}[\sigma(z)-y]x_{j}

因此,w的梯度公式中原来的\sigma^{'}(z)被消掉了;另外,该梯度公式中的\sigma(z)-y表示输出值与实际值之间的误差。所以,当误差越大,梯度就越大,参数w调整得越快,训练速度也就越快。 实际情况证明,交叉熵代价函数带来的训练效果往往比二次代价函数要好。

3、交叉熵损失函数的计算

3.1 交叉熵损失函数的使用

3.2 交叉熵损失函数在实际分类中的使用

在实际分类任务中,要先将输出层的输出值经过Softmax函数,再经过log函数,最后才用交叉熵损失函数计算损失。

pytorch中有计算交叉熵损失的接口,即F.cross_entropy(),不过该接口包含了Softmax函数、log函数、交叉熵损失函数。也就是说F.cross_entropy() = F.softmax() + torch.log() + F.nnl_loss()。即使如此,也要使用F.cross_entropy(),不仅是因为它简单,更因为它能保证数值稳定。

4、机器如何“学习”?

机器学习的过程就是希望在训练数据熵 模型学到的分布P(model)真实的分布P(real)越近越好,我们知道KL散度可以表示两个分布之间的不同。

但我们没有真实数据的分布,那么只能退而求其次,希望模型学到的分布和训练数据的分布P(training),也就是把训练数据当做模型和真实数据之间的代理人。假设训练数据是从总体中独立同步分布采样(Independent and identically distributed sampled)而来,那么我们可以利用最小化训练数据的经验误差来降低模型的泛化误差。简单说:

  • 最终目的是希望学到的模型的分布和真实分布一致:P(model)近似于P(real)
  • 但真实分布是不可知的,我们只好假设 训练数据 是从真实数据中独立同分布采样而来:P(training)近似于P(real)
  • 退而求其次,我们希望学到的模型分布至少和训练数据的分布一致:P(model)近似于P(training)

由此非常理想化的看法是如果模型(左)能够学到训练数据(中)的分布,那么应该近似的学到了真实数据(右)的分布:P(model)近似于P(training)近似于P(real)

参考文献

简单的交叉熵,你真的懂了吗?
交叉熵损失函数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容