Transformer详解:从放弃到入门(一)

  Transformer由论文《Attention is All You Need》提出,是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,在自然语言处理领域获得了巨大的成功,在这个系列的文章中,我会将模型拆解,并逐一介绍里面的核心概念。

Transformer模型

  Transformer结构如图所示,属于encode-decode架构,左边是编码器,右边是解码器。它们都由N个Transformer Block组成。编码器的输出作为解码器多头注意力的Key和Value,Query来自解码器输入经过掩码多头注意力后的结果。
在这里插入图片描述
  主要涉及以下几个模块:

  • 嵌入表示(Input/Output Embedding) 将每个标记(token)转换为对应的向量表示。
  • 位置编码(Positional Encoding) 由于没有时序信息,需要额外加入位置编码。
  • 多头注意力(Multi-Head Attention) 利用注意力机制对输入进行交互,得到具有上下文信息的表示。根据其所处的位置有不同的变种:邻接解码器嵌入位置是掩码多头注意力,特点是当前位置只能注意本身以及之前位置的信息;掩码多头注意力紧接的多头注意力特点是Key和Value来自编码器的输出,而Query来自底层的输出,目的是在计算输出时考虑输入信息。
  • 层归一化(Layer Normalization) 作用于Transformer块内部子层的输出表示上,对表示序列进行层归一化。
  • 残差连接(Residual connection) 作用于Transformer块内部子层输入和输出上,对其输入和输出进行求和。
  • 位置感知前馈网络(Position-wise Feedforward Network) 通过多层全连接网络对表示序列进行非线性变换,提升模型的表达能力。
    下面依次介绍各模块的功能和关键部分的实现。

嵌入表示

  对于一段输入的文本序列,一个常识是,我们首先应该把它进行分词并进行Word Embedding工作,这有两点原因:计算机无法直接处理一个单词或者一个汉字,需要把一个token转化成计算机可以识别的向量;Transformer对文本的建模是基于细粒度的。
  Embedding(嵌入表示)就是用一个低维稠密的向量表示一个对象,这里的对象指的是句子中的一个token(词)。Embedding向量能够表达对象的语义特征,两个向量之间的距离反映了对象之间的相似性。如果这两个token很像,那么得到的两个向量之间的距离应该很小。
  经过Word Embedding层后,我们就拿到了文本初始的token级别的表示,需要注意的是,bert对于英文的分词是以词为单位,对中文的分词则是以汉字为单位。

位置编码

  经过Word Embedding后,我们获得了词与词之间关系的表达形式,但是,由于Transformer不是基于类似RNN循环的方式,而是一次为所有的token进行建模,这就导致enbedding中不包含token在句子中的位置信息,因此要将位置信息加进去,结合了这种方式的词嵌入就是Position Embedding了。
  为了实现这一点,我们通常容易想到两种方式:(1)通过网络来学习;(2)预定义一个函数,通过函数计算出位置信息。Transformer的作者对以上两种方式都做了探究,发现最终效果相当,于是采用了第2种方式,从而减少模型参数量,同时还能适应即使在训练集中没有出现过的句子长度。公式为: P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i / d ) PE(pos,2i)=sin(\frac{pos}{10000^{2i/d}}) PE(pos,2i)=sin(100002i/dpos) P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i / d ) PE(pos,2i+1)=cos(\frac{pos}{10000^{2i/d}}) PE(pos,2i+1)=cos(100002i/dpos)  其中pos表示标记所在的位置;i代表维度,即位置编码的每个维度对应一个波长不同的正弦或余弦波,波长从 2 π 2π 2π 10000 ⋅ 2 π 10000 ⋅ 2π 100002π成等比数列;d表示位置编码的最大维度,和词嵌入的维度相同。
  为何使用这种方式编码能够代表不同位置信息呢?由公式可知,每一维 i 都对应不同周期的正余弦曲线: i = 0 i=0 i=0时是周期为 2 π 2π 2π s i n sin sin函数, i = 1 i=1 i=1时是周期为 2 π 2π 2π c o s cos cos函数…对于不同的两个位置 p o s 1 pos1 pos1 p o s 2 pos2 pos2,若它们在某一维上有相同的编码值,则说明这两个位置的差值等于该维所在曲线的周期,即 ∣ p o s 1 − p o s 2 ∣ = T i |pos1-pos2|=T_i pos1pos2∣=Ti。而对于另一个维度 j ( j ≠ i ) j(j\neq i) j(j=i),由于 T i ≠ T j T_i\neq T_j Ti=Tj,因此 p o s 1 pos1 pos1 p o s 2 pos2 pos2在这个维度 j j j上的编码值就不会相等,对于其它任意 k ∈ { 1 , 2 , . . . , d − 1 } ; k ≠ i k\in \{1,2,...,d-1\};k\neq i k{1,2,...,d1};k=i也是如此。这种生成位置编码的方式保证了不同位置在所有维度上不会被编码到完全一样的值,从而使每个位置都获得独一无二的编码。Position Embedding的内积表示了位置的相对距离。内积的结果是对称的,所以没有方向信息,参考下图:
