【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Positional Encoding(一)

在这里插入图片描述

🤵‍♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

在这里插入图片描述

作者: 计算机魔术师
版本: 1.0 ( 2023.10.15 )

摘要: 本系列旨在普及那些深度学习路上必经的核心概念,文章内容都是博主用心学习收集所写,欢迎大家三联支持!本系列会一直更新,核心概念系列会一直更新!欢迎大家订阅

该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]

Transformer

注意力(Attention)机制由Bengio团队与2014年提出并在近年广泛的应用在深度学习中的各个领域,例如在计算机视觉方向用于捕捉图像上的感受野,或者NLP中用于定位关键token或者特征。谷歌团队近期提出的用于生成词向量的BERT算法在NLP的11项任务中取得了效果的大幅提升,堪称2018年深度学习领域最振奋人心的消息。而BERT算法的最重要的部分便是本文中提出的Transformer的概念。

在这里插入图片描述

背景和动机

作者采用Attention机制的原因是考虑到RNN(或者LSTM,GRU等)的计算限制为是顺序的,也就是说RNN相关算法只能从左向右依次计算或者从右向左依次计算,这种机制带来了两个问题:

  1. 时间片 t 的计算依赖 t−1 时刻的计算结果,这样限制了模型的并行能力

  2. 传统的序列模型(如循环神经网络)存在着长期依赖问题,难以捕捉长距离的依赖关系。顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。故提出了用CNN来代替RNN的解决方法(平行化)。

    在这里插入图片描述

    长期依赖关系见笔记本 [classical concept.md](classical concept.md)

  3. 但是卷积神经网络只能感受到部分的感受野,需要多层叠加才能感受整个图像,而transformer注意力机制可以一层感受到全部序列,并提出了 Multi-Head Attention 实现和卷积网络多个输出识别不同模式的效果 ,故提出了自注意力机制

我们下面的内容依次按照模型的顺序讲解,首先讲解Positional Encoding,在讲解自注意力机制和多头注意力机制,再到全连接和跳跃连接

Positional Encoding

由于 Transformer 模型没有显式的顺序信息(没有循环神经网络的迭代操作),为了保留输入序列的位置信息&顺序关系,需要引入位置编码。位置编码是一种向输入嵌入中添加的特殊向量(不被训练的),用于表示单词或标记在序列中的位置。

相比起直接 concatenate ,直接相加似乎看起来会被糅合在输入中似乎位置信息会被擦除,我们可以假设concatenate 一个独热向量p_i , 代表其位置信息,

在这里插入图片描述

