Transformer之Attention的通俗理解

news/2024/10/18 3:26:12/

什么是 Attention?

Attention

在关于Token的文章 中介绍了什么是Token和Token的作用,那么将一堆Token之间的关系和语义进行提取的,就是Attention。其核心就是通过一些升维降维和求积操作,完成对感兴趣的区域进行特征提取。
A t t e n t i o n o u t p u t = S o f t m a x ( Q × K D i m o u t ) × V Attention_{output} = Softmax(\frac{Q \times K}{\sqrt{Dim_{out}}}) \times V Attentionoutput=Softmax(Dimout Q×K)×V
想要理解Attention,就要先理解这个公式做了什么事,嫌麻烦就只看点后面的

  • Q × K Q\times K Q×K计算了两组向量之间的相似度,可以理解为一种互相关或者互信息的计算,也称之为注意力得分;

Q × K T = ∑ D i m o u t i = 1 Q i × K i = X ⋅ W q ⋅ [ X ⋅ W k ] T = X ⋅ W q ⋅ W k T ⋅ X T = X ⋅ [ W q ⋅ W k T ] ⋅ X T = X ⋅ W a t t n ⋅ X T \begin{array}{ccl} Q \times K^T &= &\underset{i=1}{\stackrel{Dim_{out}}{\sum}}Q_i \times K_i \\ && \\ &= &X \cdot W_q \cdot \Big[X \cdot W_k\Big]^T \\ && \\ &= &X \cdot W_{q} \cdot W^T_k \cdot X^T \\ && \\ &= &X \cdot \Big[W_{q} \cdot W^T_k \Big] \cdot X^T \\ && \\ &= &X \cdot W_{attn} \cdot X^T \end{array} Q×KT=====i=1DimoutQi×KiXWq[XWk]TXWqWkTXTX[WqWkT]XTXWattnXT
关于这个注意力得分的理解:

  • 这个注意力得分是一个二次型,即 s c o r e = X ⋅ W ⋅ X T score=X\cdot W \cdot X^T score=XWXT,原因是二次型的维度更高,表达能力更强;如果只是 s c o r e = W ⋅ X score=W \cdot X score=WX,难么这只是输入的现行变换,没有太强的表达能力;
  • 因为是二次型,所以从最后和公式来看,它就是X-corr的相似的计算,计算的也是一种互信息;
  • 由于上述公式省略了nn.Linear或者nn.Conv2d中的偏置(bias)过程,所以,一次项没有列出,正因为这个由偏置引起的一次项和零次项,所以在实际操作中无法直接使用先计算输入的内积在乘以矩阵系数的过程(因为这种做法看起来省掉了一组权重系数 W W W,所以有人可能会走这条路去试探)
  • s o f t m a x softmax softmax作用就是把相似度转换为概率分布 [ 0 , 1 ] [0, 1] [0,1],这样就可以作为权重矩阵去加权 V V V
  • D i m o u t \sqrt{Dim_{out}} Dimout 缩放注意力得分,用这个值缩放,是因为这个值是标准差,下面是原因;

