本周主要工作如下:
- 总结了深度学习中常用的损失函数
- 学习了GAN, DCGAN, CGAN, cycleGAN等常用GAN网络
- 翻译了pytorch官方文档中DCGAN的教程,训练生成人脸图像
- 继续完善视频编解码代码,发现了新的bug,正在调试中
1 常用损失函数
损失函数的作用是衡量实际输出与预计输出之间的差异,损失函数的设计是深度学习中十分重要的部分,不仅会影响到训练的速度,还会影响隐含层中数据的分布情况。目前仅仅是总结了部分常用损失函数的计算方法,其中涉及很多统计学最优化知识,对此仅仅是浅尝辄止,其中更多的原理还需要以后慢慢总结体会,以下仅简要记录其计算方法。
1.1 MSE
均方误差算是最简单也是最经典的一种计算损失的方法,其中 $\hat y$ 为实际输出,$y$ 为标签。
$$
mse_loss =\frac{1}{N} \sum _{i=1} ^N (y_i - \hat y_i)^2
$$
1.2 CrossEntropy
交叉熵是从KL散度中引出,用于衡量两个分布之间差异的大小,其值总是大于等于0,两个分布越相似其值越接近于0。训练时的标签可以当成一种分布,实际输出堪称另一种分布,常与softmax层结合用于分类模型。
$$
CrossEntropy_loss = -\sum _i y_i·log\hat y_i
$$
1.3 log损失函数
log损失通常用于逻辑回归,是二分类中常用的损失函数,若二分类中使用mse损失会造成最后优化函数为非凹函数,不利于训练。其中 $x$ 表示输出该特征,$y$ 表示所属类别, $p(1/x)$ 表示输入特征 $x$ 属于类别 $1$ 的概率。
$$
log_loss = \begin{cases}
-log(p(1/x)), &&&y=1 \
-log(1-p(1/x)),&&&y=0
\end{cases}
$$
将上面分类书写的形式变换一下,便得到了BCE_loss,只不过是换了一个名字而已,效果与上式相同
$$
BCE_loss = -y·log(p(y/x)) - (1-y)·log(1 - p(y/x))
$$
逻辑回归是分类网络中基础又重要的一个网络,GAN网络中的discriminator便是使用这种二分类网络。比较GAN网络的损失函数便会发现相似之处
$$
\mathop{min} \limits_G\mathop{max} \limits_ D V(G,D) = E_{x∼pdata(x)}[logD(x)]+E_{z∼pz(z)}[log(1−D(G(x)))]
$$
1.4 Smooth L1
smooth L1是何凯明提出的优化的MSE损失,能有有效地优化梯度爆炸问题。这个例子表明我们可以根据我们网络的具体表现适当调节我们的损失函数从而解决特定的训练问题。
$$
smooth_l1_loss = \begin{cases}
0.5(x_i - y_i)^2, &&&\mbox{if }&|x_i - y_i|<1 \
|x_i - y_i| - 0.5,&&&otherwise
\end{cases}
$$
1.5 F-divergence
F-divergence是一个大的类,其中 $F$ 表示特定的函数,当函数 $F$ 不同便表示的不同的散度,上面提到的交叉熵便是 KL散度即 KL-divergence。其中KL使用的 $F$ 为 $t·logt$ 。F-divergence损失函数如下:
$$
D_f (P_{data}||P_g) = \int_x P_g(x)f(\frac{P_{data}(x)}{P_g(x)})\, dx
$$
目前还有很多损失函数没有总结,比如用于人脸识别的TripletMarginLoss 比起一般的损失函数能够很好地将不同的人脸特征分开。总之损失函数对深度学习的影响非常重要,很多时候使用一种损失导致训练崩坏而换一种损失便能得到不错的效果。
2 GAN
作为目前生成网络中的老大,GAN的发展十分迅猛而且应用场景很多,十分有趣。阅读了GAN的论文,翻译了 PyTorch教程之DCGAN 并学习CGAN, CycleGAN等优秀的GAN模型。
GAN网络解决了很多之前没能解决的问题,不光对生成网络贡献巨大,也为非监督学习领域带来了重大的突破。在此之前的生成模型领域有一个很难解决的问题便是如何对生成的图像做评估,而GAN使用 discriminator网络来对生成图片做评估很好地解决了这一问题。
2.1 DCGAN
DCGAN即deep convolution GAN第一次将GAN网络应用到图像处理领域。输入为服从高斯分布的随机噪声,输出目标图像,其主要的改进如下:
- 取消了所有的pooling层,在判别器网络中使用strided convolutions层代替,在生成器中使用fractional-strided convolutions代替
- 在生成器与判别器中都加入了 batchnorm 层
- 移除了隐藏层中的全连接层
- 生成器中所有隐含层中使用ReLU激活函数,输出层使用Tanh激活函数
- 判别器中激活函数都使用 LeakyReLU
DCGAN使得GAN网络在图像处理得到了良好的训练,但是其输入输出并没有建立良好的联系,而很多实际应用中需要将输入 $z$ 与输出图像之间建立联系,而非随机生成。例如输入文字,产生相应图像,输入语言,产生相应的图像,于是CGAN应运而生。
2.2 CGAN
CGAN即 conditional GANs,在网络中引入了条件信息,使得GAN网络生成的图片能和输入之间联系起来。CGAN的应用场景十分广泛,图像修复,图像匹配………..。其最初的训练步骤如下

但现在在此基础上有了更多新的结构产生,大多是对生成器与判别器进行改进而来。如上图所示通常来说只有一个判别器,目前新的结构通过引入更多的判别器,一个判断生成的图像是否realistic,另一个判断生成的图像是否match。引入的条件也越来越多,文字,语言,图像等都是常用的条件信息。
2.3 CycleGAN
CycleGAN的这种环形结构并不新鲜,在之前的AutoEncoder中就有这种类似的结构,CycleGAN将这种环形结构与GAN相结合,更好地解决了对生成后图像的评价问题。

CGAN的训练需要很多很多成对的数据,通常这是很难获取的,而CycleGAN则完全为非监督学习,不需要成对的数据 (unpaired image-to-image)。这使得更多的训练任务变得可能,特别是在风格转换领域得到了广泛的应用。
近几年GAN的发展十分迅速,其相关的理论研究也在不断完善。除了通过结构对网络进行优化,还有很多在距离的度量方式上的重大突破,例如 LS-GAN, EB-GAN, WGAN, FisherGAN 等很多网络。这方面的理论知识相对更加复杂。