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://xiahunao.cn/news/2978708.html

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

相关文章

ffmpeg支持MP3编码的方法

目录 现象 解决办法 如果有编译包没有链接上的情况 现象 解决办法 在ffmpeg安装包目录下 &#xff0c;通过./configure --list-encoders 和 ./configure --list-decoders 命令可以看到&#xff0c;ffmpeg只支持mp3解码&#xff0c;但是不支持mp3编码。 上网查寻后发现&…

新的全息技术突破计算障碍

一种突破性的方法利用基于Lohmann透镜的衍射模型实时创建计算机生成全息图&#xff08;CGH&#xff09;&#xff0c;在保持3D可视化质量的同时&#xff0c;大大降低了计算负荷要求。 全息显示为制作逼真的三维图像提供了一条令人兴奋的途径&#xff0c;这种图像给人以连续深度…

【WEB前端2024】开源元宇宙:乔布斯3D纪念馆-第9课-摆件美化

【WEB前端2024】开源元宇宙&#xff1a;乔布斯3D纪念馆-第9课-摆件美化 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&#…

合合信息Embedding模型:引领中文文本向量化技术新高度

目录 &#x1f345;前言&#x1f353;赛事含金量&#x1f353;Embedding技术简介&#x1f353;Embedding在大模型中的价值&#x1f353;合合信息Embedding模型特点及优势&#x1f353;合合信息Embedding模型测试&#x1f353;技术突破&#x1f353;公司介绍 &#x1f345;总结 …

Matplotlib官网查阅资料

Matplotlib官网详细的地址&#xff1a; 英文文档&#xff1a;https://matplotlib.org/stable/contents.html中文文档&#xff1a;https://www.matplotlib.org.cn/ Matplotlib英文官网: 查找属性&#xff1a; 1.进入官网。 2.查找参数属性。 Matplotlib中文官网: 查找属性:…

光纤、以太网电缆和 DSL 的比较:技术指南

了解光纤、以太网电缆和 DSL 之间的差异对于做出有关互联网连接的明智决策至关重要。本技术指南对这些技术进行了全面比较&#xff0c;讨论了它们的独特功能、性能指标和应用。它旨在为您提供必要的知识&#xff0c;以选择最适合您的特定需求的选项。 光纤、以太网电缆和 DSL …

Qwen1.5微调

引子 由于工作上需要&#xff0c;一直在用Qwen做大模型推理&#xff0c;有个再训练的需求&#xff0c;特此琢磨下Qwen的训练。OK&#xff0c;我们开始吧。 一、安装环境 查看显卡驱动版本 根据官网推荐 OK&#xff0c;docker在手&#xff0c;天下我有。 docker pull qwenll…

Recommended Azure Monitors

General This document describes the recommended Azure monitors which can be implemented in Azure cloud application subscriptions. SMT incident priority mapping The priority “Blocker” is mostly used by Developers to prioritize their tasks and its not a…

论文辅助笔记:处理geolife数据

论文笔记&#xff1a;Context-aware multi-head self-attentional neural network model fornext location prediction-CSDN博客 对应命令行里 python preprocessing/geolife.py 20 这一句 1 读取geolife数据 pfs, _ read_geolife(config["raw_geolife"], print_…

Spring的过滤器、拦截器、切面区别及案例分析

Spring的过滤器、拦截器、切面 三者的区别&#xff0c;以及对应案例分析 一、三者的实现方式 1.1 过滤器 xxxFilter 过滤器的配置比较简单&#xff0c;直接实现Filter接口即可&#xff0c;也可以通过WebFilter注解实现对特定URL的拦截&#xff0c;Filter接口中定义了三个方法…

工作记录:vue-grid-layout 修改 margin 导致 item 高度剧烈变化

问题 用 vue-gird-layout 时发现&#xff0c;当改变 margin 值时&#xff0c;item 的尺寸也会跟着变化。 如下图&#xff1a;row height 和每个 item 的 h 都保持不变。修改 margin-y&#xff0c;item 的实际高度也跟着变了&#xff1a; 原因 研究了一番&#xff0c;发现原…

如何查看全球历史影像

目录 示例 2024年3月28日 2022年9月21日 2021年11月3日 2020年11月18日 2019年5月15日 2017年2月27日 2016年12月20日 如何在ArcGIS中加载 如何查看全球历史影像&#xff0c;今天给大家分享一个可以在线直接访问查看全球历史影像的网站&#xff08;网址见文末&#xf…

flutter 设置启屏页 flutter_native_splash 坑记录

flutter_native_splash | Flutter packageCustomize Flutters default white native splash screen with background color and splash image. Supports dark mode, full screen, and more.https://pub.dev/packages/flutter_native_splash 发现一直白屏 原因是 代码中 下面…

前端路由的实现原理

当谈到前端路由时&#xff0c;指的是在前端应用中管理页面导航和URL的机制。前端路由使得单页应用&#xff08;Single-Page Application&#xff0c;SPA&#xff09;能够在用户与应用交互时动态地加载不同的视图&#xff0c;而无需每次都重新加载整个页面。 在前端开发中&…

vue3+elementui-plus实现无限递归菜单

效果图 实现方式是&#xff1a;通过给定的数据结构层数来动态生成多级菜单 menu.vue<template><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"background-color"#f8f…

Echarts的饼图有哪些配置项,一文告诉你。

Echarts中的饼图&#xff08;Pie Chart&#xff09;有以下一些常用的配置项&#xff1a; 配置项一 Echarts中的饼图&#xff08;Pie Chart&#xff09;有以下一些常用的配置项&#xff1a; title&#xff1a;饼图的标题配置&#xff0c;包括text&#xff08;标题文本&#xf…

冈萨雷斯数字图像处理资源(课后习题答案+代码+图片)

冈萨雷斯数字图像处理相关资源整理&#xff0c;资源全部来源互联网&#xff0c;方便大家下载 冈萨雷斯数字图像处理相关资源整理 课后习题 冈萨雷斯数字图像处理源代码

程序猿成长之路之数据挖掘篇——朴素贝叶斯

朴素贝叶斯是数据挖掘分类的基础&#xff0c;本篇文章将介绍一下朴素贝叶斯算法 情景再现 以挑选西瓜为例&#xff0c;西瓜的色泽、瓜蒂、敲响声音、触感、脐部等特征都会影响到西瓜的好坏。那么我们怎么样可以挑选出一个好的西瓜呢&#xff1f; 分析过程 既然挑选西瓜有多个…

静态缺省路由的应用

静态缺省路由的应用 缺省路由是目的地址全零的特殊路由&#xff0c;可以由路由协议自动生成&#xff0c;也可以由手动配置。手动配置缺省路由&#xff0c;可以简化网络的配置&#xff0c;称为静态缺省路由。如果报文的目的地址无法匹配路由表中的任何一项&#xff0c;路由器将…

查看项目go代码cpu利用率

1.代码添加&#xff1a; "net/http"_ "net/http/pprof"第二步&#xff0c;在代码开始运行的地方加上go func() {log.Println(http.ListenAndServe(":6060", nil))}() 2.服务器上防火墙把6060打开 3.电脑安装&#xff1a;Download | Graphviz …