论文精度(李沐老师)Generative Adversarial Nets
Posted 我是小蔡呀~~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文精度(李沐老师)Generative Adversarial Nets相关的知识,希望对你有一定的参考价值。
Abstract
我们提出了一个新的framework,通过一个对抗的过程来估计生成模型,其中会同时训练两个模型:生成模型G来获取整个数据的分布,辨别模型D来分辨数据是来自于训练样本还是生成模型G。生成模型G的任务是尽量的让辨别模型D犯错。这个framework对应一个博弈论中双人对抗游戏。在任何函数空间的G和D中,存在一个独一无二的解,这个解能够将你整个训练中的数据的真实分布找出,D在任何地方等于1/2。如果G和D是一个MLP的话,整个系统可以通过一个误差反传进行训练。我们不需要任何的马尔科夫链或者对一个近似的推理过程展开。实验通过对生成的样本进行定性和定量评估,证明了该框架的潜力。
(介绍了GAN做的是个什么事情)
Introduction
一、深度学习是用来发现一些丰富、有层次的模型,这些模型能够对AI中的各种数据做一个概率分布的表示。虽然深度学习在辨别模型上取得了显著的进展,但是在生成模型上做的还是比较差,这个难点来自于我们最大化似然函数的时,要对概率进行很多的近似,从而带来了很大的计算困难。
二、(对GAN的一些介绍)在所提出的对抗网络框架中,生成模型和对抗模型对立:一个判别模型,它学习确定一个样本是来自模型分布还是数据分布。生成式模型可以被认为是类似于一队造假者,试图生产假币并在不被发现的情况下使用,而鉴别式模型则类似于警察,试图检测假币。这个游戏中的竞争促使两个团队改进他们的方法,直到假币与真币无法区分(希望造假者赢)。
三、这个框架可以产生许多种模型和优化算法的具体训练算法。在这篇文章中,我们探讨了这样一种特殊情况:生成模型通过多层感知器传递随机噪声来生成样本,而判别模型也是多层感知器。我们把这种特殊情况称为对抗性网络。在这种情况下,我们可以只用非常成功的反向传播和dropout算法来训练两个模型,只用正向传播从生成模型中取样。不需要近似推理或马尔科夫链。
Related work
一、之前的方法总是想去构造出一个分布函数,然后给这个函数提供一些参数进行学习,这些参数通过最大对数似然函数来求,但这会导致计算困难,尤其是维度比较高的时候。因为这些方法在计算上有困难,所以最近有些工作**“generative machines”**——学一个模型来近似模拟需要的结果,这项工作计算比较容易但是无法得知最后的分布是什么样子。
二、我们观察到对于f的期望求导等价于对f自己求导(说明为什么通过误差的反向传递对GAN求解)。说了一下VAEs的工作,和GAN类似。
三、说了一下NCE所做工作,但是其损失函数比较复杂,在求解性能上没有GAN好。
四、解释了一下与predictability minimization(PM)的区别。
五、解释了一下与adversarial examples的区别。adversarial examples构造一些假的样本,达到以假乱真的目的,从而测试算法的稳定性。
Adversarial nets
(讲的GAN的目标函数,以及对其的求解)
一、这个框架最简单的应用是当你的生成器和辨别器都是MLP的时候。生成器会学一个在数据x上的
p
g
p_g
pg分布。对于生成模型,我们定义一个先验
p
z
(
z
)
p_z(z)
pz(z),在输入的噪音变量z上。对于生成模型,就是把z映射映射成x,参数是
θ
g
\\theta_g
θg,
G
(
z
;
θ
g
)
G(z;\\theta_g)
G(z;θg)。辨别器
D
(
x
;
θ
d
)
D(x;\\theta_d)
D(x;θd),就是把x输出成一个标量,用来表示此数据来自真实数据(用1表示)还是由生成器(用0表示)生成的。在训练D的同时也会训练G,G用来最小化
l
o
g
(
1
−
D
(
G
(
z
)
)
)
log(1-D(G(z)))
log(1−D(G(z))),即训练一个G使我的辨别器尽量的犯错,G(z)代表是一个假图片。
二、
最理想状态是图(d),此时D的输出一直是0.5。
上述算法中,先更新我们的辨别器,再更新我们的生成器。k是超参数,不能太大/小,要保证辨别器有足够的更新,但也不要更新的太好。
如果没有把辨别器足够好的更新,我们更新生成器则没有太大的意义。
如果把辨别器更新的太好了,
1
−
D
(
G
(
z
i
)
)
1-D(G(z^i))
1−D(G(zi))会变成0,此时对生成器的更新会有困难。
GAN的收敛是非常不稳定的。
三、
在上面的公式里,后面一项会有一点问题,即容易把辨别器更新的太好了,
1
−
D
(
G
(
z
i
)
)
1-D(G(z^i))
1−D(G(zi))会变成0,此时对生成器的更新会有困难,所以更新G的时候把目标函数改成max
l
o
g
D
(
G
(
z
)
)
logD(G(z))
logD(G(z)),但同时也会产生一些数值上的问题,今后的工作会对其进行一些改进。
Theoretical Results
(讲了一些理论上的结果)
一、当且仅当
p
g
=
p
d
a
t
a
p_g=p_data
pg=pdata(生成器学到的分布=真实数据的分布),目标函数有一个全局最优解。
二、算法一确实能够求解目标函数。
Global Optimality of p g = p d a t a p_g=p_data pg=pdata
(讲目标函数是正确的)
Proposition 1 当G固定时,辨别器最优解(取值范围[0,1])为
当
p
g
=
p
d
a
t
a
p_g=p_data
pg=pdata时,结果为1/2。
Theorem 1 当且仅当
p
d
a
t
a
=
p
g
p_data=p_g
pdata=pg时,C(G)取得全局最小值。
KL散度,量化两种概率分布P和Q之间差异的方式,又叫相对熵。在概率学和统计学上,我们经常会使用一种更简单的、近似的分布来替代观察数据或太复杂的分布。K-L散度能帮助我们度量使用一个分布来近似另一个分布时所损失的信息。
GAN使用的JS散度,相对熵(KL散度)虽然可以用来表示两个概率分布之间的差异,但是它并不是对称的,因此有时用它来训练神经网络会有顺序不同造成不一样的训练结果的情况。为了克服这个问题,有人就提出了一个新的衡量公式,叫做JS散度。
Convergence of Algorithm 1
Proposition 2
如果 G 和 D 有足够的容量,并且在算法 1 的每一步,允许判别器在给定 G 的情况下达到其最优值,并更新
p
g
p_g
pg 以改进标准
E
x
∼
p
d
a
t
a
[
l
o
g
D
∗
G
(
x
)
]
+
E
x
∼
p
g
[
l
o
g
(
1
−
D
∗
G
(
x
)
)
]
Ex∼p_data [log D∗ G(x)] + Ex∼p_g [log(1 − D∗ G(x))]
Ex∼pdata[logD∗G(x)]+Ex∼pg[log(1−D∗G(x))] 然后
p
g
p_g
pg 收敛到
p
d
a
t
a
p_data
pdata。
Advantages and disadvantages
优:生成器没有去看真正样本上的数据,没有试图去拟合那些特征,所以使得其能够生成比较锐利的一些边缘。
缺:要均衡好G和D,如果G和D没均衡好,会导致结果很差。
Conclusions and future work
论文精读(李沐老师)Attention Is All You Need
Abstract
在主流的序列转录(给你一个序列,生成另外一个序列)模型中主要是依赖复杂的RNN和CNN,一般包括encoder和decoder两个结构。在性能最好的模型里,通常使用注意力机制连接encoder和decoder。
(本文想做一个序列转录模型,讲述了一下现在主流的模型是什么)
本文提出了一个新的简单的架构——Transformer,本模型完全基于注意力机制,而没有用RNN和CNN。做了两个机器翻译的实验,显示出这个模型在性能上特别好,有更好的并行化以及需用更少的时间来训练。我们的模型在英语到德语上的翻译工作达到了28.4的BLEU score,比目前最好的结果高出2个BLEU score。在英语到法语的翻译工作上,做了一个单模型实验,比所有的模型效果都要好,只在8个GPU上训练了3.5天。Transformer模型在别的任务上泛化的都很好。
(本文本来是针对机器翻译这一小领域提出的transformer,其出圈是可以应用到nlp,video等领域并取得了很好的效果)
Conclusion
一、本文提出了transfomer模型,是第一个仅仅使用注意力机制的序列转录模型,把之前的循环层全部换成了muti-headed self-attention。
二、在机器翻译任务上,transformer要比基于RNN和CNN的架构快很多。在实际任务中,效果也比较好。
我们认为transformer可以用在文本以外的任务中,包括图片、语音和视频。使生成不那么时序化也是另外一个研究方向。
Introduction (对摘要的扩充)
一、在时序模型中,常用的是RNN(2017年提出)、LSTM和GRU。两个比较主流的模型是语言模式和Encoder-decoder架构。
二、(主要讲RNN的特点和缺点)假设你的序列是一个句子,RNN会一个词一个词的看,对第t个词,会计算其隐藏状态ht,ht是由h(t-1)和第t个词本身决定的。因此导致,难以并行化,计算量大以及会丢失距离较远的信息,如果不想丢失则需要付出较大的内存空间。虽然采用了一些因式分解等方法提升并行度,但是本质上还是没有解决太多的问题。
三、(主要讲Attention在RNN上的应用,如何将encoder的东西有效的传到decoder。)
四、(讲本文提出的transformer)transformer不再使用RNN,而是纯基于注意力机制,并行度很高,能在较短时间内做到很好的一个效果。
Background(相关工作)
一、如何使用CNN替换RNN来减少时序的计算,但CNN对于比较长的序列难以建模,Transfomer可以看到整个序列。但是卷积可以做多个输出通道,我们也想要这个效,所以提出了muti-headed attention来模拟CNN多输出通道的一个效果。
二、讲自注意力机制,这个工作已被提出,并不是本文的一个创新。
三、讲End-to-end Memory networks。
四、Transformer是第一个只依赖于自注意力机制,来做encoder-decoder架构的模型。
Model Architecture
一、序列模型中,现在比较好的是一个encoder-decoder的架构。encoder,是把x=(
x
1
x_1
x1,……,
x
n
x_n
xn)表示成z=(
z
1
z_1
z1,……,
z
n
z_n
zn)。decoder,放入z,生成一个(
y
1
y_1
y1,……
y
m
y_m
ym)的序列,在decode中,词是一个一个生成的,使用auto-regressive,即过去时刻的输出,作为当前时刻的输入。
二、Transformer是使用了一个encoder-decoder的架构,具体来说是将一些自注意力机制,Point-wise和fully connected layers堆积在一起。
Encoder and Decoder Stacks
Encoder:
使用了N=6个完全一样的layer。每个layer有两个子层,第一个子层是multi-head self-attention mechanism,第二个子层是a simple, position-wise fully connected feed-forward network(其实就是一个MLP,多层感知机)。对每一个子层用了一个残差连接,最后使用(layer norm,对每一个样本做Norm)层归一化。为了简单起见,对每一层输出的维度都变成512。
Decoder:
使用了N=6个完全一样的layer。每个layer有三个子层,其中两个子层与encoder一样,第三个子层用了一个Masked Multi-Head Attention。Mask,当前时刻为t,mask只能让看到t时刻之前(为了保证和预测时保持一致,具体做法:将t时刻之后,包括t时刻,取一个很大的负数如
−
1
0
10
-10^10
−1010,这样进入softmax做指数后就会变成0)。
Attention(注意力层)
注意力函数是一个将query和一些key-value对映射成输出的一个函数。query,key-value和output都是一些向量。output是value的一个加权和(导致output和value的维度一样),每个value的权重是value对应的key与query的相似度算来的。
(在连接encoder和decoder时,key和value不会改变,随着query的改变,权重不同,输出也会不同)
Scaled Dot-Product Attention(是最简单的注意力机制)
一、query和key长度都是等长的,为
d
k
d_k
dk。value是
d
v
d_v
dv(那么输出也是
d
v
d_v
dv)。对query和key做内积,然后将其作为相似度(内积越大,相似度越高),然后除以
d
k
\\sqrtd_k\\quad
dk,然后通过一个softmax(对每一行做softmax,每一行之间是独立的)来得到权重(非负加起来为一)。
二、query可以写成一个矩阵Q(因为可能不止一个query),key——K,value——V
三、一般有两种比较常见的注意力机制:additive attention(可以处理query和key不等长的情况) 和 dot-product attention(本文用)。两种注意力机制其实差不多,本文选择的是点乘注意力机制,因为简单、高效。
四、(解释为什么除以一个
d
k
\\sqrtd_k\\quad
dk)当
d
k
d_k
dk(向量长度)比较大时,点积后的值可能会比较大/较小,就会导致softmax后的值向两端(0和1)靠拢,出现这种情况算梯度会比较小,所以除以一个
d
k
\\sqrtd_k\\quad
dk。
Multi-Head Attention
一、与其做一个单个的注意力函数,不如将整个k,v,q投影到低纬,投影h次(本文用了8个头),然后再做h次的注意力函数,然后将每一个注意力函数的输出并在一起,再投影回来得到一个最终的输出。
三、在我们的工作中,h=8。因为有残差连接的存在,我们输入和输出的维度要一样,所以投影的维度为
d
k
=
d
v
=
d
m
o
d
e
l
/
h
=
512
/
8
=
64
d_k=d_v=d_model/h=512/8=64
dk=dv=dmodel/h=512/8=64(我们每一次将其投影到64维,然后算注意力函数,最后在投影回来)。
Applications of Attention in our Model(讲在transformer中如何使用注意力机制的)
一、在编码器(encoder layers)这一层。假设句子长为n(n个词),则编码器的输入为n个长为d的向量。Q,K,V其实是一样的,复制了三份,只是
w
q
,
w
k
,
w
v
w_q,w_k,w_v
wq,wk,wv不同。
二、在解码器(decoder layers)这一层。唯一与编码器这一层的注意力机制,不一样的是有一个mask这个东西。
三、在连接encoder和decoder这一层,key和value来自编码器的输出(n个长为d的向量),query来自解码器下一个attention的输入(m个长为d的向量)。
Position-wise Feed-Forward Networks(下图中蓝色部分)
一、其实就是一个全连接的前馈网络(其实是一个MLP),不一样的是同一个MLP对每一个词都作用了一次(这个就是position-wise)。
二、x是一个512维,
W
1
W_1
W1会将其投到2048维(扩大了四倍),但是由于还要做残差连接,所以用
W
2
W_2
W2将其又投影到512维。FFN(x)说白了就是一个单隐藏层MLP,然后中间隐藏层把输入扩大了四倍,最后输出的时候又回到输入大小。
其实就是通过一个attention层全局的去拉了整个序列的信息,然后再用MLP做语义的转换。
Embeddings and Softmax
embedding,给任何一个词,学习一个长为d(本文d=512)的向量来表示。
编码器,解码器,在softmax之前,都需要一个embedding,本文为了方便,使用了相同的权重。在embedding layers乘了一个
d
m
o
d
e
l
\\sqrtd_model\\quad
dmodel(d=512)。因为在学习embedding的时候,会把每一个向量的L2 norm学成一个比较小的值,从而导致学习到的权重值比较小。因为要之后要加入Positional encoding,乘了一个
d
m
o
d
e
l
\\sqrtd_model\\quad
dmodel后这样会使得这两个在规模(scale)上差不多。
Positional Encoding
attention不会处理时序信息,当一句话的词颠倒时,对于attention来说没变化,但是这句话的语义已经发生了改变,所以需要positional encoding。
Why Self-Attention
Complexity per Layer计算复杂度(越低越好)
Sequential Operations顺序的计算(越低越好,即下一步计算必须要等前面多少计算完成)
Maximun Path Length(越短越好,一个信息到另一个信息点的距离)
Training
Training Data and Bathing
byte-pair encoding (bpe)…
Hardware and Schedule
8 NVIDIA P100 GPUs…
Optimizer
Adam
模型越宽学习率越小
Regularization(正则化)
Residual Dropout
Transformer中对每个子层(self-attention层和全连接层)都进行了residual dropout。具体来说,在每个子层的输入和输出之间添加了一个残差连接,并在残差连接上应用了dropout。这样做的目的是防止过拟合和加速训练。
Label Smoothing
以上是关于论文精度(李沐老师)Generative Adversarial Nets的主要内容,如果未能解决你的问题,请参考以下文章
论文精读(李沐老师)Attention Is All You Need
论文笔记---ClusterGAN: Latent Space Clustering in Generative Adversarial Networks
Generative Adversarial Nets 论文翻译
PyTorch笔记 - Generative Adversarial Networks 论文和源码