当前位置: 首页 > news >正文

跟李沐学AI:Transformer

Transformer架构

基于编码器-解码器架构来处理序列对

与使用注意力的seq2seq不同,Transformer纯基于注意力

多头注意力(Multi-Head Attention)

对于同一QKV,我们希望抽取不同的信息。多头注意力机制相比于标准的注意力机制,允许模型捕捉一个序列的不同方面并对不同方面生成不同权重。

假设输入序列为: I love palying football.

假设embedding_size=3并且使用2个注意力头,序列可表示为一个(4, 3)的矩阵(sequence_length, embed_size)。

[ I ]         [ love ]       [ playing ]    [ football ]
[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [1.0, 1.1, 1.2]]  # Shape: (4, 3)

首先我们需要把embedding投影为Q,K,V。

权重矩阵的形状由输入特征数和头数共同决定,不同头的权重矩阵的形状是相同的。

W_Q^{i} \epsilon R^{d_{feature}\times d_{head}}

W_K^{i} \epsilon R^{d_{feature}\times d_{head}}

W_V^{i} \epsilon R^{d_{feature}\times d_{head}}

d_{feature}是输入的embedding_size,在本例中为3。

d_{head}=d_{feature}/h。其中h是注意力头的数量。

故本例中权重矩阵的形状为(3, 1),其中1为向下取整得到。

对于头1:

  • Q1 = Wq1 * Embedding
  • K1 = Wk1 * Embedding
  • V1 = Wv1 * Embedding

假设头1的权重为:

W_Q^{head1} =[[0.1],[0.2],[0.3]]

W_K^{head1} =[[0.4],[0.5],[0.6]]

W_V^{head1} =[[0.7],[0.8],[0.9]]

那么我们可以列出输入embedding变换至Q的计算过程

Q_I^{\text{head1}} = [0.1, 0.2, 0.3] * [[0.1], [0.2], [0.3]] = [0.14]

Q_{love}^{\text{head1}} = [0.32]

Q_{playing}^{\text{head1}} = [0.5]

Q_{football}^{\text{head1}} = [0.68]

矩阵表示为:

Q^{\text{head1}} = [[0.14], [0.32], [0.5], [0.68]]

同理可得:

K^{\text{head1}} = [[0.32], [0.77], [1.22], [1.67]]

V^{\text{head1}} = [[0.38], [0.92], [1.46], [2.0]]

对于头2,我们需要不同的权重,计算过程相同

随后对于每个头,对Q,K进行点积并进行softmax计算注意力权重,将权重与V相乘计算加权和。本例中,QK点积的结果为一个(4, 4)的矩阵。将注意力权重与V相乘得到(4, 1)的注意力输出。

计算了每个头的注意力后,对输出进行拼接(concatenate)操作。再将拼接后的结果输入另一个线性层以得到最后的输出。本例中两个注意力头拼接后得到(4, 2)的输出。随后使用一个线性层将结果转换为需要的维度(4, 3)。

过程总结:

  • 输入维度: (4, 3) (4 词元, 嵌入维度为 3).
  • 每个头的Q、K、V: (4, 1) (4 tokens, 1 dimension per head).
  • 每个头的输出:(4, 1).
  • 每个头拼接后:(4, 2).
  • 线性映射后的输出:(4, 3).

基于位置的前馈网络FFN

将输入形状由(b, n, d)变为(bn, d)

输出形状由(bn, d)变回(b, n, d)

FFN等价于两层kernel_size为1的一维卷积层

将输入由(b, n, d)变为(bn, d)有如下原因:

  • 全连接层要求输入为2维,一维为batch_size,二维表示特征。
  • 将(b, n, d)变为(bn, d)而不是(b, nd)是为了保留每个元素在序列中的位置信息(位置编码提供的位置信息)。
  • 可以有效地将所有批次序列中的每个位置视为具有d特征的单个样本。这允许密集层对序列中的每个位置应用相同的权重集合。
  • 同时保障了并行计算,(bn, d)可以并行处理多个序列,可以同时对整个序列进行操作,而不是按顺序处理每个元素,这大大加快了计算速度并减少了整体训练时间。

