Transformer原理介绍 #8

Open
opened 2024-10-21 11:13:01 +08:00 by GANGUAGUA · 0 comments

Transformer介绍

Transformer 结构

Transformer是2017年谷歌大脑团队在一篇名为《Attention is All You Need》论文中提出的序列模型。

  • Seq2seq的模型结构,用以序列预测序列的任务,例如机器翻译。
  • 由编码器(Encoder)与解码器(Decoder)组成,每个编码器由1个位置编码层(Encoder)与N个编码层(Decoder)组成,每个解码器由1个位置编码层与N个解码层(Encoder Layer)以及1个以Softmax为激活函数的全连接层组成。
  • 第t个编码层的输入是t-1个编码层的输出,解码层同理。
  • 模型的输入:以机器翻译为例,例如是将中文翻译成英语的任务,训练时的数据应是中文、英语句子对。编码器输入的是中文,解码器输入的是英文。在做预测时,编码器输入的是要翻译的中文,解码器输入的是模型上一时刻的输出。
  • 模型的输出:编码器的输出将作为解码器中某个模块的输入,解码器的输出即整个模型的输出是Softmax归一化后序列类别分布,通常维度是【Batch Size,序列长度,类别数量】。

编码层 Encoding Layer

编码层

图中有三种模块,分别是:

  1. Multi-Head Attention,多头注意力。
  2. Add & Norm, 残差与Layer Normalization
  3. Feed Forward,前馈神经网络

Multi-Head Attention 多头注意力:多头注意力与缩放点乘注意力算法

  • 缩放点成注意力(Scaled Dot-Product Attention):

  • 其中dk指K向量的维度,Q代表Query向量,K代表Key向量,V代表Value向量。在“编码器”中,Q、K、V都是由输入的序列向量得到。设X为输入的序列向量,则:

  • 是模型需训练的三套不同的线性变化参数。
  • 以上的注意力层可称为单头注意力层,而多头注意力Multi-Head Attention是指用不同的的多计算几次单头注意力层的输出之后再全部拼接起来:

- 其中![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638289825-afdd009e-b54b-4134-af11-8e4ff0ae97e8.png)是模型需训练的线性变化矩阵,维度为【单头注意力层输出向量的长度 x head数量,多头注意力层输入向量的长度(也就是输入向量X的维度)】。它的作用就是将经过多头注意力操作的向量维度再调整至输入时候的维度。

Add & Norm: 残差与Layer Normalization

残差

  • 所谓残差就是在经神经网络多层传递后加上最初的向量。作用是当网络层级深时可以有效防止梯度消失

  • 图中的传播方式可描述为:^

  • 根据链式求导法则,反向传播时为:

_ ∂D_in / A_out = 1 + (∂ C / B ) ∙ (∂_ B / ∂ A_out )

  • 所以不管网络多深,梯度上都会有个1兜底,不会为0造成梯度消失。

Layer Normalization

  • Layer Normalization (LN) 和 Batch Normalization (BN) 类似,都是规范化数据的操作。公式写出来看起来也和BN一样,LN完整的公式如下:

  • ε是干扰因子,标准差和均值的计算公式和普通的没什么区别,其实重点是什么叫做第 l 个。只要把 BN 和 LN 的区别给理解了就能理解 l 的含义。
BN与LN的区别

从图片来看:

  • 假设Batch size为 3,每个样本有4个特征维度。
  • Batch Normalization的均值与标准差是从纵向看的,因此跟Batch size 是存在联系的。
  • Layer Normalization的均值与标准差是从横向看的,是算单个数据中自己这些特征维度的均值与标准差,因此跟Batch size没有关系。
  • 所以 l 只的是第几个数据

Feed Forward 前馈神经网络

  • Transformer 中所谓的前馈神经网络就是MLP的结构。唯一值得一提的是在这个MLP中,输入向量和输出向量是一样的,中间隐藏层的维度可随意调整。

位置编码 Positional Encoding

