【Transformer深入学习】之一:Sinusoidal位置编码的精妙

news2024/11/13 14:33:16

看苏神的文章提到:Transformer原论文使用Sinusoidal位置编码,作为位置编码的一个显式解,Google 在原论文中对它的描述寥寥无几,只是简单提及了它可以表达相对位置信息,并未提及这个编码的合理性。
看了几篇文章,做一个笔记。

Sinusoidal位置编码

公式和在模型中的位置
在这里插入图片描述
在这里插入图片描述

为什么需要位置编码

单词的位置和顺序是任何语言的重要组成部分。它们定义了句子的语法,从而定义了句子的实际语义。递归神经网络 (RNN) 本质上会考虑单词的顺序;他们按顺序逐字解析句子。这会将单词的顺序集成到 RNN 的主干中。

但是 Transformer 架构放弃了递归机制,转而采用多头自注意力机制。避免 RNN 的递归方法将导致训练时间的大幅加快。从理论上讲,它可以在句子中捕获更长的依赖项。

由于句子中的每个单词同时流经 Transformer 的编码器/解码器堆栈,因此模型本身对每个单词没有任何位置/顺序感。因此,仍然需要一种方法将单词的顺序合并到模型中。

为模型提供一些顺序感的一种可能解决方案是向每个单词添加一条有关其在句子中的位置的信息。我们称此 “信息片段”为位置编码。

可能想到的第一个想法是为 [0, 1] 范围内的每个时间步长分配一个数字,其中 0 表示第一个单词,1 是最后一个时间步长。您能弄清楚它会导致什么样的问题吗?它将引入的问题之一是您无法弄清楚特定范围内存在多少个单词。换句话说,时间步长 delta 在不同的句子中没有一致的含义。

另一个想法是为每个时间步线性分配一个数字。也就是说,第一个单词被赋予 “1”,第二个单词被赋予 “2”,依此类推。这种方法的问题在于,不仅值可能会变得相当大,而且我们的模型可能会面对比训练中的句子更长的句子。此外,我们的模型可能看不到任何具有特定长度的样本,这会损害我们模型的泛化。

理想情况下,应满足以下条件:

  • 它应该为每个时间步(单词在句子中的位置)输出唯一的编码
  • 任意两个时间步长之间的距离在不同长度的句子中应该是一致的
  • 我们的模型应该可以毫不费力地推广到更长的句子。它的值应该是有界的。
  • 它必须是确定性的。

Sinusoidal位置编码

论文提出的编码是一种简单而天才的技术,可以满足所有这些标准。首先,它不是一个单一的数字。相反,它是一个d-维度向量,其中包含有关句子中特定位置的信息。其次,这种编码没有集成到模型本身中。相反,这个向量用于为每个单词提供有关其在句子中的位置的信息。换句话说,我们增强了模型的输入以注入单词的顺序。

让t是输入句子中所需的位置,d是编码维度,编码定义如下:
在这里插入图片描述
由于可以从函数定义中得出,频率沿着向量维度递减。因此,它在波长上形成了从2π到10000⋅2π的几何级数。
还可以想象位置位置嵌入作为包含每个频率的正弦和余弦对的向量:
在这里插入图片描述

直觉

你可能想知道 sines 和 cosines 的这种组合怎么能代表一个位置/顺序?其实很简单,假设你想用二进制格式表示一个数字,那会怎么样?

在这里插入图片描述
您可以发现不同位之间的变化率。LSB 位在每个数字上交替,第二低位在每两个数字上旋转,依此类推。

但是在浮点数的世界中使用二进制值会浪费空间。因此,我们可以改用它们的 float 连续对应物 - Sinusoidal 函数。事实上,它们相当于交替的位。此外,通过降低它们的频率,我们可以从红色位变为橙色位。
在这里插入图片描述
图: 最大长度为 50 的句子的 128 维正序编码。每行表示嵌入向量

相对位置

正弦位置编码的另一个特点是它允许模型毫不费力地处理相对位置。以下是原始论文中的一段引述:
“我们选择这个函数是因为我们假设它允许模型轻松学习通过相对位置来关注,因为对于任何固定偏移量 k, PEpos+K可以表示为 PE 的线性函数PEpos”(原文:We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, PEpos+kcan be represented as a linear function of PEpos.)