在这里插入图片描述
  最后得到的位置编码需要和标记的词嵌入向量进行相加。pytorch中给了positional_encodings.torch_encodings自动的实现位置编码,我们给一个使用示例。

from positional_encodings.torch_encodings import PositionalEncoding1D

def get_pos_encode(token_fea):
    fea_dim = token_fea.shape[2]
    p_1d_feature = PositionalEncoding1D(token_fea)
    positional_fea = p_1d_image(token_fea).cuda()
    return positional_fea 

# 生成位置编码,加入到enbedding中
positional_enbedding = get_pos_encode(token_fea)
token_fea = token_fea + positional_enbedding 

  下一篇,我将介绍Transformer中的多头注意机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/595749.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费开源线上线下交友社交圈子系统 小程序+APP+H5 可支持二开!

为什么要玩社交软件:互联网社交软件的独特优势 首先,社交软件为我们提供了一个便捷的沟通方式。在传统的交往方式中,人们需要面对面交流,这种方式在时间和空间上都受到限制。而社交软件打破了这些限制,无论我们身处何地…

如何复制本地docker镜像到其他主机

(1)打包镜像 比如我要复制的镜像是grafana的镜像 docker images 这里我把打包的镜像放在了根~目录下,如截图所示: docker save grafana/grafana:latest -o ~/grafana.jar (2)移动镜像 scp命令拷贝镜像到目标…

linux学习:线程池

目录 原理 初始线程池 运行中的线程池 相关结构体 api 线程池初始化 投送任务 增加活跃线程 删除活跃线程 销毁线程池 例子 thread_pool.h thread_pool.c test.c 测试程序 原理 一个进程中的线程就好比是一家公司里的员工,员工的数目应该根据公司的…

AI神助攻!小白也能制作自动重命名工具~

我们平时从网上下载一些文件,文件名很多都是一大串字母和数字,不打开看看,根本不知道里面是什么内容。 我想能不能做个工具,把我们一个文件夹下面的所有word、excel、ppt、pdf文件重命名为文件内容的第一行。 我们有些朋友可能不会…

刷代码随想录有感(57):二叉搜索树中的众数

题干&#xff1a; 代码&#xff1a; class Solution { public:unordered_map<int,int>map;void traversal(TreeNode* root){if(root NULL)return;traversal(root->left);map[root->val];traversal(root->right);}bool static cmp(const pair<int,int>&a…

[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free)

查看保护 查看ida 大致就是只能创建0x60大小的堆块&#xff0c;并且uaf只能利用一次 完整exp&#xff1a; from pwn import* #context(log_leveldebug) pprocess(./ezheap2.31)def alloc(content):p.sendlineafter(b4.exit,b1)p.send(content) def free(index):p.sendlineaft…

C++:运算符重载(=/==)

赋值运算符&#xff08;&#xff09;重载 在C中&#xff0c;赋值运算符可以被重载&#xff0c;允许用户定义类对象的赋值行为。通过重载赋值运算符&#xff0c;可以自定义对象的赋值操作&#xff0c;以便适应特定的需求和语义。当我们定义一个自定义的类时&#xff0c;比如一个…

语音识别---节拍器

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

商城数据库88张表结构完整示意图41~50(十二)

四十一&#xff1a; 四十二&#xff1a; 四十三&#xff1a; 四十四&#xff1a; 四十五&#xff1a; 四十六&#xff1a; 四十七&#xff1a; 四十八&#xff1a; 四十九&#xff1a; 五十&#xff1a;

说说你对盒子模型的理解?

