TR5 - Transformer的位置编码

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

目录

  • 前言
  • 什么是位置编码
    • 1. 定义
    • 2. 三角函数
    • 3. 位置编码公式
    • 4. 位置编码示例
  • 可视化理解位置编码
    • 1. 代码实现
    • 2. 观察不同位置对应的曲线
    • 3. 整句话的位置编码可视化
  • 总结与心得体会


前言

在NLP任务中,单词的序列顺序是非常重要的,将单词的顺序重新排列,整个句子的意思可能会发生改变。在RNN循环神经网络中,有着处理序列顺序的内置机制。Transformer通过引入位置编码机制来保存文本中字符的位置信息。

什么是位置编码

1. 定义

位置编码记录了文本中字符的位置信息,它并没有使用单个数字(例如索引值)的形式来记录位置信息。原因主要有:

  1. 对于长序列,索引的大小可能会变得很大,不利于存储。
  2. 将索引值规范化到0-1之间,可能会为可变长度序列带来问题(它们的标准化方式不同)。

Transformer使用智能位置编码方案,第个位置/索引都映射到了一个向量,所以位置编码层的输出明天是一个矩阵,其中矩阵的每一行代表序列中的一个编码对象与其位置信息相加。
将位置信息映射成向量

2. 三角函数

正弦函数的值域为[-1, 1],可以等效地使用正弦函数或余弦函数。
正弦、余弦波形

3. 位置编码公式

假设你有一个长度为L的输入序列,要计算第K个元素的位置编码,可以由不同频率的正弦和余弦函数给出:

P ( k , 2 i ) = s i n ( k n 2 i / d ) P(k, 2i) = sin(\frac k {n^{2i/d}}) P(k,2i)=sin(n2i/dk)

P ( k , 2 i + 1 ) = c o s ( k n 2 i / d ) P(k, 2i + 1) = cos(\frac k {n^{2i/d}}) P(k,2i+1)=cos(n2i/dk)

参数详解:

  • k k k: 对象(也就是句子中的字符)在输入序列中的位置, 0 < = k < L / 2 0<=k<L/2 0<=k<L/2
  • d d d: 输出嵌入空间的维度
  • P ( k , j ) P(k,j) P(k,j): 位置函数,用于映射输入序列中k处的元素到位置矩阵的 ( k , j ) (k, j) (k,j)
  • n n n: 用户定义的标量(论文中作者设置的是10000)
  • i i i: 用于映射到列索引, 0 < = i < d / 2 0<=i<d/2 0<=i<d/2,单个值i映射到正弦和余弦函数

4. 位置编码示例

以"I am a robot"为例,并且设置n=100, d=4,下面是过程,注意仅是位置编码,所以和具体的字符是无关的。使用"You are a doctor"计算完会得到一样的结果。
位置编码示例

可视化理解位置编码

1. 代码实现

import numpy as np
import matplotlib.pyplot as pltdef getPositionalEncoding(seq_len, d, n=10000):P = np.zeros((seq_len, d))for k in range(seq_len):for i in np.arange(int(d/2)):denominator = np.power(n, 2*i/d)P[k, 2*i] = np.sin(k/denominator)P[k, 2*i+1] = np.cos(k/denominator)return PP = getPositionalEncoding(4, 4)
print(P)

打印结果

[[ 0.          1.          0.          1.        ][ 0.84147098  0.54030231  0.00999983  0.99995   ][ 0.90929743 -0.41614684  0.01999867  0.99980001][ 0.14112001 -0.9899925   0.0299955   0.99955003]]

2. 观察不同位置对应的曲线

我们把d和n固定,只改变位置参数k,然后画出不同k对应的图像,观察他们之间的区别

def plotSinusoid(k, d=512, n=10000):x = np.arange(0, 100)denominator = np.power(n, 2*x/d)y = np.sin(k / denominator)plt.plot(x, y)plt.title('k = ' + str(k))fig = plt.figure(figsize=(15, 4))
for i in range(4):plt.subplot(1, 4, i + 1)plotSinusoid(i*4)