但为什么这种说法成立呢?
简单版本的证明:

对于对应于频率的每个正弦-余弦对ωk,则存在线性变换M:
在这里插入图片描述
证明:
M是2×2的矩阵,我们想要找到u1,v1,u2和v2,因此
在这里插入图片描述
通过应用加法定理,我们可以按如下方式展开右侧:
在这里插入图片描述
这会产生以下两个方程:
在这里插入图片描述
通过求解上述方程,我们得到:
在这里插入图片描述
所以最终的变换矩阵M是:
在这里插入图片描述
如您所见,最终转换矩阵M不依赖于t。
请注意,可以找到矩阵M与 Rotation Matrix 非常相似。
同样,我们可以找到对于其他正弦-余弦对的M矩阵,这最终允许我们表示pt+φ作为pt对于任何固定偏移量φ。此属性使模型很容易按相对位置进行学习。
正弦位置编码的另一个特性是相邻时间步长之间的距离是对称的,并且会随时间很好地衰减。
在这里插入图片描述
图 所有时间步长的位置嵌入的点积

远程衰减

苏神的文章 ,评估了Sinusoidal位置编码的远程衰减:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
除了θt=t比较异常之外(与横轴有交点),其他很难断定孰优孰劣。

其他总结

这是一个如何破坏轮换对称性,同时给长距离的 token 关联做自动衰减的有效方法。

参考文献

