transfomer的位置编码

什么是位置编码

在transformer的encoder和decoder的输入层中,使用了Positional Encoding,使得最终的输入满足:
在这里插入图片描述

input_embedding+=positional_encoding

这里,input_embedding的shape为[n,b,embed_dim],positional_encoding和input_embedding形状一致.

位置编码的作用

Transformer模型抛弃了RNN、CNN作为序列学习的基本模型。循环神经网络本身就是一种顺序结构,天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构,完全采用Attention取而代之,这些词序信息就会丢失,模型就没有办法知道每个词在句子中的相对和绝对的位置信息。因此,有必要把词序信号加到词向量上帮助模型学习这些信息,位置编码(Positional Encoding)就是用来解决这种问题的方法。

位置编码的方法

用整型值标记位置

一种自然而然的想法是,给第一个token标记1,给第二个token标记2…,以此类推。
在这里插入图片描述
这种方法产生了以下几个主要问题:
(1)模型可能遇见比训练时所用的序列更长的序列。不利于模型的泛化。
(2)模型的位置表示是无界的。随着序列长度的增加,位置值会越来越大。

用[0,1]范围标记位置

为了解决无界问题,可以考虑将位置值的范围限制在[0, 1]之内,其中,0表示第一个token,1表示最后一个token。比如有3个token,那么位置信息就表示成[0, 0.5, 1];若有四个token,位置信息就表示成[0, 0.33, 0.69, 1]。
但这样产生的问题是,当序列长度不同时,token间的相对距离是不一样的。例如在序列长度为3时,token间的相对距离为0.5;在序列长度为4时,token间的相对距离就变为0.33。
因此,我们需要这样一种位置表示方式,满足于:
(1)它能用来表示一个token在序列中的绝对位置
(2)在序列长度不同的情况下,不同序列中token的相对位置/距离也要保持一致
(3)可以用来表示模型在训练过程中从来没有看到过的句子长度。

用one-hot编码标记位置

在这里插入图片描述
这种编码的问题是有可能重复,最多可以独立表示2^embed_dim中pos,否在就会重复.

用周期函数(sin)来表示位置

