第八周:深度学习基础

摘要

本周学习了接着Transformer模型基础中的内容,学习了位置编码的原理,位置编码是一种在自然语言处理任务中常用的技术,是为了在输入数据中编码相对位置的信息,以便模型能够理解单词或子词之间的顺序关系,常用于 Transformer 模型或类似的序列到序列模型中。在学习完位置编码后,又学习了RNN反向传播和RNN梯度消失的原因,RNN梯度消失是指在反向传播过程中,随着时间步的增加,网络的梯度逐渐变小,甚至趋近于零。这个问题主要是由于RNN的循环结构导致的,因为网络的参数在每一个时间步都被重复使用,使得梯度在反向传播过程中多次相乘,导致梯度指数级地衰减。最后学习了最为精彩的GAN,GAN是基于对抗神经网络的,由生成器和判别器两个神经网络组成,生成器的隐藏层通过一系列非线性变换将低维向量映射到高维空间,从而生成图像。而判别器则可以是由CNN网络组成,主要是进行图像识别,判断输入的图像的真实性。

Abstract

This week, we studied then in the Transformer model foundation, we learned the principle of positional coding, positional coding is a technique commonly used in natural language processing tasks to encode information about relative positions in the input data so that the model can understand the sequential relationships between words or subwords, commonly used in Transformer models or similar sequence-to-sequence models. After learning about positional encoding, the causes of RNN backpropagation and RNN gradient vanishing are learned. RNN gradient vanishing refers to the fact that in the backpropagation process, the gradient of the network gradually becomes smaller or even tends to zero with the increase of the time step. This problem is mainly due to the cyclic structure of RNN, because the parameters of the network are reused at every time step, making the gradient multiply many times during the backpropagation process, resulting in exponential decay of the gradient. Finally, we learned the most exciting GAN, which is based on Adversarial Neural Networks and consists of two neural networks, the generator’s hidden layer maps low-dimensional vectors into a high-dimensional space through a series of nonlinear transformations to generate an image. The discriminator, on the other hand, can be composed of a CNN network, which mainly performs image recognition and determines the authenticity of the input image. The accuracy of the generator is improved by repeated training of the generator and the discriminator, and the ultimate goal is also to make the discriminator not recognize the generated image as false.

1. 位置编码

由于Transformer模型不像循环神经网络(RNN)一样具有隐式的顺序建模能力,位置编码被用来为模型提供输入序列中每个词元的位置信息。这样,模型可以区分不同位置的词元,并更好地理解序列中的顺序和依赖关系。

在RNN中,每个时间步的隐藏状态的计算是通过将当前时间步的输入与前一时间步的隐藏状态通过一个权重矩阵相乘并应用激活函数得到的。在进行反向传播计算梯度时,需要通过连续的时间步骤对梯度进行链式求导。由于乘法操作多次迭代,导致梯度的乘积逐步减小,导致梯度消失。在处理较长的序列时,特别是在深层网络中,梯度可能在反向传播过程中逐渐消失。

Transformer模型抛弃了RNN、CNN作为序列学习的基本模型。我们知道,循环神经网络本身就是一种顺序结构,天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构,完全采用Attention取而代之,这些词序信息就会丢失,模型就没有办法知道每个词在句子中的相对和绝对的位置信息。因此,有必要把词序信号加到词向量上帮助模型学习这些信息,位置编码(Positional Encoding)就是用来解决这种问题的方法。在Transformer模型中,位置编码通过在词嵌入向量中添加一个表示位置的向量来实现。这样,每个词元都有一个与其位置相关的向量表示。

采用以下公式计算位置编码:

P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) PE(pos, 2i) = sin(pos / 10000^{2i / d_ {model}}) PE(pos,2i)=sin(pos/100002i/dmodel)
P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE(pos, 2i+1) = cos(pos / 10000^{2i / d_ {model}}) PE(pos,2i+1)=cos(pos/100002i/dmodel)

其中, P E PE PE 表示位置编码, p o s pos pos 指当前字符在句子中的位置,(如:“深度学习如何学习”,这句话里面的 “深” 的 p o s = 0 pos=0 pos=0), d m o d e l d_{model} dmodel 指的是 word$ embedding 的长度(如:查表得到 “学习” 这个词 word embedding 为 [1, 2, 3, 4, 5],则 d m o d e l = 5 d_{model} = 5 dmodel=5 ), i i i 的取值范围是: i = 0 , 1 , . . . , d m o d e l − 1 。 i =0, 1, ... , d_{model}-1。 i=0,1,...,dmodel1 i i i 的值为偶数时使用第一个公式,为奇数时使用第二个公式。