位置编码

  • 由于Transformer模型中的自注意力机制本身无法感知序列中词汇的位置信息,因此需要添加位置编码来提供这种信息。不管是编码器还是解码器都需要用到位置编码。
  • 位置编码通常是固定的,且随着位置的不同而变化,以确保模型能够理解词汇的顺序。这句话可能看起来有些矛盾,但实际上是在描述位置编码的两个特性:
    • 固定性:位置编码是固定的,意味着对于同一个位置,无论在哪个序列中,编码的值都是相同的。这是为了让模型能够学习到一个通用的位置编码模式,而不需要针对每个不同的序列重新学习。
    • 位置依赖性:尽管编码是固定的,但它的值会随着序列中词汇的位置不同而变化。换句话说,对于序列中的每个不同位置,都有一个独特的位置编码与之对应。这样做的目的是为了让模型能够区分序列中词汇的顺序,因为不同的词汇顺序可能会影响句子的意思。
      • 举个例子,假设我们有一个句子 "The cat sits on the mat",位置编码会为 "The"、"cat"、"sits"、"on"、"the"、"mat" 这些单词分别分配一个唯一的编码,即使 "the" 这个词出现了两次,它在不同位置的编码也是不同的。这样,模型就能够区分 "the" 这个词在句首和句中的位置,进而理解它在句子中的不同作用。
  • 在实际应用中,位置编码通常是通过一个预先定义好的函数生成的,比如可以使用正弦和余弦函数的不同频率来为每个位置生成一个唯一的编码向量。这些向量随后会被加到词嵌入(word embeddings)向量上,从而让模型在处理序列数据时能够考虑到词汇的位置信息。

进行位置编码

  • 在输入编码层之前,需要进行位置编码:

  • 代表这个模型中此时输入向量的维度。pos代表该输入得样本在序列中的位置,从0开始。2i和2i+1得看作两个整体,2i代表该向量中第2i偶数位,2i+1就是第2i+1奇数位。
  • 下图展示了pos与i的意义,图中的 x0, x1, x2…代表该向量中的元素。

位置编码的原理

  • 三角函数性质的公式:

  • 所以将代入上述公式有:
  • 所以 PE(M+N) 可由 PE(M) 与 PE(N) 计算得到,也就是说各个位置间可以相互计算得到,所以每个向量都包含了相对位置的信息。

解码器 Decoder

解码器

  • 解码器比编码器多了:
    • 遮盖的多头注意力层
    • 交互注意力层
  • 训练时解码器的输入是预测的序列

遮盖的多头注意力层

遮盖的多头注意力层

  • 遮盖的多头注意力层Masked Multi-Head Attention
  • 遮盖的意义是为了将未来信息过遮盖住,使得训练出来的模型更准确。
    • 例如输入“我爱中国”,当轮到要预测“中”时,模型获得的信息应该是“我爱新”这三个字。但是Transformer的Attention层做计算时,模型获得的信息将会是“我爱新国”这四个字。则“国”对于“中”来说显然属于未来信息。所以在训练时需要将未来信息都遮盖住。使模型在预测“中”时,获得的信息是“我爱新**”。预测“新”时,获得的信息是“我爱***”。

交互注意力层

交互注意力层

  • 解码器中的交互注意力层与编码器中的注意力层唯一区别在于,前者计算Query向量的输入是编码器的输出。解码器的注意力层实际上被称为自注意力层。
  • 自注意力层的Q,K,V计算方式如下:

  • 其中的X即输入的序列。
  • 交互注意力层中的Q计算方式如下:

  • 其中的即解码器的输出。
