当前位置: 首页 > news >正文

AI学习指南自然语言处理篇-位置编码(Positional Encoding)

AI学习指南自然语言处理篇-位置编码(Positional Encoding)

目录

  1. 引言
  2. 位置编码的作用
  3. 位置编码的原理
  4. 绝对位置编码
  5. 相对位置编码
  6. 位置编码在Transformer中的应用
  7. 位置编码的意义
  8. 总结

引言

在自然语言处理中,文本数据通常以序列的形式存在。然而,大部分的深度学习模型,如循环神经网络(RNN),自然地处理序列,同时保留了词之间的顺序信息。然而,Transformer模型的出现改变了这一传统。因为Transformer模型采用了自注意力机制,并且在计算时并没有考虑序列中元素的相对位置。这就引出了一个重要的问题:如何在Transformer中有效地为序列元素引入位置信息。于是,位置编码(Positional Encoding)应运而生。

位置编码的作用

位置编码的主要作用是为模型提供序列中每个元素的位置信息。具体来说,位置编码帮助自注意力机制理解不同词在句子中的相对或绝对位置。因为自注意力是无序的,它无法自然地理解序列信息,而位置编码正是为了解决这一问题。

在没有位置编码的情况下,Transformer只能通过自注意力计算词之间的关系,但无法知道它们在序列中的位置。引入位置编码后,模型能够更加聪明地理解上下文,从而提高文本理解和生成的能力。

位置编码的原理

位置编码通过为每个输入元素(如词向量)添加一组特定的值来实现,它通常与词向量的维度一致。常见的方式有固定位置编码和可学习位置编码。

Sinusoidal位置编码

最常见的固定位置编码方法是Sinusoidal编码。这个方法通过正弦和余弦函数为每个位置生成一个唯一的向量,能够在不同频率上捕获不同的位置差异。具体计算方式如下:

对于一个位置 ( pos ) 和维度 ( i ):

  • 如果 ( i ) 为偶数:
    [ P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i / d m o d e l ) ] [ PE(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) ] [PE(pos,2i)=sin(100002i/dmodelpos)]

  • 如果 ( i ) 为奇数:
    [ P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i / d m o d e l ) ] [ PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) ] [PE(pos,2i+1)=cos(100002i/dmodelpos)]
    这里的 ( d m o d e l ) ( d_{model} ) (dmodel) 是词嵌入的维度, ( p o s ) ( pos ) (pos) 是词在序列中的位置,( i ) 是当前维度的索引。

通过这种方式生成的位置编码具有周期性和可区分性,可以很好地表示序列中词的位置。

示例:Sinusoidal位置编码

假设我们有一个输入序列,其最大长度为5,且词向量维度为4。我们计算其Sinusoidal位置编码如下:

Position (pos)PE(0)PE(1)PE(2)PE(3)
0sin(0)cos(0)sin(0)cos(0)
1sin(1/10000^0)cos(1/10000^0)sin(1/10000^2)cos(1/10000^2)
2sin(2/10000^0)cos(2/10000^0)sin(2/10000^2)cos(2/10000^2)
3sin(3/10000^0)cos(3/10000^0)sin(3/10000^2)cos(3/10000^2)
4sin(4/10000^0)cos(4/10000^0)sin(4/10000^2)cos(4/10000^2)

通过上述计算,我们可以获得每个词在不同维度上的位置信息。在这之后,我们会将这些位置编码与词向量相加。

绝对位置编码

绝对位置编码是指每个位置的编码都是固定的,不会随输入数据的变化而改变。它对于序列中的每个位置生成一套独特的编码。这样的编码具有明显的优点,即在处理输入序列的任何变换(如添加词)时,我们都可以使用相同的编码方式,使得模型能够固定地理解每个位置的意义。

示例:绝对位置编码应用

考虑一个句子“我喜欢自然语言处理”,使用绝对位置编码后,模型中的每个词向量都会加上相应的绝对位置编码。例如:

  • 词向量(假设词嵌入维度为4):
    • 我:[0.1, 0.2, 0.3, 0.4]
    • 喜欢:[0.5, 0.6, 0.7, 0.8]
    • 自然:[0.9, 1.0, 1.1, 1.2]
    • 语言:[1.3, 1.4, 1.5, 1.6]
    • 处理:[1.7, 1.8, 1.9, 2.0]

