摘要
本周跟着李宏毅老师的课程,主要学习了生成式对抗网络中的无限制生成、去噪扩散概率模型、自监督学习中常用的预训练模型BERT和GPT,以及在目标领域中无标记数据时需要用到的迁移学习。本文将结合课程以及自身理解,介绍以上经典的神经网络模型。
Abstract
This week, I followed Professor Li Hongyi's course and mainly learned about unrestricted generation and denoising diffusion probability models in generative adversarial networks, commonly used pre trained models BERT and GPT in self supervised learning, as well as transfer learning required for unlabeled data in the target domain. This article will introduce the classic neural network models mentioned above based on the course and personal understanding.
一、生成式对抗网络(GAN)
生成式对抗网络主要通过生成器和判别器两大组件之间对抗训练,实现生成逼真数据的目标。GAN的目的就是让模型自己拥有创造能力。
1.1 无限制生成
- 生成器:是一个神经网络,接受一个随机噪声向量(通常从高斯分布、均匀分布中采样)作为输入,有助于生成器生成多样化的输出。生成器中的网络输出为一个分布,即有概率的输出一切可能的结果。生成器的目标是生成与真实数据相似的样本,以欺骗判别器。生成器示意图如下所示:
- 判别器:判别器也是神经网络,接收来自生成器的数据或者真实数据作为输入;输出一个概率值,判别输入数据的真假,即判别真实数据和生成器生成数据的差异。判别器示意图如下所示:
了解生成器和判别器之后,我们该如何训练这个网络呢?
第一步我们先固定生成器,只训练判别器。因为生成器的初始参数是随机初始化的,所以它什么都没有学习到,输入一系列采样得到的向量给它,它的输出肯定都是些随机、混乱的图片。将生成器生成的数据标记为0,将真实的数据标记为1。在经过第一步训练之后,判别器就学会了部分差异以判别生成数据和真实数据。第一步示意图如下所示:
第二步固定判别器,只训练生成器。 生成器将随机采样的向量转化成生成数据之后,将其输入至固定的判别器中,判别器会将这个数据打一个分数,越“真”的数据得到的分数越高,更新生成器的目的就在于提高分数,以达到欺骗判别器的目标。第二步示意图如下所示:
重复第一步和第二步的训练,训练完判别器固定判别器训练生成器。训练完生成器以后再用生成器去产生更多的新图片再给判别器做训练。训练完判别器后再训练生成器, 如此反覆地去执行。当其中一个进行训练的时候,另外一个就固定住,以此循环以达到最优。GAN完整训练过程如下图所示:
由此可见,生成器和判别器之间是一直互动、促进的关系,同时GAN也是很难训练的,必须两个网络同时训练,互相砥砺才行。那我们该如何去衡量GAN训练的好坏呢?
是生成数据的分布,是真实数据的分布。
对于生成器而言,它希望自己生成的数据与真实数据之间的差异越小越好,即生成数据的分布与真实数据的分布差异越小越好。如下图所示:
对于判别器而言,它的训练目标是看到真实数据就给它比较高的分数,看到生成的数据就给它比较低的分数,即最大化目标函数,等同于最小化交叉熵。
这个训练过程就是要找一个生成器去最小化两个分布和的差异。这个差异就是使用训练好的判别器来最大化它的目标函数值来实现。
所以我们只要找到一个便于准确衡量两大分布之间差异的函数,就能够进行网络的训练。
通过Wasserstein距离去衡量两个分布之间的差异。假设 P 集中在一个点,Q 集中在一个点, 对推土机而言,假设它要把 P 这边的土挪到 Q 这边,那它要平均走的距离就是 D,那么 P 和 Q 的 Wasserstein 距离就是 D。但是如果 P 和 Q 的分布不是集中在一个点,而是分布在 一个区域,那么我们就要考虑所有的可能性,也就是所有的推土机的走法,然后看平均走的 距离是多少,这个平均走的距离就是 Wasserstein 距离。如下图所示:
公式如下:
D是一个函数,也可以想像成是神经网络,这个神经网络的输入是X,输出是 D(X)。X如果是从**采样来的,我们要计算它的期望值,如果X是从采样来的,那我们要计算它的期望值,然后再乘上一个负号,所以最大化这个目标函数就会实现。如果X是从采样得到的,那么判别器的输出要越大越好,如果X是从**采样得到的, 从生成器采样出来的输出应该要越小越好。
1-Lipschitz是一个斜率有上限,足够平滑的函数。
1.2 条件型生成
条件性生成比无限制生成输入时,多了一个条件x,如:根据条件x和输入采样z产生输出y。同时判别器的输出的数值不只看y的好坏,还需要看y是否跟x匹配。如下图所示:
GAN的训练过程中还会出现模式坍塌(只重复产生几张相同的图片)、模式丢失(缺乏想象力)等情况。
二、去噪扩散概率模型
米开朗基罗说:“塑像就在石头里,我只是把不需要的部分去掉”。去噪扩散概率模型就是将高斯分布中随机采样的噪声图片(大小与目标图片相同),经过层层去噪达到目标图片的效果,这个过程也叫逆过程,即从噪声--->图片的过程。如下图所示:
为了让去噪模块清楚现处于哪个去噪阶段,即图片噪声的严重层度,去噪模块的输入还需要结合具体步数。如下图所示:
所以整个去噪扩散概率模型的关键就是去噪模块,以及去噪模块该如何训练。去噪模块内部构造如下图所示:
去噪模块中的噪声预测器,将预测本次输入照片中的噪声该是什么样子,然后用输入的照片减去预测的噪声就是本次去噪模块的输出。所以核心就是训练噪声预测器,即噪声预测器该如何知道这次输入的照片噪声该是什么样子。
因为一张照片会出现什么样的噪声,这样的数据很难收集,所以需要用到前向传播(扩散过程)的方法去人为创造训练数据,即从数据集中取一张图片,随机从高斯分布中采样一组噪声加上去。加噪后的图片和加噪次数作为噪声预测器的输入,输出为所加噪声,以此训练噪声预测器。如下图所示:
三、自监督学习
自监督学习属于无监督学习的一种,通过设计预训练任务来生成伪标签,从而将这些无监督学习问题转化为监督学习问题。例如::模型的输入 x′ 和模型的标签 x′′,将 x′ 输入模型并让它输出 yˆ,想让 yˆ尽可能地接近它的标签 x′′ (学习目标),如下图所示:
预训练:在模型被用于解决具体任务(微调)之前,先使用大量数据对模型进行初步训练的过程,让模型学到一些通用的、基础的特征表示。
预训练分为以下几类:
- 监督学习预训练:在这种方法中,模型首先在一个具有标注数据的大型数据集上进行训练,以解决一个与最终任务可能相似但不同的任务。例如,在NLP中,BERT等模型首先在大规模文本语料库上进行语言模型训练,然后这些预训练的模型被用于各种NLP任务。
- 无监督学习预训练:这种方法不需要标注数据,而是利用数据本身的内在结构来训练模型。例如,自编码器通过尝试重建输入数据来学习数据的有效表示。在NLP中,Word2Vec和GloVe等模型通过预测词与词之间的关系来学习词嵌入。
- 自监督学习预训练:这是一种介于监督学习和无监督学习之间的方法,它使用自动生成的伪标签来训练模型。这种方法在NLP中特别流行,例如BERT通过“遮盖语言模型”和“下一句预测”任务来进行预训练。
预训练的好处:
- 加速收敛:由于模型已经学习到了一些基础特征,因此在微调时能够更快地收敛到较好的解。
- 提高性能:预训练模型通常能够捕获到数据的复杂结构,从而在最终任务上表现出更好的性能。
- 减少过拟合:由于预训练是在大规模数据集上进行的,因此模型已经学习到了一些通用的知识,这有助于减少在较小数据集上的过拟合问题。
3.1 BERT
BERT是预训练语言表示模型,在NLP领域广泛应用。BERT具有双向性,能够考虑上下文信息;采用Transformer的编码器,使考虑范围不受距离限制,能够微调适用于下游NLP任务。BERT结构图如下所示:
BERT在应用至下游任务之前时,训练BERT属于无监督学习,那我们该如何训练呢?BERT的训练主要包含MLM(随机掩盖单词,然后填空)和NSP(判断两个句子是否连续)两个任务。
- MLM
如下图所示,我们知道被掩码字符是哪个字符,而 BERT不知道。因为把句子交给BERT时,该字符被掩码了,所以BERT不知道该字符,但我们知道掩码字符“深度”一词中的“度”。因此,训练的目标是输出一个尽可能接近真实答案的字符,即 “度”字符。独热编码可以用来表示字符,并最小化输出和独热向量之间的交叉熵损失。 BERT要做的就是成功预测掩码的地方属于的类别。
BERT在做填空的过程中,学会了每个字的意思。
- NSP
如下图所示,取与 [CLS] 对应的输出,忽略其他输出,并将 [CLS] 的输出乘以线性变换。现在它做一个二元分类问题,它有两个可能的输出:是或否。这种方法是下一句预测(NSP),即需要预测第二句是否是第一句的后一句(这两个句子是不是相接的)。如果第二句确实是后续句子(这两个句子是相接的),就要训练 BERT 输出“是”。当第二句不是后 一句时(这两个句子不是相接的),BERT需要输出“否”作为预测。
在BERT模型后接一个线性分类器,即可适用于下游任务,如下图所示:
- 情感分析:给机器一个句子,并告诉它判断句子是正面的还是负面的。
在训练时,线性变换和 BERT 模型都利用梯度下降来更新参数。线性变换的参数是随机初始化的,而 BERT 初始的参数是从学习了做填空题的 BERT 来的。在训练模型时,会随机初始化参数,接着利用梯度下降来更新这些参数,最小化损失。
- 词性标注:给定机器一个句子,其可以知道该句子中每个单词的词性。
- 自然语言推理:判断是否可以从前提中推断出假设,即前提与假设是否矛盾。
- 基于提取的问答:给机器读一篇文章,问它一个问题,它就会回答一个答案。但这里的问题和答案有些限制,答案必须出现在文章里面。
3.2 GPT
BERT是做填空题,而生成式预训练(GPT)是预测接下来会出现的词元。如下图所示:
GPT是建立在Transformer的解码器的基础上的,在预测下一个词元时,是做掩码自注意力(不能看到后面的词元)。
BERT在微调之后就能适用下游任务,但是GPT模型巨大,微调也将消耗大量资源。所以GPT的训练通过小样本学习进行举一反三,在训练过程中也没有梯度下降,这种训练过程也称为语境学习。 如下图所示:
四、迁移学习
允许模型将在源任务上学到的知识(如模型参数、特征表示、数据关系等)应用到另一个相关或不同的目标任务中。适用于数据稀缺、计算资源有限或领域迁移等情况。
4.1 领域自适应
侧重解决特征空间与类别空间一致,但特征分布不一致的问题。如领域偏移。
领域偏移:训练数据与测试数据分布不同,训练数据上训练出来的模型,在测试数据上可能效果不好。如下图所示:
- 目标领域标注数据很多时,就不需要用到迁移学习,之间在目标领域数据集上训练模型即可;
- 目标领域标注数据较少时,可以用目标领域的数据在源数据模型上进行微调,类似于BERT;
- 目标领域标注数据几乎没有时,我们就不能直接将源领域的模型直接用于目标领域,因为这样的准确率会很低。于是我们就想到训练一个特征提取器,例如源领域与目标领域图片的颜色不同,但是特征提取器可以学到将颜色信息过滤,然后得到的特征就无差异。如下图所示:
为了促使特征提取器学习共享特征,从而实现特征空间对齐。可以训练一个领域分类器,其输入是特征提取器的输出,目标是判断这个向量是来自于源领域还是目标领域,而特征提取器目标是骗过领域分类器。这种领域对抗训练类似于生成式对抗网络。领域对抗训练如下图所示:
4.2 领域泛化
对目标领域一无所知,并且不是要适应到某一个特定的领域上的问题。领域泛化通常分为两种情况:
- 训练数据非常丰富,包含了各种不同的领域,测试数据只有一个领域。如下图所示:
- 训练数据只有一个领域,而测试数据有多种不同的领域,可采用数据增强。如下图所示:
总结
本周的学习到此结束,同时也完成了深度学习经典神经网络的基础理论学习。从下周开始,我将会跟着李沐老师的课程,从头用PyTorch实现之前所学内容,通过对代码的编写,更深一步理解深度学习的原理。如有问题,请各位大佬指出,谢谢!
版权归原作者 KeepThinking! 所有, 如有侵权,请联系我们删除。