2. RNN反向传播

我们的RNN输入序列为 x 1 , x 2 , x 3 , . . . , x T x x^{1},x^{2},x^{3},... ,x^{Tx} x1x2x3...xTx,其中 x 1 x^{1} x1 的激活值表示为 a 0 a^{0} a0,通过RNN计算过程,已知 a 0 a^{0} a0,则 a 1 = g ( W a 0 + U x 1 + b a ) a^{1} = g(Wa^{0}+Ux^{1}+b_a) a1=g(Wa0+Ux1+ba),其中W是隐藏层上一次的值作为这一次的输入的权重,U是输入层到隐藏层的权重矩阵,具体RNN架构以及计算方式可参考我们之前的博文:深度学习基础(残差网络+RNN基础),同理已知 x 2 , a 1 x^{2},a^{1} x2a1,可求出 a 2 a^2 a2 a 2 = g ( W a 1 + U x 2 + b a ) a^{2} = g(Wa^{1}+Ux^{2}+b_a) a2=g(Wa1+Ux2+ba)按照这种计算方式来计算,直到求出 a T x a^{Tx} aTx。求出各个激活值后,可以分别求出其对应的预测值。现在,给定 a 1 a^{1} a1,通过RNN神经网络,可以计算第一个预测值 y 1 y^{1} y1 y 1 = g ( V a 1 + b y ) y^{1} = g(Va^{1}+b_y) y1=g(Va1+by)同理,通过 a 2 a^{2} a2可以计算出第二个预测值 y 2 y^2 y2 y 2 = g ( V a 2 + b y ) y^2=g(Va^2+b_y) y2=g(Va2+by)以此类推,可以计算出 y T y y^{Ty} yTy,然后我们定义损失函数
L ( θ ) = ∑ n = 1 N C n ( θ ) L (\theta)=\sum_{n=1}^{N}C^{n}(\theta) L(θ)=n=1NCn(θ)计算输出层的梯度 g y = ∂ C ∂ y i = y ^ − y i g_{y}=\frac{\partial C}{\partial y^{i}}=\hat{y}-y^i gy=yiC=y^yi对于 V V V b y b_{y} by的更新,它们仅与当前时刻有关 ∂ C ∂ V = ∂ C ∂ y i ∂ y i ∂ V = ( y ^ − y i ) a i \frac{\partial C}{\partial V} =\frac{\partial C}{\partial y^i}\frac{\partial y^i}{\partial V}=(\hat{y}-y^i )a^i VC=yiCVyi=(y^yi)ai ∂ C ∂ b y = ∂ C ∂ y i ∂ y i ∂ b y = y ^ − y i \frac{\partial C}{\partial b_y}=\frac{\partial C}{\partial y^i}\frac{\partial y^i}{\partial b_y}=\hat{y}-y^i byC=yiCbyyi=y^yi对于 U U U W W W b a b_a ba的梯度影响有两条路径:当前时刻t对应的输出梯度损失和时刻t后面所有时刻对应的梯度损失。因为在后续时刻隐藏层计算其对应的隐藏状态时会使用到上一时刻的隐藏状态
在这里插入图片描述

3. RNN梯度消失

RNN(循环神经网络)梯度消失是指在反向传播过程中,随着时间步的增加,网络的梯度逐渐变小,甚至趋近于零。这个问题主要是由于RNN的循环结构导致的,因为网络的参数在每一个时间步都被重复使用,使得梯度在反向传播过程中多次相乘,导致梯度指数级地衰减。

RNN网络的关键特点是在每个时间步都会将当前时刻的输入和前一个时刻的隐藏状态作为输入进行计算,从而实现对序列数据的建模。然而,反向传播时,梯度信息需要通过时间步长的展开来传递,这就导致了梯度在每个时间步上会被重复相乘。如果梯度小于1,多次相乘会使得梯度逐渐衰减至接近于零,导致梯度消失

常用的RNN激活函数如tanh函数,在神经网络中主要用于增加模型的非线性能力。然而,tanh函数在输入接近于正负饱和区域时,激活函数的导数会趋近于零。当梯度小于1并且在每个时间步都经过tanh激活函数时,梯度会快速衰减至接近于零,导致梯度消失。

