最大似然估计
什么是参数估计?假设我们有一个映射函数 f θ f_\theta fθ可以将输入 X ∈ R n X\in R^n X∈Rn映射到一个概率,其中 θ \theta θ是映射函数的参数,未知待求解。现在我们有一组采样值 { X i } \{X_i\} {Xi},诉求是通过这些采样值估计一下映射函数的参数,本质上呢就是根据采样值得到随机变量 X X X的联合分布。常用的方法有矩估计法、最大似然估计,而最大似然估计在机器学习中很常见,值得学习一下。
最大似然,字面意思上理解就是“最像那么回事的”。我们不妨将映射函数记为
f
(
X
,
θ
)
f(X,\theta)
f(X,θ)。根据第i个样本
X
i
X_i
Xi可以得到一个输出
f
θ
(
X
i
)
f_\theta(X_i)
fθ(Xi),我们可以理解为在这一次采样中可以得到那么多值,但我们恰恰得到了
X
i
X_i
Xi,翻译翻译就是得到
X
i
X_i
Xi样本的概率很大啊。在这个想法的基础上,我们把
θ
\theta
θ作为变量,从样本
X
i
X_i
Xi这一采样结果,我们得到的信息是,
θ
\theta
θ应该使
f
(
X
i
,
θ
)
f(X_i,\theta)
f(Xi,θ)最大(函数将输入映射为概率,应该找一组参数使概率最大)。现在我们有N个采样,将其N个概率乘起来得到了似然函数:
L
θ
=
∏
i
f
(
X
i
,
θ
)
L_\theta=\prod_i f(X_i,\theta)
Lθ=i∏f(Xi,θ),最大似然估计就是求一组参数
θ
^
\hat\theta
θ^,使似然函数最大:
θ
^
=
arg max
θ
L
θ
=
arg max
θ
∏
i
f
(
X
i
,
θ
)
\hat\theta = \argmax_{\theta}L_\theta= \argmax_{\theta}\prod_i f(X_i,\theta)
θ^=θargmaxLθ=θargmaxi∏f(Xi,θ)
现将问题转换到二分类问题中,将映射函数的输出记为
Y
Y
Y,可以是分类问题中的标签0和1,采样结果为
{
(
X
i
,
Y
i
)
}
\{(X_i,Y_i)\}
{(Xi,Yi)}。当
Y
i
=
1
Y_i=1
Yi=1时应该似然函数为
f
(
X
i
,
θ
)
f(X_i,\theta)
f(Xi,θ),当
Y
i
=
0
Y_i=0
Yi=0时似然函数为
1
−
f
(
X
i
,
θ
)
1-f(X_i,\theta)
1−f(Xi,θ),此时将似然函数写为如下形式:
L
θ
=
∏
i
f
(
X
i
,
θ
)
Y
i
(
1
−
f
(
X
i
,
θ
)
)
1
−
Y
i
L_\theta=\prod_i f(X_i,\theta)^{Y_i}(1-f(X_i,\theta))^{1-Y_i}
Lθ=i∏f(Xi,θ)Yi(1−f(Xi,θ))1−Yi,最大似然估计为:
θ
^
=
arg max
θ
∏
i
f
(
X
i
,
θ
)
Y
i
(
1
−
f
(
X
i
,
θ
)
)
1
−
Y
i
\hat\theta = \argmax_{\theta}\prod_i f(X_i,\theta)^{Y_i}(1-f(X_i,\theta))^{1-Y_i}
θ^=θargmaxi∏f(Xi,θ)Yi(1−f(Xi,θ))1−Yi
一般求解最大似然估计问题,都会取对数将连乘转换为连加。并且由此可以推导出二分类的交叉熵损失函数,由于
L
θ
∝
l
n
L
θ
L_\theta\propto lnL_\theta
Lθ∝lnLθ,因此:
θ
^
=
arg max
θ
l
n
L
θ
=
arg max
θ
∑
i
Y
i
l
n
f
θ
(
X
i
)
+
(
1
−
Y
i
)
l
n
(
1
−
f
θ
(
X
i
)
)
=
arg max
θ
∑
i
Y
i
l
n
Y
i
^
+
(
1
−
Y
i
)
l
n
(
1
−
Y
i
^
)
\hat\theta = \argmax_{\theta}lnL_\theta\\ =\argmax_{\theta}\sum_iY_ilnf_\theta(X_i)+(1-Y_i)ln(1-f_\theta(X_i))\\ =\argmax_{\theta}\sum_iY_iln\hat{Y_i}+(1-Y_i)ln(1-\hat{Y_i})
θ^=θargmaxlnLθ=θargmaxi∑Yilnfθ(Xi)+(1−Yi)ln(1−fθ(Xi))=θargmaxi∑YilnYi^+(1−Yi)ln(1−Yi^)
最优化问题通常求最小值,加上负号就得到了二分类的交叉熵损失函数:
B
C
E
L
o
s
s
=
−
∑
i
Y
i
l
n
Y
i
^
+
(
1
−
Y
i
)
l
n
(
1
−
Y
i
^
)
BCELoss=-\sum_iY_iln\hat{Y_i}+(1-Y_i)ln(1-\hat{Y_i})
BCELoss=−i∑YilnYi^+(1−Yi)ln(1−Yi^)
可以看到,
Y
i
Y_i
Yi和
1
−
Y
i
1-Y_i
1−Yi的作用类似于选择,将BCE可以扩展到CrossEntropyLoss,而交叉熵损失其实就是二分类交叉熵损失的自然扩展,扩展到C个类别而已:
C
E
L
o
s
s
=
−
∑
i
l
n
y
i
,
c
^
CELoss=-\sum_iln\hat{y_{i,c}}
CELoss=−i∑lnyi,c^,其中
y
i
,
c
^
=
L
o
g
s
o
f
t
m
a
x
(
Y
i
^
[
c
]
)
\hat{y_{i,c}}=Logsoftmax(\hat{Y_i}[c])
yi,c^=Logsoftmax(Yi^[c]),假设
Y
i
^
∈
R
C
\hat{Y_i}\in \mathbb{R}^C
Yi^∈RC,
Y
i
^
[
c
]
\hat{Y_i}[c]
Yi^[c]表示取第c个元素,之前pytorch上的公式看不懂,就是因为没有理解这个意思。
交叉熵
交叉熵也能推出上面的交叉熵损失函数。交叉熵用到了信息论,使用
I
(
X
i
)
I(X_i)
I(Xi)表示随机事件
X
X
X的某一次采样
X
i
X_i
Xi所蕴含的信息量级:
I
(
X
i
)
=
−
l
o
g
P
(
X
i
)
I(X_i)=-logP(X_i)
I(Xi)=−logP(Xi)
,意思是概率越小的采样事件所包含的信息量越大。就比如一个经典的例子:“明天下雨”这个事件要比“明天太阳从东方升起”这个事件包含的信息量更大,因为太阳明天一定从东方升起,而明天下雨不一定。而熵则定义为信息量的期望:
H
(
P
)
=
E
X
∼
P
I
(
X
)
=
−
1
N
∑
i
P
(
X
i
)
l
o
g
P
(
X
i
)
H(P)=\mathbb{E}_{X\sim P}I(X)=-\frac{1}{N}\sum_iP(X_i)logP(X_i)
H(P)=EX∼PI(X)=−N1i∑P(Xi)logP(Xi)
KL散度用来衡量两个分布P和Q的相似度,
D
K
L
(
P
,
Q
)
=
E
X
∼
P
l
o
g
P
(
X
)
Q
(
X
)
=
1
N
∑
i
P
(
X
i
)
l
o
g
P
(
X
i
)
−
P
(
X
i
)
l
o
g
Q
(
X
i
)
=
H
(
P
,
Q
)
−
H
(
P
)
D_{KL}(P,Q)=\mathbb{E}_{X\sim P}log\frac{P(X)}{Q(X)}=\frac{1}{N}\sum_iP(X_i)logP(X_i)-P(X_i)logQ(X_i)\\ =H(P,Q)-H(P)
DKL(P,Q)=EX∼PlogQ(X)P(X)=N1i∑P(Xi)logP(Xi)−P(Xi)logQ(Xi)=H(P,Q)−H(P)
Q是模型需要学习的分布,而P是数据的分布,所以P是无参的,
H
(
P
)
H(P)
H(P)不会对优化目标有什么影响,故
H
(
P
,
Q
)
H(P,Q)
H(P,Q)就可以代替KL散度来作为衡量两个分布的指标,它也被称为交叉熵。
H
(
P
,
Q
)
=
−
1
N
∑
i
P
(
X
i
)
l
o
g
Q
(
X
i
)
H(P,Q)=-\frac{1}{N}\sum_iP(X_i)logQ(X_i)
H(P,Q)=−N1i∑P(Xi)logQ(Xi)
它和pytorch上的公式似乎长得不太一样:
l
n
=
−
w
y
n
log
exp
(
x
n
,
y
n
)
∑
c
=
1
C
exp
(
x
n
,
c
)
⋅
1
l_{n}=-w_{y_{n}} \log \frac{\exp \left(x_{n, y_{n}}\right)}{\sum_{c=1}^{C} \exp \left(x_{n, c}\right)} \cdot 1
ln=−wynlog∑c=1Cexp(xn,c)exp(xn,yn)⋅1
注意pytorch公式上的那个1,其实就是
P
(
X
i
)
P(X_i)
P(Xi)。pytorch的计算公式中
Q
(
X
i
)
Q(X_i)
Q(Xi)取的是模型输出的第c个值,c表示类别,而
X
i
X_i
Xi就是第c个类别的,而
c
=
y
n
c=y_n
c=yn得知的。
x
n
,
y
n
x_{n, y_{n}}
xn,yn的意思是
x
n
x_n
xn的第
y
n
y_n
yn个值
x
n
[
y
n
]
x_n[y_n]
xn[yn]。我们已知
X
i
X_i
Xi是属于第c类的,模型的输出表示各个类别的概率,所以
Q
(
X
i
)
Q(X_i)
Q(Xi)就是取输出向量的第c位,其他位舍弃。
换一种思考方式,假设分类任务中共有C个类别,由于分布P是固定无参的,所以
P
(
X
i
)
∈
R
1
×
C
P(X_i)\in \mathbb{R}^{1\times C}
P(Xi)∈R1×C,其中第c位为1,其余位为0,而
Q
(
X
i
)
∈
R
C
×
1
Q(X_i)\in \mathbb{R}^{C\times 1}
Q(Xi)∈RC×1是各个类别的概率,两个向量相乘就是pytorch的计算公式。