不同位置对应的函数曲线
从图中可以看出,每个位置的曲线都不相同,并且当 i i i固定时,对应的波长为

λ i = 2 π n 2 i / d \lambda_i = 2 \pi n^{2i/d} λi=2πn2i/d

因此,正弦曲线的波长形成几何函数。位置编码方案具有许多优点:

  • 正弦和余弦函数的值在[-1,1]内,这使位置编码矩阵的值保持在归一化范围内
  • 由于每个位置的正弦曲线都不同,因此你可以采用独特的方式对每个位置进行编码
  • 有一种方法可以测量或量化不同位置之间的相似性,从而使你能够对单词的相对位置进行编码

3. 整句话的位置编码可视化

P = getPositionalEncoding(100, 512)
cax = plt.matshow(P)
plt.gcf().colorbar(cax)

整句话的位置编码
transformer中的位置编码层把位置向量和单词编码相加,并输入到后续的层。
位置向量的流动

总结与心得体会

之前看过一些资料说Transformer中的位置编码,但是没有直观的概念一直只停留在利用正弦和余弦曲线进行编码。经过本次学习对编码的过程和原理有了一个形象的概念。通过对位置编码的学习,我感觉它很像傅里叶变换中的一些东西,所以虽然已经身处于深度学习阶段,传统的机器学习方法,甚至是基本的数学方法,仍然能提供一些思路,并解决一些问题,并不能放松对传统方法的学习。

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

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

相关文章

排序 “贰” 之选择排序

目录 ​编辑 1. 选择排序基本思想 2. 直接选择排序 2.1 实现步骤 2.2 代码示例 2.3 直接选择排序的特性总结 3. 堆排序 3.1 实现步骤 3.2 代码示例 3.3 堆排序的特性总结 1. 选择排序基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个…

Guitar Pro简谱输入方法 Guitar Pro简谱音高怎么调整,Guitar Pro功能介绍

一、新版本特性概览 Guitar Pro v8.1.1 Build 17在保留了前版本强大功能的基础上&#xff0c;进一步优化了用户体验和功能性能。新版本主要更新包括以下几个方面&#xff1a; 界面优化&#xff1a;新版界面更加简洁美观&#xff0c;操作更加便捷&#xff0c;即使是初学者也能快…

在线拍卖系统,基于SpringBoot+Vue+MySql开发的在线拍卖系统设计和实现

目录 一. 系统介绍 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 前台首页功能模块 2.4. 部分代码实现 一. 系统介绍 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系…

Docker - 简介

原文地址&#xff0c;使用效果更佳&#xff01; Docker - 简介 | CoderMast编程桅杆https://www.codermast.com/dev-tools/docker/docker-introduce.html Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 D…

vulfocus靶场couchdb 权限绕过 (CVE-2017-12635)

Apache CouchDB是一个开源数据库&#xff0c;专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式&#xff0c;JavaScript作为查询语言&#xff0c;MapReduce和HTTP作为API的NoSQL数据库。应用广泛&#xff0c;如BBC用在其动态内容展示平台&…

串口RS485

1.原理 全双工&#xff1a;在同一时刻可以同时进行数据的接收和数据的发送&#xff0c;两者互不影响 半双工&#xff1a;在同一时刻只能进行数据的接收或者数据的发送&#xff0c;两者不能同时进行 差分信号幅值相同&#xff0c;相位相反&#xff0c;有更强的抗干扰能力。 干…

vlan的学习笔记1

vlan&#xff1a; 1.一般情况下:以下概念意思等同: 一个vlan一个广播域 一个网段 一个子网 2.一般情况下: &#xff08;1&#xff09;相同vlan之间可以直接通信&#xff0c;不同vlan之间不能直接通信! &#xff08;2&#xff09;vlan技术属于二层技术&…

C语言中, 文件包含处理,#include< > 与 #include ““的区别

文件包含处理 指一个源文件可以将另外一个文件的全部内容包含进来 &#xff23;语言提供了#include命令用来实现文件包含的操作 #include< > 与 #include ""的区别 <> 表示系统直接按系统指定的目录检索 "" 表示系统先在 "" 指定…