4. GAN基础

4.1 什么是GAN

GAN(Generative Adversarial Network)是一种机器学习模型,由两个神经网络组成:生成器(generator)和判别器(discriminator),GAN的目标是让生成器能够生成逼真的样本,以至于判别器无法区分真实样本和生成样本。生成器负责生成与真实样本相似的数据,比如图像、音频等。判别器则负责对生成器生成的样本进行分类,判断其是真实样本还是生成样本。两个网络通过博弈过程相互对抗和学习,使得生成器逐渐提升生成逼真样本的能力,而判别器逐渐提升区分真实和生成样本的能力。

4.2 有条件的生成对抗网络(CGAN)

有条件的生成对抗网络(Conditional GAN,简称CGAN)是在传统的生成对抗网络(GAN)的基础上添加了额外的条件信息,以帮助生成器生成特定类型的样本。

CGAN的生成器与传统的生成器类似,但增加了一个额外的输入——条件向量(condition vector)。这个条件向量可以是任何类型的额外信息,例如一个标签、一个文本描述,或者其他与生成样本相关的信息。这个条件向量会与生成器的随机输入向量(隐变量)合并,作为生成器的输入,生成器通过接收条件向量和随机输入向量,并通过一系列神经网络层来生成样本。条件向量的存在使得生成器能够根据所提供的附加信息生成与该条件相关的样本,换句话说,生成器可以根据条件向量的不同来生成符合特定条件的样本。

如下图,x为上述的条件向量
在这里插入图片描述

4.3 无条件的生成对抗网络(UGAN)

无条件的生成对抗网络(Unconditional GAN,简称UGAN)是传统生成对抗网络(GAN)的一种形式,它不需要额外的条件信息来生成样本。在UGAN中,生成器接收一个随机向量(隐变量)作为输入,并通过一系列的神经网络层逐步转换该向量为一个与真实样本相似的输出。由于没有额外的条件信息,UGAN生成的样本通常是随机的,而不受特定条件的约束。如下图UGAN结构图:
在这里插入图片描述
而输入的 z 是我们若干个自定义的低维向量,可以定义成50维的、100维的等,而我们从 z 中随机选取一个向量后,通过生成器,然后会得到一个对应的输出,当我们从 z 中选取的向量不同时,对应的输出也随之改变。如下图所示
在这里插入图片描述

4.4 GAN训练流程

以无条件GAN生成动漫人脸为例讲述GAN的工作流程,下面是具体的步骤:
step 1
固定生成器,训练判别器。生成器和判别器简单来说就是两个网络,而网络在训练前往往需要先初始化参数,接着向生成器中随机输入4组向量(这些向量可以从高斯分布或正态分布中选取),通过生成器得到动漫人脸,然后固定生成器。此时生成的动漫人脸图片可能会跟真实的动漫人脸图片差异很大,我们从网络上真实的动漫人脸图片随机选取4个,接下来我们用真实的图片与生成器生成的图片进行对比,将二者输入至判别器中,去训练判别器。

如下图(注:下图中D为判别器,G为生成器),真实图片标记为1,生成器产生的图片标记为0。而对于判别器来说,判别是真实图片还是生成图片,可以采用二分类或者回归。

  1. 看作一个分类问题,把真正的人脸当作类别1,生成器产生出来的图片当作类别2,然后训练一个classifier就结束了。
  2. 看做一个回归的问题,输出的值越接近1,就代表越接近真实图片;而越接近0,就代表越接近假的图片。

在这里插入图片描述
step 2
固定判别器,训练生成器。为什么需要训练生成器?而当生成器网络模型达到一定准确度后,为什么判别器反而会将生成器生成的图片当成真实图片?

根据 step 1 中所述,生成器生成的图片与真实图片作为输入数据,输入到判别器网络,而判别器网络可以是我们之前所学习的CNN网络,VIT网络等,具体网络模型根据任务需求来定,通过传统的图像识别、分类的网络模型,从而判断出输入数据中哪个是真实图片,哪个是生成器生成的图片。而在本例中,假设我们的判别器通过回归来区分二者。根据生成器生成的图片,将其输入到判别器中,通过逻辑回归,生成一个概率值,这个概率值越接近1,则生成器生成的图片越接近真实图片,而想要提高这个概率值,则需要我们不断的对生成器进行训练,在此期间,需要固定判别器。如下图所示:
在这里插入图片描述
在这里插入图片描述
step 3
固定生成器,训练判别器
step 4
固定判别器,训练生成器
step 5
反复训练,当生成器生成的图片和真图片的分布相似或一样的时候,鉴别器再也分辨不出来真假图片,这时候算法结束,得到最终的生成器。下图为整体过程:
在这里插入图片描述