假设它们的绝对位置编码分别为:

  • PE(0):[0.0, 0.0, 0.0, 0.0]
  • PE(1):[0.1, 0.1, 0.1, 0.1]
  • PE(2):[0.2, 0.2, 0.2, 0.2]
  • PE(3):[0.3, 0.3, 0.3, 0.3]
  • PE(4):[0.4, 0.4, 0.4, 0.4]

那么最终的输入会变为:

  • 我:[0.1, 0.2, 0.3, 0.4] + [0.0, 0.0, 0.0, 0.0] = [0.1, 0.2, 0.3, 0.4]
  • 喜欢:[0.5, 0.6, 0.7, 0.8] + [0.1, 0.1, 0.1, 0.1] = [0.6, 0.7, 0.8, 0.9]
  • 自然:[0.9, 1.0, 1.1, 1.2] + [0.2, 0.2, 0.2, 0.2] = [1.1, 1.2, 1.3, 1.4]
  • 语言:[1.3, 1.4, 1.5, 1.6] + [0.3, 0.3, 0.3, 0.3] = [1.6, 1.7, 1.8, 1.9]
  • 处理:[1.7, 1.8, 1.9, 2.0] + [0.4, 0.4, 0.4, 0.4] = [2.1, 2.2, 2.3, 2.4]

通过这种方式,Transformer模型能够识别句子中每个词的绝对位置。

相对位置编码

相对位置编码则不同于绝对位置编码,它聚焦于元素之间的相对位置关系。具体而言,模型在计算注意力时,会考虑两个词之间的距离而不是它们的具体位置。这种方法使得模型能够灵活地适应输入序列的变化。

示例:相对位置编码的应用

设想两个词A和B,分别处于位置i和位置j。相对位置编码可以表示为 ( j - i ),即词B在词A之后的距离。在这种情况下,模型只需利用相对位置编码就能够推断出两者之间的关系。

假设我们有以下句子:

  • “我喜欢自然语言处理”,其中词A为“喜欢”,词B为“自然”。那么,我们可以计算出相对位置,A和B之间的相对位置为 ( 2 - 1 = 1 )。

通过这种方式,无论词的具体位置如何,模型都能够灵活地理解到两个词之间的相对关系。

位置编码在Transformer中的应用

在Transformer模型中,位置编码是在每个层的输入中与词嵌入结合在一起的。Transformer的输入是经过Embedding后的词向量,再加上对应的位置信息,形成最终输入。

这个输入将被传递到自注意力机制中。在自注意力中,通过对不同位置的词进行加权,可以知道哪个词对于当前词更重要,而位置编码则确保了这些权重能够捕捉到词之间的位置信息。

Transformer的结构

Transformer主要由以下几个部分构成:

  1. 输入嵌入(Input Embedding):将词转化为向量。
  2. 位置编码(Positional Encoding):为每个输入元素添加位置信息。
  3. 自注意力机制(Self-Attention Mechanism):捕捉序列中每个元素之间的关系。
  4. 前馈网络(Feed-Forward Neural Network):对自注意力的输出进行进一步处理。
  5. 堆叠多个层(Stacking Layers):形成深度模型。

示例:Transformer工作流

让我们考虑一个示例序列 “我喜欢自然语言处理”,并将其应用于Transformer模型。

  1. 输入嵌入:首先将每个词进行嵌入,生成词向量。

    我:[0.2, 0.5, 0.7, ...]
    喜欢:[0.1, 0.4, 0.6, ...]
    自然:[0.3, 0.2, 0.8, ...]
    语言:[0.4, 0.8, 0.5, ...]
    处理:[0.6, 0.1, 0.9, ...]
    
  2. 位置编码:为每个词嵌入添加位置编码。

  3. 自注意力机制:通过计算注意力权重,理解每个词与其他词之间的关系。

  4. 前馈网络:对自注意力输出进行进一步处理。

  5. 输出层:最终输出生成的序列,或进行分类等任务。

通过以上步骤,模型能够处理复杂的序列输入,并输出符合上下文的结果。