Rust序列化和反序列化

Rust 编写python 模块 必备库 docker 启动 nginx 服务 NGINX 反向代理配置

MySQL下载与安装

文章目录 1&#xff1a;MySQL下载与安装2&#xff1a;配置环境变量3&#xff1a;验证是否安装成功 1&#xff1a;MySQL下载与安装 打开MySQL官网&#xff0c;MySQL 下载链接选择合适的版本和操作系统&#xff0c;页面跳转之后选择No thanks, just start my download.等待下载即…

linux中/etc/hosts文件的内容和功能

更准确的说是主机和ip地址映射绑定配置文件 用于主机名解析成ip地址的 转换配置 效果&#xff1a; 这个东西是局域网下面的解析&#xff0c;老师说是本地局域网解析 windows对应的就是

笔试狂刷--Day2(模拟高精度算法)

大家好,我是LvZi,今天带来笔试狂刷--Day2(模拟高精度算法) 一.二进制求和 题目链接:二进制求和 分析: 代码实现: class Solution {public String addBinary(String a, String b) {int c1 a.length() - 1, c2 b.length() - 1, t 0;StringBuffer ret new StringBuffer()…

4.9 启动系统任务❤❤❤

有一些特殊的任务需要在系统启动时执行&#xff0c;例如配置文件加载、数据库初始化等操作。 Spring Boot对此提供了两种解决方案&#xff1a;CommandLineRunner和ApplicationRunner。 CommandLineRunner和ApplicationRunner基本一致&#xff0c;差别主要体现在参数上。 1. Co…

FastChat启动与部署通义千问大模型

FastChat简介 FastChat is an open platform for training, serving, and evaluating large language model based chatbots. FastChat powers Chatbot Arena, serving over 10 million chat requests for 70 LLMs.Chatbot Arena has collected over 500K human votes from sid…

[SWPUCTF 2022 新生赛]android

安卓题第一次写 先解压&#xff0c;改apk后缀为zip再次解压用dex2jar反编译得到jar文件&#xff0c;再用jd-gui查看即可得到flag

AI大模型日报#0418:Stable Diffusion 3开放API、Meta新研究让AI Agent理解物理世界

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 微软刚发布了VASA-1 这个人工智能可以让单张图像具有生动的说话和歌唱能力 摘要: 微软发布了VASA-1人工智能&#xff0c;它能使单…

Webstorm 24.1 复制、剪切卡死问题官方回复

Webstorm 24.1 复制、剪切卡死问题官方回复 https://youtrack.jetbrains.com/issue/WEB-65787/WebStorm-2024.1-UI-was-frozen-for-N-ms-after-copy-paste 2024-04-20 更新&#xff1a; UI 卡死问题已于 2024-04-20。发布的 24.1.1 版本解决

Spark集群的搭建

1.1搭建Spark集群 Spark集群环境可分为单机版环境、单机伪分布式环境和完全分布式环境。本节任务是学习如何搭建不同模式的Spark集群&#xff0c;并查看Spark的服务监控。读者可从官网下载Spark安装包&#xff0c;本文使用的是spark-2.0.0-bin-hadoop2.7.gz。 1.1.1搭建单机版…

Linux——进程基本概念中篇

Linux——进程基本概念中篇 文章目录 Linux——进程基本概念中篇一、通过系统调用创建进程——fork1.1 fork的理解1.2 fork的返回值 二、进程状态2.1 运行状态2.2 睡眠状态和休眠状态2.3 停止状态和死亡状态2.4 僵尸进程2.5 孤儿进程2.6 前台和后台进程 三、进程优先级3.1 查看…

一文读懂Partisia Blockhain:兼顾去中心化、安全性与可扩展性

“Partisia Blockhain 解决了区块链领域长期存在的问题&#xff0c;其兼顾了去中心化、安全性以及可扩展性” Partisia Blockchain 是一个具有独特零知识证明预言机以及分片解决方案的 Layer1&#xff0c;解决了困扰整个区块链行业的问题。 目前&#xff0c;多样化的区块链层出…