通过纵向观察one-hot编码可以知道,从右到左是一个频率逐渐降低的函数.因此考虑使用三角函数去模拟这个过程.
设每一行从左到右为[0,…i…,embed_dim-1],每一列从上到下为[0,…t…,len]
则上述编码过程可以表示为函数:
P E = [ P E ( t , 0 ) , . . . P E ( t , i ) . . . , P E ( t , e m b e d d i m − 1 ) ] = [ s i n ( 1 2 0 t ) , . . . s i n ( 1 2 i t ) . . . , s i n ( 1 2 e m b e d d i m − 1 t ) ] PE=[PE(t,0),...PE(t,i)...,PE(t,embed_{dim}-1)]=[sin(\frac{1}{2^{0}}t),...sin(\frac{1}{2^{i}}t)...,sin(\frac{1}{2^{embed_{dim}-1}}t)] PE=[PE(t,0),...PE(t,i)...,PE(t,embeddim1)]=[sin(201t),...sin(2i1t)...,sin(2embeddim11t)]
为了使得在固定的embed_dim的范围内,不容易出现重复编码,可以增加sin函数的周期.在transformer的论文中,采用了
P E ( t , i ) = s i n ( w i t ) , 其中 w i = 1 1000 0 i / ( e m b e d d i m − 1 ) PE(t,i)=sin(w_it),其中w_i=\frac{1}{10000^{i/(embed_{dim}-1)}} PE(t,i)=sin(wit),其中wi=10000i/(embeddim1)1
为了可以将某个位置编码通过线性转换到另一个位置编码,即:
P E ( t + δ t ) = T ( δ t ) ∗ P E ( t ) PE(t+\delta t)=T(\delta t)*PE(t) PE(t+δt)=T(δt)PE(t)
联想向量空间的旋转转换关系:
( s i n ( t + δ t ) c o s ( t + δ t ) ) = ( c o s ( δ t ) s i n ( δ t ) − s i n ( δ t ) c o s ( δ t ) ) ∗ ( s i n ( t ) c o s ( t ) ) (\begin{matrix} sin(t+\delta t)\\cos(t+\delta t)\end{matrix})=(\begin{matrix} cos(\delta t)&sin(\delta t)\\-sin(\delta t)&cos(\delta t) \end{matrix})*(\begin{matrix} sin(t)\\cos(t)\end{matrix}) (sin(t+δt)cos(t+δt))=(cos(δt)sin(δt)sin(δt)cos(δt))(sin(t)cos(t))
使用正余弦交叉的编码
P E = [ P E ( t , 0 ) , . . . , P E ( t , e m b e d d i m − 1 ) ] = [ s i n ( w 0 t ) , c o s ( w 0 t ) , . . . . , s i n ( w e m b e d d i m 2 − 1 t ) , c o s ( w e m b e d d i m 2 − 1 t ) ] PE=[PE(t,0),...,PE(t,embed_{dim}-1)]=[sin(w_0t),cos(w_0t),....,sin(w_{\frac{embed_{dim}}{2}-1}t),cos(w_{\frac{embed_{dim}}{2}-1}t)] PE=[PE(t,0),...,PE(t,embeddim1)]=[sin(w0t),cos(w0t),....,sin(w2embeddim1t),cos(w2embeddim1t)]
实际使用中可以不用交叉:即
P E = [ P E ( t , 0 ) , . . . , P E ( t , e m b e d d i m − 1 ) ] = [ s i n ( w 0 t ) , s i n ( w e m b e d d i m 2 − 1 t ) , . . . . , c o s ( w 0 t ) , c o s ( w e m b e d d i m 2 − 1 t ) ] PE=[PE(t,0),...,PE(t,embed_{dim}-1)]=[sin(w_0t),sin(w_{\frac{embed_{dim}}{2}-1}t),....,cos(w_0t),cos(w_{\frac{embed_{dim}}{2}-1}t)] PE=[PE(t,0),...,PE(t,embeddim1)]=[sin(w0t),sin(w2embeddim1t),....,cos(w0t),cos(w2embeddim1t)]
因为本质上cos(0)在位置1还是在位置embed_dim/2没有区别,都是可以通过矩阵变换得到

位置编码可视化:

在这里插入图片描述
位置编码实现及其可视化代码,请移步手撕代码专栏的博客

参考

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

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

相关文章

xilinxi mulitboot 启动

xilinix在线更新有两种方式,一种是使用ICAP原语,另一中是在xdc中约束,根据应用的场景不同,选用不同的启动方式,第二种更为简单。 可参考官方提供的手册和实例 XAPP1247 链接: XAPP1247 golden和updata.b…

VitePress-01-从零开始的项目创建(npm版)

说明 本文介绍一下 VitePress的项目创建的步骤。 主要用到的命令工具是 npm。 本文的操作步骤是从无到有的创建一个完整的基本的【VitePress】项目。 环境准备 根据官方文档的介绍,截止本文发稿时,需要使用node.js 18 的版本。 可以使用node -v 的命令查…

muduo网络库剖析——通道Channel类

muduo网络库剖析——通道Channel类 前情从muduo到my_muduo 概要事件种类channel 框架与细节成员函数细节实现使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库,考虑的肯定是众多情况是否可以高效满足;而作为学习者&#x…

Asp .Net Core 系列:集成 Ocelot+Consul实现网关、服务注册、服务发现

什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的微…

RTSP/Onvif安防视频监控平台EasyNVR漏洞扫描及解决方法

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。安防视频监控平台可提供视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频…

【前端架构】前端通用架构

一个强大的前端通用架构应该具备多种能力,以支持现代化的应用程序开发和提高开发效率。以下是一些前端通用架构应该具备的关键能力: 模块化和组件化:支持模块化开发和组件化架构,能够将应用拆分为独立的模块和组件,以便…

外观模式(结构型)