## Transformer介绍 ![Transformer 结构](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728637706494-47e99920-4828-4204-b7d7-bd8208116847.png) Transformer是2017年谷歌大脑团队在一篇名为《Attention is All You Need》论文中提出的序列模型。 + Seq2seq的模型结构,用以序列预测序列的任务,例如机器翻译。 + 由编码器(Encoder)与解码器(Decoder)组成,每个编码器由1个位置编码层(Encoder)与N个编码层(Decoder)组成,每个解码器由1个位置编码层与N个解码层(Encoder Layer)以及1个以Softmax为激活函数的全连接层组成。 + 第t个编码层的输入是t-1个编码层的输出,解码层同理。 + 模型的输入:以机器翻译为例,例如是将中文翻译成英语的任务,训练时的数据应是中文、英语句子对。编码器输入的是中文,解码器输入的是英文。在做预测时,编码器输入的是要翻译的中文,解码器输入的是模型上一时刻的输出。 + 模型的输出:编码器的输出将作为解码器中某个模块的输入,解码器的输出即整个模型的输出是Softmax归一化后序列类别分布,通常维度是【Batch Size,序列长度,类别数量】。 ## 编码层 Encoding Layer ![编码层](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728637776885-c3b8dca2-e14c-4034-a874-f299b595606f.png) 图中有三种模块,分别是: 1. Multi-Head Attention,多头注意力。 2. Add & Norm, 残差与Layer Normalization 3. Feed Forward,前馈神经网络 ### **Multi-Head Attention 多头注意力:多头注意力与缩放点乘注意力算法** + 缩放点成注意力(Scaled Dot-Product Attention): ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728637886319-b5090fb9-1208-4a0b-9e4a-3bad7240a8de.png) + 其中dk指K向量的维度,Q代表Query向量,K代表Key向量,V代表Value向量。在“编码器”中,Q、K、V都是由输入的序列向量得到。设X为输入的序列向量,则: ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728637886299-4fa7fd45-5546-431d-ad6c-f6292abe7c28.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728637886442-153d13d6-0628-45f3-b9ae-e21d193676c7.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728637886446-4843a26a-cd5d-4f3a-9754-be487234aa45.png) + 是模型需训练的三套不同的线性变化参数。 - ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728637886447-54f7eb05-b7cc-4d25-9f37-58ef4d2753b2.png) + 以上的注意力层可称为单头注意力层,而多头注意力Multi-Head Attention是指用不同的![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638148946-710fcdf6-ee2e-4e51-86ae-3495d1cec6e4.png)的多计算几次单头注意力层的输出之后再全部拼接起来: ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728637886892-9e990e9f-c238-485e-b53e-856af71da693.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728637886920-198e07f6-4bdf-41c1-a394-366527cc00b8.png) - 其中![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638289825-afdd009e-b54b-4134-af11-8e4ff0ae97e8.png)是模型需训练的线性变化矩阵,维度为【单头注意力层输出向量的长度 x head数量,多头注意力层输入向量的长度(也就是输入向量X的维度)】。它的作用就是将经过多头注意力操作的向量维度再调整至输入时候的维度。 ### **Add & Norm: 残差与Layer Normalization** #### **残差** + 所谓残差就是在经神经网络多层传递后加上最初的向量。作用是当网络层级深时可以有效防止梯度消失 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638457323-70655abc-4a4e-42bf-a2a7-3fc287d2b66a.png) + 图中的传播方式可描述为:^ ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638457326-e1a54ae6-d5bf-40d6-8493-a4f297dec168.png) + 根据链式求导法则,反向传播时为: _ ∂_D_in / _∂_ A_out = 1 + (∂ C / _∂_ B ) ∙ (_∂_ B / ∂ A_out ) + 所以不管网络多深,梯度上都会有个1兜底,不会为0造成梯度消失。 #### **Layer Normalization** + Layer Normalization (LN) 和 Batch Normalization (BN) 类似,都是规范化数据的操作。公式写出来看起来也和BN一样,LN完整的公式如下: ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638520477-dcc251c7-feff-46a6-a621-d9def8f678d2.png) + ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638520503-c0a085ed-f44f-46e9-89a6-379fe332f1d1.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638520645-80c2726c-04d3-43b5-ad81-d791f1c20b67.png) + ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638520654-6b0732a8-b873-468e-aaf4-d1f84b25c868.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638520719-44fecd34-7123-4407-8331-3fe2da3ee63d.png) + ε是干扰因子,标准差和均值的计算公式和普通的没什么区别,其实重点是什么叫做第 l 个。只要把 BN 和 LN 的区别给理解了就能理解 l 的含义。 ##### BN与LN的区别 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638698940-1997a8ba-a3ee-4e65-bb6f-060017690d3f.png) 从图片来看: + 假设Batch size为 3,每个样本有4个特征维度。 + Batch Normalization的均值与标准差是从纵向看的,因此跟Batch size 是存在联系的。 + Layer Normalization的均值与标准差是从横向看的,是算单个数据中自己这些特征维度的均值与标准差,因此跟Batch size没有关系。 + 所以 l 只的是第几个数据 ### **Feed Forward 前馈神经网络** + Transformer 中所谓的前馈神经网络就是MLP的结构。唯一值得一提的是在这个MLP中,输入向量和输出向量是一样的,中间隐藏层的维度可随意调整。 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638796544-d8eab8e8-0de3-470a-908b-79078abb2da1.png) ## 位置编码 Positional Encoding ![位置编码](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638899144-08814e62-dc36-4b49-803a-2d922e6d2676.png) + <font style="color:#060607;background-color:#FFFFFF;">由于Transformer模型中的自注意力机制本身无法感知序列中词汇的位置信息,因此需要添加位置编码来提供这种信息。不管是编码器还是解码器都需要用到位置编码。</font> + 位置编码通常是固定的,且随着位置的不同而变化,以确保模型能够理解词汇的顺序。<font style="color:#060607;background-color:#FFFFFF;">这句话可能看起来有些矛盾,但实际上是在描述位置编码的两个特性:</font> - <font style="color:#060607;background-color:#FFFFFF;">固定性:位置编码是固定的,意味着对于同一个位置,无论在哪个序列中,编码的值都是相同的。这是为了让模型能够学习到一个通用的位置编码模式,而不需要针对每个不同的序列重新学习。</font> - <font style="color:#060607;background-color:#FFFFFF;">位置依赖性:尽管编码是固定的,但它的值会随着序列中词汇的位置不同而变化。换句话说,对于序列中的每个不同位置,都有一个独特的位置编码与之对应。这样做的目的是为了让模型能够区分序列中词汇的顺序,因为不同的词汇顺序可能会影响句子的意思。 </font> * <font style="color:#060607;background-color:#FFFFFF;">举个例子,假设我们有一个句子 "The cat sits on the mat",位置编码会为 "The"、"cat"、"sits"、"on"、"the"、"mat" 这些单词分别分配一个唯一的编码,即使 "the" 这个词出现了两次,它在不同位置的编码也是不同的。这样,模型就能够区分 "the" 这个词在句首和句中的位置,进而理解它在句子中的不同作用。</font> + 在实际应用中,位置编码通常是通过一个预先定义好的函数生成的,比如可以使用正弦和余弦函数的不同频率来为每个位置生成一个唯一的编码向量。这些向量随后会被加到词嵌入(word embeddings)向量上,从而让模型在处理序列数据时能够考虑到词汇的位置信息。 #### <font style="color:#060607;">进行位置编码</font> + 在输入编码层之前,需要进行位置编码: ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728638899070-7ea8d5b3-e5cb-42ec-a6dc-5157a700a4a0.png) + ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639218160-be85fdd2-1a20-4063-bb00-788d26251ccd.png)代表这个模型中此时输入向量的维度。pos代表该输入得样本在序列中的位置,从0开始。2i和2i+1得看作两个整体,2i代表该向量中第2i偶数位,2i+1就是第2i+1奇数位。 + 下图展示了pos与i的意义,图中的 x0, x1, x2…代表该向量中的元素。 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639200651-073358b0-35f4-47f1-89df-9b83ad911540.png) #### **位置编码的原理** + 三角函数性质的公式: ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639200551-47656fec-d0e6-452d-8b85-5be68c2527a0.png) + 所以将![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639442223-288fa718-e239-49fe-9b58-99a000f9dca1.png)代入上述公式有:![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639201221-3a1258eb-0118-4a9d-b786-7b20de08e445.png)![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639201486-25b2230d-4f09-4e62-96ff-3d8aab20b3d8.png) + 所以 PE(M+N) 可由 PE(M) 与 PE(N) 计算得到,也就是说各个位置间可以相互计算得到,所以每个向量都包含了相对位置的信息。 ## 解码器 Decoder ![解码器](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639599819-dcef44cf-e811-47d2-9d0f-cbad38b85c81.png) + 解码器比编码器多了: - 遮盖的多头注意力层 - 交互注意力层 + 训练时解码器的输入是预测的序列 ### 遮盖的多头注意力层 ![遮盖的多头注意力层](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639649164-1533c5bb-daae-46e5-8d70-e498dd0d1ecd.png) + 遮盖的多头注意力层Masked Multi-Head Attention + 遮盖的意义是为了将未来信息过遮盖住,使得训练出来的模型更准确。 - 例如输入“我爱中国”,当轮到要预测“中”时,模型获得的信息应该是“我爱新”这三个字。但是Transformer的Attention层做计算时,模型获得的信息将会是“我爱新国”这四个字。则“国”对于“中”来说显然属于未来信息。所以在训练时需要将未来信息都遮盖住。使模型在预测“中”时,获得的信息是“我爱新**”。预测“新”时,获得的信息是“我爱***”。 ### 交互注意力层 ![交互注意力层](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639733035-7c6c41d3-9446-47f8-98c2-7c1efdca94dc.png) + 解码器中的交互注意力层与编码器中的注意力层唯一区别在于,前者计算Query向量的输入是编码器的输出。解码器的注意力层实际上被称为自注意力层。 + 自注意力层的Q,K,V计算方式如下: ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639732493-35c86c80-a4c3-4de2-a60c-fa8a990db677.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639732856-43aa5c84-2261-4175-9cc9-3f676565f5e1.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639732884-19653a9c-43ae-411e-99dd-9d5b37dd8a1b.png) + 其中的X即输入的序列。 + 交互注意力层中的Q计算方式如下: ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639732874-45ba0c2d-5b43-4b3d-a0bc-1fdbf1ecc14c.png) + 其中的![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1728639937565-ba8a242f-bb5c-4daf-a30d-d26b6a046b3d.png)即解码器的输出。
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: HswOAuth/llm_kb#8
No description provided.