层归一化

什么是层归一化?

对每个样本的所有feature做归一化。意思是对每个样本独立地计算均值和方差。

假设输入x=[[1, 2], [3, 4], [5, 6]]为(3, 2)的矩阵,样本归一化对每行计算均值和方差:

对第一个样本:均值为(1+2)/2=1.5,方差为(1-1.5)^2+(2-1.5)^2=0.25

对每行计算并归一化后得到输出\hat{x}=[[-1, 1], [-1, 1], [-1, 1]]

对比BatchNorm

Batch normalization对输入的所有batch的每个feature批量计算均值和方差并进行归一化。对每个feature独立地计算均值和方差。

同样假设x=[[1, 2], [3, 4], [5, 6]],对于第一个特征计算均值和方差:

mean=(1+3+5)/3=3variance=(1-3)^2+(3-3)^3+(5-3)^2=4

对每列计算并归一化后的到输出:\hat{x}=[[-1, -1], [0, 0], [1, 1]]

为什么是有layer norm而不是batch norm?

Transform的输入一般为一个序列,但是每个序列的有效长度(valid length)有所不同,会导致batch norm不稳定,故不适合batch norm。

对每个样本的元素做归一化,在长度变化时更加稳定。

信息传递

编码器中的输出y_1,\dots,y_n作为解码器中第i个Transformer块中多头注意力的K和V,解码器的Q来自目标序列。

说明编码器和解码器中的Block个数和输出维度是相同的。

预测

预测时,解码器的掩码注意力和多头注意力的Q、K和V的来源分别如下:

  • Masked Attention:

    • Q: 解码器在时间步 t 的状态(之前生成的tokens的表示)。
    • K: 解码器在时间步 t 的状态(之前生成的tokens的表示)。
    • V: 解码器在时间步 t 的状态(之前生成的tokens的表示)。
  • Multi-Head Attention(交叉注意力):
    • Q: 解码器在时间步 ttt 的状态。
    • K: 编码器的最终输出(输入序列的上下文表示)。
    • V: 编码器的最终输出(输入序列的上下文表示)。

在训练时,解码器的Masked Attention和Multi-Head Attention的Q、K和V分别由以下组成:

  • Masked Attention:

    • Q: 解码器当前时间步的输入向量(包括所有已生成的tokens的表示)。
    • K: 解码器当前时间步的输入向量(包括所有已生成的tokens的表示)。
    • V: 解码器当前时间步的输入向量(包括所有已生成的tokens的表示)。
  • Multi-Head Attention(交叉注意力):

    • Q: 解码器当前时间步的输入向量(表示已生成的tokens)。
    • K: 编码器的最终输出(输入序列的上下文表示)。
    • V: 编码器的最终输出(输入序列的上下文表示)。

http://www.mrgr.cn/news/48693.html

相关文章:

  • 守护线程详解!
  • 线程池 jvm web
  • zookeeper kafka集群配置
  • head和tail命令解析
  • JavaSE——认识异常
  • LDR6500一拖三快充线方案
  • 【秋招笔试】10.12小米(已改编)秋招-三语言题解
  • 波恩BONN功率放大器维修BSA1001-150/125D
  • Android深入理解包管理---apk信息
  • FileUtil工具类
  • AI产品经理到底怎样入门?入门必看!
  • java-实现一个简单的httpserver-0.5.0
  • 记录IDEA编译报错:不支持发行版本
  • 【Termux使用指南】
  • 机器学习pytorch实践1
  • 元学习案例(学习如何学习)
  • 基于 CSS Grid 的简易拖拉拽 Vue3 组件,从代码到NPM发布(2)- NPM发布、在线示例
  • ROS2 与 ROS1 的 CMakeLists.txt 文件区别
  • K8s-services+pod详解1
  • 剧场的客户端形式区别,APP,小程序,H5的不同优势以及推广方案