一、是什么 当对一个文档进行布局&#xff08;layout&#xff09;的时候&#xff0c;浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型&#xff08;CSS basic box model&#xff09;&#xff0c;将所有元素表示为一个个矩形的盒子&#xff08;box&#xff09; 一个盒子由四…

开源推荐榜【MalusAdmin基于 Vue3/TypeScript/NaiveUI 和 NET7 Sqlsugar 开发的后台管理框架】

简介 Malus是海棠的意思&#xff0c;顾名思义&#xff0c;海棠后台管理系统&#xff0c;读音与【马卢斯】相近&#xff0c;也可称作为马卢斯后台管理系统。 基于NET Core | NET7/8 & Sqlsugar | Vue3 | vite4 | TypeScript | NaiveUI 开发的前后端分离式权限管理系统,采用…

2024SCVN南方时尚之夜:童模冰雪之境惊艳亮相

在广州黄埔君澜酒店&#xff0c;璀璨的灯光下&#xff0c;一场主题为“雪山”、“童模”与“时尚”的盛宴于2024年5月1日至5月3日华丽上演。这场名为“2024SCVN南方时尚之夜&绽放冰雪之境”的活动&#xff0c;如同一颗璀璨的明珠&#xff0c;镶嵌在初夏的广州&#xff0c;熠…

IPD-开发流程

2024-5-6记录于PR办公室 在上一家公司做硬件产品经理的时候&#xff0c;Richard Li曾花费“巨资”请了华为前战略专家给我们培训&#xff0c;讲授IPD这门课的模式都很IPD&#xff0c;当时完全没重视&#xff0c;光想着不可能靠这个能把产品做好&#xff0c;这样做产品必定是一批…

【电影】【指环王】【中土世界】影碟播放记录

一、写在前面 笔者于5月5日&#xff08;昨天&#xff09;在新加坡淘到了一套《指环王 The Lord of the Rings》DVD光碟&#xff0c;今天却听闻噩耗&#xff0c;Rohan国王Theoden的扮演者&#xff0c;英国演员Bernard Hill去世&#xff08;享年79岁&#xff09;&#xff0c;发文…

接口自动化测试之-requests模块详解

一、requests背景 Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池&#xff0c;支持使用cookie保持会话&#xff0c;支持文件上传&#xff0c;支持自动确定响应内容的编码&#xff0c;支持国际化的 URL 和 POST 数据自动编码。 二、requests安装 利用p…

Windows环境下VSCode C无法跳转自动补全

前言&#xff1a; 本文记录了自己在配置 Windows环境下 VSCode C开发环境的遇到的问题和解决方法。 参考: vscode c语言没有代码提示_clangd提示不生效-CSDN博客 VSCODE无法跳转_vscode 不能跳转-CSDN博客 vscode c/c环境配置&#xff08;MinGW&#xff09;调用第三官方库…

鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案

官方概述 先看官方对事件的描述. 事件&#xff08;Event&#xff09;是一种任务间通信的机制&#xff0c;可用于任务间的同步。 多任务环境下&#xff0c;任务之间往往需要同步操作&#xff0c;一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。 一对多同步模型…

冯喜运:5.6周一国际黄金实时盘面走势分,原油最新操作

【黄金消息面分析】&#xff1a;周一(5月6日)亚市盘中&#xff0c;黄金市场出现大行情。现货黄金短线加速飙升&#xff0c;金价一度触及2315美元/盎司&#xff0c;较日内低点大幅反弹逾20美元/盎司&#xff0c;目前交投于2310.61美元/盎司附近。COMEX最活跃黄金期货合约北京时间…

集合定义和使用方法

一.集合的长度 集合的长度,可以添加和删除,长度也会跟着去发生改变,数组一旦创建完成他的长度就不会发生改变。 二.集合的定义方式 ArrayList<String> list new ArrayList(); 三.集合能存储的数据类型 集合能够存储引用数据类型,存储基本数据类型需要使用包装类: 四…

年轻人刮疯了,刮刮乐断货了

年轻人刮疯了 刮刮乐缺货了。 00后彩票店老板陆诗等得有点着急。她的福彩店开在深圳&#xff0c;今年4月才开门营业&#xff0c;但从开业到今天&#xff0c;刮刮乐总共就来了一回货——开业时发的20本。 那之后&#xff0c;刮刮乐就彻底断供了。原本&#xff0c;陆诗想把刮刮…