无序中的秩序:Transformer模型的创新性结构解析

embedded/2024/10/18 3:21:38/

最近我在看论文时,发现很多都在用 Transformer 模型,我知道transformer很有名,但是我也只是听说过他的大名,不知道他具体是做什么怎么做的,因此我决定深入了解一下,并做个简单记录,方便以后参考。 Transformer 主要用于处理自然语言处理(NLP)任务。与之前的循环神经网络(RNN)和长短时记忆网络(LSTM)等模型不同,Transformer 最主要的模块是使用了注意力机制,而不需要顺序地处理数据,也就是说不依赖时间或序列顺序。transformer的核心功能是处理序列数据,就是处理输入的数据和输出的数据之间的关系,像我自己看的那篇论文,是推荐系统方向的,输入的数据是庞大的用户行为数据,经过整个模型处理,输出的数据就是精确的用户可能点击的数据,提高用户可能点击的概率。

Transformer 由以下几个部分组成:

  1. 自注意力机制: 这一机制让模型在处理每个词语时,能够参考序列中的其他所有词。比如在翻译时,句子中的某个词可能会依赖其他几个词,这种机制让模型可以全局地理解上下文,从而捕捉长距离依赖关系,比如在最近很火的gpt文本生成中,一句话中各个单词的远近可能对当前词有影响。
  2. 多头注意力: 这是对自注意力机制的并行化处理,让模型从不同角度(即多个“头”)来理解输入序列。每个“头”可以独立学习不同的信息关联,进一步提升模型的表达能力,使得它能够捕捉到句子中 不同的部分。
  3. 位置编码: 由于 Transformer 不是按顺序处理数据的,它通过位置编码引入词语的位置信息,确保模型能理解词与词之间的顺序关系。就像你阅读一句话时,不仅要知道每个词的含义,还要知道它们在句中的顺序,这样才能明白句子的意思。

Transformer的编码器与解码器

在 NLP 任务中,编码器负责将输入数据转化为一种计算机能够看懂的代码,而解码器则根据这个表示生成输出。Transformer 的编码器由 6 层相同的堆栈组成,每层包含两个子层:多头自注意力机制和一个前馈网络。主要是对输入的序列进行编码,提取出表示序列各个部分的向量。

解码器也有类似的结构,但它比编码器多了一个子层,这个额外的子层用来处理编码器的输出。另外,解码器中的自注意力机制经过调整,只允许每个位置关注之前已生成的内容,确保生成顺序合理,输出新的输出序列。
Attention ⁡ ( Q , K , V ) = softmax ⁡ ( Q K T d k ) V \operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V Attention(Q,K,V)=softmax(dk QKT)V

深度学习领域,特别是注意力机制的应用中,点积计算、缩放、softmax变换以及加权求和是实现自注意力或注意力层的核心步骤。通过这些步骤,注意力机制能够有效地捕捉序列数据中的长距离依赖关系,大大增强了模型理解和生成复杂语言结构的能力,是现代自然语言处理模型如Transformer架构中的关键组件。

M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO

w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i … … V ) where head_i = Attention(QW_i^Q,KW_i^K,VW_i……V) whereheadi=Attention(QWiQ,KWiK,VWi……V)

论文接下来详细的介绍了transformer是如何工作的:

第一步:线性变换

对于输入的查询Q、键K和值V,我们使用不同的线性变换矩阵
W i Q 、 W i K 和 W i V W_i^Q、W_i^K和W_i^V WiQWiKWiV
,将它们分别隐射到h个不同的子空间。每一个注意力投都有自己专用的一组权重矩阵。
Q i = Q W i Q , K i = K W i K , V i = V W i V Q_i=QW_i^Q,K_i=KW_i^K,V_i=VW_i^V Qi=QWiQ,Ki=KWiK,Vi=VWiV

第二步:独立计算每个注意力投的输出

