1.4 概率统计与信息论 分布、期望与交叉熵
1.开篇先说说,概率这件事为什么躲不开
上一篇我们把模型说成一个函数,把训练说成蒙着眼下山,大家对深度学习那套基本流程大概有点感觉了。这一篇我想把数学的底子再往下挖一层,和大家一起聊聊概率统计和信息论。这块东西很多同学觉得玄,其实它是后面理解损失函数的钥匙,搞透了,你看任何损失都不会再发憷。
先回答一个最根本的问题,深度学习为什么非得请概率上场?
第一个原因,现实里的数据从来都不干净。同样是每天复习5小时,张三这次期末考了85,李四考了82,甚至同一个人两次模拟考的成绩都会有波动。这种没法用确定规则解释的抖动,我们就叫它噪声。只要数据里带着噪声,确定性数学就不够用了,我们得用概率来描述这种不确定性。
第二个原因更关键,分类模型最后吐出来的结果,其实是一串概率。比方说识别一张图片,模型告诉你它是猫的概率0.7、是狗的概率0.2、是其他什么东西的概率0.1。softmax层的全部本事,就是把网络算出来的那一堆原始分数,压成一串加起来等于1的概率。所以说起来,分类模型从头到尾都在和概率打交道。
第三个原因很多人没意识到,我们日常念叨的交叉熵损失、均方误差这些,底层本质都是负对数似然。这句话你现在可能看不太懂,没关系,等讲到最大似然估计那一节你就明白了。总之先把概率的工具攥在手里,后面理解损失函数就能轻松不少。
2.从抛硬币开始:随机变量、分布、期望和方差
随机变量和概率分布
我们从最接地气的抛硬币说起。抛一枚均匀硬币,结果可能是正面,也可能是反面。这种事先没法确定、要等抛完才知道结果的量,我们叫它随机变量,记作 。 能取到的每一个值,都对应一个出现的可能性大小,这个可能性大小就叫概率。我们把 取各种值的概率整体记作 (称为概率分布或概率律),其中某个具体结果 发生的概率写成 。比如正面朝上的概率写成 ,那个 就是正面这个结果发生的可能性。
把 所有能取到的值,连同它们各自的概率,整整齐齐列出来,这就叫概率分布。分布本质上就是一张清单,列出了每个结果对应的概率有多大。
连续型的情况稍微复杂一点。比如考试分数可以取到85.0、85.1、85.13这种连续的值,这时候我们没法逐个去列概率,改用一条叫概率密度函数的曲线来描述,记作 。曲线在某一点越高,说明那个值附近的取值越密集。先记住这个区别就行,离散的我们谈概率,连续的我们谈密度。
期望:长期平均
光知道每个结果的可能性还不够,我们还想知道长期来看这个随机变量平均会落在哪。这个长期平均就叫期望,记作 。
拿骰子举例。掷一枚均匀骰子,点数从1到6每个出现的概率都是1/6。那期望就是:
那个 (读作sigma)是求和符号,意思是把后面 这一整块,从 一直加到 ,下标 就是把每一项编号用的。 这个数你可能觉得有点怪,骰子面上又没有3.5点。但是期望本来就是长期扔骰子、把所有结果平均下来的那个数,你扔个几百上千次,平均值就会稳稳地往3.5靠。
不妨换个角度理解。我之前翻过一本讲统计的书,里面有一句话记得很清楚:短期看运气,长期看期望。小明这次考试可能超常发挥考了高分,下次又失手考砸,但是把整个学期所有考试的成绩平均下来,那基本就贴着期望走。运动员也类似,一场比赛手感火热砍下高分不算难,整个赛季的平均得分才反映真实水平。短期可以靠运气,长期只能看期望。
方差:波动大小
期望告诉我们平均水平,但它管不了这个变量有多跳。一个学生平均分85,可能是次次都稳稳考85,也可能这次100下次70再下次85,两种情况的稳定性完全不一样。衡量这种波动大小的,就叫方差,记作 ,定义是:
它的意思是先看每一次的取值跟期望差了多少(这就是 ),再平方一下把正负号抹掉(不然正负偏差会互相抵消),最后把这些平方偏差求个期望,得到的就是平均的偏离程度。方差越大,说明这个变量越喜欢乱蹦,越不稳定。
方差开个根号,就得到标准差,记作 ,它和原始数据同一个量纲,读起来更直观。深度学习里我们更常拿方差说话,因为 在数学推导里更顺手,后面高斯分布你也会看到它反复出场。
3.三种最常见的分布
伯努利分布:二分类的亲妈
最简单的随机变量只有两个取值,成功或者失败、正面或者反面、垃圾邮件或者正常邮件。我们把成功记作1,成功的概率记作 ,那么失败就是0,概率是 。这种只有两种结果、由一个参数 决定的分布,就叫伯努利分布。
二分类任务最后输出的就是伯努利分布。模型给你一个 ,告诉你这张图片是猫的概率有多大,剩下的 就是这张图不是猫的概率。sigmoid函数干的事,就是把网络最后一层那个随便多大的数,压到0到1之间,好让它能当 来用。
范畴分布:多分类的标准答案
如果结果不止两种呢?比如掷骰子有6种结果、识别ImageNet有1000种类别。这时候我们就升级到范畴分布(categorical distribution,可以理解成多项分布的一种特殊情况)。它由一组概率 决定, 是类别总数, 表示第 类的概率,这些概率加起来必须等于1。
softmax输出的就是一组范畴分布的概率。网络最后一层吐出 个原始分数,softmax把它们重新归一化,得到一组和为1的概率。你看到的(这张图80%是猫、15%是狗、5%是鸟)这种输出,背后的数学结构就是范畴分布。
高斯分布:那口无处不在的钟形曲线
最后出场的,是深度学习里最尊贵的存在,高斯分布(也叫正态分布)。它的概率密度画出来就是一口对称的钟形曲线,中间高、两头低,记作 。(读作mu)是均值,决定钟的中心落在哪儿。 就是上一节说的方差,决定这口钟有多胖多扁。
高斯分布的密度函数长这样:
那个 是自然常数 的幂次, 是圆周率, 是开平方。这串公式你现在不用死记,记住它的形状就够了,离均值 越近的值出现的概率密度越大,越往两边走越稀罕。
高斯分布为什么这么重要呢,因为现实里很多噪声都近似服从它。这背后有个叫中心极限定理的数学结论,说一大堆独立的小噪声叠加起来,最终分布会逼近高斯。所以当我们假设模型误差是高斯噪声的时候,均方误差这种损失就自然而然地冒出来了。考试成绩被老师强行curve成正态分布,也是同一口钟在起作用。这一点等下讲最大似然估计的时候会再串一次。
4.最大似然估计:损失函数的祖师爷
似然是什么
分布讲完了,我们反过来问一个更要命的问题,分布的参数是怎么定下来的?伯努利分布的 是0.6还是0.7,高斯分布的 是85还是82,这些数谁说了算?总不能凭空拍脑袋猜一个。
最大似然估计(Maximum Likelihood Estimation,简称MLE)给了一个特别朴素的回答:我已经观测到了一批数据,那就去找一组参数,让这批数据出现的可能性最大。换句话说,如果真实参数真的是某个值,那手头这批数据出现的概率应该比较大。既然这批数据偏偏出现了,那最合理的猜测,就是那个能让它出现概率最大的参数。
一个小例子
假设我有一枚不知来路的硬币,抛了10次,7次正面3次反面。我想估计正面朝上的概率 。按照MLE,我们要最大化(7正3反)这件事发生的概率,这个概率可以写成 。我们想让这个数最大。
直接对 求导,令导数为0,解出来 。直觉上就是这样,你看到10次里出了7次正面,那最靠谱的猜测就是这枚硬币正面概率0.7。MLE在这一刻显得特别通情达理。
取个负对数,损失就出来了
现实里我们不直接最大化 这种东西。原因之一是好几个概率乘起来数值会特别小(你想想0.1乘以0.1再乘以0.1),计算机算起来容易下溢。原因之二是连乘求导不如连加好算。所以我们取个对数,把连乘变成连加,顺手加个负号,把最大化翻成最小化。
对刚才那个例子取负对数,就得到 。那个 就是对数函数,它把乘积变成加和。这个形式是不是有点眼熟?说穿了,它就是二分类交叉熵损失的原型。每个样本贡献一项 (当真实标签是正类),或者 (当真实标签是负类),全部加起来求平均,就是你在PyTorch里调用的那个 BCELoss。
所以最小化损失和最大化似然讲的是同一回事,只不过一个带了负号、一个没带。这层窗户纸一旦捅破,你看各种损失函数的设计都会通透很多。
从高斯噪声的 MLE 推出均方误差。 这条线我顺便推完,免得你心里留个疙瘩。假设真实的标签 等于模型的预测 加上一个零均值、方差 的高斯噪声:,。那么在给定 时, 的条件分布就是 ,密度函数:
设 个样本独立,似然是各样本密度相乘 ,取负对数似然:
后面那一项 跟参数(模型权重)无关,优化时是常数可以扔掉。 也是常数缩放,不影响最优解的位置。于是最小化负对数似然,等价于最小化 ,除以 就是均方误差 MSE。
这一推把两件事钉死了:均方误差不是随便选的损失,它就是"假设噪声服从高斯分布"这件事用 MLE 推出来的必然结果。 同理,你把噪声换成拉普拉斯分布(密度是 ),MLE 推出来就是平均绝对误差 MAE。换一个噪声假设,就换一个损失——这种"假设决定损失"的视角,比死记"MSE 管回归、交叉熵管分类"要深刻得多。
5.信息论三件套:熵、交叉熵和KL散度
MLE那条线讲完,我们顺势拐进信息论。信息论里有三个概念你绕不开,熵、交叉熵和KL散度,它们三个一脉相承。
熵:衡量到底有多意外
熵(entropy)衡量的是一个分布的不确定性,换句话说就是你每次看到结果平均有多意外。分布记作 ,它的熵定义为:
那个 就是熵的记号, 表示对所有可能的结果 求和, 是结果 发生的概率, 还是对数。
举个对比例子你就懂了。如果一枚硬币两面都是正面,那你抛它之前就已经知道结果,毫无意外可言,熵就是0。如果硬币是均匀的,正反各0.5,你抛之前完全猜不准,这时候熵最大。分布越平均、越没法预测,熵就越大。分布越偏、越能提前押中,熵就越小。
这件事放到各行各业都成立。一部悬疑小说如果开头就让你猜到凶手,读完没什么波澜,熵就低,一部好的反转剧,每集都给你来个没想到,那种意外感就是高熵。体育比赛也一样,实力悬殊的两支球队对打,结果几乎没悬念,熵就低,势均力敌的德比战,输赢全看临场,熵就高。理解了这层,你就抓住了熵的精髓。
交叉熵:分类任务的标准损失
交叉熵(cross entropy)登场了,这是分类任务里出场率最高的损失,没有之一。它的定义是:
这里 是真实分布(标签告诉我们的事实), 是模型预测出来的分布。直观上你可以这么理解,我们本来应该用 这套最优编码来记录真实结果,每个结果平均花 那么多比特,但是现在模型非要让我们用 这套不靠谱的编码去记,那肯定要多花点代价。这个多出来的总代价,就是交叉熵 。
把它和MLE那条线接上。在多分类任务里,真实标签其实是一个one-hot向量,只有一个位置是1,其余全是0(这种特殊的分布就是退化版的范畴分布)。把这种 代进交叉熵公式,整个求和里只有真实类别那一项乘上了1还活着,其他项乘上0全没了,最后简化成 。这就是负对数似然本人,眼熟吧?所以多分类里的交叉熵损失,本质上就是MLE的另一种说法。
当模型预测的真实类别概率 越接近1, 就越接近0。预测越离谱、 越接近0, 就越往正无穷飙。这种对了几乎不罚、错了往死里罚的特性,正好是分类任务想要的,这就是为什么交叉熵能稳坐分类损失的头把交椅。
KL散度:两个分布差多少
最后一位,KL散度(Kullback-Leibler divergence)。它衡量的是两个分布 和 差了多少,定义是:
里面那个 是两个概率的比值, 取对数再对 求和。它有一段特别重要的关系式:
意思是交叉熵等于真实分布自己的熵,加上从 到 的KL散度。由于训练数据固定下来之后,真实分布 的熵 就是个常数,不影响优化,所以最小化交叉熵,等价于最小化KL散度。这下三条线就全接上了,MLE、交叉熵、KL散度,其实是同一件事的三个面孔。
不过KL散度有两个小脾气你要记住。第一,它非对称, 和 一般不相等,所以它严格来说不能叫距离,只能叫散度。第二,它永远非负,只有当 和 完全相同的时候才等于0。这个非负性后面会在变分推断、VAE那些地方反复出场,到时候你会再见到它。
为什么 KL 散度非负:用 Jensen 不等式证明。 这条性质太重要,光记住结论心里不踏实,我们把它推一遍。KL 散度可以换个写法:。注意后面这个形式,它是把 这个函数(凹函数)作用在随机变量 上、再对服从 的 求期望,最后加个负号。
这里要用到 Jensen 不等式:对任何凹函数 ( 正是凹函数,因为它的二阶导数 ),有 。把 、随机变量 代入:
最后一步用了所有概率加起来等于1。把这个结果代回 KL 散度的式子:
所以 KL 散度恒非负。等号什么时候成立?Jensen 不等式取等号的条件是随机变量恒为常数,即 对所有 都一样,也就是 。这就完整证明了"KL 散度非负,且当且仅当两分布相同时为零"。这个证明后面讲 VAE 的 ELBO 时会原封不动再用一次,你在这儿先把它吃透。
6.贝叶斯定理:把信念和证据缝起来
最后我们带一笔贝叶斯定理。它的核心公式长这样:
这个公式不是凭空蹦出来的,它从条件概率的定义两步就能推出来。 条件概率的定义是 ,其中 是 和 同时发生的联合概率。把这个定义套到 和 上:
两式里的 是同一个东西(联合概率),从第二个式子反解出 ,代入第一个式子,就得到贝叶斯定理。就这么简单——它不过是"条件概率定义 + 联合概率的两种写法"的直接推论。
里面几个零件我先解释清楚。 是我们关心的参数(比如模型那一堆权重), 是我们观测到的数据,竖线 读作给定, 表示在给定数据 的条件下参数 的概率。 是先验,就是我们没看到数据之前对参数 的初始信念,凭经验拍的。 是似然,就是假设参数真的是 ,数据 出现的概率,MLE里我们最大化的就是这个。 是后验,就是看完数据之后我们对参数的更新信念。 是个归一化常数,负责把后验压成一个合法的概率(加起来等于1)。
贝叶斯定理干的活,就是把先验信念和观测证据缝起来,得到一个更新后的信念。你可以把它想成一个不断刷新认知的过程,每次看到新数据,后验就变成下一轮的先验,信念被一点一点地修正。某部侦探小说里有个经典桥段,主角每发现一条线索,就更新一次对嫌疑人的怀疑程度,这种抽丝剥茧的节奏,其实就是贝叶斯定理的生活化版本。频率派(MLE那一拨)和贝叶斯派(这一拨)的分歧,核心就在于参数到底要不要给它加个先验。深度学习里大部分时候走频率派路线,但是贝叶斯神经网络、不确定性估计这些方向,全靠这套路子吃饭。
7.收个尾
概率统计和信息论是理解损失函数的钥匙。分布刻画数据是怎么生出来的,期望和方差给出中心点和抖动幅度。至于为什么要最小化那一个特定的损失,MLE给了答案。分类损失为什么长那个样子,要靠熵和交叉熵来解释。两个分布差多少,则交给KL散度。把这些串起来,你以后看到任何一个损失函数,都能把它读成一段有逻辑的话,那些冷冰冰的符号也就不可怕了。
下一篇我们会进入微积分和凸优化的地盘,聊聊导数、梯度之外更完整的优化视角,以及为什么有些损失好优化、有些损失坑多得离谱。
下一章见。
练习
Q1. 最小化交叉熵和最大化伯努利似然,为什么说是同一件事?这跟"分类为什么不用 MSE"怎么接上?
二分类标签 服从伯努利分布,单个样本概率是 , 个样本似然连乘。取负对数再除以 取平均,正好就是二元交叉熵损失。所以最小化交叉熵 = 最大化伯努利似然。而 MSE 背后假设的是高斯分布,跟分类标签的伯努利分布对不上号,再把 sigmoid 套进 MSE 还会拖一个 让梯度消失,两头不合适,所以分类该用交叉熵。
Q2. 一枚不知来路的硬币抛了 10 次,7 次正面 3 次反面。用 MLE 估正面概率 ,并写出对应的负对数似然形式。
似然是 ,对 求导令其为零,解出 ——看到 10 次里 7 次正面,最靠谱的猜测就是正面概率 0.7。取负对数得 ,这正是二分类交叉熵的原型:正类样本贡献 ,负类贡献 。
Q3. KL 散度有哪两个"小脾气"?其中一个能严格证出来,是哪个?
第一,非对称, 和 一般不相等,所以它只能叫散度不能叫距离。第二,永远非负,只有 时才等于 0。非负这条能用 Jensen 不等式证: 是凹函数,有 ,加个负号就得 。
Q4.(面试题) 完整推一遍"假设噪声服从零均值高斯分布,用 MLE 推出来的损失就是 MSE"。
设真实标签 ,噪声 ,则给定预测 时 ,密度 。 个样本独立,似然连乘 ,取负对数:。后一项跟权重无关是常数可以扔, 是常数缩放不影响最优解的位置,于是最小化它等价于最小化 ,除以 就是 MSE。这说明 MSE 不是随便选的,它就是"噪声服从高斯分布"这件事用 MLE 推出来的必然结果(同理,换成拉普拉斯噪声会推出 MAE)。