本文公式中变量加粗表示该变量为向量或矩阵

Softmax后每个值\(\in [0, 1)\)且总和为0

经过Softmax的归一化后:

  • 每个值是一\(\in [0, 1)\)的权重系数(可理解成一"权重矩阵").
  • 且总和为0.

初学Transformer都问Q, K, V怎么来的

修正前的公式与图真正 "符合代码实现"的 "图与公式" 分别对比, 发现原始论文的图, 绘制的不标准. 原论文: Attention is all you need: https://arxiv.org/pdf/1706.03762.pdf





最重要的上图, 绘制的有问题:

  • 右边MHA(multi-head attention)的输入的Q, K, V 和
  • 左边SDPA(Scaled Dot-Product Attention)的三个输入 Q, K, V,

    根本不是一个东西, 这个最容易引起误导。

"右边MHA的Q, K, V" 是经过 "三层线性层" 之后的结果。

而 "三个线性层" 之后得到的, 才是和 "左边SDPA的Q, K, V" 可以一一对应的。

右边MHA的输入( Q, K, V)可能是:

  • X, X, X (自注意力)
  • X, X, Y (交叉注意力)。

    以 Machine Translation Task 为例,
  • X来自source language sequence,
  • Y来自target language sequence。

    当然,如果是SA(Self-Attention自注意力),

    那么右边MHA(Multi-Head Attention)的三个输入都是同一矩阵: X, X, X。

    如果是MSA(Masked Self-Attention), 那么都是Y, Y, Y。见下图:



    区分,SA(X, X, X), 以及 MSA(Y, Y, Y),以及交叉注意力(X, X, Y)。

同理,论文的公式,也一样有问题:



上面的公式,让函数Attention 和 MultiHead 都用Q, K, V作为输入, 容易误导初学者。

把上面公式的 MultiHead函数 的输入, 替换成如下更易理解:

  • X, X, X( encoder的自注意力),
  • Y, Y, Y(decoder的SA自注意力),
  • X, X, Y(decoder里面的交叉注意力),

三个线性层,用W矩阵表示了,即\(\large \bf{W_{Q},\ W_{K},\ W _{V}}\):

Self Attention:由Dot-Product(向量点乘)说起

由Dot-Product(向量点乘)起讲 Transformer Self-Attention

Transformer[1]论文提出了一种Self-Attention自注意力机制), Self-Attention的最核心的公式为:

\(\large \begin{align*} \\
& Attention(Q,K,V)=Softmax( \frac{QK^⊤}{\sqrt{d_k}} )V \\
& where, Q : Query,\ K : key,\ V : Value \\
\\
\end{align*} \\
\)

单看这个公式,其实并不能很好地理解Attention到底在做什么,

本文从Transformer所使用的Self-Attention,介绍Attention背后的原理。

Self-Attention:从向量点乘说起

我们先从:\(\large Softmax(XX ^⊤)X\)这样一个公式开始。

\(\large Dot\ Product\)

1 \(\large Dot\ Product \ for Vectors\)

首先需要复习\(\large Dot\ Product\)(向量点乘)的概念。对于两个\(\large 行向量x和y\):

\(\large \begin{align*} \\
\bf{x} &=[& x_0 &, & x_1 & , & \cdots &, & x_n &] \\
\bf{y} &=[& y_0 &, & y_1 & , & \cdots &, & y_n &] \\
\bf{x \cdot y} &= & x_0 \cdot y_0 & + & x_1 \cdot y_1 & + & \cdots & + & x_n \cdot y_n &\ \\
\end{align*} \\
\)

向量点乘几何意义是:

向量 \(\large \bf{x}\) 在向量 \(\large \bf{y}\) 方向上的投影向量 与向量\(\large \bf{x}\) 的乘积.

向量点乘能够反映两个向量的相似度点乘结果越大,两个向量越相似

2 $\large Dot\ Product \ for Matrices $

一个矩阵 \(\large \bf{X}\) 由 \(\large {n}\) 行向量组成。

比如,我们可以将某一行向量 \(\large \bf{X_i}\) 理解成一个词的词向量,

共有 \(\large {n}\) 个行向量组成 \(\large {n \times n}\)的方形矩阵:



\(\large \begin{align*} \\
\bf{X} = \begin{bmatrix} X_0 \\
X_1 \\
\vdots \\
X_n \\
\end{bmatrix} \text{, then } \bf{X^T} = \begin{bmatrix} X_0^T, X_1^T, \cdots, X_n^T \end{bmatrix} \\
\end{align*} \\
\)

