首页 > 其他分享 >Transformer详解

Transformer详解

时间:2024-09-17 16:22:33浏览次数:10  
标签:Transformer Attention Self 位置 矩阵 编码器 详解 向量

1 Transformer结构

https://jalammar.github.io/illustrated-transformer/

Transformer一个巨大的优点是:模型在处理序列输入时,可以对整个序列输入进行并行计算,不需要按照时间步循环递归处理输入序列。

Transformer详解_Transformer

1.1 Transformer宏观结构

Transformer可以看作是seq2seq模型的一种,对比之前的RNN,只是将Encoder和Decoder的RNN模型替换为Transformer模型。

Transformer详解_Transformer_02

编码部分(encoders)由多层编码器(Encoder)组成。每层编码器网络结构是一样的,每层解码器网络结构也是一样的。不同层编码器和解码器网络结构不共享参数。

Transformer详解_Transformer_03

单层encoder主要由以下两部分组成:

  • Self-Attention Layer
  • Feed Forward Neural Network(前馈神经网络,缩写为 FFNN) 编码器的输入文本序列Transformer详解_Transformer_04最开始需要经过embedding转换,得到每个单词的向量表示Transformer详解_Transformer_05,其中Transformer详解_Transformer_06是维度为Transformer详解_Transformer_07的向量,然后所有向量经过一个Self-Attention神经网络层进行变换和信息交互得到Transformer详解_Transformer_08,其中Transformer详解_Transformer_09是维度为Transformer详解_Transformer_07的向量。self-attention层处理一个词向量的时候,不仅会使用这个词本身的信息,也会使用句子中其他词的信息(可以类比为:当我们翻译一个词的时候,不仅会只关注当前的词,也会关注这个词的上下文的其他词的信息)。Self-Attention层的输出会经过前馈神经网络得到新的Transformer详解_Transformer_11,依旧是Transformer详解_Transformer_12个维度为Transformer详解_Transformer_07的向量。这些向量将被送入下一层encoder,继续相同的操作。 单层encoder结构:

Transformer详解_Transformer_14

  • 与编码器对应,解码器在编码器的self-attention和FFNN中间插入了一个Encoder-Decoder Attention层,这个层帮助解码器聚焦于输入序列最相关的部分。

Transformer详解_Transformer_15

2 Transformer结构细节

2.1 输入处理-Embedding词嵌入

Embedding Algorithm:将输入文本序列的每个词转化为一个词向量。

假设输入文本是序列包含了3个词,那么每个词可以通过词嵌入算法得到一个4维向量,于是整个输入被转化成为一个向量序列。

在实际应用中,通常会同时给模型输入多个句子,如果每个句子的长度不一样,我们会选择一个合适的长度,作为输入文本序列的最大长度:如果一个句子达不到这个长度,那么就填充先填充一个特殊的“padding”词;如果句子超出这个长度,则做截断。最大序列长度是一个超参数,通常希望越大越好,但是更长的序列往往会占用更大的训练显存/内存,因此需要在模型训练时候视情况进行决定。 输入序列每个单词被转换成词向量表示还将加上位置向量来得到该词的最终向量表示。

2.2 输入处理-位置编码(Positional Encoding)

Transformer模型对每个输入的词向量都加上了一个位置向量。这些向量有助于确定每个单词的位置特征,或者句子中不同单词之间的距离特征

词向量加上位置向量背后的直觉是:将这些表示位置的向量添加到词向量中,得到的新向量,可以为模型提供更多有意义的信息,比如词的位置,词之间的距离等。

Transformer详解_Transformer_16

位置编码的设计模式:

Transformer详解_Transformer_17

上面表达式中的Transformer详解_Transformer_18代表词的位置,Transformer详解_Transformer_19代表位置向量的维度,Transformer详解_Transformer_20代表位置Transformer详解_Transformer_19维位置向量第Transformer详解_Transformer_22维。于是根据上述公式,我们可以得到第Transformer详解_Transformer_18位置的Transformer详解_Transformer_19维位置向量。在下图中,我们画出了一种位置向量在第4、5、6、7维度、不同位置的的数值大小。横坐标表示位置下标,纵坐标表示数值大小。 这种方法的优点是:可以扩展到未知的序列长度。

