我们为什么这样选择损失函数
这个问题深度学习中的 “圣经” 花书中进行阐述,这里做一个简单的总结和自己的思考。
先从信息熵开始说起
- 信息论的基本想法是一个不太可能发现的事件居然发生了,要比一个非常可能的事件发生,能提供更多的信息。例如,消息说: “今天早上太阳照常升起”,信息量是如此的少,以至于没有必要发送;但一条信息说:“今天早上有日食”,信息量就很丰富了。
- 我们想通过这种基本想法来量化信息,特别是:
- 非常可能发生的事件信息量比较少,并且在极端条件下,一定能够发生的事件应该没有任何信息量
- 较不可能发生的事件具有更高的信息量
- 独立事件应具有增量的信息。例如,投掷的硬币两次正面朝上传递的信息量,应该是投掷一次硬币正面朝上的信息的两倍
- 为了满足上述 3 个性质,我们定义了一个事件
x=x
x
=
x
的自信息(Self-information):
I(x)=−logP(x)(1) (1) I ( x ) = − log P ( x ) 自信息只处理单个信息。我们用香农熵(Shannon Entropy,也叫信息熵)来量化事件的整个概率分布,它的定义为:
H(x)=Ex∼P[I(x)]=−Ex∼P[logP(x)](2) (2) H ( x ) = E x ∼ P [ I ( x ) ] = − E x ∼ P [ log P ( x ) ]
举个例子来感性认知下信息熵。假设你想通过身高来预测体重,于是你去收集了身高以及对应的体重,通过分析你发现,当身高一样时,体重是符合高斯分布的。比如,身高170cm,有的65kg,有的人70kg,有的人60kg,虽然体重各有不同,但是基本满足均值 μ1=65 μ 1 = 65 ,方差为 σ1 σ 1 的高斯分布。通过信息熵的计算公式,我们可以计算得到,当体重 x∼N(x;μ1;σ1) x ∼ N ( x ; μ 1 ; σ 1 ) 时, H(x)=log(σ2πe−−−√) H ( x ) = log ( σ 2 π e ) 。(想知道怎么算吗?请看 这里。什么?只想知道结果?请看 这里)接下来是相对熵,或者说 K-L 散度,它衡量了两个分布之间的差异,它的定义如下,其中 P(x) P ( x ) , Q(x) Q ( x ) 是两个独立的概率分布
DKL(P∥Q)=Ex∼P[logP(x)Q(x)]=Ex∼P[logP(x)−logQ(x)](3) (3) D K L ( P ‖ Q ) = E x ∼ P [ log P ( x ) Q ( x ) ] = E x ∼ P [ log P ( x ) − log Q ( x ) ]
emmmm,我知道这有点抽象,没关系我们继续看例子。同样的,你想通过身高来预测体重,你收集完中国人的数据,于是你就去收集美国人的数据,结果你发现,美国人在身高相同的情况下,体重分布也满足高斯分布,但是均值 μ=70 μ = 70 ,方差为 σ2 σ 2 。那么很明显,如果你只是用中国人的数据训练了一个模型,然后用这个模型去预测美国人的体重这是不正确的,这种 “不正确” 的量化,我们可以用散度来表示。例如,两个高斯分布的散度是:
KL(P,Q)=logσ1σ2+σ21+(μ1−μ2)22σ22−12(4) (4) K L ( P , Q ) = log σ 1 σ 2 + σ 1 2 + ( μ 1 − μ 2 ) 2 2 σ 2 2 − 1 2
想知道怎么算吗?这里、这里 或者 这里。回头看这里式子,如果 μ1=μ2,σ1=σ2 μ 1 = μ 2 , σ 1 = σ 2 ,那么 KL(P,Q)=0 K L ( P , Q ) = 0 ,因为P、Q分布是一样的。
Loss 函数与 KL 散度之间的关系
深度学习(或者其他的机器学习方法)的训练流程通常是
- 定义 Loss 函数
- 梯度下降法最小化 Loss 值
例如回归问题中,我们常用 L2 作为 Loss 函数,为什么选择 L2 呢?以前都没有思考过,或者说,这有什么好思考的!书上,教程上都是这么用的。那么今天我们就来好好的思考思考,学过了 KL 散度,我们可以从这个角度进行阐述。
先说结论:最小化 Loss 值的过程,其实就是最小化 KL 散度的过程。为了更清楚的说明,我们以用身高预测体重为例。首先定义符号, x x 表示身高,表示体重, θ θ 表示概率分布的参数(例如高斯模型中的 μ μ 和 σ σ ), pmodel(y|x;θ) p m o d e l ( y | x ; θ ) 表示身高为 x x 时,体重为的概率。例如 pmodel(65|173;θ)=0.6 p m o d e l ( 65 | 173 ; θ ) = 0.6 表示 身高 173 时,体重为 65 的概率为 0.6。
我们希望 pmodel(y|x;θ)≈pdata(y|x) p m o d e l ( y | x ; θ ) ≈ p d a t a ( y | x ) ,其中 pdata p d a t a 就是训练集的分布。衡量两个分布的距离恰好可以用 KL 散度来表示,因此:
minDKL(pdata∥pmodel)=minEx∼pdata[logpdata(y|x)−logpmodel(y|x;θ)](14) (14) min D K L ( p d a t a ‖ p m o d e l ) = min E x ∼ p d a t a [ log p d a t a ( y | x ) − log p m o d e l ( y | x ; θ ) ]
左边一项仅涉及数据生成过程,和模型无关。这意味着在最小化 KL 时,我们只需要最小化
min−Ex∼pdata[logpmodel(y|x;θ)](15) (15) min − E x ∼ p d a t a [ log p m o d e l ( y | x ; θ ) ]如果我们假设 pmodel(y|x)=N(y;y^(x;w),σ2) p m o d e l ( y | x ) = N ( y ; y ^ ( x ; w ) , σ 2 ) ,其中 y^(x;w) y ^ ( x ; w ) 表示输入为x,模型参数为 w w 的情况下,模型的输出(终于引入了模型参数,注意这里的模型参数与上述的分布参数是两回事),根据这个假设,那么有
- 其中 p(xi)=1 p ( x i ) = 1 (因为 xi x i 已经出现在训练集中,因此 p(xi)=1 p ( x i ) = 1 ,这样的解释对吗?)。式子(7)前面两项与参数 w w 无关,因此在求导时,这两项无关。因此,对比 L2 损失函数和式子(7)的最后一项,我们立刻可以看出,最小化 KL 散度和最小化均方差会得到相同的模型参数。但是对于相同最优的 ,式子(8)的值与 L2 的值是不同的。
- 通过上述的分析,我们知道我们在选择一个 Loss 作为最小化目标的时候,就对样本的分布做出了假设。例如,选择 L2 时,假设样本是高斯分布;选择 L1 时,假设样本是拉普拉斯分布;选择 binary cross entropy 时,假设样本是 Bernoulli 分布;选择 categorical cross entropy 时,假设样本是 Multinoulli 分布。然后通过最小化 Loss,使得模型概率分布接近数据的概率分布,即最小化 KL散度。
但是正确的思考方式应该是:
- 首先假设样本的概率分布
- 根据分布概率,选择 Loss 函数
- 训练模型
通常情况下,我们直接从第二步开始,而忽略了第一步,当然也无伤大雅,因为前人们已经帮我们总结了常见问题的概率分布,已经提出合适 Loss 函数。
其他
- 花书的第五章用最大似然法来解释模型训练的目的,得到的结论是类似的:最大化关于 w w 的对数似然数和最小化 Loss 会得到相同的参数估计。然后,最大似然法又可以用 KL 散度的角度来解释,非常的神奇。
- 在花书6.2.1.2中,用变分法对代价函数做出了更为具体的解释:用 L2 作为代价函数,所有可行解的均值;用 L1 作为代价函数,所有可行解的中位数