http://www.ma-xy.com
目录
第一章 深度学习 1
1.1 深度置信网络 DBN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1 DBN 网络结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.2 DBN 学习算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 深度玻尔兹曼机 DBM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1 DBM 网络结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.2 DBM
学习方法
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.3 DBM 的预训练 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.4 高斯 RBM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3 自动编码器 AE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.1 基础自动编码器 AE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.2 稀疏自动编码器 Sparse AE . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.3.3 降噪自动编码器 Denoising AE . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.4 边缘降噪自动编码器 mDAE . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.5 收缩自动编码器 Contractive AE . . . . . . . . . . . . . . . . . . . . . . . 21
1.3.6 堆积自动编码器 Stacked AE . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.3.7 变分自动编码器 VAE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.3.8 重要性加权自动编码器 IWAE . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.3.9 随机生成网络 GSN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1.3.10 beta - VAE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
1.3.11 MATLAB 应用实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
1.4 卷积神经网络 CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1.4.1 基础卷积神经网络 CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1.4.2 AlexNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
1.4.3 NiN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
1.4.4 GoogLeNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
1.4.5 VGG Net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
1.4.6 ResNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
1.4.7 MATLAB 应用实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
1
http://www.ma-xy.com
目录 目录
1.5 循环神经网络 RNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
1.6 对抗生成网络 GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
1.6.1 引言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
1.6.2 Vanilla GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
1.6.3 f-GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
1.6.4 Conditional GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
1.6.5 InfoGAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
1.6.6 Mali GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
1.6.7 Boundary Seeking GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
1.6.8 Mode Regularized GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
1.6.9 DCGAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
1.6.10 Improved GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
1.6.11 Least Squares GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
1.6.12 Wasserstein GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
1.6.13 Improved WGAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
1.6.14 Loss Sensitive GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
1.6.15 Coupled GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
1.6.16 Dual GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
1.6.17 Boundary Equilibrium GAN . . . . . . . . . . . . . . . . . . . . . . . . . 165
http://www.ma-xy.com 2 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习
1.1 深度置信网络 DBN
Hinton 2006 年首次提出深度置信网络 (deep belief network, DBN),从而引起了深度
习的热潮。之后,深度学习模型又发展出了深度玻尔兹曼机 DBM堆积自动编码器 SAE卷积
神经网 CNN、用于语音和文本处理的 RNN 以及对抗生成网络 GAN 等等。在开 DBN
前,多层前向神经网络 MLP 往往只有 3 4 层的深度,太深的网络被认为是难以优化的,
DBN 出现后, MNIST 数据集上准确率超过 () 支持向量机,才使得深度网络开始得到认
可。尽管 DBN 与其它深度网络相比,已经失去了研究者和工业开发者的青睐,我们还是应该标
注一下,除了表示敬意之外,也可以由此开启深度学习之旅。顺带一提的是,深度学习工具有许
多,并且它们的更新很快,所以后面大部分内容我们都只介绍深度模型的理论。同时,由于深度
学习的发展速度很快,基本上是日新月异的,每天都有新成果、新应用,这使得我们想要全面学
习它变得困难。我们不得不挑选一些具有里程碑意义的网络来进行介绍。
1.1.1 DBN 网络结构
我们知道,限制玻尔兹曼机 RBM 是没有网络层次结构的,如果要将其分层,可以分为可视
v 和隐含层 h。基本的 RBM 网络结构如图 (1.1) 所示
1.1: RBM 网络结构图
形式上有 v, h 两层。现在,我们考虑能否把多个 RBM 网络“堆积”在一起?虽然多个 BP
网路“堆积”而成 MLP 不易于训练,但是多个 RBM 堆积未必不可以训练,因为 RBM 网络的
训练方式并不是基于反向传播算法的。
我们先来将 2 RBM 堆积在一起,如图 (1.2) 所示,其中:第一个 RBM
1
和隐含层 h
1
第二个 RBM
2
的可见层,其权重为 W
1
, W
2
1
http://www.ma-xy.com
1.1 深度置信网络 DBN 第一章 深度学习
1.2: 2 RBM 堆积图
(1.2) /的, b
RBM
1
当这个 RBM
1
收敛到数据集时,我们得到其权重 W
1
并得到 RBM
1
的隐含层激活模
(样本/向量)我们将每个隐含层激活模式作为数据集来训练第 2 RBM
2
一个有趣的事情
是:如果 v 中的神经元数目和 h
2
相等,那么我们训练完 RBM
2
得到 W
2
W
1
的转置,RBM
2
可以是 h
1
的一个很好的模型。
现在将底层 RBM
1
的权重改变一下,准确的说是将其连接方式改变一下,我们只保留 h
1
v
方向上的权重,而不要 v h
1
方向的权重。这样,网络就变成了一个有向网络,如 (1.3)(a)
所示
1.3: 2 RBM 的右向网络图
至于为什么这样做,以后有机会再讨论。我们将其扩展到 4 层,如图 (1.3)(b) 所示,只有在
顶部的 RBM
3
中是真的双向连接,而在 RBM
2
, RBM
1
中,只有下行权重,所以网络也不再
RBM 网络了。它更像 logistics 置信网络 (1992.Neal)称这种由 RBM logistics 置信网络混合
的深度网络为深度置信网络 DBN
下面,我们考虑如何运 DBN以图 (1.3)(b) 为示例,为了从这个模型中生成数据,或者
说为了让这个模型来拟合样本的分布,首先,通过顶层 RBM
3
h
2
, h
3
中进行热平衡采样,结
束之后,就有了
h
2
这里的 h
2
R BM
3
定义的 h
2
的先验分布,然后, h
2
通过权重 W
2
递到 h
1
无论 h
1
中得到什么样的二值状态,紧接着通过 W
1
传递给 v来得到生成数据。所以,
我们执行一个从 h
2
开始自顶而下的传播,去得到其它各层的状态,就像在一个 sigmoid 置信网
络中一样。
现在,我们考虑一个深层的 DBN,由 L RBM 堆积而成,如图 (1.4) 所示
http://www.ma-xy.com 2 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.1 深度置信网络 DBN
1.4: L DBN 示意图
图中共有 L RBM整体来看,DBN 1 个可视层 v L 个隐含层 h
(l)
(l = 1, 2, . . . , L)
并且有 L 个权重矩阵 W
(l)
(l = 1, 2, . . . , L),有 L + 1 个阈值 b
(l)
(l = 0, 1, . . . , L)。其中:b
(0)
可视层 v 的偏置。假设我们已经有了所有的权重 W = {W
(l)
} 和阈值 b = {b
(l)
},令 θ (W, b)
于是有下面的概率公式
p(h
(L)
, h
(L1)
) exp
b
(L)T
h
(L)
+ b
(L1)T
h
(l1)
+ h
(L1)T
W
(L)
h
(L)
p(h
(l)
i
= 1|h
(l+1)
) = σ
b
(l)
i
+ W
(l+1)
·i
T
h
(l+1)
l = 1, 2, . . . , L 2
p(v
i
= 1|h
(1)
) = σ
b
(0)
i
+ W
(1)
·i
T
h
(1)
如果 v 不是二值 01,而是实值 v
i
R,可以用下式来是实现高斯 RBM
v N(v|b
(0)
+ W
(1)T
h
(1)
, β
1)
其中:β 是协方差矩阵,是一个对角矩阵。这里我们不详细介绍高 RBM。上面,我们说过从
h
3
开始,如何生成 v,其联合概率分布为
p(v, h
1
, h
2
, . . . , h
L
) = p(v|h
1
)p(h
1
|h
2
) ···p(h
L2
|h
L1
)p(h
L1
|h
L
)
虽然是 DBN,但是我们的目标仍然是求 θ 使样本概率最大,即样本的似然函数最大。现在
的问题是:样本 v 的概率是多少呢?
1.1.2 DBN 学习算法
对于分类问题
x, y
DBN
的学习一般分为
2
个过程:
1. 使用无标签数据 x(只用 x,不用 y) 无监督的训练 DBN。这里,关于无监督的训练 DBN
可以采用 2006.Hinton 提出的贪心逐层算法,即对每一 RBM 进行训练。在无监督训
DBN 后,得到参数 θ (W, b)
2. 使用有监督数据 x, y 进行 θ 的微调。在无监督 θ 的基础上, θ 视为网络初始参数,将整
个网络视为前向网络,用 BP 算法对网络权重 W 和阈值 b 进行微调。
http://www.ma-xy.com 3 http://www.ma-xy.com
http://www.ma-xy.com
1.2 深度玻尔兹曼机 DBM 第一章 深度学习
采用贪心逐层算法训练 DBN 容易实现的,我们将 DBN 分为 L RBM,对每个 RBM
进行训练,并得到权重和阈值 W
(l)
, b
(l)
E
v P
data
log p(v)
E
v P
data
E
h
(1)
p
(1)
(h
(1)
|v )
log p
(2)
(h
(2)
)
.
.
.
其中:p
(1)
是第一个 RBM 表示的的概率分布。在大多数应用中, DBN 进行贪心逐层训练后,
需要再花费时间进行联合训练,训练好的 DBN 可以直接用于生成任务。如果要将其用于分类任
务,我们可以将贪心算法求得的参数 θ 作为网络参数的初始值,搭建如图 (1.5) 的多层前向神经
网络 MLP
1.5: DBN 的权重微调网络
并且
h
(1)
= σ
b
(1)
+ v
T
W
(1)
h
(l)
= σ
b
(l)
i
+ h
(l+1)T
W
(l)
l = 2, 3, . . . , L
然后,用 BP 等算法来对 MLP 网络进行训练,微调其参数 θ
1.2 深度玻尔兹曼机 DBM
1.2.1 DBM 网络结构
DBM(Deep Boltzmann Machine) 另一种深度生成模型,由 Salakhutdinov Hinton
2009 年开发。 DBM 不同的是,它是一个完全无向的网络。以一个含有两个隐含层的 DBM
例,其网络结构示意图如图 (1.6) 所示
http://www.ma-xy.com 4 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.2 深度玻尔兹曼机 DBM
1.6: 3 DBM 网络结构示意图
DBM 是一个基于能量的模型,这意味这模型中变量 (神经元) 的联合概率分布可以由能量函
数表示:在参数 θ 给定下,网络的能量函数 (忽略偏置 b)
E
θ
(v, h
(1)
, h
(2)
) = v
T
W
(1)
h
(1)
h
(1)T
W
(2)
h
(2)
由此,网络的联合概率分布 (Boltzmann 分布)
p(v, h
(1)
, h
(2)
) =
1
Z
θ
exp
E
θ
(v, h
(1)
, h
(2)
)
与全连接的 BM 相比,DBM 拥有一些和 RBM 相似的特点,比如:由于层内神经元无连接,
联合概率分布等于边缘概率分布的乘积。 DBM 而言,这种独立性表现在:在给定相邻层神经
元的状态之后,可以写出中间层的条件概率分布。比如: h
(1)
层而言,相邻层 v, h
(2)
的神经元
状态值给定后,h
(1)
层内各神经元相互独立。于是,条件联合概率分布等于各分量条件分布的乘
p
h
(1)
|v, h
(2)
=
j
p
h
(1)
j
|v, h
(2)
而单一神经元 h
j
取值为 0 1 的概率值为
p
h
1
j
= 1|v, h
(2)
= σ
v
T
W
(1)
·i
+ W
(2)
i·
h
(2)
p
v
i
= 1|h
(1)
= σ
W
(1)
i·
h
(1)
p
h
k
= 1
(2)
|
h
(1)
=
σ
h
(1)T
W
(2)
·k
上面说明 p(v|h
(1)
, p(h
(1)
|v, h
(2)
), p(h
(2)
|h
(1)
) 是可以确定的。但是,p(h
(1)
, h
(2)
|v) 是不能确定
的,或者说给定 v 后,h
(1)
层和 h
(2)
层的各神经元之间不是独立的,因此,DBM 可以看成是介
BM RBM 之间的网络。
上述性质使得吉布斯采样能够在 DBM 中运行,吉布斯采样每次只更新一个神经元。由于我
们给定一层 h
(1)
的邻层 v h
(2)
后,h
(1)
的概率也就确定了,那么,对于一个 L 层的 DBM
言,可以将 DBM 分为两部分:奇数层和偶数层。给定偶数层,关于奇数层的分布是平衡的。因
此,可以作为两部分同时且独立地采样。
http://www.ma-xy.com 5 http://www.ma-xy.com
http://www.ma-xy.com
1.2 深度玻尔兹曼机 DBM 第一章 深度学习
无论是 DBN 还是 DBM,我们的目标都是求解参数 θ使样本 S = {v
k
} 出现的概率最大,
max
θ
P (S|θ),可以简写为 max
θ
P (S)
P (S) =
m
k=1
p(v
k
)
上式取对数后,有
max
θ
ln L(θ) = log P (S) =
m
k=1
log p(v
k
)
引入一个条件分布函数 q(h|v)(在后面的 VAE 部分,我们会详细介 EM 法和变分近
推断),并且由于
h
q(h|v) = 1,有
log p(v) =
h
q(h|v)
log p(v)
=
h
q(h, v) log
p(v, h)
p(h|v)
q(h|v)
q(h|v)
= H(q) +
h
q(h|v) log p(v, h) +
h
q(h|v) log
q(h|v)
p(h|v)
= KL
q(h|v)||p(h|v)
+ H(q) +
h
q(h|v) (log p(h) + log p(v|h))
其中:q(h|v) 可视为 p(h|v) 的近似函数
q(h|v) = q(h
1
, h
2
, . . . , h
L
|v) p(h
1
, h
2
, . . . , h
L
|v) = p(h|v)
于是
log p(v) H(q) +
h
q(h|v)
log p(h) + log p(v|h)
=: L(q)
当且仅当 p = q 时,上式等号成立。即 L(q) (单样) 数极大似然函数 ln p(v) 下界。由
p(h
1
, h
2
, . . . , h
L
|v) 不易求解,所有原极大似然估计方法不易求解,我们转而求极大下界
max
θ
m
k=1
L(q)
由于 q 是一个函数,所以这是一个变分问题。
我们些简布族特定 p(h|v) 2 个隐 DBM
中,p(h|v) 写为 p(h
(1)
, h
(2)
|v)在均匀场近似的情况下,近似分布族是隐含层神经元条件独立的
分布,即
q(h
(1)
, h
(2)
|v) =
j
q(h
(1)
j
|v)
k
q(h
(2)
k
|v)
http://www.ma-xy.com 6 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.2 深度玻尔兹曼机 DBM
均匀场近似的目标是着多最适合真实后验分布 p(h
(1)
, h
(2)
|v) 的近似分布 q(h
(1)
, h
(2)
|v)并且,
次使用新样本 v 后,必须再次运行推断过程,从新找到不同的分布 q。我们可以找到许多衡量 q
p 近似程度的方法,均匀场方法是最小化二者的 KL 距离
min
q
KL(q||p) =
h
q(h
(1)
, h
(2)
|v) log
q(h
(1)
, h
(2)
|v)
p(h
(1)
, h
(2)
|v)
q 作为伯努利分布的乘积进行参数 (于泛问题,我们一般采用参数化方),即 h
(1)
的每个神经元的概率与一个参数相关联。具体来说对每个神经 j
ˆ
h
(1)
j
= q(h
(1)
j
= 1|v)其中:
ˆ
h
(1)
j
[0, 1]。另外,对每个神经元 k
ˆ
h
(2)
k
= q(h
(2)
K
= 1|v),其中:
ˆ
h
(2)
K
[0, 1]。因此,我们有下
面的近似后验
q(h
(1)
, h
(2)
|v) =
j
q(h
(1)
j
|v)
k
q(h
(2)
k
|v)
=
j
ˆ
h
(1)
j
h
(1)
j
1
ˆ
h
(1)
j
1h
(1)
j
×
k
ˆ
h
(2)
k
h
(2)
k
1
ˆ
h
(2)
k
1h
(2)
k
现在已经制定了近似分布 q 的函数 (函数空间转化为参数空),下面的工作就是在
数空间中寻找最优的参数,来使 q p KL 距离最小。在之前的偏微分方程中,我们通过在样
本点形成方程组来求解求解参数,这里用均匀场方程来指定参数,均匀场方程式通过求解变分下
界导数为 0 的位置而推到出的。
L(q) =
h
(1)
,h
(2)
q(h
(1)
, h
(2)
|v) log
p(v, h
(1)
, h
(2)
; θ)
q(h
(1)
, h
(2)
|v)
=
h
(1)
,h
(2)
q(h
(1)
, h
(2)
|v)E(v, h
(1)
, h
(2)
; θ) log Z(θ) + H(q)
其中:Z 是一个归一化因子,H 为熵。我们希望求解 q(h
(1)
, h
(2)
|v) 来最大化 L(q) q(h
(1)
, h
(2)
|v)
带入到 L(q) 中,有
L(q) =
i
j
v
i
W
(1)
ij
ˆ
h
(1)
j
+
j
k
ˆ
h
(1)
j
W
(2)
jk
ˆ
h
(2)
k
ln Z(θ) + H(q)
上式关于
ˆ
h
(1)
j
,
ˆ
h
(2)
k
求导,令导数为 0,得到拟合点方程为
ˆ
h
(1)
j
L(q) = 0 j = 1, 2, . . . , n
ˆ
h
(2)
k
L(q) = 0 k = 1, 2, . . . , m
http://www.ma-xy.com 7 http://www.ma-xy.com
http://www.ma-xy.com
1.2 深度玻尔兹曼机 DBM 第一章 深度学习
我们来看其中的一个
ˆ
h
(1)
j
L
(
q
)
ˆ
h
(1)
j
L(q) =
ˆ
h
(1)
j
i
j
v
i
W
(1)
ij
ˆ
h
(1)
j
+
j
k
ˆ
h
(1)
j
W
(2)
jk
ˆ
h
(2)
k
ln Z(θ) + H(q)
=
ˆ
h
(1)
j
i
j
v
i
W
(1)
ij
ˆ
h
(1)
j
+
j
k
ˆ
h
(1)
j
W
(2)
jk
ˆ
h
(2)
k
ln Z(θ)
j
ˆ
h
(1)
j
ln
ˆ
h
(1)
j
+ (1
ˆ
h
(1)
j
) ln(1
ˆ
h
(1)
j
)
k
ˆ
h
(2)
k
ln
ˆ
h
(2)
k
+ (1
ˆ
h
(2)
k
) ln(1
ˆ
h
(2)
k
)
=
i
v
i
W
(1)
ij
+
k
W
(2)
jk
ˆ
h
(2)
k
ln
ˆ
h
(2)
j
1
ˆ
h
(2)
j
令上式等于 0,有
ˆ
h
(1)
j
= σ
i
v
i
W
(1)
ij
+
k
W
(2)
jk
ˆ
h
(2)
k
同样处理
ˆ
h
(2)
k
L(q),有
ˆ
h
(2)
k
= σ
j
W
(2)
jk
ˆ
h
(1)
j
综上,我们得到如下更新规则 (不考虑偏置 b)
ˆ
h
(1)
j
= σ
i
v
i
W
(1)
ij
+
k
W
(2)
jk
ˆ
h
(2)
k
j
ˆ
h
(2)
k
= σ
j
W
(2)
jk
ˆ
h
(1)
j
k
在该方程组的不动点 () 处,我们有变分下界 L(q) q 的局部极大值。并且要注意的是,我们是
交替更新 h
(2)
j
, h
(2)
k
1.2.2 DBM 学习方法
在上面的分析中,给出了变分推断找到 p(h|v) 的近似 q(h|v),然后通过最大化 L(v, q, θ)
进行学习。对于有两个隐含层的 DBM,目标函数 L
L(q, θ) =
i
j
v
i
W
(1)
ij
ˆ
h
(1)
j
+
j
k
ˆ
h
(1)
j
W
(2)
jk
ˆ
h
(2)
k
ln Z(θ) + H(q)
上述表达式中仍然包含配分函数 (归一化因子)Z(θ)上面的 L(q, θ) 是极大似然函数 p(v|θ) 的下
界,是一个函数 q 和参数 θ 的函数(这种情况我们在前面多次见到过)我们希望通过最大化这个
http://www.ma-xy.com 8 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.2 深度玻尔兹曼机 DBM
下边界来提高似然函数。我们考虑采用 EM 算法来实现最大化:E 步,
ˆ
h
(1)
ˆ
h
(2)
M 步,
大化参数 θ。前面的分析,我们仅考虑了 E 步求解
ˆ
h
(1)
ˆ
h
(2)
,下面,来求 θ 使 L(q, θ) 最大
θ
L(q, θ) =
θ
i
j
v
i
W
(1)
ij
ˆ
h
(1)
j
+
j
k
ˆ
h
(1)
j
W
(2)
jk
ˆ
h
(2)
k
ln Z(θ) + H(q)
=
θ
i
j
v
i
W
(1)
ij
ˆ
h
(1)
j
+
j
k
ˆ
h
(1)
j
W
(2)
jk
ˆ
h
(2)
k
θ
ln Z(θ)
上式中的
ˆ
h
(1)
,
ˆ
h
(2)
E 步中已经计算得到了,带入即可;关键是后面的
Z(θ)
θ
通过随机极大化
算法 (SML) 来进行求解,SML 的伪代码如下 (1)
1.2.3 DBM 的预训练
不幸的是,随机初始化后使用 SML(随机极大似然算法) DBM 通常是失败的。在某些情
况下,DBM 可以很好的表示分布,但是,它没有比仅使用 RBM 获得更高的似然值。目前,已经
开发了一些联合训练技术,一般而言,克服 DBM 的联合训练问题最初的和最流行的方法是贪心
逐层预训练技术。我们将 DBM 中的每两层视为一个 RBM,进行预训练,在训练完成后,可以
PCD 训练 DBMDBM 的贪心逐层预训练方法与 DBN 不同,每个单独的 RBM 的参数可以
直接复制到 DBN,而在 DBM 中,RBM 的参数在复制到 DBM 之前,必须进行修改。RBM
使用自底向上的输入进行训练,但是在 DBM 中,某层 (比如:h
(1)
) 将同时接受上层 h
(2)
和下层
v 的输入。为了解决这一问题,Salakhutdinov Hinton(2009) 提出:在将 RBM 堆积成 DBM
之前,将 RBM 的网络参数除以 2(底部和顶部除外)
生成式预训练
DBN DBM 中,我们都有逐层预训练,都要将 L RBM 单独训练,然后再组装成深
度网络。其实 RBM 不是唯一可以预训练组装的模型,后面介绍的自动编码器及其变体也是可以
堆积的,关于这一点,我们将在后面介绍。
监督式预训练
另外,无论是 RBM 还是 AE,都是生成式预训练技术,还可以使用鉴别式预训练来鉴别
的初始化网络参数,例如:我们可以使用 BP 来确定权重。¬使用有标签样本数据 x, y 来训练第
一个隐含层 h
(1)
,如图 (1.7)(a) 所示
http://www.ma-xy.com 9 http://www.ma-xy.com
http://www.ma-xy.com
1.2 深度玻尔兹曼机 DBM 第一章 深度学习
算法 1 SML for DBM two hidden layers
1: 初始化:样本集 D
m
= {v
k
}
m
k=1
N初始权重 W
1
, W
2
容许误差 ε学习率 ηGibbs steps
N,初始虚拟样本 {˜v,
˜
h
(1)
,
˜
h
(2)
}(每个都是 m 行的随机矩阵)
2: while 未达到停止准则 do
3: // 停止准则可以是最大迭代次数或者梯度 W < ε
4: 从样本集 D
m
中随机挑选 M
b
个样本的小批量 v =
v
(1)
, v
(2)
, . . . , v
(M
b
)
5: 初始化矩阵
ˆ
h
(1)
ˆ
h
(2)
6: while 没有收敛 (均匀场推断循环) do
ˆ
h
(1)
σ
vW
(1)
+
ˆ
h
(2)
W
(2)T
ˆ
h
(2)
σ
ˆ
h
(1)
W
(2)
7: end while
W
(1)
1
M
b
v
T
ˆ
h
(1)
W
(2)
1
M
b
ˆ
h
(1)T
ˆ
h
(2)
8: for n 0; n < N ; n n + 1(吉布斯采样) do
9: Gibbs block 1:
˜v
ij
p(˜v
ij
= 1) = σ
W
(1)
j·
˜
h
(1)
i
T
i, j
˜
h
(2)
ij
p(
˜
h
(2)
ij
= 1) = σ
˜
h
(1)
i
W
(2)
·j
i, j
10: Gibbs block 2:
˜
h
(1)
ij
p(
˜
h
(1)
ij
= 1) = σ
˜v
i
W
(1)
·j
+
˜
h
(2)
i
W
(2)
·j
T
i, j
11: end for
12: 计算
W
(1)
W
(1)
1
M
b
M
b
t=1
v
T
˜
h
(1)
W
(2)
W
(2)
1
M
b
M
b
t=1
˜
h
(1)T
˜
h
(2)
13: 更新权重
W
(1)
W
(1)
+ ηW
(1)
W
(2)
W
(2)
+ ηW
(2)
14: end while
15: 输出:W
(1)
, W
(2)
.
http://www.ma-xy.com 10 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.2 深度玻尔兹曼机 DBM
1.7: BP 预训练示意图
得到权 W
(1)
接着在 h
(1)
和输出层之间插入一个新的隐含层 h
(2)
,再用 BP 算法训练
v, h
(1)
, h
(2)
, y得到 W
(2)
®如此下去,知道插入 h
L
个隐含层,收敛后得到 W
(L)
对于采用哪
W
(1)
来进行的训练,我们可以:使用中训练的 W
(2)
在堆积成 DBM 时不用此 W
(2)
以都采用中的 W
(2)
;可以采用¬中的 W
(1)
,在中不对 W
(1)
训练。
逐层 BP 和逐层贪心算法相似,但在 BP 算法中,每次新的隐含层加入时,所有的层都联合
更新,而在逐层贪心算法中,底层权重对上层权重一无所知,因而,大多数情况下,BP 算法是较
优的。然而,逐层 BP 有一个缺点:一些隐含层节点可能在训练收敛后处于饱和状态,因此,当
新的隐含层加入训练时,很难进行更新。为了解决这个问题,我们可以是用数据的
1
L
来进行
练。
混合式预训练
前面提到过生成式预训练和监督式预训练,自然想到将二者合并。已经证明生成式预训练有
助于训练深层结构。然而,随着深度的增加,鉴别式预训练同样表现的很好,甚至更好。混合预
训练则要优于二者。我们已经注意到,当训练集足够大时,预训练就变得不那么重要了。
丢弃式预训练
可以把 dropout 视为通过随机丢弃神经元来减小 DNN 容量的方法,也可以把 dropout 视为
一种打包技术,它可以对大量绑定参数的模型做平均,换句话所,与不适用 dropout DNN
比,dropout 能够生成更加平滑的目标平面,与一个陡峭的目标平面相比,一个平滑的目标平面
有较少的劣性局部最优点,这样,不容易陷入局部极小点。这启发我们可以使用 dropout 预训练
快速找到一个较好的起始点,然后不用 dropout 来微调 DNN
1.2.4 高斯 RBM
前面讨论的 BMRBMDBN DBM 其输入数据都要求 01 二值数据,并且网络中的
神经元状态都是 01 随机变量,即伯努利分布。下面将介绍一些实值 RBM其概率取值不再是
01,而是实值。
http://www.ma-xy.com 11 http://www.ma-xy.com
http://www.ma-xy.com
1.2 深度玻尔兹曼机 DBM 第一章 深度学习
高斯-伯努利 RBM 在伯努利 RBM 中,条件概率 p(h|v), p(v|h) 定义为
p(h|v) = σ(vW + a)
p(v|h) = σ(W
T
h + b)
现在将
v
改为高斯分布,即
p(v|h) = N(v|W h, β
1
)
其中:β
1
为协方差矩阵,是一个对角矩阵。注意,这里我们仅将 v 层改为高斯分布,h 层仍为
伯努利分布。对上面的分布取对数,有
log N(v|W h, β
1
) =
1
2
(v W h)
T
β(v W h) + f (β)
其中:f 封装了所有参数,但不包含模型中的随机变量。我们可以忽略 f ,因为它唯一的作用是
归一化分布。如果在能量函数中包含 log N 中涉及 v 的所有项,并且不添加其它涉及 v 的项,
那么,我们的能量函数就能表示想要的条件分布 p(v|h)其它条件分布 p(h|v) 比较自由。注意到
log N 中包含一项
1
2
h
T
W
T
βW h
该项中已经包含 h
i
, h
j
项,这一项不能被包含在其中,因为它对应着隐含层单元的边,如果包含
这些项,将得到一个线性因子模型,而不 RBM。在 RBM 中,我们简略的去 h
i
, h
j
的交叉
项,并且忽略这些想不改变条件分布 p(v|h)。如果我们使用精确地对角矩阵 β
1
会发现对于每
个隐含层神经元 h
i
,有
1
2
h
i
j
β
j
W
2
ji
如果在能量函数中包含此项,则当该单元的权重较大且以高进度连接到可见单元时,偏置 h
i
将自动关闭,是否包含该项不影响模型可以表示的分布族,但它会影响模型的学习动态,包含它
可以帮助隐含层神经元保持合理激活。因此,在高斯-伯努利 RBM 中,能量函数定义为
E(v, h) =
1
2
v
T
(β v) (v β)
T
W h a
T
h
并且,我们还可以添加额外项。注意到,上面并没有在可视层 v 中添加偏置。关于如何确定 β
1
可以根据样本数据给出,也可以通过模型估计出。
条件协方差无向模型
虽然高斯 RBM 经成为实值数据的标准能量模型,但 2010.Ranzato 为,高斯 RBM
能很好的适应某些类型的实值数据中存在的统计变化,特别是自然图像。图像中的大多数有用的
信息在于像素之间的关系,而不是原始像素值。由于高斯 RBM 反对给定 h 的输入 v 的改建均值
建模,所以它不能捕获条件协方差信息。为了解决这一问题,Ranzato 提出 mean and covariance
RBM(mcRBM)mean product of student-distribution(mPoT) pike and slab RBM(ssRBM)
http://www.ma-xy.com 12 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.2 深度玻尔兹曼机 DBM
mcRBM mcRBM 使隐含神经单独编码有可层神元的均值协方差。
体来所,mvRBM 的隐含层分成两组:均值神经元和协方差神经元。对条件均值建模的那组神经
元是简单的高斯 RBM另一半是协方差 RBM(Ranzato.2010)对条件协方差的结构进行如下建
模:将 h 分为二值均值神经元 h
(m)
和二值协方差神经元 h
(c)
mcRBM 的能量函数定义为二者
的组合
E
mc
(x, h
(m)
, h
(c)
) = E
m
(x, h
(m)
) + E
c
(x, h
(c)
)
其中:E
m
为高斯-伯努利 RBM 的能量函数
E
m
(x, h
(m)
) =
1
2
x
T
x
j
x
T
W
·j
h
(m)
h
j
a
j
(m)h
(m)
j
E
c
cRBM 的能量函数
E
c
(x, h
(c)
) =
1
2
j
h
(c)
j
x
T
r
(j)
2
j
a
(c)
j
h
(c)
j
参数 r
(j)
是与 h
(j)
关联的协方差权重向量,a
(c)
是一个协方差偏置向量。
组合后的能量函数定义的联合分布为
P
mc
(x, h
(m)
, h
(c)
) =
1
Z
exp{−E
mc
(x, h
(m)
, h
(c)
)}
给定 h
(m)
h
(c)
后,关于数据的条件分布为 (多元高斯分布)
P
mc
(x|h
(m)
, h
(c)
) = N
x
C
mc
x|h
j
W
·j
h
(m)
j
, C
mc
x|h
注意,协方差矩阵 C
mc
x|h
= (
j
h
(c)
j
r
(j)
r
(j)T
+ I)
1
是非对角矩阵,且 W 是与对条件均值建模的
高斯 RBM 相关联的权重矩阵,对于非对角的条件协方差接哦古,难以通过对比散度 (CD) 或持
续对比散度 (PCD) 来训练 mcRBMCD PCD 要从 x, h
(m)
, h
(c)
的联合分布中采样,这在标
RBM 中是通过吉布斯在条件分布上采样实现的,但是在 mcRBM 中, P
mc
(x|h
(m)
, h
(c)
)
抽样需要在学习的每个迭代步中计算 (C
mc
)
1
。当样本数据很大时,这是不易的。2010.Ranzato
Hinton
通过使用
mcRBM
自由能上的哈密顿混合蒙特卡罗直接从边缘分布
p
(
x
)
中采样。
注:自由能 FreeEnergy(x) 定义为
F reeEnergy(x) = log
h
e
E(x,h)
学生 t 分布均值乘积模型 mPoT 模型是 2010.Ranzato 以类似 mcRBM 扩展 cRBM 方式
扩展了 PoT (2003.Welling)。与 mcRBM 一样,样本上的 PoT 条件分布为多元高斯分布,
具有非对角的协方差;
mcRBM
不同的是,隐含变量的补充条件分布是由条件独立的
Gamma
分布给出的。mPoT 的能量函数为
E
mP oT
x, h
(m)
, h
(c)
= E
m
x, h
(m)
+
j
h
(c)
j
1 +
1
2
r
(j)
x
2
+
1 r
(j)
log h
(c)
j
http://www.ma-xy.com 13 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
其中:r
(j)
是与神经元 h
(c)
j
相关联的协方差权重向量。 mcRBM 一样,mPoT 也无法从非对角
高斯条件分布 P
mP oT
(x|h
(m)
, h
(c)
) 中采样,Ranzato etal(2010) 同样采用哈密顿混合蒙特卡洛直
接从边际分布 p(x) 中采样。
1.3 自动编码器 AE
1.3.1 基础自动编码器 AE
我们从主成分分析 PCA 谈起 (不详,可以参考其它的机器学习书籍或者多元统计教材)
共有 n 个变量和 m 个样本,样本集为 S = {x
1
, x
2
, . . . , x
m
}x
k
= (x
k
1
, x
k
2
, . . . , x
k
n
) R
n
。主成
分分析的目标是 (仅对无标签数据而言)
h
1
= w
11
x
1
+ w
12
x
2
+ ··· + w
1n
x
n
=
n
i=1
w
1i
x
i
h
2
= w
21
x
1
+ w
22
x
2
+ ··· + w
2n
x
n
=
n
i=1
w
2i
x
i
.
.
.
h
n
= w
n1
x
1
+ w
n2
x
2
+ ··· + w
nn
x
n
=
n
i=1
w
ni
x
i
换句话说,我们对原 n 变量进行 n (同的) 线性换,重新得到了 n 个变 (
)h
i
(i = 1, 2, . . . , n)由于要在 n h
i
中挑去一部分重要的 h
i
所以叫做主成分。可以对原始
变量 x = (x
1
, x
2
, . . . , x
n
) 进行任意的线性变换,显然不能这么做,我们希望 h
i
= w
T
i
x 的方差尽
可能大,而且各个 h
i
之间相互独立,由于
V ar(h
i
) = V ar(w
T
i
x) = w
T
i
Σw
i
其中:Σ x 的协方差矩阵。而对于 c,有
V ar(cw
T
i
x) = cw
T
i
Σw
i
c = c
2
w
T
i
Σw
i
如果不对 w
i
加以限制,则 V ar(h
i
) 可以任意增大,问题将变得没有意义。为此,我们要求:¬
w
T
i
w
i
= 1 i = 1, 2, . . . , n
w
2
i1
+ w
2
i2
+ ··· + w
2
in
= 1 i = 1, 2, . . . , n
h
1
x
1
, . . . , x
n
的线性组合中方差最大的,h
2
x 线性组合的方差第二大, h
2
h
1
不相
. . . h
1
, h
2
, . . . , h
n
x
1
, x
2
, . . . , x
n
n 个主成分。可以将 PCA 表示成如图 (1.8) 网络结
http://www.ma-xy.com 14 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
1.8: PCA 网络结构示意图
PCA 写成矩阵的形式,有
h = W
T
x
X 大, n h H 大。
h
1
, h
2
, . . . , h
n
x 息,h
1
分,h
2
分。
通过 h 来还原 x,如果考虑所有主成分,则
x = W
1
h
这样就把 x 还原回来了,无损失还原,x 还是 x。但是,既然 PCA 叫做主成分,我们自然希望
去掉一些成分,仅保留少量的主成分。这样,还原回来的 x 不再是原本的 x但是其主要特征还
在。这里,我们打算用 n
k
< n 个主成分来还原 x,还原回来的 x 记为 ˆx,显然 x ˆx 不相等。
设从 h ˆx 的映射为 ˆx = g(h),画出其网络结构,如图 (1.9)
1.9: PCA 网络结构示意图
其中:输入层 x n 个神经元,输出层 ˆx n 个神经元,隐含层/主成分层 h n
h
< n
神经元。输入层到隐含层的权重为 W ,隐含层到输出层的权重为 V ,阈值分别为 a, b
主成分分析是对变量 x 的有损是压缩与还原的过程:x
压缩
h
还原
ˆx或者说 PCA 是编码和
解码过程: x 编码到低维空间 h在解码到高维空间 ˆx并且,值得一提的是,如果 x
1
, x
2
, . . . x
n
之间不相关,只要 n
h
< n就不能完全还原 x现在,将这种思想一般化:编码解码。自动编码
AE 即是基于这种思想的神经网络。
自动编码器即对自身 x 进行编码解码后还原到 x当然,像上面分析的那样,如果对 h 不做
任何约束,那么 ˆx = g(h) = g(f(x)) 是没有任何意义的,因为总会存在映射 f x 编码解码后
http://www.ma-xy.com 15 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
还原到 x但如果我们对隐含层/特征层 h 加以约束,就会使 h 尽可能保留 x 的特征,以便于还
原。使用上面的网络格式
h = f(W
T
x + a)
ˆx = g(V
T
h + b)
其中:f 为编码器,g 为解码器。进一步,可以写为
ˆx = g(f (x))
由于输入 x 输出 ˆx 的大小相同,我们将 AE 网络结构进行折叠,折叠前后的网络结构如图
(1.10) 所示
1.10: AE 折叠的网络结构
AE 络结建立了,下工作解编 f 和解 g。这函数
f, g 是事先确定的,所以我们的目标是求 W, V, a, b我们仍然假设有样本集 S = {x
1
, x
2
, . . . , x
m
}
x
k
= (x
k
1
, x
k
2
, . . . , x
k
n
) R
n
。此数据为无标签/目标用于无监督的数据。 BP 经网络那
样,我们自然想到:求 θ (W, V, a, b),来使“离差平方和”尽可能小
min
θ
J(W, V, a, b) =
m
k=1
||x
k
ˆx
k
|| =
m
k=1
e
T
k
e
k
注意到,这里的离差 e 是一个和 x 同大小的矩阵,e
k
e 的第 k 行,是一个向量。当然,我们
可以将目标 J(θ) 进行正则化,有
min
θ
J(W, V, a, b) =
m
k=1
||x
k
ˆx
k
|| +
1
2
||W ||
2
+
1
2
||V ||
2
我们将上述目标一般化,有
min
θ
J(θ) =
m
k=1
(x
k
, ˆx
k
) + Ω(θ) = L(x, ˆx) + Ω(θ)
其中: 为损失函数,Ω(θ) 为正则项/罚项。
注:1. h 的要求:可以令 n
h
< n也可以要求 h 具有稀疏性;2. 此网络深度可以像 BP 网络
那样加深,同样,也可以对其进行堆积。
下面来求上述目标 J(θ)从自动编码器的网络结构来看,其网络层数明显可以加深。我们设
其层数为 L l 层的权重为 W
l
, l = 1, 2, . . . , L,第 l 层的阈值 b
l
, l = 2, 3, . . . , L。各层神经
http://www.ma-xy.com 16 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
元数目为 n
l
, l = 1, 2, . . . , L,且 n
1
= n
L
= n。优化目标为
min
θ
J(W, b) =
m
k=1
||x
k
ˆx
k
||
2
+
1
2
L
l=1
||W
l
||
2
J 关于 θ 求导,有
J
θ
=
m
k=1
θ
||x
k
ˆx
k
||
2
+
1
2
L
l=1
θ
||W
l
||
2
我们来看
θ
||x
k
ˆx
k
||
2
=
θ
n
j=1
(x
k
j
ˆx
k
j
)
2
其解法与前面的 BP 神经网络相似,这里就不再介绍了。
1.3.2
稀疏自动编码器
Sparse AE
在前面的 AE 中,要求 n
h
< n,现在考虑 n
h
n。对此,如果不加限制,则编码器不能很
好的工作,所以要对 h 加以限制/约束。我们给 h 中神经元加上稀疏约束,具体而言,当神经元
的输出接近 1 的时候,我们认为它被激活,而输出值接近 0 的时候,它被限制。我们使 h 中的
神经元大部分时间都被限制,此即为 h 的稀疏性约束。设 f sigmoid(如果是 tanh,则当输出
-1 时神经元被限制),记稀疏性惩罚为 Ω(h),则目标变为
J
sparse
(W, b) = J(W, b) + Ω(h)
其中:如果仅考虑一个隐含层 h,则 W = (W
(1)
, W
(2)
)b = (b
(1)
, b
2
)
a
j
表示隐含层神经元 j 得到激活度 (输出),但这并未标明是哪一个样本 x
k
带来的激活
(每输入一个样本,都会有一个神经元 j 都会有一个激活度)。所以,我们 a
j
(x
k
) 表示样
x
k
带来的激活度。进一步,用
ˆρ
j
=
1
m
m
k=1
a
j
(x
k
)
表示 h 的第 j 个神经元的样本平均激活度。我们可以近似的加入一些限制,比如
ˆρ
j
= ρ
其中:ρ 为稀疏性常数,一般设置为 0.05换句话说,我们想让 j 的平均激活度为 0.05为了满
足这一要求,隐含层 j 的激活度庇护接近于 0。现在,我们写出稀疏性罚因子 Ω(h) 的具体形式
n
h
j=1
ρ log
ρ
ˆρ
j
+ (1 ρ) log
1 ρ
1 ˆρ
j
http://www.ma-xy.com 17 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
注意,我们仅考虑一个隐含层的 AEn
h
为隐含层神经元个数。其实,上式是一个以 ρ 为均值和
一个以 ˆρ
j
为均值的 2 个伯努利随机变量之间的相对熵
KL(ρ||ˆρ
j
) =
ρ log
ρ
ˆρ
j
+ (1 ρ) log
1 ρ
1 ˆρ
j
KL 中,当 ˆρ
j
= ρ 时,它达到最小值 0,而当 ˆρ
j
靠近 0 1 时,相对熵 KL 会变的非常
大。所以这个 Ω(h) 是有效的,于是目标写为
J
sparse
(W, b) = J(W, b) + Ω(h)
=
m
k=1
||x
k
ˆx
k
||
2
+
β
2
n
h
j=1
KL
(
ρ
||
ˆ
ρ
j
)
注意;上面的目标中不包含正则项,或者说 KL 就是正则项。现在求 J
sparse
的导数,J
sparse
导由两部分组成:一个是 J (W, b) 求导,一个是 KL 求导。J(W, b) 的求导和 BP 相似,所以下
面主要介绍 KL 的求导。
S
(
W, b
) =
n
h
j=1
KL
(
ρ
||
ˆ
ρ
j
)
,我们要求导
S(W, b)
W
(l)
ij
S(W, b)
b
(l)
i
首先,我们将 S(W, b) 展开,有
S(W, b) =
n
h
j=1
KL
(
ρ
||
ˆ
ρ
j
) =
n
h
j=1
ρ log
ρ
ˆρ
j
+ (1 ρ) log
1 ρ
1 ˆρ
j
其中:
ˆρ
j
=
1
m
m
k=1
a
j
(x
k
) =
1
m
m
k=1
f
n
1
i=1
x
k
i
W
(1)
ij
+ b
(1)
j
由上式可知:
1. l = 1 时,
S(W,b)
W
(l)
ij
= 0,
S(W,b)
b
(l)
j
= 0
2.
S(W, b)
W
(l)
ij
=
W
(l)
ij
n
h
j=1
KL(ρ||ˆρ
j
) =
KL(ρ||ˆρ
j
)
W
(l)
ij
S(W, b)
b
(l)
j
=
b
(l)
j
n
h
j=1
KL(ρ||ˆρ
j
) =
KL(ρ||ˆρ
j
)
b
(l)
j
http://www.ma-xy.com 18 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
由上述两条,我们有
S(W, b)
W
(1)
ij
=
KL(ρ||ˆρ
j
)
W
(1)
ij
=
W
(1)
ij
ρ log
ρ
ˆρ
j
+ (1 ρ) log
1 ρ
1 ˆρ
j
=
W
(1)
ij
ρ(log ρ log ˆρ
j
) + (1 ρ)[log(1 ρ) log(1 ˆρ
j
)]
= ρ
0
1
ˆρ
j
ˆρ
j
W
(1)
ij
(1 ρ)
0 +
1
1 ˆρ
j
ˆρ
j
W
(1)
ij
=
ρ
ˆρ
j
+
1 ρ
1 ˆρ
j
ˆρ
j
W
(1)
ij
类似的,有
S(W, b)
b
(1)
j
=
ρ
ˆρ
j
+
1 ρ
1 ˆρ
j
ˆρ
j
b
(1)
j
接下来,只需要求出 ˆρ
j
的导数即可。由 ˆρ
j
的计算公式,我们有
ˆρ
j
=
1
m
m
k=1
a
j
(x
k
) =
1
m
m
k=1
f
n
1
i=1
x
k
i
W
(1)
ij
+ b
(1)
j
为书写方便,令
z
(2)
j
= z
(2)
j
(x
k
) =
n
1
i=1
x
k
i
W
(1)
ij
+ b
(1)
j
a
j
(x
k
) = f
z
(2)
j
于是有
ˆρ
j
W
(1)
ij
=
1
m
m
k=1
f
z
(2)
j
z
(2)
i
W
(1)
ij
=
1
m
m
k=1
f
z
(2)
j
x
k
i
类似的,有
ˆρ
j
b
(1)
j
=
1
m
m
k=1
f
z
(2)
j
z
(2)
i
b
(1)
j
=
1
m
m
k=1
f
z
(2)
j
至此,求导工作结束。作为练习,可以将上述内容写为矩阵形式。
http://www.ma-xy.com 19 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
1.3.3 降噪自动编码器 Denoising AE
Denoise AE Vincent35 2008 年提出。其主要思想是:首先,对样本数 S = {x
k
}
m
k=1
加入噪声。然后,基于有噪声的输入向量 (样本) 编码解码。要求解码后的向量尽可能保持
原输入向量周围。如果 AE 对干扰后的数据都能很好的还原,则此网络具有很好的鲁棒性。
设原始数据为 x,加入噪声后的输入为 ˜x = x + noise然后将 ˜x 通过编码函数 f 映射到 h
在解码 h ˆx = g(h),表达式写为
h = f(˜x) = σ(W ˜x + a)
ˆx = g(h) = σ(V h + b)
损失函数用 ˆx x 来定义,而非 ˆx ˜x,有
J
DAE
(W, b) =
m
k=1
(x
k
, ˆx
k
)
其中:W = (W
(1)
, W
(2)
) = (W, V )Denoise AE 的关键是对输入 x 加干扰,目前常用的干扰有
2 种:¬
˜x = x + ε
ε N(0, σ
2
I)
就单一样本而言,以概率 p 将输入向量 x
k
的部分量设置为 0,其余不变。
注:前面的 AE 我们都是采用离差平方和最小,还可以考虑极大似然方法,这一点很重要!
1.3.4 边缘降噪自动编码器 mDAE
Chen.M 2014 开发了边缘降噪自动编码器 (Marginalized Denoising AE,mDAE)7。在
Denoise AE 中,目标函数定义为
J
DAE
(θ) =
m
k=1
x
k
, g(f(˜x))
令上式中的 g(f (˜x)) = f
θ
(˜x)(这里的 f
θ
不是 f )µ
x
= E
p(x|˜x)
[˜x]其中:˜x x 的干扰项,µ
x
˜x 的期望值。我们的目标是
1
m
m
k=1
1
n
n
j=1
x
k
j
, f
θ
˜x
k
j

当隐含层 h 的神经元个数很多时,会使得学习速度变得很慢。上面的目标本质是
1
m
k
k=1
E
p(˜x
k
|x
k
)
[(x
k
, f
θ
(˜x
k
))]
将损失函数 ˜x 处二阶泰勒展开,有
x
k
, f
θ
(˜x
k
)
(x, f
θ
(µ
x
)) + (˜x µ
x
)
T
˜x
+
1
2
(˜x µ
x
)
T
2
˜x
· (˜x µ
x
)
http://www.ma-xy.com 20 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
其中:
˜x
ℓ,
2
˜x
˜x 处的一阶导数和二阶导数。
˜x 取期望
E[(x, f
θ
(˜x))] (x, f
θ
(µ
x
)) +
1
2
tr
E[(˜x µ
x
)(˜x µ
x
)
T
]
2
˜x
其中:E[˜x] = µ
x
。令 Σ
x
= E[(˜x µ
x
)(˜x µ
x
)
T
],则上式写为
E[(x, f
θ
(˜x))] (x, f
θ
(µ
x
)) +
1
2
tr
Σ
x
2
˜
x
上式即为损失函数。它只需要基于干扰项 ˜x 的一阶泰勒展开和二阶泰勒展开即可。并且, x
添加噪声时,由于每一个样本是单独加入噪声的,所以 Σ
x
可简化为对角矩阵。因此,只需要计
Hesse 矩阵
2
˜x
的对角项即可。
Hesse 矩阵的缩放依赖于数据的维度,但是对角矩阵的缩放是线性的,这种简化可以节省计
算量,特别是对于高维数据而言。我们设第 k Hessi 矩阵的对角为
2
˜x
k2
=
z
˜x
k
2
2
z
2
z
˜x
k
+
z
T
2
z
˜x
k2
其中:z 为隐含层的输出。 LeCun(1998) 提出的方法,将上式的最后一项省略,前一项是一个
二次项,矩阵
2
z
=
2
z
2
表示 关于 z Hesse 阵,并且这个矩阵是正定的,所以可以利用
正定性进一步简化矩阵的非负对角项。简化之后,该 Hessi 矩阵的对角项计算公式为
2
˜x
k2
n
h
j=1
2
z
2
j
z
j
˜x
k
2
中:n
h
数;z
j
h 中第 j 出。后,
mDAE 的最终目标函数为
J
mDAE
(θ) = L(x, f
θ
(µ
x
)) +
1
2
m
k=1
σ
2
x
k
n
h
j=1
2
z
2
j
z
j
˜x
k
2
其中:σ
2
x
k
是第 k 个样本 x
k
干扰的方差,也即 Σ
x
对角矩阵的第 k 个元素。
1.3.5 收缩自动编码器 Contractive AE
CAE27 Salah Rifai 等于 2011 年提出。对于一般的 AE在目标/损失函数后加正则项,
目标函数变为
J
(θ) = L(x, ˆx) + Ω(θ) =
m
k=1
(x
k
, ˆx
k
) + Ω(θ)
其中:Ω(θ) 为参数 θ 的正则项,网络的编码解码过程为
h = f(W x
k
+ a)
ˆ
x
k
= g(V h + b) = g(V f (W x
k
+ a) + b) = g(f (x
k
))
http://www.ma-xy.com 21 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
我们这里直接对 θ 进行惩罚,一般而言,Ω(θ) =
ij
W
2
ij
现在,仍然对
h
隐含层进行处理,令
Ω(h) = ||J
f
(x)||
2
F
=
ij
h
j
(x)
x
i
其中:J
f
(x) 是隐含层输出值关于权重 W Jacobi 矩阵,||J
f
(x)||
2
F
表示该 Jacobi 矩阵的 F
数的平方,即矩阵中的每个元素求平方再求和,具体写为
||J
f
(x)||
2
F
=
n
h
i=1
(h
i
(1 h
i
))
2
n
j=1
W
2
ij
其计算复杂度为 O(n × n
h
)。此时的目标函数变为
J
CAE
(θ) =
m
k=1
x
k
, g(f(x
k
))
+ λ||J
f
(x
k
)||
2
F
解释:噪自编码 DAE CAE 存在定的系,Alian Bengio(2013) 出:
在引入小的高斯噪声时,DAE 的重构误差 CAE 的收缩惩罚因 Ω(h) 是等价的,也就是说,
CAE 具有抵抗微小干扰的能力。CAE 只是局部收缩,对样本 x 的所有扰动都映射到 f (x) 的附
近。从全局来看,2 个不同点 x, x
会分别被映射到远离原点的两个点 f(x), f(x
)CAE 对数据
中的小扰动敏感性较小,且重构特征不受惩罚因子的影响。但是 CAE 只对数据中极小扰动有鲁
棒性。为此,我们可以进一步惩罚不同阶的偏差,将其目标函数改为
J
CAE+h
=
m
k=1
x
k
, g(f(x
k
))
+ λ||J
f
(x)||
2
F
+ γE
ε
[||J(x) J
f
(x + ε)||
2
F
]
其中:ε N(0, σ
2
I)γ, λ 为权重参数,x + ε = ˜x
经过上面的改进,CAE-h 的鲁棒性进一步提高。但由于基于鲁棒理论的 CAE 较为复杂,
建训练的难度较大,因而针对 CAE 的引用较少。
1.3.6 堆积自动编码器 Stacked AE
1986.Rumelhart 出自动编码器 AE2006.Hinton 提出深度置信网 DBN2007.Bengio
器;2008.Vincont 器;2010.Salah 器;
2011.Jonathan 提出器;2013.Telmo 研究练得
动编码器的性能。
回忆一下我们是怎样搭建前 2 个深度网络 DBN DBM 的?DBM 是一个个小的 RBM
型堆积而成,对样本进行学习时,先训练每个小的 RBM,然后把它们组合在一起进行微调。即
Henton 提出的贪心逐层训练算法。其实,AE RBM 存在很多相似的地方:它们都可以用来生
成数据 (对样本分布进行估计),并且 AE 也可以表示成 RBM 的网络形式,如图 (1.11)
http://www.ma-xy.com 22 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
1.11: AE 折叠成 RBM 的网络形式
那么自然想:能否将 AE 堆积形成深度网络?可以的, AE 堆积而成的深度网络称为 Deep
AE 或者 stacked AE(注意:这里的 AE 可以是 AE 的衍生模型,如 CAE 和后面介绍的 VAE)
DBM 是在 RBM 隐含层 h 后再添加网络层,那么,AE 应该在 h /特征层还是在 ˆx
后再加网层呢?即下一个 AE 输入是上 AE h 还是 ˆx 层?在回答个问题之前,
我们来记一下 AE
h = f(W x + a)
ˆx = g(V h + b)
一般情况下,ˆx 不是 x 的精确重构,它只是在满足一定分布的条件概 p(x|ˆx) 下,最大程度的
接近 x因此,AE 的目标不仅可以是离差平方和,还可以用极大似然估计,特别是在去噪自动
编码器中,ˆx 是有明显 (条件) 分布的。并且
(x, ˆx) log(x|ˆx)
x R
n
x|ˆx N(ˆx, σ
2
I) ||x ˆx||
2
x {0, 1}
n
x|ˆx B(ˆx) ||x ˆx|| 标,使 (
logistics 回归中有介绍)
(x, ˆx) =
j
[x
j
log ˆx
j
+ (1 x
j
) log(1 ˆx
j
)] = H(B(x)||B(ˆx))
现在考虑我们的问题:下一个 AE 的输入是上一个 AE h 层还是 ˆx 层?(1) 如果是将隐含
h 作为下一层的输入,那么,预训 (无监督) 逐层训练应该为:将第一个 AE 训练好后,有
W
(1)
, V
(1)
, a
(1)
, b
(1)
然后,将样本再次输入到第一个 AE 中,每个样本 x
k
都会有一个 h
k
, ˆx
k
们把 h = {h
k
}
m
k=1
作为输入,输入到第二个 AE 中进行训练,训练后有 W
(2)
, V
(2)
, a
(2)
, b
(2)
;然
后将 h 在此输入,如此下去,直到最后一层。这样,就完成了 stacked AE 的预训练,也就得到
了深层网络的初始权重和阈值。如果要进行分类任务,可以在预训练之后,运用 BP 等算法对网
络参数进行微调 (联合训练)。如图 (1.12) 所示
1.12: SAE
的训练过程图
http://www.ma-xy.com 23 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
注:如果设置 V
T
= W ,那么网络的训练会变得简单易行。(2) 如果是将输出层 ˆx 作为下一
AE 的输入,则其深层网络如图 (1.13) 所示
1.13: AE 第二种堆积网络
其训练过程和 (1) 的情况是相似的。
1.3.7 变分自动编码器 VAE
记样本数据为 D = {x
1
, x
2
, . . . , x
m
}D 是域 S R
n
中的采样
¬
x
k
= (x
k
1
, x
k
2
, . . . , x
k
n
) R
n
称为样本点。并且,我们假设是 n 随机变量 x = (x
1
, x
2
, . . . , x
n
),所以 S 上应该有这 n 个随机
变量的分布函数 p(x)
假设 AE 的隐含层 z
= h n
h
个神经元,神经元之间可以互相连接,也可以不连接 (独立)
记全体隐含层神经元为 z = (z
1
, z
2
, . . . , z
n
h
)假设 AE 网络的参数 θ 已经给出,我们可以说:
x 后就有了 z,或者给定 z 之后就有了 x,因为二者之间是一个编码 f 和解码 g 的过程
z = f (x; θ
)
ˆx = g(z; θ
′′
)
θ
= (θ
, θ
′′
)
= (W, V, a, b)。值得一提的是,我们可以将 f, g 扩展为任意函数形式,比如 MLP,
CNN 网络形式。也可以将 z 设置为任意结构,z 的神经元之间可以连接、不连接以及部分
连接,这样 AE 模型的范围就变得大了许多。
AE 网络中的参数 θ 是待求的,关于 θ 的求解,大致可分为 3 个方向:¬基于参数估计得极
大似然估计 ML基于贝叶斯方法的最大后验估计 MAP®离差平方最小的最小二乘 OLS
者的共同之处是,它们都是一个优化问题。前面我们讨论了®离差平方和方法,下面先来看极大
似然估计。
在假设样本独立同分布情况下,如果已经知道了单一样本 x
k
的分布 p
θ
(x
k
)
= p(x
k
|θ)可以
直接写出极大似然的目标
max
θ
J(θ) = log P (x|θ) = log
m
k=1
p(x
k
; θ) =
k
log p(x
k
; θ)
如果样本的分布 p(x
k
; θ) 形式已知,直接求导即可。但是现在的问题是:p(x; θ) 不易求解,但是
存在一个潜随机变量 zp(x, z; θ) 是可求的 (就像在 RBM 中遇到的那样)
¬
我们可以在实值 R
n
上讨论 x,也可以在 {0, 1}
n
上进行讨论。
http://www.ma-xy.com 24 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
抛弃我们的模型,如果已知 p(x, z)如何求 p(x)从联合分布 p(x, z) 中采样 {x
k
, z
k
}然后
求和/积即可。回到我们的模型中,发现只有部分样本 {x
k
} {x
k
, z
k
}
m
k=1
为整体样本,{x
k
}
m
k=1
部分本。 z 值,源于 p(z|x; θ)(我们)
们记 x 的概率分布 p(x; θ)z 的概率分布 q(z; θ),联合概率分布为 p(x, z; θ)条件分布为
p(x|z; θ) p(z|x; θ)
既然 p(x; θ) 不易找到,考虑将其用联合分布表示
p(x; θ) =
z
p(x, z; θ)dz
于是,单一样本的 x
= x
k
最大似然目标为
J(θ) = log p(x; θ) =
z
p(x, z; θ)dz
由条件概率关系
p(x, z) = p(x)p(z|x) = q(z)p(x|z)
并且我们求 p(x),可以得到
J(θ) = log
z
p(x, z; θ)dz
= log
z
q(z)p(x|z)dz
注意:上面的概率分布函数都忽略了参数 θ本应写为 p(x; θ), q(z; θ)并且,如果在贝叶斯框架,
则写为 p(x|θ ), q(z|θ)。上式的难点在 q(z) p(x|z)。下面介绍 EM 算法和变分估计,并用这
两种方法求解上述问题。
EM 算法
EM 算法 Dempster 等于 1997 年提出的,用于求解含有潜变量 z
= h 的参数极大似然估
计或最大后验概率估计。我们假设在 t 次迭代后,参数值为 θ
t
现在,我们要求 θ
t+1
我们自然
希望新的参数 θ 能使目标 J (θ) 增加,即 J(θ) > J(θ
t
)。为此,我们考虑二者的差
J(θ) J(θ
t
) = log
z
q(z)p(x|z)dz log p(x; θ
t
) (1.1)
引理 (Jensen 不等式) φ 为凸函数,则
φ(E(x)) E(φ(x)) φ
n
i=1
g(x
i
)λ
i
n
i=1
φ(g(x
i
))λ
i
其中:x = (x
1
, x
2
, . . . , x
n
)
i
λ
i
= 1λ
i
0
http://www.ma-xy.com 25 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
注:Jensen 不等式给出了积分的凸函数值和凸函数的积分值之间的关系。其实, SVM 部分有
简单的介绍过 Jensen 不等式。
Jensen 不等式应用到 (1.1) 中,有
J(θ) J(θ
t
) = log
z
q(z)p(x|z)dz log p(x; θ
t
)
= log
z
p(z|x; θ
t
)
p(x|z)q(z)
p(z|x; θ
t
)
dt log p(x; θ
t
)
z
p(z|x; θ
t
) log
p(x|z; θ)q(z; θ)
p(z|x; θ
t
)
dt log p(x; θ
t
)
=
z
p(z|x; θ
t
) log
p(x|z; θ)q(z; θ)
p(z|x; θ
t
)p(x; θ
t
)
dt
于是有
J(θ) J(θ
t
) +
z
p(z|x; θ
t
) log
p(x|z; θ)q(z; θ)
p(z|x; θ
t
)p(x; θ
t
)
dt
B(θ, θ
t
) = J(θ
t
) +
z
p(z|x; θ
t
) log
p(x|z; θ)q(z; θ)
p(z|x; θ
t
)p(x; θ
t
)
dt
B(θ, θ
t
) 是目标 J(θ) 的下界,且由 B(θ
t
, θ
t
) = J(θ
t
) 可知,对于任意的 θ如果 θ 使 B(θ , θ
t
) >
B(θ
t
, θ
t
),则 J(θ) > J(θ
t
)。为了使 J(θ) 尽可能增大,选择 θ
t+1
B(θ, θ
t
) 最大。
θ
t+1
= arg max
θ
B(θ, θ
t
)
= arg max
θ
J(θ
t
) +
z
p(z|x; θ
t
) log
p(x|z; θ)q(z; θ)
p(z|x; θ
t
)p(x; θ
t
)
dt
= arg max
θ
z
p(z|x; θ
t
) log p(x|z; θ)q(z; θ)dt
=
z
p(z|x; θ
t
) log p(x, z; θ)dz
Q(θ, θ
t
) =
z
p(z|x; θ
t
) log p(x, z; θ)dz
=
z
p(z|x; θ
t
) log p(x, z; θ)
Q 是完整数据 (x, z) 的对数似然函数 log p(x, z; θ) 的期望。可以给出如下的 EM 算法:
Step1. 初始化。D = {x
k
}
m
k=1
初始网络 AE初始参数 θ
0
联合分布函数 p(x, z; θ)迭代次数
t := 0t
max
,容许误差 ε
1
, ε
2
Step2. 对第 t 次迭代,已经有了 θ
t
,现在来求 θ
t+1
1. E 步:计算概率 p(z|x; θ
t
)
http://www.ma-xy.com 26 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
2. M 步:计算
Q(θ, θ
t
) =
z
p(z|x; θ
t
) log p(x, z; θ)dz
θ
t+1
= arg max
θ
Q(θ, θ
t
)
Step3. 终止条件。如果 ||θ
t+1
θ
t
|| < ε
1
或者 ||Q
t+1
Q
t
|| < ε
2
则终止;否则,则置 t := t + 1
返回 Step2.
现在的问题是,如何求解 p(z|x; θ
t
)p(x, z; θ) 以及
z
p log pdz假设前面已经直达了 p(x, z; θ)
p(z|x; θ
t
),现在的关键是如何求积分。我们用数值积分公式计算 Q(θ, θ
t
) 中的积分,有
Q(θ, θ
t
)
1
N
N
i=1
log p(x, z
i
; θ)
其中:N z
i
的样本数。这里涉及到按照某分布 p(z|x) z 进行采样 {z
i
}
N
i=1
,我们可以采用
MCMC 等采样方法。
MCMC MCMC p(z|x; θ
t
) z 题。
布, P 链,使
p(z|x; θ
t
)么, z
0
发,沿移,
{z
0
, z
1
, . . . , z
n
, z
n+1
. . . } n 了, p(z|x)
{z
n
, z
n+1
, . . . }
这正是前面模拟退火算法或者 BM 网络的思路,由 Metropolis 1953 年提出。MCMC
样的如何移矩 P 使稳分 p(z|x; θ
t
)。下面,率分 p(x)
MCMC 样: q(x
i
, x
j
)( x
i
x
j
)
α(x
i
, x
j
)(以概率 α 接受这个转移),则 MCMC 描述为 (2)
算法 2 MCMC for p(x)
1: 初始化:初始状态 X
0
= x
0
t := 0t
max
2: for t = 1, 2, . . . 循环一下采样步骤 do
3: t 时刻的马氏链状态为 X
t
= x
t
,采样 y q(x|x
t
)
4: 从均匀分布中采样 u U(0, 1)
5: 如果 u < α(x
t
, y) = p(y)q(x
t
|y),则接受转移 x
t
y,即 X
t+1
= y,否则,不接受转移
X
t+1
= x
t
6: end for
Metropolis-Hastings 采样只是将上述算法中的 α(x
t
, y) 变为
α(x
t
, y) = min
p(y)q(x
t
|y)
p(x
t
)p(y|x
t
)
, 1
关于 MCMC 更多的介绍可以参考《高等数理统计》茆诗松 P441
http://www.ma-xy.com 27 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
变分近似推断
将目标函数进行如下分解 ( DBN 处有介绍)
J(θ) = log p(x; θ) = L(q, θ) + KL(q||p)
其中:
L(q, θ) =
z
q(z) log
p(x, z; θ)
q(z)
KL(q||p) =
z
q(z) ln
p(z|x; θ)
q(z)
注意,上式中的 q(z) 的函数形式未知,所以 L(q, θ) 是一个关于 q 函数和参数 θ 的泛函。又因为
KL(q||p) 0,当且仅当 q = p 时等号成立,所以,L(q, θ) 是目标 log p(x; θ) 的一个下界,只有
p = q 时,log p(x; θ) = L(q, θ)
EM 算法中, θ
t
¬ E 步,我 L(q|θ
t
) 关于 q
值,即求函 q 使 L(q, θ
t
) 大。注意到 ln p(x; θ
t
) 依赖 q(z) 是一个定量,为 L(q, θ
t
)
上界,所以 L(q, θ
t
) 的最大值出现在 L(q, θ
t
) = ln p(x; θ
t
)。换句话说,出现在 KL(q||p) = 0 时,
q(z) = p(z|x; θ
t
) 时。这样,就找到了 q 使 L(q, θ
t
) 最大; M 步,q 函数保持不变,下界
L(q, θ) 关于 θ 行最大化,从而得到 θ
t+1
。将 q = ln p(z|x; θ
t
) 带入 L(q, θ)然后再关于 θ
大,有
L(q, θ) =
z
p(z|x; θ
t
) ln p(x, z|θ)
z
p(z|x; θ
t
) ln p(z|x; θ
t
)
= Q(θ , θ
t
) + H(q)
这里的 Q(θ, θ
t
) EM 算法中的一致,我们在 M 步中将其最大化。Q 是完整数据 (x, z) 的对数
似然函数的期望。如 p(x, z; θ) 是由指数分布族的成员组成,或者由其乘积组成,例如 p(x, z)
n + n
h
元高斯分布, log 运算会抵消指数运算,从而使得 M 步通常比最大化 log p(x; θ)
容易的多。
下面介绍变分法的思想
ln p(x) = L(q) + KL(q||p)
其中:
L(q) =
q(z) ln
p(x, z)
q(z)
dz = E
q (z)
ln
p(x, z)
q(z)
KL(q||p) =
q(z) ln
p(z|x)
q(z)
dz
与之前一样, q(z) 使 L(q) 最大,这等于求 q(z) 使 KL 最小。如果允许 q 为任意函数,
么下界 L 的最大值出现在 KL 等于 0 的时候,即 q(z) = p(z|x),然而,在实际的模型当中,往
往对 q(z) 有一定的要求。在函数域 Q 中寻找最优的 q(z) 来使 KL 距离最小。一个会有的想法是
http://www.ma-xy.com 28 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
q(z) p(z|x)即找 p(z|x) 来近似充当 q(z)在微分方程部分,常用参数化方法来处理泛函问题,
我们不在函数空间中寻找 q,而是在参数空间中寻找 q。现在,引入参数 ϕ,每一个具体的参数
ϕ 对应一个函数 q(z; ϕ),于是求 q 就变为求 ϕ。将参数化的函数空间 Q 记为 Q = {q(z; ϕ)},即
q
ϕ
(z) 是某一分布族。
上面,无论是在 EM 算法还是在变分推断,都是在变量 x, z 者所有样本 {x
k
} 上进行的,
下面,将在单独某一个样本 x
k
(或小批量样本) 中进行分析。
log p(x; θ) = log
m
k=1
p(x
k
; θ) =
m
k=1
log p
θ
(x
k
)
并且
log p
θ
(x
k
) = L(θ, ϕ; x
k
) + KL(q
ϕ
(z|x
k
)||p
θ
(z|x
k
))
其中:L(θ, ϕ; x
k
) log p
θ
(x
k
) 的下界。我们的目标仍然是求参数 θ, ϕ使下界 L(θ, ϕ; x
k
) 最大。
log p(x
k
) L(θ, ϕ; x
k
) = E
q
ϕ
(z|x
k
)
log p
θ
(x
k
, z) log q
ϕ
(z|x
k
)
=
z
q
ϕ
(z|x
k
) log
p
θ
(x
k
, z)
q
ϕ
(z|x
k
)
dz
x z 独立时,将 L(θ, ϕ; x
k
) 中的 p
θ
(x
k
, z) 拆分
p
θ
(x
k
, z) = p
θ
(z|x
k
)p
θ
(x
k
)
L =
z
q
ϕ
(z|x
k
) log
p
θ
(
z
|
x
k
)p
θ
(x
k
)
q
ϕ
(z|x
k
)
dz
=
z
q
ϕ
(z|x
k
) log
p
θ
(z|x
k
)
q
ϕ
(z|x
k
)
dz +
z
q
ϕ
(z|x
k
) log p
θ
(x
k
)dz
= KL(q
ϕ
(z|x
k
)||p
θ
(z|x
k
)) + E
q
ϕ
(z|x
k
)
log p
θ
(x
k
|z)
(1.2)
¬ L(1.2) 中的第一项。边界 L(θ, ϕ, x
k
) 包含 KL (q
ϕ
(z|x
k
)||p
θ
(z|x
k
)) 项,这一项可以解
析的求出。我们在高斯情况下讨论: p
θ
(z|x
k
) 为标准正态分布,p
θ
(z|x
k
) = N (0, I)q
ϕ
(z|x
k
)
布, q 的各 (z
1
, z
2
, . . . , z
n
h
) 是相的。q
ϕ
(z|x
k
) 中的 ϕ
µ, σ(这里的 µ 为均值向量 µ = (µ
1
, µ
2
, . . . , µ
n
h
)σ 也为方差向量 σ = (σ
1
, σ
2
, . . . , σ
n
h
),下面的
µ, σ 都是向量哦),随机变量 z
1
的分布是均值为 µ
1
,方差为 σ
2
的正态分布。因此
q
ϕ
(z|x
k
) log p(z|x
k
)dz =
N(z; µ, σ
2
) log N(z; 0, I)dz
=
n
h
2
log(2π)
1
2
n
h
j=1
(µ
2
j
+ σ
2
j
)
q
ϕ
(z|x
k
) log q
ϕ
(z|x
k
)dz =
N(z; µ, σ
2
) log N(z; µ, σ
2
)dz
=
n
h
2
log(2π)
1
2
n
h
j=1
(1 + σ
2
j
)
http://www.ma-xy.com 29 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
最后,我们有
KL(q
ϕ
||p
θ
) =
q
ϕ
(z|x
k
) log
p
θ
(z|x
k
)
q
ϕ
(z|x
k
)
dz
=
1
2
n
h
j=1
1 + log σ
2
j
µ
2
j
σ
2
j
通过上面的分析,我们得到了式 (1.2)L 中的第一项 KL(q
ϕ
||p
θ
)我们要求 θ, ϕ 使 L 最大,
第一项 KL(q
ϕ
||p
θ
) 关于 θ, ϕ 的求导是没问题的,但是式 (1.2) 第二项 E
q
ϕ
(z|x
k
)
log p
θ
(x
k
|z)
求导就有问题了,一般的 MCMC 求解梯度为
ϕ
E
q
ϕ
(z)
[f(z)] = E
q
ϕ
(z)
f(z)
q
θ
(z)
log q
ϕ
(z)
1
L
L
l=1
f(z
l
)
q
θ
(z
l
)
log q
ϕ
(z
l
)
其中:L z 的采数,z
l
为样本,z
l
q
ϕ
(z|x
k
)。对样本 x
k
z L 采样
z
l
q
ϕ
(z|x
k
) = N(µ, σ
2
),这导致梯度估计量的方差非常大,并且,我们无法关于参 ϕ
(如果设 q
ϕ
(z|x
k
) = N(µ, σ
2
),则 ϕ
= (µ, σ
2
),则不能对 µ, σ 求导。)
p
θ
(z|x
k
) N(0, I)q
ϕ
(z|x
k
) = N(µ, σ
2
) 为示例,VAE 的网络结构如图 (1.14) 所示
1.14: VAE 网络结构示意图 1
对式 (1.2)L 中的第二项。由于 z 是采样而来的,z q(z|x) = N(µ, σ
2
)因而 L 不能关于
ϕ
= (µ, σ) 求导。如果 z 是其它操作 (非采样操作,例如 z = (A + B)C ),那么求导是没问题
的。我们希望把采样 () 这个随机操作变为某种确定性操作 (例如 z = g
ϕ
(·)),可以进行如下确
定性变换
z = g
ϕ
(ϵ, x)
其中:ϵ 是一个外来的随机变量,其概率分布为 p(ϵ)g
ϕ
(·) 是一个关于参数 ϕ 的向量值函数。
假设 z
1
, z
2
, . . . , z
n
h
之间相互独立,则
dz = dz
1
dz
2
. . . dz
n
h
=
n
h
i
=1
dz
i
http://www.ma-xy.com 30 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
于是有
q
ϕ
(z|x)dz
= q
ϕ
(z|x)
n
h
i=1
dz
i
= p(ϵ)dϵ
于是
q
ϕ
(z|x)f (z)dz =
p(ϵ)f(z)dϵ
z = g
ϕ
(ϵ, x) 带入上式,有
q
ϕ
(z|x)f (z)dz =
p(ϵ)f(g
ϕ
(ϵ, x))dϵ
由此,我们就可对 L(1.2) 中的第二项
q
ϕ
(z|x)f (z)dz 构建一个可微的估计量
q
ϕ
(z|x)f (z)dz
1
L
L
l=1
f(g
ϕ
(x, ϵ
l
)) ϵ
l
p(ϵ)
现在可以对上式求导了。例:我们用高斯分布作为示例,设 z p(z|x) = N(µ, σ
2
),一个有效的
转化是 z = µ + σϵ,其中:ϵ N(0, 1),因此
E
N(z;µ,σ
2
)
[f(z)] = E
N(ϵ;0,1)
[f(µ + σϵ)]
1
L
L
l=1
f(µ + σϵ
l
)
其中:ϵ
l
N (0, 1)。对于上面的这种“确定性变换”,我们自然考虑:哪些 q
ϕ
(z|x) 可以进行可
微转换 g
ϕ
(·) 呢?并且有 ϵ p(ϵ) 呢?关于这个问题,可以参考22P5
上面的是在所有样本 x 上进行的,对于单一样本 x
k
,只要将 x 变为 x
k
即可。现在可以用
MCMC 来估计函数 f(z) 关于 q
ϕ
(z|x
k
) 的期望了
E
q
ϕ
(z|x
k
)
[f(z)] = E
p(ϵ)
[f(g
ϕ
(ϵ, x
k
))]
1
L
L
l
=1
f
(
g
ϕ
(
ϵ
l
, x
k
))
其中:ϵ
l
p(ϵ)。我们将这种确定性转换技术应用到下界 L(θ, ϕ; x
k
)¬考虑下界 L 的第一个写
L(θ, ϕ; x
k
) = E
q
ϕ
(z|x
k
)
log p
θ
(x
k
, z) log q
ϕ
(z|x
k
)
1
L
L
l=1
log p
θ
(x
k
, z
l
) log q
ϕ
(z
k,l
|x
k
)
其中:z
k,l
= g
ϕ
(ϵ
k,l
, x
k
)ϵ
k
p(ϵ)。记此估计量为
˜
L
A
(θ, ϕ; x
k
)
考虑下界 L 的第二个写法
L(θ, ϕ; x
k
) = KL(q
ϕ
(z|x
k
)||p
θ
(z|x
k
)) + E
q
ϕ
(z|x
k
)
log p
θ
(x
k
|z)
http://www.ma-xy.com 31 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
上式得 KL 项在前面已经分析过了,可以对 µ, σ 求导,但后面的积分项 (期望值) 不行,我
将确定性变换 z = g
ϕ
(ϵ, x) 技术用上来,就变为
L(θ, ϕ; x
k
) = KL(q
ϕ
(z|x
k
)||p
θ
(z|x
k
)) +
1
L
L
l=1
log p
θ
(x
k
|z
k,l
)
其中:
z
k,l
= g
ϕ
(ϵ
k,l
, x
k
)ϵ
l
p(ϵ)。我们记此估计量为
˜
L
B
(θ, ϕ; x
k
)
现在,
˜
L
B
(θ, ϕ; x
k
)
˜
L
A
(θ, ϕ; x
k
) 可以对 ϕ 求导了。上面是单一样本 x
k
,对于批量样本而
言,设 x
M
是从样本集中随机挑选的 M 个样本,则其估计量为
L(θ, ϕ; x
M
)
˜
L
M
(θ, ϕ; x
M
) =
m
M
M
k=1
˜
L(θ, ϕ; x
k
)
批量样本的 SGVB 算法如下 (3)
算法 3 SGVB for VAE
1: 初始化:MS = {x
k
}
m
k=1
MC 链长 L = 1初始参数 θ
0
, ϕ
0
迭代次数 tt
max
容许误差
ε,学习率 η
2: while 未达到终止条件 t > t
max
| ||θ
t+1
, ϕ
t+1
θ
t
, ϕ
t
|| < ε do
3: 随机挑选 M 个样本 x
M
4: ϵ p(ϵ)
5: g
θ,ϕ
˜
L
M
(θ, ϕ; x
M
, ϵ)
6: θ, ϕ θ, ϕ + ηg
7: end while
仍然以 p
θ
(z|x
k
) = N (0, I)q
ϕ
(z|x
k
) = N (µ, σ
2
) 为示例,经过确定性变化后,VAE 的网络
结构如图 (1.15) 所示
1.15: VAE 网络结构示意图 2
http://www.ma-xy.com 32 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
VAE 的梳理
下面来捋一下 VAE假设 p
θ
(z|x
k
) 为多元正态分布 N (0, I)如果样本为实值,则设 p
θ
(x|z)
为多维高斯分布,如果样本 01 二值的,则设 p
θ
(x|z) 为多维二项分布。假设 q
ϕ
(z|x
k
) 是多
高斯分布 N(µ
k
, σ
k2
),这里 µ
k
, σ
k
为向量,µ
k
= (µ
k
1
, µ
k
2
, . . . , µ
k
n
h
)
对于某一个样本 x
k
,将 x
k
输入到 VAE 网络中,通过编码器 f ,可以得到其均值向量和方
差向量 µ
k
, σ
k
,于是,我们得到了 q
ϕ
(z|x
k
)
q
ϕ
(z|x
k
) = N(z; x
k
, σ
k2
I)
然后要在 q
ϕ
(z|x
k
) 中选取 L 个样本,z
k,l
q
ϕ
(z|x
k
),为了使其可导,我们用确定性转化技术
z
k,l
= g
ϕ
(x
k
, ϵ
l
) = µ
k
+ σ
k
ϵ
l
其中:ϵ
l
N(0, I) 是元素操作。于是,我们可以得到下界
L(θ, ϕ; x
k
) =
1
2
n
h
j=1
1 + log(σ
k
j
)
2
(µ
k
j
)
2
(σ
k
j
)
2
+
1
L
L
l=1
log p
θ
(x
k
|z
k,l
)
关于 p
θ
(x
k
|z) 的计算,可以用 MLP 来充当 decoder¬如果 x 01 二值的, p
θ
(x|z) 为多维
伯努利分布,其 MLP 的结构如图 (1.16) 所示
1.16: MLP 充当解码器示意图 1
(1.16) 中的 ˆx
ˆx = f
σ
(W
2
tanh(W
1
z + b
1
) + b
2
)
θ
= (W
1
, W
2
, b
1
, b
2
)tanh f
σ
为传递函数,于是,得到样本的概率为
log p
θ
(x|z) =
m
i=1
x
i
log ˆx
i
+ (1 ˆx
i
) log(1 ˆx
i
)
如果 x 不是 01 变量,而是实值变量, p
θ
(z|x) 为多维高斯分布。为多维伯努利分布, MLP
的结构如图 (1.17) 所示
1.17: MLP
充当解码器示意图
2
http://www.ma-xy.com 33 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
(1.17) 中的变量为
h = tanh(W
3
z + b
3
)
µ = W
4
h + b
4
log σ
2
W
5
h + b
5
log p
θ
(x|z) = log N (x; µ, σ
2
I)
¬中的 log
θ
p(x|z) 变为单一样本的情况,有
log p
θ
(x
k
|z
k,l
)
1.3.8 重要性加权自动编码器 IWAE
深层 VAE
Importance Weighted Autoencoders Burda 人于 2015 年提出的改进版的 VAE在介
IWVAE 之前,先来把 VAE 的层数加深。在前面的 VAE 中,只有一个随机层/隐含层 z,现
在,将随机层 z 加深到 I 层,即共有 I 个随机层,并且假设 p
θ
(z
i
|z
i+1
) 为多维正态分布,于是
p
θ
(z) = p
θ
(z
I
)
I1
i=1
p
θ
(z
i
|z
i+1
) = p
θ
(z
I
)p
θ
(z
I1
|z
I
) . . . p
θ
(z
1
|z
2
)
p
θ
(z
I
) = N(z
I
|0, I)
p
θ
(z
i
|z
i+1
) = N(z
i
|µ
i
, σ
2
i
)
p
θ
(x|z
1
) = N(x|µ(z
1
), σ
2
(z
1
)) or p
θ
(x|z
1
) = B(z|µ(z
1
))
其中:µ
i
, σ
i
是向量。上面是解码过程 (生成)下面,给出在编码过程中模型的条件分布情况,
然假设 q
ϕ
(z
i
|z
i1
) 是高斯分布
q(z|x) = q
ϕ
(z
1
|x)
I
i=1
q
ϕ
(z
i
|z
i1
)
q
ϕ
(z
1
|x) = N(z
1
|µ(x), σ
2
(x))
q
ϕ
(z
i
|z
i1
) = N(z
i
|µ(z
i1
), σ
2
(z
i1
)) i = 2, 3, . . . , I
我们继续讨论目标函数 (对数似然) 的变分下界,由 Jensen 不等式,有
log p(x) = log E
q
ϕ
(z|x)
p(x, z)
q
ϕ
(z|x)
E
q
ϕ
(z|x)
log
p(x, z)
q
ϕ
(z|x)
= L(θ , ϕ ; x)
或者是
log p(x) = KL(q
ϕ
(z|x)||p(z|x)) + L(θ, ϕ; x)
L(θ, ϕ; x) 关于 θ, ϕ 导,采样,可求,定性
(reparameterization trick):原本的采样过程如图 (1.18) 所示
http://www.ma-xy.com 34 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
1.18: IWVAE 随机采样
z
l
i
q
ϕ
(z
i
|z
i1
) = N(z
i
|µ(z
i1
), σ
2
(z
i1
))
其中:l = 1, 2, . . . , LL 表示第 i z
i
的采样数。经过确定性转化,采样过程如图 (1.19) 所示
1.19: IWVAE 确定性采样
z
i
= g
ϕ
(ϵ
i
, z
i1
) = µ
i
(z
i1
) + σ(z
i1
)ϵ
i
z
l
i
= g
ϕ
(ϵ
l
i
, z
i1
) = µ
i
(z
i1
) + σ(z
i1
) ϵ
i
中:ϵ
l
i
p(ϵ
i
), i = 1, 2, . . . , Iϵ = (ϵ
1
, ϵ
2
, . . . , ϵ
I
) z
i
ϵ
i
p(ϵ
i
),并且在 ϵ
i
上进行 L 次采样,z
l
i
= g
ϕ
(ϵ
l
i
, z
i1
)
使用确定性转化技术后,L(θ, ϕ; x) 关于 ϕ 可导,有
ϕ
=
ϕ
E
q
ϕ
(z|x)
log
p(x, z)
q
ϕ
(z|x)
=
ϕ
E
zq
ϕ
(z|x)
log
p(x, z)
q
ϕ
(z|x)
=
ϕ
E
ϵN(0,I)
log
p(x, g
ϕ
(ϵ, x))
q
ϕ
(g
ϕ
(ϵ, x)|x)
= E
ϵ
1
2
,...,ϵ
I
N(0,I)
ϕ
log
p
q
ϕ
加权 VAE
IWVAE VAE 有相同的网络结构,不同的是,IWVAE 构建了一个加权的 log p(x) 下界。
VAE 的变分下界为
L(θ, ϕ; x) = E
zq
ϕ
(z|x)
log
p(x, z)
q
ϕ
(z|x)
http://www.ma-xy.com 35 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
IWVAE 的变分下界为
L
L
(θ, ϕ; x) = E
z
1
,...,z
L
q
ϕ
(z|x)
log
1
L
L
l=1
p(x, z
l
)
q(z
l
|x)
其中:z
1
, z
2
, . . . , z
L
是从识别模型中采取的相互独立的样本,z
1
, z
2
, . . . , z
L
q
ϕ
(z|x)。我们记
w
l
=
p(x, z
l
)
q
ϕ
(z
l
|x)
于是下界 L
L
(θ, ϕ; x) 可以写为
L
L
= E
log
1
L
L
l=1
w
l
log E
1
L
L
i=1
w
l
= log p(x)
对上面的加权目标 L
L
,我们有下面结论4(Approdix A)
log p(x) L
L+1
L
L
L > 0
此外,如果
p(z|x)
q
ϕ
(z|x)
是有界的,那么, L 时, L
L
log p(x)这个下界 L
L
可以用 MC
方法来近似。我们从识别模型中抽取 L 个样本,z
l
, l = 1, 2, . . . , L,然后再平均它们的重要性权
重。有人可能会担心这个估计量有较大的方差,关于方差的计算,可以参考4(Approdix B)
下面,我们来计算下界 L
L
关于 θ, ϕ 的导数。像 VAE 中分析的那样,我们仍然采用确定性
转化技术,有
L
L
(θ, ϕ; x)
θ
=
θ
E
z
1
,z
2
,...,z
L
q
ϕ
(z|x)
log
1
L
L
l=1
w
l
=
θ
E
ϵ
1
2
,...,ϵ
L
N(0,I)
log
1
L
L
l=1
w
x, g
ϕ
(ϵ
l
, x; θ); θ
= E
ϵ
1
2
,...,ϵ
L
N(0,I)
θ
log
1
L
L
l=1
w
x, g
ϕ
(ϵ
l
, x; θ); θ
= E
ϵ
1
2
,...,ϵ
L
N(0,I)
L
l=1
˜w
L
θ
log w
x, g
ϕ
(ϵ
l
, x; θ); θ
其中:ϵ
1
, ϵ
2
, . . . , ϵ
L
是去了 L 次样本;ϵ
l
= (ϵ
l
1
, ϵ
l
2
, . . . , ϵ
l
I
) 表示共有 I 个特征层 zw
L
= w(x, g(x, ϵ
l
; θ); θ)
是权重函数; ˜w
l
=
w
l
l
w
l
是归一化权重。特别的,当 L = 1 时, ˜w
1
= 1
θ
log w
x, g
ϕ
(ϵ
l
, x; θ); θ
=
θ
log p(x, g
ϕ
(x, ϵ
l
; θ); θ)
θ
log q
ϕ
(g
ϕ
(x, ϵ
l
; θ)|x; θ)
上式中等号右边第一项鼓励生成模型 (decoder) 分配高的概率给每一个 z
i
(在给定 z
i+1
)它同
时也鼓励识别模型 (encoder) 调整随机层 q
ϕ
(z|x) 来做更好的预测。
关于 VAE 的改进,还可以参考:Laddder VariationalAutoEncoder5;2016.Rolfe28 Discrete
Variational AutoEncoder; 以及 2016.Suwon31
http://www.ma-xy.com 36 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
1.3.9 随机生成网络 GSN
Generative Stochastic Networks(GSN) Bengio 2013 年提出的一种生成网络,是去噪自
动编码器 DAE 的推广。先回顾一下 DAE我们有样本数据 X = {x
k
}
m
k=1
X R
m×n
/{0, 1}
m×n
AE 网络有输入层、隐含层/特征层和输出层 3 层,要求 p(x),即样本的分布。这个问题本质
是一个密度函数的估计 (拟合) 问题,如果对 p(x) 的分布形式进行假设,比如我们假设 p(x)
多元高斯分布,那么,只要求多元高斯中的参数 θ 即可。DAE 原样本中加入噪声 ε,使原
样本数据 x 变为 ˜x = x + ε,然后用 ˜x 进行训练。我们设含噪声的随机变量 ˜x 的分布为 C(˜x|x)
˜x C(˜x|x),训练过程为
h = f
θ
1
(˜x)
ˆx = g
θ
2
(h)
其中:θ
= (θ
1
, θ
2
)h 为特征层/隐含层。一般的目标可以是离差平方和或者极大似然函数。
原来的对 p(x) 的估计是一个无监督问题,而我们可以将 DAE 视为有监督问题,就像给定 ˜x
x 样。我们 ˜x 是坏样本 (含噪声样本/损坏样本),对于同一个样本 x
k
,可以对其添加
同的噪声,形成不同的坏样本。如果 DAE 网络训练结束后 (θ 求解结束),对于一个已经损坏的
样本 ˜x
,我们就可以给出它的估计 ˆx
。具体的对于图像识别而言,给一张含糊不清的数字图片
˜x
,如图 (1.20)
1.20: DAE 做图像判别的示意图
通过 DAE 我们就能给出 ˆx
= 3 的概率。一定要注意 p
θ
(x|˜x) 是一个识别问题,像回归一样
y|x N 。上面遗留的问题是:在网络参数 θ 训练完成后,如何识别坏样本,并且这个坏样本
估计量 ˆx
的统计性质如何?对于 DAE还有一个问题,我们说 DAE 网络中包含了样本 x 的信
息,整个样本 x 的密度函数已经估计出来了,即 p(ˆx|
˜
x),那如何从这个分布中采样呢?
在回答上面两个问题之前,先来介绍一个新的网络 GSN我们说 GSN DAE 的推广,DAE
是在 x 添加了噪声,自然想能否 h 中也添加噪声,形成
˜
hGSN 的网络结构图如图 (1.21)
所示
http://www.ma-xy.com 37 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
1.21: GSN 的网络结构示意图
x 部分增加噪声 ε,在 h 部分增加噪声 ϵ。问题是:GSN 的求导可以进行吗?可以看到,
GSN 就和 VAE 的确定性转换技术一样,所以 GAN 是可以直接求导的。
下面,来处理上面遗留的两个问题:¬损坏样本的估计;如何采样。先来处理第二个问题,
前面介绍了各种各样的自动编码器,自动编码器内存放着数据 x 的分布,现在要从这个分布中采
样。可以尝试采用前面介绍的 MCMC 采样。Bengio(2013) 给出了一个从参数分布 p
θ
(x) 中采样
的方法:通过运行马尔科夫链交替增加噪声到近似的真实分布 p(x|˜x) 当中。文中表明,如果一个
学习后的参数分布 p
θ
(x|˜x) 接近真实分布 p(x|˜x),在一些优良的条件下,运行一段马氏链后,平
稳分布 π(x) 会收敛到真实分布 p(x)。假设我们已经训练好了 AE 网络,从当前样 x (x
可以是一个样本,也可以是一批样本),则由 AE 形成的马氏链为
1. 从当前状态 x 开始,向 x 中注入噪声 ε,有 ˜x C(˜x|x)
2. ˜x 编码。h = f(˜x)
3. 解码 hˆx = g(h),且 p(x|ˆx = g(h)) = p(x|˜x)
4. p(x|ˆx) = p(x|˜x) 中采样一个状态 x
Bengio(2014) 表明,如果自动编码器 p(ˆx|˜x) 是真实分布 p(x|˜x) 的一致估计量,则上述马尔
科夫链平稳分布 π(x) x 分布 p(x) 的一致估计量 (虽然是隐含的)
形式上,用 p
θ
n
(ˆx|˜x) 表示经 n 次训练的 DAE他表示给 ˜x C(˜x|x) 后,x 的概率分
布。这个估计 p
θ
n
(ˆx|˜x) 定义了一个马尔科夫链 T
n
:不断交替采样 ˜x C(˜x|x)x p
θ
(ˆx|˜x)
我们设 π
n
T
n
的平稳分布,则有如下定理
定理 如果 p
θ
n
(ˆx|˜x) 实分 p(x|˜x) 的一量,并 T
n
是一链,则
n 时,平稳分布 π
n
(x) 收敛到数据分布 p(x)
并且,为了使上述定理可行,要求 T
n
具有遍历性。DAE 的采样示意图如图 (1.22) 所示
http://www.ma-xy.com 38 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.3 自动编码器 AE
1.22: DAE 采样示意图
(1.22) 中:马尔科夫链的每个步骤与训练好的 DAE 相关联,每个步骤包括:(a) 通过损
坏过程 C 向状态 x 中注入噪声 ε 产生 ˜x(b) 用函数 f 进行编码,产生 h = f(˜x)(c) 用函数 g
进行解码,产生用于重构分布的参 w
= g(h),在一般的平方重构误差下,w = ˆx = g(h)(d)
给定 w,从重构分布 p(x|w) 采样新状态 x
上面给出了 DAE 的马尔科夫链 x
t
˜x C(˜x|x
t
)x
t+1
p
θ
(x|˜x
t
)。下面给出 GSN 的马尔
科夫链。我们将 GSN 中的 x h 都做为马尔科夫链的状态,有
h
t+1
p
θ
1
(h|h
t
, x
t
)
x
t+1
p
θ
2
(x|h
t+1
)
定义
h
t+1
= f
θ
1
(x
t
, ϵ
t
, h
t
)
其中:ϵ
t
是引入到隐含层的噪声。可以看出 DAE GSN 的特殊情况。
定理 设训练样本 x p(x),噪声 ϵ p(ϵ),并且在隐含层 h 中添加噪声
h
t
= f
θ
1
(x
t1
, ϵ
t1
, h
t1
)
考虑模型 p
θ
2
(x|f
θ
1
(x, ϵ
t1
, h
t1
)):对一个给定的 θ
1
p
θ
2
(x|h) 是一个 p(x|h) 的估计量。设马尔
科夫链的平稳分布 π
n
(x, h) 的边缘分布为 π
n
(x),当训练次数 n 时,π
n
(x) p(x)
GSN 的马尔科夫链如图 (1.23) 所示
1.23: GSN 马尔科夫链示意图
定理 (h
t
, x
t
)
t=0
是上图定义的马尔科夫链,假设这个马尔科夫链有平稳分布 π(x, h),并
且对于每一个值 (x, h),如果
1. 所有的 p(x
t
= x|h
t
= h) = g(x|h) 有相同的密度,t 1
http://www.ma-xy.com 39 http://www.ma-xy.com
http://www.ma-xy.com
1.3 自动编码器 AE 第一章 深度学习
2. 所有的 p(h
t+1
= h|h
t
= h
, x
t
= x) = f(h|h
, x) 有相同的密度,t 0
3. p(h
0
= h|x
0
= x) = p(h
1
= h|x
0
= x)
4. p(x
1
= x|h
1
= h) = p(x
0
= x|h
1
= h)
那么,对于每个值 (x, h),我们会有
1. p(x
0
= x|h
0
= h) = g(x|h)
2. p(x
0
= x|h
t
= t) = p(x
0
= x, h
0
= ht 0
3. 平稳分布 π(x, h) 的边缘分布 π(x) = p(x
0
= x)
上述结论表明:马尔科夫链的样本与 x
0
来自相同的分布。
1.3.10 beta - VAE
TODO: 待补充。
1.3.11 MATLAB 应用实例
MATLAB 自带工具
MATLAB 自带的自动编码器命令如表 (1.1) 所示
1.1: Autoencoders 命令
命令 说明
Autoencoder Autoencoder class
trainAutoencoder 训练自动编码器
trainSoftmaxLayer Train a softmax layer for classication
decode Decode encoded data
encode Encode input data
generateFunction Generate a MATLAB function to run the autoencoder
generateSimulink Generate a Simulink model for the autoencoder
network Convert(转变) Autoencoder object into network object
plotWeights Plot a visualization of the weights for the encoder of an autoencoder
predict Reconstruct(重建) the inputs using trained autoencoder
stack Stack encoders from several autoencoders together
view View autoencoder
http://www.ma-xy.com 40 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
1.4 卷积神经网络 CNN
1.4.1 基础卷积神经网络 CNN
回忆之前提到过的网络模型,无论是 MLPHopeldSMOBMDBMAEVAE GSN
等,这些网络模型的输入层都是向量输入, x
k
= (x
k
1
, x
k
2
, . . . , x
k
n
)即便是批量或者全批量,
是以向量为样本的。整个样本的数据结构如图 (1.24) 所示
1.24: 向量样本的数据示意图
也就是说,网络输入的样本 x
k
要是一个向量,比如,对于一个图像分类问题,要先将具体的
图像样本 (矩阵) 变为向量,然后将向量输入到网络进行分类。自然会想,能不能把图 ()
直接输入到网络中,因为对于图像处理而言,我们的样本就是一个个的图像矩阵。为此,要开发
一个矩阵输入的神网络 (以及一矩阵矩阵操作)并且意到果图是批或者
全批量样本,则是一个 3 维矩阵 (张量)
幸运的是,我们已经有了这样的网络。下面要介绍的 CNN 网络就是一个以矩阵为样本的前
馈网络 (如果将 CNN 视为 MLP 的矩阵推广,那么 Hopeld 等网络能否推广到矩阵样本?)
前面的神经网络一样,先来介绍 CNN 的网络结构,再介绍它的学习方法。
1962 年,Hubel Wiesel 通过对猫视觉皮层神经元的的研究,提出了感知野 (receptive eld)
的概念;1980 年,日本学者 K.Fukushima 提出了神经认知机,这也是第一代卷积神经网络;1989
年,加拿大教授 Yann LeCun 提出了卷积神经网 (Convolution Neural Networks,CNN)2012
年,深度学习大牛,DBNDBM 的开发者 Hinton 教授带领 2 个学生,采用更深的 CNN Image
Net 问题上取得了当时最好的结果,虽然这一结果之后一直被刷新,但 CNN 带来的视觉革命是
不容忽视的。
CNN 网络结构
假设有一个带标签的图像集/样本集 S = {x
k
, y
k
}
m
k=1
x
k
是一个图像矩阵,y
k
是图像 x
k
分类标签值。为了简便,我们将 x
k
视为 n ×n 方阵,x
k
R
n×n
/{0, 1}
n×n
,假设分类任务共有
c 类,则 y
k
{1, 2, . . . , c}现在,我们来看对于一个图片 x
k
而言,CNN 的处理方式 (前向
),其处理流程如图 (1.25) 所示
http://www.ma-xy.com 41 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
1.25: CNN 网络结构示意图
这里给出的 CNN 网络结构 (1.25) 共有 7 个网络层。当然,我们可以继续加深网络,但是太
深的 CNN 在反向传播过程中会出现误差消失/梯度消失的现象,具体而言,当我们从 F
1
层开始
C
1
层传播,到了 C
1
层时, θ 所分担的误差会非常小。在上面的 7 CNN 中,C
1
, S
2
, C
3
, S
4
都是为了从 x
k
中提取/获取特征,F
5
, F
6
, F
7
是一个一般的 BP 神经网络 (其它分类器亦可)。下
面,我们来介绍每一步 (每一层) 的操作。
1 C
1
层而言,输入为 32 ×32 大小的样本图片 x
= x
k
输出为 6 个矩阵。并且, 6 个矩
阵的大小为 28 × 28,与原矩阵 32 × 32 不一样,那么 1 是如何操作的才能产生这种结果呢?
1 过程是卷积过程 (Colution)主要是利用卷积核 (权重矩阵 w待求) 来进行操作的。
了方便,我们设被卷积的图像 a 的大小为 5 × 5,卷积 w 小为 3 × 3输出矩阵 c,则 a
c 的卷积过程如图 (1.26) 所示
1.26: 卷积过程示意图
w a 的左上角开始,找到同样大小的 3 × 3 局部矩阵,2 个矩阵 (w a 的局部矩阵)
对应元素相乘相加 (卷积操作)得到 36之后,再把 w 一个点一个点的向右移动,卷积形成 54
72再将 w 向下移动,以形成其它的卷积值。可以计算,如果 a m ×n 大小,w mx ×my
大小,则卷积后的 c my × ny 大小,其中:my = m mx + 1, ny = n nx + 1。你可能会有
以下问题:
1. 是否要求输入图像 x 01 值?不限制;
2. 是否要求输入图像 x 是方阵 n × n?不限制,但最好是;
3. 为什么输入一张图片,结果卷积出来了 6 张图片?因为有 6 个卷积核 w
1
, w
2
, . . . , w
6
并且
注意:其实多个矩阵 (map) 可以公用一个卷积核,卷积之后结果相加,形成一个输出。
http://www.ma-xy.com 42 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
2C
1
S
2
。对 S
2
而言,输入为 6 张图,输出为 6 张图,只不过大小从输入的 28 × 28 变为
14 × 14。那么,这 6 张图在 2 都经历了什么?S
2
层是一个池化过程/采样过程,从其
“采样”可以看出,这是一个降维操作,以降低参数个数。该过程有 2 种常见的采样方法:
种是均值池化 mean pooling;一种是最大池化 max pooling。相对常用的是 max pooling。我
用一个 28 × 28 的矩阵来演示池化过程,如图 (1.27) 所示
1.27: 池化过程示意图
(28 × 28) 4 () 值,出。
28 ×28 变为 14 ×14当然,对于 mean pooling 而言,我们取相邻的 4 个数值的平均作为输出。
我们可以设置池化池
/
采样矩阵
(
采样矩阵的大小,例如:
4
×
4
)
的大小为
m
p
×
n
p
但是,有必
要让 m
y
/m
p
, n
y
/n
p
为整数。
考虑:1. 为什么要采样;2. 采样的误差传播如何进行;3. 能否间隔采样。如何设计其它的采
样方法,并且一定注意采样的误差传播应该易于进行。
3C
3
为卷积层, 6 14 × 14 的矩阵,输出 16 12 × 12 矩阵 (12 = 14 3 + 1)
S
2
C
3
过程为卷积过程,但是,如果我们像 1 那样,对输入 6 矩阵的每一个矩阵都进
6 卷积操作,那么结果应该有 6 个或者 36 输出矩阵。这 16 个输出矩阵式如何来的?我
们应该清楚一点的是,输出矩阵的多少应该由卷积核的个数控制,比如:要形成 16 个输出矩阵,
就设置 16 个卷积核,对于每个卷积核而言,无论有多少个输入图像与它进行卷积,都将其得到
的结果相加,以形成 1 个输出。所以为了有 16 个输出就设置 16 个卷积核。现在的问题是:每
个卷积核都应该和那几个输入图片 ( 6 ) 行卷积呢?当然,可以进行全连接,即每个卷
核都要卷积 6 个输入。但是这样做会使计算量变得很大,为此,我们采用 LeNet5 的非全连接策
略,其连接方式如表 (1.2) 所示 (1.2) 中画 @ 的表示对应的神经元 (矩阵) 连接,否则不连接。
例如:C
3
的第一个矩阵为
C
1
3
= f(S
1
2
w
1
+ S
2
2
w
1
+ S
3
2
w
1
+ b)
当然,这里还可以采取其他的非全连接方式。
4S
4
为采样层 (down sample)。如前,输入 16 12 × 12 矩阵,输出 16 6 × 6 矩阵。
5F
5
为展开的特征层。该层的操作只是将 S
4
层得到的 16 6 ×6 矩阵展开合并为 1 个向量,
以便输入到后面的神经网络等基本分类器当中。其实,F
5
不仅可以在采样层 S
4
后对其展开,
可以在卷积层后对卷积层展开。
6/7:是一个简单的分类器,比如 BP Softmax 等。
http://www.ma-xy.com 43 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
1.2: LeNet5 的连接表
S2 C
3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 @ @ @ @ @ @ @ @ @ @
2 @ @ @ @ @ @ @ @ @ @
3 @ @ @ @ @ @ @ @ @ @
4 @ @ @ @ @ @ @ @ @ @
5 @ @ @ @ @ @ @ @ @ @
6 @ @ @ @ @ @ @ @ @ @
通过上面的分析,已经基本了解了 CNN 的网络结构与基本的操作 (卷积和池化)注:能否
设置一个动态网络,随着训练的不断进行,网络结构也在发生变化?上面只是简单的描述了一下
CNN 的前向传播过程,下面,来建立数学模型,并求解网络参数 (反向传播)
CNN 训练方式
先将 CNN 网络描述成神经元的形式,如图 (1.28) 所示
1.28: CNN 网络的神经元形式
(1.28) 中的每一个神经元表示一个矩阵 (map)更一般的,设样本集为 S = {x
k
, y
k
}
N
k=1
共有 c 类,y
k
{1, 2, . . . , c} CNN 络共 L ( x 算一),各层神经元个数
n
l
(l = 1, 2, . . . , L),记第 l 层神经元为 x
l
x
l
= (x
l
1
, x
l
2
, . . . , x
l
n
l
)x
l
i
是矩阵 (除了后面的 BP
类器中的神经元外)。第 i 个神经元与第 j 个神经元连接的权重 w
ij
(当然,许多神经元共用一
个卷积核
w
)
,一般的,有几个输出图像就有几个卷积核。
b
l
j
l 层神经元 j 的偏置。
CNN 前向传播 (1) 对卷积层而言,其输入输出可以表示为
x
l
j
= f
n
l1
i=1
x
l1
i
w
l
ij
+ b
l
j
其中:f 为普通可导函数, 表示卷积等操作,并且是 l 1 层所有的神经元与 l 层的 j 神经元
连接,且连接的各卷积核 w
ij
是不同的,这是一般的表述方式。我们记
u
l
j
=
n
l1
i=1
x
l1
i
w
l
ij
+ b
l
j
http://www.ma-xy.com 44 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
为第 l 层第 j 神经元的输入,则 x
l
j
为其输出。
(2) 对池化层而言 (采样层),其输入输出的表达式为
x
l
j
= f
β
l
j
down
x
l1
j
+ b
l
j
其中:down(x) 是对矩阵 x 进行下采样操作 (均值池化、最大值池化)β
l
j
, b
l
j
为偏置。令
u
l
j
= β
l
j
down
x
l1
j
+ b
l
j
为第 l 层第 j 个神经元的输入,x
l
j
为其输出。
(3) 对小分类器而言
x
l
= f(w
l
x
l1
+ b
l
)
或者写为
x
l
j
= f
w
l
·j
x
l1
+ b
l
j
= f
n
l1
i=1
x
l1
+ b
l
j
我们仍然令
u
l
= w
l
x
l1
+ b
l
为第 l 层的输入,x
l
为输出。
CNN 反向传播 先来表示网络输出值 t 和样本真实值的误差,以便构建“离差平方和目标”
N 个样本 S = {x
k
, y
k
}
N
k=1
c 个类别,其误差平方可以表示为
E =
1
2
N
n=1
c
k=1
(t
n
k
y
n
k
)
2
其中:t
n
表示第 n 个样本的网络输出值/估计值。记 e
n
R
c
/{0, 1}
c
为第 n 个样本的误差,E
n
为第 n 个样本的误差平方,有
E =
N
n=1
E
n
E
n
=
1
2
c
k=1
(t
n
k
y
n
k
)
2
=
1
2
||t
n
y
n
||
2
θ
= (w , b)E 关于 θ 求导,有
E
θ
=
N
n=1
E
n
θ
下面,来求解
E
n
θ
http://www.ma-xy.com 45 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
(1) 对小分类器而言,和前面介绍的 BP 是一样的,这里我们再写一次。
E
2
=
1
2
||f(u
L
) t
n
||
2
=
1
2
||f(w
L
x
l1
+ b
L
) t
n
||
2
=
1
2
||y
n
t
n
||
2
对所有的 l(小分类器的层)E
n
关于 b 求导有
E
n
b
L
=
E
n
u
L
u
L
b
L
u
L
b
L
= 1,所以我们要求
E
n
u
l
。定义 δ
L
=
E
n
u
l
,有
δ
L
=
E
n
u
L
=
u
L
1
2
||f(u
L
) t
n
||
2
= (f(u
L
) t
n
)f
(u
L
) = e
n
f
(u
L
)
δ
l
=
E
n
u
l
(w
l+1
)
T
δ
l+1
f
(u
l
) l = L 1, L 2, . . . ,
同理,E
n
关于 w 求导,有
E
n
w
l
=
E
n
u
l
u
l
w
l
= x
l1
(δ
l
)
T
(2) 对卷积层而言。卷积层的反向传播示意图如图 (1.29) 所示
1.29: 卷积层的反向传播示意图
δ
l
j
= β
l+1
j
f
(u
l
j
) · up(δ
l+1
j
)
其中:up(·) 是上采样操作, down(·) 相反。如果下采样的池化池/采样矩阵的大小为 n ×n
up(x) 写为
up(x) = x I
n×n
这里的 表示 Kronecker 乘积。比如,在 S 层中第一个神经元的误差矩阵为
e =
1 2
3 4
http://www.ma-xy.com 46 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
S 的第一个神经元是 C 的第一个神经元经过最大下采样缩小 2 (n = 2) 得到的,那么
up(e) =
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
现在,得到了 l 层神经元 j 的误差 δ
l
j
,接下来,要把误差下分到权重 w
l
j
b
l
j
E
n
b
j
=
u,v
δ
l
j
uv
E
n
w
l
ij
=
u,v
δ
l
j
uv
p
l1
i
uv
其中:
u,v
δ
l
j
uv
表示 δ
l
j
逐元素相加,(p
l1
i
)
uv
x
l1
i
在卷积时候,与 w
l
ij
逐元素相乘的
pitch,输出卷积层某个图像的 uv 位置是由上一层 uv 位置的 pitch 与卷积 w
l
ij
逐元素相乘的
结果。在 MATLAB 中可以通过下面的命令实现
E
n
w
l
ij
= rot180(conv2(x
l1
i
, rot180(δ
l
j
),
valid
))
示例:卷积层的误差传递如图 (1.30) 所示
1.30: 卷积层误差传递示意图
假设 l + 1 层的 pool 层大小为 2 × 2并且此时 pool 后的 δ
l+1
j
(
1 3
2 4
) ¬如果将 l (卷积
)mean pool l + 1 层,则 l δ
l
j
应为 4 × 4,为
up(δ
l+1
j
) =
1 1 3 3
1 1 3 3
2 2 4 4
2 2 4 4
又因为是均值采样且反向传播时,误差总和不变,所以卷积层 l 要对每个值平摊,于是误差变为
0.25 0.25 0.75 0.75
0.25 0.25 0.75 0.75
0.5 0.5 1 1
0.5 0.5 1 1
http://www.ma-xy.com 47 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
up(x) 可以通过 MATLAB 中的 kron 函数实现。如果是将 l max pool l + 1 层,则需要在
前向传播中记录 pool 区域中的最大值的位置,以便把误差分给相应位置。假如我们在
位置取得最大值,则
δ
l
j
=
0 0 0 3
0 1 0 0
2 0 0 0
0 0 4 0
上面给出了 δ
l
j
的求法,现在给出
E
n
b
l
j
,
E
n
w
l
ij
的求法。这里不考虑非线性函数 f β
l
j
因此,
pool 层前面是没有权值的,也就没有所谓的权值的导数了。假设现在要求
E
n
b
j
=
u,v
δ
l
j
uv
E
n
w
l
ij
= x
l1
i
δ
l
j
其中: 表示矩阵相关操作 (反卷积),可以用 conv2 函数实现,但是要将 δ
l
j
旋转 180
,即
conv2(x
l1
i
, rot180(δ
l
j
),
valid
)
设第 l 1 层的第 i 个图像 (矩阵)x
l1
i
大小为 4 ×4
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
l 层的第 j 个神经元的
误差 δ
l
j
3 × 3
0.8 0.1 0.6
0.3 0.5 0.7
0.4 0 0.2
,这时的 w
l
ij
的导数矩阵的大小为 2 × 2 且其结果为
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
0.8 0.1 0.6
0.3 0.5 0.7
0.4 0 0.2
=
20.4 2.8
4.9 12.7
此时偏置 b
l
j
的导数为 1.2即将 δ
l
j
的元素相加即可 0.8+0.10.6+0.3+0.5+0.70.40.2 = 1.2
(3) 对池化层而言。这里最困难的是计算 δ
l
j
一旦得到了它,我们只要更新偏置参数 β, b
可以了。如池化 l 下一层卷 l + 1 是全连接,那么可以通过 BP 计算采样 δ
l
j
了。要计算卷积核的梯度,所以必须要找到输入矩阵中哪部分 (patch) 对应输出矩阵的哪一个像
素。这里,要找到当前层 (pool) δ
l
j
矩阵的哪一 patch 对应下一层 (积层) δ
l+1
的给定像
素,然后用反向传播传递回来
δ
l
j
= f
(u
l
j
) · conv2
δ
l+1
j
, rot180(k
l+1
j
),
full
下面,就可以把误差/灵敏度 δ
l
j
传递给 β, b
E
n
b
l
j
=
u,v
(δ
l
j
)w
http://www.ma-xy.com 48 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
而对于乘性偏置 β,因为涉及到了前向传播中下采样的计算,所以,最好在前向传播中保存好这
些矩阵,这样,在反向传播中就不用重新计算了。令
d
l
j
= down(x
l1
j
)
E
n
β
j
=
u,v
δ
l
j
d
l
j
uv
示例:池化层的反向传播示意图如图 (1.31) 所示
1.31: 池化层的反向传播示意图
假设 l 层的某个矩阵 x
l
j
的大小为 3 ×3 l + 1 层有 2 个卷积核 w
l
1
, w
l
2
卷积核的大小为
2 × 2,则在前向传播时, l + 1 层会有 2 2 × 2 的输出矩阵 x
l+1
。设 2 个卷积核为 (
0.1 0.2
0.2 0.4
)
(
0.3 0.1
0.1 0.2
) 反向传播时,假设已经知道第 l + 1 2 个输出图的误差 δ
l+1
1
δ
l+2
2
(
1 3
2 2
)
(
2 1
1 1
) 注:1. 矩阵大小为多大,误差 δ 就为多大,每个矩阵元素都有误差/灵敏度;2. 假设 pool
conv 是全连接。
那么,我们就将 w
l+1
j
δ
l+1
j
实现 conv2 操作
conv2(δ
l+1
j
, rot180(w
l+1
j
),
full
)
其中,conv2 δ
l+1
j
填充’full’
0 0 0 0
0 1 3 0
0 2 2 0
0 0 0 0
0 0 0 0
0 2 1 0
0 1 1 0
0 0 0 0
然后再和旋转 180
w
l+1
j
进行卷积
操作,有
0 0 0 0
0 1 3 0
0 2 2 0
0 0 0 0
0.1 0.2
0.2 0.4
=
0.1 0.5 0.6
0.4 1.6 1.6
0.4 1.2 0.8
0 0 0 0
0 2 1 0
0 1 1 0
0 0 0 0
0.3 0.1
0.1 0.2
=
0.6 0.1 0.1
0.1 0.3 0.3
0.1 0.3 0.2
http://www.ma-xy.com 49 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
l j 矩阵的灵敏度 δ
l
j
3 × 3,是上述 2 个矩阵的和
δ
l
j
=
0.1 0.5 0.6
0.4 1.6 1.6
0.4 1.2 0.8
+
0.6 0.1 0.1
0.1 0.3 0.3
0.1 0.3 0.2
=
0.5 0.4 0.9
0.3 1.9 1.9
0.5 1.5 1
(4) 学习特征矩阵的组合。大部分时候,通过卷积多个输入矩阵 (maps)然后再对这些卷积
值求和得到一个输出 map这样做的效果往往较好。在一些文献中, LeNet 中,一般是选择哪
些输入 maps 组合在一起进行输入。现在,我们让 CNN 在训练过程中自己学习这些组合,即让
网络自己挑选哪些输入 maps 进行组合。我们用 α
ij
表示第 j 个输出的 map 中的 i 个输入 map
的权重或贡献。这样,第 j 个输出 map 就可以表示为
x
l
j
= f
n
l
1
i=1
α
ij
(x
l1
i
w
l
i
) + b
l
j
要求 α
ij
要满足
i
α
ij
= 1
0 α
ij
1
述约变量 α
ij
示为隐含 c
ij
softmax (
softmax 的因变量是自变量的指数函数,它们的变化率会不同)
α
ij
=
e
c
ij
k
e
c
kj
因为对于一个固定的 j 而言,每组权值 c
ij
都是和其它组的权值独立的,所以为了方便描述,
我们把下标 j 去掉,只考虑一个 map 的更新,其他 map 的更新情况是一样的,只是索引 j 不同
而已。softmax 函数的导数表示为
α
k
c
i
= δ
ki
α
i
α
i
α
k
这里的 δ Kronecker delta。误差 E
n
对第 l 层变量 α
i
的导数为
E
n
α
i
=
E
n
u
l
u
l
α
i
=
uv
δ
l
(
x
l1
i
w
l
i
)
其中: 表示元素操作, 表示卷积操作。最后,E
n
c
i
求导,有
E
n
c
i
=
k
E
n
α
k
α
k
c
i
= α
i
E
n
α
i
k
E
n
α
k
α
k
http://www.ma-xy.com 50 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
(5) 强加稀疏性组合。为了限制 α
i
是稀疏的,也就是限制一个输出 map 某些而非全部输
maps 链接,我们在整体代价函数中增加稀疏约束项 Ω(α)对单一样本而言,重写代价函数为
˜
E
n
= E
n
+ λ
i,j
|(α)
ij
| = E
n
+ Ω(α)
我们仍将
˜
E
n
关于参数求导,这里主要是 Ω(α) 对权值 c
i
求导。先求 Ω(α) 关于 α
i
的导数,再
求对 c
i
的导数,有
α
i
= αsign(α
i
)
所以权重 c
i
的梯度为
˜
E
c
i
=
E
c
i
+
c
i
CNN 的问题
1. 梯度消失。无论是 ANN(MLP)CNN 还是后面要介绍的 RNN如果网络层数过多,就会
出现梯度消失/爆炸现象。比如:
E
w
l
L 很大而 l = 1 时,
E
w
1
= (10
10
)
n×n
这时权重
w 的更新非常小,几乎不动。解决方法:1. 减少层数 L2. 增大学习率 η3. 使用 ReLu
为传递函数。
2. 随机梯度下降的参数选取。如何选取批量样本大小以及学习率 η
3. 参数 θ
= (w , b) 的初始化。
4. 样本归一化。
1.4.2 AlexNet
2012 年,Hinton 教授及 2 个学生 Alex kvizhevsky Ilya Sutskever 出一种改进的
CNN 网络 - AlexNet并将其运用到 Image Net ILSVRC2012 中,取得了当时最好的成绩:
top-1 top-5 上的误差率为 37.5% 17.0%
ImageNet(http://www.image-net.org)
是李菲组图像库。
ImageNet
设想全世的教
育工作者、研究工作者提供图片资源。ImageNet 不拥有图片的版权,只提供图片的缩略图和 url
从某种程度上讲,它可以视为图像搜索引擎。ILSVRC 使用 ImageNet 的一个子集, 1000 个类
别,每个类别大约包含 1000 张图片,训练集为 12 万张,验证集为 5 万张,测试集为 1 万张。
入图像的大小为 256 ×256 ×3 AlexNet 网络中,随机提取 224 ×224 个像素点,然后 crop
crop 后实际输入到 AlexNet 网络的图像大小为 227 × 227 × 3(RGB 图像)
AlexNet 是一种经典的 DeepCNN,它由 5 convolution layer2 fully connected layer
1 label layer(1000 ) 成,是一 8 层的 CNN 络,里的 Convolution layer
注:crop 为将图片进行 4 个边界 crop 和中心 crop
http://www.ma-xy.com 51 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
CNN 的不同,它许多网络层的组合,如:convolution layer1 1 卷积层、1
maxpool 1 LRN 共同构成。AlexNet 的网络结构如图 (1.32) 所示
1.32: AlexNet 网络结构图 1
从上面的网络示意图 (1.32) 中,我们可以看到,与传统的 CNN 相比,AlexNet 除了网络层
数更深之外,还多了 Relu LRN 层。这个大的网络包含了 6 千万个参数和 65 万个神经元,
利用了 Rleudropoutdata augmentation 等技术来防止过拟合。下面,我们来介绍 AlexNet
的这些技术。
(1)Relu在前面的神经网络章节中,介绍传递函数时,我们已经介绍了 Relu 传递函数。我
们用 Relu 来代替传统的 sigmoid 函数,其好处有 3¬在采用 sigmoid 传递时,计算需要指数运
算,此运算相对而言计算量大,并且,在反向传播求梯度时,求导涉及到除法,除法的计算量仍
然大; sigmoid 传递时,当网络深度很大时,容易出现梯度消失现象,因为在 sigmoid 接近
饱和区域时,变化太缓慢,梯度趋于 0,造成信息损失;®Relu 使一部分神经元的输出为 0,使
网络具有稀疏性,并减少了参数的相互依赖关系。
(2)Local Response Normalization, LRN(局部归一)Relu 递函数本身其实是不对输入
做归一化的,从而避免出现饱和现象。如果训练样本经过卷积网络产生正响应输入到 Relu 的,
就可以对该神经元的参数进行相应的学习,不过 AlexNet 发现,在 Relu 后面加上一个局部归一
化部分,则会使网络达到更好的泛化效果
b
i
xy
= a
i
xy
k + α
min(N1,i+n/2)
j=max(0,in/2)
(a
i
xy
)
2
β
其中:a
i
xy
表示输 maps (x, y) 位置做第 i 卷积并通 Relu 单元的结果,而 b
i
xy
是相应
归一化的结果,n 是指相同位置的第 i 次前后附近的卷积核的数目,而 N 是总的卷积次数。选
取邻近的 n 特征图 (maps),在 maps 的空间位置 (x, y) 一次平方,然后求和,乘以 α,加上
kAlex 在原文中是 k = 1n = 5α = 10
4
β = 0.75,并且与不做局部归一化进行比较,
top-1 top-5 上分别提到了 1.4% 1.2%,并且在 CIFAR10 中的结果也有提高。
(3) 重叠 pooling 层。普通的采样 (如前面 CNN 的池化层那样)采样窗口大小 2 × 2
我们可以以步长 s 进行划分,如果是普通采样,s = z(= 2)即采样窗口不重叠,我们利用 z ×z
大小的采样窗口,隔 s (s 个像素点) 蹦一下,进行采样。而重叠 pool 就像它的名字一样,前
2 个采样窗口 (z × z) 是有重叠的,即 s < z。无重叠 pool 如图 (1.33)(a) 所示,有重 pool
如图 (1.33)(b) 所示
http://www.ma-xy.com 52 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
1.33: 有无重叠的 pool 示意图
当然,如果采用有重叠的 pool 方式
®
,可能使采样结果重复 ( maxpool 而言)。另外,实
表明,maxpool meanpoolAlex 实验明,使 s = 2, z = 3 的有 pool 比使
s = z = 2 的无重叠 pool 效果要好,在 top-1 top-5 上提高 0.4% 0.3%
(4) 过拟合。AlexNet 网络有 6 千万个参数,而训练样本的类别只有 1000 类,这不足以让我
们来学习这么大的网络,因此我们要考虑网络的过拟合。文中提到了 2 个防止过拟合的策略,
个是 Data Augmantation(这个我们不介绍),一个 dropout组合预测是一种非常成功的减小
预测误差的手段,但它训练要花费好几天的时间,对大型网络而言,更是困难。然而,最近推出的
dropout 技术是一种非常有效的模型组合方法,它的训练只花费 2 倍的单模型的时间。dropout
Hinton Improving neural networks by preventing co-adaption 中提出的,以 0.5 概率随机
将隐含层中的各神经元输出置为 0。以这种方式丢弃的神经元既不参与前向传播,也不参与反向
传播,所以对每个输入样本而言,该神经网络都是一个随机得到不确定的网络。但是,所有这些
结构之间共享权重,即权重的更新照旧。这样得到的参数能够适应不同情况下的网络结构,提高
了系统的鲁棒性。AlexNet 的前 2 full connected(FC) 层使用了 dropout 方法,所以在测试时,
应该注意,对每个被 dropout 的神经元的输出乘上一个 0.5,以合理的逼近预测输出分布的几
均值。
(5) 学习过程。下面介绍的内容在本书的其它部分皆有详细的介绍。AlexNet 网络的目标
数可以设置 1.log-loss2.softmax log-loss3.p-distance loss对于 AlexNet 训练参数的设置,
AlexNet 训练时使用批量梯度下降算法 SGD,批量大小 (batch size) 128。参数更新使用动量
(momentum) 更新方法,weight deccy 设置为 0.0005,更新公式为
v
i+1
= 0.9v
i
0.0005 · ϵ · w
i
ϵ ·
L
w
w
i
D
i
w
i+1
= w
i
+ v
i+1
其中:i 为第 i 个批量样本 (每个批量更新一次参数)v 为动量,ϵ 为学习率,
L
w
w
i
D
i
是第 i
个批量 D
i
的目标 L 关于 w 的方向导数在 w
i
的值。
网络的初始权重 w
0
N (0, 0.01),而 245 卷积层的偏置 b 及全连接层 FC 的偏置初
始化都为 1,剩下的偏置初始化为 0。对于学习率 ϵ,每次对当前的学习率除以 10,直到交叉验
CV error rale 不再更新为止。Alex 的学习率初始值为 0.01验证 3 次就终止。AlexNet
ImageNet 1.2 百万张图片上,大概 90 次停止, NVIDIA GTX 580 GPU 上跑了 5 6 天。
®
注:有学者认为,在训练一个良好的生成模型时,弃用 pool 层也是很重要的,如 VAE GAN
http://www.ma-xy.com 53 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
(6) 网络框架。进入 CNN我们也基本上正式进入了深度学习搭建、调参之旅,说实话,
途坑很多。这里插入 2 张图片 (1.34),上图是 AlexNet 的网络数字流程图,下图 AlexNet
GPU 图。
1.34: AlexNet 网络框架图
1.4.3 NiN
2014 Min Lin Network in Network(NiN)23是当时少有的对 CNN 卷积层进行改进的文
章。文章就 CNN 框架提出了 2 种改进方案:1mloconv 替代 conv2平均池 (average pooling)
替代 CNN 的全连接。
mloconv 替代 conv
NiN 使用 mlpconv 来替代原来的 conv 层,mlpconv 实际上是在 conv 层上加上 mlp。因为
conv 是线性的, mlp 是非线性的,后者能够得到更高的抽象层,泛化能力更强。在跨通道的情
况下 (cross channel,cross feature map)mlpconv 等价于卷积层加上 1 ×1 卷积层,所以 mlpconv
也称为 cccp 层。借助这个机会,我们再来看一下 conv。其实 CNN MLP 有很深的渊源,我
们可以将 CNN 展成向量来观察二者之间的相似性,这里我们就不做了。
(1)conv。传统的 conv 是给定一张图片 (map)x,我们用一个卷积核 w 扫描这张图片,以实
现卷积,如图 (1.35) 所示
http://www.ma-xy.com 54 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
1.35: 传统的 conv
这其实是权重共享技术,因为原输入 x 共享了一个卷积核/权重 w。比如,我们将 x 展开成
向量,将卷积核 w 展开成向量,如图 (1.36) 所示
1.36: 卷积核展开示意图
权值共享为 w
1
= w
2
= . . . , w
n
:= w。就输 x 的某一部分 (patch) 来看, patch = x
1
如图 (1.37) 所示
1.37: 输入的部分卷积图
我们将其展开,如图 (1.38) 所示
1.38: 输入的部分卷积展开图
(1.38) 中有
y
1
= f(w
T
x
1
)
http://www.ma-xy.com 55 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
即输出图像的某一个像素点 y
1
就是原输入图像的部分 x
1
和卷积核 w 卷积而来 (忽略 b不考虑
多输入)。这是一个 2 层的 MLP,我们考虑能否将这个 2 层的 MLP 加深?
(2)mlpconvmalpconv 的示意图如图 (1.39) 所示
(a) (b)
1.39: mlpconv 示意图
(1.39a) 中,令 w = (w
1
, w
2
, w
3
) 我们有
h
1
= f(w
1
x
1
)
h
2
= f(w
2
x
1
)
h
3
= f(w
3
x
1
)
y = f
2
(vh) = f
2
(vf(w
T
x
1
))
前面只是用了一个卷积 w这里使用了 3 个卷积 w
1
, w
2
, w
3
就有 3 个输出,然后将它们汇聚在
一起,就变成了一个 3 层的 MLP。当然,可以继续加深网络。
就整个输入矩阵 x 而言,我们设置了 3 个卷积核 w
1
, w
2
, w
3
用这 3 个卷积核分别扫描 x
有了 3 个输出,然后将其汇聚在一处,如图 (1.40) 所示
1.40: 3 个卷积核的 mlpconv 示意图
这里,也可以将 v 视为一个卷积核。有一个问题是:哪一层算作 MLP 的输入?为了将 conv
mlp 分开,将上面的 h
1
, h
2
, h
3
即卷积后面的输出作为 mlp 的输入。这样,上面的过程是一个
1 卷积 conv 加上 2 mlp。将后面的 mlp 层加深,如图 (1.41) 所示
http://www.ma-xy.com 56 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
1.41: conv 3 mlp
当然,上面两种理解都可以:x 展开后直接 mlpx 先卷积再 mlp二者本质上是一样的,
且注意,我们并不要 mlp 层数太多。
(3)mlp = conv + 1 ×1 conv上面的分析只是对一个输入 x 而言, x 是一个矩阵 ( RGB
图像是一个张量)。对于单个输入 x 和单个卷积核 w 而言,1 ×1conv(1 × 1 卷积核) 是易于理解
的,卷积核的大小就是 1 ×1。但实际上,CNN 的卷积大多是多个 maps 和多个卷积核之间的操
作。输入多个 map 和一组卷积核进行卷积操作,然后求和,得到一个输 map。如果此时使用
1 × 1 卷积核,其实就是多个 feature map 的线性组合。
文中提出了 mlpconv 其实等价于传统卷积核后接 cccp 层,从而实现多个 feature map 的线
性组合,而 cccp 层与 1 × 1 卷积核是等价的。多输入的 mlpconv(cccp ) 如图 (1.42) 所示
1.42: cccp 层示意图
如果要使 MLP 的输入有 n 个神经元,就需要 n 个卷积核 w
1
, w
2
, . . . , w
n
从而实现上面的
2 MLP。在 cae 上的实现是:mlpconv = convenience + 1 × 1conv + 1 × 1conv
Average Pooling
NiN23中对 CNN 2 进是使用局平 pool 来替 CNN 分类器与 (
) 完全展开的接口。回忆一下 CNN 中的 S
4
F
5
层,是将 S
4
层的矩阵展开,然后拼接成 F
5
如图 (1.43) 所示
1.43: CNN 全展开层示意图
http://www.ma-xy.com 57 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
然后,再将 F
5
层作为小分类器的输入层进行运行。但是,这样展开拼接有一个问题,就
展开之后的神经元输入太多了,导致小分类器的权 w 矩阵是非常大的,不易求解。现在,
们将 S
4
的每个输出矩阵 (feature map) 求平均,然后再将平均值合并作为 F
5
(小分类器的输
),如图 (1.44) 所示
1.44: average pooling 示意图
这样,
S
4
层有几个矩阵,小分类器就有几个输入神经元。注:
S
4
F
5
的形式可以改进。
称原本 S
4
F
5
为全连接;称改进后的 S
4
F
5
Average pooling
NiN 的网络结构示意图
NiN 网络结构示意图如图 (1.45) 所示
1.45: NiN 网络结构示意图
基于 TensorFlow 实现的 NiN 网络如下
¯
1 import te n s orflo w as t f d e f ni n _ cell ( input ) :
2 conv1 _ f i l t e r = t f . ge t_variabl e ( c o n v 1 _ f i l t e r , shape =[5 , 5 , 3 , 1 9 2 ] )
3 conv1 = t f . nn . r e l u ( t f . nn . conv2d ( input , c o n v 1 _ f i l t e r ) )
4 mlpconv1_ filter = t f . g et _variable ( ml pconv1_ filter , shape =[1 , 1 , 192 , 16 0 ] )
5 mlpconv1 = t f . nn . re l u ( t f . nn . conv2d ( conv1 , mlpconv1_filt er ) )
6 mlpconv2_ filter = t f . g et _variable ( ml pconv2_ filter , shape =[1 , 1 , 160 , 9 6 ] )
7 mlpconv2 = t f . nn . re l u ( t f . nn . conv2d ( mlpconv1 , mlpc onv2_fi lter ) )
8 max_pool1 = t f . nn . max_pool ( mlpconv2 , k s i z e = [1 , 3 , 3 , 1 ] , s t r i d e s = [ 1 , 2 , 2 , 1 ] )
9 conv2 _ f i l t e r = t f . ge t_variabl e ( c o n v 2 _ f i l t e r , shape =[5 , 5 , 96 , 19 2] )
10 conv2 = t f . nn . r e l u ( t f . nn . conv2d (max_pool1 , conv2_filter ) )
11 mlpconv3_ filter = t f . g et _variable ( ml pconv3_ filter , shape =[1 , 1 , 192 , 19 2 ] )
12 mlpconv3 = t f . nn . re l u ( t f . nn . conv2d ( conv2 , mlpconv3_filt er ) )
13 mlpconv4_ filter = t f . g et _variable ( ml pconv4_ filter , shape =[1 , 1 , 192 , 19 2 ] )
14 mlpconv4 = t f . nn . re l u ( t f . nn . conv2d ( mlpconv3 , mlpc onv4_fi lter ) )
15 max_pool2 = t f . nn . max_pool ( mlpconv4 , k s i z e = [1 , 3 , 3 , 1 ] , s t r i d e s = [ 1 , 2 , 2 , 1 ] )
¯
程序来自微信公众号:DLdigest 深度学习每日摘要 (2017-05-09 )
http://www.ma-xy.com 58 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
16 conv3 _ f i l t e r = t f . ge t_variabl e ( c o n v 3 _ f i l t e r , shape =[3 , 3 , 192 , 192])
17 conv3 = t f . nn . r e l u ( t f . nn . conv2d (max_pool2 , conv3_filter ) )
18 mlpconv4_ filter = t f . g et _variable ( ml pconv4_ filter , shape =[1 , 1 , 192 , 19 2 ] )
19 mlpconv4 = t f . nn . re l u ( t f . nn . conv2d ( conv3 , mlpconv4_filt er ) )
20 mlpconv5_ filter = t f . g et _variable ( ml pconv5_ filter , shape =[1 , 1 , 192 , 1 0 ] )
21 mlpconv5 = t f . nn . re l u ( t f . nn . conv2d ( mlpconv4 , mlpc onv5_fi lter ) )
22 global_avg_pool = t f . nn . avg_pool ( mlpconv5 , k s i z e =[ 1 , 8 , 8 , 1 ] )
23 ret ur n global_avg_pool
24
NiN 的实验结果
1.46: NiN 与其它网络在 CIFAR-10 数据集上对比的实验结果
1.4.4 GoogLeNet
GoogLeNet 介绍
Szegedy 等设计的 GoogLeNet10 2014 年的 ILSVRC 中获胜。它主要的贡献就是实现了一
个奠基模块。它能够显著的减少网络中参数的数量,AlexNet 中有 6 千万个,而它只有 4 万个。
此外,GoogLeNet 络中没有使用卷积神经网络顶部的全连接层,而是使用了 average pooling
方法。ILSVRC2014 年时采用的 GoogLeNet 22 层,参数比 AlexNet 少了 12 倍,但准确度更
(这说明 AlexNet 中还有许多不重要的参数,AlexNet 还有很大的改进空间)下面,我们来介
GoogLeNet 2 种重要的策略。
(1)Motvation and High Level Considerations。直接提升深度卷积神经网络的方法是从深度
和宽度两方面增加尺寸的,但是大的尺寸会使网络中有许多参数,容易出现过拟合现象,特别是
当训练数据集不够大时。直接增加尺寸的另一个弊端是需要大量的计算资源。根本解决方法是将
全连接层变为系数层。早些时候,为了打破网络的对称性和提高网络学习能力,传统网络使用了
随机稀疏连接的方法。但是,非均匀系数网络的计算效率较低,我们可以将多个稀疏矩阵合并成
相关的稠密子矩阵的方法来解决。
(2)Incepion 结构。Inception 的主要思想是:怎样用密集成分来近似局部稀疏结构。GoogLeNet10
设计的 Inception 结构如图 (1.47) 所示
http://www.ma-xy.com 59 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
1.47: Inception 结构示意图
我们采用大小不同的卷积对上一层的特征矩阵 (例如:128 100 ×100 的矩阵) 进行卷积操
作,提取不同维度的特征。这里卷积大小 (1,3,5) 不是必要的,可改。在卷积之后,将 3 得到
的卷积后的特征图/矩阵 (maps) 拼接起来 (合并)并且,为了使卷积后的 maps 的大小相同,
给定卷积步 s = 1 后,只要改变 pad = 0, 1, 2 即可。由于 pool 层在许多实验中表现良好,
以也将其计算。但是 5 × 5 卷积核带来的计算量仍然是非常巨大的。为此,我们借鉴 NiN
路,用 1 × 1 卷积来降维,如图 (1.48)
所示
1.48: Inception 结构 cccp 降维示意图
3 × 3 5 × 5 卷积前使用 1 × 1 卷积进行降维 (将输入图片降维,例如:256 64)。这
一层一般称为“瓶颈层”
(bottleneck layer)
它减小了每一层的特征
map
的数量
并由此减少了
计算量。例如:假设我们输入层有 256 个特征图片, 256 个输出,并且假定 Inception 层只进
3 ×3 卷积操作,那么,它需要 256 × 256 × 3 × 3(60 万次) 次卷积操作。如果用一个 1 ×1
卷积核先将 256 卷积到 64,然后再对 64 个特征图片进行 3 ×3 卷积操作,则有 64 × 64 ×3 × 3
卷积操作,然后,将 64 个输出 maps 再用 1 × 1 卷积返回,那么,这个操作为
256 × 1 × 1 × 64 + 64 × 64 × 3 × 3 + 64 × 1 × 1 × 256 7
7 万和 60 万相比,少了近 10 倍。鉴于 GoogLeNet 在图片问题上有良好的表现,下面来介绍 4
个改进版本。
GoogLeNet - V1
GoogLeNet10网络的核心就是 Inception其网络深度达到了 27 层。如此深的网络,它在 BP
反向传播过程中如克服梯度消失问题呢?GoogLeNet 用了一个验信息:层数较小的网络
可能取得不错的分类效果。那么,深度网络中间层的特征对于分类来说,也是有很好的判别作用
(即用中间特征做判别),所以,在中间的某些部分设置小的分类器来进行训练。训练阶段,总损
http://www.ma-xy.com 60 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
失为总分类器和中间小分类器损失的和;在测试阶段,小分类器被弃用。GoogLeNet 的网络结构
如图 (1.49) 所示
1.49: GoogLeNet 网络结构示意图
GoogLeNet 采用了模块组的方式来建网络,这便于络的添加修改。并且,在网
的最后采用了
average pooling
来替代
CNN
的全连接。
GoogLeNet
中仍然采用了
dropout
策略,
并在网络的中间层加了 2 个小分类器 softmax以避免梯度消失。小分类器的结构如图 (1.50)
1.50: GoogLeNet 小分类器的结构图
average pooling 部分的卷积核大小为 5 × 5步长 s > 31 × 1 的卷积核包含降维的 128
卷积核和 Relu全连接层 FC 1024 个单元和修正线性激活,dropout 层的 dropped 的输出比
率为 20%,将 softmax 作为 1000 类的分类器的损失。
GoogLeNet - V1 top-5 6%,获 2014 一。
GoogLeNet 和其它网络的对比结果如图 (1.51) 所示
1.51: GoogLeNet Top-5 上的结果
http://www.ma-xy.com 61 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
GoogLeNet - V2
2015.Sergey30引入 Batch-normalized Inception 被视为 Inception 第二代。Batch-normalized
在一层的输出上计算所有特征映射的均值和方差,并用这些值规定它们的响应,这相当于数据增
(whiteniy),因此,使得所有神经图 (nurmal maps) 在同一范围有响应,而且是零均值,在下
一层不需要从输入数据中学习 oset 时,这有助于训练。相关实现可以参考下面的网址
°
GoogLeNet - V3
2015 12 月,该团队发布了 Inception-V3 版本8 Inception-V1 时期,能与 GoogLeNet
能一较高下的只有 VGG(这个下面介绍)但相比之下,GoogLeNet 的计算效率要明显高于 VGG
GoogLeNet 表现虽然良好,但是,要想通过简单放大 (大的卷积核)Inception 结构来构建更大的
网络则会立即增加消耗。
大的卷积核可以带来更大的感知范围,但这也意味着我们将要训练更多的参数,比如 5 × 5
3 ×3二者的参数量为 25/9 3为此,Sergey loe 等提出用 2 个连续的 3 ×3 卷积 (s = 1)
组成小网络来替代 5 × 5。然而,这样有 2 个问题:¬这种替代会造成表达能力下降吗?即提取
的特征会减少吗;3 ×3 卷积之后,还要再激活吗?从大量的实验来看,表达能力不会下降,
且,增加非线性激活会提高性能, 5 × 5 可以用 2 3 ×3 代替。那么,我们是否可以考虑更
小的卷积核呢?比如 n × 1
于是,任意的 n ×n 卷积核都可以通过 1 × n 结合 n × 1 来替代。作者发现,在网络前期使
用这种替代效果并不好,如果在中等大小的 feature map 上使用效果要好一些 (作者建议 map
小在 12 20 之间)。于是,原 GoogLeNet inception 变为图 (1.52)(b)
1.52: inception-v3 示意图
(1.52)(a) 中用 2 3 ×3 来替代一个 5 ×5 (1.52)(b) 中用 n ×1 来替代 5 ×5 3 ×3
当然,还可以将 Inception 设计为图 (1.53) 的形式。GoogLeNet - V3 的实现可以参考
±
°
https://github.com/nutszebra/googlenet_v2/blob/master/googlenet_v2.py
±
https://github.com/nutszebra/googlenet_v3
http://www.ma-xy.com 62 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
1.53: inception-v3-2 示意图
GoogLeNet - V4
2016 8 月,该团队再次更新了 Inception 的版本9 Inception-V4Inception-V4 中吸收了
2015ILSVRC
中获胜的
ResNet
的特点,构建了
Inception-ResNet
模块。同时,9中还发现,
ResNet 的结构可以极大的加速训练,同时性能也有提升,得到了一个 Inception-ResNet-V2 网络。
此外,该团队还设计了一个更深更优化的 Inception-V4 模型,能够达到和 Inception-ResNet-V2
相似的性能。值得一提的是 Inception-V4 中没有 Resdual 操作。
先来简单记一下 Resdual 操作,关于 ResNet 后面介绍。Resdual 的经典结构如图 (1.54)
1.54: Resdual 结构示意图
我们将 Inception Resdual 相结合,得到 Inception-ResNet 的经典模块如图 (1.55) 所示
1.55: Inception-ResNet-V1 结构示意图
其余图片参考原文。网址
²
给出了 GoogleNet MATLAB 实现。
1.4.5 VGG Net
VGG ILSVRC2014 年比赛的第二名,仅次于 GoogLeNet Karen Simanyan Androw
Izsserman 21键。
²
https://github.com/mtmd/GoogleNet_MATLAB
http://www.ma-xy.com 63 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
VGG 网络包含 16 层,并且网络结构非常一致,统一使用 3 ×3 卷积层和 2 ×2pooling 层。但是
VGG 的计算量是非常大的,大量的参数导致它会占用很大的内存 (140M)其中绝大多数参数都
是来自于一个全连接层 FC。后面,可以尝试将这个 FC 层去掉,以减少参数量。
VGG 同样是一种卷积神经网络,通常有 16 19 层,其网络结构如图 (1.56) 所示
1.56: VGG 网络结构图
注意,就像前面所说的那样,图 (1.56) 中的 conv 都是 3 × 3 大小,maxpool 都是 2 × 2
小。VGG 正是试图通过多个 3 × 3 卷积来替代更大的卷积核 (比如 5 × 5 7 ×7),这也是前面
Inception 的策略。并且 VGG-E 45 块:256 ×256 512 ×512 3 ×3 是卷积核依次使用多
次,以提取到更多的特征 maps 以及这些 maps 的组合。其效果就等于是一个带有 3 个卷积层的
大型 512 × 512 的大分类器,这意味着要有大量的参数。
VGG 实现细节:dropout 只在前面 2 FC 中使用,在第 3 FC 中不用。使用批量为 256
的批量梯度算法 SGD同样采用动量权重更新,动量参数为 0.9VGG 在目标中使用 L2
则项 (惩罚项),罚权重为 5
4
dropout 0.5学习率初始值为 0.01,并在 validation error
达到瓶颈之前以 10 倍下降,直到 validation error 不再变化。在实验中,学习率共降过 3 次,
代次数有 370 千次, 74 次对全部数据进行扫描。权重初始值使用 Pre-traing(预训练) 的方法:
先预训练一小部分网络,当网络稳定后再向前训练。每次初始化权重时,使用 N (0, 0.01),偏置
b 的初始值为 0,传递函数使用 Relu
1.4.6 ResNet
ResNet 简介
ResNet20 ILSVRC2015 年的获胜者,由微软亚洲研究院的何凯明等研发,在图像分类、
标检测等任务中,ResNet 的性能大幅度超越前一年的网络。残差网络的明显特征是有着相当深
的网络深度, 32 层到 152 层,深度远超之前的网络。并且,更有甚者设计了 1001 层的网络结
构,其网络深度是令人吃惊的。残差网络使用了特殊的跳跃式连接,大量使用批量归一化 (batch
normalization),并且网络的最后也没有使用 FC 层。
从前面介绍的 CNN 及其改进来看,似乎越深的网络表达能力越强。我们能不能将一个简单
的网络加深,使它变得更优呢 (不改变结构的情况下)何凯明等人通过实验证明:在时间复杂度
相同的情况下,深度较深的网络性能会更优一下,但是一般的堆积网络块并不能使网络更好。
积的深层网络除了使计算量变大之外,另一大难题则是梯度消失 (infernation),进而导致网络收
敛缓慢。2013 年,多伦多大学 Lei jimny Ba 和微软的 RichCarnana 发表了Do Deepnets really
need to be deep?》一文,文中用一个浅层网络去模拟一个深层网络,结果得到 2 个只有 1 层的
浅层网络,但这个网络却能与深层网络相媲美。因此,作者提出,对浅层网络而言,可能还有许
http://www.ma-xy.com 64 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
多更好的网络结构和更好的学习算法等待我们开发 (这是重点)。同样,何凯明等在 ResNet 的原
20中也做过实验,将网络的深度由 20 增加到 56发现随着网络深度的加深,错误率却不降反
增,如图 (1.57) 所示
1.57: 20vs56 (简单堆积加深) 的结果
从图 (1.57) 中可以看出,简单增加网络深度不仅仅使测试集错误率提高,而且在训练集中错
误率也提高,这就排除了深度网络过拟合的可能 (如果仅在测试集中错误率提高,则是网络过拟
)模型中也使用了 Relu BN 等防止梯度消失的策略,但最终结果表明:普通增加深度是有
问题的,至于问题出在哪里,这个还有待研究。
高速公路网络 HighWay Network
ResNet 可以视为 Highway network 的特例。Highway Network29是瑞士 3 位学者于 2015
提出的一种超深度的网络,为什么说是超深呢?原29指出,他们能够训 900 层的神经网络。
虽然只是层数加深,没有性能的提高,但是能训练就已经很不错了。他们还在文中给出了最深达
100 层的 Highway Net 的收敛情况,如图 (1.58) 所示
1.58: HighWayNetwork 的收敛情况
Highway Net 的工作受到了 LSTM(个我们在 RNN 中介绍) gate 启发:既然梯度在
某些地方被阻碍了,那就让它直接通过这些阻碍层好了,不求导或者令导数为 1HighwayNet
思想正源于此,并且,这也是 Highway 名称的由来。 Highway 网络中,我们设网络层数为 L
W
H
l
(l = 1, 2, . . . , L) 表示第 l 层的权重,H 为第 l 层的非线性函数,x
1
是第 1 的输入,w
H
1
http://www.ma-xy.com 65 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
是第 1 层的权重,y
1
是第 1 层的输出,忽略偏置 b,并省略层 l 的标记,可以将输入输出写为
y = H(x, W
H
)
这里:H 是一个仿射变换,但是,它还可以有更一般的形式,在 Highway 中,我们添加 2 个新
的非线性转换 T (x, W
T
), C(x, W
c
)y
y = H(x, W
H
)T (x, W
T
) + xC(x, W
c
)
我们定义 T 为转换门 (transform gate)C 是传递门 (carry gate)为了简单, C = 1 T
是有
y = H(x, W
H
)T (x, W
T
) + x[(1 T )(x, W
T
)]
由于是 gate,所以 T 的取值为 0 1。我们可以看到
y =
x T = 0, 关闭
H
(
x, W
H
)
T
= 1
,
打开
这种思路是非常巧妙地,将上面的 y 关于 x 求导,有
y
x
=
I T = 0
H
(x, W
H
) T = 1
其中:I 是全 1 向量。上面的 y = x 代表着什么,想必也是了然的,这就是 Highway并且
y
x
= I
也使梯度得以直接通过 (很“变态”的一种方法)。使用 TensorFlow 实现 HighwayNet 如下
³
1 de f highwayUnit ( input_layer , unit_id , is_ t r a i n i n g=True ) :
2 with t f . var iable_scope ( HighwayUnit_ +s t r ( unit_id ) , i n i t i a l i z e r=t f .
random_normal_initializer ( ) ) :
3 T = t f . l a y e rs . conv2d ( input_layer , 32 , ( 3 , 3 ) , padding= same )
4 bn_layer1 = t f . c ontr i b . l a y e r s . batch_norm ( input_layer , i s _ t r a in i ng=is_ t r a i n i n g
)
5 relu _la ye r1 = t f . nn . r e lu ( bn_layer1 )
6 conv_layer1 = t f . l a y e r s . conv2d ( relu_layer1 , 32 , ( 3 , 3 ) , padding= same )
7 bn_layer2 = t f . c ontr i b . l a y e r s . batch_norm ( conv_layer1 , i s _ t r a i n in g=is _ t r a i n i n g
)
8 relu _la ye r2 = t f . nn . r e lu ( bn_layer2 )
9 conv_layer2 = t f . l a y e r s . conv2d ( relu_layer2 , 32 , ( 3 , 3 ) , padding= same )
10 ret ur n (1.0 T)* input_layer+T* conv_layer2
11
ResNet 理论
ResNet 中。像 Highway 样,ResNet 使“直通”法,
ResNet 还采用了一些其他的技巧,从而使 ResNet 完全避免了梯度消失问题。
³
微信公众号:DLdigest 深度学习每日摘要 (2017-05-07)
http://www.ma-xy.com 66 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
我们知道,在一个浅层网络上累加/堆积一些 x
l+1
= y = x
l
是不改变网络的结果的,它只是
单纯的增加了网络的深度而已。但是,这样的“深”并非我们的初衷,我们希望加深网络来提高
网络的性能。先来看一下一般的网络结构,如图 (1.59) 所示
1.59: 一般的网络结构示意图
要求经过两个权重层/卷积层后,输入的 x
l+1
= x
l
如果拟合/逼近一个恒等式 x
l+1
= H(x
l
)
不容易,可以转而拟合其误差,让其误差趋于
0
并且由于要求
x
l+1
=
x
l
所以二者的大小应该
是一样的。拟合误差的网络如图 (1.60) 所示
1.60: 误差块网络示意图
(1.60) 中,F (x
l
) 表示 x
l+1
x
l
。当 f(x) = x 时,为了方便,忽略层 l 的下标,有
F (x) = W
2
σ(W
1
x)
y = x + F (x)
H(x
l
) = f(y)
我们写出更一般的残差块的公式,要求 x
l
x
l+1
h(x
l
),有
F (x) = W
2
+ σ(W
1
x)
y = h(x) + F (x)
x
l+1
= H(x
l
) = f(y)
其中:x
l
是第 l 差单元/残差块 (residual unit) 的输入特征 maps(input feature maps)W
l
=
{W
l,k|1kK
} 是第 l /残差块的权重,W
l
= (W
l1
, W
l2
)K 是第 l 层的权重数量,或者说是第
l 个残差块的卷积层数;F 是残差函数;f 是传递函数,例如 f = Reluh(x
l
) x
l
的一个变换,
一般为恒等式 h(x
l
) = x
l
http://www.ma-xy.com 67 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
如果传递函数 f 也是一个恒等式,我们可以写出
x
l+1
= x
l
+ F (x
l
, W
l
)
L 个残差块堆积起来,则有
x
l+2
= x
l+1
+ F (x
l+1
, W
l+1
) = x
l
+ F (x
l
, W
l
) + F (x
l+1
, W
l+1
)
更一般的,有
x
L
= x
l
+
L1
i=l
F (x
i
, W
i
)
这里,为了便于理解,可以将 F (x
i
, W
i
) 视为 0对任何深度的 L 和任意的层/ l上式有一些
非常好的性质:
1. L,特征 x
L
可以表示成 x
l
(l)
L1
i=l
F (x
i
, W
i
) 的和;
2. Lx
L
= x
0
+
L1
i=0
F (x
i
, W
i
),即 x
L
是所有残差 F (x
i
, W
i
) 求和后加上 x
0
ResNet 网络的最终误差为 EE 关于 x
l
求导,有
E
x
l
=
E
x
L
x
L
x
l
=
E
x
L
1 +
x
l
L1
i=l
F (x
i
, W
i
)
上式表明,梯度
E
x
l
能够分解为 2 部分:
E
x
L
E
x
L
x
l
L1
i=l
F 。后面这部分
E
x
L
确保了信息/
度可以传递到任何 l,并且保证了
E
x
l
不会消失。因为
x
l
L1
i=l
F x
l
不会总是 1,这里的
梯度已经不再是一般的连乘
. . .
的形式了,所以不会消失。
但是,要注意的是,前面假设 h(x
l
) = x
l
,并且假设 x
l+1
= y
l
,这是两个非常强的约束,
一旦打破,上述关系式即不成立。
(1) 对于第一个假设。关于 h(x
l
) = x
l
是我们一直默认的,而且实验表明这种方法是较好的。
现在,将其改为 h(x
l
) = λ
l
x
l
,并且仍然假设 x
l+1
= y
l
(即传递函数 f 是恒等传递),有
x
l+1
= λ
l
x
l
+ F (x
l
W
l
)
递归堆积,有
x
L
=
L1
i=l
λ
i
x
l
+
L1
i=l
L1
j=i+1
λ
j
F (x
i
, W
i
)
或者简单记为
x
L
=
L1
i=l
λ
i
x
l
+
L1
i=l
ˆ
F (x
i
, W
i
)
http://www.ma-xy.com 68 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
其中:
ˆ
F =
L1
j=i+1
λ
j
F (x
i
, W
i
)
我们仍然记误差为 EE 关于 x
l
求导,有
E
x
l
=
E
x
L
L1
i=l
λ
i
+
x
l
L1
i=l
ˆ
F (x
i
, W
i
)
第一项
L1
i=l
λ
i
是非常危险的,如果对于所有的 iλ
i
> 1那么这一项会按指数方式增长;如
对于所有的 i,有 λ
i
< 1,那么这一项会减小甚至消失。因此,梯度很依赖 λ
i
λ
i
又不定,所
以网络不稳定。
(2) 对于第二个假设。x
l+1
= f(y
l
) = y
l
f 放宽,不要求其为恒等变换,但是仍然要将 x
l
直接传递给 x
l+1
为此, f 移到旁边的残差分支上来,至于 f Relu 安放在哪里,可以参考
何凯明文献19中的 Fig4 Tab2Fig4 如图 (1.61) 所示,Tab2 如图 (1.62) 所示
1.61: 传递函数的 6 种不同的位置比较
1.62: 传递函数 Tab2
Fig4 Tab2 中的比较表明:将 f = Relu 移到残差分支中,不仅可以满足之前的假设,而
且是这几种移动中最优的移动。接下来使用 TensorFlow 来实现上图 (1.61) 所示的 ResUnit
1 import te n s orflo w as t f
2 de f resU ni t ( input_layer , unit_id , is _ t r a i n i n g=True ) :
http://www.ma-xy.com 69 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
3 with t f . var iable_scope ( ResUnit_ +s t r ( unit_id ) , i n i t i a l i z e r=t f .
random_normal_initializer ( ) ) :
4 bn_layer1 = t f . c ontr i b . l a y e r s . batch_norm ( input_layer , i s _ t r a in i ng=is_ t r a i n i n g
)
5 relu _la ye r1 = t f . nn . r e lu ( bn_layer1 )
6 conv_layer1 = t f . l a y e r s . conv2d ( relu_layer1 , 32 , ( 3 , 3 ) , padding= same )
7 bn_layer2 = t f . c ontr i b . l a y e r s . batch_norm ( conv_layer1 , i s _ t r a i n in g=is _ t r a i n i n g
)
8 relu _la ye r2 = t f . nn . r e lu ( bn_layer2 )
9 conv_layer2 = t f . l a y e r s . conv2d ( relu_layer2 , 32 , ( 3 , 3 ) , padding= same )
10 ret ur n input_layer+conv_layer2
11
12 i f __name__ == ’__main__ :
13 with t f . S essi o n ( ) as se s s :
14 input_layer = t f . g et_variab le ( input , shape = [ 4 ,1 0 ,10 ,32] , dtype=t f . f l o a t3 2 )
15 out = resUnit ( input_layer , 1)
16 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
17 p r i n t s e ss . run ( out )
18
下面将残差块堆积起来,形成 DeepResNet,如图 (1.63) 所示
1.63: DeepResNet 网络结构图
ResNet 层数逐步加深的训练误差如图 (1.64) 所示
1.64: ResNet 层数逐步加深的训练误差
从图 (1.64) 中可以看到,随着 ResNet 网络的加深,训练误差逐渐下降,没有出现普通堆积
的误差增加的情况。
下面,我们简记一下 ResNet 的结果。1. 2015 ResNet 原文20 Fig4 Tab2 ImageNet
数据集上进行了平整网络 plain network 和残差网络的收敛性对比;2. 2015 ResNet 原文20
Tab4,在 ImageNet 上进 ResNet 其它的单 top-1 top-5 的对
实验;3. 2015 ResNet 原文20 Tab5,在 ImageNet 数据集上进行和 ResNet 与其它网络的
的集成模 top-5 对比实验;4. 2016 1001 残差网络的原19 Fig3 Fig6,展示了
http://www.ma-xy.com 70 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
1001 层网络在 CIFAR-10 数据上的训练收敛图;5. 2016.Andreas 在文2中指出,ResNet 其实质
上并非一个非常深的网络,而是由指数个非常前的网络叠加而成。该论文同时指出,查看网络除
了要看网络的深度和宽度 (特征提取的多少) 之外,还应该查看网络的 multiplicity。重要观点查
看原 Fig1 即可。6. 2016.Zhang37多级残差网络。络结构参原文37 Fig1 RoR
Fig2 RoR-3 Fig3 Pre-RoR-3 RoR-3-WRN7. 2016.Abdi1同样提出多级残差网络。8.
2016.Zagoruyko36提出 WResNet(WRN),将 ResNet 网络性能改善。9. 2016.Brian11 ResNet
内部化。10. 2016.Gao16提出络。网络
机的,并将该网络在 CIFAR-10 数据集上进行测试。11. 2016.Gustav15提出了分形网络 (fractal
network) 的概念,并在此基础上采用 dropout 方法进行训练。
1.4.7 MATLAB 应用实例
MATLAB 自带 CNN 工具
MATLAB 自带的卷积神经网络 CNN 命令如表 (1.3) 所示
http://www.ma-xy.com 71 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
1.3: CNN 命令
命令 说明
trainingOptions Options for training neural network
trainNetwork Train a convolutional network
imageInputLayer Image input layer
convolution2dLayer Convolutional layer
reluLayer Rectied(改正) Linear Unit (ReLU) layer
crossChannelNormalizationLayer Channel-wise local response normalization layer
averagePooling2dLayer Average pooling layer object
maxPooling2dLayer Max pooling layer
fullyConnectedLayer Fully connected layer
dropoutLayer Dropout layer
softmaxLayer Softmax layer for convolutional neural networks
classicationLayer Create a classication output layer
regressionLayer Create a regression output layer
activations Compute convolutional neural network layer activations
predict Predict responses using a trained convolutional neural network
classify Classify data using a trained convolutional neural network
deepDreamImage Visualize(形象) network features using deep dream
alexnet Pretrained AlexNet convolutional neural network
vgg16 Pretrained VGG-16 convolutional neural network
vgg19 Pretrained VGG-19 convolutional neural network
importCaeLayers Import convolutional neural network layers from Cae
importCaeNetwork Import pretrained convolutional neural network models from Cae
SeriesNetwork Series network class
TrainingOptionsSGDM Training options for stochastic gradient descent with momentum
Layer Network layer
ImageInputLayer Image input layer
Convolution2DLayer Convolutional layer
ReLULayer Rectied(改正) Linear Unit (ReLU) layer
CrossChannelNormalizationLayer Channel-wise local response normalization layer
AveragePooling2DLayer Average pooling layer object
MaxPooling2DLayer Max pooling layer
FullyConnectedLayer Fully connected layer
DropoutLayer Dropout layer
SoftmaxLayer Softmax layer for convolutional neural networks
ClassicationOutputLayer Classication output layer
RegressionOutputLayer Regression output layer
http://www.ma-xy.com 72 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
MatConvNet
MatConvNet 是一个少有的基于 MATLAB 语言的深度学习工具箱,主要用于卷积神经网络
(恰好就是我们这章所讲的内容)MatConvNet 包含了上面介绍的各大网络,并且由于上面的网
络都比较大,MatConvNet mat 据格式里已经提供了网络的基本结构,只需要将样本数据
带入训练即可。MatConvNet 基本模型示例:
1 %% MatConvNet
2 %1 MatConvNet ( needed once ) .
3 cnnMatFile = f u l l f i l e ( matlabroot , work , DL_song , MatConvNet ) ;
4 i f ~ e x i s t ( cnnMatFile , f i l e ) % download only once
5 dis p ( Untar pret r a i ned CNN model . . . ) ;
6 MatConvNetPath = ’D: \ Program F i l e s \MATLAB\R2016a\work\ \ /
matconvnet1.0beta23 . t a r . gz ;
7 untar (MatConvNetPath , cnnMatFile ) ;
8 end
9 cnnMatFile = f u l l f i l e ( cnnMatFile , matconvnet1.0beta23 ) ;
10 cd ( cnnMatFile )
11 % addpath matlab
12 %
13 run matlab/vl_compilenn ;%CPU
14 %GPU
15 vl_compilenn ( enableGpu , true )
16 %
17 vl_testnn
18 vl_testnn ( gpu , tru e )
19 %% VGGfac e ( )
20 % ( needed once ) .
21 u r l w r i te ( . . .
22 http ://www. v l f e a t . org/matconvnet/models/imagenetvggf . mat , . . .
23 imagenetvggf . mat ) ;
24 % Setup MatConvNet .
25 run matlab/vl_setupnn ;
26 % Load a model and upgrade i t to MatConvNet cur ren t v e r s i o n .
27 net = load ( imagenetvggf . mat ) ;
28 net = vl_simplenn_tidy ( net ) ;
29 % Obtain and pr e p roc e s s an image .
30 im = imread ( peppers . png ) ;
31 im_ = s i n g l e (im) ; % note : 255 range
32 im_ = imr e s i z e (im_, net . meta . n or mal iz ati on . imageSize ( 1 : 2 ) ) ;
33 im_ = im_ net . meta . n ormal iz ati on . averageImage ;
34 % Run the CNN.
35 r e s = vl_simplenn ( net , im_) ;
36 % Show the c l a s s i f i c a t i o n r e s u l t .
37 s c or e s = squeeze ( gather ( r e s ( end ) . x ) ) ;
38 [ bestScore , bes t ] = max( s c or e s ) ;
39 fi g u r e ( 1 ) ; c l f ; imagesc ( im) ;
40 t i t l e ( s p r i n t f ( ’%s (%d) , s c o r e %.3 f , . . .
41 net . meta . c l a s s e s . d e s cr i p t io n { best } , best , be stS co re ) ) ;
42 %% DAG
43 % setup MatConvNet
44 run matlab/vl_setupnn
http://www.ma-xy.com 73 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
45 % ( needed once )
46 u r l w r i te ( . . .
47 http ://www. v l f e a t . org/matconvnet/models/imagenetgoo glenetdag . mat , . . .
48 imagenetgoog lenetdag . mat ) ;
49 % load the pret r a i n ed CNN
50 net = dagnn .DagNN. l oadob j ( load ( imagenetg ooglenetdag . mat ) ) ;
51 net . mode = t e s t ;
52 % load and p r epr o c ess an image
53 im = imread ( peppers . png ) ;
54 im_ = s i n g l e (im) ; % note : 0255 range
55 im_ = imr e s i z e (im_, net . meta . n or mal iz ati on . imageSize ( 1 : 2 ) ) ;
56 im_ = bsxfun (@minus , im_, net . meta . no rmali zatio n . averageImage ) ;
57 % run the CNN
58 net . eva l ({ data , im_}) ;
59 % obt ain the CNN otuput
60 s c or e s = net . var s ( net . getVarIndex ( prob ) ) . value ;
61 s c or e s = squeeze ( gather ( s c o res ) ) ;
62 % show the c l a s s i f i c a t i o n r e s u l t s
63 [ bestScore , bes t ] = max( s c or e s ) ;
64 fi g u r e ( 1 ) ; c l f ; imagesc ( im) ;
65 t i t l e ( s p r i n t f ( ’%s (%d) , s c o r e %.3 f , . . .
66 net . meta . c l a s s e s . d e sc r i p ti o n { best } , best , be st Sco re ) ) ;
67
我们还可以用 MATLAB 结合 MatConvNet 来建立网络,下面给出一个示例:
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 %% CNN
3 %Note :
4 % Computer Vision System Toolbox ? ,
5 % Image Pr oce ss ing Toolbox ? ,
6 % Neural Network Toolbox ? ,
7 % Pa r a l l e l Computing Toolbox ? ,
8 % S t a t i s t i c s and Machine Learning Toolbox ? ,
9 % a CUDAcapable NVIDIA? GPU with compute c a p a b i li t y 3.0 or high er .
10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11 %% 1 CUDAcapable NVIDIA? GPU with compute
c a p ab i li t y 3.0 or higher .
12 % GPU (GPU NVIDIA )
13 d e v i c e I nf o = gpuDevice ;
14 % GPU
15 computeCapability = s tr2 dou ble ( d e v i c e I n f o . ComputeCapability ) ;
16 a s s er t ( computeCapability > 3. 0 , . . .
17 This example re q u i r e s a GPU dev ice with compute c a pa b i l i t y 3 . 0 or h igher . )
18 %% 2
19 %
20 u r l = http : / /www. v i s i o n . c a l t e c h . edu/Image_Datasets/Caltech101 /101 _ObjectCategories .
ta r . gz ;
21 %
22 outputFolder = f u l l f i l e ( tempdir , ca lte ch1 01 ) ; % ( )
23 i f ~ e x i s t ( outputFolder , d i r ) %
24 dis p ( Downloading 126MB Caltech101 data s et . . . ) ;
25 untar ( url , outputFolder ) ;
26 end
http://www.ma-xy.com 74 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.4 卷积神经网络 CNN
27 %% 3
28 root Fo lder = f u l l f i l e ( outputFolder , 101 _ObjectCategories ) ;
29 c a t e g o r i e s = { a ir p l a n e s , f e r r y , laptop };%
30 % ImageDatastore ImageDatastore ,
, , 使 使
31 imds = imageDatastore ( f u l l f i l e ( rootFold er , c a t eg o ri e s ) , LabelSource , foldernames )
;
32 % imd
33 t b l = countEachLabel ( imds )% 使 countEachLabel
34 % 3 67
35 minSetCount = min( t b l { : , 2} ) ; %
36 % spl itEac hL abel 使 67
37 imds = splitEa chLab el ( imds , minSetCount , randomize ) ;%imds
38 %
39 countEachLabel ( imds )
40 %
41 a i rp l a ne s = f i n d ( imds . Labels == ai r p la n e s , 1) ;
42 f e r r y = f i nd ( imds . Labels == f e r r y , 1) ;
43 laptop = fi n d ( imds . Labels == laptop , 1) ;
44 %
45 fi g u r e
46 s ubplot (1 ,3 , 1 ) ;
47 imshow( imds . F i l e s { a i rp l a ne s })
48 s ubplot (1 ,3 , 2 ) ;
49 imshow( imds . F i l e s { f e r r y })
50 s ubplot (1 ,3 , 3 ) ;
51 imshow( imds . F i l e s { laptop })
52 %% CNN (MatConvNet)
53 % Location of pret r a i n ed AlexNet
54 cnnURL = http : //www. v l f e a t . org /matconvnet/models/ beta16/imagenetca ff eal ex . mat ;
55 % St ore CNN model in a temporary f o l d e r
56 cnnMatFile = f u l l f i l e ( tempdir , imagenetca f f ealex . mat ) ;
57 i f ~ e x i s t ( cnnMatFile , f i l e ) % download only once
58 dis p ( Downloading pret r a i n ed CNN model . . . ) ;
59 websave ( cnnMatFile , cnnURL) ;
60 end
61 %% CNN
62 % Load MatConvNet network into a SeriesNetwork
63 convnet = helperImportMatConvNet ( cnnMatFile )
64 % CNN
65 convnet . Layers
66 %
67 convnet . Layers ( 1 )
68 %
69 convnet . Layers ( end )
70 % ImageNet
71 numel ( convnet . Layers ( end ) . ClassNames )
72 %% Prepr oces s Images For CNN
73 % ConvNet RGB 227by227
74 % Set the ImageDatastore ReadFcn
75 imds . ReadFcn = @( fil ena me ) readAndPreprocessImage ( f ile nam e ) ;
76 %%
77 % 30%, 70%,
http://www.ma-xy.com 75 http://www.ma-xy.com
http://www.ma-xy.com
1.4 卷积神经网络 CNN 第一章 深度学习
78 % CNN
79 [ t r a i n i ngSet , t es t S et ] = split Ea chLab el ( imds , 0 .3 , randomize ) ;
80 %%
81 %
82 w1 = convnet . Layers ( 2) . Weights ;
83 % S cal e and r e s i z e the weights f o r v i s u a l i z a t i o n
84 w1 = mat2gray (w1) ;
85 w1 = im r e s i z e (w1, 5 ) ;
86 % Display a of network weights . There are 96 s e t s of
87 % weights in the f i r s t l ayer .
88 fi g u r e
89 montage (w1)
90 t i t l e ( F ir s t co n v o l ution a l la ye r weights )
91 % blob
92 % ,
93 % ,
94 % You can e a s i l y extract fe a t u re s from one of the deeper la y e r s using the a c t i v at i o n s
method .
95 % S el e c t i n g which o f the deep l a y e r s to choose i s a desig n choice ,
96 % but t y p i c a l l y s ta r t i n g with the l a y er r i g ht be f ore the c l a s s i f i c a t i o n l a ye r i s a
good pl a ce to s t a r t .
97 % In convnet , the th i s l a y er i s named fc7 .
98 Let s e x t r a c t t r a i ni n g f e a t u re s using that l a ye r .
99 fe at ure Lay er = f c 7 ;
100 trainin g F e a t u r e s = a c ti v a t i o ns ( convnet , t r ainin g S e t , feat ureLayer , . . .
101 MiniBatchSize , 32 , OutputAs , columns ) ;
102 % , GPU MiniBatchSize 32 CNN GPU
103 % MiniBatchSize GPU
104 % , 线
105 %% Train A M u lt i c l a ss SVM C l a s s i f i e r Using CNN Features
106 % Get tr a i n in g l a b e l s from the tra i n i n gSe t
107 t r a i n i n g L a b e ls = t r ai nin g S e t . Labels ;
108 % Train mu l t ic l a s s SVM c l a s s i f i e r us ing a f a s t l i n e a r so l v e r , and s e t
109 % ObservationsIn to columns to match the arrangement used f o r tr a i ni n g
110 % f ea t ur e s .
111 c l a s s i f i e r = f i t c e c o c ( tra i nin g Fea t ure s , tr a i ning L a bels , . . .
112 Learners , Linear , Coding , on e v s a ll , ObservationsIn , columns ) ;
113 %%
114 % Extract t e s t f e a t u r es usin g the CNN
115 testFe a t u r e s = a c t i v at i o n s ( convnet , t e s tSet , feature Layer , MiniBatchSize ,3 2) ;
116 % Pass CNN image f e a tu r e s to tr a i n ed c l a s s i f i e r
117 pr e dic t edL a bel s = p r e d i c t ( c l a s s i f i e r , te s t F e a t u res ) ;
118 % Get the known l a b e l s
119 t e s t L a b el s = te s tS e t . Labels ;
120 % Tabulate the r e s u l t s using a con fus ion matrix .
121 confMat = confusionmat ( t e s tLa b e ls , p redi cted Labe l s ) ;
122 % Convert conf usi on matrix in t o perc entag e form
123 confMat = bsxfun ( @rdivide , confMat , sum( confMat , 2 ) )
124 % Display the mean accuracy
125 mean( diag ( confMat ) )
126 %%
127 newImage = f u l l f i l e ( rootFold er , a ir p l a ne s , image_0690 . jpg ) ;
128 % Prepr oces s the images as r e q uire d f o r the CNN
http://www.ma-xy.com 76 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.5 循环神经网络 RNN
129 img = readAndPreprocessImage (newImage ) ;
130 % Extract image fe a t u r e s using the CNN
131 imageFeatures = a c t i va t i o n s ( convnet , img , featur eLa yer ) ;
132 % Make a p r e d icti o n using the c l a s s i f i e r
133 l a b e l = p re d ic t ( c l a s s i f i e r , imageFeatures )
134
1.5 循环神经网络 RNN
todo: 这是很有必要补充的一章!
´
1.6 对抗生成网络 GAN
1.6.1 引言
对于生成模型而言,我们的任务是拟合 (估计) 样本分布,并从分布中生成/采样样本。假设
你已经有了 GAN 的思想:用生成器 G 生成假样本,将假样本和真样本送进判别器 D 中进行真
假判别。判别器 D 目标是使假样本被判别为真的概率尽可能小,真样本被判别为真的概率尽
可能大;生成器 G 的目标是使假样本为真的概率尽可能大。判别器 D 生成器 G 交替进行训
练,每训练 1 G 要训练 k D
现在,我们来考虑这样的生成器 G(generator)
1. 是否需要训练判别器?我们可以将判别器的判别水平提前固定,只有生成器生成的图片/
本能骗过判别器即可。就像一个学生和一个美术老师一样,老师要求学生画一个狮子,
学生从未见过狮子,于是他随便画了个,交给老师,老师说这个不是,狮子尾巴有个球,
哪哪要改 (学生见过其它动物,未见过狮子,并且老师也有一定的知识,老师可以说狮子和
……很像),于是学生回去改,再交再改直到老师/判别器满意为止。
2. 判别器和生成器时训练。我们先将判别器训练到一定的水平,然后再开始生成样本,判别
器的目标是使生成样本属于已有样本的概率最小 (在生成器固定的情况下,使概率最小)
生成器的目标是使概率最大。老师会通过学生提交的作品提高自己的要求/判别率 (无论生
成器给出一个什么样的样本,我都要给它判成假的,如果判别效果不好,我就去修改判
器。生成器要让最好的判别效果最差)
3. 多个判别器。我们设定多个判别器作为老师 (判别器判别率固定也可,渐渐提高也可),然
后让生成器去生成样本,要让多个导师都认可才可以。这是一个什么问题?生成器是样
分布的拟和吗?
设有生成 G 产生的样本分布函数为 P
g
,密度函数为 p
g
,假样本 x P
g
;真实样本分
布函数为 P
r
,密度函数为 p
r
,真样本为 x P
r
。我们现在是 P
g
中采样一个 x,并于真实样
´
稿子已经有了,我们正在想要不要添加进来。
http://www.ma-xy.com 77 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
本进行判别,即将 P
g
产生的 x P
r
产生的 x 输入到判别器中进行判别。如果判别 D 不能
辨识真伪,我们就说在 D 下,P
g
P
r
的估计。
我们知道,一般的生成器 G 是一个生成网络,或者说 P
g
是没有显示表达式的,比如 P
g
=
N(µ, σ
2
)回忆一下概率中的采样过程:x = F
1
(z), z U[0, 1]其中,F x 的分布函数,F
1
F 的逆,z 是均匀分布 U 的样本。这就是从分 F 采样 x 的过程,注意到这种方法要 F
可逆 (当然还有许多其它的采样方法,这里不做详细说明)。如果事先不知道 F 的具体形式,我
们该怎么办呢?简单,毕竟我们的生成器 G 用的神经网络嘛,我们不用神经网络来求 F 而是
直接表示 F
1
。用神经网络 (生成器 G) 表示 F
1
,于是有
x = G(z) z U[0, 1]
这里的 x 是生成 G 带来的样本 x P
g
。如果 G 是什么,G P
1
g
,即 G 是估计分布
P
g
的逆。至此,已经有了真实样本 x、真实分布 P
r
(P
r
可以用样本来估计) 以及生成器 G 产生
的假样本 x 和估计分布 P
g
(P
g
还可以用假样本估计)
现在考虑能用这两个样本数据 x P
g
, x P
r
来做什么。最终目标是通过二者来说明生
(生成网)G 的好坏,以及如何指导我们构建好的生成器。一个直观的想法是通过 P
g
P
r
的距离/散度来评价 G 的好坏。
不考虑判别器 D
先不 GAN 中的别器 D(GAN D 识真假样 (x, x)以此到更 G)
x 来自 P
r
的样本数据,x = {x
1
, x
2
, . . . , x
n
} n 个样本;x P
g
是生成 G 带来的
样本 (假设假样本有许多个)¬如果 x P
r
是一个随机变量,我们会问来自 P
g
的一个假样本
x P
g
是否在真实样本分布 P
r
内?如果 x P
r
是一随机向量,我们会问来自 P
g
的一个假样
x P
g
是否在真实样本分 P
r
内?®如果 x P
r
是一随机矩阵 (图片),我们会问来自 P
g
的一个假样本 x P
g
是否在真实样本分布 P
r
内?
明显的一个问题是:我们不能问单一的假样本 x P
g
是否在 P
r
内,只能看到 x P
g
P
r
内的概率值。我们希望假样本
x
P
g
的概率和在
P
r
的概率值相等或者差不多,
P
g
P
r
相似。这又回到了 P
r
, P
g
相似程度的度量,如图 (
1.65)(a)(b)
所示
1.65: 单一样本在 2 个分布中的概率值比较图
当然,如果从单一样本的角度来看, P
g
中按概率抽取一个样本 x
希望 x
E
xP
r
(x)
接近,或者更近一步的说,我们希望两个总体 P
r
, P
g
的均值相等。这变成了两总体均值相等检验
问题,其示意图如图 (1.66) 所示
http://www.ma-xy.com 78 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.66: 总体均值是否相等示意图
考虑固定的判别器 D
现在,对于真假样本 x P
r
, x P
g
考虑一个判别器 Ditector并且,这里的判别器 D
固定的, D 经训练好了,在训练过程 D 再训练。而 GAN D 需要训练的。
们从 P
g
中生成了 n 个样本 {x
i
}
n
i=1
P
r
中产生 n 个样本 {x
i
}
n
i=1
将二者混合在一起,输入
D 中,对于每一个样本 xD 都会给出 x 被判别为真的概率,记这个判别概率为 D(x)(D(x)
是样本 x 被判为来 P
r
的概率)。自然希望 G使 G 来的样本 x P
g
被判为 P
r
的概率
D(x P
g
) 尽可能高 (其实,没有必要将 x P
r
输入到判别器 D ),即
max
G
n
i=1
D(x
i
)
s.t. x
i
P
g
, i = 1, 2, . . . , n
D 中含有 P
r
的特征,当 G 能够欺骗 D 时,说明 P
g
也有了 P
r
的特征,进一步 x P
g
可以充
P
r
的样本。我们将上面的表达式写成平均值的形式,有
max
G
1
n
n
i=1
D(x
i
), x
i
P
g
上式等价于
max
G
E
xP
g
D(x)
等价于
min
G
E
xP
g
[1 D(x)]
当然,我们可以将 D(x) 的形式进行变换,比如 log D(x) 或者 log(1 D(x))。求解上面的
优化问题,最终会得到一个 G,我们称 G 是在 D 下的生成器,P
g
是在 D 下的 P
r
的估计。
在这一部分中,是在 D 的判别下让 x 使 P
r
的概率最大。回到前一部分,对于一个给定的
x P
g
,我们也会有 x P
r
中的概率,即假样本 x 在真分布 P
r
中的概率,如图 (1.67) 所示
1.67:
假样本在真分布的概率示意图
http://www.ma-xy.com 79 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
于是也可以设定目标
max
G
E
xp
g
P
r
(x)
其中:P
r
(x) 表示样本 x P
g
P
r
的概率。这里的 P
r
就充当了判别器 D,而判别器 D
了极大似然估计中的似然函数 (样本 x P
g
P
r
或者 D 下出现的概率最大)。所以,在这一部
分中,还可以对 G 设置联合概率最大的目标,如下
max
G
D(x)
xP
g
= D(x
1
)D(x
2
) ···D(x
n
)
max
G
P
r
(x)
x
1
,...,x
n
iid
P
g
= P
r
(x
1
)P
r
(x
2
) ···P
r
(x
n
)
注意到,生成器 G 的好坏与 D 的判别率有直接关系。
可变动的判别器 D
在上一部分,我们设定判别器 D 是固定的,现在,假设在对真假样本 (x, x) 进行判别时,D
也在不断的学习。
在每次对 G 进行训练/迭代之前,我们都训练一下 D。直观的说:第 t 次迭代时,从 P
g
产生了 n 样本,通 D 判别后,找到了 G 修正方 (梯度),然 G 更新为 G t + 1
次迭代时,从 P
g
中再次产生 n 个新样本,问题是:还用那个老旧的 D 来做判别吗?不!我们
用一个新 D 判别 (可以找其它的判别模型行判别,还可以联合别,这个之后再
)这里不打算换用其它类型的判别器,仍然在 D 上做,但要求 t + 1 时刻的 D 更准确。我们
需要训练 D要训练 D 则需要用于训练的样本数据,这里有两种方案:1 种是样本不变,1 种是
x P
g
加入到 D 的训练当中。采用第二种方案,将 x P
g
的标签值设置 1 0,表示
“假”,然后训练 D 即可。
当然,在 GAN 中,作者给 D 的训练设置了目标:要求 D 使 x P
r
被判为真样本的概率
D(x P
r
) 尽可能大,x P
g
被判为真样本的概率 D(x P
g
) 尽可能小,即
max
n
i=1
D(x
i
)
x
1
,...,x
n
P
r
min
n
i=1
D(x
i
)
x
1
,...,x
n
P
g
将上式改为均值形式,有
max
D
E
xP
r
D(x)
min
D
E
xP
g
D(x)
其中,第二个目标等价于
max
D
E
xP
g
[1
D
(
x
)]
http://www.ma-xy.com 80 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
将上述两个目标合并,有
max
D
E
xP
r
[D(x)] + E
xP
g
[1 D(x)]
捋一下:当前时刻 t 更新完 G 之后 G
t
t + 1 时刻,要先训练一会儿 D(得到 D
t+1
)
后再用新的 D
t+1
来进行判别,求 G 的更新方向 G
t+1
= G
t
+ G
t
。对于 G,我们的目标是
min
G
E
xP
g
[1 D(x)]
对于 D,目标是
max
D
E
xP
r
[D(x)] + E
xP
g
[1 D(x)]
将上述两个目标合并,形成二层规划或者最小最大规划,有
min
G
max
D
E
xP
r
[D(x)] + E
xP
g
[1 D(x)] (1.3)
1.6.2 Vanilla GAN
原始 GAN 模型
GAN 原文14中,作者将上述目标 (1.3) 的判别概率 D(x) 变为了 log D(x),有
min
G
max
D
V (D, G) = E
xP
r
[log D(x)] + E
xP
g
[log(1 D(x))]
再将 x P
g
改写为 x = G(z), z U[0, 1],将 U [0, 1] 扩展为 P
z
,有
min
G
max
D
V (D, G) = E
xP
r
[log D(x)] + E
zP
z
[log(1 D(G(z)))] (1.4)
下面来分析一下 GAN 的优化模型 (1.4)。对于 min
G
max
D
¬先固定 G 来看 max
D
定理 (最优判别器 D) G 固定的条件下,最优判别器 D
µ
D
G
(x) =
p
r
(x)
p
r
(x) + p
g
(x)
证明 给定 G,训练 D 就是求解
max
D
V (G, D) = E
xP
r
[log D(x)] + E
zP
z
[log(1 D(G(z)))]
V (G, D) =
x
p
r
(x) log D(x)dx +
z
p
z
(z) log(1 D(G(z)))dz
=
x
p
r
(x) log D(x) + p
g
(x) log(1 D(x))dx
对于函数 a log(y) + b log(1 y)(a, b) R
2
/{0, 0} [0, 1] 处取得最大值
a
a+b
µ
注意,这里是密度函数 p
g
, p
r
http://www.ma-xy.com 81 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
在得到最优判别器 D
的情况下,来求 min
G
V (G, D
)。我们先 D
带入 V (G, D)
V (G, D
) = E
xP
r
[log D
(x)] + E
zP
z
[log(1 D
(G(z)))]
= E
xP
r
[log D
(x)] + E
xP
g
[log(1 D
(x))]
= E
xP
r
log
p
r
(x)
p
r
(x) + p
g
(x)
+ E
xP
g
log
p
g
(x)
p
r
(x) + p
g
(x)
C(G) = V (G, D
),则要求 min
G
C(G)
定理 当且仅当 p
r
= p
g
时,C(G) 有全局极小点,且 C(G) 在此点处的值为 log 4
证明 考虑 p
g
= p
r
,则 D
(x) =
1
2
,于是
C(G) = log
1
2
+ log
1
2
= log 4
= E
xP
r
(log 2) + E
xP
g
(log 2)
为了表明 p
g
= p
r
是最小点,log 4 是最小值,我们将 C(G) 减去 log 4如果 C(G) + log 4 0
则表明 C(G) 的最小值为 log 4
C(G) = log 4 + KL
P
r
P
r
+ P
g
2
+ KL
P
g
P
r
+ P
g
2
= log 4 + 2JSD(P
r
||P
g
)
JSD 散度 (Jensen Shannon Dirergence)
可知,当且仅当 p
r
= p
g
JSD = 0否则 JSD> 0
于是 C(G) 0,当且仅当 p
r
= p
g
时,等号成立。
回看上面的证明,我们会发现, D 给定后, G 就是求 min
G
C(G)。而 C(G) 去掉他的
极小值后,就是一个 P
r
, P
g
JSD 散度,所以,我们求 G 的本质是求
min
G
JSD(P
r
||P
g
) = KL
P
r
P
r
+ P
g
2
+ KL
P
G
P
r
+ P
g
2
自然会考虑能否为 G 设置其他的散度或距离 (D 的目标基本不变) ,这将在后面的 f-GAN 中进
行详细说明。下面,给出 GAN 的程序。
GAN 算法与程序
GAN 的伪代码如 (4) 所示
GAN 模型的 TensorFlow
·¸
程序如下,更详细的可以参考
¹
For distributions P and Q of a continuous random variable, the KullbackLeibler divergence is dened to be the integral
KL(P ||Q) =
−∞
p(x) log
p(x)
q(x)
dx
wherepandqdenote the densities ofP andQ.
·
http://www.tensory.cn/
¸
https://www.tensorow.org/
¹
https://github.com/wiseodd/generative-models/tree/master/GAN
http://www.ma-xy.com 82 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
算法 4 Minibatch stochastic gradient descent training of GAN
1: 初始化:P
r
的真实样本 {x
i
}
n
i=1
(即原有的样本数据)迭代步 tt
m
ax生成器 G 判别器 D
G D 的参数为 θ
g
, θ
d
,每迭代步 t 下,判别器训练次数 k(即在一次更新 G 下,要更新
k D),批量大小 m
2: for t = 1, 2, . . . , t
max
do
3: // 更新 D
4: for k steps do
5: sample minibatch of m noise sample {z
(1)
, z
(2)
, . . . , z
(m)
} from P
z
;生成 m 假样本
x
(1)
= G(z
(1)
), x
(2)
= G(z
(2)
), . . . , x
(m)
= G(z
(m)
)
6: sample minibatch of m example {x
(1)
, x
(2)
, . . . , x
(m)
} from P
r
即从原始数据 {x
i
}
n
i=1
中挑出 m 个。
7: 2m 个真假样本 x
(i)
输入到判别器 D,得到各样本属于真实分布的概率 D(x
(i)
)
max
D
V (D, G) = E
xP
r
[log D(x)] + E
zP
z
[log(1 D(G(z)))]
8: D 的梯度
θ
d
1
m
m
i=1
[log D
t
(x
(i)
)] +
θ
d
1
m
m
i=1
[log(1 D
t
(G
t
(z
(i)
)))]
=
θ
d
1
m
m
i=1
[log D
t
(x
(i)
) + log(1 D
t
(G
t
(z
(i)
)))]
9: D
t+1
= D
t
+
θ
d
10: end for
11: // 更新 G
12: sample minibatch of m noise sample {z
(1)
, z
(2)
, . . . , z
(m)
} from P
z
13: 计算梯度
θ
g
1
m
m
i=1
log(1 D
t+1
(G(z
(i)
)))
14: 更新 G
G
t+1
= G
t
+
θ
g
15: end for
http://www.ma-xy.com 83 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 de f x a v i e r_init ( s i z e ) :
8 in_dim = s i z e [ 0 ]
9 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
10 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
11 X = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , 784])
12 D_W1 = t f . Variable ( x a v i e r _ i n i t ( [ 784 , 128]) )
13 D_b1 = t f . Variable ( t f . z e r o s ( shape =[128]) )
14 D_W2 = t f . Variable ( x a v i e r _ i n i t ( [ 128 , 1 ] ) )
15 D_b2 = t f . Variable ( t f . z e r o s ( shape = [1] ) )
16 theta_D = [D_W1, D_W2, D_b1, D_b2]
17 Z = t f . p l aceh o l d e r ( t f . f l o a t 3 2 , shape=[None , 100])
18 G_W1 = t f . Varia bl e ( x a v i e r _ i nit ( [ 1 00 , 12 8] ) )
19 G_b1 = t f . Variable ( t f . z e r o s ( shape =[ 12 8]) )
20 G_W2 = t f . Varia bl e ( x a v i e r _ i nit ( [ 1 28 , 78 4] ) )
21 G_b2 = t f . Variable ( t f . z e r o s ( shape =[ 78 4]) )
22 theta_G = [G_W1, G_W2, G_b1, G_b2]
23 de f sample_Z (m, n) :
24 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
25 de f ge ner ator ( z ) :
26 G_h1 = t f . nn . re l u ( t f . matmul( z , G_W1) + G_b1)
27 G_log_prob = t f . matmul(G_h1, G_W2) + G_b2
28 G_prob = t f . nn . sigmoid (G_log_prob)
29 ret ur n G_prob
30 de f d i s c r i m in a t or (x) :
31 D_h1 = t f . nn . r e lu ( t f . matmul(x , D_W1) + D_b1)
32 D_logit = t f . matmul(D_h1, D_W2) + D_b2
33 D_prob = t f . nn . sigmoid ( D_logit )
34 ret ur n D_prob, D_logit
35 de f p l o t ( samples ) :
36 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
37 gs = g r idspe c . GridSpec (4 , 4)
38 gs . update ( wspace =0.05 , hspace =0.05)
39 f o r i , sample in enumerate ( samples ) :
40 ax = p l t . subplot ( gs [ i ] )
41 p l t . a x i s ( o f f )
42 ax . s e t _x t i c kla b e l s ( [ ] )
43 ax . s e t _y t i c kla b e l s ( [ ] )
44 ax . set_aspect ( equ al )
45 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
46 ret ur n f i g
47 G_sample = ge ner ato r (Z)
48 D_real , D_logit_real = d i s c r im i n a to r (X)
49 D_fake , D_logit_fake = d i s cr i m in a t o r (G_sample)
50 # D_loss = t f . reduce_mean( t f . log ( D_real ) + t f . l o g ( 1 . D_fake ) )
51 # G_loss = t f . reduce_mean ( t f . l o g ( D_fake) )
52 # Al t ernat i v e l o s s e s :
53 #
http://www.ma-xy.com 84 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
54 D_loss_real = t f . reduce_mean( t f . nn . sigmoid_cross_entropy_with_logits ( l o g i t s=
D_logit_real , l a b e l s=t f . on es_like ( D_logit_real ) ) )
55 D_loss_fake = t f . reduce_mean( t f . nn . sigmoid_cross_entropy_with_logits ( l o g i t s=
D_logit_fake , l a b e l s=t f . zeros_li k e ( D_logit_fake ) ) )
56 D_loss = D_loss_real + D_loss_fake
57 G_loss = t f . reduce_mean ( t f . nn . sigmoid_cross_entropy_with_logits ( l o g i t s=D_logit_fake ,
l a b e l s=t f . one s_ like ( D_logit_fake ) ) )
58 D_solver = t f . t r a i n . AdamOptimizer ( ) . minimize ( D_loss , v a r _ l i s t=theta_D )
59 G_solver = t f . t ra i n . AdamOptimizer ( ) . minimize ( G_loss , v a r _ li s t=theta_G)
60 mb_size = 128
61 Z_dim = 100
62 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
63 s e s s = t f . Ses s i on ( )
64 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
65 i f not os . path . e x i s t s ( out/ ) :
66 os . makedirs ( out/ )
67 i = 0
68 f o r i t in range (1000000) :
69 i f i t % 1000 == 0:
70 samples = s e s s . run (G_sample , feed_ di ct={Z : sample_Z(1 6 , Z_dim) })
71
72 f i g = p l o t ( samples )
73 p l t . s a v e f i g ( out /{ }.png . format ( s t r ( i ) . z f i l l (3 ) ) , bbox_inches= t ig h t )
74 i += 1
75 p l t . c l o s e ( f i g )
76 X_mb, _ = mnist . tr a i n . next_batch ( mb_size )
77 _, D_loss_curr = se s s . run ( [ D_solver , D_loss ] , feed_d ic t={X: X_mb, Z : sample_Z(
mb_size , Z_dim) })
78 _, G_loss_curr = s e s s . run ( [ G_solver , G_loss ] , feed_dict={Z : sample_Z( mb_size ,
Z_dim) })
79 i f i t % 1000 == 0:
80 p r i n t ( I t e r : {} . format ( i t ) )
81 p r i n t ( ’D l o s s : { : . 4 } . format ( D_loss_curr ) )
82 p r i n t ( G_loss : { : . 4 } . format ( G_loss_curr ) )
83 p r i n t ( )
84
1.6.3 f-GAN
文献25中介绍了一些“可行” divergence distance(注意:距离和散度不是同一概念,
离是对称的而散度不是),并且 Sebastian 等也从变分角度给出了设置判别器 D 的原因。
f-散度族
KL 距离可能是最为常用的散度了,它用于衡量 2 个概率分布 P
r
, P
g
的不同程度。现在,
们来介绍一大类散度:f-散度族。令 x 为随机变量,X 是其取值域 (domain)f -散度定义为
D
f
(P
r
||P
g
) =
X
p
g
(x)f
p
r
(x)
p
g
(x)
dx
http://www.ma-xy.com 85 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
其中:f : R
+
R 是一个凸的单调函数,满足 f (1) = 0f 不同,最终的距离/散度 D
f
(P
r
||P
g
)
就不同。常见的 f 以及由其形成的 D
f
(P
r
||P
g
) 如图 (1.68) 所示
1.68: f 散度族
其中:u f 的自变量,dom
f
表示 f 的自变量域,即 u 的域。下面,我们来看 f 散度的
变分估计。
Veriational Estimation of f-divergence
GAN 中求解 G 时,使用上面介绍的 f 散度,目标变为求 G 使 D
f
(P
r
||P
g
) 最小,有
min
G
D
f
(P
r
||P
g
) =
X
p
g
(x)f
p
r
(x)
p
g
(x)
dx
此时 G 不具数,因问题关于 P
g
的变题。Nguyen 只有
P
g
, P
r
( f ) 时,f-divergence 的一个一般化的变分估计方法。下面,我们将会用变分估计方法来
求解 G ( P
g
参数化后求参数 θ
g
)为了完整,我们给出 Nguyan 散度估计的一个 self-containde
对于任意一个凸的单调函数 f ,有一个凸共轭 (conjugate) 函数 f
也被称为 fenchel 共轭。
定义为
f
(t) = sup
udom
f
{ut f(u)}
并且,f
也是凸的单调的。对于这对函数 (f, f
),有 f
∗∗
= f。因此,可以将 f 表示为
f(u) = sup
tdom
f
{tu f
(t)}
http://www.ma-xy.com 86 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
f(u) 带入到 D
f
(P
r
||P
g
) 中,有 (这里的 u
p
r
(x)
p
g
(x)
)
D
f
(P
r
||P
g
) =
X
p
g
(x)f
p
r
(x)
p
g
(x)
dx
=
X
p
g
(x) sup
tdom
f
t
p
r
(x)
p
g
(x)
f
(t)
dx
sup
tdom
f
X
p
g
(x)t
p
r
(x)
p
g
(x)
p
g
(x)f
(t)dx Jensen 不等式
sup
T Γ
X
p
r
(x)T (x)dx
X
p
g
(x)f
(T (x))dx
= sup
T Γ
E
xP
r
[T (x)] E
xP
g
[f
(T (x))]
其中:T (x) : X R X 上的函数,Γ T 的任意一个函数集,且是无穷维函数空间 (T 的所
有可能) 的一个小部分 (subset),因此有第二个不等号。
可以发现,这里的 T 就相当于 GAN 中的分类器 D计算上式得变分下界,我们发现,在可
能的函数集 Γ 中,the bound is tight for
T
(x) = f
p
r
(x)
p
g
(x)
其中:f
f 的一阶导。这个情况可以用于指导我们如何选择 f 以及设计函数集 Γ例如:KL
散度当于 f(u) = log(u)其下 T
(x) =
p
g
(x)
p
r
(x)
,图 (1.68) 了一 f 度,
(1.69) 给出了共轭 f
以及 f
的域 dom
f
1.69: f 散度的共轭
上述问题仍然是一个泛函 (变分) 问题
min
P
g
sup
T
V (P
r
, T ) = E
xP
r
[T (x)] E
xP
g
[f
(T (x))]
下面来处理这个泛函问题。像一般的泛函问题那样,将函数问题参数化,将求函数问题变为求参
数问题。将两个函数 P
g
G T D 参数化,设其参数为 θ
g
, θ
d
,于是有
min
θ
g
max
θ
d
F (θ
g
, θ
d
) = E
xP
r
[T
θ
d
(x)] E
xP
θ
g
[f
(T
θ
d
(x))]
http://www.ma-xy.com 87 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
为了书写方便,令 (θ
g
, θ
d
) (θ, w)T
w
(x) = g
f
(V
w
(x)),于是上述目标变为
min
θ
max
w
F (θ, w) = E
xP
r
[g
f
(V
w
(x))] + E
xP
g
[f
(g
f
V
w
(x))]
其中:V
w
: X R 的输出 R 不存在任何限制,g
f
: R dom
f
是一个输出激活函数。
f-GAN 的程序
f-GAN TensorFlow 程序如下
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 mb_size = 32
8 X_dim = 784
9 z_dim = 64
10 h_dim = 128
11 l r = 1e3
12 d_steps = 3
13 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
14 de f p l o t ( samples ) :
15 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
16 gs = g r idspe c . GridSpec (4 , 4)
17 gs . update ( wspace =0.05 , hspace =0.05)
18 f o r i , sample in enumerate ( samples ) :
19 ax = p l t . subplot ( gs [ i ] )
20 p l t . a x i s ( o f f )
21 ax . s e t _x t i c kla b e l s ( [ ] )
22 ax . s e t _y t i c kla b e l s ( [ ] )
23 ax . set_aspect ( equ al )
24 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
25 ret ur n f i g
26 de f x a v i e r_init ( s i z e ) :
27 in_dim = s i z e [ 0 ]
28 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
29 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
30 X = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
31 z = t f . p l aceho l d e r ( t f . f l o a t 3 2 , shape=[None , z_dim ] )
32 D_W1 = t f . Variabl e ( x a v i e r _ i n it ( [ X_dim, h_dim ] ) )
33 D_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim] ) )
34 D_W2 = t f . Variabl e ( x a v i e r _ i n it ( [ h_dim, 1 ] ) )
35 D_b2 = t f . Variable ( t f . z e r o s ( shape = [1] ) )
36 G_W1 = t f . Varia bl e ( x a v i e r _ i nit ( [ z_dim , h_dim ] ) )
37 G_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim ] ) )
38 G_W2 = t f . Varia bl e ( x a v i e r _ i nit ( [ h_dim, X_dim] ) )
39 G_b2 = t f . Variable ( t f . z e r o s ( shape=[X_dim] ) )
40 theta_G = [G_W1, G_W2, G_b1, G_b2]
41 theta_D = [D_W1, D_W2, D_b1, D_b2]
42 de f sample_z (m, n) :
43 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
http://www.ma-xy.com 88 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
44 de f ge ner ator ( z ) :
45 G_h1 = t f . nn . re l u ( t f . matmul( z , G_W1) + G_b1)
46 G_log_prob = t f . matmul(G_h1, G_W2) + G_b2
47 G_prob = t f . nn . sigmoid (G_log_prob)
48 ret ur n G_prob
49 de f d i s c r i m in a t or (x) :
50 D_h1 = t f . nn . r e lu ( t f . matmul(x , D_W1) + D_b1)
51 out = t f . matmul(D_h1, D_W2) + D_b2
52 ret ur n out
53 G_sample = ge ner ato r ( z )
54 D_real = di s c r i m in a t or (X)
55 D_fake = d i s c ri m i n at o r (G_sample)
56 # Uncomment D_loss and i t s r e s p e c ti v e G_loss o f your c hoic e
57 #
58 Total V ar ia tion
59 # D_loss = (t f . reduce_mean ( 0 .5 * t f . nn . tanh ( D_real ) )
60 # t f . reduce_mean ( 0. 5 * t f . nn . tanh (D_fake ) ) )
61 # G_loss = t f . reduce_mean ( 0 . 5 * t f . nn . tanh ( D_fake) )
62 Forward KL
63 # D_loss = (t f . reduce_mean (D_real ) t f . reduce_mean ( t f . exp ( D_fake 1) ) )
64 # G_loss = t f . reduce_mean ( t f . exp ( D_fake 1) )
65 Reverse KL
66 # D_loss = (t f . reduce_mean(t f . exp ( D_real ) ) t f . reduce_mean(1 D_fake) )
67 # G_loss = t f . reduce_mean(1 D_fake )
68 Pearson Chisquared
69 D_loss = ( t f . reduce_mean ( D_real ) t f . reduce_mean (0 . 25* D_fake**2 + D_fake) )
70 G_loss = t f . reduce_mean ( 0 .25 * D_fake**2 + D_fake)
71 Squared He l l i n ge r
72 # D_loss = (t f . reduce_mean (1 t f . exp ( D_real ) )
73 # t f . reduce_mean ( (1 t f . exp (D_fake ) ) / ( t f . exp ( D_fake) ) ) )
74 # G_loss = t f . reduce_mean (( 1 t f . exp ( D_fake) ) / ( t f . exp (D_fake ) ) )
75
76 D_solver = ( t f . t r ai n . AdamOptimizer ( l ea rni ng_ rat e=l r )
77 . minimize ( D_loss , v a r _ l i s t=theta_D ) )
78 G_solver = ( t f . t r a i n . AdamOptimizer( lear nin g_r ate=l r )
79 . minimize ( G_loss , v a r _l i st=theta_G ) )
80 s e s s = t f . Ses s i on ( )
81 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
82 i f not os . path . e x i s t s ( out/ ) :
83 os . makedirs ( out/ )
84 i = 0
85 f o r i t in range (1000000) :
86 X_mb, _ = mnist . tr a i n . next_batch ( mb_size )
87 z_mb = sample_z ( mb_size , z_dim)
88 _, D_loss_curr = se s s . run ( [ D_solver , D_loss ] , feed_d ic t={X: X_mb, z : z_mb})
89 _, G_loss_curr = s e s s . run ( [ G_solver , G_loss ] , feed_dict={z : z_mb})
90 i f i t % 1000 == 0:
91 p r i n t ( I t e r : {}; D_loss : { : . 4 } ; G_loss : { : . 4 }
92 . format ( i t , D_loss_curr , G_loss_curr ) )
93 samples = s e s s . run (G_sample , feed_ di ct={z : sample_z (1 6 , z_dim) })
94 f i g = p l o t ( samples )
95 p l t . s a v e f i g ( out /{ }.png
96 . format ( s t r ( i ) . z f i l l ( 3) ) , bbox_inches= t i g ht )
http://www.ma-xy.com 89 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
97 i += 1
98 p l t . c l o s e ( f i g )
99
1.6.4 Conditional GAN
回顾前面的 GAN在生成假样本 x P
g
时, x = G(z), z U[0, 1]即生成器 G 的网络
输入仅是随机值 z现在,考虑能否将其它信息作为 G 的输入来生成假样本 x即生成网络的输
z 变为其它形式 (还可以考虑 G 在生成 x 的同时还生成其它信息,这个后面讨论)可以尝试
z N 来替代原本的 z U ,这是行的通的,并且也可以解释的通 (下面解释)。但是,即便
z fGAN 仍然是一个无指导性的生成:训练后的 GAN 只能生成 room 图片,而不能根据
要求生成相应的图片 (比如要求 GAN 生成狗的图片,再生成猫的图片)
现在,考虑这样一种生成问题:用同一个 GAN生成数字 1数字 2···即我们来指导 GAN
生成哪些事物,称这些指导为指导信息。我们将指导信息作为输入来生成假样本 x
在介绍 CGAN 之前,先来考虑一般的图像回归/分类问题 X Y ,构建回归器
y = wϕ(x) + z
z N (0, σ
2
)
更一般的,记为 y = φ(x) + z既然可以从 X Y 我们同样可以用神经网络来构建 Y X
映射,有
x = G(y) + z
这里的 y 即为图像的标签信息。在图像分类任务中,我们将图片 x 作为输入,标签值 y 作为输
出,构建 X Y 的映射,现在反过来, y 为输入,x 为输出,构建 Y X 的映射以生成图
(一个很普通的问题是:当 y z 的维度很低时,要生成高维 x 是不易的)
要从 x = G(y) + z 采样 (y = φ(x) + z 中采是一样的)们都只需取一 y 形成
G(y)再生成多个随机值 z G(y) 和多个随机值 z 相加,求平均即可, x
i
=
j
G(y
i
) + z
ij
p
g
(x) =
z
p(x, z)dz
=
z
p(x|z)p(z)dz
=
z
p(x|z)p(z)
更一般的24,在输入层中加入噪声 z,如图 (1.70) 所示
http://www.ma-xy.com 90 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.70: CGAN 生成网络示意图
x = G(z, y)。注意,这里和前 DAE 中添加噪声的方法有所不同,DAE x 中添加噪
声,形成 ˜x = x + z,而这里是将 z 作为输入的一部分。
在判别器 D 中, y 为输入,x 作为输入进行判别,D(x|y) y 给定后,入样
x 为真的概率。这里有一个问题:判别器 D 的输入和输出是什么?¬输入为标签值 y输出为
p(x|y)表示输入 y 输出为 x 的条件概率。输入是 (y, x)输出是 D(x|y)表示输入 y, x 为真
的概率。如果是第一种方法, G D 作的任务是一样的。采用第二种方法,CGAN 的网络结
构图如图 (1.71) 所示
1.71: CGAN 网络结构图
可以构建如下条件 GAN(CGAN) 的目标
min
G
max
D
V (D, G) = E
xP
r
[log D(x|y)] + E
zP
z
[log(1 D(x|y))]
= E
xP
r
[log D(x|y)] + E
zP
z
[log(1 D(G(z, y)|y))]
值得的是,CGAN 中的 z 可以是任噪声,局限匀噪 z U [0, 1]CGAN
TensorFolw 程序如下
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
8 mb_size = 64
9 Z_dim = 100
10 X_dim = mnist . tr a i n . images . shape [ 1 ]
11 y_dim = mnist . t r a in . l a b e l s . shape [ 1 ]
12 h_dim = 128
http://www.ma-xy.com 91 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
13 de f x a v i e r_init ( s i z e ) :
14 in_dim = s i z e [ 0 ]
15 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
16 return t f . random_normal( shape=si z e , stddev=xavier_stddev )
17 Disc rim in ato r Net model
18 X = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , 784])
19 y = t f . p l a c ehold e r ( t f . float 3 2 , shape=[None , y_dim ] )
20 D_W1 = t f . Va riable ( x a v i e r _ i n i t ( [ X_dim + y_dim, h_dim ] ) )
21 D_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim] ) )
22 D_W2 = t f . Va riable ( x a v i e r _ i n i t ( [ h_dim , 1 ] ) )
23 D_b2 = t f . Variable ( t f . z e r o s ( shape = [1] ) )
24 theta_D = [D_W1, D_W2, D_b1, D_b2]
25 de f d i s c r i m in a t or (x , y ) :
26 i nputs = t f . concat ( a xi s =1, va lue s =[x , y ] )
27 D_h1 = t f . nn . re l u ( t f . matmul( inputs , D_W1) + D_b1)
28 D_logit = t f . matmul(D_h1, D_W2) + D_b2
29 D_prob = t f . nn . sigmoid ( D_logit )
30 return D_prob , D_logit
31 Generator Net model
32 Z = t f . plac e h o l der ( t f . f l o a t 3 2 , shape=[None , Z_dim ] )
33 G_W1 = t f . Variable ( xavi e r _ i n i t ( [ Z_dim + y_dim , h_dim ] ) )
34 G_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim ] ) )
35 G_W2 = t f . Variable ( xavi e r _ i n i t ( [ h_dim, X_dim] ) )
36 G_b2 = t f . Variable ( t f . z e r o s ( shape=[X_dim] ) )
37 theta_G = [G_W1, G_W2, G_b1, G_b2]
38 de f ge ner ator ( z , y) :
39 i nputs = t f . concat ( a xi s =1, va lue s =[z , y ] )
40 G_h1 = t f . nn . r e l u ( t f . matmul( inputs , G_W1) + G_b1)
41 G_log_prob = t f . matmul(G_h1, G_W2) + G_b2
42 G_prob = t f . nn . sigmoid (G_log_prob)
43 return G_prob
44 de f sample_Z (m, n) :
45 return np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
46 de f p l o t ( samples ) :
47 f i g = pl t . f i g u r e ( f i g s i z e =(4 , 4) )
48 gs = g r i d s p ec . GridSpec ( 4 , 4)
49 gs . update ( wspace =0.05 , hspace =0.05)
50 f o r i , sample in enumerate ( samples ) :
51 ax = p l t . subp lot ( gs [ i ] )
52 p l t . axis ( o f f )
53 ax . s et _ x t ick l a b el s ( [ ] )
54 ax . s et _ y t ick l a b el s ( [ ] )
55 ax . set_aspect ( equal )
56 p l t . imshow( sample . reshape (2 8 , 28) , cmap= Greys_r )
57 return f i g
58 G_sample = gen era to r (Z , y)
59 D_real , D_logit_real = d i s c r i m i n a to r (X, y )
60 D_fake , D_logit_fake = d i s c r i m i n at o r (G_sample , y)
61 D_loss_real = t f . reduce_mean( t f . nn . sigmoid_cross_entropy_with_logits ( l o g i t s=D_logit_real ,
l a b e l s=t f . one s_ like ( D_logit_real ) ) )
62 D_loss_fake = t f . reduce_mean ( t f . nn . sigmoid_cross_entropy_with_logits ( l o g i t s=D_logit_fake ,
l a b e l s=t f . z e r o s _ l i k e ( D_logit_fake ) ) )
63 D_loss = D_loss_real + D_loss_fake
http://www.ma-xy.com 92 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
64 G_loss = t f . reduce_mean ( t f . nn . sigmoid_cross_entropy_with_logits ( l o g i t s=D_logit_fake ,
l a b e l s=t f . one s_ like ( D_logit_fake ) ) )
65 D_solver = t f . t r a i n . AdamOptimizer ( ) . minimize ( D_loss , va r _ l i s t=theta_D )
66 G_solver = t f . tr a i n . AdamOptimizer ( ) . minimize ( G_loss , v a r_ l is t=theta_G )
67 s e s s = t f . Ses s i on ( )
68 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
69 i f not os . path . e x i s t s ( out/ ) :
70 os . makedirs ( out / )
71 i = 0
72 f o r i t in range (1000000) :
73 i f i t % 1000 == 0:
74 n_sample = 16
75 Z_sample = sample_Z ( n_sample , Z_dim)
76 y_sample = np . z e r o s ( shape=[n_sample , y_dim ] )
77 y_sample [ : , 7 ] = 1
78 samples = se s s . run (G_sample , feed_dict={Z : Z_sample , y : y_sample })
79 f i g = p l o t ( samples )
80 p l t . s a v e f i g ( out /{ }. png . format ( s t r ( i ) . z f i l l (3 ) ) , bbox_inches= t ig h t )
81 i += 1
82 p l t . c l o s e ( f i g )
83 X_mb, y_mb = mnist . t r a in . next_batch ( mb_size )
84 Z_sample = sample_Z( mb_size , Z_dim)
85 _, D_loss_curr = s e s s . run ( [ D_solver , D_loss ] , fee d_ dict={X: X_mb, Z : Z_sample , y :y_mb
})
86 _, G_loss_curr = s e s s . run ( [ G_solver , G_loss ] , fee d_ dict={Z : Z_sample , y :y_mb})
87 i f i t % 1000 == 0:
88 print ( I t e r : {} . format ( i t ) )
89 print ( ’D lo s s : { : . 4 } . format ( D_loss_curr ) )
90 print ( G_loss : { : . 4 } . format ( G_loss_curr ) )
91 p r i n t ( )
92
实验: MINIST 数据集上,以类别标签为条件 y(one - hot 编码)给定 z 后,生成 0-9
字图像,然后将 (y, x|y) P
g
(y, x|y) P
r
作为训练集输入到 D 中进行判断。最终生成的 0-9
数字图像如图 (1.72) 所示
1.72: CGAN 数字生成图
http://www.ma-xy.com 93 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
1.6.5 InfoGAN
InfoGAN 模型建立
前面 GAN 生成器为 x = G(z)CGAN 的生成器为 x = G(z, y)这里的 y 为指导信息。
在,考虑在生成器 G 的输入层加入一些 x 自身的信息,比如 x 的主成分。构建如下生成器
x = G(z, x
)
其中:x
为图像 x 的部分特征信息,例如,要生成 n × n 大小的图像,可以用 m × m(m < n)
的部分图像作为 x
。进一步考虑条件 GAN,有
x = G(z, x
, y)
其中:x
x 的部分特征,y 为指导信息,z 为噪声。其实,可以将 y 视为 x 的部分特征 x
一部分。
现在,来看 InfoGAN6的思路:InfoGAN 将输入改为 z cz 仍为噪声,c 设定为潜变量
(c 可以对应于笔画粗细、图像光照、字体倾斜度等,我们称之为 latent code)设共有 L 个潜变
c
1
, c
2
, . . . , c
L
( c 表示),于是生成器 G
x = G(z, c)
并且假设 c
1
, c
2
, . . . , c
L
之间相互独立,即 P (c
1
, c
2
, . . . , c
L
) =
L
i=1
P (c
i
)。生成器 G 构建完成之
后,要考虑判别器 DD 的设置仍然和前面一样。下面就要考虑如何构建目标,以及 c P
c
什么,如果 c x
或者 c x 的主成分那还好说,但如果 c 潜在的变量,那么 P
c
如何,以
及如何采样 c P
c
如果将 x
作为部分的输入,我们自然希望 G(z, x
) x
尽可能靠近,如果把 c 视为 x
里我们希望 c x = G(c, z) 尽可能靠近。用互信息 I(c; x) 来衡量二者的相关性, c, x 相互独
立时,I(c; x) = 0
I(c; x) = I(c; G(z, c)) = H(c) H(x|c) = H(x) H(c|x)
其中:H 为熵
H(x) =
p(x) log p(x)dx
=
n
i=1
p
i
log p
i
= E[log p
i
]
http://www.ma-xy.com 94 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
并且,对于互信息 I(c; x),我们有
I(c; x) = H(c) H(c|x)
= H(c) + H(x) H(c, x)
=
c
p(c) log
1
p(c)
+
x
p(x) log
1
p(x)
x,c
p(c, x) log
1
p(c, x)
=
c,x
p(c, x) log
p(c, x)
p(c)p(x)
在设置生成器 G 时,应该使 c x = G(c, z) 的互信息 I 尽可能大,于是有 InfoGAN 的目
min
G
max
D
V
I
(
D, G
) =
V
(
D, G
)
Λ
I
(
c
;
G
(
z, c
))
其中:V (D, G) GAN 的原始目标。我们来看 I(c; x)
I(c; x) =H(c) H(c|x)
=H(c)
p(c|x) log
1
p(c|x)
dx
这样,在计算 I(c; x) 时,就需要计算后验 p(c|x)这是相当麻烦的。幸运的是,我们可以用 p(c|x)
的一个近似 q(c|x) 来得到 I(c; x) 的一个下界
I(c; x) = H(c) H(c|x)
= E
xG(z,c)
E
c
p(c|x)
[log p(c
; x)]
+ H(c)
= E
xG(z,c)
KL(P (·|x)||Q(·|x)) + E
c
p(c|x)
[log q(c
|x)]
+ H(c)
E
xG(z,c)
E
c
p(c|x)
[log q(c
|x)]
+ H(c)
上述求互信息 I 的下界的方法称为最大变分互信息 (variational Information Maximization)
H(c) 是易于计算的,在下面的分析中,我们将其视为一个常数 (熵不变)
So far we habe by passed the problem of having to computer the posterior p(c|x). explicithy
wia this hower bound but we still need to be able to sample from the posterior in the inner
expection.
引理 (lemma 5.1) X , Y 为随机变量,f(x, y) 为二元函数,则有
E
xX,yY |x
[f(x, y)] = E
xX,yY |x,x
X|y
[f(x
, y)]
http://www.ma-xy.com 95 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
证明
E
xX,yY |x
[f(x, y)] =
x
p(x)
y
p(y|x)f(x, y)dydx
=
x,y
p(x, y)f(x, y)dydx
=
x,y
p(x, y)f(x, y)
x
p(x
|y)dx
dydx
=
x
p(x)
y
p(y|x)
x
p(x
|y)f(x
, y)dx
dydx
= E
xX,yY |x,x
X|y
[f(x
, y)]
应用上面的引理,我们可以得到互信息 I(c; x) 的一个下界
I(c; x) = E
xG(z,c)
E
c
p(c|x)
[log q(c
|x)]
+ H(c)
= E
cp(c),xG(z,c)
[log q(c|x)] + H(c)
L
1
(G, q)
L
1
(G, q) 是可以用 MC 方法来近似 (模拟) 的。现在,我们将目标 L
1
(G, q) 添加到 GAN
目标中,求 G 使 L
1
(G, q) 尽可能大,有
min
G,q
max
D
V
infoGAN
(G, G, q) = V (D, G) λL
1
(G, q)
InfoGAN 程序
InfoGAN TensorFlow 程序如下
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 de f x a v i e r_init ( s i z e ) :
8 in_dim = s i z e [ 0 ]
9 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
10 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
11 X = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , 784])
12 D_W1 = t f . Variabl e ( x a v i e r _ i n it ( [ 7 84 , 128]) )
13 D_b1 = t f . Variable ( t f . z e r o s ( shape =[128]) )
14 D_W2 = t f . Variabl e ( x a v i e r _ i n it ( [ 1 28 , 1 ] ) )
15 D_b2 = t f . Variable ( t f . z e r o s ( shape = [1] ) )
16 theta_D = [D_W1, D_W2, D_b1, D_b2]
17 Z = t f . p l aceh o l d e r ( t f . f l o a t 3 2 , shape=[None , 1 6 ] )
18 c = t f . p l aceho l d e r ( t f . f l o a t 3 2 , shape=[None , 1 0 ] )
19 G_W1 = t f . Varia bl e ( x a v i e r _ i nit ( [ 2 6 , 2 5 6 ] ) )
20 G_b1 = t f . Variable ( t f . z e r o s ( shape =[ 25 6]) )
21 G_W2 = t f . Varia bl e ( x a v i e r _ i nit ( [ 2 56 , 78 4] ) )
http://www.ma-xy.com 96 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
22 G_b2 = t f . Variable ( t f . z e r o s ( shape =[ 78 4]) )
23 theta_G = [G_W1, G_W2, G_b1, G_b2]
24 Q_W1 = t f . V ariable ( xavier _ i n i t ( [7 8 4 , 12 8 ] ) )
25 Q_b1 = t f . Variable ( t f . z e r o s ( shape = [128]) )
26 Q_W2 = t f . V ariable ( xavier _ i n i t ( [1 2 8 , 10 ] ) )
27 Q_b2 = t f . Variable ( t f . z e r o s ( shape =[10 ]) )
28 theta_Q = [Q_W1, Q_W2, Q_b1, Q_b2]
29 de f sample_Z (m, n) :
30 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
31 de f sample_c (m) :
32 ret ur n np . random . multinomial (1 , 1 0 * [ 0 . 1 ] , s i z e=m)
33 de f ge ner ator ( z , c ) :
34 input s = t f . concat ( ax is =1, va lue s =[z , c ] )
35 G_h1 = t f . nn . re l u ( t f . matmul( inputs , G_W1) + G_b1)
36 G_log_prob = t f . matmul(G_h1, G_W2) + G_b2
37 G_prob = t f . nn . sigmoid (G_log_prob)
38 ret ur n G_prob
39 de f d i s c r i m in a t or (x) :
40 D_h1 = t f . nn . r e lu ( t f . matmul(x , D_W1) + D_b1)
41 D_logit = t f . matmul(D_h1, D_W2) + D_b2
42 D_prob = t f . nn . sigmoid ( D_logit )
43 ret ur n D_prob
44 de f Q(x) :
45 Q_h1 = t f . nn . r e l u ( t f . matmul( x , Q_W1) + Q_b1)
46 Q_prob = t f . nn . softmax ( t f . matmul(Q_h1, Q_W2) + Q_b2)
47 ret ur n Q_prob
48 de f p l o t ( samples ) :
49 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
50 gs = g r idspe c . GridSpec (4 , 4)
51 gs . update ( wspace =0.05 , hspace =0.05)
52 f o r i , sample in enumerate ( samples ) :
53 ax = p l t . subplot ( gs [ i ] )
54 p l t . a x i s ( o f f )
55 ax . s e t _x t i c kla b e l s ( [ ] )
56 ax . s e t _y t i c kla b e l s ( [ ] )
57 ax . set_aspect ( equ al )
58 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
59 ret ur n f i g
60 G_sample = ge ner ato r (Z , c )
61 D_real = di s c r i m in a t or (X)
62 D_fake = d i s c ri m i n at o r (G_sample)
63 Q_c_given_x = Q(G_sample)
64 D_loss = t f . reduce_mean ( t f . l o g ( D_real + 1e8) + t f . log (1 D_fake + 1e8))
65 G_loss = t f . reduce_mean( t f . log (D_fake + 1e8))
66 cross_ent = t f . reduce_mean(t f . reduce_sum ( t f . l o g (Q_c_given_x + 1e8) * c , 1) )
67 ent = t f . reduce_mean(t f . reduce_sum ( t f . l o g ( c + 1e8) * c , 1) )
68 Q_loss = cross_ent + ent
69 D_solver = t f . t r a i n . AdamOptimizer ( ) . minimize ( D_loss , v a r _ l i s t=theta_D )
70 G_solver = t f . t ra i n . AdamOptimizer ( ) . minimize ( G_loss , v a r _ li s t=theta_G)
71 Q_solver = t f . t ra i n . AdamOptimizer ( ) . minimize ( Q_loss , v ar _ li s t=theta_G + theta_Q )
72 mb_size = 32
73 Z_dim = 16
74 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
http://www.ma-xy.com 97 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
75 s e s s = t f . Ses s i on ( )
76 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
77 i f not os . path . e x i s t s ( out/ ) :
78 os . makedirs ( out/ )
79 i = 0
80 f o r i t in range (1000000) :
81 i f i t % 1000 == 0:
82 Z_noise = sample_Z (16 , Z_dim)
83 idx = np . random . rand in t ( 0 , 10)
84 c_noise = np . zer o s ( [ 1 6 , 1 0 ] )
85 c_noise [ range (16) , idx ] = 1
86 samples = s e s s . run (G_sample , feed_ di ct={Z : Z_noise , c : c_noise })
87 f i g = p l o t ( samples )
88 p l t . s a v e f i g ( out /{ }.png . format ( s t r ( i ) . z f i l l (3 ) ) , bbox_inches= t ig h t )
89 i += 1
90 p l t . c l o s e ( f i g )
91 X_mb, _ = mnist . tr a i n . next_batch ( mb_size )
92 Z_noise = sample_Z(mb_size , Z_dim)
93 c_noise = sample_c ( mb_size )
94 _, D_loss_curr = se s s . run ( [ D_solver , D_loss ] ,
95 fee d_ di ct={X: X_mb, Z : Z_noise , c : c_noise })
96 _, G_loss_curr = s e s s . run ( [ G_solver , G_loss ] ,
97 fee d_ di ct={Z : Z_noise , c : c_noise })
98 s e s s . run ( [ Q_solver ] , feed _d ict={Z: Z_noise , c : c_noise })
99 i f i t % 1000 == 0:
100 p r i n t ( I t e r : {} . format ( i t ) )
101 p r i n t ( ’D l o s s : { : . 4 } . format ( D_loss_curr ) )
102 p r i n t ( G_loss : { : . 4 } . format ( G_loss_curr ) )
103 p r i n t ( )
104
在实验中,作者通过只改变 latent code c 中的某一个维度,来观察生成数据的变化。其实验
确实证明:latent code 实学到了一些维度,如图像的角度或光照等因素,也即说明 InfoGAN
确实学习到了数据中的 disentangled 的可解释部分的表示。其效果如下三张图 (1.73) 所示
http://www.ma-xy.com 98 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.73: infoGAN 实验结果
1.6.6 Mali GAN
Mali GAN 模型建立
尽管生成对抗网络 (GAN) 在获取连续分布上已经取得了成功,但其在离散背景 (如自然
语言任务) 上的应用却相当有限。主要的原因是通过离散变量的反向传播很困难,而 GAN
练目标还具有固有的不稳定性。为了解决这些问题,文献34提出了最大似然增强的离散生成对抗
网络 (Maximum-Likelihood Augmented Discrete Generative Adversarial Networks)Mali GAN
没有直接优化该 GAN 标,而是使用遵循对数似然的推导提出了一种全新的且低方差的目标。
在多种离散数据集上的实验结果表明了这方法的有效性。
GAN 的分析中,我们知道在 G 给定的情况下,最优判别器 D
D
=
p
r
p
r
+ p
g
给定 D
,真实分布密度 p
r
可以写为
p
r
(x) =
D
1 D
p
g
(x)
即真实样本的概率可以用 p
g
的带权
D
1D
来替代。然而,这样的判别器 D 不太可能通过训练得
到,甚至不存在。为此,我们将最优 D
改为非最优判别器 D(x),据此,我们可以写出, D
给定下 p
r
的估计
˜p
r
=
D
1 D
p
g
上式说明, D G 给定下,样本 x 在真实分 p
r
中的估计值。¬回想极大似然估计,我
的目标是让样本出现的概率最大。现在可以求 G G 生成的假样本在真实分布 p
r
中的概率值
http://www.ma-xy.com 99 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
最大,即
max
G
˜p
r
(x)
GAN 中,生成器 G 的目标是使两个分布 p
r
, p
g
JSD 散度最小。这里, JSD 散度
换为 KL 距离,有
min
G
KL(p
r
||p
g
)
˜p
r
来替代 p
r
,有
min
G
KL(˜p
r
||p
g
)
但可惜的是 ˜p
r
并不是一个合理的概率分布,因为它的和并不为 1。为此,使用归一化技术,
r
D
(x) =
D(x)
1D(x)
,定义归一化的 p
r
的估计为
q(x) =
1
Z(θ
)
D(x)
1 D(x)
p
g
(x) =
r
D
(x)
Z(θ
)
p
g
(x)
其中:Z(θ
) 为归一化因子,Z(θ
) = E
p
g
[r
D
(x)] =
x
p
g
(x)
D(x)
1D(x)
。此时的 q(x) 是一个标准
概率分布,其和为 1当最优判别器是 D = D
=
1
2
时,Z = 1 q(x) = p
g
(x) = p
r
(x)并且 q(x)
估计量的偏差仅依赖于 D(x)D
(x) = D(x) 是最小偏差。
我们的目标是求 G 使 p
g
q KL 距离最小 ( q 来代替 p
r
)
L
G
(θ
g
) = KL(q(x)||p
θ
g
(x))
上述目标有一个吸引人的性质:q 是固定的。如果 D 被充分训练, q 总是接近数据分布 p
r
义目标的导数为 L
G
= E
q
[
θ
g
log p
θ
g
(x)],有
L
G
=E
p
g
q(x)
p
g
(x)
θ
g
log p
θ
g
(x)
=
1
Z
E
p
θ
g
r
D
(x)
θ
g
log p
θ
g
(x)
Mali GAN 通过如下的梯度估计量来求解 G
L
G
(θ
g
)
m
i=1
r
D
(x
i
)
i
r
D
(x
i
)
b
log
p
θ
g
(x
i
) = E({x
i
}) (1.5)
其中:b 是一个 baseline用来增强学习以减小方差。在试验中, b 0 1 慢慢变大。下面,
给出这种梯度近似的合理性。下述定理表明, D 接近最优时,上面的近似目标 (1.5) 接近原始
目标 KL(q(x)||p
g
(x))。此外,即使 D 没有接近最优,这个近似目标 (1.5) 仍然是很好的。
定理 1. 如果 D(x) 是最优的,有如下等式
E
p
r
[log p
θ
d
(x)] =
1
Z(θ
)
E
p
g
[r
D
(x) log p
θ
g
(
x
)]
其中:Z(θ
) = E
p
g
[r
D
(x)]
2.
如果
D
(
x
)
被训练的很好,但不是最优,
x
D
(
x
)
0.5
p
r
p
r
+p
g
我们有:当 m
时,almost surely
E({x
i
}
m
i=1
)
θ
KL(p
r
||p
θ
g
) > 0
http://www.ma-xy.com 100 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
Mali GAN 算法
Mali GAN 的伪代码如 (5) 所示
算法 5 Minibatch stochastic gradient descent training of Mali GAN
1: 初始化:一个含参数 θ
g
的生成器 p
θ
g
一个含参数 θ
d
的判别器 D(x)baseline b迭代数 t
t
max
;判别器训练次数 k;批量大小 m
2: for t = 1, 2, . . . , t
max
do
3: // 更新 D
4: for k steps do
5: sample minibatch of m noise sample {z
(1)
, z
(2)
, . . . , z
(m)
} from P
z
;生成 m 假样本
x
(1)
= G(z
(1)
), x
(2)
= G(z
(2)
), . . . , x
(m)
= G(z
(m)
)
6: sample minibatch of m example {x
(1)
, x
(2)
, . . . , x
(m)
} from P
r
即从原始数据 {x
i
}
n
i=1
中挑出 m 个。
7: D 的梯度
θ
d
1
m
m
i=1
[log D
t
(x
(i)
) + log(1 D
t
(G
t
(z
(i)
)))]
8: D
t+1
= D
t
+
θ
d
9: end for
10: // 更新 G
11: sample minibatch of m noise sample {z
(1)
, z
(2)
, . . . , z
(m)
} from P
z
12: 计算梯度
m
i=1
r
D
(G(z
(i)
))
i
r
D
(G(z
(i)
))
b
log p
θ
g
(G(z
(i)
))
13: 更新 G
G
t+1
= G
t
+
θ
g
14: end for
http://www.ma-xy.com 101 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
1.6.7 Boundary Seeking GAN
BGAN 模型建立
Mali GAN 中, p
g
(x) 已知时,在 D(x) 给定后,就可以得到 p
r
的近似 ˜p
r
q并且
p
g
(x) =
z
g(x|z) p(z)
=
z
g(x, z)dz
=
z
g(x|z)p(z)dz
G 的目标是使 q p
g
KL 距离最小
min
G
KL(q(x)||p
g
(x))
G 的参数为 θ
g
,有
θ
g
KL(q(x)||p
g
(x))
=
θ
g
x
q(x) log
q(x)
p
g
(x)
x
q(x)
θ
g
log p
g
(x)
=
x
1
Z
p
g
(x)
D(x)
1 D(x)
θ
g
log p
g
(x)
=
x
1
Z
z
g(x|z)p(z)
D(x)
1 D(x)
θ
g
log p
g
(x)
其中:Z 是归一化因子,Z =
x
p
g
(x)
D(x)
1D(x)
上面这个梯度
θ
g
需要用 MC 等方法近似,并且会有很大的方差,尤其在解决 Z 时。The
intuition here is to note that, as the conditional density,g(x|z) is unimodal(单峰)g(x|z)
以用来构建一个和 q(x) 类似的分布
˜p
z
=
1
Z
z
g(x|z)
D(x)
1 D(x)
其中:我们使用了 log p
g
(x) = log g(x|z) + log p(z)Z
z
=
x
g(x|z)
D(x)
1D(x)
是边缘,确保 ˜p
z
一个概率分布。The gradients then become
θ
g
KL(˜p
z
(x)||g(x|z))
x
˜p
z
(x)
θ
g
(x|z)
m
˜w
(m)
θ
g
log g(x
(m)
|z)
其中:˜w
(m)
=
w
(m)
m
w
(m
)
w
(m)
=
D(x
(m)
)
1D(x
(m)
)
分别是归一化和非归一化权重;x
(m)
是给定 z 后生
成器生成的样本。当从 D(x) 角度看样本是相当糟糕时, w
(m)
很大或很小时,归一化是有帮
助的。
http://www.ma-xy.com 102 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
θ
g
可以采用批量样本来更新
θ
g
1
N
n
m
˜w
(m)
θ
g
log g(x
(m)
|z
(m)
)
BGAN 程序
Boundary Seeking GAN TensorFolw 程序如下
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 mb_size = 32
8 X_dim = 784
9 z_dim = 64
10 h_dim = 128
11 l r = 1e3
12 d_steps = 3
13 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
14 de f p l o t ( samples ) :
15 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
16 gs = g r idspe c . GridSpec (4 , 4)
17 gs . update ( wspace =0.05 , hspace =0.05)
18 f o r i , sample in enumerate ( samples ) :
19 ax = p l t . subplot ( gs [ i ] )
20 p l t . a x i s ( o f f )
21 ax . s e t _x t i c kla b e l s ( [ ] )
22 ax . s e t _y t i c kla b e l s ( [ ] )
23 ax . set_aspect ( equ al )
24 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
25 ret ur n f i g
26 de f x a v i e r_init ( s i z e ) :
27 in_dim = s i z e [ 0 ]
28 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
29 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
30 de f log ( x) :
31 ret ur n t f . l o g ( x + 1e8)
32 X = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
33 z = t f . p l aceho l d e r ( t f . f l o a t 3 2 , shape=[None , z_dim ] )
34 D_W1 = t f . Variabl e ( x a v i e r _ i n it ( [ X_dim, h_dim ] ) )
35 D_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim] ) )
36 D_W2 = t f . Variabl e ( x a v i e r _ i n it ( [ h_dim, 1 ] ) )
37 D_b2 = t f . Variable ( t f . z e r o s ( shape = [1] ) )
38 G_W1 = t f . Varia bl e ( x a v i e r _ i nit ( [ z_dim , h_dim ] ) )
39 G_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim ] ) )
40 G_W2 = t f . Varia bl e ( x a v i e r _ i nit ( [ h_dim, X_dim] ) )
41 G_b2 = t f . Variable ( t f . z e r o s ( shape=[X_dim] ) )
42 theta_G = [G_W1, G_W2, G_b1, G_b2]
43 theta_D = [D_W1, D_W2, D_b1, D_b2]
44 de f sample_z (m, n) :
http://www.ma-xy.com 103 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
45 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
46 de f ge ner ator ( z ) :
47 G_h1 = t f . nn . re l u ( t f . matmul( z , G_W1) + G_b1)
48 G_log_prob = t f . matmul(G_h1, G_W2) + G_b2
49 G_prob = t f . nn . sigmoid (G_log_prob)
50 ret ur n G_prob
51 de f d i s c r i m in a t or (x) :
52 D_h1 = t f . nn . r e lu ( t f . matmul(x , D_W1) + D_b1)
53 out = t f . nn . sigmoid ( t f . matmul(D_h1, D_W2) + D_b2)
54 ret ur n out
55 G_sample = ge ner ato r ( z )
56 D_real = di s c r i m in a t or (X)
57 D_fake = d i s c ri m i n at o r (G_sample)
58 D_loss = t f . reduce_mean ( l o g ( D_real ) + lo g (1 D_fake ) )
59 G_loss = 0. 5 * t f . reduce_mean ( ( l o g ( D_fake) l o g (1 D_fake ) ) **2)
60 D_solver = ( t f . t r ai n . AdamOptimizer ( l ea rni ng_ rat e=l r )
61 . minimize ( D_loss , v a r _ l i s t=theta_D ) )
62 G_solver = ( t f . t r a i n . AdamOptimizer( lear nin g_r ate=l r )
63 . minimize ( G_loss , v a r _l i st=theta_G ) )
64 s e s s = t f . Ses s i on ( )
65 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
66 i f not os . path . e x i s t s ( out/ ) :
67 os . makedirs ( out/ )
68 i = 0
69 f o r i t in range (1000000) :
70 X_mb, _ = mnist . tr a i n . next_batch ( mb_size )
71 z_mb = sample_z ( mb_size , z_dim)
72 _, D_loss_curr = se s s . run (
73 [ D_solver , D_loss ] ,
74 fee d_dict={X: X_mb, z : z_mb}
75 )
76 _, G_loss_curr = s e s s . run (
77 [ G_solver , G_loss ] ,
78 fee d_dict={X: X_mb, z : sample_z (mb_size , z_dim) }
79 )
80 i f i t % 1000 == 0:
81 p r i n t ( I t e r : {}; D_loss : { : . 4 } ; G_loss : { : . 4 }
82 . format ( i t , D_loss_curr , G_loss_curr ) )
83 samples = s e s s . run (G_sample , feed_ di ct={z : sample_z (1 6 , z_dim) })
84 f i g = p l o t ( samples )
85 p l t . s a v e f i g ( out /{ }.png
86 . format ( s t r ( i ) . z f i l l ( 3) ) , bbox_inches= t i g ht )
87 i += 1
88 p l t . c l o s e ( f i g )
89
http://www.ma-xy.com 104 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.6.8 Mode Regularized GAN
MRGAN 模型建立
GAN 在许多任务上都表现良好,但 GAN 有两大缺点:1. 训练极不稳定;2. 生成的图片多
样性较差。和无监督 GAN 相比,有监督 CGAN 的训练要相对稳定一些。而 CGAN 相对 GAN
而言,其目标中多了一个 I(c; G(z, c))也就是说,就是此项让 GAN 变得稳定了一些。而此项可
以被视为一个正则项,我们自然考虑其他的正则方法,文献33就考虑了一些正则化 GAN
假设生成器 G G(z) : Z X 的映射,相应的,我们考虑一个 encoder E(x) : X Z
且假设 d 是某一种相似性度量,p
r
是真实分布,p
g
是生成分布。我们使用 E
xp
r
[d(x, G E(x)]
作为正则项,其中 G E 是一个自动编码器。for x M
0
,如果 G E 是一个好的自动编码器,
G E 应该和 M
0
非常接近。在训练 G 时,添加正则项 E
xp
r
[d(x, G E(x)]
T
G
= E
zp
z
[log D(G(z))] + E
xp
r
[λ
1
d(x, G E(x)) + λ
2
log D(G E(x))]
T
E
= E
xp
r
[λ
1
d(x, G E(x)) + λ
2
log D(G E(x))]
The proposed algorithm divides the training procedure of GANs into two steps: a manifold
step and a diusion step. In the manifold step, we try to match the generation manifold and the
real data manifold with the help of an encoder and the geometric metric loss. In the diusion
step, we try to distribute the probability mass on the generation manifold fairly according to the
real data distribution.
MRGAN 程序
MRGAN 的伪代码如 (6) 所示
MRGAN pytorch 程序如下
1 import torc h
2 import torc h . nn
3 import torc h . nn . fu n c t io n a l as nn
4 import torc h . autograd as autograd
5 import torc h . optim as optim
6 import numpy as np
7 import m atp l otl ib . pyplot as p l t
8 import m atp l otl ib . g r i d spec as g r i dspec
9 import os
10 from torch . autograd import Variab le
11 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
12 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
13 mb_size = 32
14 z_dim = 128
15 X_dim = mnist . t r a in . images . shape [ 1 ]
16 y_dim = mnist . t ra i n . l a b e l s . shape [ 1 ]
17 h_dim = 128
18 cnt = 0
19 l r = 1e4
20 lam1 = 1e2
http://www.ma-xy.com 105 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
算法 6 Minibatch stochastic gradient descent training of MRGAN
1: Manifold Step:
2: 从真实分布 p
r
中抽取 m 个样本 {x
1
, x
2
, . . . , x
m
}
3: 使用 SGD 来更新判别器 D
1
θ
1
d
1
m
m
i=1
[log D
1
(x
i
) + log(1 D
1
(G(E(x
i
))))]
4: 使用 SGD 来更新生成器 G
θ
g
1
m
m
i=1
[λ log D
1
(G(E(x
i
))) ||x
i
G(E(x
i
))||
2
]
5: Diusion Step:
6: 从真实分布 p
r
中抽取 m 个样本 {x
1
, x
2
, . . . , x
m
}
7: prior 分布 p
z
中抽取 m 个样本 {z
1
, z
2
, . . . , z
m
}
8: 使用 SGD 更新判别器 D
2
θ
2
d
1
m
m
i=1
[log D
2
(G(E(x
i
))) + log(1 D
2
(z
i
))]
9: 使用 SGD 来更新生成器 G
θ
g
1
m
m
i=1
[log D
2
(G(z
i
))]
http://www.ma-xy.com 106 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
21 lam2 = 1e2
22 de f log ( x) :
23 ret ur n torch . log (x + 1e8)
24 E = torch . nn . S e que n tial (
25 to rch . nn . Linear (X_dim, h_dim) ,
26 to rch . nn .ReLU( ) ,
27 to rch . nn . Linear (h_dim, z_dim)
28 )
29 G = torch . nn . S e que n t ial (
30 to rch . nn . Linear (z_dim , h_dim) ,
31 to rch . nn .ReLU( ) ,
32 to rch . nn . Linear (h_dim, X_dim) ,
33 to rch . nn . Sigmoid ( )
34 )
35 D = torch . nn . S e que n tial (
36 to rch . nn . Linear (X_dim, h_dim) ,
37 to rch . nn .ReLU( ) ,
38 to rch . nn . Linear (h_dim, 1) ,
39 to rch . nn . Sigmoid ( )
40 )
41 de f reset_grad ( ) :
42 G. zero_grad ( )
43 D. zero_grad ( )
44 E. zero_grad ( )
45 de f sample_X( s i z e , include_y=F al se ) :
46 X, y = mnist . t ra i n . next_batch ( s i z e )
47 X = Variab le ( torch . from_numpy(X) )
48 i f include_y :
49 y = np . argmax(y , a x i s =1) . astype (np . in t )
50 y = V ariable ( torch . from_numpy(y ) )
51 return X, y
52 ret ur n X
53 E_solver = optim .Adam(E. parameters ( ) , l r=l r )
54 G_solver = optim .Adam(G. parameters () , l r=l r )
55 D_solver = optim .Adam(D. parameters ( ) , l r=l r )
56 f o r i t in range (1000000) :
57 D iscri min at or
58 # Sample data
59 X = sample_X(mb_size )
60 z = Variable ( torch . randn ( mb_size , z_dim) )
61 # Dicriminator_1 forwardlo ssbackwardupdate
62 G_sample = G( z )
63 D_real = D(X)
64 D_fake = D(G_sample)
65 D_loss = torch . mean( lo g ( D_real ) + log (1 D_fake ) )
66 D_loss . backward ( )
67 D_solver . s tep ( )
68 # Housekeeping re s e t grad i ent
69 reset_grad ()
70 Generator
71 # Sample data
72 X = sample_X(mb_size )
73 z = Variable ( torch . randn ( mb_size , z_dim) )
http://www.ma-xy.com 107 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
74 # Generator forwardlo s sbackwardupdate
75 G_sample = G( z )
76 G_sample_reg = G(E(X) )
77 D_fake = D(G_sample)
78 D_reg = D(G_sample_reg)
79 mse = torch . sum ( (X G_sample_reg) **2 , 1)
80 re g = to rch . mean( lam1 * mse + lam2 * lo g (D_reg) )
81 G_loss = torch . mean( l o g ( D_fake ) ) + reg
82 G_loss . backward ( )
83 G_solver . step ()
84 # Housekeeping re s e t grad i ent
85 reset_grad ()
86 Encoder
87 # Sample data
88 X = sample_X(mb_size )
89 z = Variable ( torch . randn ( mb_size , z_dim) )
90 G_sample_reg = G(E(X) )
91 D_reg = D(G_sample_reg)
92 mse = torch . sum ( (X G_sample_reg) **2 , 1)
93 E_loss = torch . mean( lam1 * mse + lam2 * lo g (D_reg) )
94 E_loss . backward ( )
95 E_solver . step ( )
96 # Housekeeping re s e t grad i ent
97 reset_grad ()
98 # Print and pl o t every now and then
99 i f i t % 1000 == 0:
100 p r i n t ( It e r {}; D_loss : {} ; E_loss : { }; G_loss : {}
101 . format ( i t , D_loss . data .numpy( ) , E_loss . data . numpy() , G_loss . data .numpy
() ) )
102 samples = G( z ) . data .numpy( ) [ : 1 6 ]
103 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
104 gs = gridsp e c . GridSpec (4 , 4)
105 gs . update ( wspace =0.05 , hspace =0.05)
106 f o r i , sample in enumerate ( samples ) :
107 ax = pl t . sub plot ( gs [ i ] )
108 p lt . a x i s ( o f f )
109 ax . s et _ x t ic k l a bel s ( [ ] )
110 ax . s et _ y t ic k l a bel s ( [ ] )
111 ax . set_aspect ( equal )
112 p lt . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
113 i f not os . path . e x i s t s ( out/ ) :
114 os . makedirs ( out/ )
115 p l t . s a v e f i g ( out /{ }.png
116 . format ( s t r ( cnt ) . z f i l l ( 3) ) , bbox_inches= t i g h t )
117 cnt += 1
118 p l t . c l o s e ( f i g )
119
http://www.ma-xy.com 108 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.6.9 DCGAN
由于 GAN 的模型不稳定性问题比较突出,因而在 2016 年出现的关于 GAN 训练技巧的
果有许多,目前被广泛应用的主要包括:DCGAN
º»
(ICLR-2016) Improved GAN (NIPS-2016
workshop),特别是 DCGAN,几乎在各大 GAN 模型中都能看到它的身影。
DCGAN26 的模型结构如图 (1.74) 所示所示
1.74: DCGAN 网络结构图
其输入为 100 维的噪声向量,经过一系列的 strided conv 操作,形成 64×64 的图像,即为
G(z)之类似,卷积 ( strided conv),最
average pooling 形成判别器的标量输出。 DCGAN26中,最主要的是提出了以下四条有助于稳
定训练 GAN 的方法:
1. 去掉 max pooling 操作: strided conv 代替原来的 pooling 操作,使网络自动学习合适的
采样核函数;
2. 去掉全连接层:用 global average pooling 代替全连接层;虽然该操作可能会导致收敛速度
变慢,但有助于整体训练的稳定性;
3. 加入 BN 层:之前的 LAPGAN13指出,如果像常规模型一样对所有层都施加 BN,则会引
GAN 的模型崩溃, DCGAN 通过对 generator 的输出层和 discriminator 的输入层不
BN,而其他层都用 BN,则缓解了模型崩溃问题,并且有效避免了模型的振荡和不稳定
问题。
4. 择: generator 中除 tanh 外,其 RELU 数;
discriminator 中采用 leaky ReLU 函数。
º
http://www.leiphone.com/news/201703/Y5vnDSV9uIJIQzQm.html
»
https://github.com/roatienza/Deep-Learning-Experiments/blob/master/Experiments/Tensorow/GAN/dcgan_mnist.py
http://www.ma-xy.com 109 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
1.6.10 Improved GAN
文献32主要给出了 5 条有助于 GAN 稳定训练的经验:
1. 特征匹配:让生成器产生的样本与真实样本在判别器中间层的响应一致,即使判别器从真
实数据和生成数据中提取的特征一致,而不是在判别器网络的最后一层才做判断,有助
提高模型的稳定性;其实验也表明在一些常规方法训练 GAN 稳定的情况中,若用特
匹配则可以有效避免这种不稳定;
2. Minibatch Discrimination在判别器中,不再每次对每一个生成数据与真实数据的差异性
进行比较,而是一次比较一批生成数据与真实数据的差异性。这种做法提高了模型的鲁
性,可以缓解生成器输出全部相似或相同的问题;
3. Historical Averaging:受 ctitious play 的游戏算法启发,作者提出在生成器和判别器的
标函数中各加一个对参数的约束项
θ
1
t
t
i=1
θ
t
2
其中:θ
i
表示在时刻 i 的模型参数,该操作可以在一些情况下帮助模型达到模型的平衡点;
4. 单边标签平滑 (One-sided Label Smoothing):当 GAN 引入标签数据时,最好是将
规的 01 取值的二值标签替换为如 0.10.9 之类的平滑标签,可以增加网络的抗干扰能力;
但这里之所以说单边平滑,是因为假设生成数据为 0.1 而非 0 的话会使判别器的最优判别
函数的形状发生变化,会使生成器偏向于产生相似的输出,因此对于取值 0 的标签保持不
变,不用 0.1 一类的小数据替换,即为单边标签平滑;
5. Virtual Batch NormalizationVBN 相当于是 BN 的进阶版,BN 一次对一批数据进行
归一化,这样的一个副作用是当“批”的大小不同时,BN 操作之后的归一化常量会引起训
练过程的波动,甚至超过输入信号 z 的影响 ( z 随机噪声);而 VBN 通过引入一个参
考集合,每次将当下的数
x
加入参考集合构建一个新的虚拟的
batch
,然后在这个虚
batch 上进行归一化,如此可以缓解原始 BN 操作所引起的波动问题。
1.6.11 Least Squares GAN
LSGAN 模型建立
GAN 中,设 D(x) [0, 1] 样本 x 的概率,作为损失,们将其取 log定为
log D(x)。我们的目标是用 D G 所生成的样本/分布“拖”到真实数据流 (data manifold)
(1 维线二维面三维体三维以上称为流形),从而使 G 生成的样本类似于 p
r
(x) 的样本。
我们知道常规 GAN 中,判别器使用的是对数损失 log loss(1 D 为损失,再取 log)。就简
单的二分类问题而言,对数损失带来的决策边界如图 (1.75) 所示
http://www.ma-xy.com 110 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.75: LSGAN-sigmoid 决策边界图
因为 D 使用的是 sigmoid 函数,sigmoid 函数饱和的十分迅速,所以即使是十分小的数据点
x,该函数也会迅速忽略 x 决策边界的距离。这意味着,sigmoid 函数本质上不会惩罚远离决
策边界的 x也就说明,我们满足于将样本正确分类, x 变得很大时,D 的梯度就会快速下降
0。因此,sigmoid 不关心样本点到决策边界的距离,只关心是否分类正确。而 G 的训练依赖
D 的梯度,当 D 的梯度为 0 时,G 就不再更新 (GAN 训练不稳定)
Least squares loss:就简单的二分类问题而言,最小平方损失的决策如图 (1.76) 所示
1.76: LSGAN-L2 决策边界图
L2 损失中, w 远的数据将会获得与距离成正比的惩罚,因此梯度只有在 w 完全拟合 x
的情况下才为 0如果 G 没有捕获到数据流形,那么这将能确保 D 服从多信息梯度 (information
gradients)。在优化程中,G 使 D 的损减小的唯方式是尽能的接近 W(x = G(z)
w)
LSGAN 设置 L2 损失 D(x) [0, 1],将真样本概率值 D(x) 的期望设置为 b假样本概率值
D(x) 的期望设置为 a,有
min
D
V (D) =
1
2
E
xp
r
[(D(x) 1)
2
] +
1
2
E
zp
z
p[(D(G(z)) 0)
2
]
min
G
V (G) =
1
2
E
zp
z
[(D(G(z)) 1)
2
]
http://www.ma-xy.com 111 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
我们将 D G 的目标进行如下扩展
min
D
V (D) =
1
2
E
xp
r
[(D(x) b)
2
] +
1
2
E
zp
z
p[(D(G(z)) a)
2
]
min
G
V (G) =
1
2
E
xp
r
[(D(x) c)
2
] +
1
2
E
zp
z
[(D(G(z)) c)
2
]
并且,注意到在 G 的目标中添加了 E
xp
r
[(D(x) c)
2
],这并不改变最优值。在 G 定的情
下,最优判别器为
D
(x) =
bp
r
(x) + ap
g
(x)
p
r
(x) + p
g
(x)
D
带入到 G 的目标 V (G) 中,有
2C(G) = E
xp
r
[(D
(x) c)
2
] + E
xp
g
[(D
(x) c)
2
]
= E
xp
r
bp
r
(x) + ap
g
(x)
p
r
(x) + p
g
(x)
c
2
+ E
xp
g
bp
r
(x) + ap
g
(x)
p
r
(x) + p
g
(x)
c
2
=
x
p
r
(x)
(b c)p
r
(x) + (a c)p
g
(x)
p
r
(x) + p
g
(x)
2
dx
x
p
g
(x)
(b c)p
r
(x) + (a c)p
g
(x)
p
r
(x) + p
g
(x)
2
dx
=
x
[(b c)p
r
(x) + (a c)p
g
(x)]
2
p
r
(x) + p
g
(x)
dx
=
x
[(b c)(p
r
(x) + p
g
(x)) (b a)p
g
(x)]
2
p
r
(x) + p
g
(x)
dx
如果我们设置 b c = 1, b a = 2,则有
2C(G) =
x
(2p
g
(x) (p
r
(x) + p
g
(x)))
2
p
r
(x) + p
g
(x)
dx
= χ
2
pearson
(p
r
+ p
g
||2p
g
)
其中:χ
2
pearson
Pearson χ
2
散度,可以参考 f -GAN。这说明此时的 LSGAN f -GAN 的特
例。我们可以设置 b = 1, a = 1, c = 0,当然我们还可以设置其他值。
LSGAN 程序
最小二乘 GAN(LSGAN) TensorFlow 程序如下
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 mb_size = 32
8 X_dim = 784
9 z_dim = 64
10 h_dim = 128
11 l r = 1e3
http://www.ma-xy.com 112 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
12 d_steps = 3
13 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
14 de f p l o t ( samples ) :
15 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
16 gs = g r idspe c . GridSpec (4 , 4)
17 gs . update ( wspace =0.05 , hspace =0.05)
18 f o r i , sample in enumerate ( samples ) :
19 ax = p l t . subplot ( gs [ i ] )
20 p l t . a x i s ( o f f )
21 ax . s e t _x t i c kl a b e ls ( [ ] )
22 ax . s e t _y t i c kl a b e ls ( [ ] )
23 ax . set_aspect ( equal )
24 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
25 ret ur n f i g
26 de f x a v i e r_init ( s i z e ) :
27 in_dim = s i z e [ 0 ]
28 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
29 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
30 X = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
31 z = t f . p l aceho l d e r ( t f . f l o a t 3 2 , shape=[None , z_dim ] )
32 D_W1 = t f . Variabl e ( x a v i e r _ i n it ( [ X_dim, h_dim ] ) )
33 D_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim] ) )
34 D_W2 = t f . Variabl e ( x a v i e r _ i n it ( [ h_dim, 1 ] ) )
35 D_b2 = t f . Variable ( t f . z e r o s ( shape = [1] ) )
36 G_W1 = t f . Varia bl e ( x a v i e r _ i nit ( [ z_dim , h_dim ] ) )
37 G_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim ] ) )
38 G_W2 = t f . Varia bl e ( x a v i e r _ i nit ( [ h_dim, X_dim] ) )
39 G_b2 = t f . Variable ( t f . z e r o s ( shape=[X_dim] ) )
40 theta_G = [G_W1, G_W2, G_b1, G_b2]
41 theta_D = [D_W1, D_W2, D_b1, D_b2]
42 de f sample_z (m, n) :
43 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
44 de f ge ner ator ( z ) :
45 G_h1 = t f . nn . re l u ( t f . matmul( z , G_W1) + G_b1)
46 G_log_prob = t f . matmul(G_h1, G_W2) + G_b2
47 G_prob = t f . nn . sigmoid (G_log_prob)
48 ret ur n G_prob
49 de f d i s c r i m in a t or (x) :
50 D_h1 = t f . nn . r e lu ( t f . matmul(x , D_W1) + D_b1)
51 out = t f . matmul(D_h1, D_W2) + D_b2
52 ret ur n out
53 G_sample = ge ner ato r ( z )
54 D_real = di s c r i m in a t or (X)
55 D_fake = d i s c ri m i n at o r (G_sample)
56 D_loss = 0.5 * ( t f . reduce_mean (( D_real 1) **2) + t f . reduce_mean(D_fake**2) )
57 G_loss = 0. 5 * t f . reduce_mean ( ( D_fake 1) **2)
58 D_solver = ( t f . t r ai n . AdamOptimizer ( l ea rni ng_ rat e=l r )
59 . minimize ( D_loss , v a r _ l i s t=theta_D ) )
60 G_solver = ( t f . t r a i n . AdamOptimizer( lear nin g_r ate=l r )
61 . minimize ( G_loss , v a r _l i st=theta_G ) )
62 s e s s = t f . Ses s i on ( )
63 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
64 i f not os . path . e x i s t s ( out/ ) :
http://www.ma-xy.com 113 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
65 os . makedirs ( out/ )
66 i = 0
67 f o r i t in range (1000000) :
68 f o r _ i n range ( d_steps ) :
69 X_mb, _ = mnist . t r a in . next_batch (mb_size )
70 z_mb = sample_z ( mb_size , z_dim)
71 _, D_loss_curr = se s s . run (
72 [ D_solver , D_loss ] ,
73 fee d_ di ct={X: X_mb, z : z_mb}
74 )
75 X_mb, _ = mnist . tr a i n . next_batch ( mb_size )
76 z_mb = sample_z ( mb_size , z_dim)
77 _, G_loss_curr = s e s s . run (
78 [ G_solver , G_loss ] ,
79 fee d_dict={X: X_mb, z : sample_z (mb_size , z_dim) }
80 )
81 i f i t % 1000 == 0:
82 p r i n t ( I t e r : {}; D_loss : { : . 4 } ; G_loss : { : . 4 }
83 . format ( i t , D_loss_curr , G_loss_curr ) )
84 samples = s e s s . run (G_sample , feed_ di ct={z : sample_z (1 6 , z_dim) })
85 f i g = p l o t ( samples )
86 p l t . s a v e f i g ( out /{ }.png
87 . format ( s t r ( i ) . z f i l l ( 3) ) , bbox_inches= t i g ht )
88 i += 1
89 p l t . c l o s e ( f i g )
90
1.6.12 Wasserstein GAN
GAN 问题分析
下面的内容参考了知乎上的关于 WGAN 的讨论
¼
以及炼数成金的相关内容
½
自从 2014 Ian Goodfellow 出以来,GAN 就存在着训练困难、生成器和判别器的 loss
无法指示训练进程、生成样本缺乏多样性等问题。而 Wasserstein GAN(下面简称 WGAN) 成功
地做到了以下几点:
1. 彻底解决 GAN 训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度;
2. 基本解决了 collapse mode 的问题,确保了生成样本的多样性;
3. 训练过程中终于有一个像交叉熵、准确率这样的数值来指示训练的进程,这个数值越小代
GAN 训练得越好,代表生成器产生的图像质量越高。
作者在文献3里从理论上分析了原始 GAN 的问题所在,从而针对性地给出了改进要点;在
文献6中,又再从这个改进点出发给出了 Wasserstein GAN,并给出了算法的流程。
¼
郑华滨在知乎回答 https://zhuanlan.zhihu.com/p/25071913
½
http://i.dataguru.cn/mportal.php?mod=view&aid=10570
http://www.ma-xy.com 114 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
GAN 标。 GAN 中,¬ D 使
x P
r
被判别是来自真实分布 P
r
的概率尽可能大,让来自虚假分布的样本 x P
g
被判别是来
自真实分布的概率尽可能小,即最大化如下目标
max
D
E
xP
r
[log D(x)] + E
xP
g
[log(1 D(x))]
对于生成器 G,我们的目标是让来自虚假分布的样本 x P
g
被判别是来自真实分布的概率尽
可能大,即
max
G
E
xP
g
[D(x)]
Goodfellow 刚开始提出的目标是
min E
xP
g
[log(1 D(x))] (1.6)
之后将其改为
min E
xP
g
[1 log D(x)] (1.7)
称上面两个目标为”the - log D alternative” ”the - log D trick”。文献3分别分析了这两种形式
的原始 GAN 各自的问题所在,下面分别说明。
第一种原始 GAN 形式的问题
第一种原始 GAN (1.6) 的问题是:判别器越好,生成器梯度消失越严重 (此我们
协调 D G 的优化)。文献3从两个角度进行了论证,第一个角度是从生成器的等价损失函数切
入的。
首先, GAN 而言,在生成器 G 给定时,对于一个具体的样本,它可能来自真实分布也可
能来自生成分布,它对 D 的损失函数的贡献是
p
r
(x) log D(x) p
g
(x) log[1 D(x)]
令其关于 D(x) 的导数为 0,得
p
r
(x)
D(x)
+
p
g
(x)
1 D(x)
= 0
化简得最优判别器为
D
(x) =
p
r
(x)
p
r
(x) + p
g
(x)
(1.8)
这个结果从直观上很容易理解,就是看一个样本 x 来自真实分布和生成分布的可能性的相对
比例。如果 p
r
(x) = 0 p
g
(x) = 0最优判别器就应该非常自信地给出概率 0如果 p
r
(x) = p
g
(x)
说明该样本是真是假的可能性刚好各一半,此时最优判别器也应该给出概率 0.5此后,Goodfellow
证明了,当 D 固定时,G loss 有上界
2 log 2 2JSD(P
r
||P
g
)
http://www.ma-xy.com 115 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
当固定 D 时,训练 G 直到收敛,可以发现 G loss 会越来越小 (趋于 0)这表明 J SD(P
r
||P
g
)
被最大化了,并且趋于 log 2。如下图 (1.77) 所示。
1.77: DCGAN 训练图
而这会导致什么问题呢?在实践中人们发现, D 训练得更精确,G 的更新会变得越差,
练变得异常地不稳定。为什么会产生这些这样的问题?为了探究背后的原因,我们就看看极端情
况:判别器最优时,生成器的损失函数变成什么。给式 (1.6) 加上一个不依赖于生成器的项,使
之变成
E
xP
r
[log D(x)] + E
xP
g
[log(1 D(x))]
注意,最小化这个损失函数等价于最小化 (1.6)而且它刚好是判别器损失函数的反。将最
判别器 (1.8) 代入上式,再进行简单的变换可以得到
E
xP
r
log
p
r
(x)
1
2
[p
r
(x) + p
g
(x)]
+ E
xP
g
log
p
g
(x)
1
2
[p
r
(x) + p
g
(x)]
2 log 2 (1.9)
KullbackLeibler divergence( KL ) Jensen-Shannon
divergence(简称 JS 散度) 这两个重要的相似度衡量指标。KL 散度 (KL 距离,前面多次介绍过)
KL(P
r
||P
g
) = E
xP
r
log
p
r
p
g
JS 散度为
JSD(P
r
||P
g
) =
1
2
KL
P
r
P
r
+ P
g
2
+
1
2
KL
P
g
P
r
+ P
g
2
(1.10)
于是式 (1.9) 就可以继续写为
2JSD(P
r
||P
g
) 2 log 2
根据原始 GAN 定义的判别器 loss我们可以得到最优判别器的形式;而在最优判别器的下,
我们可以把原始 GAN 定义的生成 loss 价变换为最小化真实分布 P
r
与生成分布 P
g
之间的
http://www.ma-xy.com 116 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
JS 散度。我们越训练判别器,它就越接近最优,最小化生成器的 loss 也就会越近似于最小化 P
r
P
g
之间的 JS 散度。
梯度消失的问题就出在这个 JS 散度上。我们希望 P
g
P
r
JS 散度尽可能小,这个希望
在两个分布有所重叠的时候还可以求解,但是如果两个分布完全没有重叠的部分,或者它们重叠
的部分可忽略 (下面解释什么叫可忽略),它们的 JS 散度是多少呢?答案是 log2因为对于任意
一个 x 只有四种可能:
p
r
(x) = 0 p
g
(x) = 0
p
r
(x) = 0 p
g
(x) = 0
p
r
(x) = 0 p
g
(x) = 0
p
r
(x) = 0 p
g
(x) = 0
上面的第一种对计算 JS 散度无贡献;第二种情况由于重叠部分可忽略,所以贡献也为 0
三种情况对式 (1.10) 右边第一个项的贡献是
log
p
g
1
2
(p
g
+ 0)
= log 2
4 种情况与之类似,所以最终有
JSD(P
r
||P
g
) = log 2
换句话说,无论 P
r
P
g
是远在天边,还是近在眼前,只要它们俩没有一点重叠或者重叠部分
可忽略,JS 散度就固定是常数 log 2,而这对于梯度下降方法意味着—梯度为 0此时对于最优
判别器来说,生成器肯定是得不到一丁点梯度信息的,即使对于接近最优的判别器来说,生成器
也有很大机会面临梯度消失的问题。
但是 P
r
P
g
不重叠或重叠部分可忽略的可能性有多大?不严谨的答案是:非常大。比较
严谨的答案是: P
r
P
g
的支撑集 (support) 是高维空间中的低维流形 (manifold) 时,P
r
P
g
重叠部分测度 (measure) 0 的概率为 1
虽然论文给出的是严格的数学表述,但是直观上其实很容易理解。首先简单介绍一下这几个
概念:
1. 支撑集 (support) 其实就是函数的非零部分子集,比 ReLU 函数的支撑集就是 (0, +)
一个概率分布的支撑集就是所有概率密度非零部分的集合。
2. (manifold) 线、广,
念,形, (intrinsic
dimension) 只有 2一个点在这个二维流形上移动只有两个方向的自由度。同理,三维空间
或者二维空间中的一条曲线都是一个一维流形。
3. 测度 (measure) 是高维空间中长度、面积、体积概念的拓广,可以理解为“超体积”
http://www.ma-xy.com 117 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
回过头来看第一句话,“当 P
r
P
g
的支撑集是高维空间中的低维流形时”,这基本上是成
立的。因为 GAN 中的生成器一般是从某个低维 ( 100 ) 的随机分布中采样出一个编码向
量,再经过一个神经网络生成出一个高维样本 ( 64 × 64 的图片就有 4096 )。当生成器的
参数固定时,生成样本的概率分布虽然是定义 4096 维的空间上,但它本身所有可能产生的变
化已经被那个 100 维的随机分布限定了,其本质维度就是 100再考虑到神经网络带来的映射降
维,最终可能比 100 还小,所以生成样本分布的支撑集就在 4096 维空间中构成一个最多 100
的低维流形,“撑不满”整个高维空间。
“撑不满”就会导致真实分布与生成分布难以“碰到面”这很容易在二维空间中理解:一方
面,二维平面中随机取两条曲线,它们之间刚好存在重叠线段的概率为 0;另一方面,虽然它们
很大可能会存在交叉点,但是相比于两条曲线而言,交叉点比曲线低一个维度,长度 ()
0,可忽略。三维空间中也是类似的,随机取两个曲面,它们之间最多就是比较有可能存在交叉
线,但是交叉线比曲面低一个维度,面积 (测度) 0可忽略。从低维空间拓展到高维空间,
有了如下逻辑:因为一开始生成器随机初始化,所以 P
g
几乎不可能与 P
r
有什么关联,所以它们
的支撑集之间的重叠部分要么不存在,要么就比 P
r
P
g
的最小维度还要低至少一个维度,
而测度为 0。所谓“重叠部分测度为 0,就是上文所言“不重叠或者重叠部分可忽略”的意思。
至此,就得到了文献3中关于生成器梯度消失的第一个论证: (近似) 最优判别器下,最小
化生成器的 loss 等价于最小化 P
r
P
g
之间的 JS 散度,而由于 P
r
P
g
几乎不可能有不可忽
略的重叠,所以无论它们相距多远 JS 度都是常数 log 2,最终导致生成器的梯度 (近似) 0
梯度消失。
接着作者从第二个角度进行论证,但是背后的思想也可以直观地解释:首先,P
r
P
g
之间
几乎不可能有不可忽略的重叠,所以无论它们之间的“缝隙”多狭小,都肯定存在一个最优分割
曲面把它们隔开,最多就是在那些可忽略的重叠处隔不开而已。由于判别器作为一个神经网络可
以无限拟合这个分隔曲面,所以存在一个最优判别器,对几乎所有真实样本给出概率 1,对几乎
所有生成样本给出概率 0,而那些隔不开的部分就是难以被最优判别器分类的样本,但是它们的
测度为 0,可忽略。最优判别器在真实分布和生成分布的支撑集上给出的概率都是常数 (1 0)
导致生成器的 loss 梯度为 0,梯度消失。
有了上述的理论分析,原始 GAN 不稳定的原因就彻底清楚了:判别器训练得太好,生成器
梯度消失,生成器 loss 降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。只有判别器
训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都
可能不一样,所以 GAN 才那么难训练。实验辅证如下图 (1.78) 所示
http://www.ma-xy.com 118 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.78: 生成器梯度轨迹
先分别将 DCGAN 训练 12025 epoch然后固定生成器不动,判别器重新随机初始化
从头开始训练,对于第一种形式的生成器 loss 产生的梯度可以打印出其尺度的变化曲线,可以看
到随着判别器的训练,生成器的梯度均迅速衰减。注意 y 轴是对数坐标轴。
上面只是在直观上分析了 GAN 存在的问题,下面给出文献3的理论分析:
引理 (Lemma1 ) g : Z X 是一个由仿射变换和逐点定义的非线性函数 (ReLUleaky
ReLU sigmoidtanhsoftplus 滑严) 合函数,
g(Z) 包含在可数多个流形的并集中,并且它的维数至多为 dim(Z)因此, dim(Z) < dim(X)
g(Z) X 中测度为 0
Lemma1 表明, generator(G) 是一个神经网络,并且 G 的输入 (随机高斯噪声) 的维数比
产生的图像的维数低,则无论怎样训练,G 也只能产生整个图像空间中很小的部分,有多小呢?
它在图像空间中只是一个零测集。
训练 GAN 时,训练集总归是有限的,P
r
一般可以看成是低维的流形;如果 P
g
也是低维流
形,或者它与 P
r
的支撑集没有交集,则在 (D) 达到最优时,JSD 就会被最大化。D 达到最优将
导致 G 的梯度变得异常地差,训练将变得异常不稳定。下面的几个定理、引理就是证明 P
g
在上
述两种情况下,最优的 D 是存在的。
定理 (Theorem2.1) 若分布 P
r
P
g
的支撑集分别包含在两个无交紧致子集 M P 中,
则存在一个光滑的最优 D : X [0, 1],它的精度是 1,并且,对任意的 x M P
x
D
(x) = 0
定理 2.1 示:如果两概率分布的支集没有交集,则完美的 D 是存的,并 (
两个分布的支撑集的并集)D 梯度为 0,也就是说,这时候任何梯度算法都将失效。这就是
GAN 训练的时候,(在两个概率分布的支撑集没有交集的情况下) D 训练效果很好的时候,G
的更新将变得很差的原因。
http://www.ma-xy.com 119 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
引理 (Lemma 2) M P R
d
的两个非满维度的正则子流形,再设 η η
是任意的
两个独立连续随机变量,定义两个扰动流形
˜
M = M + η
˜
P = P + η
,则
P
η,η
(
˜
M不与
˜
P完美对齐) = 1
Lemma 2 是为定理 2.2 做准备,它表明任意两个非满维的正则子流形都可以通过微小的扰动
使得它们不是完美对齐 (notperfectly align) 的,即它们的交点都是横截相交 (intersect transver-
sally) 的。在这里形象地说明一下横截相交和完美对齐:横截相交 (intersect transversally)对两
个子流形,在任意一个交点处,两者的切平面能够生成整个空间,则称两个子流形横截相交。当
然,如果它们没有交集,则根据定义,它们天然就是横截相交的。下图 (1.79) 给出了一个示例
1.79: 横截相交示意图
在交点 P 处,平面的切平面是其自身,直线的切平面也是其自身,它们可以张成全空间,
此是的,而线没全空间,不是交的;流形
的,在切点处它们的切平面是相同的,也不可能张成全空间,因此也不是横截相交的。完美对齐
(perfectly align): 如果两个子流形有交集,并且在某个交点处,它们不是横截相交的。
P
r
P
g
的支撑集如果存在交集,那么根据 Lemma2我们总可以通过微小的扰动使得它们
不是完美对齐的,也就是说,它们是横截相交的。
引理 (Lemma 3) M P R
d
的两个非完美对齐,非满维的正则子流形,L = MP
M P 无界, L 也是一个流形,且维数严格低于 M P 的维数。若它们有界, L
至多四个维数严格低于全空间的流形之并。无论哪种情形,L M 或者 P 中的测度均为 0
Lemma 3 说的是,两个正则子流形 (满足一定条件:非完美对齐,非满维) 的交集的维数要
严格低于它们自身的维数。也就是说,它们的交集只是冰山一角,小到相对它们自身可以忽略。
对于 P
r
P
g
的支撑集来说,根据 Lemma 2,我们总可以通过微小扰动使得它们是非完美对齐
的,在根据 Lemma 3P
r
P
g
的交集是微不足道。
定理 (Theorem2.2) P
r
P
g
分别是支撑集包含在闭流形 M P 中的两个分布,且它
们非完美对齐、非满维。进一步地,我们假设 P
r
P
g
在各自的流形中分别连续,即:若集合 A
M 中测度为 0,则 P
r
(A) = 0( P
g
上也有类似结果)则存在精度为 1 的最优 D
: X [0, 1]
并且几乎对 M 或者 P 中的任意点 xD
x 的任意邻域内总是光滑的,且有
x
D
(x) = 0
定理 2.1 证明的是对于 P
r
P
g
无交的情形下,最优的 D 是存在的。定理 2.2 承接 Lemma
3证明了在 P
r
P
g
的支撑集有交集,且横截相交的情况下,最优的 D 是存在的。这两个定理
http://www.ma-xy.com 120 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
实际上把两种可能导致 D 优,且梯度消失的情形在理论上做出证明,由于梯度的消失,G
更新将得不到足够的梯度,导致 G 很差。
定理 (Theorem2.3) 在定理 2.2 的条件下,有
JSD(P
r
||P
g
) = log 2
KL(P
r
||P
g
) = +
KL(P
g
||P
r
) = +
定理 2.3 表明,随着 D 越来越好,D loss 将越来越小,趋于 0因此 P
r
P
g
JSD
最大化,达到最大值 log 2这时,P
r
P
g
的交叉熵达到无穷大,也就是说,即使两个分布之间
的差异任意地小,它们之间的 KL 散度仍然会被最大化,趋于无穷。这是什么意思呢?利用 KL
散度来衡量分布间的相似性在这里并不是一个好的选择。因此,我们有必要寻求一个更好的衡量
指标。
定理 (Theorem2.4 (Vanishing gradients on the generator)) g
θ
: Z X 是一
可微函数,有它导出分 P
g
。再设 P
r
为真实数据分布,D 是一个可微的 discriminator如果
Theorem 2.1 Theorem 2.2 足, ε > 0||D D
|| < ε M > 0
E
zp(z)
[||J
θ
g
θ
(z)||
2
2
] M
2
,则
||∇
θ
E
zp(z)
[log(1 D(g
θ
(z)))] ||
2
< M
ϵ
1 ϵ
证明 在证明 Theorem2.1 Theorem2.2 时,我们说 D
P
g
的支撑集上是 locally 0。基
于此,我们对
the support
使用
Jensen
不等式和
chain rule
,有
||∇
θ
E
zp(z)
[log(1 D(g
θ
(z)))] ||
2
2
E
zp(z)
||∇
θ
D(g
θ
(z))||
2
2
|1 D(g
θ
(z))|
2
E
zp(z)
||∇
θ
D
(
g
θ
(
z
))
||
2
2
||J
θ
g
θ
(z)||
2
2
|1 D(g
θ
(z))|
2
< E
zp(z)
(||∇
θ
D(g
θ
(z))||
2
+ ϵ)
2
||J
θ
g
θ
(z)||
2
2
(|1 D(g
θ
(z))| ϵ)
2
= E
zp(z)
ϵ
2
||J
θ
g
θ
(z)||
2
2
(1 ϵ)
2
M
2
ϵ
2
(1 ϵ)
2
由此得到
||∇
θ
E
zp(z)
[log(1 D(g
θ
(z)))] ||
2
< M
ϵ
1 ϵ
定理 2.4 探究了 generator 在前面所述情况下回出现什么问题,它说明了若 G 采用 original
cost function(零和博弈)那么它的梯度的上界被 D 与最优的 D
之间的距离 bound 住。通俗的
说,我们训练 GAN 的时候,D 越接近最优的 D
G 的梯度就越小,如果梯度太小了,梯度
算法不能引导 G 变得更好。
http://www.ma-xy.com 121 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
推论 (corollary 2.1) 在定理 2.4 的假设下,有
lim
||DD
||→0
θ
E
zp(z)
[log(1 D(g
θ
(z)))] = 0
推论 2.1 是定理 2.4 的极限情况。
第二种原始 GAN 形式的问题
第二种原始 GAN 形式 (1.7) 的问题是:最小化第二种生成器 loss 函数,会等价于最小化一
个不合理的距离衡量,这导致两个问题,一是梯度不稳定,二是 collapse mode 即多样性不足。
3又是从两个角度进行了论证:
如前文所说,Ian Goodfellow 提出的“- log D trick”是把生成器 loss 改成
E
xP
g
[log D(x)] (1.11)
上文推导已经得到在最优判别器 D
E
xP
r
[log D
(x)] + E
xP
g
[log(1 D
(x))] = 2JSD(P
r
||P
g
) 2 log 2 (1.12)
可以把 KL 散度 (注意下面是先 g r) 变换成含 D
的形式:
KL(P
g
||P
r
) = E
xP
g
[log
p
g
(x)
p
r
(x)
]
= E
xP
g
log
p
g
(x)/(p
r
(x) + p
g
(x))
p
r
(x)/(p
r
(x) + p
g
(x))
= E
xP
g
log
1 D
(x)
D
(x)
= E
xP
g
log[1 D
(x)] E
xP
g
log D
(x) (1.13)
由式 (1.12)(1.13) 可得最小化目标的等价变形
E
xP
g
[log D
(x)] = KL(P
g
||P
r
) E
xP
g
log[1 D
(x)]
= KL(P
g
||P
r
) 2JSD(P
r
||P
g
) + 2 log 2 + E
xP
r
[log D
(x)] (1.14)
注意上式最后两项不依赖于生成器 G,最终得到最小化 (1.11) 等价于最小化
KL(P
g
||P
r
) 2JSD(P
r
||P
g
) (1.15)
这个化目两个题。第同时化生真实
KL 散度,却又要最大化两者的 JS 散度,一个要拉近,一个却要推远!这在直观上非常荒谬,
数值上则会导致梯度不稳定,这是后面那个 JS 散度项的问题。
二,便 KL 散度病。 KL 量,
KL(P
g
||P
r
) KL(P
r
||P
g
) 是有差别的。以前者为例
1. P
g
(x) 0 P
r
(x) 1 时,P
g
(x) log
P
g
(x)
P
r
(x)
0,对 KL(P
g
||P
r
) 贡献趋近 0
http://www.ma-xy.com 122 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
2. P
g
(x) 1 P
r
(x) 0 时,P
g
(x) log
P
g
(x)
P
r
(x)
+,对 KL(P
g
||P
r
) 贡献趋近正无穷。
换言之,KL(P
g
||P
r
) 于上面两种错误的惩罚是不一样的,第一种错误对应的是“生成
没能生成真实的样本”惩罚微小;第二种错误对应的是“生成器生成了不真实的样本”,惩
巨大。第一种错误对应的是缺乏多样性,第二种错误对应的是缺乏准确性。这一放一打之下,生
成器宁可多生成一些重复但是很“安全”的样本,也不愿意去生成多样性的样本,因为那样一不
小心就会产生第二种错误,得不偿失。这种现象就是大家常说的 collapse mode下面,我们给出
文献3中的理论分析:
定理 (Theorem 2.5) 设连续分布 P
r
P
g
θ
的密度函数 p
r
p
g
θ
。在参数为 θ = θ
0
的最优生成器为
D
=
p
r
p
g
θ
0
+ p
r
E
zp(z)
[−∇
θ
log D
(g
θ
(z))|
θ=θ
0
] =
θ
[KL(P
g
θ
||P
r
) 2JSD(P
g
θ
||P
r
)]|
θ=θ
0
证明 GAN 的原始论文我们已经知道
E
zp(z)
[
θ
log(1 D
(g
θ
(z)))|
θ=θ
0
] =
θ
2JSD(P
g
θ
||P
r
)|
θ=θ
0
此外,Huszar 2016 指出
KL(P
g
θ
||P
r
) = E
xP
g
θ
log
p
g
θ
(x)
p
r
(x)
= E
xP
g
θ
log
p
g
θ
0
(x)
p
r
(x)
E
xP
g
θ
p
g
θ
(x)
p
g
θ
0
(x)
= E
xP
g
θ
log
D
(x)
1 D
(x)
KL(P
g
θ
||P
g
θ
0
)
= E
zp(z)
log
D
(g
θ
(z))
1 D
(g
θ
(z))
KL(P
g
θ
||P
g
θ
0
)
θ = θ
0
处求导,我们有
θ
KL(P
g
θ
||P
g
θ
0
) = −∇
θ
E
zp(z)
log
D
(g
θ
(z))
1 D
(g
θ
(z))
θ=θ
0
θ
KL(P
g
θ
||P
g
θ
0
)|
θ=θ
0
= E
zp(z)
−∇
θ
log
D
(g
θ
(z))
1 D
(g
θ
(z))
θ=θ
0
JSD 减去上述等式,即可得到 Theorem 2.5
定理 2.5 研究了 G loss thelog D cost 时将会出现的问题。我们可以看到,JSD 越大
G 的梯度反而会越小,也就是说,它可能会引导两个分布往相异的方向,此外,上式的 KL 项虽
对产生无意义图像会有很大的惩罚,但是对 mode collapse 惩罚很小,也就是说,GAN 训练时很
容易落入局部最优,产生 mode collapseKL 散度不是对称的, JSD 是对称的,因此 JSD
不能改变这种状况。这就是我们在训练 GAN 时经常出现 mode collapse 的原因。
http://www.ma-xy.com 123 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
定理 (Theorem 2.6 Instability of generator gradient updates) g
θ
: Z X 是一
个可微函数,由它可导出分布 P
g
再设 P
r
为真实数据的分布,且满足定理 2.1 或者定理 2.2
条件之一。令 D 是一个 discriminator,满足 D
D = ϵ 高斯白噪声,且
x
D
x
D = r
也为高斯白噪声,则有
E
zp(z)
[−∇
θ
log D(g
θ
(z))]
的每一维均服从期望和方差为正无穷的中心化柯西分布。
定理 2.6 告诉我们, G 采用 thelog D cost在定理 2.1 或者定理 2.2 的条件下, D
D
足够接近时,G 的梯度会呈现强烈震荡,这也就是说,G 的更新会变得很差,可能导致 GAN
训练不稳定。
实验辅证如下图 (1.80) 所示
1.80: DCGAN 训练 12025 epoch 的训练结果
先分别将 DCGAN 训练 12025 epoch然后固定生成器不动,判别器重新随机初始化
从头开始训练,对于第二种形式的生成器 loss 产生的梯度可以打印出其尺度的变化曲线,可以看
到随着判别器的训练,蓝色和绿色曲线中生成器的梯度迅速增长,说明梯度不稳定,红线对应的
DCGAN 相对收敛的状态,梯度才比较稳定。
(1.80) 给出了定理 2.6 的实验模拟的效果, DCGAN 尚未收敛时,固定 G训练 D
导致 G 的梯度产生强烈震荡。当 DCGAN 收敛时,这种震荡得到有效的抑制。
WGAN 之前的一个过渡解决方案
原始 GAN 题的根源可以归结为两点,一是等价优化的距离衡 (KL 散度、JS 散度)
合理,二是生成器随机初始化后的生成分布很难与真实分布有不可忽略的重叠。
文献3针对第二点提出了一个解决方案,就是对生成样本和真实样本加噪声。直观上说,使
得原本的两个低维流形“弥散”到整个高维空间,强行让它们产生不可忽略的重叠。而一旦存在
重叠,JS 散度就能真正发挥作用,此时如果两个分布越靠近,它们“弥散”出来的部分重叠得越
http://www.ma-xy.com 124 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
多,JS 散度也会越小而不会一直是一个常数,于是 (在第一种原始 GAN 形式下) 梯度消失的问
题就解决了。在训练过程中,我们可以对所加的噪声进行退火 (annealing)慢慢减小其方差,
后面两个低维流形“本体”都已经有重叠时,就算把噪声完全拿掉,JS 散度也能照样发挥作用,
继续产生有意义的梯度把两个低维流形拉近,直到它们接近完全重合。以上就是对原文的直观解
释。
既然 general GAN 用的 loss 不是一种好的选择,有什么 loss 能够有效避免这种情形吗?
一个可行的方案是打破定理的条件, D 的输入添加噪声。后续的几个定理对添加噪声的方法
作了回答。
在这个解决方案下我们可以放心地把判别器训练到接近最优,不必担心梯度消失的问题。
当判别器最优时,可得判别器的最小 loss
min L
D
(P
r+ϵ
, P
g +ϵ
) = E
xP
r+ϵ
[log D
(x)] E
xP
g+ϵ
[log(1 D
(x))] (1.16)
= 2 log 2 2JSD(P
r+ϵ
||P
g +ϵ
) (1.17)
其中 P
r+ϵ
P
g +ϵ
分别是加噪后的真实分布与生成分布。反过来说,从最优判别器的 loss 可以
反推出当前两个加噪分布 JS 度。两个加噪分布 JS 度可以在某种程度上代表两个原
分布的距离,也就是说可以通过最优判别器的 loss 反映训练进程!不过,因为加噪 JS 散度的具
体数值受到噪声的方差影响,随着噪声的退火,前后的数值就没法比较了,所以它不能成为 P
r
P
g
距离的本质性衡量。
定理
(Theorem 3.1)
X
满足分布
P
X
且它的支撑集落在
M
中,
ϵ
是一个密度函数为
p
ϵ
的绝对连续分布,则 P
X+ϵ
也是一个绝对连续分布,具有密度函数
p
X+ϵ
= E
y P
X
[p
ϵ
(x y)]
=
M
p
ϵ
(x y)dP
X
(y)
推论 (corollary 3.1) 1. 如果 ϵ N (0, σ
2
I),则
p
X+ϵ
(x) =
1
Z
M
e
||yx||
2
2σ
2
dP
X
(y)
2. 如果 ϵ N (0, Σ),则
p
X+ϵ
(x) =
1
Z
E
y P
X
e
1
2
||y x||
2
Σ
1
3. 如果 p
ϵ
(x)
1
||x||
d+1
,则
p
X+ϵ
(x) =
1
Z
E
y P
X
1
||x y||
d+1
定理 3.1 和推论 3.1 表明,ϵ 分布会影响我们对距离的选择。对于 P
g +ϵ
P
r+ϵ
,此时的
最优判别器为
D
(x) =
p
r
ϵ
(x)
p
r+ϵ
(x) + p
g +ϵ
(x)
http://www.ma-xy.com 125 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
定理 (Theorem 3.2) P
r
P
g
M P 布, ϵ
N(0, σ
2
I),则梯度具有以下形式
E
zp(z)
[
θ
log(1 D
(g
θ
(z)))] = E
zp(z)
a(z)
M
p
ϵ
(g
θ
(z) y)
θ
||g
θ
(z) y||
2
dP
r
(y)
b(z)
P
p
ϵ
(g
θ
(z) y)
θ
||g
θ
(z) y||
2
dP
g
(y)
其中:a(z), b(z) 是两个正值函数。更进一步的,b > a 当且仅当 p
r+ϵ
> p
g +ϵ
b < a 且仅
p
r+ϵ
< p
g +ϵ
定理 3.2 证明了 G 的梯度可以分为两项,第一项表明,G 会被引导向真实数据分布移动,
二项表明,G 会被引导向概率很高的生成样本远离。作者指出,上述的梯度格式具有一个很严重
的问题,那就是由于 g(Z) 是零测集,D 在优化时将忽略该集合;然而 G 却只在该集合上进行优
化。进一步地,这将导致 D 极度容易受到生成样本的影响,产生没有意义的样本。
推论 (corollary 3.2) ϵ, ϵ
N(0, σ
2
I) 以及 ˜g
θ
(z) = g
θ
(z) + ϵ
,则
E
zp(z)
[
θ
log(1 D
(˜g
θ
(z)))] = E
zp(z)
a(z)
M
p
ϵ
(˜g
θ
(z) y)
θ
||˜g
θ
(z) y||
2
dP
r
(y)
b(z)
P
p
ϵ
(˜g
θ
(z) y)
θ
||˜g
θ
(z) y||
2
dP
g
(y)
= 2
θ
JSD(P
r+ϵ
||P
g +ϵ
)
上述推论中 a, b Theorem3.2 相同,主要的不同是对 D 输入添加噪声,在训练的
程中将引导噪声样本向真实数据流形的方向移动,这可以看成是引导样本的一个小邻域向真实数
据移动。这可以解决 D 极度容易受到生成样本的影响的问题。
证明 在求解生成器时,判别器是固定的,g
θ
(z) 是唯一依赖于 θ 的量 (for every z)。对我们
的损失函数求导,有
E
zp(z)
[
θ
log(1 D
(g
θ
(z)))]
= E
zp(z)
θ
log
p
g +ϵ
(g
θ
(z))
p
r+ϵ
(g
θ
(z)) + p
g +ϵ
(g
θ
(z))
= E
zp(z)
[
θ
log p
g +ϵ
(g
θ
(z))
θ
log(p
r+ϵ
(g
θ
(z)) + p
g +ϵ
(g
θ
(z)))]
= E
zp(z)
θ
p
g +ϵ
(g
θ
(z))
p
g +ϵ
(g
θ
(z))
θ
p
g +ϵ
(g
θ
(z)) +
θ
p
r+ϵ
(g
θ
(z))
p
g +ϵ
(g
θ
(z)) + p
r+ϵ
(g
θ
(z))
= E
zp(z)
1
p
g +ϵ
(g
θ
(z)) + p
r+ϵ
(g
θ
(z))
θ
[p
r+ϵ
(g
θ
(z))]
1
p
g +ϵ
(g
θ
(z)) + p
r+ϵ
(g
θ
(z))
p
r+ϵ
(g
θ
(z))
p
g +ϵ
(g
θ
(z))
θ
[p
g +ϵ
(g
θ
(z))]
http://www.ma-xy.com 126 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
ϵ 的密度为
1
Z
e
||x||
2
2σ
2
。现在,我们定义
a(z) =
1
2σ
2
1
p
g +ϵ
(g
θ
(z)) + p
r+ϵ
(g
θ
(z))
b(z) =
1
2σ
2
1
p
g +ϵ
(g
θ
(z)) + p
r+ϵ
(g
θ
(z))
p
r+ϵ
(g
θ
(z))
p
g +ϵ
(g
θ
(z))
前面我们说 a, b 是正实数。根据 a, b 的表达式,我们有 b = a
p
r+ϵ
p
g+ϵ
并且 b > a 当且仅当 p
r+ϵ
> p
g +ϵ
以及 b < a 当且仅当 p
r+ϵ
< p
g +ϵ
,这正是我们想要的。继续上面的证明,有
E
zp(z)
[
θ
log(1 D
(g
θ
(z)))]
= E
zp(z)
[2σ
2
a(z)
θ
[p
r+ϵ
(g
θ
(z))] 2σ
2
b(z)
θ
[p
g +ϵ
(g
θ
(z))]]
= E
zp(z)
2σ
2
a(z)
M
−∇
θ
1
Z
e
||g
θ
(z)y||
2
2
2σ
2
dp
r
(y)
2σ
2
b(z)
P
−∇
θ
1
Z
e
||g
θ
(z)y||
2
2
2σ
2
dp
g
(y)
= E
zp(z)
a(z)
M
1
Z
e
||g
θ
(z)y||
2
2
2σ
2
θ
||g
θ
(z) y||
2
dp
r
(y)
b(z)
P
1
Z
e
||g
θ
(z)y||
2
2
2σ
2
θ
||g
θ
(z) y||
2
dp
g
(y)
= E
zp(z)
a(z)
M
p
ϵ
(g
θ
(z) y)
θ
||g
θ
(z) y||
2
dp
r
(y)
b(z)
P
p
ϵ
(g
θ
(z) y)
θ
||g
θ
(z) y||
2
dp
g
(y)
Finishing the proof.
定义 (Wasserstein 距离) X 上的两个分布 P, Q Wasserstein 距离/度量/散度 W (P, Q)
定义为
W (P, Q) = inf
γΓ
X×X
||x y||
2
dγ(x, y)
其中,Γ X × X 上所有具有边界分布 P Q 的联合分布集。
Wasserstein 距离,Π(P
r
, P
g
) 中每一个分布的边缘分布都 P
r
P
g
。对于每一个可能
的联合分布 γ 而言,可以从中采样 (x, y) γ 到一个真实样本 x 和一个生成样本 y并算出
这对样本的距离 ||x y||所以可以计算该联合分布 γ 下样本对距离的期望值 E
(x,y )γ
[||x y||]
在所有可能的联合分布中能够对这个期望值取到的下界 inf
γΠ(P
r
,P
g
)
E
(x,y )γ
[||x y||]就定义了
Wasserstein 距离。
直观可以 E
(x,y )γ
[||x y||] 解为 γ 这个“路规划” P
r
这堆“沙土”挪
P
g
“位置”所需的“消耗”,而 W (P
r
, P
g
) 就是“最优路径规划”下的“最小消耗”所以才
Earth-Mover(推土机) 距离。
Wasserstein 距离表示从一个分布转移成另一个分布所需的最小代价。下图 (1.81) 给出了一
个离散分布下的例子, f
1
(x) 迁移成 f
2
(x) 最小代价即是移动 f
1
(x) 在最大值处的 2 个单位的
http://www.ma-xy.com 127 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
概率到最小值处,这样就得到了分布 f
2
(x)。更复杂的离散转移情形则需要求解规划问题,可以
考虑使用最优传输理论。
1.81: 分布转移示意图
引理 (Lemma4) ϵ 是零均值的随机向量,则我们有
W (P
X
, P
X+ϵ
) V
1
2
其中:V = E[||ϵ||
2
2
] ϵ 的方差。
证明 x P
X
y = x + ϵ 并且 ϵ x 独立。 r x, y 的积分域,它有边界 P
X
P
X+ϵ
Therefore
W (P
X
, P
X+ϵ
)
||x y||
2
dγ(x, y)
= E
xP
X
E
y x+ϵ
[||x y||
2
]
= E
xP
X
Ey x + ϵ[||ϵ||
2
]
= E
xP
X
E
ϵ
[||ϵ||
2
]
= E
ϵ
[||ϵ||
2
]
E
ϵ
[
||
ϵ
||
2
2
]
1
2
= V
1
2
where the last inequality was due to Jensen.
引理 4 表明,一个分布于它添加扰动后的分布的 Wasserstein 距离能被扰动的标准差 bound 住。
定理 (Theorem 3.3) P
r
P
g
是任意的两个分布,ϵ 是一个零均值,方差为 V 的随机
向量。若 P
r+ϵ
P
g +ϵ
的支撑集落在直径为 C 的球内,则
W (P
r
, P
g
) 2V
1
2
+ 2C
JSD(P
r+ϵ
||P
g +ϵ
)
http://www.ma-xy.com 128 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
证明
W (P
r
) W (P
r
||P
r+ϵ
) + W (P
r+ϵ
, P
g +ϵ
) + W (P
g +ϵ
, P
g
)
2V
1
2
+ W (P
r+ϵ
, P
g +ϵ
)
2V
1
2
+ Cδ(P
r+ϵ
, P
g +ϵ
)
2V
1
2
+ C(δ(P
r+ϵ
, P
m
) + δ(P
g +ϵ
, P
m
))
2V
1
2
+ C
1
2
KL(P
r+ϵ
||P
m
) +
1
2
KL(P
g +ϵ
||P
m
)
2V
1
2
+ 2C
JSD(P
r+ϵ
||P
g +ϵ
)
上述的过是:rst used the Lemma 4 to bound everything but the middle term as
a funtion of V . After that, we followed by the fact that W (P.Q) Cδ(P, Q)with δ the total
variation, which is a popular Lemma arizing from the Kantorovich - Rubinstein duality.After
that, we used the reiangular inequality on δ and P
m
the mixture distribution between P
g +ϵ
and
P
r+ϵ
. Finally, we used Pinsker’s inequality and later the fact that each individual KL is only one
of the non-negative summands of the JSD.
定理 3.3 告诉我们一个有趣的事实,上式右边两项均能被控制。第一项可以通过逐步减小噪
声来逐步减小;第二项可以通过训练 GAN( D 的输入添加噪声) 来最小化。
作者指出,这种通过 D 的输入添加噪声的解决方案具有一大好处,那就是我们不需要再
担心训练过程。由于引入了噪声,我们可以训练 D 直到最优而不会遇到 G 的梯度消失或者训练
不稳定的问题,此时 G 梯度可以通过推论 3.2 出。加噪方案是针对原 GAN 问题的第二
点根源提出的,解决了训练不稳定的问题,不需要小心平衡判别器训练的火候,可以放心地把判
别器训练到接近最优,但是这种解决方法仍然没能够提供一个衡量训练进程的数值指标。
总而言之,上面从理论上研究了 GAN 训练过程中经常出现的两大问题:G 的梯度消失、
练不定。并提出利用地动离来 P
r
P
g
的相性、对 D 的输入入噪来解
GAN 的两大问题,作者证明了地动距离具有上界,并且上界可以通过有效的措施逐步减小。
这可以说是一个临时性的解决方案,作者甚至没有给出实验进行验证。 WGAN6这篇文章
中,作者提出了更完善的解决方案,并且做了实验进行验证。下面我们就来看一下这篇文章。
Wasserstein 距离的优越性质
常见距离 Martin Arjovsky 在文献6进一步论述了为什么选择 Wasserstein 距离 (地动距离)
X 是一个紧致度量空间,这里讨论的图像空间 [0, 1]
d
就是紧致度量空间。 Σ 表示 X 上的所有
博雷尔集,用 Prob(X) 表示定义在 X 上的概率度量空间。给定 Prob(X) 上的两个分 P
r
, P
g
我们可以定义它们的距离/散度 (注意:散度不是距离,它不是对称的。距离和散度都可以用于衡
量两个分布的相似程度)
http://www.ma-xy.com 129 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
1. 全变差 (Total Variation) 距离
δ(P
r
, P
g
) = sup
AΣ
|P
r
(A) P
g
(A)|
2. KL 散度 (Kullback-Leibler divergence)
KL(P
r
||P
g
) =
log
p
r
(x)
p
g
(x)
p
r
(x)dµ(x)
3. JS 散度 (Jensen - Shannon divergence)
JS(P
r
, P
g
) = KL(P
r
||P
m
) + KL(P
g
||P
m
)
其中:P
m
=
P
r
+P
g
2
4. Wasserstein 距离/地动距离 (Wasserstein/Earth - Mover)
W (P
r
, P
g
) = inf
γΠ(P
r
,P
g
)
E
(x,y γ)
[||x y||] (1.18)
其中:Π(P
r
, P
g
) 表示以 P
r
, P
g
为边缘分布的所有联合分布组成的集合。
Wasserstein
距离相比
KL
散度、
JS
散度的优越性在于,即便两个分布没有重叠,
Wasserstein
距离仍然能够反映它们的远近。
用一个简单的例子来看一下这四种距离/度是怎么计算的。考虑下图 (1.82) 两个均匀分
1.82: 2 个均匀分布距离示意图
二维平面上,P
1
是沿着 y 轴的 [0, 1] 区间上的均匀分布,P
2
是沿着 x = 0,在 y 轴的 [0, 1]
区间上的均匀分布。简而言之,我们可以把 P
1
P
2
看成是两条平行的线段。容易计算
δ(P
1
, P
2
) =
1, θ = 0
0, θ = 0
KL(P
1
||P
2
) = KL(P
2
||P
1
) =
+, θ = 0
0, θ = 0
JS(P
1
, P
2
) =
log 2, θ = 0
0, θ = 0
W (P
1
, P
2
) = |θ|
http://www.ma-xy.com 130 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
θ 0 时,W 0,然 TV 离、KL 散度、JS 度都不收敛。KL 散度和 JS 散度
是突变的,要么最大要么最小,而 Wasserstein 离却是平滑的,如果我们要用梯度下降法优化
θ 这个参数,前两者根本提供不了梯度,但 Wasserstein 距离却可以。类似地,在高维空间中如
果两个分布不重叠或者重叠部分可忽略,则 KL JS 既反映不了远近,也提供不了梯度,但是
Wasserstein 却可以提供有意义的梯度。更严谨的结论由下面的定理给出。
定理 (Theorem 1) P
r
是定义在 X 上的一个固定分布,z 是定义在 Z 空间上的随机变
量。再设 g : Z × R
d
X 是一个函数,记为 g
θ
(z)。记 g
θ
(Z) 的分布为 P
θ
,则
1. g 关于 θ 连续,则 W (P
r
, P
θ
) 也连续;
2. g 满足局部 Lipschitz 条件,局部 Lipschitz 常数为 L(θ, z) E
zp(z)
L(θ, z) < +
W (P
r
, P
θ
) 处处连续,且几乎处处可微。
上述两个结论对 JS 散度和 KL 散度均不成立。定 1 明,地动距离与 JS 散度、KL
度相比,具有更好的性质。
推论 (corollary 1) g
θ
是任意一前向传播网络,有参 θ,并 p(z) 关于 z
率, E
zp(z)
||z|| < +g Lipschitz 条件, L L(θ, z)
E
zp(z)
L(θ, z) < +,则 W (P
r
, P
θ
) 处处连续,且几乎处处可微。
上述推论 1(corollary 1) 表明,将地动距离作为神经网络的目标函数是可行的。
定理 (Theorem 2) P 是紧致空间 X 上的一个分布,并且 (P
n
)
nN
X 上的一个分布
序列,则当 n
1. 下面两个命题是等价的
(a) δ(P
n
, P ) 0 with δ the total variation distace;
(b) JS(P
n
, P ) 0
2. 下面两个命题是等价的
(a) W (P
n
, P ) 0.
(b) P
n
依分布收敛于 P P
n
D
P
3. KL(P
n
||P ) 0 或者 KL(P ||P
n
) 0 能导出结论 1.
4. 结论 1 能导出结论 2.
定理 2(Theorem 2) 表明,如果分布的支撑集在低维流形上,KL 散度、JS 散度和 TV 距离
并不是好的 loss而地动 (EM) 距离则很合适。这启发我们可以用地动距离 (EM) 来设计 loss
替换原来 GAN 采用的 KL 散度。
http://www.ma-xy.com 131 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
Wasserstein 距离到 WGAN
采用 Wasserstein 距离作为 loss GAN WassersteinGAN,一般简写为 WGAN。直
接考 Wasserstein 离需要算 inf,计算是很困难的,因 Wasserstein 距离定义 (1.18) 中的
inf
γΠ(P
r
,P
g
)
没法直接求解。考虑它的 Kantorovich-Rubinstein 对偶形式
W (P
r
, P
θ
) = sup
||f||
L
1
E
xP
r
[
f
(
x
)]
E
xP
θ
[f(x)]
其中:||f ||
L
1 是所有的 1-Lipschitz 函数 f : X R也就是说,Wasserstein 距离实际上需要
考虑所有的 1-Lipschitz 函数。如果我们考虑的是 K-Lipschitz 函数, Wasserstein 距离变为原
来的 K
W (P
r
, P
g
) =
1
K
sup
||f||
L
K
E
xP
r
[f(x)] E
xP
g
[f(x)] (1.19)
(1.19) 的意思就是在要求函数 f Lipschitz 常数 ||f ||
L
不超过 K 的条件下,对所有可
能满足条件 f 取到 E
xP
r
[f(x)] E
xP
g
[f(x)] 的上界,然后再除以 K。特别地,我们可以
一组参数 w 来定义一系列可能的函数 f
w
,此时求解式 (1.19) 可以近似变成求解如下形式
K · W (P
r
, P
g
) max
w:|f
w
|
L
K
E
xP
r
[f
w
(x)] E
xP
g
[f
w
(x)] (1.20)
可以把 f 用一个带参数 w 的神经网络来表示。由于神经网络的拟合能力足够强大,我们有
理由相信,这样定义出来的一系列 f
w
虽然无法囊括所有可能,但是也足以高度近似式 (1.19)
求的那个 sup
||f||
L
K
了。
最后,还不能忘了满足 (1.20) ||f
w
||
L
K 这个限制。我们其实不关心具体的 K 是多
少,只要它不是正无穷就行,因为它只是会使得梯度变大 K 倍,并不会影响梯度的方向。所以作
者采取了一个非常简单的做法,就是限制神经网络 f
θ
的所有参 w
i
的不超过某个范围 [c, c]
比如 w
i
[0.01, 0.01]此时关于输入样 x 导数
f
w
x
也不会超过某个范围,所以一定存
某个不知道的常数 K 使得 f
w
的局部变动幅度不会超过它,Lipschitz 连续条件得以满足。具体
在算法实现中,只需要每次更新完 w 后把它 clip 回这个范围就可以了。
到此为止,我们可以构造一个含参 w、最后一层不是非线性激活层的判别器网络 f
w
,在
限制 w 不超过某个范围的条件下,使得
L = E
xP
r
[f
w
(x)] E
xP
g
[f
w
(x)] (1.21)
尽可到最大, L 就会似真与生布之 Wasserstein 距离 (忽略数倍
K)。注意原 GAN 的判别器做的是真假二分类任务,所以最后一层 sigmoid但是现在
WGAN 中的判别器 f
w
做的是近似拟合 Wasserstein 距离,属于回归任务,所以要把最后一层的
sigmoid 拿掉。
接下来生成器要近似地最小化 Wasserstein 距离,可以最小 L由于 Wasserstein 距离的
优良性质,我们不需要担心生成器梯度消失的问题。再考虑到 L 的第一项与生成器无关,就得到
http://www.ma-xy.com 132 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
WGAN 的两个 loss
E
xP
g
[f
w
(x)] (1.22)
E
xP
g
[f
w
(x)] E
xP
r
[f
w
(x)] (1.23)
(1.21) 是式 (1.23) 反,可以指示训练进程,其数值越小,表示真实分布与生成分布的
Wasserstein 距离越小,GAN 训练得越好。
G = g
θ
, D = f
w
,则上式 (1.21) 写为
max
D
E
xP
r
[D(x)] E
zp(z)
[D(G(z))]
我们再次回顾一下原 GAN 中的目标
max
D
E
xP
r
[log D(x)] E
zp(z)
[log(1 D(G(z)))]
可以看到,如果把 GAN 的目标函数的 log 去掉,则两者只相差一个常数,也就是说,WGAN
训练的时候 GAN 几乎一样,除了 loss 算的时候不取对数!Loss function 中的对数函数导
致了 GAN 训练的不稳定!
定理 (Theorem 3) P
r
是任一分布,P
θ
g
θ
(Z) 的分布,其中 Z 的先验概率密度函数
p(z)g 足局 Lipschitz 条件,局部 Lipschitz 常数为 L(θ, z),且 E
zp(z)
L(θ, z) < +
则下述问题存在解 f : X R
max
||f||
L
1
E
xP
r
[f(x)] E
xP
θ
[f(x)]
并且,我们有
θ
W (P
r
, P
θ
) = E
zp(z)
[
θ
f(g
θ
(z))]
when both terms are well-dened
定理 3(Theorem 3) 证明了若 D G 的学习能力足够强的话 (因此目标函数能够被最大化)
WGAN 是有解的。改进后相比原始 GAN 的算法实现流程却只改了四点:
1. 判别器最后一层去掉 sigmoid
2. 生成器和判别器的 loss 不取 log
3. 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数 c
4. 不要用基于动量的优化算法 (包括 momentum Adam),推荐 RMSPropSGD 也行。
三点分析的,经介毕;点却中发的,
trick。作发现果使 Adam,判别 loss 时候崩掉,它崩时,Adam 给出
新方向与梯度方向夹角的 cos 值就变成负数,更新方向与梯度方向南辕北辙,这意味着判别器的
loss 度是稳定的,所以不适合 Adam 类基动量的优化算法。作者改 RMSProp
后,问题就解决了,因为 RMSProp 适合梯度不稳定的情况。
http://www.ma-xy.com 133 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
WGAN 程序
WGAN 算法伪代码如 (7) 所示
7 WGAN,our proposed algorithm. All experiments in the used the default values α =
0.00005,c = 0.01,m = 64,n
critic
= 5
1: 初始化:学习率 α,修剪参数 c;批量大小 m;循环 n
critic
;初始化 critic 的参数 w
0
,生成
G 的参数 θ
0
2: while 未达到停止准则 do
3: for t = 1 to n
critic
do
4: 采样 {x
(i)
}
m
i=1
P
r
5: 采样 {z
(i)
}
m
i=1
P
z
6:
g
w
w
1
m
m
i=1
f
w
(x
(i)
)
1
m
m
i=1
f
w
(g
θ
(z
(i)
))
7: w w + α · RMSProp(w, g
w
)
8: w clip(w, c, c)
9: end for
10: 采样 {z
(i)
}
m
i=1
P
z
11: 更新 g
θ
θ
1
m
m
i=1
f
w
(g
θ
(z
(i)
))
12: θ θ α · RMSProp(w, g
θ
)
13: end while
WGAN 源码实现
¾
¿
。下面给出 WGAN TensorFlow 程序
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 mb_size = 32
8 X_dim = 784
9 z_dim = 10
10 h_dim = 128
11 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
12 de f p l o t ( samples ) :
13 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
14 gs = g r idspe c . GridSpec (4 , 4)
15 gs . update ( wspace =0.05 , hspace =0.05)
16 f o r i , sample in enumerate ( samples ) :
17 ax = p l t . subplot ( gs [ i ] )
¾
https://github.com/martinarjovsky/WassersteinGAN
¿
https://github.com/wiseodd/generative-models
http://www.ma-xy.com 134 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
18 p l t . a x i s ( o f f )
19 ax . s e t _x t i c kl a b e ls ( [ ] )
20 ax . s e t _y t i c kl a b e ls ( [ ] )
21 ax . set_aspect ( equal )
22 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
23 ret ur n f i g
24 de f x a v i e r_init ( s i z e ) :
25 in_dim = s i z e [ 0 ]
26 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
27 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
28 X = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
29 D_W1 = t f . Variabl e ( x a v i e r _ i n it ( [ X_dim, h_dim ] ) )
30 D_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim] ) )
31 D_W2 = t f . Variabl e ( x a v i e r _ i n it ( [ h_dim, 1 ] ) )
32 D_b2 = t f . Variable ( t f . z e r o s ( shape = [1] ) )
33 theta_D = [D_W1, D_W2, D_b1, D_b2]
34 z = t f . p l aceho l d e r ( t f . f l o a t 3 2 , shape=[None , z_dim ] )
35 G_W1 = t f . Varia bl e ( x a v i e r _ i nit ( [ z_dim , h_dim ] ) )
36 G_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim ] ) )
37 G_W2 = t f . Varia bl e ( x a v i e r _ i nit ( [ h_dim, X_dim] ) )
38 G_b2 = t f . Variable ( t f . z e r o s ( shape=[X_dim] ) )
39 theta_G = [G_W1, G_W2, G_b1, G_b2]
40 de f sample_z (m, n) :
41 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
42 de f ge ner ator ( z ) :
43 G_h1 = t f . nn . re l u ( t f . matmul( z , G_W1) + G_b1)
44 G_log_prob = t f . matmul(G_h1, G_W2) + G_b2
45 G_prob = t f . nn . sigmoid (G_log_prob)
46 ret ur n G_prob
47 de f d i s c r i m in a t or (x) :
48 D_h1 = t f . nn . r e lu ( t f . matmul(x , D_W1) + D_b1)
49 out = t f . matmul(D_h1, D_W2) + D_b2
50 ret ur n out
51 G_sample = ge ner ato r ( z )
52 D_real = di s c r i m in a t or (X)
53 D_fake = d i s c ri m i n at o r (G_sample)
54 D_loss = t f . reduce_mean( D_real ) t f . reduce_mean (D_fake)
55 G_loss = t f . reduce_mean(D_fake)
56 D_solver = ( t f . t r ai n . RMSPropOptimizer ( l ea rni ng_ rat e=1e4)
57 . minimize(D_loss , va r _ l i s t=theta_D ) )
58 G_solver = ( t f . t r a i n . RMSPropOptimizer( lear nin g_r ate=1e4)
59 . minimize ( G_loss , v a r _l i st=theta_G ) )
60 clip_D = [ p . a s s i g n ( t f . clip_by_value (p , 0.01 , 0. 0 1 ) ) f or p i n theta_D ]
61 s e s s = t f . Ses s i on ( )
62 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
63 i f not os . path . e x i s t s ( out/ ) :
64 os . makedirs ( out/ )
65 i = 0
66 f o r i t in range (1000000) :
67 f o r _ i n range (5) :
68 X_mb, _ = mnist . t r a in . next_batch (mb_size )
69 _, D_loss_curr , _ = s e s s . run (
70 [ D_solver , D_loss , clip_D ] ,
http://www.ma-xy.com 135 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
71 fee d_ di ct={X: X_mb, z : sample_z ( mb_size , z_dim) }
72 )
73 _, G_loss_curr = s e s s . run (
74 [ G_solver , G_loss ] ,
75 fee d_dict={z : sample_z (mb_size , z_dim) }
76 )
77 i f i t % 100 == 0 :
78 p r i n t ( I t e r : {}; D l o s s : { : . 4 } ; G_loss : { : . 4 }
79 . format ( i t , D_loss_curr , G_loss_curr ) )
80 i f i t % 1000 == 0:
81 samples = se s s . run (G_sample , feed_d ic t={z : sample_z (1 6 , z_dim) })
82
83 f i g = pl o t ( samples )
84 p lt . s a v ef i g ( out /{ }. png
85 . format ( s t r ( i ) . z f i l l ( 3) ) , bbox_inches= t i g ht )
86 i += 1
87 p l t . c l o s e ( f i g )
88
WGAN 实验:对 WGAN 作者做了不少实验验证,下面只提比较重要的三点。第一,判别
器所近似的
Wasserstein
距离与生成器的生成图片质量高度相关。
Wasserstein
距离越小,
G
生的图像质量就越高。先前的 GAN 由于训练不稳定,我们很难通过 loss 去判断 G 产生的质
(先前的 GAN loss 大小并不能表明产生图像质量的高低),如下图 (1.83) 所示
1.83: Wasserstein 距离与生成器的生成图片质量
第二,WGAN 如果用类似 DCGAN 架构,生成图片的效果与 DCGAN 差不多,如图 (1.84)
所示
1.84: WAGN DCGAN 对比图
但是厉害的地方在 WGAN DCGAN 种特殊的架构设计也能做到不错的效果,如
果一起拿掉 Batch Normalization 的话,DCGAN 就崩了而 WGAN 不会,如图 (1.85) 所示
http://www.ma-xy.com 136 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.85: DCGAN 去掉 BN 的崩溃
如果 WGAN 原始 GAN 都使用多层全连接网络 (MLP),不 CNNWGAN 量会变
差些,但是原 GAN 仅质量变得更差,而且还出现 collapse mode即多样性不足,如
(1.86) 所示
1.86: WGAN DCGAN 去掉 CNN 对比结果
第三,在所有 WGAN 的实验中未观察到 collapse mode,作者也只说应该是解决了。
1.6.13 Improved WGAN
问题分析
WGAN 虽然克服 GAN 度消等问题,但在某些设下,WGAN 生成样本仍然
是低质量的,甚至不收敛。文献17作者发现,WGAN 强行使 critic lipschitz 连续的权重修
剪技术 (weight clipping) 会导致 WGAN 失败。为了强行使用 lipschitz 连续,作者 improved
WGAN 设置了一个交替的方法:惩罚 critic 梯度的范数。相对而言,Improved WGAN 有更
快的收敛速度和更高的图像质量。
WGAN 的价值函数是通过 Kantorovich-Rubinstein 对偶建立的
min
G
max
D∈D
E
xp
r
[D(x)] E
˜xp
g
[D(˜x)]
其中:D 是一个 1-lipschitz 函数集,˜x = G(z), z p
z
一个公开的问题是如何有效的对 critic
lipschitz 束?Arjovsky WGAN 中使用了权重裁剪技术,使权重在 [c, c] 范围 (每当
更新完一次判别器的参数之后,就检查判别器的所有参数的绝对值有没有超过一个阈值。通过在
训练过程中保证判别器的所有参数有界,就保证了判别器不能对两个略微不同的样本给出天差地
别的分数值,从而间接实现了 Lipschitz 限制)
如果在 Kantorovich-Rubinstein 对偶 D
下,最优的 critic 是可微的,并且 x 是生成分布 p
g
的一个样本,那么,存在一个 p
r
中的点 yD
的梯度在所有点 x
t
= (1 t)x + ty 直接通向 y
D
(x
t
) =
y x
t
||y x
t
||
这意味着最 WGAN critic 的梯度范数 1(almost everywhere p
r
and p
g
)。作者发现 WGAN
的优化通常是困难的,即便当优化成功时,critic 也可能会有比较粗糙的值。下面,我们将展
这些问题及它们的影响 (weight clipping 的实现方式存在两个严重问题)
http://www.ma-xy.com 137 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
实验表明,修剪每一个权重或者修剪权重的 1 阶范数、2 阶范数都会导致相同的问题,这有
可能是因为 clip“损伤”了 WGAN 的训练。但是,我们不能声称每一次训练都有问题,特别是
WGAN 权重剪枝和 batch normalization 技术一起使用的时候。有些时候,BN 是有用的,
某些时候,特别是深度网络时,优化仍然困难。在 Improved WGAN 中没有 BN WGAN
可以成功训练。
优化带权重约束的 critic 相当于优化所有 k-lipschitz 函数的一个小子集。作者发现,这会导
致许多问题,即便当优化任务收敛后,critic 可能收敛到一个非常差的情况。最优的 critic(
WGAN 损失函数下) 的梯度范数 1,然而在权重修剪约束下,大多数网络在学习简单函数时,
只能够达到的梯度范数为 k。因此,通过权重修剪来达到 k-lipschitz 约束会使 critic 变成简单函
数。例如在权重修剪下,最优 critic 可能包含许多重复的隐含神经元,忽略网络中的对称性,这
最终被汇总来最大化 the out 的最终比例。这种策略在最大化 p
r
p
g
散度时可能是最优的,
是这会导致在训练 G 时缺失有价值的梯度。
为了证明这一点,我们训练 WGAN critic(clipping) 来优化 3 个实验分布:保持生成分布 p
g
固定,在真实分布 p
r
中添加单位方差的高斯噪声,在图 (1.87) 中给出 critics 的价值曲面
1.87: critics 的价值曲面
注意, Improved WGAN critic 中忽略了 BN 3 种实验分布下,通过权重修剪训练的
critics 忽略了数据分布的高阶矩,并且非常简单的接近最优函数。相比之下,Improved WGAN
没有这种问题。
如果权重被约束的太小,前层的反向传播带来的梯度会消失。另一方面,如果权重被约束的
太大,网络会发生梯度爆炸。这是因为 Weight clipping 独立地限制每一个网络参数的取值范围,
在这种情况下,最优的策略就是尽可能让所有参数走极端,要么取最大值要么取最小值!为了验
证这一点,作者统计了经过充分训练的判别器中所有网络参数的数值分布,在图 (1.88)(b) 左图
中展示了这一情况。这样带来的结果就是,判别器会非常倾向于学习一个简单的映射函 (想想
看,几乎所有参数都是 ±0.01这可以直接视为一个二值神经网络)判别器没能充分利用自身的
模型能力,经过它回传给生成器的梯度也会跟着变差。
http://www.ma-xy.com 138 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.88: WGAN 梯度消失和爆炸
为了明基于权裁剪 WGAN 发生梯度失和爆炸,们在 Swiss Roll 分布
WGAN c [10
1
, 10
2
, 10
3
] critic loss 模。
WGAN 中的 critic G 都是 12- depReLuMLPs,并且没有 BN。在图 (1.88)(a) 中,横轴代
表判别器从低到高第几层,纵轴代表梯度回传到这一层之后的尺度大小 (注意纵轴是对数刻)
c clipping threshold。结果表明:对于每个 c,梯度会指数增长或减小,因为我们在网络中移
动更远。
WGAN 中使用 BN 技术,梯度消失或爆炸问题可能会有所减缓。然而,即使使用 BN
deep WGAN critics 也经常获得坏的情况,甚至学习失败。
梯度惩罚
前面提到,Lipschitz 限制是要求判别器的梯度不超过 K,那我们何不直接设置一个额外的
loss 项来体现这一点呢?比如
ReLU(||∇
x
D(x)||
p
K)
不过,既然判别器希望尽可能拉大真假样本的分布差距,那自然是希望梯度越大越好,变化幅度
越大越好,所以判别器在充分训练之后,其梯度 norm 其实就会是在 K 附近。知道了这一点,
们可以把上面的 loss 改成要求梯度 norm K 越近越好,效果是类似
[||∇
x
D(x)||
p
K]
2
前面提到过最佳 WGAN critic 的梯度范数 1(almost everywhere p
r
and p
g
)。我们 K
1,将上述目标和 WGAN 原来 critic 的目标 loss 加权合并,得到新的 critic loss
L
critic
= E
˜xp
g
[D(˜x)] E
xp
r
[D(x)] + λE
xp
x
[(||∇
x
D(x)||
2
1)
2
]
上面的目标中有些个问题,3 loss 项都是期望的形式,在实现上要变成采样的形式。前面
两个期望的采样是一般的,第一个期望是从真样本集里面采,第二个期望是从生成器的噪声输入
http://www.ma-xy.com 139 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
分布采样后,再由生成器映射到样本空间。可是第三个分布要求我们在整个样本空间 P
x
上采样,
这变得非常棘手。由于维度灾难问题,如果要通过采样的方式在图片或自然语言这样的高维样本
空间中估计期望值,所需样本量是指数级的,实际上没法做到。作者提出,其实我们没必要在整
个样本空间上施加 Lipschitz 制,只要重点抓住生成样本集中区域、真实样本集中区域以及夹
在它们中间的区域就行了。具体来说,我们先随机采一对真假样本,还有一个 0-1 的随机数:
ϵ U[0, 1], x p
r
, ˜x p
g
然后在 x
r
x
g
的连线上随机插值采样
ˆx = ϵx + (1 ϵ)˜x
定义 ˜x 的分布为 p
˜x
,并且 ˆx p
r
, p
g
的线性采样样本。最终得到 Imoroved WGAN loss
L
critic
= E
˜xp
g
[D(˜x)] E
xp
r
[D(x)] + λE
ˆxp
ˆx
[(||∇
˜x
D(˜x)||
2
1)
2
]
λ 的情况下,我们建的最优 critic 然是 Kantorovich-Rubinstein 偶下的最
critic因此,给定 critic 足够的能力,G 的代价函数仍能回复真实的 Wasserstein 距离,这个在
原始剪枝 WGAN 中不是必然发生的。梯度部分 ||∇
˜x
D(˜x)||
2
是无参数 D 关于点 ˜x 的梯度。
超参数 λ 设置为 10。许多 GAN G D 中都采用了 BN 技术,但在 Improved WGAN
中,BN 不适用,这是由于我们是对每个样本独立地施加梯度惩罚,判别器的模型架构中不能使
Batch Normalization,因为它会引入同个 batch 中不同样本的相互依赖关系。如果需要的话,
可以选择其他 normalization 方法,如 Layer NormalizationWeight Normalization Instance
Normalization,这些方法就不会引入样本之间的依赖,这里推荐 Layer Normalization
Improved WGAN 程序
Mali GAN 的伪代码如 (5) 所示
Improved WGAN TensorFlow 程序如下
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 mb_size = 32
8 X_dim = 784
9 z_dim = 10
10 h_dim = 128
11 lam = 10
12 n_disc = 5
13 l r = 1e4
14 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
15 de f p l o t ( samples ) :
16 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
17 gs = g r idspe c . GridSpec (4 , 4)
http://www.ma-xy.com 140 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
算法 8 WGAN with gradient penalty.We use default values of λ = 10n
critic
= 5α = 0.0001
β
1
= 0.5β
2
= 0.9.
1: 始化:梯度约束的超参数 λcritic 循环次数 n
critic
;迭代数 tt
max
;判别器训练次数
k;批量大小 mAdam 的超参数 α, β
1
, β
2
2: for t = 1, 2, . . . , t
max
do
3: for k = 1, . . . , n
critic
do
4: for i = 1, . . . , m do
5: Sample real data x p
r
, latent variable z p
z
,a random number ϵ U[0, 1]
6: ˜x G
θ
(z)
7: ˆx ϵx + (1 ϵ)˜x
8: L
(i)
D
w
(˜x) D
w
(x) + λ(||∇
ˆx
D
w
(ˆx)||
2
1)
2
9: end for
10: w Adam(
w
1
m
m
i=1
L
(i)
, w, α, β
1
, β
2
)
11: end for
12: Sample a batch of latent variables {z
(i)
}
m
i=1
p(z)
13: θ Adam(
w
1
m
m
i=1
D
w
(G
θ
(z)), θ, α, β
1
, β
2
)
14: end for
18 gs . update ( wspace =0.05 , hspace =0.05)
19 f o r i , sample in enumerate ( samples ) :
20 ax = p l t . subplot ( gs [ i ] )
21 p l t . a x i s ( o f f )
22 ax . s e t _x t i c kl a b e ls ( [ ] )
23 ax . s e t _y t i c kl a b e ls ( [ ] )
24 ax . set_aspect ( equal )
25 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
26 ret ur n f i g
27 de f x a v i e r_init ( s i z e ) :
28 in_dim = s i z e [ 0 ]
29 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
30 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
31 X = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
32 D_W1 = t f . Variabl e ( x a v i e r _ i n it ( [ X_dim, h_dim ] ) )
33 D_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim] ) )
34 D_W2 = t f . Variabl e ( x a v i e r _ i n it ( [ h_dim, 1 ] ) )
35 D_b2 = t f . Variable ( t f . z e r o s ( shape = [1] ) )
36 theta_D = [D_W1, D_W2, D_b1, D_b2]
37 z = t f . p l aceho l d e r ( t f . f l o a t 3 2 , shape=[None , z_dim ] )
38 G_W1 = t f . Varia bl e ( x a v i e r _ i nit ( [ z_dim , h_dim ] ) )
39 G_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim ] ) )
40 G_W2 = t f . Varia bl e ( x a v i e r _ i nit ( [ h_dim, X_dim] ) )
41 G_b2 = t f . Variable ( t f . z e r o s ( shape=[X_dim] ) )
42 theta_G = [G_W1, G_W2, G_b1, G_b2]
43 de f sample_z (m, n) :
44 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
http://www.ma-xy.com 141 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
45 de f G( z ) :
46 G_h1 = t f . nn . re l u ( t f . matmul( z , G_W1) + G_b1)
47 G_log_prob = t f . matmul(G_h1, G_W2) + G_b2
48 G_prob = t f . nn . sigmoid (G_log_prob)
49 ret ur n G_prob
50 de f D(X) :
51 D_h1 = t f . nn . r e lu ( t f . matmul(X, D_W1) + D_b1)
52 out = t f . matmul(D_h1, D_W2) + D_b2
53 ret ur n out
54 G_sample = G( z )
55 D_real = D(X)
56 D_fake = D(G_sample)
57 eps = t f . random_uniform ( [ mb_size , 1 ] , minval =0. , maxval=1.)
58 X_inter = eps *X + ( 1 . eps ) *G_sample
59 grad = t f . g r a d i e n t s (D( X_inter ) , [ X_inter ] ) [ 0 ]
60 grad_norm = t f . s q r t ( t f . reduce_sum ( ( grad ) **2 , a x i s =1))
61 grad_pen = lam * t f . reduce_mean(grad_norm 1 . ) **2
62 D_loss = t f . reduce_mean(D_fake ) t f . reduce_mean( D_real ) + grad_pen
63 G_loss = t f . reduce_mean(D_fake)
64 D_solver = ( t f . t r ai n . AdamOptimizer ( l ea rni ng_ rat e=l r , beta1 =0.5)
65 . minimize ( D_loss , v a r _ l i s t=theta_D ) )
66 G_solver = ( t f . t r a i n . AdamOptimizer( lear nin g_r ate=l r , beta1 =0.5)
67 . minimize ( G_loss , v a r _l i st=theta_G ) )
68 s e s s = t f . Ses s i on ( )
69 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
70 i f not os . path . e x i s t s ( out/ ) :
71 os . makedirs ( out/ )
72 i = 0
73 f o r i t in range (1000000) :
74 f o r _ i n range ( n_disc ) :
75 X_mb, _ = mnist . t r a in . next_batch (mb_size )
76 _, D_loss_curr = se s s . run (
77 [ D_solver , D_loss ] ,
78 fee d_ di ct={X: X_mb, z : sample_z ( mb_size , z_dim) }
79 )
80 _, G_loss_curr = s e s s . run (
81 [ G_solver , G_loss ] ,
82 fee d_dict={z : sample_z (mb_size , z_dim) }
83 )
84 i f i t % 1000 == 0:
85 p r i n t ( I t e r : {}; D l o s s : { : . 4 } ; G_loss : { : . 4 }
86 . format ( i t , D_loss_curr , G_loss_curr ) )
87 i f i t % 1000 == 0:
88 samples = se s s . run (G_sample , feed_d ic t={z : sample_z (1 6 , z_dim) })
89 f i g = pl o t ( samples )
90 p lt . s a v ef i g ( out /{ }. png
91 . format ( s t r ( i ) . z f i l l ( 3) ) , bbox_inches= t i g ht )
92 i += 1
93 p l t . c l o s e ( f i g )
94
Improved WGAN clipping WGAN 等在 CIFAR-10 上收敛速度的比较如图 (1.89) 所示
http://www.ma-xy.com 142 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.89: Improved WGAN 的收敛速度
1.6.14 Loss Sensitive GAN
LS-GAN 模型建立
在损失敏感生成对抗网络 (LS-GAN) 中,我们放弃学习一个判别器 D ,而是设置一个损失
函数 L
θ
(x),并且假设真实样 x P
r
有小的损失,假样 x = G(z), z p
z
有大的损失。对
于一个给定的 G
ϕ
,我们的目标是求 L
θ
( θ) 使得
min
θ
E
xp
r
L
θ
(x) E
zp
z
L
θ
(G
ϕ
(z))
要求真假样本的损失在一定范围内,可以设置如下约束 (constraint)
L
θ
(x) L
θ
(G
ϕ
(z)) ∆(x, G
ϕ
(z))
其中:∆(x, G
ϕ
(z)) 表示 x G
ϕ
(z) 之间的不同。现在引入松弛变量 ξ
x,z
L
θ
(x) ξ
x,z
L
θ
(G
ϕ
(z)) ∆(x, G
ϕ
(z))
ξ
x,z
0
G
ϕ
(z) 违反约束时,ξ
x,z
可能是非 0 的。对于一个给定的 G
ϕ
参数 θ 的损失函数的训练目标
min
θ
E
xp
r
L
θ
(x) + λE
xp
r
,zp
z
ξ
x,z
s.t.
L
θ
(x) ξ
x,z
L
θ
(G
ϕ
(z)) ∆(x, G
ϕ
(z))
ξ
x,z
0
其中:λ 是权重参数。目标中的第一项是真实样本损失最小,第二项是违反约束造成的损失的期
Eξ
x,z
最小。不失为一般性,我们要求损失函数是非正的,后面将会指出,在某些情况下,非
正要求可以去掉。
http://www.ma-xy.com 143 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
在给定最优损失 L
θ
后,对生成器 G 而言,目标为
min
ϕ
E
zp
z
L
θ
(G
ϕ
(z))
L
θ
, G
ϕ
仍然是交替优化的,最优参数 (θ
, ϕ
) 的优化过程为:¬ θ 的优化是在固定 ϕ
的基础
上,求
min
θ
S
(
θ, ϕ
) =
E
xp
r
L
θ
(x) + λE
x
p
r
,zp
z
(∆(x, G(z)) + L
θ
(x) L
θ
(G(z)))
+
其中:(a)
+
= max(a, 0)
ϕ 的优化是在固定 θ
的基础上,求
min
ϕ
T (θ
, ϕ) = E
zp
z
L
θ
(G(z))
注意到,当假样本 G(z) 的损失和真样本 x 的损失在约束范围内, L
θ
(x)L
θ
(G(z))+∆(x, G(z)) <
0 时,S(θ, ϕ
) 第二项的损失为 0这使得当生成样本和真实样本很接近时,我们不必要求他们的
L 函数非得有一个固定间隔,因为这个时候生成的样本已经非常好了。这样 LS-GAN 就可以集中
力量提高那些距离真实样本还很远,真实度不那么高的样本,这样就可以更合理的使用 LS-GAN
的建模能力。在后面,一旦限定了建模能力后,不用再担心模型的生成能力有损失了,这个我们
称“按需分配”。图 (1.90) 阐述了 LS-GAN 背后的“按需分配”的想法。
1.90: LSGAN-gure1
边界 (magin) 是为了区分真假样本,它不是一个固定的常数,它依赖于数据。当生成器生成
越来越好的样本时,它会消失。假设真实密度函数 p
r
lipschitz 的,以便于证明结论。
(θ
, ϕ
) 是上面优化问题的纳什均衡,我们可以得到, λ 时, G
ϕ
得到的密度
p
G
将收敛到真实分布 p
r
。为了证明这个结论,先进行如下定义
定义 (Lipschitz 函数) 对于的两样本 x, z称损 F (x) Lipschitz 连续的,
如果
|F (x) F (z)| k∆(x, z)
其中:k lipschitz 常数,k < 为距离度量。
http://www.ma-xy.com 144 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
先将 LS-GAN 要建模的样本分布 p
r
限定在 lipschitz 密度上,即
假设 (1) 数据密度 p
r
有劲支撑集,且是 Lipschitz 连续的。
对于 Lipschitz 度,简言之,Lipschitz 密度就是要求 p
r
不能变化的太快,密度的变化
着样本的变化不能无限的大,要有个度。不过这个都可以非常大,只要不是无限大就好。这个假
设还是很弱的,大部分分布都满足之,比如:我们将一个图像调的稍微亮一些,它看上去仍然应
该是真实的图像。在真实图像中,密度在 lipschitz 假设下不应该有突然的、剧烈的变化。
引理 (1) 在假设 1 下,给定一个纳什均衡 (θ
, ϕ
),并且 p
G
lipschitz 连续的,有
x
|p
r
(x) p
G
(x)|dx
2
λ
因此,当 λ 时,p
G
收敛到 p
r
在证明引理 1 之前,先给出如下引理
引理 (4) 对于 2 个概率分布 p(x) q(x),如果 p(x) ηq(x) a.e (almost everywhere),有
x
|p(x) q(x)|dx
2(1 η)
η
其中:η (0, 1]
证明 我们有如下等式和不等式
x
|p(x) q(x)|dx
=
x
1
[p(x)q (x)]
(p(x) q(x))dx +
x
1
[p(x)<q (x)]
(q(x) p(x))dx
=
x
1
1
[p(x)<q (x)]
(p(x) q(x))dx +
x
1
[p(x)q (x)]
(q(x) p(x))dx
= 2
x
1
[p(x)<q (x)]
(q(x) p(x))dx
2
1
η
1
x
1
[p(x)<q (x)]
p(x)dx
2(1 η)
η
现在来证明引理 1
证明 假设 (θ
, ϕ
) 是优化问题 S, T 的一个纳什均衡,那么,一方面我们有
S(θ
, ϕ
) E
xp
r
L
θ
(x) + λE
xp
r
,zp
z
(∆(x, G(z)) + L
θ
(x) L
θ
(G(z)))
=
x
p
r
(x)L
θ
(x)dx + λE
xp
r
,zp
z
∆(x, G(z))
+ λ
x
p
r
(x)L
θ
(x)dx λ
G(z)
p
G
(G(z))L
θ
(G(z))dG(z)
=
x
((1 + λ)p
r
(x) λp
G
(x))L
θ
(x)dx + λE
xp
r
,zp
z
∆(x, G(z))
http://www.ma-xy.com 145 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
上面的第一个不等式使用了 (a)
+
a
对于任意的 G
ϕ
,我们也会 T (θ
, ϕ
) T (θ
, ϕ)ϕ
T (θ
, ϕ
) 的最小点。特别地,
以将 T (θ
, ϕ) 中的 p
G
(x) p
r
(x) 替代,有
x
L
θ
(x)p
G
(x)dx
x
L
θ
(x)p
r
(x)dx
S(θ
, ϕ
) 应用上述不等式,有
S(θ
, ϕ
)
x
p
r
(x)L
θ
(x)dx + λE
xp
r
,zp
z
∆(x, G(z))
λE
xp
r
,zp
z
∆(x, G(z)) (1.24)
上式得后一个不等式使用了 L
θ
(x) 非负的条件。
另一方面,考虑一个具体的损失函数 (loss funtion)
L
θ
(x) = α((1 λ)p
r
(x) + λp
g
(x))
+
(1.25)
其中:α 是一个小的正常数。L
θ
(x) 是一个非扩张函数 (nonexpansive function)根据 p
r
, p
g
Lipschitz 连续假设,有
∆(x, G(z)) + L
θ
(x) L
θ
(G(z)) 0 (1.26)
L
θ
(x) 代入到 S(θ, ϕ
) 中,有
S(θ, ϕ
) =
x
((1 + λ)p
r
(x) λp
g
(x))L
θ
(x)dx + λE
xp
r
,zp
z
∆(x, G
(x))
= α
x
((1 λ)p
r
(x) + λp
g
(x))
2
+
dx + λE
xp
r
,zp
z
∆(x, G(z))
第一个等式利用了式 (1.26)第二个等式利用了式 (1.25)假设 (1 + λ)p
r
(x) λp
G
(x) < 0 在一
个非零测度上,则上面的等式有一个严格上界
S(θ
, ϕ
) S(θ, ϕ
) < λE
xp
r
,zp
z
∆(x, G(z))
这个结论与式 (1.24) 相违背。因此,我们一定会有
p
r
(x)
λ
1 + λ
p
G
(x) a.e
利用引理 4,有
x
|p
r
(x) p
G
(x)|dx
2
λ
λ 时,有
x
|p
r
(x) p
G
(x)|dx 0
这证明了当 λ 时,p
G
收敛到 p
r
http://www.ma-xy.com 146 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
引理 (2) 在假设 1 下,存在一个纳什均衡 (θ
, ϕ
),并且 L
θ
, p
G
lipschitz 连续的。
将引理 1 和引理 2 合并,有如下定理
定理 (Theorem 1) 在假设 1 下,纳什均衡 (θ, ϕ
) 存在,并且
1. L
θ
p
G
Lipschitz 连续;
2.
x
|p
r
(x) p
G
(x)|dx
2
λ
0,a.sλ
3. p
r
(x)
λ
1+λ
p
G
(x)
上述定理说明,当把 L 函数限定在 Lipschitz 连续的函数类上时,得到 p
G
(x) p
r
是完全
一致的,前面 WGAN 在对距/散度 f 数做 Lipschitz 续约束后,其实也是将生成样
本的密度假设为 lipschitz 密度。
LS-GAN 程序
用批量方法来计算 LS-GAN 的梯度。 X = {x
1
, x
2
, . . . , x
m
} 是从真实分布 p
r
中采集的 m
个样本;Z
m
= {z
1
, z
2
, . . . , z
m
} 是从 p
z
中采集到的 m 样本,并且通过 G,会有 m 假样本
{G(z
i
)}
m
i=1
。我们的优化模型是
min
θ
S
m
(θ, ϕ
) =
1
m
m
i=1
L
θ
(x
i
) +
λ
m
m
i=1
(∆(x
i
, G
ϕ
(z
i
)) + L
θ
(x
i
) L
θ
(G
ϕ
(z
i
)))
+
min
ϕ
T
k
(θ
, ϕ) =
1
k
k
i=1
L
θ
(G
ϕ
(z
i
))
其中:随机向量 z
k
= {z
1
, z
2
, . . . , z
k
} 可以与 z
m
不同。
LS-GAN 的伪代码如 (9) 所示,LS-GAN Lua 程序可以参考
À
泛化能力 generalization ability
上面证明了 p
G
p
g
收敛到真实密 p
r
,但这是建立 p
r
, p
g
的期望可以被直接计算。但
可惜的是,在实际算法中,并不能直接计算期望 E
p
r
, E
p
g
,只能对其做数值上的近似,这依赖于
样本数目 m, k。我们自然知道,当样本数 m, k 很大时,可以很到的近似期望 E
p
r
, E
p
g
。现在,
我们好奇的是,增加样本的量,p
G
是否会收敛到 p
r
并且,我们也希望知道多少样本 m, k 是合
适的。
首先考虑从 S(θ, ϕ
) 的泛化能力。S(θ, ϕ
) 的目标是训练一个损失函数 L
θ
因此,它会告诉
我们一个训练好的损失函数是否可以泛化。在给定 G
ϕ
后,考虑真实的目标
S = min
θ
S(θ, ϕ
)
À
https://github.com/guojunq/lsgan
http://www.ma-xy.com 147 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
算法 9 Learning algorithm for LS-GAN.
1: 初始化:超参数 λ;迭代数 tt
max
;判别器训练次数 n
D
;批量大小 m
2: for t = 1, 2, . . . , t
max
do
3: for n
D
step do
4: // 更新损失函数
5: Sample a minibatch from X
m
6: Sample a minibatch form Z
m
7: 更新损失函数 L
θ
min
θ
S
m
(θ, ϕ
) =
1
m
m
i=1
L
θ
(x
i
) +
λ
m
m
i=1
(∆(x
i
, G
ϕ
(z
i
)) + L
θ
(x
i
) L
θ
(G
ϕ
(z
i
)))
+
8: end for
9: Sample a set of z
k
of k random noises;
10: 更新生成器 G
min
ϕ
T
k
(θ
, ϕ) =
1
k
k
i=1
L
θ
(G
ϕ
(z
i
))
11: end for
和实验 (算法) 中的目标
S
m
= min
θ
S
m
(θ, ϕ
)
我们要研究随着样本量 m 的增加,距离 |S
m
S| 是否有界以及如何使它有界。如果 LS-GAN
可以泛化的,在中等样本数量时,距离 |S
m
S| 应该以概率收敛到 0。如果 LS-GAN 不可以泛
化,S
m
S 之间会有一个非 0 的间隙,这意味着 LS-GAN 对实验样本是过拟合的,它不能推
广到真实分布 p
r
为了说明泛化能力,我们先给出损失函数空间的假设以及它的 domain
假设 (2) 1. 损失函数 L
θ
(x) 对参数 θ k
L
-lipschitz 的,即
|L
θ
(x) L
θ
(x)| k
L
||θ θ
|| x
2. 损失函数 L
θ
(x) x k-lipschitz 的,即
|L
θ
(x) L
θ
(x
)| k||x x
||
3.2 个样本的距离是有界的,即
|∆(x, x
)| B
由上面的假设 2,有如下定理
http://www.ma-xy.com 148 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
定理 (2) 在假设 2 下,给定概率 1 η,当样本数量
m
CN B
(k + 1)
2
log(k
L
N/ηε)
ε
2
时,有
|S
m
S| ε
其中:C 是一个足够大的常数,N loss function 的参数个数。
下面,我们来证明上述定理。为简单,下面我们忽略 S(θ, ϕ
), S
m
(θ, ϕ
) 的第一部分,因为
λ + 时,第一部分会消失。并且,如果将第一部分考虑进来,下面的证明也只会有一点
点的变化。为了证明定理 2,我们需要如下引理:
引理 (6) 对所有损失函数 L
θ
,给定概率 1 η,当样本数量 m
m
CN B
(k + 1)
2
log(k
L
N/ηε)
ε
2
|S
m
(θ, ϕ
) S(θ, ϕ
)| ε
其中:C 是一个足够大的常数。
上述引例的证明需要运用 MCdiarmid 不等式,(·)
+
1-lipschitz 的以及 |S
m
(θ, ϕ
)S(θ, ϕ
)|
有界。然后,为了得到所有损失函数 (bound) union,一个标准的 ϵ-net 将会被构建,以产
生有限的点,这些有限点是足够稠密的,能够覆盖损失函数的参数空间。
证明 考虑损失函数 L
θ
并从真实分布 p
r
和重构分布 p
G
中采集 m 个样本 {x
i
, z
G
i
}
m
i=1
计算 S
m
(θ, ϕ
)为了应用 McDiarmid 不等式,当一个样本改变时,我们需要限定函数改变的界,
当第 j 个样本被 x
i
z
G
i
替代时,我们用 S
i
m
(θ, ϕ
) 表示,那么,我们有
|S
m
(θ, ϕ
) S
i
m
(θ, ϕ
)|
=
1
m
|(∆(x
i
, z
G
i
) + L
θ
(x
i
) L
θ
(z
G
i
))
+
(∆(x
i
, z
G
i
) + L
θ
(x
i
) L
θ
(z
G
i
))
+
|
1
m
|∆(x
i
, z
G
i
) ∆(x
i
, z
G
i
)| +
1
m
|L
θ
(x
i
) L
θ
(x
i
)| +
1
m
|L
θ
(z
G
i
) L
θ
(z
G
i
)|
1
m
(2B
+ k∆(x
i
, x
i
) + k∆(z
G
i
, z
G
i
))
2
m
(1 + k)B
第一个不定式使用了 (·)
+
1-lipschitz 的事实;第二个不等式使用了 ∆(x, z
G
) 是被 B
界限的,
并且 L
θ
(x) 关于 x k-lipschitz 的。
现在,我们可以使用 McDiarmid 不等式了。注意到
S(θ, ϕ
) = E
x
i
p
r
z
G
i
p
G
i=1,2,...,m
S
m
(θ, ϕ
)
http://www.ma-xy.com 149 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
P {|S
m
(θ, ϕ
) S(θ, ϕ
)| ε/2} 2 exp
ε
2
m
8(1 + k)
2
B
2
上述所述的界适用于单一损失函数 L
θ
为了得到联合边界 (union bound)我们考虑一个 ε/8k
L
-
netN,即对任意的 L
θ
,在网络中都有一个 θ
N,使得
||θ θ
|| ε/8k
L
这个标准的网络可以被建立用来容纳有限的损失函数,使得
|N|
O
(
N
log
(
k
L
N
/
ε
))
,其中:
N
是损失函数的个数。
因此,给定概率 1 ηfor all θ N,我们有如下联合边界
|S
m
(θ, ϕ
) S(θ, ϕ
)|
ε
2
m
CN B
2
(k + 1)
2
log(k
L
N/ηε)
ε
2
最后一步是在更广泛的 N 上找到所有损失函数的联合边界,为此,我们考虑如下不等式
|S(θ, ϕ
) S(θ
, ϕ
)|
= |E
xp
r
z
G
p
G
(∆(x, z
G
) + L
θ
(x) L
θ
(z
G
))
+
E
xp
r
z
G
p
G
(∆(x, z
G
) + L
θ
(x) L
θ
(z
G
))
+
|
E
xp
r
|L
θ
(x) L
θ
(x)| + E
z
G
p
G
|L
θ
(z
G
) L
θ
(z
G
)|
2k
L
||θ θ
||
使 (·)
+
1-lipschitz 实,使 L
θ
θ k
L
-
lipschitz。同样的,我们有
|S
m
(θ, ϕ
) S
m
(θ
, ϕ
)| 2k
L
||θ θ
||
现在,我们能够获得所有损失函数的联合边界。对任意的 θ通过构建还可以找到一个 θ
N
使得 ||θ θ
|| ε/8k
L
。并且,给定概率 1 η 后,有
|S
m
(θ, ϕ
) S(θ, ϕ
)| |S
m
(θ, ϕ
) S
m
(θ
, ϕ
)|
+ |S
m
(θ, ϕ
) S(θ
, ϕ
)| + |S(θ
, ϕ
) S
m
(θ, ϕ
)|
2k
L
||θ θ
|| +
ε
2
+ 2k
L
||θ θ
||
ε
4
+
ε
2
+
ε
4
= ε
由此,证明了引理 6
下面来证明定理 2
http://www.ma-xy.com 150 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
证明 首先限制 S
m
S。考虑 L
θ
最小化 S(θ, ϕ
),给定概率 1 η,当
m
CN B
2
(k + 1)
2
log(k
L
N/ηε)
ε
2
S
m
S S
m
(θ
, ϕ
) S(θ
, ϕ
) ε
这里第一个不等式使用了 S
m
S
m
(θ
, ϕ
)θ
可能不使 S
m
最小;第二个不等式直接使用上面
的引理 6。同样,可以证明另一个 direction,给定概率 1 η,有
S S
m
S(θ
, ϕ
) S
m
(θ
, ϕ
) ε
相似的,能够获得目标 T (θ, ϕ) 的泛化能力。考虑
T
k
= min
ϕ
T
k
(θ
, ϕ)
T = min
ϕ
T (θ
, ϕ)
仍然需要考虑生成函数空间的假设以及它们的 domain
假设 (3) 1. 生成函数 G
ϕ
(x) 关于参数 ϕ ρ
G
-lipschitz 的,即
|G
ϕ
(z) G
ϕ
(z)| ρ
G
||ϕ ϕ
|| z
2.G
ϕ
(z) 关于 z ρ-lipschitz 的,即
|G
ϕ
(z) G
ϕ
(z
)| ρ||z z
||
3. 来自 p
z
的样本 z 是有界的,即
||z|| B
z
根据假设 3,我们有关于 T (θ, ϕ) 的泛化定理
定理 (3) 给定概率 1 η,当样本数量
k
C
MB
2
z
k
2
ρ
2
log(k
L
ρ
G
M/ηε)
ε
2
|T
k
T | ε
其中:G
是足够大的常数,M 是生成函数的参数个数。
http://www.ma-xy.com 151 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
GLS-GAN
前面提到过 WGAN 使用 EM 距离来替代原始 GAN 中的 JS 散度,这个 EM 距离的特点就
是:即使 D 完美分割真假样本,EM 距离也不会为 0,仍然可以为 G 提供梯度以进行训练。现
在,我们断言 WGAN 也是建立在 Lipschitz 密度上的,为了证明此断言,将 WGAN 记为
f
w
= arg max
f
w
∈F
1
U(f
w
, g
ϕ
)
E
xp
r
[f
w
(x)] E
zp
z
[f
w
(g
ϕ
(z))]
以及
g
ϕ
= arg max V (f
w
, g
ϕ
) E
zp
z
[f
w
(g
ϕ
(z))]
这里 f, g 函数分别是 WGAN 的批评函数 (critics) G 网络。批评函数是 WGAN 里的概念,
GAN D,其数值越大,则样本真实度越高。
p
g
ϕ
是由 g
ϕ
产生的分布密度,我们有如下引理
引理 (3) 在假设 1 下,给的 WGAN 的解 (f
w
, g
ϕ
),并且设定 p
g
ϕ
lipschitz 的,有
x
|p
r
(x) p
g
ϕ
(
x
)
|
d
x
= 0
上述引理表明,WGAN LS-GAN 都是建立在相同的 lipschitz 条件上的。WGAN 在对 f
函数做出 lipschitz 连续约束后 (即生成样本密度 p
g
ϕ
lipschitz 密度)p
g
ϕ
收敛到 p
r
(x)
证明 假设 (f
w
, g
ϕ
) WGAN 的解。一方面,我们有
U(f
w
, g
ϕ
) =
x
f
w
(x)p
r
(x)dx
x
f
w
(x)p
g
ϕ
(x)dx < 0
这里的不等式使用了 V (f
w
, g
ϕ
) V (f
w
, g
ϕ
)(使用 p
r
(x) 来替代 p
g
ϕ
(x))考虑一个特例:f
w
(x)
α(p
r
(x) p
g
ϕ
(x))
+
因为我们假设 p
r
(x), p
g
ϕ
(x) lipschitz α 很小时,f
w
(x) L
1
f
w
(x)
带入到 U(f
w
, g
ϕ
),我们有
U(f
w
, g
ϕ
) = α
x
(p
r
(x) p
g
ϕ
(x))
2
+
dx
假设 p
r
(x) > p
g
ϕ
(x) 在一个非零测度上,有
U(f
w
, g
ϕ
) U(f
w
, g
ϕ
) 0
这和 U(f
w
, g
ϕ
) 0 相矛盾,所以必有
p
r
(x) p
g
ϕ
(x) a.e.
再使用引理 4,有
x
|p
r
(x) p
g
ϕ
(x)
|dx = 0
http://www.ma-xy.com 152 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
在证明引理 1 时,仅使用了 (a)
+
的两个性质:¬(a)
+
a for any a(a)
+
= a for a 0
实这可以用任意的代价函数 C(a) 来代替 (a)
+
,只要 C(a) 满足 (a)
+
上面的两个性质。将 C(a)
引出的 LS-GAN 称为 GLS-GAN。非常有意思的是,LS-GAN WGAN GLS-GAN 2
特例。
形式上,如果代价函数 C(a) 满足
1. C(a) a for any a R;
2. C(a) = a for any a R
+
.
则引理 1 关于 p
r
, p
g
一致的结论仍然成立。新的 GLS-GAN 就是在这样一个代价函数 C 下,求
解损失 L
θ
。给定一个 G
ϕ
,我们使用如下目标
S
C
(θ, ϕ
) = E
xp
r
,zp
z
C(∆(x, G
ϕ
(z)) + L
θ
(x) L
θ
(G
ϕ
(z)))
来训练 L
θ
(x)。这里 S
C
高度依赖代价函数 C。为简单,我们在 S
C
中仅考虑 S(θ, ϕ
) 的第二项
S(θ, ϕ
) = E
xp
r
(x) + λE
xp
r
,zp
z
(∆(x, z
G
) + L
θ
(x) L
θ
(z
G
))
+
。但是,这并不影响结论,因为当 λ 时,S(θ, ϕ
) 第一项将消失。
在引理 1 下,可以证明如下引理
引理 (5) 在假设 1 下,给的 S
C
(θ, ϕ
) T (θ
, ϕ) 的一个纳什均衡 (θ
, ϕ
),并假设代价函
C(a) 满足 2 个条件,有
x
|p
r
(x) p
G
(x)|dx = 0
在给定损失函数 L
θ
下,求解 G
ϕ
的方法和 LS-GAN 是一样的
min
ϕ
E
zp
z
L
θ
(G
ϕ
(z)) (1.27)
至此,GLS-GAN 的核心思想就介绍完了。下面,给出具体的例子。什么代价函数 C(a) 满足
2 个条件?一个显然的选择是 Leaky Rectical linear C
v
(a) = max(a, va)(含参数 v Leaky
Rectical linear)参数 v 在区间 (−∞, 1] 上。现在来说明 LS-GAN WGAN GLS-GAN
特例:¬可以发现,当 v = 0 C
0
(a) = (a)
+
,有
LS GAN = GLS GAN (C
0
)
v = 1 时,有 C
1
(a) = a,带入 S
C
(θ, ϕ
),有
S
C
1
(θ, ϕ
) = E
xp
r
,zp
z
(∆(x, G
ϕ
(z)) + L
θ
(x) L
θ
(G
ϕ
(z)))
=
E
xp
r
L
θ
(x) E
z
p
z
L
θ
(G
ϕ
(z)) + E
x
p
r
zp
z
(∆(x, G
ϕ
(z)))
上式得最后一项是一个和损失函数 L
θ
有关的常数项,可以忽略。于是,我们有
S
C
1
(θ, ϕ
) = E
xp
r
L
θ
(x) E
zp
z
L
θ
(
G
ϕ
(
z
))
http://www.ma-xy.com 153 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
上式是 WGAN 的目标,所以有
W GAN = GLS GAN (C
1
)
这说明在 WGAN LS-GAN 之间,有一大片的空白区域 GLS
G
AN(C
v
) 等待我们去发掘。
虽然理论上分析 GLS-GAN 可以产生和真实样本已知的密度,但实际如何还有待验证。
既然作为特例 WGAN LS-GAN 都取得了不错的成绩,我们有理由相信 GLS-GAN
会取得不凡的表现。更广泛的,可以采取非 LeakReLU 的代价函数,来构架 GLS-GAN比如,
可以尝试 α [0, 1] Exponential Linear Unit (ELU)
C
α
(a) = max(0, a) + min(0, α(e
α
1))
GLS-GAN 的程序可以参考
Á
1.6.15 Coupled GAN
CoGAN 模型建立
原始 GAN 的训练过程面临着训练不稳定的困难。Coupled GAN 为了克服这个问题,在
型中设置了 2 GAN在求解梯度时, 2 GAN(G D) 的梯度求平均,作为最终的梯度。
G D 设置为多层传感器结构, G 而言,2 G
1
, G
2
的感知器层数为 m
1
, m
2
并且
不要求 m
1
= m
2
G
1
(z) = g
(m
1
)
1
(g
(m
1
1)
1
(···g
(2)
1
(g
(1)
1
(z))))
G
2
(z) = g
(m
1
)
2
(g
(m
1
1)
2
(···g
(2)
2
(g
(1)
2
(z))))
设其中权重为
θ
(i)
g
1
θ
(j)
g
2
i = 1, 2 . . . m
1
j = 1, 2 . . . m
2
我们不必要求所有层的权重梯度都求平均,只需要几层 (例如:k 层求平均)同样的方法处理 D
网络,2 D 的层数设为 n
1
, n
2
D
1
(x
1
) = f
(n
1
)
1
(f
(n
1
1)
1
(···f
(2)
1
(f
(1)
1
(x
1
))))
D
2
(x
2
) = f
(n
1
)
2
(f
(n
1
1)
2
(···f
(2)
2
(f
(1)
2
(x
2
))))
设其中权重为
θ
(i)
f
1
θ
(j)
f
2
i = 1, 2 . . . n
1
j = 1, 2 . . . n
2
并设定共有 l 层要共享权重。Coupled GAN 的目标设置为
min
G
1
,G
2
max
D
1
,D
2
E
x
1
p
r1
[
log
D
1
(
x
1
)] +
E
zp
z
[log(1 D
1
(G
1
(z)))]
+E
x
2
p
r2
[log D
2
(x
2
)] + E
zp
z
[log(1 D
2
(G
2
(z)))]
Á
https://github.com/guojunq/glsgan
http://www.ma-xy.com 154 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
其网络结构如图 (1.91) 所示
1.91: Coupled GAN 网络结构图
CoGAN 程序
CoGAN 的伪代码如 (10) 所示,
CoGAN TensorFlow 程序如下
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 import sc ipy . ndimage . i n t e r p o l a t i o n
8 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
9 mb_size = 32
10 X_dim = mnist . t r a in . images . shape [ 1 ]
11 y_dim = mnist . t ra i n . l a b e l s . shape [ 1 ]
12 z_dim = 10
13 h_dim = 128
14 eps = 1e8
15 l r = 1e3
16 d_steps = 3
17 de f p l o t ( samples ) :
18 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
19 gs = g r idspe c . GridSpec (4 , 4)
20 gs . update ( wspace =0.05 , hspace =0.05)
21 f o r i , sample in enumerate ( samples ) :
22 ax = p l t . subplot ( gs [ i ] )
23 p l t . a x i s ( o f f )
24 ax . s e t _x t i c kl a b e ls ( [ ] )
25 ax . s e t _y t i c kl a b e ls ( [ ] )
26 ax . set_aspect ( equal )
27 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
28 ret ur n f i g
29 de f x a v i e r_init ( s i z e ) :
30 in_dim = s i z e [ 0 ]
31 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
32 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
33 X1 = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
34 X2 = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
35 z = t f . p l aceho l d e r ( t f . f l o a t 3 2 , shape=[None , z_dim ] )
http://www.ma-xy.com 155 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
算法 10 Mini-batch stochastic gradient descent for training CoGAN.
1: 初始化:网络参数 θ
f
(i)
1
, θ
f
(i)
2
, θ
g
(i)
1
, θ
g
(i)
s
t, t
max
;批量大小 N
2: for t = 1, 2, . . . , t
max
do
3: p
z
中选取 N 个样本 {z
1
, z
2
, . . . , z
N
}
4: p
r1
中选取 N 个样本 {x
1
1
, x
2
1
, . . . , x
N
1
}
5: p
r2
中选取 N 个样本 {x
1
2
, x
2
2
, . . . , x
N
2
}
6: 计算判别器 f
t
1
参数的梯度
θ
f
(i)
1
1
N
N
j=1
log f
t
1
(x
j
1
) log(1 f
t
1
(g
t
1
(z
j
)))
7: 计算判别器 f
t
2
参数的梯度
θ
f
(i)
2
1
N
N
j=1
log f
t
2
(x
j
2
) log(1 f
t
2
(g
t
2
(z
j
)))
8: 两个判别器之间进行参数平均共享。
9: 根据参数的梯度更新判别器 f
t+1
1
f
t+1
2
10: 计算生成器 g
t
1
参数的梯度
θ
g
(i)
1
1
N
N
j=1
log(1 f
t+1
1
(g
t
1
(z
j
)))
11: 计算判别器 f
t
2
参数的梯度
θ
g
(i)
2
1
N
N
j
=1
log(1 f
t+1
2
(g
t
2
(z
j
)))
12: 两个生成器之间进行参数平均共享。
13: 根据参数的梯度更新生成器 g
t+1
1
g
t+1
2
14: end for
http://www.ma-xy.com 156 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
36 G_W1 = t f . Varia bl e ( x a v i e r _ i nit ( [ z_dim , h_dim ] ) )
37 G_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim ] ) )
38 G1_W2 = t f . Variable ( x a v i e r _ i n i t ( [ h_dim , X_dim ] ) )
39 G1_b2 = t f . V ariable ( t f . zeros ( shape=[X_dim ] ) )
40 G2_W2 = t f . Variable ( x a v i e r _ i n i t ( [ h_dim , X_dim ] ) )
41 G2_b2 = t f . V ariable ( t f . zeros ( shape=[X_dim ] ) )
42 de f G( z ) :
43 h = t f . nn . r e l u ( t f . matmul( z , G_W1) + G_b1)
44 G1 = t f . nn . sigmoid ( t f . matmul(h , G1_W2) + G1_b2)
45 G2 = t f . nn . sigmoid ( t f . matmul(h , G2_W2) + G2_b2)
46 ret ur n G1, G2
47 D1_W1 = t f . Var ia ble ( x a v i e r_init ( [ X_dim, h_dim ] ) )
48 D1_b1 = t f . Va riable ( t f . z e r o s ( shape=[h_dim ] ) )
49 D2_W1 = t f . Var ia ble ( x a v i e r_init ( [ X_dim, h_dim ] ) )
50 D2_b1 = t f . Va riable ( t f . z e r o s ( shape=[h_dim ] ) )
51 D_W2 = t f . Variabl e ( x a v i e r _ i n it ( [ h_dim, 1 ] ) )
52 D_b2 = t f . Variable ( t f . z e r o s ( shape = [1] ) )
53 de f D(X1, X2) :
54 h1 = t f . nn . r elu ( t f . matmul(X1, D1_W1) + D1_b1)
55 h2 = t f . nn . r elu ( t f . matmul(X2, D2_W1) + D2_b1)
56 D1_out = t f . nn . sigmoid ( t f . matmul( h1 , D_W2) + D_b2)
57 D2_out = t f . nn . sigmoid ( t f . matmul( h2 , D_W2) + D_b2)
58 ret ur n D1_out, D2_out
59 theta_G = [G1_W2, G2_W2, G1_b2, G2_b2 ]
60 theta_G_shared = [G_W1, G_b1]
61 theta_D = [D1_W1, D2_W1, D1_b1, D2_b1]
62 theta_D_shared = [D_W2, D_b2]
63 # Train D
64 G1_sample , G2_sample = G( z )
65 D1_real , D2_real = D(X1, X2)
66 D1_fake , D2_fake = D(G1_sample , G2_sample )
67 D1_loss = t f . reduce_mean( t f . log ( D1_real + eps ) + t f . log ( 1 . D1_fake + eps ) )
68 D2_loss = t f . reduce_mean( t f . log ( D2_real + eps ) + t f . log ( 1 . D2_fake + eps ) )
69 D_loss = D1_loss + D2_loss
70 # Train G
71 G1_loss = t f . reduce_mean ( t f . l o g ( D1_fake + eps ) )
72 G2_loss = t f . reduce_mean ( t f . l o g ( D2_fake + eps ) )
73 G_loss = G1_loss + G2_loss
74 # D optim ize r
75 D_opt = t f . t ra i n . AdamOptimizer ( l ear nin g_r ate=l r )
76 # Compute the gradient s f o r a l i s t of va r i a bl e s .
77 D_gv = D_opt. compute_gradients ( D_loss , theta_D)
78 D_shared_gv = D_opt. compute_gradients ( D_loss , theta_D_shared )
79 # Average by h a lf i n g the shared g radients
80 D_shared_gv = [ ( 0 . 5 * x [ 0 ] , x [ 1 ] ) f o r x in D_shared_gv ]
81 # Update
82 D_solver = t f . group (
83 D_opt . apply_gradients (D_gv) , D_opt . apply_gradients ( D_shared_gv)
84 )
85 # G op ti miz er
86 G_opt = t f . t ra i n . AdamOptimizer ( l ear nin g_r ate=l r )
87 # Compute the gradient s f o r a l i s t of va r i a bl e s .
88 G_gv = G_opt. compute_gradients ( G_loss , theta_G )
http://www.ma-xy.com 157 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
89 G_shared_gv = G_opt. compute_gradients ( G_loss , theta_G_shared)
90 # Average by h a lf i n g the shared g radients
91 G_shared_gv = [ ( 0 . 5 * x [ 0 ] , x [ 1 ] ) f o r x in G_shared_gv ]
92 # Update
93 G_solver = t f . group (
94 G_opt . apply_gradients (G_gv) , G_opt. apply_gradients (G_shared_gv)
95 )
96 s e s s = t f . Ses s i on ( )
97 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
98 X_train = mnist . tr a i n . images
99 h a l f = in t ( X_train . shape [ 0 ] / 2)
100 # Real image
101 X_train1 = X_train [ : h a l f ]
102 # Rotated image
103 X_train2 = X_train [ h al f : ] . reshape (1, 28 , 28)
104 X_train2 = sc i py . ndimage . i n t e r p o l a t i o n . r o t a t e ( X_train2 , 90 , axes =(1, 2) )
105 X_train2 = X_train2 . reshape (1, 28*28)
106 # Cleanup
107 del X_train
108 de f sample_X(X, s i z e ) :
109 st ar t_idx = np . random . r andint (0 , X. shape [0] s i z e )
110 ret ur n X[ start _i dx : start_ idx+s i z e ]
111 de f sample_z (m, n) :
112 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
113 i f not os . path . e x i s t s ( out/ ) :
114 os . makedirs ( out/ )
115 i = 0
116 f o r i t in range (1000000) :
117 X1_mb, X2_mb = sample_X( X_train1 , mb_size ) , sample_X( X_train2 , mb_size )
118 z_mb = sample_z ( mb_size , z_dim)
119 _, D_loss_curr = se s s . run (
120 [ D_solver , D_loss ] ,
121 fee d_dict={X1 : X1_mb, X2 : X2_mb, z : z_mb}
122 )
123 _, G_loss_curr = s e s s . run (
124 [ G_solver , G_loss ] , fe ed_dict={z : z_mb}
125 )
126 i f i t % 1000 == 0:
127 sample1 , sample2 = s e s s . run (
128 [ G1_sample , G2_sample ] , feed_di ct={z : sample_z (8 , z_dim) }
129 )
130 samples = np . vstack ( [ sample1 , sample2 ] )
131 p r i n t ( I t e r : {}; D_loss : { : . 4 } ; G_loss : { : . 4 }
132 . format ( i t , D_loss_curr , G_loss_curr ) )
133 f i g = p l o t ( samples )
134 p l t . s a v e f i g ( out /{ }.png
135 . format ( s t r ( i ) . z f i l l ( 3) ) , bbox_inches= t i g ht )
136 i += 1
137 p l t . c l o s e ( f i g )
138
http://www.ma-xy.com 158 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.6.16 Dual GAN
Dual GAN 模型建立
下面,考虑 GAN因为计算视觉题都以被是一“图片译”
问题。例如,一张人脸的照片以及与之对应的一张素描之间的相互转换就可以看成是从一张图片
“翻译”为另外一张图片 (我们可以将素描图片作为生成器 G 的输入的一部分)事实上,更一般
的,边界探测、图像分割、图片的风格化和抽象化等等都可以被视为是这样一种“翻译”问题。
而说到“翻译”很容易会想到其在自然语言处理领域中的一些应用。近年来在机器翻译
域也有许多有意思的新进展。其中一种新的做法是对偶学习 (dual learning),这种学习的方式为
解决无监督学习中遇到的困难提供了新的思路。简要介绍一下这种学习方法的基本思路:假如现
在小明只能讲中文,Alice 只会讲英文,他们两个人虽然都不懂对方的语言,但是他们希望能够可
以中英文之间的两个翻译模型 (中译英,英译中)怎样可以实现他们的这个目的呢?首先,对于
一个英文的句子,Alice 用翻译工具将其翻译为中文,由于她并不懂中文,于是她直接把句子
发给了小明;但小明又不懂英文,于是小明只能按照中文的语言习惯判断这个句子是否通顺,
可以帮助小明判断这个“英译中”的系统是否做得很好,随后,小明把他修改过的句子再用“中
译英”的系统翻译成英文,并把英文句子发给 AliceAlice 虽然不懂中文,但她能比较经过这一
大圈的翻译之后,得到的新句子与最初的版本是否相似。这一信息可以帮助判断是否两个翻译模
型都表现良好。随着“对偶学习”过程的持续进行,未标注的数据也得到了充分的利用,利用这
些信息,可以帮助提高对偶任务中的两个翻译模型。这种对偶学习的想法为进一步改进现有的翻
译模型提出了崭新思路。如果把这种对学习的方法也用到基于
GAN
的图片的“翻译”上,
会得到怎样的效果呢?这会是一个非常有趣的问题。
DualGAN 法就是将基本 GAN 再进一步扩展为两个相互耦合的 GAN其中存在
两个生成器和两个判别器。如图 (1.92) 所示
1.92: DualGAN 结构示意图
以素描与照片之间的相互“翻译”为例。设 U 为素描图像集,V 为照片图像集,原始任务
是学习一个生成 G
A
: U V G
A
是从素描 u U 到照片 v V 的映射。与这个生成器
应的有一个判别器 D
A
二者构成第一个 GAN与原始任务相对应,存在一个对偶任务:训练一
http://www.ma-xy.com 159 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
个生成器 G
B
: V U ,将照片转换为素描,与这个生成器所对应的同样有一个判别器 D
B
,二
者形成了第二个 GAN(对偶 GAN)
在这样的基本框架下,接下来考虑怎样利用对偶学习的思路训练 GAN首先介绍“生成”
思路,通过生成器 G
A
可以对素描图片 u 进行翻译,最终得到类似照片的图片,其中包含的噪声
z翻译的结果即为 G
A
(u, z) 把这个翻译的结果扔给另一个专门用于生成素描图片的生成器
G
B
得到的结果 G
B
(G
A
(u, z), z
) 即为对原有的素描图片的一次重构,这里的 z
同样是噪声。
下来考虑与这一过程对偶的一个过程,首先将照片 v 用生成器 G
B
翻译为素描图 G
B
(v, z
)然后
再用生成器 G
A
对生成的素描图进行翻译,得到 G
A
(G
B
(v, z
), z) 接下来介绍“判别”的思路,
生成器 G
A
对应的判别器 D
A
判断一张图片是否像一张照片,而与生成器 G
B
对应的判别器 D
B
则判断一张图片是否像一张素描图。对应于上面提到的对偶的生成过程,系统最终希望最小化重
构误差,即希望最小在两次迭代后得到的结果与始图片之间的误差 ||G
A
(G
B
(v, z
), z) v||
||G
B
(G
A
(u, z), z
) u||
像传统 GAN 训练判别器 D 那样,在 DualGAN 中,判别器 D 的目标仍然是将真假样本区
分开。由于 WGAN 在许多方面优于 GANDualGAN 采用 WGAN 作为 GAN 的替代,相应的
判别器 D
A
D
B
的损失函数定义为
l
d
A
(u, v) = D
A
(G
A
(u, z)) D
A
(v)
l
d
B
(u, v) = D
B
(G
B
(v, z
)) D
B
(u)
其中:u U, v V
对于生成器 G 而言,G
A
G
B
有共同的目标,因此二者使用同一损失函数。之前的条件图
像合成方法发现,使用 L1 距离替代 L2 距离是较好的,因为 L2 常导致图像模糊。因此,
们使用 L1 距离来衡量重构误差,添加到 GAN 生成器 G 的目标中,有
l
g
(u, v) = λ
U
||u G
B
(G
A
(u, z), z
)|| + λ
V
||v G
A
(G
B
(v, z
), z)||
D
A
(G
B
(v, z
)) D
B
(G
A
(u, z))
其中:u U, v V λ
U
, λ
V
是两个惩罚权重。合适的 λ
U
, λ
V
100 1000并且,如果 U
自然图片而 V 不是,那么将 λ
U
设置的比 λ
V
小是有用的。
Dual GAN 程序及代码
上面我们提到过,在 DualGAN 中使用 WGAN 来替代 GAN。下面,给出 DualGAN 中的
一些设置。我们训练 n
critic
步判别器 D,然后训练 1 G使用 mini-batch 的批量梯度下降方
法求解模型中的优化问题,并使 RMSProp 作为求解器 (Adam 等基于动量的方法可能导致训
练不稳定
)
n
critic
一般设置为
2
4
批量大小一般为
1
4
权重修剪
(wight clipping)
参数
c
一般设置在 0.01 0.1DualGAN 的算法伪代码如 (11) 所示
http://www.ma-xy.com 160 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
算法 11 DualGAN training procedure
1: 初始化:图像数据集 U V GAN A 的生成器参数为 θ
A
,判别器参数为 ω
A
GAN B
生成器参数为 θ
B
,判别器参数为 ω
B
;修剪参数 c;批量大小 m;循环 n
critic
2: 随机初始化 ω
i
, θ
i
i {A, B}
3: while 未达到停止准则 do
4: for t = 1 to n
critic
do
5: 采样 {u
(k)
}
m
k=1
U{v
(k)
}
m
k=1
V
6: 更新参数 ω
A
1
m
m
k=1
l
d
A
(u
(k)
, v
(k)
)
7: 更新参数 ω
B
1
m
m
k=1
l
d
B
(u
(k)
, v
(k)
)
8: clip(ω
A
, c, c)clip(ω
B
, c, c)
9: end for
10: 采样 {u
(k)
}
m
k=1
U{v
(k)
}
m
k=1
V
11: 更新 θ
A
, θ
B
1
m
m
k=1
l
g
(u
(k)
, v
(k)
)
12: end while
DualGAN TensorFlow 代码如下
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 import sc ipy . ndimage . i n t e r p o l a t i o n
8 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
9 mb_size = 32
10 X_dim = mnist . t r a in . images . shape [ 1 ]
11 y_dim = mnist . t ra i n . l a b e l s . shape [ 1 ]
12 z_dim = 10
13 h_dim = 128
14 eps = 1e8
15 l r = 1e3
16 d_steps = 3
17 lam1 , lam2 = 1000 , 1000
18 de f p l o t ( samples ) :
19 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
http://www.ma-xy.com 161 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
20 gs = g r idspe c . GridSpec (4 , 4)
21 gs . update ( wspace =0.05 , hspace =0.05)
22 f o r i , sample in enumerate ( samples ) :
23 ax = p l t . subplot ( gs [ i ] )
24 p l t . a x i s ( o f f )
25 ax . s e t _x t i c kl a b e ls ( [ ] )
26 ax . s e t _y t i c kl a b e ls ( [ ] )
27 ax . set_aspect ( equal )
28 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
29 ret ur n f i g
30 de f x a v i e r_init ( s i z e ) :
31 in_dim = s i z e [ 0 ]
32 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
33 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
34 X1 = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
35 X2 = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
36 z = t f . p l aceho l d e r ( t f . f l o a t 3 2 , shape=[None , z_dim ] )
37 G1_W1 = t f . Variable ( x a v i e r _ i n i t ( [ X_dim + z_dim , h_dim ] ) )
38 G1_b1 = t f . V ariable ( t f . zeros ( shape=[h_dim] ) )
39 G1_W2 = t f . Variable ( x a v i e r _ i n i t ( [ h_dim , X_dim ] ) )
40 G1_b2 = t f . V ariable ( t f . zeros ( shape=[X_dim ] ) )
41 G2_W1 = t f . Variable ( x a v i e r _ i n i t ( [ X_dim + z_dim , h_dim ] ) )
42 G2_b1 = t f . V ariable ( t f . zeros ( shape=[h_dim] ) )
43 G2_W2 = t f . Variable ( x a v i e r _ i n i t ( [ h_dim , X_dim ] ) )
44 G2_b2 = t f . V ariable ( t f . zeros ( shape=[X_dim ] ) )
45 de f G1(X1, z ) :
46 input s = t f . concat ( [ X1, z ] , 1)
47 h = t f . nn . r e l u ( t f . matmul( inputs , G1_W1) + G1_b1)
48 ret ur n t f . nn . sigmoid ( t f . matmul( h , G1_W2) + G1_b2)
49 de f G2(X2, z ) :
50 input s = t f . concat ( [ X2, z ] , 1)
51 h = t f . nn . r e l u ( t f . matmul( inputs , G2_W1) + G2_b1)
52 ret ur n t f . nn . sigmoid ( t f . matmul( h , G2_W2) + G2_b2)
53 D1_W1 = t f . Var ia ble ( x a v i e r_init ( [ X_dim, h_dim ] ) )
54 D1_b1 = t f . Va riable ( t f . z e r o s ( shape=[h_dim ] ) )
55 D1_W2 = t f . Var ia ble ( x a v i e r_init ( [ h_dim, 1 ] ) )
56 D1_b2 = t f . Va riable ( t f . z e r o s ( shape = [1]) )
57 D2_W1 = t f . Var ia ble ( x a v i e r_init ( [ X_dim, h_dim ] ) )
58 D2_b1 = t f . Va riable ( t f . z e r o s ( shape=[h_dim ] ) )
59 D2_W2 = t f . Var ia ble ( x a v i e r_init ( [ h_dim, 1 ] ) )
60 D2_b2 = t f . Va riable ( t f . z e r o s ( shape = [1]) )
61 de f D1(X) :
62 h = t f . nn . r e l u ( t f . matmul(X, D1_W1) + D1_b1)
63 ret ur n t f . matmul (h , D1_W2) + D1_b2
64 de f D2(X) :
65 h = t f . nn . r e l u ( t f . matmul(X, D1_W1) + D1_b1)
66 ret ur n t f . matmul (h , D2_W2) + D2_b2
67 theta_G1 = [G1_W1, G1_W2, G1_b2, G1_b2]
68 theta_G2 = [G2_W1, G2_b1, G2_W2, G2_b2 ]
69 theta_G = theta_G1 + theta_G2
70 theta_D1 = [D1_W1, D1_W2, D1_b1, D1_b2]
71 theta_D2 = [D2_W1, D2_b1, D2_W2, D2_b2]
72 # D
http://www.ma-xy.com 162 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
73 X1_sample = G2(X2, z )
74 X2_sample = G1(X1, z )
75 D1_real = D1(X2)
76 D1_fake = D1(X2_sample)
77 D2_real = D2(X1)
78 D2_fake = D2(X1_sample)
79 D1_G = D1(X1_sample)
80 D2_G = D2(X2_sample)
81 X1_recon = G2(X2_sample , z )
82 X2_recon = G1(X1_sample , z )
83 recon1 = t f . reduce_mean( t f . reduce_sum( t f . abs (X1 X1_recon ) , 1) )
84 recon2 = t f . reduce_mean( t f . reduce_sum( t f . abs (X2 X2_recon ) , 1) )
85 D1_loss = t f . reduce_mean ( D1_fake) t f . reduce_mean ( D1_real )
86 D2_loss = t f . reduce_mean ( D2_fake) t f . reduce_mean ( D2_real )
87 G_loss = t f . reduce_mean(D1_G + D2_G) + lam1* recon1 + lam2* recon2
88 D1_solver = ( t f . t r a in . RMSPropOptimizer( le arn ing _ra te=1e4)
89 . minimize ( D1_loss , va r _ l i s t=theta_D1 ) )
90 D2_solver = ( t f . t r a in . RMSPropOptimizer( le arn ing _ra te=1e4)
91 . minimize ( D2_loss , va r _ l i s t=theta_D2 ) )
92 G_solver = ( t f . t r a i n . RMSPropOptimizer( lear nin g_r ate=1e4)
93 . minimize ( G_loss , v a r _l i st=theta_G ) )
94 clip_D = [ p . a s s i g n ( t f . clip_by_value (p , 0.01 , 0. 0 1 ) ) f or p i n theta_D1 + theta_D2 ]
95 s e s s = t f . Ses s i on ( )
96 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
97 X_train = mnist . tr a i n . images
98 h a l f = in t ( X_train . shape [ 0 ] / 2)
99 # Real image
100 X_train1 = X_train [ : h a l f ]
101 # Rotated image
102 X_train2 = X_train [ h al f : ] . reshape (1, 28 , 28)
103 X_train2 = sc i py . ndimage . i n t e r p o l a t i o n . r o t a t e ( X_train2 , 90 , axes =(1, 2) )
104 X_train2 = X_train2 . reshape (1, 28*28)
105 # Cleanup
106 del X_train
107 de f sample_X(X, s i z e ) :
108 st ar t_idx = np . random . r andint (0 , X. shape [0] s i z e )
109 ret ur n X[ start _i dx : start_ idx+s i z e ]
110 de f sample_z (m, n) :
111 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
112 i f not os . path . e x i s t s ( out/ ) :
113 os . makedirs ( out/ )
114 i = 0
115 f o r i t in range (1000000) :
116 f o r _ i n range ( d_steps ) :
117 X1_mb, X2_mb = sample_X( X_train1 , mb_size ) , sample_X( X_train2 , mb_size)
118 z_mb = sample_z ( mb_size , z_dim)
119 _, _, D1_loss_curr , D2_loss_curr , _ = se s s . run (
120 [ D1_solver , D2_solver , D1_loss , D2_loss , clip_D ] ,
121 fee d_ di ct={X1: X1_mb, X2 : X2_mb, z : z_mb}
122 )
123 _, G_loss_curr = s e s s . run (
124 [ G_solver , G_loss ] , fe ed_dict={X1: X1_mb, X2: X2_mb, z : z_mb}
125 )
http://www.ma-xy.com 163 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
126 i f i t % 1000 == 0:
127 sample1 , sample2 = s e s s . run (
128 [ X1_sample , X2_sample ] ,
129 fee d_ di ct={X1: X1_mb[ : 4 ] , X2: X2_mb[ : 4 ] , z : sample_z (4 , z_dim) }
130 )
131 samples = np . vstack ( [X1_mb[ : 4 ] , sample1 , X2_mb[ : 4 ] , sample2 ] )
132 p r i n t ( I t e r : {}; D_loss : { : . 4 } ; G_loss : { : . 4 }
133 . format ( i t , D1_loss_curr + D2_loss_curr , G_loss_curr ) )
134 f i g = p l o t ( samples )
135 p l t . s a v e f i g ( out /{ }.png
136 . format ( s t r ( i ) . z f i l l ( 3) ) , bbox_inches= t i g ht )
137 i += 1
138 p l t . c l o s e ( f i g )
139
Dual GAN 实验结果
根据这一基本思路,就可以真的来对图片做各种处理了。下面了展示这一算法得到的一些结
果。这些相关结果分别与真实情况 (ground truth) 和其它算法得到的结果进行了比较,可以发现
这一算法的确有着不错的表现。将 DualGAN GANCGAN 在图片翻译数据集上进行比较。
日景图片与夜景图片之间的转换结果如图 (1.93) 所示
1.93: DualGAN 日景图片与夜景图片之间的转换
素描与照片之间的相互翻译结果如图 (1.94) 所示
http://www.ma-xy.com 164 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
(a) (b)
1.94: DualGAN 素描与照片之间的相互翻译
1.6.17 Boundary Equilibrium GAN
BEGAN 模型建立
注:GAN 以生成器 G 为主,D 为辅,可以设计以 D 为主, G 为辅的网络结构。BEGAN12使
用一自动码器为判 ( EBGAN18先提)典型 GAN 直接配数
布, BEGAN 的目标是用一个来自 Wassers tein 距离的损失来匹配自动编码器的损失分布。
一目标是通过在典型 GAN 的目标中添加一个 equilibeium 部分实现的。equilibeium 部分用于平
D G,和 GAN 相比,BEGAN 有更简单的训练程序和网络结构。
自动编码器的
Wasserstein
距离
我们希望学习残差分布而不是直接学习样本分布。首先说
一个自动编码器的损失近似一个 normal distribution,然后计算真实样本和生成样本的自动编码
器的损失分布的 Wassertein 距离。定义 L : R
N
x
R 是像素自动编码器的损失
L(v) = |v D(v)|
η
其中:D : R
N
x
R
N
x
是自动编码器,η {1, 2}v R
N
x
是一个维度为 N
x
的样本。对于足够
多的像素点,如果假设各像素点的 loss 是独立同分布的,根据中心极限定理,图像的损失分布服
从一个近似正太分布。 BEGAN 中,我们使用原始图像和重建后图像的 L
1
范数作为 loss。在
实验中作者发现,在实验数据上,loss distribution 真的接近正态。
给定两个正态分布 µ
1
= N (m
1
, C
1
), µ
2
= N (m
2
, C
2
),其均值 m
1
, m
2
R
p
,协方差矩阵
C
1
, C
2
R
p×p
,二者的平方 Wasserstein 距离定义为
W (µ
1
, µ
2
)
2
= ||m
1
m
2
||
2
2
+ Tr(C
1
+ C
2
2(C
1/2
2
C
1
C
1/2
2
)
1/2
)
特别地,当 p = 1 时,平方 Wsaaerstein 距离简化为
W (µ
1
, µ
2
)
2
= ||m
1
m
2
||
2
2
+ (c
1
+ c
2
2
c
1
c
2
)
http://www.ma-xy.com 165 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
我们希望在实验中优化 W
2
时,只需要优化 ||m
1
m
2
||
2
2
即可,而当
c
1
+c
2
2
c
1
c
2
||m
1
m
2
||
2
2
是常数或
者单调增时,真的就只需要优化 ||m
1
m
2
||
2
2
。这使得我们可以将目标简化为
W (µ
1
, µ
2
)
2
||m
1
m
2
||
2
2
值得一提的是,我们是准备优 loss 分布 W
2
距离,而不是样本分布。设定训练误差分布
训练样本分布更稳定。
GAN 的目 我们求 D 来最大化 W
2
||m
1
m
2
||
2
2
。设 µ
1
是损失 L(x) 的分布,这里 x
是真实样本; µ
2
是损失 L(G(z)) 的分布,这里 G : R
N
x
R
N
x
是一个生成器,z [1, 1]
N
z
N
z
维的随机量。
由于 m
1
, m
2
R
+
,所以 W
2
只有 2 种可能
(a)
W (µ
1
, µ
2
) m
1
m
2
m
1
m
2
0
or (b)
W (µ
1
, µ
2
) m
2
m
1
m
1
0
m
2
我们按照目标选择 (b) 这种情况,因为最小的 m
1
自然地自动编码真实图像。设 D G 的参数
分别为 θ
d
, θ
g
,通过最小化 D G 的损失 L
D
, L
G
来求解参数
L
D
= L(x; θ
d
) L(G(z
D
; θ
g
); θ
g
)
L
G
= L(G(z
G
; θ
g
); θ
d
)
其中:z
G
, z
D
是来自 z 的样本。下面,将 G(·, θ
g
) 简记为 G(·),将 L(·, θ
d
) 简记为 L(·)
WGAN 相比,上面的目标主要有两方面的不同:¬BEGAN 是在假设的正态损失间构建
分布;BEGAN 不需要 k-lipschitz 假设。
Equilibrium 在实践中,保持 D G 的平衡是至关重要的,当
E[L(x)] = E[L(G(z))]
时,我们认为二者是平衡的。如果我们生成的样本不能被 D 辨识真假,那么真假样本的误差分
布应该相同。这个观点允许我们通过分配 G D 来平衡 the eect,因此,不存在赢的一方。
当存在完美的平衡时,如果 m
1
m
2
0
c
1
+c
2
2
c
1
c
2
||m
1
m
2
||
2
2
变得不稳定。通过引入一个超参
γ [0, 1] 来解决这个问题
γ =
E[L(G(z))]
E[L(x)]
在我们的模型中,D 两个主要的目标:¬自动编码真实图像;判别真实图像判别真实图
像。γ 部分能够平衡这两个目标,较小的 γ 导致低的图像多样性 (diversity)因为 D 集中更多的
力量去编码真实图像。我们称 γ diversity ratio
http://www.ma-xy.com 166 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
Boundary Equilibrium GAN BEGAN 的目标是
L
D
= L(x) k
t
L(G(z
D
)) θ
d
L
G
= L(G(z
G
)) θ
g
k
t+1
= k
t
+ λ
k
(γL(x) L(G(z
G
))) for each training step t
我们使用比例控制定 ( Proportional Control Theory) 来保持等式 E[L(G(z))] = γE[L(x)]。这
里通过变量 k
t
[0, 1] 来决定在梯度下降时,将多少“注意力”放在 L(G(z
D
))
初始化 k
0
= 0λ
k
随着 k 的增加而增加。在主要的学习部分,λ
k
是基于 k 的学习率。本质上,
这种平衡可以被视为一个闭环反馈控制形式,其中,在每一步调整 k
t
以维持方程 γ =
E[L(G(z))]
E[L(x)]
在早期的训练过程中,G 趋于产生易于自动编码器重建的数据,因为生成数据接近于 0
实数分布没有准确学习。整个练过 L(x) > L(G(z)) 由平约束实现的。
和传统的交替优化 G D GAN 相比,我们提出的方法在训练时不需要稳定。在训练时使用
Adam 方法,并设置批量大小为 16
通过 Equilibrium 的概念,我们获得了一个度量收敛性的全局量,可以设计收敛过程是寻找
|γL(x) L(G(z
G
))| closest reconstruction L(x),表示为
M
global
= L(x) + |γL(x) L(G(z
G
))|
这个收敛性度量 M
global
可以用于确定网络什么时候达到最终状态,或者判定模型是否崩溃。
BEGAN 模型程序
BEGAN TensorFlow 程序如下
1 import te n s orflo w as t f
2 from tenso r f l o w . examples . t u t o r i a l s . mnist import input_data
3 import numpy as np
4 import m atp l otl ib . pyplot as p l t
5 import m atp l otl ib . g r i d spec as g r i dspec
6 import os
7 mb_size = 32
8 X_dim = 784
9 z_dim = 64
10 h_dim = 128
11 l r = 1e3
12 m = 5
13 lam = 1e3
14 gamma = 0. 5
15 k_curr = 0
16 mnist = input_data . read_data_sets ( . . / . . / MNIST_data , one_hot=True )
17 de f p l o t ( samples ) :
18 f i g = pl t . f i g u r e ( f i g s i z e =(4, 4) )
19 gs = g r idspe c . GridSpec (4 , 4)
20 gs . update ( wspace =0.05 , hspace =0.05)
21 f o r i , sample in enumerate ( samples ) :
22 ax = p l t . subplot ( gs [ i ] )
http://www.ma-xy.com 167 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
23 p l t . a x i s ( o f f )
24 ax . s e t _x t i c kl a b e ls ( [ ] )
25 ax . s e t _y t i c kl a b e ls ( [ ] )
26 ax . set_aspect ( equal )
27 p l t . imshow ( sample . reshape (28 , 28) , cmap= Greys_r )
28 ret ur n f i g
29 de f x a v i e r_init ( s i z e ) :
30 in_dim = s i z e [ 0 ]
31 xavier_stddev = 1 . / t f . s q r t (in_dim / 2 . )
32 ret ur n t f . random_normal ( shape=s i z e , stddev=xavier_stddev )
33 X = t f . p laceh o l d e r ( t f . f l o a t 3 2 , shape=[None , X_dim] )
34 z = t f . p l aceho l d e r ( t f . f l o a t 3 2 , shape=[None , z_dim ] )
35 k = t f . pla c e h o lder ( t f . f l o a t 3 2 )
36 D_W1 = t f . Variabl e ( x a v i e r _ i n it ( [ X_dim, h_dim ] ) )
37 D_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim] ) )
38 D_W2 = t f . Variabl e ( x a v i e r _ i n it ( [ h_dim, X_dim] ) )
39 D_b2 = t f . Variable ( t f . z e r o s ( shape=[X_dim] ) )
40 G_W1 = t f . Varia bl e ( x a v i e r _ i nit ( [ z_dim , h_dim ] ) )
41 G_b1 = t f . Variable ( t f . z e r o s ( shape=[h_dim ] ) )
42 G_W2 = t f . Varia bl e ( x a v i e r _ i nit ( [ h_dim, X_dim] ) )
43 G_b2 = t f . Variable ( t f . z e r o s ( shape=[X_dim] ) )
44 theta_G = [G_W1, G_W2, G_b1, G_b2]
45 theta_D = [D_W1, D_W2, D_b1, D_b2]
46 de f sample_z (m, n) :
47 ret ur n np . random . uniform ( 1. , 1 . , s i z e =[m, n ] )
48 de f G( z ) :
49 G_h1 = t f . nn . re l u ( t f . matmul( z , G_W1) + G_b1)
50 G_log_prob = t f . matmul(G_h1, G_W2) + G_b2
51 G_prob = t f . nn . sigmoid (G_log_prob)
52 ret ur n G_prob
53 de f D(X) :
54 D_h1 = t f . nn . r e lu ( t f . matmul(X, D_W1) + D_b1)
55 X_recon = t f . matmul(D_h1, D_W2) + D_b2
56 ret ur n t f . reduce_mean( t f . reduce_sum ((X X_recon) **2 , 1) )
57 G_sample = G( z )
58 D_real = D(X)
59 D_fake = D(G_sample)
60 D_loss = D_real k*D_fake
61 G_loss = D_fake
62 D_solver = ( t f . t r ai n . AdamOptimizer ( l ea rni ng_ rat e=l r )
63 . minimize ( D_loss , v a r _ l i s t=theta_D ) )
64 G_solver = ( t f . t r a i n . AdamOptimizer( lear nin g_r ate=l r )
65 . minimize ( G_loss , v a r _l i st=theta_G ) )
66 s e s s = t f . Ses s i on ( )
67 s e s s . run ( t f . g l o b a l _ v a r i a b l e s _ i n i t i a l i z e r ( ) )
68 i f not os . path . e x i s t s ( out/ ) :
69 os . makedirs ( out/ )
70 i = 0
71 f o r i t in range (1000000) :
72 X_mb, _ = mnist . tr a i n . next_batch ( mb_size )
73 _, D_real_curr = se s s . run (
74 [ D_solver , D_real ] ,
75 fee d_dict={X: X_mb, z : sample_z (mb_size , z_dim) , k : k_curr}
http://www.ma-xy.com 168 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
76 )
77 _, D_fake_curr = s e s s . run (
78 [ G_solver , D_fake ] ,
79 fee d_dict={X: X_mb, z : sample_z (mb_size , z_dim) }
80 )
81 k_curr = k_curr + lam * (gamma*D_real_curr D_fake_curr )
82 i f i t % 1000 == 0:
83 measure = D_real_curr + np . abs (gamma*D_real_curr D_fake_curr)
84 p r i n t ( It e r {}; Convergence measure : { : . 4 }
85 . format ( i t , measure ) )
86 samples = s e s s . run (G_sample , feed_ di ct={z : sample_z (1 6 , z_dim) })
87 f i g = p l o t ( samples )
88 p l t . s a v e f i g ( out /{ }.png
89 . format ( s t r ( i ) . z f i l l ( 3) ) , bbox_inches= t i g ht )
90 i += 1
91 p l t . c l o s e ( f i g )
92
BEGAN 实验
关于 BEGAN 模型更详细的网络设置可以参考 BEGAN 原文,也可以参考上面的 BEGAN
程序。下面,介绍一些 BEGAN 的实验结果。
图像多样性和质量 作者将 BEGAN EBGAN 进行了对比,图 (1.95) 给出了一些具有代表性
的生成图像
1.95: BEGAN Figure2
图像大小 (分辨率) 128 ×128尽管像常见的那样:训练高分辨率的图像会使图像的清晰
度下降,但这也许可以通过超参数来进行调节。这可能是目前为止 Stack GAN 之外,第 2 好的
分辨率结果。Stack GAN 在花和鸟数据集上有 256 × 256 的分辨率。
我们可以从生成的图像中看到不同的姿态、表情、性别、肤色、光照和面部毛发等,然而并
没有眼睛。但是,值得一提的是,由 BEGAN EBGAN 不同的训练集上进行训练,因此
一般不对他们进行直接比较。
在图 (1.96) 中,我们比较了不同参数 γ 带来的效果。当 γ 在一定范围内时,模型表现出很
好的性能,仍然保持一定的图像多样性。 γ 较小时,生成的脸看起来相似,随着 γ 的增加,
像多样性增加。这似乎与其它文献中“多样性与图像质量无关”的论断相矛盾。
http://www.ma-xy.com 169 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
1.96: BEGAN Figure3
Space continuity 为了估计 (评价)BEGAN G 的收敛性,我们使真实图像 x
r
和生成 G(z
r
)
相一致。 Adam 来做,就是找一个 z
r
最小化 e
r
= |x
r
G(z
r
)|求真实数据的映射并不是模
型的目标,但是它提供一个测量生成器 G 生成能力的方法。通过 z
r
埋藏在两个真实图像中,
我们验证,该模型会概括图像的内容而不是简单的记住图像。
(1.97) 显示 z
r
128 × 128 辨率之间插值。这些图像不是训练据的一部分。
第一列和最后一列是需要表示和插值的真实图像,紧邻它们的图像是它们相应的近似值,而两列
之间的其他图像是线性插值的结果。我们将结果和其它模型进行比较,选用 ALI 插值的 64 × 64
分辨率和 Pixel GNN 插值的 32 ×32 分辨率作为比较对象,对不同的数据集进行训练。此外,
(1.97)d 展示了图像和其镜像的插值结果。
1.97: BEGAN Figure4
收敛性度量和图像质量 敛性度 M
global
用于度 BEGAN 收敛性,像在图 (1.98) 中看
到的那样,M
global
度量和图像精 (delity) 很高的相关性。我们也可以 plot 中看出,模
型收敛性是较快的,这似乎证明了,快速收敛会导致像素损失。
http://www.ma-xy.com 170 http://www.ma-xy.com
http://www.ma-xy.com
第一章 深度学习 1.6 对抗生成网络 GAN
1.98: BEGAN Figure5
Equilibrium for unbalanced networks 为了测试平衡技术的鲁棒性,作者进行了一个实验,
(1.99) 展示了这个结果。令人吃惊的是,低纬度的 h 对图像多样性和图像质量的影响不大。
1.99: BEGAN Figure6
http://www.ma-xy.com 171 http://www.ma-xy.com
http://www.ma-xy.com
1.6 对抗生成网络 GAN 第一章 深度学习
http://www.ma-xy.com 172 http://www.ma-xy.com
http://www.ma-xy.com
参考文献
[1] Nahavandi S Abdi M. Multi-residual networks improving the speed and accuracy of residual
networks. 2016.
[2] Serge Belongie Andreas Veit, Michael Wilber. Residual networks are exponential ensembles
of relatively shallow networks. 2016.
[3] Bottou L Arjovsky M. Towards principled methods for training generative adversarial net-
works. 2017.
[4] Burda. Importance weighted autoencoders. 2016.
[5] Lars Maaloe Casper Kaae Sonderby, Tapani Raiko. Ladder variational autoencoders. 2016.
[6] Houthooft R Chen X, Duan Y. Infogan: Interpretable representation learning by information
maximizing generative adversarial nets. 2017.
[7] Chen.M. Marginalized denoising auto-encoders for nonlinear representation. 2014.
[8] Sergey Ioe Jonathon Shlens Christian Szegedy, Vincent Vanhoucke. Rethinking the incep-
tion architecture for computer vision. 2015.
[9] Vincent Vanhoucke Christian Szegedy, Sergey Ioe. Inception-v4, inception-resnet and the
impact of residual connections on learning. 2016.
[10] Yangqing Jia Pierre Sermanet Christian Szegedy, Wei Liu. Going deeper with convolutions.
2014.
[11] Brian Chu. Visualing resdual networks. 2016.
[12] Luke Metz David Berthelot, Thomas Schumm. Boundary equilibrium generative adversarial
networks. 2017.
[13] Fergus R Denton E L, Chintala S. Deep generative image models using a laplacian pyramid
of adversarial networks. 2015.
[14] Mirza M Goodfellow I, Pouget-Abadie J. Generative adversarial nets. 2014.
173
http://www.ma-xy.com
参考文献 参考文献
[15] Gregory Shakhnarovich Gustav Larsson, Michael Maire. Fractalnet ultra-deep neural net-
works without residual. 2016.
[16] Gao Huang. Deep networks with stochastic depth. 2016.
[17] Martin Arjovsky Vincent Dumoulin Aaron Courville Ishaan Gulrajani, Faruk Ahmed. Im-
proved training of wasserstein gans. 2017.
[18] Michael Mathieu Junbo Zhao and Yann LeCun. Energy based generative adversarial net-
works. 2016.
[19] Shaoqing Ren Kaiming He, Xiangyu Zhang and Jian Sun. Identity mappings in deep residual
networks. 2016.
[20] Shaoqing Ren Jian Sun Kaiming He, Xiangyu Zhang. Deep residual learning for image
recognition. 2015.
[21] Andrew Zisserman Karen Simonyan. Very deep convolutional networks for large-scale image
recognition. 2014.
[22] Welling M Kingma D P. Stochastic gradient vb and the variational auto-encoder. 2014.
[23] Shuicheng Yan Min Lin, Qiang Chen. Network in network. 2014.
[24] Osindero S Mirza M. Conditional generative adversarial nets. 2014.
[25] Sebastian Nowozin. f-gan:training generative neural samplers using variational divergence
minimization. 2016.
[26] Chintala S Radford A, Metz L. Unsupervised representation learning with deep convolutional
generative adversarial networks. 2015.
[27] Salah Rifai. Contractive auto-encoders: Explicit invariance. 2011.
[28] Rolfe. Discrete variational autoencoders. 2016.
[29] Jürgen Schmidhuber Rupesh Kumar Srivastava, Klaus Gre. Highway networks. 2015.
[30] Christian Szegedy Sergey Ioe. Batch normalization accelerating deep network training by
reducing internal covariate shift. 2015.
[31] Suwon Suh and Seungjin Choi. Gaussian copula variational autoencoders for mixed data.
2016.
[32] Wojciech Zaremba Vicki Cheung Alec Radford Xi Chen Tim Salimans, Ian Goodfellow.
Improved techniques for training gans. 2016.
[33] Wenjie Li Tong Che, Yoshua Bengio. Mode regularized gan. 2016.
http://www.ma-xy.com 174 http://www.ma-xy.com
http://www.ma-xy.com
参考文献 参考文献
[34] Yoshua Bengio Tong Che. Maximum-likelihood augmented discrete generative adversarial
networks. 2017.
[35] Vincent. Extracting and composing robust features with denosing autocoders. 2008.
[36] Komodakis N. Zagoruyko S. Wide residual networks. 2016.
[37] Han T X Zhang K, Sun M. Residual networks of residual networks:multilevel resdual net-
works. 2016.
http://www.ma-xy.com 175 http://www.ma-xy.com