transformer模型是干什么的,Transformer模型解析记录
transformer模型是干什么的,Transformer模型解析记录详细介绍
本文目录一览: Transformer
Transformer是第一个完全依靠自我注意力来计算其输入和输出的表征模型,而不使用序列对齐的RNNs或卷积的转换模型,它的主要目的是通过训练找到文本最适合的语义表征向量。
整体架构:编码器-解码器结构,堆叠式自关注和点对点的全连接层。
Encoder:输入单词的向量,经过位置编码,然后进入一个统一的结构,这个结构可以循环很多次,也就是说有很多层,每层可以分为自注意层和全连接层。
Decoder:输入前缀信息和编码器输出的词向量,加入位置编码,然后进入一个可以循环多次的模块(三层)。
注意函数:将一个查询和一组键值对映射到一个输出,其中查询Q、键K、值V和输出都是向量,它们也可以打包成矩阵方便实际应用。计算输出的矩阵为:
其中dk为查询向量(键)的维度,Q和K的维度一定相同,但V与Q,K的维度不一定相同。除以根号dk的原因是为了使QKT的值不过度增加,导致softmax函数反向传播时发生梯度消失,这个值是一个经验值。
最常用的注意函数是加法注意力和点积(乘法)注意力,其中点积注意力在实践中更快,更节省空间。
多头注意使模型能够共同注意来自不同位置的不同表征子空间的信息,通俗的说,也就是不同层次的注意力是该单词在不同方面的理解和其他单词对其的影响力。在单头注意的情况下,平均化会抑制这一点。在多头注意力中,采用8个平行的注意层(头),由于每个头的维度减少,总的计算成本与全维度的单头注意力相似。
Encoder输入的是单词的向量,这里对其进行随机初始化,但设为Trainable,在训练过程中不断对词向量的值进行改进,即End2End训练方式。
需要注意的是,输入模型的整个Embedding是词向量和位置向量直接相加后的结果,位置编码在下面介绍。
由于模型中不含有递归和卷积,为了使模型能够利用序列的顺序,必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们可以在编码器和解码器堆栈底部的输入嵌入中加入“位置编码”。
这里选择不同频率的正弦函数或者余弦函数。
例如,位置编码会根据位置加入一个正弦波,每个维度的波的频率和便宜量是不同的。
批处理对象:保存用于训练的src和目标句子,构建掩码。
首先对词向量进行随机初始化,再通过模型不断对向量进行调整。
1、批量和屏蔽
创建一个通用的训练和评分函数来跟踪损失。传递通用的损失计算函数,处理参数更新。
2、训练循环
3、训练数据和批处理
4、正规化
标签平滑化?KL div loss
1、使用了Attention机制,将序列中的任意两个位置之间的距离缩小为一个常量;
2、具有更好的并行性。
与Transformer模型的不同点:
1、输入:三个部分,分别为token embedding(随机初始化), position embedding(不是正余弦函数,而是直接从0开始编号), segment embedding(断句)。有两种符号,普通单词和特殊符号。
2、MLM:掩码语言模型, 用于预训练任务,其中无监督目标函数有AR, AE
相关链接
Self-Attention和Transformer - machine-learning-notes
https://baijiahao.baidu.com/s?id=1380070835729&wfr=spider&for=pc&qq-pf-to=pcqq.group
NLP预训练语言模型(三):逐步解析Transformer结构
Transformer是近两三年非常火的一种适用于NLP领域的一种模型,本质上是Encoder-Decoder结构,所以多应用在机器翻译(输入一个句子输出一个句子)、语音识别(输入语音输出文字)、问答系统等领域。本文基于Attention is all you need这篇论文,讲解Transformer的结构,涉及到的图片均为论文中或经典图片,参数值均来自论文,具体问题可以具体调整超参数。
Transformer的组成模块分为: Attention (包括multi-head self-Attention & context-Attention), Normalization (使用的是layer Norm,区别于Batch Norm), mask (padding mask & sequence mask), positional encoding , feed forword network (FFN)。
Transformer的总架构如下图所示:
这是典型的Transformer结构,简单来说,Transformer = 预训练(input) + Encoder*N + 预训练(output) + Decoder*N+output。
模型的运行步骤为:
① 对Input做Embedding,可以使用Word2Vec等工具,维度为512维,Embedding过后结合positional encoding,它记录了输入单词的位置信息。
② 预处理后的输入向量经过多头Attention层处理,加入残差、规则化,数据给到FFN(全连接层),再加入残差、规则化。如此反复,经过6个这样的Encoder(即Nx=6x),编码部分结束。
③ 编码部分的第一个Decoder的第一个Attention接受的是来自Outputs的信息,其余的均接受来自Encoder和上一层Decoder的信息。最终的output的串行生成的,每生成一个,就放到Decoder最下面的outputs座位Decoder的输入。
④ Decoder也是6个,最终的输出要经过线性层和Softmax得到最终输出。
要注意的是,Encoder和Decoder的结构是相同的,但不共享权重;在Encoder部分,每个单词在Attention层的路径具有依赖关系,串行执行,在FFN层不具有依赖关系,并行执行。
在这个结构中,存在这样几个Attention,有:self-attention & context attention & scaled dot-product attention & multi-headed attention。要说明的是scaled dot-product attention和multi-headed attention是两种attention的计算方法,后面会介绍,前两个Attention均使用的是这两种计算方法。
这种Attention的计算公式为:
以第一个Encoder为例对流程解释如下:
① 为Encoder的每个单词创建如下的三个向量:Query vector , Key vector , Value vector。这三个向量由输入的Embedding乘以三个向量矩阵得到。要注意的是,Embedding向量维度为512,Q K V向量维度是64。
② 计算Score:对于每个词,计算它自身的 与所有的 的乘积。
③ 计算Attention:按上面Attention的公式,将Score除以一个定值(这个操作称为“scaled”),进行Softmax变换,使所有Score之和为1。最后乘以对应位置的 ,得到该单词的Attention。
这就是scaled dot-product attention这种机制的计算方法,Transformer架构中的两种Attention都使用的是这种计算方法,不同的是二者的Q K V的来源有些差异。
注 : 为什么Softmax中要除以一个根号? 论文中给出的原因 是本来 和 都是均值为0、方差为1的变量,假设二者分布相互独立,他们乘积的分布就是均值为0、方差为 ,除以根号使得Softmax内的值保持均值为0、方差为1利于梯度计算。如果不加根号会使得计算收敛很慢,因为Softmax中的值处于梯度消失区。
进一步思考: 为什么很多Attention中没有Scaled这一步? Attention分为两种,前面那种是乘法,还有加法的一种: 。实验表明,加法虽然看起来简单但计算起来并没有快多少(tanh相当于一个完整的隐层),在维度较高时确实更好,但如果加上Scaled也差不多。Transformer中选择乘法是为了计算更快,维度大的话就加上Scaled。
多头注意力机制也是一种处理的技巧,主要提高了Attention层的性能。因为上面介绍的self-attention虽然包含了其余位置的编码,但主导的还是自身位置的单词,而有时我们更需要关注其他位置,比如机器翻译中的代词具体指代哪个主语。
多头注意力机制是把Q K V三个矩阵通过h个线性变换投影,然后进行h次self-attention的计算,最后再把h个计算结果拼接起来。
在Encoder的self-attention中,Q K V均是上一层Encoder的输出,对于第一个Encoder来说,他们就是输入的Embedding与positional encoding之和。
在Decoder的self-attention中,Q K V也是上一层Decoder的输出,对于第一个Decoder来说,他们是输入的Embedding与positional encoding之和。要注意的是,这部分我们不希望获取到后面时刻的数据,只想考虑已经预测出来的信息,所以要进行sequence masking(后面讲到)。
在Encoder-Decoder attention(即context attention)中,Q是Decoder上一层的输出,K V是Encoder的输出。
Transformer中使用的是LN,并非BN(Batch Normalization)。什么是Norm规范化,一般地,可以用下面公式来表达:
公式一为规范化处理前,公式二为处理后。规范化是对数据分布的调整,比如本身数据是正态分布,调整后的数据分布就是标准正态分布,相当于调整了均值和方差。这样做的意义一是让激活值落入激活函数敏感区间,梯度更新变大,训练加快,二是消除极端值,提升训练稳定性。
Transformer使用的是LN,而不是BN。首先看二者的区别如图:
LN是对每个样本自身进行规范化,BN是对一个批次的数据在同一维度上规范化,是跨样本的。在CNN任务中,BatchSize较大,并且训练时全局记录了样本均值和方差,适用于BN。而时序问题中,对每个神经元进行统计是不现实的。LN的限制相对来说就小很多,即时BatchSize=1也无妨。
mask分为两种,一是padding mask,二是sequence mask,这两种在Transformer中出现的位置不同:padding mask在所有scaled dot-product attention中均出现,sequence mask仅在decoder的self-attention中出现。
由于每个batch的输入序列的长度不同,padding mask被用来对齐序列长度,简单来说就是短序列向长序列对齐,对齐的方法就是补0。补充上的地方是没有意义的,那么Attention就不应该给以关注。实际上,我们并不是直接在相应位置上补充0,而是补充-inf(负无穷),这样在Softmax之后,这些位置的概率就接近0了。
在处理过程中,padding mask是一个bool张量,false的地方就是补0的地方。
前面提到,sequence mask的作用是不让decoder看到当前时刻以后的信息,所以要把后面那部分信息完全遮盖住。具体的做法是,产生一个上三角矩阵,上三角的值均为1,下三角和对角线均为0。
在decoder的self-attention部分,sequence mask 和 padding mask同时作用,二者相加作为mask。
RNN处理序列问题是天然有序的,而Transformer消除了这种时序上的依赖。以机器翻译为例,输出要是一个完整的合理的句子,就需要对输入数据处理时加入位置信息,否则可能输出结果的每个字是对的,但组成不了一句话。positional encoding是对输入信息的位置进行编码,再和输入的Embedding相加。
positional encoding使用的是正余弦编码:
在偶数位置,使用公式一正弦编码,奇数位置使用公式二余弦编码。由于正余弦函数的特性,这种编码既是绝对位置编码,也包含了相对位置编码的信息。
相对位置编码信息主要依赖于三角函数和角公式:
FFN 是一个全连接网络,顺序上先线性变换,再ReLU非线性变换,再线性变换,公式如下:
参考文献:
[整理] 聊聊 Transformer
碎碎念:Transformer的细枝末节
图解什么是 Transformer
文本分类实战(八)—— Transformer模型
深度学习:transformer模型
Bert和transformer区别有哪些?
Bert和Transformer都是深度学习领域的 pretrained language model(预训练语言模型),但它们在模型结构和应用上有以下几点主要区别:
1. 模型结构:
Bert是基于Transformer编码器结构的模型,只有Encoder部分。而Transformer是由Encoder和Decoder组成的完整序列到序列结构的模型。
Bert的模型结构更简单,主要用于上下文语义理解任务,如文本分类、文本相似度计算等。Transformer可以应用于更复杂的任务,如机器翻译、摘要生成等需要生成语言序列的任务。
2. 预训练语料:
Bert使用Wikipedia和BookCorpus进行预训练,语料广泛且无监督。Transformer通常使用有监督的平行语料,如WMT数据集进行预训练。
Bert的预训练更广泛,可以学习到更丰富的语义知识。而Transformer得到的知识更加专业和针对性。
3. 应用领域:
Bert用于NLP下游任务更广泛,主要用于语言理解相关任务,如命名实体识别、情感分析、文本分类等。
Transformer应用于机器翻译、摘要生成、对话等生成模型更为广泛。
4. 权重共享:
Bert使用相同的参数进行多层Transformer Encoder堆叠,权重共享,模型更加简洁。
Transformer的Encoder和Decoder具有不同的参数,权重不共享,模型相对更复杂。
总之,Bert和Transformer虽有Transformer Encoder的共同点,但实际上是两个不同的预训练语言模型,在模型结构、预训练语料、应用领域和权重共享等方面具有很大差异。根据不同的任务需求选择使用Bert或者Transformer可以获得更好的效果。 它们的创新也推动了NLP领域的蓬勃发展。
pandagpt原理
Transformer模型。GPT的原理是基于Transformer模型,它是一种基于注意力机制的深度学习模型,可以用来处理序列数据,如文本。gpd通过生成模型,可以实现文本自动生成、对话系统等自然语言处理任务。
图解什么是 Transformer
Transformer 是 Google 团队在 17 年 6 月提出的 NLP 经典之作, 由 Ashish Vaswani 等人在 2017 年发表的论文 Attention Is All You Need 中提出。
Transformer 在机器翻译任务上的表现超过了 RNN,CNN,只用 encoder-decoder 和 attention 机制就能达到很好的效果,最大的优点是可以高效地并行化。
Transformer 是一种基于 encoder-decoder 结构的模型,
在 Encoder 中,
在 Decoder 中,
下面我们具体看一下其中这几个概念,这里主要参考 Jay Alammar,他在 The Illustrated Transformer 中给出了很形象的讲解。
例如我们要进行机器翻译任务,输入一种语言,经过 Transformer,会输出另一种语言。
Transformer 的 encoder 由 6 个编码器叠加组成, decoder 也由 6 个解码器组成, 在结构上都是相同的,但它们不共享权重。
每一个 encoder 都分为两个子层:
每一个 decoder 也具有这两个层,但还有一个注意力层,用来帮助解码器关注输入句子的相关部分
首先使用嵌入算法将输入的 word 转换为 vector, 最下面的 encoder ,它的输入就是 embedding 向量, 在每个 encoder 内部, 输入向量经过 self-attention,再经过 feed-forward 层, 每个 encoder 的输出向量是它正上方 encoder 的输入, 向量的大小是一个超参数,通常设置为训练集中最长句子的长度。
在这里,我们开始看到 Transformer 的一个关键性质, 即每个位置的单词在 encoder 中都有自己的路径, self-attention 层中的这些路径之间存在依赖关系, 然而在 feed-forward 层不具有那些依赖关系, 这样各种路径在流过 feed-forward 层时可以并行执行。
Positional Encoding 是一种考虑输入序列中单词顺序的方法。
encoder 为每个输入 embedding 添加了一个向量,这些向量符合一种特定模式,可以确定每个单词的位置,或者序列中不同单词之间的距离。
例如,input embedding 的维度为4,那么实际的positional encodings如下所示:
在下图中,是20个单词的 positional encoding,每行代表一个单词的位置编码,即第一行是加在输入序列中第一个词嵌入的,每行包含 512 个值, 每个值介于 -1 和 1 之间,用颜色表示出来。
可以看到在中心位置分成了两半,因为左半部分的值由一个正弦函数生成,右半部分由余弦函数生成,然后将它们连接起来形成了每个位置的编码向量。
当然这并不是位置编码的唯一方法,只是这个方法能够扩展到看不见的序列长度处,例如当我们要翻译一个句子,这个句子的长度比我们训练集中的任何一个句子都长时。
例如我们要翻译:”The animal didn't cross the street because it was too tired” 这句话 这句话中的“it”是指什么?它指的是 street 还是 animal? 这对人类来说是一个简单的问题,但对算法来说并不简单。
而 Self-Attention 让算法知道这里的 it 指的是 animal
当模型在处理每个单词时,self-attention 可以帮助模型查看 input 序列中的其他位置,寻找相关的线索,来达到更好的编码效果。它的作用就是将对其他相关单词的“understanding”融入我们当前正在处理的单词中。
例如上图中,在第5层时,我们就知道 it 大概指的是 animal 了。
第一步,为编码器的每个输入单词创建三个向量, 即 Query vector, Key vector, Value vector 这些向量通过 embedding 和三个矩阵相乘得到, 请注意,这些新向量的尺寸小于嵌入向量。它们的维数为64,而嵌入和编码器输入/输出向量的维数为512.它们不一定要小,这是一种架构选择,可以使多头注意力计算(大多数)不变。 将x1乘以WQ得到Query向量 q1,同理得到Key 向量 和, Value 向量 这三个向量对 attention 的计算有很重要的作用
第二步,是计算一个得分 假设我们要计算一个例子中第一个单词 “Thinking” 的 self-attention,就需要根据这个单词,对输入句子的每个单词进行评分,这个分数决定了对其他单词放置多少关注度。 分数的计算方法是, 例如我们正在考虑 Thinking 这个词,就用它的 q1 去乘以每个位置的 ki
第三步和第四步,是将得分加以处理再传递给 softmax 将得分除以 8(因为论文中使用的 key 向量的维数是 64,8 是它的平方根) 这样可以有更稳定的梯度, 然后传递给 softmax,Softmax 就将分数标准化,这样加起来保证为 1。 这个 softmax 分数决定了每个单词在该位置bbei表达的程度。 很明显,这个位置上的单词将具有最高的softmax分数,但有时候注意与当前单词相关的另一个单词是有用的。
第五步,用这个得分乘以每个 value 向量 目的让我们想要关注单词的值保持不变,并通过乘以 0.001 这样小的数字,来淹没不相关的单词
第六步,加权求和这些 value 向量
这就是第一个单词的 self-attention 的输出 得到的向量接下来要输入到前馈神经网络,在实际实现中用矩阵乘法的形式完成
论文中还增加一种称为 multi-headed 注意力机制,可以提升注意力层的性能
它使得模型可以关注不同位置
虽然在上面的例子中,z1 包含了一点其他位置的编码,但当前位置的单词还是占主要作用, 当我们想知道“The animal didn’t cross the street because it was too tired” 中 it 的含义时,这时就需要关注到其他位置
这个机制为注意层提供了多个“表示子空间”。下面我们将具体介绍,
1. 经过 multi-headed , 我们会得到和 heads 数目一样多的 Query / Key / Value 权重矩阵组 论文中用了8个,那么每个encoder/decoder我们都会得到 8 个集合。 这些集合都是随机初始化的,经过训练之后,每个集合会将input embeddings 投影到不同的表示子空间中。
2. 简单来说,就是定义 8 组权重矩阵,每个单词会做 8 次上面的 self-attention 的计算 这样每个单词会得到 8 个不同的加权求和 z
3. 但在 feed-forward 处只能接收一个矩阵,所以需要将这八个压缩成一个矩阵 方法就是先将8个z矩阵连接起来,然后乘一个额外的权重矩阵WO
下图显示了在例句中,it 的不同的注意力 heads 所关注的位置,一个注意力的焦点主要集中在“animal”上,而另一个注意力集中在“tired”,换句话说,it 是 “animal”和“tired”的一种表现形式。 当然如果选了8个层,将所有注意力 heads 都添加到图片中,就有点难以解释了。
这里有一个细节,
即在每个 encoders 和 decoders 里面的 self-attention, ffnn,encoders-decoders attention 层,都有 residual 连接,还有一步 layer-normalization
下面我们看一下 Decoder 部分
1. 输入序列经过编码器部分,然后将最上面的 encoder 的输出变换成一组 attention 向量 K和V 这些向量会用于每个 decoder 的 encoder-decoder attention 层,有助于解码器聚焦在输入序列中的合适位置
重复上面的过程,直到 decoder 完成了输出,每个时间步的输出都在下一个时间步时喂入给最底部的 decoder,同样,在这些 decoder 的输入中也加入了位置编码,来表示每个字的位置。
2. 解码器中的 self attention 层与编码器中的略有不同 在解码器中,在 self attention 的 softmax 步骤之前,将未来的位置设置为 -inf 来屏蔽这些位置,这样做是为了 self attention 层只能关注输出序列中靠前的一些位置。
Encoder-Decoder Attention 层的工作方式与 multiheaded self-attention 类似,只是它用下面的层创建其 Queries 矩阵,从编码器栈的输出中获取 Keys 和 Values 矩阵。
3. 解码器最后输出的是一个向量,如何把它变成一个单词,这就要靠它后面的线性层和 softmax 层 线性层就是一个很简单的全连接神经网络,将解码器输出的向量映射成一个更长的向量。 例如我们有 10,000 个无重复的单词,那么最后输出的向量就有一万维。 每个位置上的值代表了相应单词的分数。
softmax 层将这个分数转换为了概率。
我们选择概率最大的所对应的单词,就是当前时间步的输出。
学习资源: https://arxiv.org/pdf/1706.03762.pdf https://jalammar.github.io/illustrated-transformer/ https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html
Transformer解读(附pytorch代码)
Transformer早在2017年就出现了,直到BERT问世,Transformer开始在NLP大放光彩,目前比较好的推进就是Transformer-XL(后期附上)。这里主要针对论文和程序进行解读,如有不详实之处,欢迎指出交流,如需了解更多细节之处,推荐知乎上 川陀学者 写的。本文程序的git地址在 这里 。程序如果有不详实之处,欢迎指出交流~
2017年6月,Google发布了一篇论文《Attention is All You Need》,在这篇论文中,提出了 Transformer 的模型,其旨在全部利用Attention方式来替代掉RNN的循环机制,从而通过实现并行化计算提速。在Transformer出现之前,RNN系列网络以及seq2seq+attention架构基本上铸就了所有NLP任务的铁桶江山。由于Attention模型本身就可以看到全局的信息, Transformer实现了完全不依赖于RNN结构仅利用Attention机制,在其并行性和对全局信息的有效处理上获得了比之前更好的效果。
纵观图1整个Transformer的结构,其核心模块其实就是三个:Multi-Head attention、Feed Forward 以及 Add&Norm。这里关于Multi-Head attention部分只讲程序的实现,关于更多细节原理,请移至开头推荐的知乎链接。
Transformer中的attention采用的是多头的self-attention结构,并且在编码器中,由于不同的输入mask的部分不一样,因此在softmax之前采用了mask操作,并且解码时由于不能看到t时刻之后的数据,同样在解码器的第一个Multi-Head attention中采用了mask操作,但是二者是不同的。因为编码器被mask的部分是需要在输入到Transformer之前事先确定好,而解码器第一个Multi-Head attention被mask的部分其实就是从t=1时刻开始一直到t=seq_len结束,对应于图2。在图2中,横坐标表示解码器一个batch上的输入序列长度(也就是t),紫色部分为被mask的部分,黄色部分为未被mask的部分,可以看出,随着t的增加,被mask的部分逐一减少。而解码器第二个Multi-Head attention的mask操作和编码器中是一样的。
mask+softmax程序如下:
mask操作其实就是对于无效的输入,用一个负无穷的值代替这个输入,这样在softmax的时候其值就是0。而在attention中(attention操作见下式),softmax的操作出来的结果其实就是attention weights,当attention weights为0时,表示不需要attention该位置的信息。 对于Multi-Head attention的实现,其实并没有像论文原文写的那样,逐一实现多个attention,再将最后的结果concat,并且通过一个输出权重输出。下面通过程序和公式讲解一下实际的实现过程,这里假设 , , 的来源是一样的,都是 ,其维度为[batch_size, seq_len, input_size]。(需要注意的是在解码器中第二个Multi-Head的输入中 与 的来源不一样)
首先,对于输入 ,通过三个权重变量得到 , , ,此时三者维度相同,都是[batch, seq_len, d_model],然后对其进行维度变换:[batch, seq_len, h, d_model//h]==>[batch, h, seq_len, d]==>[batch×h, seq_len, d],其中d=d_model//h,因此直接将变换后的 , , 直接做DotProductAttention就可以实现Multi-Head attention,最后只需要将DotProductAttention输出的维度依次变换回去,然后乘以输出权重就可以了。关于程序中的参数valid_length已在程序中做了详细的解读,这里不再赘述,注意的是输入的valid_length是针对batch这个维度的,而实际操作中由于X的batch维度发生了改变(由batch变成了batch×h),因此需要对valid_length进行复制。
FFN的实现是很容易的,其实就是对输入进行第一个线性变换,其输出加上ReLU激活函数,然后在进行第二个线性变换就可以了。
Add&norm的实现就是利用残差网络进行连接,最后将连接的结果接上LN,值得注意的是,程序在Y的输出中加入了dropout正则化。同样的正则化技术还出现在masked softmax之后和positional encoding之后。
positional encoding的实现很简单,其实就是对输入序列给定一个唯一的位置,采用sin和cos的方式给了一个位置编码,其中sin处理的是偶数位置,cos处理的是奇数位置。但是,这一块的工作确实非常重要的,因为对于序列而言最主要的就是位置信息,显然BERT是没有去采用positional encoding(尽管在BERT的论文里有一个Position Embeddings的输入,但是显然描述的不是Transformer中要描述的位置信息),后续BERT在这一方面的改进工作体现在了XLNet中(其采用了Transformer-XL的结构),后续的中再介绍该部分的内容。
无论是编码器还是解码器,其实都是用上面说的三个基本模块堆叠而成,具体的实现细节大家可以看开头的git地址,这里需要强调的是以下几点:
中出现的程序都在开头的git中了,直接执行main.ipynb就可以运行程序,如有不详实之处,还请指出~~~
gtp是什么
GTP是指三磷酸鸟苷。它是一种重要的核苷酸,在生物化学的全名为9-β-D-呋喃核糖鸟嘌呤-5'-三磷酸,或者是9-β-D-呋喃核糖-2-氨基-6-氧-嘌呤-5'-三磷酸。在三羧酸循环中,它是琥珀酸辅酶A转变为琥珀酸过程中的能量载体,可以与ATP相互转换。此外,GTP也是细胞信号传导的重要物质,在信号传导过程中它会在GTPase作用下转化为GDP。它的外观为白色或类白色粉末,无臭,有引湿性。在水中易溶,在醇、氯仿中不溶。三磷酸鸟苷主要用于辅助治疗慢性肝炎、进行性肌萎缩、视力减退等疾病。
此外,GTP也是基于IP的高层协议,位于TCP/IP或UDP/IP等协议上,主要用于在GSM、UMTS和LTE网络中支持通用分组无线服务(GPRS)的通讯协议。
以下为关于“GTP是什么”做出回答:
GTP(Generative Pre-trained Transformer)是一种基于Transformer模型的生成式预训练模型。Transformer模型是一种用于自然语言处理任务的深度学习模型,它在机器翻译任务中取得了很大的成功。
GPT模型则是在Transformer模型的基础上进行了改进和扩展,用于生成文本和进行自然语言处理任务。
GPT模型的核心思想是通过大规模的无监督预训练来学习语言的统计规律和语义表示。在预训练阶段,GPT模型使用大量的文本数据进行训练,通过自动编码器的方式学习文本的表示。
具体来说,GPT模型使用自回归的方式,通过预测下一个词的概率来训练模型。这样,模型可以学习到词与词之间的关联和上下文信息。
在预训练完成后,GPT模型可以用于各种自然语言处理任务,如文本生成、机器翻译、问答系统等。在应用阶段,可以通过微调(fine-tuning)的方式,将GPT模型在特定任务上进行进一步训练,以适应具体的任务需求。
GPT模型的优势在于其强大的语言生成能力和对上下文的理解能力。由于预训练阶段使用了大量的文本数据,模型可以学习到丰富的语言知识和语义表示。这使得GPT模型在生成文本和进行自然语言处理任务时表现出色。
然而,GPT模型也存在一些挑战和限制。首先,由于模型的预训练是无监督的,因此在特定任务上的表现可能不如经过有监督训练的模型。
其次,GPT模型在处理长文本时可能存在信息丢失的问题,因为模型的输入和输出都是固定长度的序列。此外,GPT模型的训练需要大量的计算资源和时间,对于一些小规模的应用场景可能不太适用。
GPT模型是一种基于Transformer模型的生成式预训练模型,具有强大的语言生成能力和对上下文的理解能力。它在自然语言处理任务中具有广泛的应用前景,但也面临一些挑战和限制。随着深度学习技术的不断发展,GPT模型及其改进版本将在自然语言处理领域发挥越来越重要的作用。
Transformer模型解析记录
整个Transformer模型由Encoder和Decoder两部分组成。Encoder负责对输入数据的编码,而Decoder负责对编码后的数据进行解码。
Encoder由N个结构相同,参数不共享的模块组成,每个模块又由多头自注意力层和全连接层组成,其中多头自注意力层和全连接层都加上了残差连接和layer normalization。
Decoder与Encoder结构类似,相比于Encoder,Decoder部分多了一个 Multi-Head Attention ,第一个 Multi-Head Attention 采用Masked操作,第二个 Multi-Head Attention 的 K 和 V 使用Encoder的输出,而Q使用上一个Decoder block的输出。 Decoder的输出通过一个线性层和softmax输出下一个翻译单词的概率。
Encoder由N个结构相同,参数不共享的的Layer组成(论文中N=6),也即图1左侧的单元,最左边有个“Nx”。 每个Layer由 Multi-Head Attention 和 Feed-Forward 两个sub_layer组成。其中每个sub_layer都加了残差连接(Residual Connect)和归一化(Normalization)操作。则每个sub_layer的输出可表示为:
Muti-Head Attention从结构上来看就是通过h个不同的线性变换将输入 投影到h个不同的 组合,最后将h个不同的Attention结果拼接起来,最后经过一个Liner层得到Muti-Head Attention的输出。
其中, 、
Muti-Head Attention输出的维度是
关于Attention的详细介绍,可以参考之前文档:
Feed Forward也称Position-wise feed-forward networks,该层主要提供非线性变换。之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。
该层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应公式为:
问 :Attention输出之后的结果会和 相乘来进行维度变换,那这里为什么又要增加一个2层的FFN网络呢? 答 :FFN网络的加入给模型增加了非线性(Relu激活函数),增加了模型的表现能力。当然去掉FFN层也是可以的,只不过效果上会差些。
Decoder是图1的右半部分,与左半部分的Encoder类似,但又存在一些区别。
Decoder比Encoder多了一个Multi-Head Attention,第一个Multi-Head Attention采用Masked操作,因为在生成任务中,前面的词语是看不到后面词语的信息的,因此需要加入Masked来避免信息泄露。第二个Multi-Head Attention输入的 是根据Encoder的输出编码矩阵映射而来,而 是根据上一个Decoder的输出映射而来。
最后有一个 Softmax 层计算下一个翻译单词的概率。
模型在解码的过程中需要注意的是训练和预测不一样。 在训练时,解码是一次全部decode出来,用上一步的ground truth来预测(mask矩阵也会改动,让解码时看不到未来的token); 而预测时,因为没有ground truth了,需要一个个预测。
上面简单介绍了 Encoder 和 Decoder 模块,下面简单介绍一下Transformer的Position Embedding。
引入Position Embedding主要是为了弥补Transformer模型对位置信息的不足,将Position Embedding与token Embedding相加后,即可保留各个token的位置信息。
论文作者提出了两种添加位置信息的的方法: 一种方法是直接用不同频率的正余弦函数直接计算各个token的位置id,公式如下:
另一种方法是直接学习出一个Position Embedding。
通过实验发现,两种方法结果差不多,最后作者选择了第一种方法。
Transformer 与 RNN 不同,可以比较好地并行训练。
Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding,否则 Transformer 就是一个词袋模型了。
Transformer 的重点是 Self-Attention 结构,其中用到的 Q, K, V矩阵通过输出进行线性变换得到。
Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。
Transformer 模型详解 (推荐) 【NLP】Transformer模型原理详解 【经典精读】Transformer模型深度解读
Transformer原理及其应用
transformer 最早使用于NLP模型中,使用了 Self-Attention 机制。相较于RNN结构可以进行并行化训练,能够 拥有全局信息 。
scale dot-product attention
self-attention 过程图
query q 对 key k做attention:
softmax归一化:
权重乘value v 输出转化值:
合并之前的三个图中操作:
Transformer架构
Feed-Forward组件:
架构图:
Transformer:[2017] attention is all you need
Bert[2018]: Elmo, GPT
参数文件大小: BERT(BASE) (L=12, H=768, A=12, Total Parameters=110M)
BERT(LARGE) (L=24, H=1024,A=16, Total Parameters=340M)
IGPT: 借鉴bert思想,OpenAI尝试对测试数据随机mask 5 个token,最终ImageNet结果果然上升了一些(红色)。由于马赛克操作过于严重(整张图片都mask了),尽管事实证明还是有效果的,但从输入上看,降低了模型的拟合能力。
VIT:
尝试过三种预训练方法,首先mask掉50%的patch,然后:
第三种方式已经非常接近了,但是由于研究的重点不在于此便浅尝辄止了
DEIT: 在预训练阶段,最多会mask 40%的patch。 另外,作者们其实也试过复原pixel,但效果会有1.8%的下降。对于这个现象,BEiT给出的猜想是,就像多层CNN一样,编码器最终得到的应该是一个更全局、高维的表示,而复现pixel会让后几层太关注局部细节。
MAE: 轻量级架构的两大核心:
一些值得注意的细节,比如:
1.输入侧直接丢掉mask token,效果+0.7,效率x3.3
3.选取数据增强策略,效果+0.2
思考:导致视觉和语言的masked autoencoder 不一样的三大原因
规模大的简单算法是深度学习的核心。在NLP中,简单的自我监督学习方法能够从模型的规模中获益。在计算机视觉中,实用的预训练范例主要是监督式的。在这项研究中,自我监督学习已经取得了进展。我们在ImageNet和迁移学习中观察到自动编码器(一种类似于NLP技术的简单的自我监督方法)与NLP中的技术类似,提供了可扩展的好处。视觉中的自我监督学习现在可能会走上一条与NLP类似的轨迹。另一方面,我们注意到,图像和语言是不同性质的信号,这种差异必须仔细处理。图像仅仅是记录的光,没有语义分解为视觉类似物的语义分解。我们不是试图去除物体,而是去除很可能不构成语义段的随机斑块。同样地,我们的MAE重建了像素,而这些像素并不是语义实体。从测试的结果上看,MAE能推断出了复杂的、整体的重建,这表明它已经学会了许多视觉概念(语义)。我们假设,这种行为的发生通过MAE内部丰富的隐藏表征。我们希望这个观点能给未来的工作带来启发。更广泛的影响。建议的方法预测内容基于训练数据集的学习统计,因此将反映这些数据中的偏差,包括具有负面社会影响的偏差。该模型可能产生不存在的内容。这些问题值得在这项工作的基础上进一步研究和考虑,以生成图像。
有可能取代所有组件。
每个领域都可尝试,遍地开花。