《Transformer Architecture: The Positional Encoding
Let’s use sinusoidal functions to inject the order of words in our model》
(https://kazemnejad.com/blog/transformer_architecture_positional_encoding/)

《Transformer升级之路:Sinusoidal位置编码追根溯源》
(https://mp.weixin.qq.com/s/57iu8rPTXXG0jb2xxEVnTw)

《BERT为何使用学习的position embedding而非正弦position encoding?》
(https://www.zhihu.com/question/307293465/answer/1039311514)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA零基础入门——面向对象

1.继承 1.1 继承概念 继承的概念:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。我们将"继承概念"分为两类:…

WINDOWS AGENTARENA:EVALUATING MULTI-MODAL OS AGENTS AT SCALE论文学习

文章开头说现有的agent都是局限于特定领域(什么网络问答啊,仅限文字啊,仅限于某一个app啊)这样的,本文的工作主打一个贴近用户使用场景,用户用什么软件,看什么网页,本文的模型就用什…

Sapiens——人类视觉大模型的基础

引言 大规模预训练以及随后针对特定任务的语言建模微调取得了显著成功,已将这种方法确立为标准做法。同样, 计算机视觉方法正逐步采用大规模数据进行预训练。LAION5B、Instagram-3.5B、JFT-300M、LVD142M、Visual Genome 和 YFCC100M 等大型数据集的出现…

Python 实现Excel XLS和XLSX格式相互转换

在日常工作中,我们经常需要处理和转换不同格式的Excel文件,以适应不同的需求和软件兼容性。Excel文件的两种常见格式是XLS(Excel 97-2003)和XLSX(Excel 2007及以上版本)。本文将详细介绍如何使用Python在XL…

【SQLite数据库常规使用命令】

之前在做围绕数据库相关的一些小工具的时候,想找一款数据库作为小工具的资料库。需求是:不用复杂的安装,支持简单SQL,空间占用小,操作简单等等。 结合着之前接触到的一些研发同事做的产品的使用经验,我想到…

递归7小题

[ 注意:前6道题均是使用递归完成的,需要数组、指针、链表相关知识,第7道题是求水仙花数的加强版,也是使用递归完成的,3位数的水仙花数我们很熟悉,那5位数的呢?7位数的呢?9位数的呢&a…

【pycharm】如何两个窗口打开同一代码

文章目录 前言解决方案结果 前言 在 编辑长代码,要看上下离得较远的变量 时遇到的问题 解决方案 “window” → “Editor Tabs” → “Split right" 结果

CleanClip vs 传统剪贴板:究竟谁更胜一筹?

在日常工作和生活中,复制粘贴可以说是我们使用最频繁的操作之一。传统的剪贴板功能虽然简单易用,但在功能性和效率上还有很大的提升空间。今天,我们就来比较一下新兴的剪贴板增强工具CleanClip与传统剪贴板,看看到底谁更胜一筹。 1. 剪贴历史管理 传统剪贴板只能存储最后一次…

动态线程池实战(一)

动态线程池 对项目的认知 为什么需要动态线程池 DynamicTp简介 接入步骤 功能介绍 模块划分 代码结构介绍

设计模式学习[6]---代理模式

文章目录 前言1.原理阐述2.举例2.1 例子与类图2.2 代码 总结 前言 代理这个词,从小到大听过不少。比如什么代理服务器,代理商,代理人之类的。通俗来说,代理无非无非就是我代表你处理事务的意思。 那么在设计模式中,针…

Android WebView H5 Hybrid 混和开发

对于故乡,我忽然有了新的理解:人的故乡,并不止于一块特定的土地,而是一种辽阔无比的心情,不受空间和时间的限制;这心情一经唤起,就是你已经回到了故乡。——《记忆与印象》 前言 移动互联网发展…

智能车镜头组入门(三)巡线

镜头组的特点是通过摄像头来获取赛道的信息,从而达到前瞻的效果,完成转向和速度决策。 我们的方案,带上元素识别,大概在TC264上5ms一帧,所以我们开了100hz的图象。 之前我看别的博客上有人说,他们组的50帧…

MyBatis框架SqlSession浅析

1、SqlSessionFactory作用 MyBatis框架SqlSessionFactory是线程安全的,负责创建SqlSession。 DefaultSqlSessionFactory是线程安全的,属性Final。 2、SqlSessionFactoryBuilder SqlSessionFactoryBuilder负责创建SqlSessionFactory。SqlSessionFactory…

C++伟大发明--模版

C起初是不受外界关注的,别人觉得他和C语言没有本质上的区别,只是方便些,直到祖师爷发明了模版,开始和C语言有了根本的区别。 我们通过一个小小的例子来搞清楚什么是模版,模版的作用到底有多大,平时我们想要…

UAC2.0 麦克风——类特殊请求

UAC2.0 麦克风枚举过程参考 UAC2.0 麦克风——单声道 USB 麦克风(16bit) 文章目录 set interfaceget device status类特殊请求get curget rangevolume rangesample rangeset interface USB 请求代码 typedef enum {USB_REQ_GET_STATUS = 0 ,USB_REQ_CLEAR_FEATURE …

自动化中验证码的操作笔记,懂的赶紧收藏!

在自动化测试的过程中,验证码一直被视为一个“拦路虎”。很多测试人员在做接口或UI自动化时都会遇到验证码的阻碍,导致测试无法继续进行。今天,我们就来讨论如何在自动化过程中破解验证码,快速绕过这道关卡,轻松完成自…

【C51】独立按键控制LED灯

1.简介 在单片机应用系统中,常常使用轻触按键组成键盘。轻触按键具有自动回弹的特点,即按下按键,两个触点接通,放开按键,两个触点断开。轻触按键的外形及电路符号如图,通常轻触按键有4个引脚,4个…

Redis - 深入理解Redis事务

目录 Redis是如何实现事务的?事务中执行的命令出现错误,会回滚事务吗?同一个连接可以重复开启事务吗?多个客户端同时开启事务会怎样?使用Redis事务只用MULTI和EXEC吗?Redis中的WATCH机制是怎么实现的&#…

GAMES104:13 引擎工具链基础-学习笔记

文章目录 一,工具链二,复杂的工具2.1 界面GUI2.2 设计模式Design Pattern2.3 数据的加载和存储2.4 资产引用 三,资产加载Deserialization3.1 资产解析Parse3.2 资产版本兼容性(Compatibility) 四, 如何制作…

搞安全必看——IPS和IDS到底有啥区别?

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 随着数字化转型的加速推进,网络安全已成为各行业不可或缺的一环。对于现代企业和组织而言&#x…