目录 一、前言 二、外观模式 三、总结 一、前言 外观模式(Facade Pattern)是一种结构型设计模式,它为系统中的一组复杂子系统提供一个简单的接口,从而隐藏了这些子系统的复杂性,并且使得代码更加易于使用和理解。 外…

XUbuntu22.04之免费开源DesktopNaotu脑图(二百零七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

5个99%的人可能不知道的实用程序库!

前言 作为一名前端开发者,这些 JavaScript 库极大地提高了我的工作效率,如格式化日期、处理 URL 参数和调试移动网页。朋友们,我想和你们分享这些库。 1. 使用 “Day.js” 来格式化日期和时间 链接 作为开发者,我已经厌倦了在 JavaScript 中操作日期和时间,因为它太麻烦了。…

MySQL的多表数据记录查询笔记

关系数据操作 合并查询数据记录 在MySQL中通过关键字UNION来实现并操作,即可以通过其将多个SELECT语句的查询结果合并在一起组成新的关系。 两张表,表1 和表2 带有关键字UNION的合并操作 关键字UNION会把查询结果集直接合并在一起,同时将…

vite和webpack的区别

1 构建原理 Webpack 是一个静态模块打包器,通过对项目中的 JavaScript、CSS、图片等文件进行分析,生成对应的静态资源,并且可以通过一些插件和加载器来实现各种功能。Webpack 的主要特点是支持各种复杂的构建场景,例如代码分割、…

vs2022配置OpenCV测试

1,下载Opencv安装包 OpenCV官网下载地址:Releases - OpenCV 大家可以按需选择版本进行下载,官网下载速度还是比较慢的,推荐大家使用迅雷进行下载 下载安装包到自定义文件夹下 双击安装 按以下图示进行安装 2、 添加环境变量 打…

【HarmonyOS】消息通知场景的实现

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

浪花 - 搜索标签前后端联调

前传:浪花 - 根据标签搜索用户-CSDN博客 目录 一、完善后端搜索标签接口 二、前后端搜索标签接口的对接 1. 使用 Axios 发送请求 2. 解决跨域问题 3. Axios 请求传参序列化 4. 接收后端响应数据 5. 处理后端响应数据格式 6. 搜索结果为空的页面展示 附&am…

HCIA——11计算机网络分层结构——OSI/ISO、TCP/IP

学习目标: 参考模型 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本…

Pycharm 神级插件 Grep Console

下载: 使用: 为了方便测试这款插件的功能,我们可以写一段代码 来测试 import logging import time# 配置日志 logging.basicConfig(levellogging.DEBUG) logger logging.getLogger(__name__)# 日志消息中的字典内容 log_message """ {413867144: {202401031…

计算机导论09-数据组织与管理

文章目录 数据管理基础数据管理技术的发展数据组织与管理的发展手工数据处理阶段文件方式的数据处理阶段数据库数据处理阶段 数据库技术的发展 数据模型数据模型的要素概念模型逻辑模型 数据库系统数据库系统基础数据库系统构成 数据库系统的结构数据库系统的体系结构数据库系统…

smartgit选择30天试用后需要输入可执行文件

突然有一天smartgit提示到期了,我按照以往那样删除license和preferences文件后,选择30天试用,弹出了需要选择git可执行文件。 我尝试选择了我的git.exe,发现根本不行,提示让我执行下git --version 执行过后提示我的.gi…

HCIP之ISIS实验

华子目录 实验拓扑及要求规划IP地址规划Level1/2路由器实验步骤配置IP地址启动ISIS修改对应路由类型路由泄露:R1访问R5走R6测试 实验拓扑及要求 规划IP地址 规划Level1/2路由器 实验步骤 配置IP地址 R1-R8依次类推 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip a…

【Java SE】类和对象详解

文章目录 1.什么是面向对象2. 类的定义和使用2.1 简单认识类2.2 类的定义格式 3. 类的实例化3.1 什么是实例化3.1.1 练习(定义一学生类) 3.2 类和对象的说明 4. this 引用5. 构造方法6. 对象的初始化6.1 默认初始化6.2 就地初始化 7. 封装7.1 封装的概念…