版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深度学习基础与实例教程Transformer模型第七章目录02自编码器Autoencoder01自注意力机制Selfattentionmechanism03Transformer机制及应用TransformerMechanismandApplications自注意力机制Selfattentionmechanism301
7.1自注意力机制4Transformer的核心是自注意力机制(Self-Attention)。在时间序列数据中,往往在不同的时刻之间存在着很强的相关性。对于这种相关性的处理,RNN于LSTM都是通过递归性质与隐藏状态来实现的。但隐藏层的能力是有限的,虽然LSTM在RNN的基础上进行了改进,在一定程度上缓解了梯度爆炸与梯度消失的问题,增强了模型处理较长依赖的能力。但其对于处理时序数据的实质仍然是通过管理隐藏状态实现的,依然存在连续乘法的情况;对于过长的依赖关系,也容易超出LSTM的能力范围。为了解决上述问题。Transformer提出了自注意力机制。为了更好的理解Transformer中的自注意力机制,首先可以通过视觉中的注意力引入,如图所示:
7.1自注意力机制5当我们看到一副图像时,很容易被图上的主体部分所吸引。例如前图,如果我们想得到的结果是“狗”,那么注意力就会自然集中在图片左侧;如果想得到的结果是“猫”,那么注意力会自然集中在图片右侧。这是一种由人类大脑产生的注意力机制,这种注意力机可以理解为一种思维与图像区域的相关性,即“狗”与图片左侧区域具有很强的相关性,“猫”则与图片右侧具有很强的相关性。Transformer就是通过注意力机制捕获时序数据中的依赖关系。Transformer中的注意力机制被称为“自注意力机”,自注意力机制作用于数据本身,它允许输入的每个元素都与其它所有元素进行交互,从而获取全局信息。在自注意力过程中,每一个输入元素的表示都会更新,这个更新是基于它与序列中其他元素的关系。前图中展示的是输入与输出的注意力关系,而自注意力机制是输入与输入之间的注意力关系,例如小狗的鼻子与眼睛可能存在很强的依赖性。在时间序列数据中,自注意力机制用于捕获不同时刻之间的依赖性。本图展示了实际任务中的自注意力机制。图中的“making”、“more”、“difficult”产生了连线,则说明“making”与“more”和“difficult”之间产生了较强的相关性,捕获词语之间的相关性,有助于神经网络更好的理解文本中的语义。自注意力机制的核心由Quary(Q)、Key(K)与Value(V)组成。
7.1自注意力机制6Quary
Key
ValueQuery可以被理解为代表当前元素(或位置)的信息请求。它是对输入序列的一种查询表达,用来探索序列中其他部分与当前部分的关联度。Query与序列中所有Key的相互作用决定了当前元素对序列中其他元素的关注程度。当你在图书馆里寻找与特定主题相关的书籍时,Query是你的搜索查询,你用它来描述你想要找到的信息。在自注意力机制中,Query代表当前位置的信息需求,用于寻找与之相关的内容。Key代表序列中每个元素的地址或标识,可以被视为能被Query“寻址”的一种标签。每个Key都用来与Query相匹配,匹配程度高的Key表明其对应的Value对当前Query更为重要,即当前元素应该更加关注与该Key相关的内容。在图书馆中,Key相当于每本书的目录或索引。你会根据目录找到可能包含所需信息的书籍。在自注意力中,每个位置生成一个Key,用于匹配查询。Value代表序列中每个元素的实际内容,它包含了序列中每个位置的实际信息。一旦Query和Key之间的匹配程度被计算出来,Value就会根据这些匹配度被加权求和,形成最终每个位置的输出表示。这代表书籍的实际内容。在图书馆中,一旦基于目录找到书籍,你就会阅读书籍内容以获取信息。在自注意力机制中,Value包含实际的信息负载,一旦Key和Query匹配,相应的Value就会用来构建输出。7.1自注意力机制7自注意力机制的计算过程可以概括为以下步骤:01输入序列通过三组不同的线性变换(通常是权重矩阵乘法)生成对应的Q、K、V三组向量,如图所示。注:线性层中的矩阵在初始阶段是随机的,此时Q、K、V三组向量还不具备各自的功能,通过神经网络的反向传播与梯度下降算法不断更新线性层矩阵参数,Q、K、V三组向量逐渐向各自的功能靠近。因此自注意力机制只需训练线性层的三个矩阵。7.1自注意力机制8自注意力机制的计算过程可以概括为以下步骤:02计算每个Query与所有Key之间的匹配分数,通过softmax函数转换成概率形式,表示每个元素对序列中其他元素的关注程度。注:Query与Key实际上是通过相似度进行匹配的。Attention公式的可以理解为对QK求余弦相似度,再对其进行缩放,最后乘以V。此过程不产生任何需要训练的参数。7.1自注意力机制9经过Query、Key的匹配与softmax的映射,Query、Key的相关程度被转化为了概率表示,Query、Key相似度高的特征会被保留,相似度低的特征会被抑制,经过softmax映射的矩阵被称为注意力分数矩阵。注意力分数矩阵与Value相乘,即可得到加权后的Value。Value表示序列中每个位置的实际信息,与注意力分数矩阵相乘后,重要的内容被保留,而不重要的内容则会被抑制。自注意力机制也可以多层叠加。通过叠加注意力,相关性高的特征一直被保留,相关性低的特征持续被抑制,每一层都可以通过关注输入序列中的不同部分之间的关系来提取更高级的特征。随着层数的增加,模型会越来越关注输入序列中更细致、更复杂的模式。这种分层结构可以帮助模型更好地捕捉数据中的各种关联和模式,从而提高模型的性能。自编码器Autoencoder10027.2自编码器11人类在观察图像时,往往得到的是图像的全局信息;而计算机观察图像时,则需要逐个像素点进行扫描。因此计算机的图像处理效率往往是低于人眼的。人眼在观察图像时实际是对图像进行了隐式的压缩,对于计算机而言,也可先对图像进行压缩,再做后续处理,以此提高计算机的处理效率。而自编码器则实现了对数据的压缩。7.2.1自编码网络12自编码器可以在深度学习模型中用作预训练阶段,将数据的基本特征提取出来,为后续任务提供更好的初始化参数。例如自编码器可以用于图像分类任务的预训练。通过对大量图像进行无监督学习,提取出常见的图像特征,再将这些特征用作分类模型的初始参数。这样可以加速训练并提高分类准确性。自编码器可以将复杂的数据转换为简单的潜在空间,再从潜在空间生成新数据,实现自动创作。变分自编码器(VAE)通过学习图像的潜在表示,可以在该表示的基础上生成新图像。例如,VAE可以生成类似手写数字、自然风景或人物肖像的新图像。去除噪声自编码器通过学习输入数据的表示,可以有效识别出数据中的噪声部分,从而进行去噪操作。自编码器可以通过学习正常数据的潜在表示,识别出与正常数据差别较大的异常数据点,从而进行异常检测和去除。自编码器通过学习数据的紧凑表示,将高维数据压缩到低维潜在空间中。因此,它能够作为一种降维工具使用。自编码器的编码器部分将输入数据映射到低维的潜在表示,解码器部分可以从潜在表示中重建原始数据。信息检索自编码器可以用于信息检索。其主要作用在于通过学习数据的紧凑表示来提高检索的准确性和效率。自编码器通过无监督学习生成输入数据的低维表示,从而提取更具判别性和紧凑的特征表示。可以在该低维空间中计算不同数据之间的相似性,提高检索速度。预训练数据生成数据降维自编码的主要用途有以下几点:
7.2.2最简单的自编码网络13自编码(Auto-Encoder,AE)网络是输入等于输出的网络,最基本的模型可以视为三层的神经网络,即输入层、隐藏层、输出层,其结构如图7-4所示。其中,输入层的样本也会充当输出层的标签角色。自编码神经网络就是一种尽可能复现输入信号的神经网络,使得输入输出尽可能相似。其中,输入层也可称之为编码层。这部分网络将输入数据转换为一个较小的、密集的表示形式,通常称为编码或潜在空间表示。编码器试图捕捉数据中的重要特征,并以更简洁的形式表达这些特征。在图7-4中,输入特征长度为6,通过编码层处理,特征长度被压缩为3。隐藏层是自编码网络的编码空间,这是网络中的中间层,存储压缩后的数据表示。这个表示通常具有比输入数据更低的维度,是数据的一个“压缩”形式。输出层也可称之为解码层。解码器部分的任务是从潜在空间表示重建输入数据。自编码网络类似PCA算法(主成分分析),找到可以代表原信息的主要成分。自编码网络要求输出尽可能等于输入,并且其隐藏层必须满足一定的稀疏性,是通过将隐藏层中的后一层个数比前一层神经元个数少的方式来实现稀疏效果的。相当于隐藏层对输入进行了压缩,并在输出层中解压缩。整个过程中肯定会丢失信息,但训练能够使丢失的信息尽量减少,最大化地保留其主要特征。若自编码网络的激活函数使用线性函数,那么自编码网络可等价于PCA模型。7.2.3案例:基于自编码网络的MNIST数据集重建实战14引入头文件,并加载MNIST数据1importkerasfromkeras.layersimportInput,Densefromkeras.modelsimportModelfromkeras.datasetsimportmnistimportmatplotlib.pyplotasplt#加载MNIST数据集(x_train,_),(x_test,_)=mnist.load_data()#数据归一化x_train=x_train.astype('float32')/255.x_test=x_test.astype('float32')/255.#将数据拉平x_train=x_train.reshape((len(x_train),28*28))x_test=x_test.reshape((len(x_test),28*28))无需额外下载MNIST数据集,只需要利用keras加载keras.datasets中的MNIST即可,随后对数据进行归一化、拉平等操作。代码如下:7.2.3案例:基于自编码网络的MNIST数据集重建实战15定义网络模型2#输入层的维度input_dim=x_train.shape[1]#隐藏层维度encoding_dim=64#自定义自编码器类classAutoEncoder(Model):def__init__(self,input_dim,encoding_dim):super(AutoEncoder,self).__init__()#输入维度
self.input_dim=input_dim#隐藏层维度
self.encoding_dim=encoding_dim模型输入为拉平后的图像,序列长度为784,隐藏层维度设为64。即编码器会将长度为784的向量进行压缩,压缩后的向量长度为64;解码器根据长度为64的隐藏层向量进行解码,解码得到长度为784的向量。代码如下:
#编码器
self.encoder=keras.Sequential([Input(shape=(input_dim,)),Dense(encoding_dim,activation='relu')])#解码器
self.decoder=keras.Sequential([Dense(input_dim,activation='sigmoid')])defcall(self,inputs):#编码
encoded=self.encoder(inputs)#解码
decoded=self.decoder(encoded)
returndecoded7.2.3案例:基于自编码网络的MNIST数据集重建实战16训练自编码器3#训练轮数epochs=20#批次大小batch_size=256#优化器optimizer='adam'#损失函数loss='mse'#实例化并编译模型auto_encoder=AutoEncoder(input_dim=input_dim,encoding_dim=encoding_dim)auto_pile(optimizer=optimizer,loss=loss)#训练模型#这里训练时,输入与标签一致auto_encoder.fit(x_train,x_train,epochs=epochs,batch_size=batch_size,shuffle=True,validation_data=(x_test,x_test))接下来对自编码器进行训练。代码如下:Epoch1/20235/235[==============================]-1s4ms/step-loss:0.0597-val_loss:0.0315Epoch2/20235/235[==============================]-1s3ms/step-loss:0.0255-val_loss:0.0203Epoch3/20235/235[==============================]-1s3ms/step-loss:0.0176-val_loss:0.0148Epoch4/20235/235[==============================]-1s3ms/step-loss:0.0132-val_loss:0.0113Epoch5/20235/235[==============================]-1s3ms/step-loss:0.0103-val_loss:0.0090Epoch6/20235/235[==============================]-1s3ms/step-loss:0.0085-val_loss:0.0075Epoch7/20控制台输出如下:7.2.3案例:基于自编码网络的MNIST数据集重建实战17235/235[==============================]-1s3ms/step-loss:0.0072-val_loss:0.0065Epoch8/20235/235[==============================]-1s3ms/step-loss:0.0063-val_loss:0.0058Epoch9/20235/235[==============================]-1s3ms/step-loss:0.0057-val_loss:0.0053Epoch10/20235/235[==============================]-1s3ms/step-loss:0.0053-val_loss:0.0050Epoch11/20235/235[==============================]-1s3ms/step-loss:0.0050-val_loss:0.0047Epoch12/20235/235[==============================]-1s3ms/step-loss:0.0048-val_loss:0.0045Epoch13/20235/235[==============================]-1s3ms/step-loss:0.0046-val_loss:0.0044Epoch14/20235/235[==============================]-1s3ms/step-loss:0.0045-val_loss:0.0043Epoch15/20235/235[==============================]-1s3ms/step-loss:0.0044-val_loss:0.0042Epoch16/20235/235[==============================]-1s3ms/step-loss:0.0043-val_loss:0.0042Epoch17/20235/235[==============================]-1s3ms/step-loss:0.0043-val_loss:0.0041Epoch18/20235/235[==============================]-1s3ms/step-loss:0.0042-val_loss:0.0041Epoch19/20235/235[==============================]-1s3ms/step-loss:0.0042-val_loss:0.0040Epoch20/20235/235[==============================]-1s3ms/step-loss:0.0041-val_loss:0.0040通过分析控制台输出,可以发现训练集与验证集的损失逐渐降低,最后趋于收敛。7.2.3案例:基于自编码网络的MNIST数据集重建实战18可视化4#使用训练好的模型生成编码和解码图像encoded_imgs=auto_encoder.encoder(x_test)decoded_imgs=auto_encoder.decoder(encoded_imgs).numpy()#设置字体plt.rcParams['font.sans-serif']=['SimHei']#可视化图像个数n=4plt.figure()foriinrange(n):完成模型训练后,通过对比原图与重建图的方式,可视化模型效果。代码如下:
#原始图像
ax=plt.subplot(2,n,i+1)
plt.title('原始图片')
plt.imshow(x_test[i].reshape(28,28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)#重建图像
ax=plt.subplot(2,n,i+1+n)
plt.title('重建图片')
plt.imshow(decoded_imgs[i].reshape(28,28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)plt.tight_layout()plt.show()7.2.3案例:基于自编码网络的MNIST数据集重建实战19可视化效果图如图所示。对比原始图片与重建图片,可以发现自编码网络基本能够做到对图像的还原,但是图像边缘处存在一定程度的虚化,即自编码网络在编码和解码的过程中,存在一定程度的信息丢失。Transformer机制及应用TransformerMechanismandApplications20037.3.1Transformer机制21Transformer模型最近被广泛应用于语言任务,其创新性的结构为各种语言任务提供了强大的建模能力,在文本分类、机器翻译和问答等任务中展现出了卓越的性能。现有的框架通常应用全局或局部自注意力机制。与大多数序列对序列(seq2seq)模型相似,Transformer由编码器和解码器组成,如图所示。左侧的结构是Transformer的编码器,它将输入序列进行位置编码后映射成特征向量。右侧结构对应解码器,解码器通过利用编码器生成的上下文信息和自身的自注意力机制来生成输出序列。7.3.1Transformer机制22Transformer编码器由四个部分组成,结构如图所示。7.3.1Transformer机制23(1)输入部分(Inputs)输入部分分为两个子模块:输入嵌入(InputEmbedding)与位置编码(PositionalEncoding)。输入嵌入是对输入的映射,即对数据进行升维,统一数据维度,方便后续计算。在Transformer自然语言处理中,输入嵌入也被称为词嵌入,能够把词典索引转化为向量,使语义相近的词语在特征空间中更加接近。位置编码的目的是为输入添加位置信息。自注意力机制对输入的位置是不敏感的,无法捕获输入中的位置信息。即自注意力机制无法区分“今天不一定下雨”与“今天一定不下雨”。为了解决这个问题,就需要位置编码为输入添加位置信息。Transformer中使用三角函数进行位置编码,编码计算公式如下:1编码器7.3.1Transformer机制24(其中pos表示序列索引,i表示维度索引dmodel,当维度为奇数时,位置编码使用sin函数;当维度为偶数时,位置编码使用cos函数。如此产生的位置编码是固定不变的。下图是长度为256,维度为512的三角函数位置编码的可视化,纵轴为序列长度,横轴为序列的维度,可以发现序列的位置不同,位置编码的表示也不同。1编码器得到位置编码后,将其与原本的序列相加,即为输入多头自注意力机制的向量,公式如下:其中x为输入嵌入序列,PE为位置编码x’为最终得到的输入特征。7.3.1Transformer机制25(2)多头自注意力机制(Multi-Head-Attention)在7.1节中,我们介绍了自注意力机制。而实际上Transformer中的自注意力机制是一种多头自注意力机制。多头自注意力机制是一种对自注意力机制的扩展,它允许模型学习多组注意力权重。每个注意力头都学习不同的注意力权重,然后将它们的输出合并起来,以获得更全面的表示。这样,模型可以在不同抽象级别和不同注意力焦点下对输入进行编码,提高了模型对输入序列的理解能力。下图展示了多头(双头)自注意力机制的计算过程。首先将数据的维度平分为两份,数据的维度与自注意力机制的头数应当满足整除关系。然后每一份数据都以7.1节中的注意力公式进行运算,最后将每个头得到的结果进行拼接作为输出。1编码器7.3.1Transformer机制26(3)残差结构与标准化(Add&Norm)在Transformer中,实现了ResNet中的残差结构。模块的输出与其输入进行相加。这有助于防止梯度消失或爆炸,并使得模型更容易学习残差信息,从而更深的模型能够更有效地训练。标准化通常是神经网络中不可或缺的一环,在卷积神经网络中,往往使用批标准化(BatchNormalization)对数据进行标准化处理,而Transformer中使用的是层标准化(LayerNormalization)。批标准化通过对每个批次中的特征进行标准化,通过计算均值和方差来标准化;而层标准化对每个样本中的特征进行标准化,通过计算每个特征的均值和方差来标准化,层归一化计算公式如下:首先计算样本的平均值µ与方差σ2:1编码器接下来对样本进行归一化,其中ɛ是一个很小的值,目的是为了防止分母为0:经过归一化处理后,数据被映射至均值为0,方差为1的分布(标准正态分布),层标准化中还增加了两个可以学习的参数,以便于模型将数据映射至特定分布,计算公式如下,γ与β为可学习的参数:7.3.1Transformer机制27(4)前馈神经网络(FeedForward)前馈神经网络是一个全连接神经网络,主要用于对每个位置的特征进行非线性变换和映射。前馈神经网络接收来自自注意力机制的输出,将每个位置的特征向量进行线性变换和非线性映射,有助于模型学习到更高级别的特征表示,从而提高模型的表征能力。1编码器7.3.1Transformer机制28解码器相与编码器相似,其结构如图所示,与编码器不同在于:解码器有两个输入,且自注意力机制使用带掩码的自注意力机制与交叉自注意力机制。2解码器7.3.1Transformer机制29(1)解码器的输入不同于编码器只有一个输入,解码器有两个输入。第一个输入为之前生成的部分输出序列,如图下方的输入,第二个是编码器的输出。以文本问答任务为例,如图所示,用户向模型提出问题“今天天气怎么样”,模型给出回答“不错”。首先,用户的输入“今天天气怎么样”首先被送入编码器,编码器通过自注意力机制将文本输入转化为特征向量,随后给解码器输入一个指令“<start>”,同时将编码器输出的特征序列输入进解码器中,解码器就会根据指令“<start>”与特征序列输出第一个字“不”;随后将“不”输入进解码器,同时输入特征序列,解码器会根据“不”与特征序列输出第二个字“错”;最后将“错”输入进解码器中,同时输入特征序列,解码器会根据“错”与特征序列输出“<end>”,此时程序就会检测到模型的生成结束,那么就可以将过程中的输出返回给用户,显示在界面上。2解码器7.3.1Transformer机制30(2)掩码多头自注意力机制(MaskedMulti-HeadAttention)掩码多头自注意力机制是解码器中的一种特殊的自注意力机制。加入掩码的目的是保证模型在训练过程中只能访问到当前位置及之前的信息,避免信息泄露,提前“看到”未来的信息。在训练阶段,如果要生成句子的第一个词,但模型能够看到整个句子,它可能直接根据整个句子的内容选择最适合的第一个词,而非仅根据真实场景下应该已知的上下文。这不仅违背了生成文本的自回归性质,而且会导致模型在训练和推理(生成新文本时)之间的行为不一致。加入掩码的方式是对注意力分数矩阵进行遮盖,遮盖方式如下:掩码自注意力机制实质上是将注意力矩阵填充为下三角矩阵,当注意力矩阵与V相乘时,v1(第一个时刻的v)与注意力矩阵的第一行相乘,此时v1能获得的注意力仅有对自身的注意力;而当计算v2(第二个时刻的v)时,v2获得的注意力不光包含自身的注意力还包含v2时刻之前的注意力,后面的时刻以此类推。掩码多头自注意力机制正是通过这种方式,避免了注意力机制中的信息泄露。2解码器7.3.1Transformer机制31(3)交叉多头自意力机制(Cross-AttentionMulti-HeadSelf-Attention)交叉多头自注意力机制通常是指在Transformer模型结构中,不同组件之间的交叉注意力。这种机制最常见于将Transformer应用于如机器翻译等任务,其中模型的编码器和解码器需要互相交互来处理信息。它允许解码器的每个时间步骤都能够访问整个编码器的输出。解码器在生成每个输出词时,都会使用其当前状态来查询编码器输出的序列,这个查询过程通过交叉注意力层实现。这样做可以帮助解码器根据编码器提供的上下文信息来决定下一个最合适的词是什么。其结构如图所示。2解码器7.3.2Transformer模型的应用及研究进展32在机器翻译中,Transformer模型主要用于将源语言文本转化为目标语言文本。具体而言,输入序列为源语言文本,输出序列为目标语言文本。Transformer模型通过编码器将源语言文本转化为一个定长向量表示,然后通过解码器将该向量表示解码为目标语言文本。其中,编码器和解码器均使用Self-Attention机制,可以有效地捕捉输入文本的语义信息,从而提高翻译质量。机器翻译应用领域01在文本分类中,Transformer模型主要用于将文本转化为向量表示,并使用该向量表示进行分类。具体而言,输入序列为文本,输出为文本所属类别。Transformer模型通过编码器将文本转化为一个定长向量表示,然后通过全连接层将该向量表示映射到类别空间。由于Transformer模型具有处理长文本的优势,因此在处理自然语言处理任务时,取得了很好的效果。文本分类在问答系统中,Transformer模型主要用于对问题和答案进行匹配,从而提供答案。具体而言,输入序列为问题和答案,输出为问题和答案之间的匹配分数。Transformer模型通过编码器将问题和答案分别转化为向量表示,然后通过Multi-HeadAttention层计算问题和答案之间的注意力分布,最终得到匹配分数。问答系统在序列预测任务中,Transformer可基于其强大的处理序列数据能力,完成序列预测任务。序列预测任务涉及预测给定历史数据点后的下一数据点或者一系列未来数据点。通常采用编码器-解码器架构的Transformer。编码器处理整个输入序列,将信息编码到一个固定长度的向量中。解码器则逐步生成输出序列,每一步都使用前一步的输出、编码器的输出以及已生成的所有输出的累积信息来预测下一个输出。序列预测在序列预测任务中,Transformer可基于其强大的处理序列数据能力,完成序列预测任务。序列预测任务涉及预测给定历史数据点后的下一数据点或者一系列未来数据点。编码器处理整个输入序列,将信息编码到一个固定长度的向量中。解码器则逐步生成输出序列,每一步都使用前一步的输出、编码器的输出以及已生成的所有输出的累积信息来预测下一个输出。计算机视觉任务7.3.2Transformer模型的应用及研究进展33研究进展02自从2017年Google首次提出Transformer模型以来,这一架构已经迅速发展并在许多研究领域和实际应用中产生了重大影响。在Transformer的改进和应用工作中,产生了如BERT和GPT这样的代表性成果。7.3.2Transformer模型的应用及研究进展34研究进展02(1)BERT由于原始的Transformer模型的训练策略只能关注句子中给定单词左侧的上下文,这对任务的提升是有限制的,因为在大多数语言任务中,来自左右两边的上下文信息都是非常重要的。BERT的预训练主要通过两种方法来进行:掩码语言模型(MaskedLanguageModel,MLM)在这种任务中,训练过程会随机地从输入数据中选择一些单词并将其替换为一个特殊的掩码符号(如"[MASK]")。BERT的任务是预测这些被掩码的单词原本是什么。通过这种方式,模型学习到了更加深入的语言理解能力,因为它必须依赖于句子中未被掩码的其他单词来预测缺失的单词。这种方法允许模型从双向(左侧和右侧的上下文)学习单词的含义,而不是传统的从左到右或从右到左的单向学习。下一句预测(NextSentencePrediction,NSP)在这个任务中,BERT需要判断两个句子是否是连续的。在预训练过程中,模型会被给予一对句子,其中一半的句子对是真实的连续句子对,而另一半则是随机组合的句子对。模型的任务是判断这两个句子是否是顺序关系。这种训练帮助BERT学习理解句子间的关系,这对很多下游任务如问答系统和自然语言推断等是非常有用的。BERT不仅提升了NLP技术的处理能力和应用范围,也为未来的AI研究和实际应用提供了新的思路和工具。7.3.2Transformer模型的应用及研究进展35研究进展02(2)GPTGPT(GenerativePre-trainedTransformer)是一个由OpenAI开发的自然语言处理模型,发布于2018年,旨在通过深度学习技术理解和生成人类语言。作为一个基于Transformer架构的模型,GPT特别强调通过大规模数据预训练和微调来适应具体的文本生成任务。它的主要特点是使用非常大的数据集进行预训练,学习广泛的语言模式和知识,然后可以针对特定的应用进行微调,以提高任务特定的表现。GPT使用自回归(autoregressive)语言建模作为其预训练任务。在自回归语言建模中,模型被训练来预测给定一系列单词后的下一个单词。例如,对于句子“今天天气非常”,模型需要预测出“好”这个词。这要求模型理解上文的内容并基于此生成下文。GPT-2是OpenAI继GPT之后推出的一种更高级的语言处理模型。发布于2019年,GPT-2在多方面对其前身GPT进行了改进和扩展,特别是在模型规模、数据处理和生成能力方面。GPT-2提供了几种规模的模型,最大的版本拥有1.5亿个参数,远超GPT的1.17亿参数。这使得GPT-2能够处理更复杂的语言模式和更广泛的数据类型。7.3.2Transformer模型的应用及研究进展36研究进展022020年,OpenAI发布GPT-3,其模型规模达到了惊人的1750亿个参数。GPT-3的出现,为人们提供了一种全新的方式来解决NLP问题。它能生成连贯、富有创造力的文本,显示出了强大的语言理解和生成能力。然而,尽管GPT-3在许多任务上都表现出了优秀的性能,但它仍然存在一些挑战。2023年,OpenAI发布GPT-4,进一步扩展了前代模型GPT-3的功能,引入了更大的模型规模和更复杂的算法,以提供更精准的文本理解和生成能力。这一版本在多方面都实现了显著的改进。从GPT到GPT-2,再到GPT-3和GPT-4,每一代模型都在规模、复杂性和语言处理能力上有所提升。这些模型能够执行多种语言任务,如文本生成、摘要、翻译、问答以及更具创造性的任务如编写代码或创作诗歌。GPT的影响力广泛,它不仅推动了自然语言处理技术的发展,还促进了人工智能领域的众多创新,成为了研究和商业应用中极为重要的工具。随着技术的进步和模型的进一步优化,GPT的应用前景看起来非常广阔,期待在未来能够解决更多复杂的语言处理问题。7.3.3案例:基于Transformer的编码器结构实现37引入头文件1importtensorflowastffromkeras.layersimportLayer,MultiHeadAttention,LayerNormalization,Dropout,Dense,Embeddingfromkeras.modelsimportModelimportnumpyasnp接下来引入所需头文件,代码如下:7.3.3案例:基于Transformer的编码器结构实现38构建前馈神经网络与位置编码2#前馈神经网络classFeedForward(Layer):def__init__(self,d_model,#模型维度
dff#前馈神经网络维度
):super(FeedForward,self).__init__()#前馈神经网络
self.ffn=tf.keras.Sequential([#第一层全连接
Dense(dff,activation='relu'),#第二层全连接,输出维度为d_modelDense(d_model)])defcall(self,x):#前向传播
x=self.ffn(x)returnx首先构建Transformer编码器中需要自定义的组件,即前馈神经网络与位置编码,代码如下:#位置编码classPositionalEncoding(Layer):def__init__(self,maximum_position_encoding,#最大序列长度
d_model,#模型维度
):super(PositionalEncoding,self).__init__()#保存最大序列长度
self.position=maximum_position_encoding#保存模型维度
self.d_model=d_model#生成位置编码
self.positional_encoding=self.get_positional_encoding()defget_positional_encoding(self):#生成位置编码
angle_rads=self.get_angles(np.arange(self.position)[:,np.newaxis],#生成每个位置
np.arange(self.d_model)[np.newaxis,:],#生成维度
)7.3.3案例:基于Transformer的编码器结构实现39构建前馈神经网络与位置编码2
#偶数位置使用sinangle_rads[:,0::2]=np.sin(angle_rads[:,0::2])#奇数位置使用cosangle_rads[:,1::2]=np.cos(angle_rads[:,1::2])#扩展维度
pos_encoding=angle_rads[np.newaxis,...]#转换为张量
returntf.cast(pos_encoding,dtype=tf.float32)defget_angles(self,pos,i):#获取角度
angle_rates=1/np.power(10000,(2*(i//2))/np.float32(self.d_model))returnpos*angle_ratesdefcall(self,x):returnself.positional_encoding7.3.3案例:基于Transformer的编码器结构实现40构建单层Transformer编码器结构2
#构建Transformer编码器层classTransformerEncoderLayer(Layer):def__init__(self,d_model,#模型维度
num_heads,#自注意力机制头数
dff,#前馈神经网络维度
rate=0.1#dropout概率
):super(TransformerEncoderLayer,self).__init__()#多头自注意力机制
self.mha=MultiHeadAttention(num_heads=num_heads,key_dim=d_model)#前馈神经网络
self.ffn=FeedForward(d_model=d_model,dff=dff)
#层归一化
self.layernorm1=LayerNormalization(epsilon=1e-6)self.layernorm2=LayerNormalization(epsilon=1e-6)Transformer编码器是一个多层堆叠结构,需要先构建单层Transformer编码器结构。代码如下:#正则化
self.dropout1=Dropout(rate)self.dropout2=Dropout(rate)defcall(self,x,training):#多头注意力机制
attn_output=self.mha(x,x,x)#q=k=v=x#正则化
attn_output=self.dropout1(attn_output,training=training)#残差连接
attn_output=x+attn_output#标准化
out1=self.layernorm1(attn_output)#前馈网络
ffn_output=self.ffn(out1)#正则化
ffn_output=self.dropout2(ffn_output,training=training)#残差连接
ffn_output=out1+ffn_output#标准化
out2=self.layernorm2(ffn_output)returnout27.3.3案例:基
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人事科教育干部遴选笔试题目
- 土地管法题库及答案
- 冻伤害急救知识试卷(附答案)
- 紫外线灯消毒试题及答案
- 固态电解质的高压稳定性研究综述
- 2026年放射防护台账管理办法
- 河南焦作市山阳区部分校2026-2027学年八年级上学期10月阶段检测数学
- 异常子宫出血护理小讲课
- 肠梗阻的急救护理措施
- 2026临床医学期末复习-药理学(专临床)历年题库含答案详解
- 社会工作者考试题库(1000题·含答案与解析)
- 2026环境检测公司招聘笔试备考试题及答案详解
- 2026年脉石英行业分析报告及未来发展趋势报告
- 第9章 因式分解(单元练习)-2025-2026学年苏科版数学八年级下册
- (2026年)患者十大安全目标课件
- 议论文的论证方法-2026年高考语文写作指导课件
- 2026年家庭医生团队签约服务技能培训考试题及答案
- 2026年高考化学全国I卷真题含解析及答案
- RTK测量教程培训城市管理与执法探索
- 中级财务会计试题以及答案
- 燃气场站消防安全知识培训课件
评论
0/150
提交评论