5. 反向传播
5.1 什么是反向传播?
通俗解释:类比几个人站成一排,第一个人看一幅画(输入数据),描述给第二个人(隐层)......依此类推,到最后一个人(输出)的时候,画出来的画肯定不能看了(误差较大)。
反向传播就是:把画拿给最后一个人看(求取误差),然后最后一个人就会告诉前面的人下次描述时需要注意哪里(权值修正)
一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。
目的是更新神经元参数,而神经元参数正是 z=wx+b 中的 (w,b).对参数的更新,利用损失值loss对参数的导数, 并沿着负梯度方向进行更新。
"正向传播"求损失,"反向传播"回传误差
5.2 反向传播是如何工作的?
1.输入层接收x
2.使用权重w对输入进行建模
3.每个隐藏层计算输出,数据在输出层准备就绪
4.实际输出和期望输出之间的差异称为误差
5.返回隐藏层并调整权重,以便在以后的运行中减少此错误
这个过程一直重复,直到我们得到所需的输出。训练阶段在监督下完成。一旦模型稳定下来,就可以用于生产。
5.3 为什么需要反向传播?
•反向传播快速、简单且易于实现
•没有要调整的参数
•不需要网络的先验知识
•模型不需要学习函数的特性
5.4 手推BP
推导:链式求导法则反复用
伪代码:
5.5 输入层到输出等变化
6.GAN
生成式对抗网络,由一个生成器网络和一个判别器网络组成。判别器的训练目的是能够区分生成器的输出与来自训练集的真实图像,生成器的训练目的是欺骗判别器。值得注意的是,生成器从未直接见过训练集中的图像,它所知道的关于数据的信息都来自于判别器。
GAN 相关的技巧:
6.1 生成器
生成器:针对于D我们有标记为1和0的数据,因此我们可以对其进行训练。那么对于生成器,有x(也就是随机噪声z),那么y在哪里呢?对于生成器,我们的目的是使得其能够生成真实的图片,换句话说,我们是希望生成的图片能够骗过D。那么如何通过判别器来产生所谓的y??我们可以这样做:我们通过随机向量(噪声数据)经由生成网络产生一组假图片,我们将这些假图片都标记为 1(也就是说,人为的把假的图片当作真实的),然后将这些假图片输入到判别器中,判别器在对这些图片进行判别的时候,会发现这些图片是假的图片,然后给出低分,这样就产生了误差(因为标记的为1,但是判别器给了低分)。因此,在训练生成器的时候,这个网络是串接的。而在训练生成器的时候,一个很重要的操作就是保持判别器网络的参数不发生改变,只是把误差一直方向传播,传到生成网络那块后更新生成网络的参数,这样就完成了生成网络的训练了它将一个向量(来自潜在空间,训练过程中对其随机采样)转换为一张候选图像。GAN 常见的诸多问题之一,就是生成器"卡在"看似噪声的生成图像上。
在完成生成器的训练之后,我们又可以产生新的假的图片去对判别器进行训练。我们把这个过程称作为单独交替训练。同时要定义一个迭代次数,交替迭代到一定次数后停止即可。
一种可行的解决方案是在判别器和生成器中都使用 dropout。
6.2 判别器
接下来开发 discriminator 模型,它接收一张候选图像(真实的或合成的)作为输入,并将其划分到这两个类别之一:"生成图像"或"来自训练集的真实图像"。
6.3 训练技巧
- 输入规范化到(-1,1)之间,最后一层的激活函数使用tanh(BEGAN除外)
- 使用wassertein GAN的损失函数
- 如果有标签数据的话,尽量使用标签,也有人提出使用反转标签效果很好,另外使用标签平滑,单边标签平滑或者双边标签平滑
- 使用mini-batch norm, 如果不用batch norm 可以使用instance norm 或者weight norm
- 避免使用RELU和pooling层,减少稀疏梯度的可能性,可以使用leakrelu激活函数
- 优化器尽量选择ADAM,学习率不要设置太大,初始1e-4可以参考,另外可以随着训练进行不断缩小学习率
- 给D的网络层增加高斯噪声,相当于是一种正则