V a r ( X i Y i ) = E ( X i 2 Y i 2 ) − E ( X i Y i ) 2 = E ( X i 2 ) E ( Y i 2 ) − E ( X i ) 2 E ( Y i ) 2 = ( V a r ( X i ) + E ( X i ) 2 ) ( V a r ( Y i ) + E ( Y i ) 2 ) − E ( X i ) 2 E ( Y i ) 2 = ( 1 + 0 ) ( 1 + 0 ) − 0 = 1 其中 , X = [ X 1 , ⋯ , X n ] ∼ N ( 0 , I ) , Y = [ Y 1 , ⋯ , Y m ] ∼ N ( 0 , I ) , 方差为 1 期望为 0 , 所以 V a r ( X × Y ) = ∑ V a r ( X i , Y i ) D i m o u t i = 1 = D i m o u t \begin{array}{ccl} \mathop{Var}(X_i Y_i) &= &{E(X_i^2Y_i^2) - E(X_iY_i)^2} \\ &&\\ &= &{E(X_i^2)E(Y_i^2) - E(X_i)^2E(Y_i)^2}\\ &&\\ &= &(\mathop{Var}(X_i)+E(X_i)^2)(\mathop{Var}(Y_i) +E(Y_i)^2) - E(X_i)^2E(Y_i)^2 \\ &&\\ &= & (1+0)(1+0) - 0 \\ && \\ & = &1 \\ \end{array}\\ \quad \\ 其中, X = [X_1, \cdots, X_n] \sim N(0, I),\quad Y=[Y_1, \cdots, Y_m] \sim N(0, I) ,\\ 方差为1期望为0, 所以 \mathop{Var}(X \times Y) = \underset{i=1}{\stackrel{Dim_{out}}{\sum \mathop{Var}(X_i,Y_i)}} =Dim_{out} Var(XiYi)=====E(Xi2Yi2)E(XiYi)2E(Xi2)E(Yi2)E(Xi)2E(Yi)2(Var(Xi)+E(Xi)2)(Var(Yi)+E(Yi)2)E(Xi)2E(Yi)2(1+0)(1+0)01其中,X=[X1,,Xn]N(0,I),Y=[Y1,,Ym]N(0,I)方差为1期望为0,所以Var(X×Y)=i=1Var(Xi,Yi)Dimout=Dimout

  • s o f t m a x ( Q × K T D i m o u t ) softmax(\frac{Q \times K^T}{\sqrt{Dim_{out}}}) softmax(Dimout Q×KT)整体作为 V V V的权重,进行加权,就是 s o f t m a x ( Q × K T D i m o u t ) softmax(\frac{Q \times K^T}{\sqrt{Dim_{out}}}) softmax(Dimout Q×KT)
  • 这么做,实现了N个词汇向量或者像素patch的语义(就是他们通道)之间的交互,可以理解为词与词或者patch与patch之间的关系被注意力得分表示出来了,然后再在 V a l u e Value Value上加权,就可以得到一个被高亮的 v a l u e value value

什么是Multi-Head Attention

按照输入数据维度分类,Attention可分为普通Attention和Multi-Head Attention。上面是普通的Attention,下面的是Multi-head attention

Multi-Head实际上,他就是将输入数据从 [ B , N , C ] [B, N, C] [B,N,C]变成 [ B × n u m _ h e a d s , N , C ] [B \times num\_heads, N, C] [B×num_heads,N,C],然后再输入到Attention模块中进行注意力计算。
那么这么做有什么好处呢?
  上面说道Attention实现了N个词汇向量或者像素patch的语义(就是他们通道)之间的交互,可以理解为词与词或者patch与patch之间的关系被注意力得分表示出来了,然后再在 V a l u e Value Value上加权,就可以得到一个被高亮的 v a l u e value value
  那么这么做的缺点也显而易见,就是整个语义部分被当做一个整体去计算相似度得分和加权 V a l u e Value Value,也就失去了对多重语义的理解
  所以,Multi-Head Attention就被提出来了,核心操作就是对语义维度(channel)进行切片,分割成 n u m _ h e a d s num\_heads num_heads个,堆叠在Batch维度上再进行注意力计算,这样就可以得到多重语义

优点

  • 计算效率提升了

因为要进行相乘的维度从 [ c h a n n e l × c h a n n e l ] [channel \times channel] [channel×channel] 变成了 [ c h a n n e l n u m _ h e a d s × c h a n n e l ] \Big[ \frac{channel}{num\_heads} \times channel \Big] [num_headschannel×channel], 虽 b a t c h batch batch变成了 b a t c h × n u m _ h e a d s batch \times num\_heads batch×num_heads,但是总体少了,大概就是: c h a n n e l 2 channel^2 channel2 ÷ ( c h a n n e l n u m _ h e a d s ) 2 × n u m _ h e a d s (\frac{channel}{num\_heads})^2 \times num\_heads (num_headschannel)2×num_heads

  • 拥有了可以处理多重语义的能力