4.5 GAN理论

对于生成器和鉴别器的训练,需要先定义损失函数,然后进行梯度下降。通过选取正态分布中的随机向量作为生成器的输入,通过生成器,得到一个复杂的分布,这个复杂的分布在这里我们将它称之为 P G P_G PG,而真实的图像数据也是一个分布,我们称它为 P d a t a P_{data} Pdata,我们训练生成器的目标则是让 P G P_G PG P d a t a P_{data} Pdata越接近越好。我们希望真实数据和生成数据的分布一样,我们需要使用两个分布之间的divergence的差值来更新生成器。我们需要找一组生成器网络的参数,使得 P G P_G PG P d a t a P_{data} Pdata之间的差值最小,具体的损失函数公式如下: G ∗ = a r g m i n G D I V ( P G , P d a t a ) G^* = argmin_{G}DIV(P_{G},P_{data}) G=argminGDIV(PG,Pdata)其中 D I V DIV DIV P G P_G PG P d a t a P_{data} Pdata之间的差值。
在这里插入图片描述
根据上述,那么我们该如何计算 D I V DIV DIV呢?

GAN告诉我们的是,只要我们从 P G P_G PG P d a t a P_{data} Pdata中选取出向量出来,就可以计算二者的DIV(差值),我们可以从我们的真实图库中随机选取一些图片,这就得到了 P d a t a P_{data} Pdata了。我们可以随机一些初始化向量作为生成器的输入,然后生成图片,这就得到了 P G P_G PG
在这里插入图片描述
在有了 P G P_G PG P d a t a P_{data} Pdata后,我们将其输入至判别器中进行逻辑回归,生成输出的概率值,如果输入的是 P d a t a P_{data} Pdata,则概率值越大,反之则概率值小。反复训练,提高判别器判断精度。通俗的来说,判别器的目的就是为了分辨是真图还是假图。
在这里插入图片描述
上述我们也可以把它当成一个优化模型的过程,我们需要定义一个损失函数,损失函数为 D ∗ = a r g m a x D V ( D , G ) D^{*}=argmax_{D}V(D,G) D=argmaxDV(D,G),这个损失函数可以取某一个函数 V V V 的最大值 V ( G , D ) = E y ∼ P d a t a [ l o g D ( y ) ] + E y ∼ P G [ l o g ( 1 − D ( y ) ) ] V(G,D)=E_{y \sim P_{data}}[logD(y)]+E_{y \sim P_{G}}[log(1-D(y))] V(G,D)=EyPdata[logD(y)]+EyPG[log(1D(y))],我们希望是 V ( G , D ) V(G,D) V(G,D)越大越好,即当 y y y是从 P d a t a P_{data} Pdata中选取出的,则 l o g D ( y ) logD(y) logD(y)越大越好。当 y y y是从 P G P_{G} PG中选取出的, l o g ( 1 − D ( y ) ) log(1-D(y)) log(1D(y))越小越好。因为判别器的损失函数和 JS divergence 有关,那么可以将生成器的损失函数进行替换

JS散度(Jensen-Shannon divergence),也称为Kullback-Leibler散度(Kullback-Leibler divergence)的对称版本,是一种用于衡量两个概率分布之间相似性的度量。JS散度的取值范围在0到1之间,当两个概率分布完全相同时,JS散度为0;当两个概率分布完全不同时,JS散度为1。JS散度用于衡量两个概率分布之间的相似性或差异

因此 G ∗ = a r g m i n G D I V ( P G , P d a t a ) G^* = argmin_{G}DIV(P_{G},P_{data}) G=argminGDIV(PG,Pdata)可以改写为 G ∗ = a r g m i n G m a x D V ( G , D ) G^* = argmin_{G}max_{D}V(G,D) G=argminGmaxDV(G,D)

总结

本周基本了解了GAN大致的原理,知道了生成性模型和对抗神经网络的关系,以及GAN的网络架构和模型训练流程,接触GAN后,对于GAN的数学推导将在下周继续进行,也产生了极大的学习兴趣,下周我会继续努力,加油。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@默然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值