位置编码的意义

位置编码在Transformer中起着至关重要的作用:

  1. 保留顺序信息:位置编码提供了对句子中词序的理解,帮助模型识别上下文含义。

  2. 提高效果:通过引入位置信息,Transformer能够在许多自然语言处理任务中 outperform 传统模型,如机器翻译和文本生成。

  3. 泛化能力:相对位置编码使得模型在处理长序列时更加灵活,相较于固定长度的绝对编码,更适应各种长度的输入。

总之,位置编码不仅提高了Transformer的表现,也为深度学习中的序列模型革命奠定了基础。

总结

位置编码是现代自然语言处理中的一个基本构件,它为模型提供了必要的位置信息。通过不同的编码方法,包括绝对位置编码和相对位置编码,模型能够有效地理解输入数据的结构和含义。Transformer模型的成功证明了有效地捕捉序列关系的重要性,为未来的研发和应用提供了强大的支持。在许多自然语言处理任务中,位置编码的意义不仅在于让模型“知道”元素的位置,更在于通过上下文提升了模型的智能与能力。

相关文章:

AI学习指南自然语言处理篇-位置编码(Positional Encoding)

AI学习指南自然语言处理篇-位置编码(Positional Encoding) 目录 引言位置编码的作用位置编码的原理绝对位置编码相对位置编码位置编码在Transformer中的应用位置编码的意义总结 引言 在自然语言处理中,文本数据通常以序列的形式存在。然而…...

macOS 15 Sequoia dmg格式转用于虚拟机的iso格式教程

想要把dmg格式转成iso格式,然后能在虚拟机上用,最起码新版的macOS镜像是不能用UltraISO,dmg2iso这种软件了,你直接转放到VMware里绝对读不出来,办法就是,在Mac系统中转换为cdr,然后再转成iso&am…...

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用?小结:同步调用优缺点 1-2 异步调用什么是异步调用?小结:异步调用的优缺点,什么时候使用异步调用? 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…...

CTF-RE 从0到N:汇编层函数调用

windows 在 Windows 平台上的汇编语言中,调用函数的方式通常遵循特定的调用约定(Calling Convention)。最常见的调用约定包括: cdecl: C 默认调用约定,调用者清理堆栈。stdcall: Windows API 默认调用约定&#xff0…...

雷池社区版compose配置文件解析-mgt

在现代网络安全中,选择合适的 Web 应用防火墙至关重要。雷池(SafeLine)社区版免费切好用。为网站提供全面的保护,帮助网站抵御各种网络攻击。 compose.yml 文件是 Docker Compose 的核心文件,用于定义和管理多个 Dock…...

无人机避障——4D毫米波雷达Octomap从点云建立三维栅格地图

Octomap安装 sudo apt-get install ros-melodic-octomap-ros sudo apt-get install ros-melodic-octomap-msgs sudo apt-get install ros-melodic-octomap-server sudo apt-get install ros-melodic-octomap-rviz-plugins # map_server安装 sudo apt-get install ros-melodic-…...

Python(数据结构2)

常见数据结构 队列 队列(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out) Python标准库中的queue模块提供了多种队列实现,包括普通队列、双端队列、优先队列等。 1 普通队列 queue.Queue 是 Python 标准库 queue 模块中的一个类…...

深入解析HTTP与HTTPS的区别及实现原理