例如,“日久生情”和"日久生情"

  • 提高模型泛化能力和降低过拟合风险

多头注意力本质上类似一种多模型model的组合 ,通过对相同嵌入(Embedding)进行多角度的特征理解或者是提取,得到一个拓展的结果集合,在一个更大的空间中筛选结果,确实能提升泛化能力,降低过拟合风险。

其他Attention

  • Self-Attention:

Q 、 K 、 V Q、K、V QKV都是来自于同一个嵌入向量Embedding或者同一组图片的patch embedding,进行相同的注意力计算,就是Self-Attention

  • Cross-Attention:

Q Q Q是一组嵌入向量Embedding或者一组图片的patch embedding,而 K K K V V V是来自于另一组且相同的嵌入向量Embedding或者图片的patch embedding, 然后进行相同的注意力计算,就是Self-Attention


http://www.ppmy.cn/news/1476861.html

相关文章

前端实现将多个页面导出为pdf(分页)

一、需要用到两个插件,需要安装 vue框架中实现导出pdf npm install --save html2canvas // Dom转canvas再转image npm install jspdf --save // image转pdf二、实现方法 分别获取每个页面的DOM元素,并转为canvas再转image&#xff0c…

【AI资讯】7.19日凌晨OpenAI发布迷你AI模型GPT-4o mini

性价比最高的小模型 北京时间7月19日凌晨,美国OpenAI公司推出一款新的 AI 模型“GPT-4o mini”,即GPT-4o的更小参数量、简化版本。OpenAI表示,GPT-4o mini是目前功能最强大、性价比最高的小参数模型,性能逼近原版GPT-4&#xff0…

Python面试题:使用Python进行元编程:元类和元编程技巧

在 Python 中,元编程是一种编程技巧,它涉及到代码本身的结构和行为的编程。元编程允许你编写能够操作、修改或生成代码的代码。最常见的元编程技术包括使用元类、装饰器和类装饰器。以下是对 Python 元编程的详细讲解,包括元类和一些常用的元…

用python写一个爬虫,爬取google中关于蛇的照片

为了爬取Google中关于蛇的照片,我们可以利用Python中的第三方库进行网页解析和HTTP请求。请注意,这种爬取行为可能违反Google的使用条款,因此建议在合法和允许的情况下使用。以下是一个基本的Python爬虫示例,使用Requests库发送HT…

B树(B-Tree)详解

B树(B-Tree)详解 B树(B-Tree)是一种自平衡的树状数据结构,专为磁盘和其他直接访问的辅助存储设备而设计,广泛应用于数据库和文件系统中。B树通过减少磁盘I/O操作的次数,显著提高了数据存取的效…

axios(ajax请求库)

json-server(搭建http服务) json-server用来快速搭建模拟的REST API的工具包 使用json-server 下载&#xff1a;npm install -g json-server创建数据库json文件&#xff1a;db.json开启服务&#xff1a;json-srver --watch db.json axios的基本使用 <!doctype html>…

健康问题查询找搜索引擎还是大模型

随着自然语言处理&#xff08;NLP&#xff09;的最新进展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已经成为众多信息获取任务中的主要参与者。然而&#xff0c;传统网络搜索引擎&#xff08;SEs&#xff09;在回答用户提交的查询中的作用远未被取代。例如&#xf…

JavaWeb入门程序解析(Spring官方骨架、配置起步依赖、SpringBoot父工程、内嵌Tomcat)

3.3 入门程序解析 关于web开发的基础知识&#xff0c;我们可以告一段落了。下面呢&#xff0c;我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 3.3.1 Spring官方骨架 之前我们创建的SpringBoot入门案例&#xff0c;是基于Spring官方提供的骨架实现的。 Sprin…