需求:具有两个类的分类任务,需要预测二值型变量 y ∈ { 0 , 1 } y\in\{0,1\} y∈{0,1} 的值。
似然函数:一种关于统计模型中的参数的函数,表示模型中参数中的似然性(likehood),核心是衡量 参数 b b b 的合理性。
公式: L ( b ∣ A ) = α P ( A ∣ B = b ) L(b\mid A)=\alpha P(A\mid B=b) L(b∣A)=αP(A∣B=b),其中 B B B 表示参数, A A A 表示事件, α \alpha α 是一个与 b b b 无关的正常数。含义为 “在已知观测结果 A A A 的前提下,参数 B B B 取值为 b b b 的可能性或合理性(即, L ( b ∣ A ) L(b\mid A) L(b∣A))”正比于“事件 B = b B=b B=b发生的前提下,事件 A A A 发生的概率”。
推导:
根据贝叶斯定理:
“事件 A A A 发生的前提下,事件 B = b B=b B=b 发生的概率” = P ( B = b ∣ A ) = P ( A ∣ B = b ) P ( B = b ) P ( A ) =P(B=b\mid A)=\frac{P(A\mid B=b)P(B=b)}{P(A)} =P(B=b∣A)=P(A)P(A∣B=b)P(B=b)
因为在似然函数中,我们关注的是 参数 b b b 对观测结果 A A A 的解释能力的合理性,而非事件 B = b B=b B=b 和 A A A 本身。因此,我们忽略 P ( B = b ) P(B=b) P(B=b) 和 P ( A ) {P(A)} P(A) ,仅保留分子部分:
L ( b ∣ A ) ∝ P ( A ∣ B = b ) L(b\mid A)\propto P(A\mid B=b) L(b∣A)∝P(A∣B=b)
即:
L ( b ∣ A ) = α P ( A ∣ B = b ) L(b\mid A)=\alpha P(A\mid B=b) L(b∣A)=αP(A∣B=b)
注意:这里并不要求似然函数满足归一性: ∑ b ∈ B α P ( A ∣ B = b ) = 1 \sum_{b\in\mathcal{B}} \alpha P(A\mid B=b) = 1 ∑b∈BαP(A∣B=b)=1。这一点表明了 “似然性” 仅表示合理性,和 “概率” 有明确的区分。
举例说明见:似然函数
此时,按照最大似然的方法是定义一个概率分布来拟合
x
\boldsymbol{x}
x 到
y
y
y 的映射,然后通过实际样本
(
x
,
y
)
(\boldsymbol{x}, y)
(x,y) 调整概率分布的参数。
这里,我们选择 Bernoulli 分布。
Bernoulli分布(伯努利分布),又名 0-1 分布,离散型概率分布。
概率质量函数为:
f X ( x ) = p x ( 1 − p ) 1 − x = { p if x = 1 , 1 − p if x = 0. f_{X}(x)=p^x(1-p)^{1-x}=\left\{\begin{matrix} p &~\text{if} ~x=1,\\ 1-p &~\text{if} ~x=0. \end{matrix}\right. fX(x)=px(1−p)1−x={p1−p if x=1, if x=0.
Bernoulli分布仅需要单个参数来定义。因此,我们只需要拟合 Bernoulli 分布中的 p p p(即, P ( y = 1 ∣ x ) P(y=1\mid \boldsymbol{x}) P(y=1∣x))即可,且 P ( y = 1 ∣ x ) ∈ [ 0 , 1 ] P(y=1\mid \boldsymbol{x})\in[0,1] P(y=1∣x)∈[0,1]。
原书中举了一个使用线性单元拟合 P ( y = 1 ∣ x ) P(y=1\mid \boldsymbol{x}) P(y=1∣x) 的例子,并且说明了其缺点。
较好的实现方法:使用 sigmoid 输出单元。
sigmoid 输出单元定义:
y ^ = σ ( w ⊤ h + b ) , \hat{y}=\sigma(\boldsymbol{w}^\top\boldsymbol{h}+b), y^=σ(w⊤h+b), 其中, σ \sigma σ 是 logistic sigmoid 函数, h = w 0 ⊤ x + b 0 \boldsymbol{h}=\boldsymbol{w}^\top_0\boldsymbol{x}+b_0 h=w0⊤x+b0 表示线性单元对 x \boldsymbol{x} x 的操作。(sigmoid 输出单元 包含 logistic sigmoid 函数 和 可能的多个线性单元,这点对理解后面的概率计算很重要!)
那么,如何证实 sigmoid 输出单元确实能够较好地拟合 P ( y ∣ x ) P(y\mid \boldsymbol{x}) P(y∣x)呢?
首先,拟合 Bernoulli 分布必须的两个特性:
- P ( y ∣ x ) ∈ [ 0 , 1 ] P(y\mid \boldsymbol{x})\in[0,1] P(y∣x)∈[0,1]
- ∑ y ∈ 0 , 1 P ( y ∣ x ) = 1 \sum_{y\in{0,1}}P(y\mid \boldsymbol{x}) = 1 ∑y∈0,1P(y∣x)=1
为了方便表述,我们先使用一个线性层计算 z = w ⊤ h + b z=\boldsymbol{w}^\top\boldsymbol{h}+b z=w⊤h+b,暂时忽略对 x \boldsymbol{x} x 的依赖性,只讨论从 z z z 的值到 y y y 的概率分布(即, P ( y ∣ z ) P(y\mid z) P(y∣z))。
则需要验证特性变成:(有点啰嗦了)
- P ( y ∣ z ) ∈ [ 0 , 1 ] P(y\mid z)\in[0,1] P(y∣z)∈[0,1]
- ∑ y ∈ 0 , 1 P ( y ∣ z ) = 1 \sum_{y\in{0,1}}P(y\mid z) = 1 ∑y∈0,1P(y∣z)=1
根据 “sigmoid 输出单元 包含 logistic sigmoid 函数 和 可能的多个线性单元”,我们可以假定sigmiod输出单元拟合的对数概率对
y
y
y 和
z
z
z 是线性的,因此有:
log
P
~
(
y
∣
z
)
=
y
z
.
\log \tilde{P}(y\mid z) = yz.
logP~(y∣z)=yz.
P
~
(
⋅
)
\tilde{P}(\cdot)
P~(⋅) 指这是一个非归一化的概率,后面进行归一化。
至于,为什么取对数概率?为什么构造成 y z yz yz?都有相应的数学解释,这里先不做讨论。
因此,非归一化概率可以写作 P ~ ( y ∣ z ) = exp ( y z ) \tilde{P}(y\mid z)=\exp(yz) P~(y∣z)=exp(yz)。
归一化:
P
(
y
∣
z
)
=
P
~
(
y
∣
z
)
∑
y
′
∈
{
0
,
1
}
exp
(
y
′
z
)
=
exp
(
y
z
)
∑
y
′
∈
{
0
,
1
}
exp
(
y
′
z
)
=
e
y
z
1
+
e
z
P(y\mid z) = \frac{\tilde{P}(y\mid z)}{\sum_{y'\in\{0,1\}}\exp(y'z)} = \frac{\exp(yz)}{\sum_{y'\in\{0,1\}}\exp(y'z)} =\frac{e^{yz}}{1+e^z}
P(y∣z)=∑y′∈{0,1}exp(y′z)P~(y∣z)=∑y′∈{0,1}exp(y′z)exp(yz)=1+ezeyz
检验 1:
import numpy as np
import matplotlib.pyplot as plt
def P_z_y0(z):
return np.exp(0*z) / (1 + np.exp(z))
def P_z_y1(z):
return np.exp(1*z) / (1 + np.exp(z))
x = np.linspace(-10, 10, 400)
p_y0 = P_z_y0(x)
p_y1 = P_z_y1(x)
plt.figure(figsize=(10, 6))
plt.plot(x, p_y0, label='y=0', color='red')
plt.plot(x, p_y1, label='y=1', color='blue')
plt.title('Plot of P(y | z)')
plt.xlabel('z')
plt.ylabel('P(y |z)')
plt.legend()
plt.grid(True)
plt.show()
检验 2:
∑
y
∈
{
0
,
1
}
P
(
y
∣
z
)
=
e
z
1
+
e
z
+
1
1
+
e
z
=
1
\sum_{y\in\{0,1\}}P(y|z)=\frac{e^z}{1+e^z}+\frac{1}{1+e^z}=1
y∈{0,1}∑P(y∣z)=1+ezez+1+ez1=1
验证了 sigmoid 单元可以用来拟合 Bernoulli 分布之后,接下来该如何拟合呢?
这里使用的方法是最大似然学习。
首先给出似然函数。根据前面的定义,我们先求出
y
y
y 取 0 或 1 的概率:
P
(
y
=
1
∣
x
,
θ
)
=
e
z
1
+
e
z
=
1
1
+
e
−
z
=
σ
(
z
)
P(y=1 \mid \boldsymbol{x},\theta)=\frac{e^z}{1+e^z}=\frac{1}{1+e^{-z}}=\sigma(z)
P(y=1∣x,θ)=1+ezez=1+e−z1=σ(z)
P
(
y
=
0
∣
x
,
θ
)
=
1
1
+
e
z
=
e
−
z
1
+
e
−
z
=
1
−
σ
(
z
)
P(y=0 \mid \boldsymbol{x},\theta)=\frac{1}{1+e^z}=\frac{e^{-z}}{1+e^{-z}}=1-\sigma(z)
P(y=0∣x,θ)=1+ez1=1+e−ze−z=1−σ(z)其中,我们将
z
=
w
⊤
h
+
b
z=\boldsymbol{w}^\top\boldsymbol{h}+b
z=w⊤h+b 和
h
=
w
0
⊤
x
+
b
0
\boldsymbol{h}=\boldsymbol{w}^\top_0\boldsymbol{x}+b_0
h=w0⊤x+b0 中的参数都抽象为
θ
\theta
θ,即
z
=
θ
⊤
x
z=\theta^\top\boldsymbol{x}
z=θ⊤x。
在给定样本
(
x
,
y
)
(\boldsymbol{x}, y)
(x,y) 的情况下,sigmoid 输出单元的参数为
θ
\theta
θ 的合理性,即似然度,忽略
α
\alpha
α 可以表示为:
L
(
θ
∣
x
,
y
)
=
P
(
y
∣
x
,
θ
)
=
σ
(
z
)
y
⋅
(
1
−
σ
(
z
)
)
1
−
y
L(\theta \mid \boldsymbol{x}, y) = P(y \mid \boldsymbol{x}, \theta)=\sigma(z)^y\cdot(1-\sigma(z))^{1-y}
L(θ∣x,y)=P(y∣x,θ)=σ(z)y⋅(1−σ(z))1−y
损失函数(负对数似然)可以表示为:
J
(
θ
)
=
−
log
P
(
y
∣
x
,
θ
)
=
y
⋅
log
(
σ
(
z
)
)
+
(
1
−
y
)
⋅
log
(
1
−
σ
(
z
)
)
.
J(\theta)=-\log P(y \mid \boldsymbol{x}, \theta)=y\cdot\log(\sigma(z)) + (1-y)\cdot\log(1-\sigma(z)).
J(θ)=−logP(y∣x,θ)=y⋅log(σ(z))+(1−y)⋅log(1−σ(z)).
至此,已经可以通过算法最小化损失函数来拟合。不过,目前的损失函数有些复杂。因此,书中还给出了另一种形式。
参数化与简化:
为了简化表达式,引入参数化技巧
(
2
y
−
1
)
z
(2y-1)z
(2y−1)z:
- 当 y = 1 y=1 y=1 时, ( 2 y − 1 ) z = z (2y-1)z=z (2y−1)z=z,此时 σ ( z ) = P ( y = 1 ∣ x , θ ) \sigma(z)=P(y=1 \mid \boldsymbol{x},\theta) σ(z)=P(y=1∣x,θ);
- 当 y = 0 y=0 y=0 时, ( 2 y − 1 ) z = − z (2y-1)z=-z (2y−1)z=−z,此时 σ ( − z ) = P ( y = 0 ∣ x , θ ) \sigma(-z)=P(y=0 \mid \boldsymbol{x},\theta) σ(−z)=P(y=0∣x,θ)。
因此,
σ
(
(
2
y
−
1
)
z
)
=
P
(
y
∣
x
,
θ
)
\sigma((2y-1)z)=P(y \mid \boldsymbol{x},\theta)
σ((2y−1)z)=P(y∣x,θ),对数似然可以简化为:
log
P
(
y
∣
x
,
θ
)
=
log
σ
(
(
2
y
−
1
)
z
)
.
\log P(y \mid \boldsymbol{x},\theta)=\log \sigma((2y-1)z).
logP(y∣x,θ)=logσ((2y−1)z).损失函数(负对数似然)则为:
J
(
θ
)
=
−
log
P
(
y
∣
x
,
θ
)
=
−
log
σ
(
(
2
y
−
1
)
z
)
.
J(\theta)=-\log P(y \mid \boldsymbol{x},\theta)=-\log \sigma((2y-1)z).
J(θ)=−logP(y∣x,θ)=−logσ((2y−1)z).
可以说是非常的 Amazing !同时,这一形式避免了直接处理 1 − σ ( z ) 1-\sigma(z) 1−σ(z) 带来的数值不稳定问题(如梯度饱和)(这个后面再看)。
书中进一步将损失函数写成了
softplus
\text{softplus}
softplus 函数
J
(
θ
)
=
ζ
(
(
1
−
2
y
)
z
)
.
J(\theta)=\zeta((1-2y)z).
J(θ)=ζ((1−2y)z).其中,
ζ
(
x
)
=
log
(
1
+
exp
(
x
)
)
\zeta(x)=\log(1+\exp(x))
ζ(x)=log(1+exp(x))。
我们可以看到它仅仅在 ( 2 y − 1 ) z (2y-1)z (2y−1)z 取绝对值非常大的负值时才会饱和。因此饱和只会出现在模型已经得到正确答案时——当 y = 1 y = 1 y=1 且 z z z 取非常大的正值时,或者 y = 0 y = 0 y=0 且 z z z 取非常小的负值时。当 z z z 的符号错误时, softplus \text{softplus} softplus 函数的变量 ( 2 y − 1 ) z (2y-1)z (2y−1)z 可以简化为 ∣ z ∣ |z| ∣z∣。当 ∣ z ∣ |z| ∣z∣ 变得很大并且 z z z 的符号错误时, softplus \text{softplus} softplus 函数渐近地趋向于它 的变量 ∣ z ∣ |z| ∣z∣。对 z z z 求导则渐近地趋向于 sign ( z ) \text{sign}(z) sign(z),所以,对于极限情况下极度不正确的 z z z, softplus \text{softplus} softplus 函数完全不会收缩梯度。这个性质很有用,因为它意味着基于梯度的学习可以很快地改正错误的 z z z。