文章目录 引言HTTP协议基础HTTP响应 HTTPS协议SSL/TLS协议 总结参考资料 引言 HTTP(HyperText Transfer Protocol)超文本传输协议是用于从Web服务器传输超文本到本地浏览器的主要协议。随着网络安全意识的提高,HTTPS(HTTP Secure…...

Java IO 模型

I/O 何为 I/O? I/O(Input/Output) 即输入/输出 。 我们先从计算机结构的角度来解读一下 I/O。 根据冯.诺依曼结构,计算机结构分为 5 大部分:运算器、控制器、存储器、输入设备、输出设备。 输入设备(比…...

安装双系统后ubuntu无法联网(没有wifi标识)网卡驱动为RTL8852BE

安装双系统后ubuntu没有办法联网,(本篇博客适用的版本为ubuntu20.04)且针对情况为无线网卡驱动未安装的情况 此时没有网络,可以使用手机数据线连接,使用USB共享网络便可解决无法下载的问题。 打开终端使用命令lshw -C …...

Sqoop的安装配置及使用

Sqoop安装前需要检查之前是否安装了Tez,否则会产生版本或依赖冲突,我们需要移除tez-site.xml,并将hadoop中的mapred-site.xml配置文件中的mapreduce驱动改回成yarn,然后分发到其他节点,hive里面配置的tez也要移除,然后…...

R语言机器学习算法实战系列(十三)随机森林生存分析构建预后模型 (Random Survival Forest)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程加载R包案例数据数据预处理数据描述构建randomForestSRC模型评估模型C-indexBrier score特征重要性构建新的随机森林生存模型风险打分高低风险分组的生存分析时间依赖的ROC(Ti…...

三款计算服务器配置→如何选择科学计算服务器?

科学计算在众多领域都扮演着关键角色,无论是基础科学研究还是实际工程应用,强大的计算能力都是不可或缺的。而选择一台合适的科学计算服务器,对于确保科研和工作的顺利进行至关重要。 首先,明确自身需求是重中之重。要仔细考虑计算…...

Oracle 19c RAC删除多余的PDB的方式

文章目录 一、删除PDB并删除数据文件二、删除PDB并保留数据文件三、插拔PDB 一、删除PDB并删除数据文件 所删除的pdb必须是mount的状态才可以删除: #1、关闭pdb alter pluggable database pdb_name close immediate instancesall; #2、删除pdb以及数据文件 drop p…...

什么是云渲染?云渲染有什么用?一篇看懂云渲染意思

你知道云渲染是怎么回事吗? 其实就是把3D模型变成2D图像的过程,只不过这个过程是在云端完成的。我们在本地啥都不用做,只需要等结果就行。 现在云渲染主要有两种类型:一种是物理机房云渲染,另一种是服务器机房云渲染。…...

MATLAB中 exist函数用法

目录 语法 说明 示例 检查工作区变量是否存在 检查文件夹是否存在 检查 MATLAB 函数是否为内置函数 exist函数的功能是检查变量、脚本、函数、文件夹或类的存在情况。 语法 exist name exist name searchType A exist(___) 说明 exist name 以数字形式返回 name 的类…...

在银河麒麟系统中Qt连接达梦数据库

解决在银河麒麟系统中使用Qt连接达梦数据库提示:project Error library odbc is not defined问题 一、编译ODBC 下载解压unixODBC(http://www.unixodbc.org/unixODBC-2.3.1.tar.gz) 打开终端,切换到unixODBC-2.3.1目录下&#x…...

nodejs 服务器实现负载均衡

server.js const express require(express); const { createProxyMiddleware } require(http-proxy-middleware); const axios require(axios);const app express();// 定义后端服务列表 const services [{ target: http://localhost:3001 },{ target: http://localhost:…...

今日总结10.29

常见序列化协议有哪些 序列化(serialization)是将对象序列化为二进制形式(字节数组),一般也将序列化称为编码(Encode),主要用于网络传输、数据持久化等。常见的序列化协议包括以下几…...

使用 FastGPT 工作流实现 AI 赛博算卦,一键生成卦象图

最近那个男人写的汉语新解火遍了全网,那个男人叫李继刚,国内玩 AI 的同学如果不知道这个名字,可以去面壁思过了。 这个汉语新解的神奇之处就在于它只是一段几百字的提示词,效果却顶得上几千行代码写出来的应用程序。 这段提示词…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

简单介绍C++中 string与wstring

在C中&#xff0c;string和wstring是两种用于处理不同字符编码的字符串类型&#xff0c;分别基于char和wchar_t字符类型。以下是它们的详细说明和对比&#xff1a; 1. 基础定义 string 类型&#xff1a;std::string 字符类型&#xff1a;char&#xff08;通常为8位&#xff09…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时&#xff0c;未明确定义编译时特性标志。以下是详细解释和解决方案&#xff1a; ‌问题原因‌&#xff1a; 该标志是Vue 3.4引入的编译时特性标志&#xff0c;用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...