如图所示,最后也可以看为二者相加,但是此时的e^i 的权重W_P是可以被learn的 WP,根据研究表明这个WP learn 有人做过了在convolution中seq to seq中类似的学习参数做法效果并不是很好,还有说其实会添加很多的不必要的参数学习等(issue地址:https://github.com/tensorflow/tensor2tensor/issues/1591,https://datascience.stackexchange.com/questions/55901/in-a-transformer-model-why-does-one-sum-positional-encoding-to-the-embedding-ra 不过我觉得实验才是真理,但似乎目前我还没有看到相关实验,如果有请在评论区留言!!),所以有一个人手设置的非常奇怪的式子产生确定WP (其中WP 绘图如图所示)

在这里插入图片描述

Transformer 模型一般以为单位训练,论文中使用了 sin(罪) 和 cos 函数的线性变换来提供给模型位置信息.

理想情况下,信息编码(piece of information)的设计应该满足以下条件:

  • 它应该为每个字(时间步)输出唯一的编码
  • 不同长度的句子之间,任何两个字(时间步)之间的差值应该保持一致
  • 我们的模型应该无需任何努力就能推广到更长的句子。它的值应该是有界的。
  • 它必须是确定性的

在Transformer中,位置编码器的函数可以由以下公式表示:

P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i)} = \sin\left(\frac{{pos}}{{10000^{2i/d_{\text{model}}}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)

P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i+1)} = \cos\left(\frac{{pos}}{{10000^{2i/d_{\text{model}}}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)

其中, p o s pos pos表示输入序列中的位置, i i i表示位置编码中的维度索引, d model d_{\text{model}} dmodel表示Transformer模型的隐藏单元大小。

您可能想知道正弦和余弦的这种组合如何表示位置 / 顺序?其实很简单,假设你想用二进制格式来表示一个数字,会怎样可以发现不同位之间的变化,在每个数字上交替,第二低位在每两个数字上轮换,依此类推。但在浮点数世界中使用二进制值会浪费空间。因此,我们可以使用它们的浮点连续对应物 - 正弦函数。事实上,它们相当于交替位。

这个公式中的分数部分将位置 p o s pos pos进行了缩放,并使用不同的频率( 1000 0 2 i / d model 10000^{2i/d_{\text{model}}} 100002i/dmodel)来控制不同维度的变化速度。这样,不同位置和不同维度的位置编码会得到不同的数值,形成一个独特的向量表示

在这里插入图片描述

正弦位置编码的另一个特点是它允许模型毫不费力地关注相对位置。以下是原论文的引用:

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+k can be represented as a linear function of PEpos.

https://kazemnejad.com/blog/transformer_architecture_positional_encoding/ 这篇文章就很好的讲解了,这是因为其实这个添加的位置offset可以通过PEpos本身dot product 一个矩阵M得到对应offset后的结果PEpos+k(相当于线性变换,独立于时间变量t)
在这里插入图片描述

总结来看:位置编码器采用正弦和余弦函数的函数形式是为了满足一些重要特性,以便在Transformer模型中有效地表示位置信息。

  1. 周期性: 使用正弦和余弦函数能够使位置编码具有周期性。使得位置编码的值在每个维度上循环变化。这对于表示序列中的不同位置非常重要,因为不同位置之间可能存在重要的依赖关系。
  2. 连续性: 正弦和余弦函数在输入空间中是连续的。这意味着相邻位置之间的位置编码也是连续的,有助于保持输入序列中的顺序信息的连贯性。
  3. 维度关联: 位置编码中的维度与Transformer模型的隐藏单元大小相关联。这意味着不同维度的位置编码会以不同的频率变化,从而能够捕捉不同尺度的位置信息。较低维度的位置编码可以更好地表示较短距离的依赖关系,而较高维度的位置编码可以更好地表示较长距离的依赖关系。

在这里插入图片描述

						  🤞到这里,如果还有什么疑问🤞🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

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

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

相关文章

SpringBoot面试题4:Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个? Spring Boot支持多种日志框架,包括以下几种: Logback:Logback 是一个快速、灵活…

Windows10不常用操作(录屏、开启超级管理员、关闭自动IP配置、Edge崩溃等)

Win10家庭版开启超级管理员 Win10家庭版开启或禁用超级管理员账户步骤如下: 在搜索框中输入CMD,右键以管理员方式运行。 开启 net user administrator /active:yes禁用 net user administrator /active:no Win10关闭自动IP配置 win10设置完静态ip&am…

Nlopt在matlab中的配置教程

step1:克隆代码并编译 编译的前提是已经安装好MinGW64 # 使用镜像加速 git clone https://gitclone.com/github.com/stevengj/nloptcd nlopt mkdir build cd build cmake -G"MinGW Makefiles" .. cmake --build .# 注意此处博主在mingw安装目录将mingw3…

iPhone 如何强制重启

参考iPhone的官方使用手册 传送门 尤其当 iPhone 未响应,也无法将其关机再开机,此方法最有效: 按住调高音量按钮,然后快速松开。按住调低音量按钮,然后快速松开。按住侧边按钮。当 Apple 标志出现时,松开侧…

探索低代码技术

低/无代码的高速发展,属于软件市场的选择,相较于传统编写代码的开发方式,低/无代码开发效率高、投入成本低、技术门槛也更低,未来更多软件应用将使用低/无代码技术完成,这也是趋势。 身为开发人员经常需要花大量时间在…

平台系统老板驾驶舱的重要性,我选云表

平台系统老板驾驶舱的重要性在于它是一个集成的管理和分析工具,能够提供对平台系统运行情况的全面和实时的监控、分析和管理功能。以下是平台系统老板驾驶舱的重要性: 老板驾驶舱 该表单可供老板实时把控企业运营情况,包括销售业绩、…

Linux高性能服务器编程 学习笔记 第十四章 进程池和线程池

动态创建子进程或子线程的缺点: 1.动态创建进程或线程比较耗时,这将导致较慢的客户响应。 2.动态创建的子进程或子线程通常只用来为一个客户服务(除非我们做特殊处理),这将导致系统上产生大量的进程或线程&#xff0c…

云原生场景下高可用架构的最佳实践

作者:刘佳旭(花名:佳旭),阿里云容器服务技术专家 引言 随着云原生技术的快速发展以及在企业 IT 领域的深入应用,云原生场景下的高可用架构,对于企业服务的可用性、稳定性、安全性越发重要。通…

3.DApp-Metamask登录不了解决方法

题记 当遇到metamask登录不了,加载一直转圈圈,可以用以下的方法解决。 切换网络 切换成Linea Mainnet测试网络: 输入密码 输入登录密码登录metamask 重新选择自定义网络 选择自己本地自定义的网络: 后记 觉得有用可以收藏或点…

kong网关从入门到放弃

Kong网关是一个轻量级、快速、灵活的云名称API网关。Kong Gateway位于您的服务应用程序前面,可动态控制、分析和路由请求和响应。KongGateway通过使用灵活、低代码、基于插件的方法来实现您的API流量策略。 https://docs.konghq.com/gateway/latest/#features 架构…

Redis删除过期key策略

文章目录 前言Redis中key的的过期时间在创建 key 时使用 EXPIRE 命令设置过期时间(秒级)使用 EXPIREAT 命令设置一个精确的过期时间(unix 时间戳)使用 PEXPIRE 命令设置过期时间(毫秒级)使用 PEXPIREAT 命令设置毫秒级精确过期时间在 Redis 配置文件中设置所有 key 的默认过期时…

git log 美化配置

编辑 vim ~/.gitconfig 添加配置 [alias]lg log --graph --abbrev-commit --decorate --dateformat:%m-%d %H:%M:%S --formatformat:%C(bold blue)%h%C(reset) - %s %C(bold yellow)% d%C(reset) %n %C(dim white) (%ad) - %an%C(reset) --allgit lg 效果

docker-machine常用

docker-machine常用 什么是Docker Machine?Docker Machine默认支持的驱动安装kvm驱动 安装和配置Docker Machine环境准备node1安装Dockernode1安装Docker Machine为Docker Machine安装自动补全为Docker Machine准备boot2docker.iso镜像为node2创建machine主机 管理远…

全天在线的健康小助手,dido E55S Pro智能手表体验

如今只需要借助一块具有健康监测功能的智能手表,我们就可以轻松记录自己的日常健康数据,像是心率、血压和血氧等,通过每天规律性评估,我们可以及时发现身体的一些变化,排除一些潜在的健康隐患。最近我尝试了一款国产的…

AUTOSAR组织发布20周年纪念册,东软睿驰NeuSAR列入成功案例

近日,AUTOSAR组织在成立20周年之际发布20周年官方纪念册(20th Anniversary Brochure),记录了AUTOSAR组织从成立到今天的故事、汽车行业当前和未来的发展以及AUTOSAR 伙伴关系和合作在重塑汽车方面的作用。东软睿驰提报的基于AUTOS…

【计算机网络笔记】数据交换之报文交换和分组交换

系列文章目录报文交换分组交换存储-转发报文交换 vs 分组交换总结 系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 报文交换 报文:源(应用)发送的信息整体。比如一个文件、一…

LeetCode【74】搜索二维矩阵

题目&#xff1a; 代码&#xff1a; public static boolean searchMatrix(int[][] matrix, int target) {int rows matrix.length;int columns matrix[0].length;// 先找到行&#xff0c;行为当前行第一列<target&#xff0c;当前行1行&#xff0c;第一列>targetfor…

45.复购率问题求解

思路分析&#xff1a; &#xff08;1&#xff09;近xx天&#xff0c;最大日期肯定就是最新的一天&#xff0c;故先用max(order_date) over() today计算当天日期 &#xff08;2&#xff09;过滤出最近90天的订单并且按照user_id,product_id分组求购买次数&#xff1b; &#xff…

vim工具的使用

目录 vi/vim键盘图 1、vim的基本概念 2、vim的基本使用 3、vim命令模式命令集 4、vim底行模式命令集 5、参考资料 vi/vim键盘图 1、vim的基本概念 vi和vim的区别&#xff1a;vi和vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi…

QT 串口编程 QSerialPort

//创建串口对象QSerialPort s new QSerialPort("/dev/ttySAC2", this);//配置串口信息s->setBaudRate(QSerialPort::Baud9600);//波特率s->setDataBits(QSerialPort::Data8);//数据位s->setStopBits(QSerialPort::OneStop);//奇偶校验s->setParity(QSer…