例如:当我们的模型需要翻译一个句子,而这个句子的长度大于训练集中所有句子的长度,这时,这种位置编码的方法也可以生成一样长的位置编码向量

2.3 Encoder编码器

编码部分的输入文本序列经过输入处理之后得到了一个向量序列,这个向量序列将被送入第1层编码器,第1层编码器输出的同样是一个向量序列,再接着送入下一层编码器:第1层编码器的输入是融合位置向量的词向量,更上层编码器的输入则是上一层编码器的输出。 融合位置信息的词向量进入self-attention层,self-attention的输出每个位置的向量再输入FFN神经网络得到每个位置的新向量。

Transformer详解_Transformer_25

2.4 Self-Attention机制

假设我们想要翻译的句子是:

The animal didn't cross the street because it was too tired

这个句子中的 it 是一个指代词,那么 it 指的是什么呢?它是指 animal 还是_street_?这个问题对人来说,是很简单的,但是对模型来说并不是那么容易。但是,如果模型引入了_Self Attention_机制之后,便能够让模型把it和animal关联起来了。同样的,当模型处理句子中其他词时,Self Attention机制也可以使得模型不仅仅关注当前位置的词,还会关注句子中其他位置的相关的词,进而可以更好地理解当前位置的词。 RNN 在处理序列中的一个词时,会考虑句子前面的词传过来的hidden state,而hidden state就包含了前面的词的信息;而Self Attention机制值得是,当前词会直接关注到自己句子中前后相关的所有词语。

什么是Self-attention机制?

假设一句话包含两个单词:Thinking Machines。自注意力的一种理解是:Thinking-Thinking,Thinking-Machines,Machines-Thinking,Machines-Machines,共Transformer详解_Transformer_26种两两attention。那么具体如何计算呢?假设Thinking、Machines这两个单词经过词向量算法得到向量是Transformer详解_Transformer_27

Transformer详解_Transformer_28

Transformer详解_Transformer_29

计算Self-Attention机制的步骤:

  1. 对输入编码器的词向量进行线性变换得到:Query向量: q1,q2,Key向量: k1,k2,Value向量: v1,v2。这3个向量是词向量分别和3个参数矩阵相乘得到的,而这个矩阵也是是模型要学习的参数。

Transformer详解_Transformer_30

对QKV矩阵的理解:query和key计算相关或者叫attention得分,然后根据attention得分对value进行加权求和。

  1. 计算Attention Score(注意力分数)。假设我们现在计算第一个词Thinking 的Attention Score(注意力分数),需要根据Thinking对应的词向量,对句子中的其他词向量都计算一个分数。这些分数决定了在编码Thinking这个词时,需要对句子中其他位置的词向量的权重。 Attention score是根据"Thinking" 对应的 Query 向量和其他位置的每个词的 Key 向量进行点积得到的。Thinking的第一个Attention Score就是Transformer详解_Transformer_31Transformer详解_Transformer_32的内积,第二个分数就是Transformer详解_Transformer_31Transformer详解_Transformer_34的点积。

Transformer详解_Transformer_35

  1. 把每个分数除以Transformer详解_Transformer_36Transformer详解_Transformer_37是Key向量的维度。也可以除以其他数,除以一个数是为了在反向传播时,求梯度时更加稳定。
  2. 接着把这些分数经过一个Softmax函数,Softmax可以将分数归一化,这样使得分数都是正数并且加起来等于1, 如下图所示。 这些分数决定了Thinking词向量,对其他所有位置的词向量分别有多少的注意力。

Transformer详解_Transformer_38

  1. 得到每个词向量的分数后,将分数分别与对应的Value向量相乘。这种做法背后的直觉理解就是:对于分数高的位置,相乘后的值就越大,我们把更多的注意力放到了它们身上;对于分数低的位置,相乘后的值就越小,这些位置的词可能是相关性不大的。
  2. 把第5步得到的Value向量相加,就得到了Self Attention在当前位置(这里的例子是第1个位置)对应的输出。