对于每一个注意力i,计算缩放点积注意力:
h e a d i = A t t e n t i o n ( Q i , K i , V i ) = s o f t m a x ( Q K T d k ) V i head_i=Attention(Q_i,K_i,V_i) = softmax(\frac{Q K^{T}}{\sqrt{d_{k}}})V_i headi=Attention(Qi,Ki,Vi)=softmax(dk QKT)Vi

第三部:连接所有注意力头的输出

将所有注意力头的输出 h e a d 1 , h e a d 2 , . . . , h e a d h head_1,head_2,...,head_h head1,head2,...,headh进行拼接(Concat),得到一个大矩阵:
C o n c a t ( h e a d 1 , h e a d 2 , . . . , h e a d h ) Concat(head_1,head_2,...,head_h) Concat(head1,head2,...,headh)

第四步:线性变换输出

对拼接后的结果进行一次线性变换,得到最终的多头注意力输出:
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO

除了注意力机制,Transformer 的每一层还包含一个前馈网络神经网络,通常由两次线性变换和中间的 ReLU 激活函数组成。
F F N ( x ) = m a x ( 0 , s W 1 + b 1 ) W 2 + b 2 FFN(x)=max(0,sW_1+b1)W_2+b_2 FFN(x)=max(0,sW1+b1)W2+b2

多头注意力的计算是将查询、键和值分别线性变换到多个子空间中,然后独立计算每个子空间的注意力分布,最后将所有头的输出拼接起来,进行线性变换,得到最终的结果。这让模型可以并行地关注输入序列中的不同部分,提升了处理能力。

transformer广泛的应用于序列到序列的任务中,具有高效的并行计算能力和捕捉长距离依赖关系的能力。


http://www.ppmy.cn/embedded/126952.html

相关文章

【Fargo】1:基于libuv的udp收发程序

开发UDP处理程序 我正在开发一个基于libuv的UDP发送/接收程序,区分发送端和接收端,设计自定义包数据结构,识别和处理丢包和乱序。 创建项目需求 用户正在要求一个使用libuv的C++程序,涉及UDP发送和接收,数据包包括序列号和时间戳,接收端需要检测丢包和乱序包。 撰写代…

JavaSE——集合4:LinkedList、ArrayList与LinkedList的选择

目录 一、LinkedList的全面说明 二、LinkedList的底层操作机制 (一)LinkedList添加结点源码 (二)LinkedList删除结点源码 三、LinkedList常用方法 四、ArrayList与LinkedList的选择 一、LinkedList的全面说明 LinkedList底层实现了双向链表和双端队列的特点可以添加任意…

计组_输入输出系统

2024.08.05:计算机组成原理输入输出学习笔记 第25节 输入输出系统 5.1 IO基本职能5.2 IO接口的通用结构5.3 IO数据传送控制方式5.3.1 程序直接控制(程序查询控制)(1)独占查询(2)定时查询 5.3.2 …

Spring Boot知识管理系统:敏捷开发实践

3系统分析 3.1可行性分析 通过对本知识管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本知识管理系统采用JAVA作为开发语言,Spring Boot框…

使用SIFT算法实现可缩放比例的图像匹配:Python与OpenCV

使用SIFT算法实现强大的图像匹配:Python与OpenCV实战指南 在计算机视觉领域,图像匹配是一个常见而重要的任务。无论是在图像拼接、对象识别还是视觉跟踪中,我们都需要可靠的方法来找出一个图像在另一个图像中的位置。今天,我们将探讨一种强大的技术 —— SIFT(尺度…

Android 中获取当前 CPU 频率和占用率

最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下: 目前没有标准的 API 来获取 CPU 的使用频率,只能通过读取指定 CPU 文件获取当前 CPU 频率,在某些机器或者特定版本中…

如何通过 Nginx 只允许 www 域名访问并禁止裸域名访问

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

代码随想录打卡Day57

今天真的好累,开完组会刷今天的题刷了一天。还有助教的事情没做完,还有一些其他的破事全都对在一堆了。今天的前两道题自己AC的,后面两道题看题解写的,最后一道题的思路就算想出来了,实现起来也不简单。。。。处在红温…