矩阵 \(\large \bf{X}\) 与矩阵的转置 \(\large \bf{X^T}\) 矩阵乘法:

\(\large \bf{X}\) 的\(第\)i\(行\)与 \(\large \bf{X^T}\) 的$ 第\(j\)列$相乘, 得到 \(目标矩阵\bf{Y}\) 的\(一个元素 Y_{ij}\),

$\large \bf{X} \bf{X^T} $ 可表示为:

\(\large \begin{align*} \\
\bf{Y} = \bf{X} \bf{X^T} = \begin{bmatrix} X_0 \cdot X_0,& X_0 \cdot X_1, & \cdots, & X_0 \cdot X_n \\
X_1 \cdot X_0, & X_1 \cdot X_1, & \cdots, & X_1 \cdot X_n \\
\vdots & \vdots & & \vdots \\
X_n \cdot X_0, & X_n \cdot X_1, & \cdots, & X_n \cdot X_n \\
\end{bmatrix} \\
\end{align*} \\
\)

$\large \bf{X} \bf{X^T} $ 的任一元素 \(\large \bf{ X_{ij} }\) , 是向量 \(\large \bf{X_i}\) 与 \(\large \bf{X_j}\) 做\(Dot Product\)(点乘):

\(第1行第1列元素\) , $\large x_0 \cdot x_0 $ , 就是 \(\large x_0\) 自身自身相似度

\(第1行第2列元素\) , $\large x_0 \cdot x_1 $ , 就是 \(\large x_0\) 与 \(\large x_1\) 的相似度。

\(\large Softmax(XX ^⊤)X\)三步曲

1 词向量矩阵 与自身的转置"矩乘"生成相似度矩阵

下面以词向量矩阵为例,这个矩阵的每行为一个词的词向量

矩阵自身的转置"矩乘",生成目标矩阵(就是一个词的词向量与各个词的词向量相似度

2 Softmax归一化相似度矩阵(词向量矩阵的)

如果再加上Softmax呢?我们先计算\(\large Softmax(XX ^⊤)\)。

Softmax的作用是对向量归一化(就是对相似度归一化), 得到一个归一化权重矩阵,

矩阵中,某个值(权重)越大,表示相似度越高

3 Softmax归一化的相似度矩阵原词向量矩阵矩乘 加权求和

在这个基础上,再进一步计算:\(\large Softmax(XX ^⊤)X\)

将得到的归一化权重矩阵, 与词向量矩阵做"矩乘"。

权重矩阵的:

  • 某一行 分别与 词向量的一列 矩乘
  • 词向量矩阵的一列 代表着任一不同词的某一维度

经过如此矩阵乘法,就是一个加权求和的过程:

  • 结果词向量, 是经过加权求和之后的新表示;
  • 权重矩阵, 是通过相似度归一化两步计算得到的。



通过与权重矩阵相乘,完成加权求和过程

4 上述过程用 PyTorch 实现

import torch
import torch.nn as nn x = torch.tensor([[1, 3, 2], [1, 1, 3], [1, 2, 1]], dtype=torch.float64) attention_scores = torch.matmul(x, x.transpose(-1, -2))
attention_scores = nn.functional.softmax(attention_scores, dim=-1) print(attention_scores)

Self-Attention的Q、K、V

注意力Attention机制的最核心的公式为:

\(\large \begin{align*} \\
& Attention(Q,K,V)=Softmax( \frac{QK^⊤}{\sqrt{d_k}} )V \\
& where, Q : Query,\ K : key,\ V : Value \\
\\
\end{align*} \\
\)

与我们刚才分析的 \(\large Softmax(XX ^⊤)\) 和 \(\large Softmax(XX ^⊤)X\) 有几分相似。

Transformer论文中将这个Attention公式描述为:"Scaled" Dot-Product Attention

V是从哪儿来的呢?

在Transformer的Encoder所使用的, , , 其实都是从"同一输入矩阵" 线性变换而来的。

我们可以简单理解成:\(\large \bf{ Q =X W_Q,\ K =X W_K,\ V =X W_V \ }\)

其中,\(\large \bf{W_Q,\ W_K,\ W _V}\)是三个可训练的参数矩阵

输入矩阵 \(\large \bf{X}\) 分别与 \(\large \bf{W_Q,\ W_K,\ W _V}\) 矩乘 生成 \(\large \bf{Q、K、V}\),近似于一次线性变换

Attention不直接使用\(\large \bf{X}\),而是使用经过矩阵乘法生成的这三个矩阵

是因为使用三个可训练的参数矩阵,可增强模型的拟合能力

Self-Attention可以解释一个句子内不同词的相互关系。

比如下面的句子,“eating”后面会有一种食物,

“eating”与“apple”的Attention Score更高,

而“green”只是修饰食物“apple”的修饰词,和“eating”关系不大。



句子内不同词之间的Attention示意图

下面这张图是Transformer论文中描述Attention计算过程的示意图。



在上图,\(\large \bf{Q}\)与\(\large \bf{K^T}\)经过MatMul,生成相似度矩阵

相似度矩阵每个元素除以\(\large \sqrt{d_k}\) ( 这个除法被称为Scale ),

\(\large d_k\) 是 \(\large \bf{K^T}\)的维度大小), 得到\(\large Attention\ Score\ Vector\)。