Transformer详解_Transformer_39

2.5 Self-Attention矩阵计算

将self-attention计算6个步骤中的向量放一起,比如Transformer详解_Transformer_40,便可以进行矩阵计算啦。下面,依旧按步骤展示self-attention的矩阵计算方法。

Transformer详解_Transformer_41

第1步:计算 Query,Key,Value 的矩阵。首先,我们把所有词向量放到一个矩阵X中,然后分别和3个权重矩阵Transformer详解_Transformer_42 相乘,得到 Q,K,V 矩阵。矩阵X中的每一行,表示句子中的每一个词的词向量。Q,K,V 矩阵中的每一行表示 Query向量,Key向量,Value 向量,向量维度是Transformer详解_Transformer_43

Transformer详解_Transformer_44

2.6 Multi-Self Attention机制

Multi-Self Attention机制的优点:

  • 扩展了模型关注不同位置的能力: 第一个位置的输出Transformer详解_Transformer_45包含了句子中其他每个位置的很小一部分信息,但Transformer详解_Transformer_45仅仅是单个向量,所以可能仅由第1个位置的信息主导了。

而当我们翻译句子:The animal didn’t cross the street because it was too tired时,我们不仅希望模型关注到"it"本身,还希望模型关注到"The"和“animal”,甚至关注到"tired"。这时,多头注意力机制会有帮助。

  • 多头注意力机制赋予attention层多个“子表示空间”: 多头注意力机制会有多组Transformer详解_Transformer_42 的权重矩阵,,因此可以将Transformer详解_Transformer_48变换到更多种子空间进行表示。每一组注意力的权重矩阵都是随机初始化的,但经过训练之后,每一组注意力的权重Transformer详解_Transformer_42 可以把输入的向量映射到一个对应的”子表示空间“。

Transformer详解_Transformer_50

  • 在多头注意力机制中,我们为每组注意力设定单独的 WQ, WK, WV 参数矩阵。将输入X和每组注意力的WQ, WK, WV 相乘,得到Q, K, V 矩阵。 把每组 K, Q, V 计算得到每组的 Z 矩阵,就得到8个Z矩阵。由于前馈神经网络层接收的是 1 个矩阵(其中每行的向量表示一个词),而不是 8 个矩阵,所以直接把8个子矩阵拼接起来得到一个大的矩阵,然后和另一个权重矩阵Transformer详解_Transformer_51相乘做一次变换,映射到前馈神经网络层所需要的维度

Transformer详解_Transformer_52

  • 总结一下就是:
  1. 把8个矩阵 {Z0,Z1...,Z7} 拼接起来
  2. 把拼接后的矩阵和WO权重矩阵相乘
  3. 得到最终的矩阵Z,这个矩阵包含了所有 attention heads(注意力头) 的信息。这个矩阵会输入到FFNN (Feed Forward Neural Network)层。

2.7 参差连接

编码器的每个子层(Self Attention 层和 FFNN)都有一个残差连接和层标准化(layer-normalization),如下图所示。

Transformer详解_Transformer_53

将 Self-Attention 层的层标准化(layer-normalization)和涉及的向量计算细节都进行可视化:

Transformer详解_Transformer_54

3 解码器-Decoder

Transformer详解_Transformer_55

解码(decoding )阶段的每一个时间步都输出一个翻译后的单词(这里的例子是英语翻译),解码器当前时间步的输出又重新作为输入Q和编码器的输出K、V共同作为下一个时间步解码器的输入。然后重复这个过程,直到输出一个结束符。如下图所示:

Transformer详解_Transformer_56

解码器中的 Self Attention 层,和编码器中的 Self Attention 层的区别:

  1. 在解码器里,Self Attention 层只允许关注到输出序列中早于当前位置之前的单词。具体做法是:在 Self Attention 分数经过 Softmax 层之前,屏蔽当前位置之后的那些位置(将attention score设置成-inf)。
  2. 解码器 Attention层是使用前一层的输出来构造Query 矩阵,而Key矩阵和 Value矩阵来自于编码器最终的输出。

4 参考资料

