GAN Generative Adversarial Network 对抗生成网络
-
神经网络基础:
- 神经网络常见层(食材):全连接层,激活层,BN层,Dropout层,卷积层,池化层,循环层RNN,Embedding层,Merge层
- 网络配置(目标):损失函数,优化器,激活函数,性能评估,初始化方法,正则项
- 网络训练流程(炒菜):预训练模型(高汤),训练流程,数据预处理,数据增强(增加样本)
-
全连接层:Input每一个节点都和Hidden每个节点连接
-
激活函数:Sigmoid,tanh,ReLU,Leaky ReLU。
-
优化器:
- 带动量
- 不带动量
-
卷积层CNN:局部感知,提出共享卷积核。卷积核数目,卷积核大小,卷积核步长,补零padding
- 池化层:缩小特征图,特征压缩,提取主要特征
-
常用神经网络解决套路
-
GAN:
思路:一个生成器,一个判别器。
目标函数:先生成器G不动的情况下,判别器尽可能将生成样本和真实样本区分开;判别器固定不动,调整生成器,希望判别器出现失误。
min
G
max
D
V
(
D
,
G
)
=
E
x
∼
p
d
a
t
a
(
x
)
[
l
o
g
(
D
(
x
)
)
]
+
E
z
∼
p
z
(
z
)
[
l
o
g
(
1
−
D
(
G
(
z
)
)
)
]
\min \limits_G \max \limits_D V(D,G) = E_{x\sim p_{data}(x)}[log(D(x))]+E_{z\sim p_z(z)}[log(1-D(G(z)))]
GminDmaxV(D,G)=Ex∼pdata(x)[log(D(x))]+Ez∼pz(z)[log(1−D(G(z)))]
-
CGAN,Conditional Generative Adversarial Nets:加条件
min G max D V ( D , G ) = E x ∼ p d a t a ( x ) [ l o g ( D ( x ∣ y ) ) ] + E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ∣ y ) ) ) ] \min \limits_G \max \limits_D V(D,G) = E_{x\sim p_{data}(x)}[log(D(x|y))]+E_{z\sim p_z(z)}[log(1-D(G(z|y)))] GminDmaxV(D,G)=Ex∼pdata(x)[log(D(x∣y))]+Ez∼pz(z)[log(1−D(G(z∣y)))]
-
DCGAN, Deep convolutional Generative adversarial networks:增强GAN稳定性
- 所有pooling都用strided convolutions代替,pooling的下采样是损失信息的,strided convolutions可以让模型自己学习损失的信
- 生成器G和判别器D都要用BN层(BatchNormalization)
- 把全连接层去掉,用全卷积层代替
- 生成器除了输出层,激活函数统一使用ReLU。输出层用Tanh。
- 判别器所有的层的激活函数统一都是LeakyReLU
-
ACGAN,Auxiliary Classifier GANs:判断真假,并确定属于哪一类
L D , Q A C G A N = L D G A N + E [ P ( c l a s s = c ∣ x ) ] + E [ P ( c l a s s = c ∣ G ( z ) ) ] L_{D,Q}^{ACGAN} = L_D^{GAN}+E[P(class = c|x)]+E[P(class = c|G(z))] LD,QACGAN=LDGAN+E[P(class=c∣x)]+E[P(class=c∣G(z))]
-
infoGAN, Information Maximizing Generative Adversarial Nets:输入只有x,不加c,Q网络和D网络共享一个网络,只是最后一层独立输出。
min G , Q max D V I n f o G A N ( D , G , Q ) = V ( D , G ) − λ L 1 ( G , Q ) \min \limits_{G,Q} \max \limits_D V_{InfoGAN}(D,G,Q) = V(D,G) - \lambda L_1(G,Q) G,QminDmaxVInfoGAN(D,G,Q)=V(D,G)−λL1(G,Q) -
问题
- G,D迭代的方式能达到全局最优解么?大部分情况是局部最优解
- 不一定收敛,学习率不能高,G,D要共同成长,不能其中一个成长的过快
- 崩溃的问题,通俗说,G找到D的漏洞,每次都生成一样的骗D
- 无需预先建模,模型过于自由,不可控
- 判别器训练得太好,生成器梯度消失,生成器loss降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。
解决:WGAN, Wasserstein GAN
- 判别器最后一层去掉sigmoid
- 生成器和判别器的loss不取log
- 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
- 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
-
比较