信息论基础
信息论的基本想法 - 如何量化信息?
- 非常可能发生的事件信息量较少,确保能够发生的事件应该没有信息量。
- 较不可能发生的实践具有更高的信息量。
- 独立事件应具有增量的信息。例如,投掷的硬币两次正面朝上传递的信息量,应该是投掷一次硬币正面朝上的信息量的两倍。
为了满足上述三个性质,定义一个事件
X
=
x
X=x
X=x的自信息为
I
(
x
)
=
−
l
o
g
P
(
x
)
I(x)=-logP(x)
I(x)=−logP(x)
其中
P
(
x
)
P(x)
P(x)为观察到该事件的概率。
自信息只能处理单个的输出。可以用香农熵(Shannon entropy)来对整个概率分布中的不确定性总量进行量化:
H
(
X
)
=
E
x
∼
P
[
I
(
x
)
]
=
−
E
x
∼
P
[
l
o
g
P
(
x
)
]
H(X)=\mathbb E_{x\sim P}[I(x)]=-\mathbb E_{x\sim P}[logP(x)]
H(X)=Ex∼P[I(x)]=−Ex∼P[logP(x)]
一个分布的香农熵是指遵循这个分布的事件所产生的期望信息总量,它给出了对依据概率分布
P
P
P生成的符号进行编码所需的比特数在平均意义上的下界(当对数底数不是 2 时,单位将有所不同)。
可以将问题理解为给一些字符编码,这些字符出现的频率不同,我们给那些出现频率高的字符,优先赋予较短的编码,给那些出现频率低的字符,赋予稍长一些的编码,这个问题可以用数据结构中的哈弗曼树解决, − l o g P ( x ) -logP(x) −logP(x)可以理解为在这种策略下,赋予字符 x x x的编码长度。
如果我们对于同一随机变量
X
X
X有两个单独的概率分布
P
(
x
)
P(x)
P(x)和
Q
(
x
)
Q(x)
Q(x),我们可以使用KL散度(Kullback-Leibler divergence)来衡量这两个分布的差异:
D
K
L
(
P
∣
∣
Q
)
=
E
x
∼
P
[
l
o
g
P
(
x
)
Q
(
x
)
]
=
−
E
x
∼
P
[
l
o
g
Q
(
x
)
]
−
(
−
E
x
∼
P
[
l
o
g
P
(
x
)
]
)
=
−
E
x
∼
P
[
l
o
g
Q
(
x
)
]
−
H
(
P
)
D_{KL}(P||Q)=\mathbb E_{x\sim P}\Big[log\frac{P(x)}{Q(x)}\Big]=-\mathbb E_{x\sim P}[logQ(x)]-\big(-\mathbb E_{x\sim P}[logP(x)]\big) \\=-\mathbb E_{x\sim P}[logQ(x)]-H(P)
DKL(P∣∣Q)=Ex∼P[logQ(x)P(x)]=−Ex∼P[logQ(x)]−(−Ex∼P[logP(x)])=−Ex∼P[logQ(x)]−H(P)
KL 散度衡量的是,当我们使用一种被设计成能够使得概率分布 Q 产生的消息的长度最小的编码(记为BQ),发送包含由概率分布 P 产生的符号的消息时,多发送的消息长度,这里的多是相对于使用能够使得概率分布 P 产生的消息的长度最小的编码(记为BP)。
因为消息是以概率P发送的,所以使用编码BP才能使消息长度最短,使用编码BQ会多发送一些比特,KL散度衡量的就是多发送的比特长度。所以我们很容易知道KL散度是非负的,KL 散度为 0 当且仅当P 和 Q 在离散型变量的情况下是相同的分布,或者在连续型变量的情况下是几乎处处相同的。
一个和 KL 散度密切联系的量是交叉熵(cross-entropy),
H
(
P
,
Q
)
=
H
(
P
)
+
D
K
L
(
P
∣
∣
Q
)
=
−
E
x
∼
P
[
l
o
g
Q
(
x
)
]
H(P,Q)=H(P)+D_{KL}(P||Q)=-\mathbb E_{x\sim P}[logQ(x)]
H(P,Q)=H(P)+DKL(P∣∣Q)=−Ex∼P[logQ(x)]
针对 Q 最小化交叉熵等价于最小化 KL 散度,因为 Q 并不参与被省略的那一项。在机器学习分类任务中,Q为神经网络学习到的分布,P为数据真实分布,
P
(
x
)
P(x)
P(x)的取值只有1(正确分类)和0(错误分类)两种可能,所以
H
(
P
)
=
−
E
x
∼
P
[
l
o
g
P
(
x
)
]
=
−
∑
x
P
(
x
)
l
o
g
P
(
x
)
=
0
H(P)=-\mathbb E_{x\sim P}[logP(x)]=-\sum_xP(x)logP(x)=0
H(P)=−Ex∼P[logP(x)]=−x∑P(x)logP(x)=0
恒成立,即交叉熵的值与KL散度相等(信息论中,0log0=0)。
GAN之前,如何寻找数据的分布?
假设我们想找到一个数据分布
P
d
a
t
a
(
x
)
P_{data}(x)
Pdata(x),使一张图片看起来像是二次元头像,其中
x
x
x是一个高维向量,代表一张图片。在整个向量空间中,只有一小部分空间中的向量所代表的图片像是二次元头像,比如下图中的蓝色区域
我们所要寻找的分布
P
d
a
t
a
(
x
)
P_{data}(x)
Pdata(x),应该在蓝色区域概率高,在其他区域概率低。
在GAN之前,我们使用的是最大似然估计方法:
- 给定一个真实数据分布 P d a t a ( x ) P_{data}(x) Pdata(x),并且我们可以从中抽样
- 假设一个数据分布 P G ( x ; θ ) P_G(x;\theta) PG(x;θ),其中 θ \theta θ为参数(如果假设为高斯分布, θ \theta θ就是分布的均值与方差)
- 寻找使 P G ( x ; θ ) P_G(x;\theta) PG(x;θ)最接近 P d a t a ( x ) P_{data}(x) Pdata(x)的参数 θ \theta θ
- 从 P d a t a ( x ) P_{data}(x) Pdata(x)中抽样得到 { x 1 , x 2 , … , x m } \{x^1,x^2,\dots,x^m\} {x1,x2,…,xm},我们可以计算出从 P G ( x ; θ ) P_G(x;\theta) PG(x;θ)中抽样得到这些样本的概率 P G ( x i ; θ ) P_G(x^i;\theta) PG(xi;θ)
- 似然函数 L = ∏ i = 1 m P G ( x i ; θ ) L=\prod \limits ^m _{i=1} P_G(x^i;\theta) L=i=1∏mPG(xi;θ)
- 寻找 θ ∗ \theta^* θ∗使L最大
我们对
θ
∗
\theta^*
θ∗进一步计算:
θ
∗
=
a
r
g
max
θ
∏
i
=
1
m
P
G
(
x
i
;
θ
)
=
a
r
g
max
θ
l
o
g
∏
i
=
1
m
P
G
(
x
i
;
θ
)
=
a
r
g
max
θ
∑
i
=
1
m
l
o
g
P
G
(
x
i
;
θ
)
\theta^*=arg\max\limits_\theta\prod \limits ^m _{i=1} P_G(x^i;\theta) =arg\max\limits_\theta log\prod \limits ^m _{i=1} P_G(x^i;\theta) \\=arg\max\limits_\theta\sum \limits ^m _{i=1} logP_G(x^i;\theta)
θ∗=argθmaxi=1∏mPG(xi;θ)=argθmaxlogi=1∏mPG(xi;θ)=argθmaxi=1∑mlogPG(xi;θ)
我们假设样本
{
x
1
,
x
2
,
…
,
x
m
}
\{x^1,x^2,\dots,x^m\}
{x1,x2,…,xm}的分布与
P
d
a
t
a
(
x
)
P_{data}(x)
Pdata(x)的分布几乎一致,并且把
∑
i
=
1
m
l
o
g
P
G
(
x
i
;
θ
)
\sum \limits ^m _{i=1} logP_G(x^i;\theta)
i=1∑mlogPG(xi;θ)理解为m倍的数学期望,那么
a
r
g
max
θ
∑
i
=
1
m
l
o
g
P
G
(
x
i
;
θ
)
≈
a
r
g
max
θ
E
x
∼
P
d
a
t
a
[
l
o
g
P
G
(
x
i
;
θ
)
]
=
a
r
g
min
θ
H
(
P
d
a
t
a
,
P
G
)
=
a
r
g
min
θ
D
K
L
(
P
d
a
t
a
∣
∣
P
G
)
arg\max\limits_\theta\sum \limits ^m _{i=1} logP_G(x^i;\theta) \approx arg\max\limits_\theta\mathbb E_{x\sim P_{data}}[logP_G(x^i;\theta)]\\=arg\min\limits_\theta H(P_{data},P_G)=arg\min\limits_\theta D_{KL}(P_{data}||P_G)
argθmaxi=1∑mlogPG(xi;θ)≈argθmaxEx∼Pdata[logPG(xi;θ)]=argθminH(Pdata,PG)=argθminDKL(Pdata∣∣PG)
所以,求参数
θ
\theta
θ使似然函数最大,就是使交叉熵与KL散度最小,由上节内容可知,这就是使两个概率分布最相似。
上述做法有一个无法解决的问题,那就是数据的分布很可能不是高斯分布,而是极其复杂、很难预估的分布,我们无法提前写出
P
G
(
x
;
θ
)
P_G(x;\theta)
PG(x;θ)的表达式,这时我们只能用神经网络来表示它。
生成对抗网络
生成器G是一个神经网络,它定义了一个概率分布
P
G
P_G
PG,由于神经网络可以近似任意函数,所以无论目标概率分布多复杂,我们都可以近似它。
此时我们要寻找的生成器
G
∗
=
a
r
g
min
G
D
i
v
(
P
G
,
P
d
a
t
a
)
G^*=arg\min\limits_GDiv(P_G,P_{data})
G∗=argGminDiv(PG,Pdata)
那么,如何计算 D i v ( P G , P d a t a ) Div(P_G,P_{data}) Div(PG,Pdata),即两个分布的差异呢?
鉴别器D同样是一个神经网络,将生成器生成的样本与真实数据作为训练样本,输入D中,D的输出为
D
(
x
)
D(x)
D(x),
设目标函数
V
(
G
,
D
)
=
E
x
∼
P
d
a
t
a
[
l
o
g
D
(
x
)
]
+
E
x
∼
P
G
[
l
o
g
(
1
−
D
(
x
)
)
]
V(G,D)=\mathbb E_{x\sim P_{data}}[logD(x)]+\mathbb E_{x\sim P_G}[log(1-D(x))]
V(G,D)=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(x))]
我们要寻找的鉴别器
D
∗
=
a
r
g
max
D
V
(
D
,
G
)
D^*=arg\max\limits_DV(D,G)
D∗=argDmaxV(D,G),给定
G
G
G,
D
∗
D^*
D∗可以最大化
V
=
E
x
∼
P
d
a
t
a
[
l
o
g
D
(
x
)
]
+
E
x
∼
P
G
[
l
o
g
(
1
−
D
(
x
)
)
]
=
∫
x
[
P
d
a
t
a
(
x
)
l
o
g
D
(
x
)
+
P
G
(
x
)
l
o
g
(
1
−
D
(
x
)
)
]
d
x
V=\mathbb E_{x\sim P_{data}}[logD(x)]+\mathbb E_{x\sim P_G}[log(1-D(x))] \\=\int\limits_x[P_{data}(x)logD(x)+P_G(x)log(1-D(x))]dx
V=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(x))]=x∫[Pdata(x)logD(x)+PG(x)log(1−D(x))]dx
即给定
x
x
x,
D
∗
D^*
D∗可以最大化
P
d
a
t
a
(
x
)
l
o
g
D
(
x
)
+
P
G
(
x
)
l
o
g
(
1
−
D
(
x
)
)
P_{data}(x)logD(x)+P_G(x)log(1-D(x))
Pdata(x)logD(x)+PG(x)log(1−D(x))
设
f
(
D
)
=
a
l
o
g
(
D
)
+
b
l
o
g
(
1
−
D
)
f(D)=alog(D)+blog(1-D)
f(D)=alog(D)+blog(1−D),求极值点得
D
∗
=
a
a
+
b
D^*=\frac{a}{a+b}
D∗=a+ba,即
D
∗
=
P
d
a
t
a
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
D^*=\frac{P_{data}(x)}{P_{data}(x)+P_G(x)}
D∗=Pdata(x)+PG(x)Pdata(x)
此时目标函数
m
a
x
V
(
G
,
D
)
=
V
(
G
,
D
∗
)
=
E
x
∼
P
d
a
t
a
[
l
o
g
P
d
a
t
a
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
]
+
E
x
∼
P
G
[
l
o
g
(
P
G
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
)
]
=
−
2
l
o
g
2
+
D
K
L
(
P
d
a
t
a
∣
∣
P
d
a
t
a
+
P
G
2
)
+
D
K
L
(
P
G
∣
∣
P
d
a
t
a
+
P
G
2
)
=
−
2
l
o
g
2
+
2
D
J
S
(
P
d
a
t
a
∣
∣
P
G
)
maxV(G,D)=V(G,D^*)=\mathbb E_{x\sim P_{data}}[log\frac{P_{data}(x)}{P_{data}(x)+P_G(x)}]+\mathbb E_{x\sim P_G}[log(\frac{P_G(x)}{P_{data}(x)+P_G(x)})] \\=-2log2+D_{KL}\Big(P_{data}||\frac{P_{data}+P_G}{2}\Big)+D_{KL}\Big(P_G||\frac{P_{data}+P_G}{2}\Big) \\=-2log2+2D_{JS}(P_{data}||P_G)
maxV(G,D)=V(G,D∗)=Ex∼Pdata[logPdata(x)+PG(x)Pdata(x)]+Ex∼PG[log(Pdata(x)+PG(x)PG(x))]=−2log2+DKL(Pdata∣∣2Pdata+PG)+DKL(PG∣∣2Pdata+PG)=−2log2+2DJS(Pdata∣∣PG)
与两个分布的JS散度正相关。
回到前面的问题,目标函数可以衡量两个分布的JS散度(差异度),所以 G ∗ = a r g min G max D V ( G , D ) G^*=arg\min\limits_G\max\limits_DV(G,D) G∗=argGminDmaxV(G,D),
- 步骤1:固定生成器G,更新鉴别器D使目标函数最大
- 步骤2:固定鉴别器D,更新生成器G使目标函数最小
![](https://i-blog.csdnimg.cn/blog_migrate/42d085ca76bdc75b58c921790e4b63df.jpeg)
以上三个生成器中, G 3 G_3 G3是最优的。
GAN的算法
![](https://i-blog.csdnimg.cn/blog_migrate/26a95aac2f12278a3afc037142a5d344.jpeg)
一个问题是,为什么在一次训练迭代中,D迭代的次数比G多?
若G迭代次数过多,会使D陷入局部最优,如下图:
- 表面上,由于G的更新,找到了更小的 max D V ( G , D ) \max\limits_DV(G,D) DmaxV(G,D),但此时G已经变为了 G 1 G_1 G1,非常不幸的是,上文已经说过,在G的更新过程中,D是被固定的;也就是说,此时 G 1 = a r g min G V ( G 1 , D 0 ) G_1=arg\min\limits_GV(G_1,D_0) G1=argGminV(G1,D0),而 D 0 ≠ a r g max D V ( G 1 , D ) D_0\neq arg\max\limits_DV(G_1,D) D0=argDmaxV(G1,D);为了解决这个问题,我们必须假设 G 0 ≈ G 1 G_0\approx G_1 G0≈G1,而这要求 G G G的更新不能过于频繁。同时,若 G G G更新过于频繁,会产生过拟合,对于不同的输入 z z z,生成器只会产生最讨好 D D D的那个输出,破坏了模型的多样性。
- 但若频繁更新 D D D,同样会使鉴别器过拟合,此时任何生成器的输出都不能满足 D D D,使优化更困难。
综合起来, G G G的迭代次数不能多于 D D D,同时两者都不能在一个训练迭代中循环太多次。