2017年Google在论文《Attention is All You Need》中提出了Transformer模型,并成功应用到NLP领域。该模型完全基于自注意力机制Attention mechanism实现,弥补了传统的RNN模型的不足。
本文笔者将详解使用Pytorch从零开始逐步实现Transformer模型。
首先我们先回顾一下Transformer原理。宏观层面,Transformer可以看成是一个黑箱操作的序列到序列(seq2seq)模型。例如,在机器翻译中,输入一种语言,经Transformer输出翻译后的另一种语言。
拆开这个黑箱,可以看到模型本质就是一个Encoders-Decoders结构。
每个Encoders中分别由6层Encoder组成。(所有Encoder结构完全相同,但是训练参数不同,每个参数是独立训练的,循环执行6次Encode,而不是只训练了一个Encoder然后复制5份)。
Decoders同理。
这里每个Encoders包含6层Encoder,只是论文中Nx=6,实际可以自定义。
Transformer整体架构如下图所示。
其中,
编码端:经过词向量层(Input Embedding)和位置编码层(Positional Encoding),得到最终输入,流经自注意力层(Multi-Head Attention)、残差和层归一化(Add&Norm)、前馈神经网络层(Feed Forward)、残差和层归一化(Add&Norm),得到编码端的输出(后续会和解码端进行交互)。
解码端:经过词向量层(Output Embedding)和位置编码层(Positional Encoding),得到最终输入,流经掩码自注意力层(Masked Multi-Head Attention,把当前词之后的词全部mask掉)、残差和层归一化(Add&Norm)、交互注意力层(Multi-Head Attention,把编码端的输出和解码端的信息进行交互,Q矩阵来自解码端,K、V矩阵来自编码端的输出)、残差和层归一化(Add&Norm)、前馈神经网络层(Feed Forward)、残差和层归一化(Add&Norm),得到解码端的输出。
注:编码端和解码端的输入不一定等长。
👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]👈
下面还是以机器翻译(“我是学生”->“I am a student”)为例说明。
对于上图中,整个模型的输入即为"我是学生",目标是将其翻译为"I am a student",但是计算机是无法识别"我是学生"的,需要将其转化为二进制形式,再送入模型。
将中文转换为计算机可以识别的向量通常有两种方法:
One Hot编码:形成高维向量,对于中文来说,汉字的数量就是向量的维度,然后是哪个字就将对应位置变为1,其它位置变为0,以此来表示一句话。
Embedding词嵌入:通过网络进行训练或者通过一些训练好的模型将其转化成连续性的向量。
一般来说第二种方法使用较多,因为第一种有几个缺点,第一个就是每个字都是相互独立的,缺少语义联系信息,第二就是汉字数量太多,会导致生成的维度过大,占用系统内存。
输入Inputs维度是[batch size,sequence length],经Word2Vec,转换为计算机可以识别的Input Embedding,论文中每个词对应一个512维度的向量,维度是[batch_size,sequence_length,embedding_dimmension]。batch size指的是句子数,sequence length指的是输入的句子中最长的句子的字数,embedding_dimmension是词向量长度。
如上图所示,以机器翻译(“我是学生”->“I am a student”)为例,首先对输入的文字进行Word Embedding处理,每个字(词)用一个连续型向量表示(这里定义的是4维向量),称为词向量。这样一个句子,也就是嵌入后的输入向量input Embedding就可以用一个矩阵表示(4*4维,序列长度为4,每个字用4维向量表示)。input Embedding加上位置信息得到编码器的输入矩阵。
「为什么需要在input Embedding加上位置信息?」 与RNN相比,RNN是一个字一个字输入,自然可以保留每个字的顺序关系信息,而Transformer使用的是自注意力机制来提取信息,一个句子中的每个字/词是并行计算,虽然处理每个字的时候考虑到了所有字对其的影响,但是并没有考虑到各个字相互之间的位置信息,也就是上下文。所以需要引入位置信息。
Transformer中使用Positional Encoding表示每个字/词的位置信息。定义如下:
其中,
pos:表示一句话中某个字的实际位置,例如,表示第1个字,pos=0;,表示第2个字,pos=1。
表示pos位置处的字的Positional Encoding向量,该向量可以用来给句子中每个字提供位置信息。换句话说,就是我们通过注入每个字的位置信息,增强了模型输入。
:表示词向量的维度。例如上述示例定义的4,例如论文中的512。
i:表示词向量的第i+1维度。例如表示第2个字的第3维度,i为奇数,使用cos函数;i为偶数,使用sin函数。(从0开始计数)
例如表示第3个字(pos=2)“我”的第3维度(i=2),对应的值就是
例如表示第2个字(pos=1)“我”的第4维度(i=3),对应的值就是
这样就即可实现让自注意力机制考虑词的顺序,同时又可以输入所有的词。
「Word Embedding」
Word Embedding在Pytorch中通常用nn.Embedding实现。
「Positional Encoding」
注意力机制,顾名思义,就是我们对某件事或某个人或物的关注重点。举个生活中的例子,当我们阅读一篇文章时,并非每个词都会被同等重视,我们会更关注那些关键的、与上下文紧密相关的词语,而非每个停顿或者辅助词。
对于机器来说其实就是赋予多少权重(比如0-1之间的小数),越重要的地方或者越相关的地方赋予的权重越高。
注意力机制的实现思想是先计算第1个字与句中每个字的注意力分数(包括第1个字),再用求得的注意力分数与对应字的信息相乘,并相加,得到的结果就是第1个字与句子中所有字的加权和,第2个字、第3个字…以此类推。
如上图所示,以包含位置信息的词向量作为Self Attention Mechanism的输入。即为一句话中第i+1个词的词向量。分别乘以、、三个矩阵,得到、、。其中,
q是查询向量
k是词的“被查”向量
v是词的“内容”向量
下来计算每个字的注意力信息。以第1个字与句子中所有字的注意力信息为例,首先分别乘以、、、,得到4个常数注意力值、、、,再对其分别经过Softmax归一化,得到第1个字与所有字的注意力分数、、、,它们的和为1,最后再用注意力分数与对应的字信息、、、相乘,即可得到第1个字与句中所有字的加权信息。加权和:
第2、3、4个字与句子中所有字的加权和
、、
以此类推。
如上所述,即为注意力机制的思想。
实际中计算机为了加速计算,通常采用矩阵计算思想。
「矩阵计算思想」
如下图所示,首先词向量矩阵分别乘以、、三个矩阵,得到、、。其中,、、矩阵的维度是[词向量长度,词向量长度]。
再用q矩阵乘以k矩阵得到注意力值矩阵,如下图所示。其中,
:k矩阵的转置。
d:词向量长度。这里是4,论文中是512。
然后,矩阵每一行,经过Softmax计算出注意力分数矩阵。公式如下:
这里,s=3。
注:矩阵每一行的分数值和为1。
最后,用注意力分数矩阵乘以矩阵得到输出矩阵,其中,
即为注意力分数矩阵与矩阵的点积,也是加权和。以上就是注意力机制计算的完整过程。
多头注意力机制即就是把上述的、、三个矩阵从特征维度(词向量长度)上拆分为形状相同的小矩阵,如下图所示,拆分为2个形状相同的小矩阵,即为二头注意力。本例中,句子长度为4,词向量维度是4,小矩阵维度即为[4,4/2=2]。接下来以上述方式计算2个b矩阵,再将每个Head Attention计算出来的b矩阵拼接,即为最终的注意力矩阵。
注:论文中句子长度为5,词向量维度是512,将、、三个矩阵拆分成了8个形状相同的小矩阵,也就是8头注意力,小矩阵维度为[5,512/8=64]。
其中,输入与最后输出b的形状相同。
Add采用残差神经网络思想,也就是Multi-Head Attention的输入矩阵直接与输出相加,这样可以让网络训练的更深,得到矩阵,再经过Layer normalization归一化处理,加快训练速度,使得的每一行也就是每个句子归一化为标准正态分布,输出为。公式如下:
均值:μ,其中,s是的长度。
方差:μ
归一化:
将Add & Layer normalization输出,经过两个全连接层(第一层的激活函数为 Relu,第二层不使用激活函数),再经过Add & Layer normalization得到最后输出矩阵O。
Mask句子中没有实际意义的占位符,例如’我 是 学 生 P’ ,P对应句子没有实际意义,所以需要被Mask,Encoder_input 和Decoder_input占位符都需要被Mask。
Decoder的输入是最后一个Encoder block的输出。如下图所示,以中文翻译“我是学生”为例,首先将“我是学生”整个句子输入到Encoder中,得到最后一个Encoder block的输出后,将在Decoder中输入"S I am a student",s表示开始。注意这里,“S I am a student"不会一并输入,而是在T0时刻先输入"S”,预测出第一个词"I";再在T1时刻,输入"S"和"I"预测下一个单词"am";同理在T2时刻,输入"S"、“I"和"am”,预测出第三个单词"a",依次把整个句子输入到Decoder,预测出"I am a student E"。
这里采用Mask上三角矩阵掩盖了Decoder的输入,T0、T1、T2、T3、T4即为每个时刻的输入。
Masked Multi-Head Attention与Multi-Head Attention类似,只是采用了Mask上三角矩阵,掩盖Decoder的输入。如上所述。
Decoder的Multi-Head Attention同样和Encoder的Multi-Head Attention结构一样,只是Decoder的Multi-Head Attention中,K、V矩阵来自Encoder的输出,而Q矩阵来自Masked Multi-Head Attention 的输出。
Decoder输出矩阵形状是[句子长度,词向量维度],经过nn.Linear全连接层,再通过softmax函数得到每个词的概率,然后选择概率最大的词作为预测结果。
Decoder两次调用MultiHeadAttention时,第一次调用传入的 Q,K,V 的值是相同的,都等于dec_inputs,第二次调用 Q 矩阵是来自Decoder的输入。K,V 两个矩阵是来自Encoder的输出,等于enc_outputs。
Trasformer的整体结构,输入数据先通过Encoder,再通过Decoder,最后把输出进行多分类,分类数为英文字典长度,也就是判断每一个字的概率。
领取方式在文末
学习大模型课程的重要性在于它能够极大地促进个人在人工智能领域的专业发展。大模型技术,如自然语言处理和图像识别,正在推动着人工智能的新发展阶段。通过学习大模型课程,可以掌握设计和实现基于大模型的应用系统所需的基本原理和技术,从而提升自己在数据处理、分析和决策制定方面的能力。此外,大模型技术在多个行业中的应用日益增加,掌握这一技术将有助于提高就业竞争力,并为未来的创新创业提供坚实的基础。
①AI+教育:智能教学助手和自动评分系统使个性化教育成为可能。通过AI分析学生的学习数据,提供量身定制的学习方案,提高学习效果。
②AI+医疗:智能诊断系统和个性化医疗方案让医疗服务更加精准高效。AI可以分析医学影像,辅助医生进行早期诊断,同时根据患者数据制定个性化治疗方案。
③AI+金融:智能投顾和风险管理系统帮助投资者做出更明智的决策,并实时监控金融市场,识别潜在风险。
④AI+制造:智能制造和自动化工厂提高了生产效率和质量。通过AI技术,工厂可以实现设备预测性维护,减少停机时间。
…
这些案例表明,学习大模型课程不仅能够提升个人技能,还能为企业带来实际效益,推动行业创新发展。
如果你对大模型感兴趣,可以看看我整合并且整理成了一份AI大模型资料包,需要的小伙伴文末免费领取哦,无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发
整个学习分为7个阶段
涵盖AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,皆可用。
从入门到进阶这里都有,跟着老师学习事半功倍。
😝朋友们如果有需要的话,可以V扫描下方二维码联系领取~
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://www.bhha.com.cn/news/2458.html