https://github.com/datawhalechina/learn-nlp-with-transformers


标签:Transformer,Attention,Self,位置,矩阵,编码器,详解,向量
From: https://blog.51cto.com/Laccoliths/12037558

相关文章

  • C++内存管理详解:各类变量的存储区域
      在C++中,变量的存储位置取决于它们的类型和生命周期。那么不同的各个变量究竟存储在哪个区域呢?1.不同类型的变量我们首先从变量类型的不同来说明:1.全局变量和静态变量 -存储区:全局/静态区(静态区)-说明:全局变量(包括文件级和函数级的)和使用`static`关键字声明的变......
  • 二分详解——学习笔记
    首先,使用二分有几个前提:具有单调性要求“最小的最大”或“最大的最小”其次,还要分清楚二分查找与二分答案的区别:二分查找:在某区间使用二分的思想进行查找二分答案:在答案的区间中使用二分的思想并判断从而找到最优解同时还要处理好二分的边界。接下来来理解一下......
  • [独家原创]基于(鳑鲏鱼)BFO-Transformer-GRU多特征分类预测【24年新算法】 (多输入单输
    [独家原创]基于(鳑鲏鱼)BFO-Transformer-GRU多特征分类预测【24年新算法】(单输入单输出)你先用你就是创新!!!(鳑鲏鱼)BFO优化的超参数为:隐藏层节点数、正则化系数、初始化学习率1.程序已经调试好,无需更改代码替换数据集即可运行!!!数据格式为excel!2.Transformer作为一种创新的神......
  • 【独家原创】基于TTAO-Transformer-BiLSTM多变量时序预测【24年新算法】 (多输入单输出
    【独家原创】基于TTAO-Transformer-BiLSTM多变量时序预测【24年新算法】(多输入单输出)程序已经调试好,无需更改代码替换数据集即可运行!!!数据格式为excel!【独家原创】TTAO-Transformer-BiLSTM多变量时序预测Matlab代码基于三角拓扑聚合算法优化Transformer结合双向长短期记忆......
  • 跟着问题学10——RNN详解及代码实战
    1循环神经网络RecurrentNeuralNetwork什么是序列信息呢?通俗理解就是一段连续的信息,前后信息之间是有关系地,必须将不同时刻的信息放在一起理解。比如一句话,虽然可以拆分成多个词语,但是需要将这些词语连起来理解才能得到一句话的意思。RNN就是用来处理这些序列信息的任务......
  • 【MySQL】MySQL中JDBC编程——MySQL驱动包安装——(超详解)
    前言:......
  • 指针详解(中秋版)
       久违的键盘声,熟悉的思绪,仿佛时间在这一刻凝固。距离我上一次敲击键盘写下文字,已不知过了多少个日夜。但文字的魅力就在于,它总能跨越时间的长河,将我们的心灵再次相连。今天,我带着满心的感慨与新的故事,重新坐到了屏幕前。让我们一起,再次启程,探索文字的奥秘。(一)理解......
  • MyBatis 详解
    目录目录一、MyBatis是什么二、为什么使用MyBatis(一)灵活性高(二)性能优化(三)易于维护三、怎么用MyBatis(一)添加依赖(二)配置MyBatis(三)创建实体类和接口(四)使用MyBatis一、MyBatis是什么MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。......
  • Go 语言中的空白标识符(_)用法详解
    在Go语言中,空白标识符 _ 有着独特的用途,特别是在循环以及其他一些场景中。本文将详细介绍空白标识符在Go语言中的用法,重点围绕其在循环中的应用以及其他常见场景。 一、空白标识符在循环中的应用 (一)忽略索引值 在遍历切片或数组时,如果我们只关心元素本身而不关......
  • DFT理论知识 scan insertion详解
    ###DFT理论知识:SCANInsertion详解####一、SCANInsertion概述**1.定义**SCANInsertion是设计可测试性(DesignForTestability,DFT)中的一种技术,通过在芯片设计中插入扫描链(ScanChain),使得原本难以测试的组合逻辑电路变得可测试。扫描链通过将触发器(Flip-Flop)转换为......