当 \(\large d_k\) 很大时,\(\large \bf{QK^T}\)的乘法结果方差变大,

Scale可以使结果相似度矩阵方差稳定,训练时梯度更新更稳定

MHA(Multi-Head Attention)多头注意力

1 MHA 原理

增强拟合性能, Transformer继续扩展Attention, 提出MHA(Multiple Head Attention, 多头注意力)。

刚才我们已经理解:

  • \(\large \bf{ Q =X W_Q,\ K =X W_K,\ V =X W_V \ }\)
  • \(\large \bf{W_Q,\ W_K,\ W _V}\)是三个可训练的参数矩阵
  • 输入矩阵\(\large X\)分别与 \(\large \bf{W_Q,\ W_K,\ W _V}\) 矩乘生成\(\large \bf{Q、K、V}\),近似于一次线性变换
  • Attention不直接使用\(\large \bf{X}\),而是使用经过矩阵乘法生成的这三个矩阵

    是因为使用三个可训练的参数矩阵,可增强模型的拟合能力

现在,对同一输入 \(\large \bf{X}\) , 我们定义多组不同的 \(\large \bf{W_{Q},\ W_{K},\ W _{V}}\) ,比如:

\(\large \bf{W_{Q0},\ W_{K0},\ W _{V0}}\) 与 \(\large \bf{W_{Q1},\ W_{K1},\ W _{V1}}\) ,

每组分别计算生成不同的\(\large \bf{Q,\ K,\ V}\), 最后学习到不同的参数。

2 多组\(\large \bf{W(Weight\ Parameter)}\) 得多组\(\large \bf{Q,\ K,\ V}\)

比如我们定义8组 \(\large \bf{W}\), 同一输入 \(\large \bf{X}\) , 将得到8个不同的输出: \(\large \bf{Z_0}\) 到 \(\large \bf{Z_0}\)

假如定义8组参数

在输出到下一层前,我们需要将8个输出拼接到一起,

乘以矩阵 \(\large \bf{W_O}\) , 将维度降低回我们想要的维度。



将多组输出拼接后乘以矩阵 \(\large \bf{W_O}\) 以降低维度

多头注意力的计算过程如下图所示。对于下图中的第2)步,

  • 当前为第一层时,直接对输入词\(\large \bf{WE}\)(Word Embedding), 生成词向量\(\large \bf{X}\);
  • 当前为后续层时,直接使用上一层输出



多头注意力计算过程

再去观察Transformer论文给出的多头注意力图示, 更容易理解:

SciTech-BigDataAIML-LLM-Transformer Series-Self-Attention:由Dot-Product(向量点乘)说起的更多相关文章

  1. 论文翻译——Attention Is All You Need

    Attention Is All You Need Abstract The dominant sequence transduction models are based on complex re ...

  2. NLP学习(5)----attention/ self-attention/ seq2seq/ transformer

    目录: 1. 前提 2. attention (1)为什么使用attention (2)attention的定义以及四种相似度计算方式 (3)attention类型(scaled dot-produc ...

  3. [阅读笔记]Attention Is All You Need - Transformer结构

    Transformer 本文介绍了Transformer结构, 是一种encoder-decoder, 用来处理序列问题, 常用在NLP相关问题中. 与传统的专门处理序列问题的encoder-deco ...

  4. Attention和Transformer详解

    目录 Transformer引入 Encoder 详解 输入部分 Embedding 位置嵌入 注意力机制 人类的注意力机制 Attention 计算 多头 Attention 计算 残差及其作用 B ...

  5. RealFormer: 残差式 Attention 层的Transformer 模型

    原创作者 | 疯狂的Max 01 背景及动机 Transformer是目前NLP预训练模型的基础模型框架,对Transformer模型结构的改进是当前NLP领域主流的研究方向. Transformer ...

  6. A Survey of Visual Attention Mechanisms in Deep Learning

    A Survey of Visual Attention Mechanisms in Deep Learning 2019-12-11 15:51:59 Source: Deep Learning o ...

  7. 用Python手把手教你搭一个Transformer!

    来源商业新知网,原标题:百闻不如一码!手把手教你用Python搭一个Transformer 与基于RNN的方法相比,Transformer 不需要循环,主要是由Attention 机制组成,因而可以充 ...

  8. 一文看懂Transformer内部原理(含PyTorch实现)

    Transformer注解及PyTorch实现 原文:http://nlp.seas.harvard.edu/2018/04/03/attention.html 作者:Alexander Rush 转 ...

  9. (zhuan) Attention in Neural Networks and How to Use It

    Adam Kosiorek About Attention in Neural Networks and How to Use It this blog comes from: http://akos ...

  10. Paper Reading - Attention Is All You Need ( NIPS 2017 ) ★

    Link of the Paper: https://arxiv.org/abs/1706.03762 Motivation: The inherently sequential nature of ...

随机推荐

  1. 在IIS发布.net9 api程序踩坑总结

    参照:.NET 9.0 WebApi 发布到 IIS 详细步骤_webapi发布到iis-CSDN博客 环境搭建: 注意安装与程序版本对应的Windows Server Hosting,安装完成之后, ...

  2. 记录一次SpringBoot + Vue前后分离项目的部署流程

    前言 本教程使用黑马 SpringBoot3+Vue3全套视频教程 大事件项目作为前后端代码. 前置需要: mysql jdk redis nginx linux环境 打包 前端 构建项目命令 npm ...

  3. SpringBoot——SSM简单整合v0.1

    学习SpringBoot初次整合SSM,后续需要不断优化 参考SpringBoot3教程[1] 导入依赖 pom.xml <?xml version="1.0" encodi ...

  4. SpringBoot内容协商(Content Negotiation)

    内容协商 在 HTTP 协议中,内容协商是一种机制,用于为同一 URI 提供资源不同的表示形式,以帮助用户代理指定最适合用户的表示形式(例如,哪种文档语言.哪种图片格式或者哪种内容编码).[^1] S ...

  5. Axure RP仿抖音短视频APP交互原型图模板

    Axure RP仿抖音短视频APP高保真交互原型模板,原型图设计灵感来自于抖音段视频APP,在预览里你可以看到抖音的影子.本素材包含登录.首页推荐.同城.直播间.消息.朋友.发布.我的.搜索等主要模块 ...

  6. Mac玩家的武侠梦:燕云十六声全平台运行保姆级教程

    M系列Mac凭借Apple Silicon芯片的强劲性能,已实现燕云十六声等大型手游的原生运行.通过开源工具PlayCover,开发者社区成功打通武侠动作游戏的跨平台壁垒,让玩家在Mac设备上感受沉浸 ...

  7. 搭建邮局-3.安装邮局前端roundcube和测试

    目录 搭建邮局-1.安装hMailserver和配置邮局 https://www.cnblogs.com/daen/p/16040202.html 搭建邮局-2.添加域名和域名解析 https://w ...

  8. Synchronized是怎么实现的?

    回答重点 synchronized 实现原理依赖于JVM 的 Monitor(监视器锁)和对象头(Object Header) synchronized 修饰代码块:会在代码块的前后插入 monito ...

  9. Web前端入门第 63 问:JavaScript 图解 for 循环执行顺序

    神奇的 for 循环代码执行顺序并不是按照代码书写顺序执行,这就导致在看很多程序算法的时候,会有那么一点打脑壳. for 语法 for 循环的语法很简单,重点是小括号里面的三个部分,这三部分的执行顺序 ...

  10. kubernetes集群calico网络组件部署

    一.使用问题背景 关于Calico组件介绍,我们在这个章节已经介绍过. 这里使用Calico组件,是因为集团安全测试通过容器内部检测出内网主机暴露的端口,内网主机的端口暴漏会造成严重的安全风险. 扫描 ...