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

67 自注意力_by《李沐:动手学深度学习v2》pytorch版

系列文章目录


文章目录

  • 系列文章目录
  • 自注意力
  • 位置编码
  • 总结
    • 小结
    • 练习


自注意力

给定一个由词元组成的输入序列 x 1 , … , x n \mathbf{x}_1, \ldots, \mathbf{x}_n x1,,xn,其中任意 x i ∈ R d \mathbf{x}_i \in \mathbb{R}^d xiRd 1 ≤ i ≤ n 1 \leq i \leq n 1in)。自注意力池化层将 x i x_i xi当作key,value,query来对序列抽取特征(该序列的自注意力输出为一个长度相同的序列)得到 y 1 , … , y n \mathbf{y}_1, \ldots, \mathbf{y}_n y1,,yn,其中:

y i = f ( x i , ( x 1 , x 1 ) , … , ( x n , x n ) ) ∈ R d \mathbf{y}_i = f(\mathbf{x}_i, (\mathbf{x}_1, \mathbf{x}_1), \ldots, (\mathbf{x}_n, \mathbf{x}_n)) \in \mathbb{R}^d yi=f(xi,(x1,x1),,(xn,xn))Rd

在这里插入图片描述
相当于给定一个序列,我可以根据序列中一个词,给定一个输出。

位置编码

🏷subsec_positional-encoding

在处理词元序列时,循环神经网络是逐个的重复地处理词元的,而自注意力则因为并行计算而放弃了顺序操作。根CNN/RNN不同,自注意力并没有记录位置信息,我只是计算q和k,其实先q与哪个k都没有区别。而如果在模型中加入位置信息,会减少并行性,或者计算量。
为了使用序列的顺序信息,通过在输入表示中添加位置编码(positional encoding)来注入绝对的或相对的位置信息到输入里。
位置编码可以通过学习得到也可以直接固定得到。接下来描述的是基于正弦函数和余弦函数的固定位置编码
:cite:Vaswani.Shazeer.Parmar.ea.2017

假设输入表示 X ∈ R n × d \mathbf{X} \in \mathbb{R}^{n \times d} XRn×d包含一个序列中 n n n个词元的 d d d维嵌入表示。那么位置编码使用相同形状的位置嵌入矩阵 P ∈ R n × d \mathbf{P} \in \mathbb{R}^{n \times d} PRn×d输出 X + P \mathbf{X} + \mathbf{P} X+P,来作为自编码输入,矩阵第 i i i行、第 2 j 2j 2j列和 2 j + 1 2j+1 2j+1列上的元素为:

p i , 2 j = sin ⁡ ( i 1000 0 2 j / d ) , p i , 2 j + 1 = cos ⁡ ( i 1000 0 2 j / d ) . \begin{aligned} p_{i, 2j} &= \sin\left(\frac{i}{10000^{2j/d}}\right),\\p_{i, 2j+1} &= \cos\left(\frac{i}{10000^{2j/d}}\right).\end{aligned} pi,2jpi,2j+1=sin(100002j/di),=cos(100002j/di).
:eqlabel:eq_positional-encoding-def

知道下面类的作用是生成 P P P即可

class PositionalEncoding(nn.Module):"""位置编码"""def __init__(self, num_hiddens, dropout, max_len=1000):super(PositionalEncoding, self).__init__()self.dropout = nn.Dropout(dropout)# 创建一个足够长的Pself.P = torch.zeros((1, max_len, num_hiddens))X = torch.arange(max_len, dtype=torch.float32).reshape(-1, 1) / torch.pow(10000, torch.arange(0, num_hiddens, 2, dtype=torch.float32) / num_hiddens)self.P[:, :, 0::2] = torch.sin(X)self.P[:, :, 1::2] = torch.cos(X)def forward(self, X):X = X + self.P[:, :X.shape[1], :].to(X.device)return self.dropout(X) # 防止模型对P太过于敏感

总结

  1. 自注意力池化层将x当做key,value,query来对序列抽取特征
  2. 完全并行、最长序列为1、但对长序列计算复杂度高
  3. 位置编码在输入中加入位置信息,使得自注意力能够记忆位置信息

小结

  • 在自注意力中,查询、键和值都来自同一组输入。
  • 卷积神经网络和自注意力都拥有并行计算的优势,而且自注意力的最大路径长度最短。但是因为其计算复杂度是关于序列长度的二次方,所以在很长的序列中计算会非常慢。
  • 为了使用序列的顺序信息,可以通过在输入表示中添加位置编码,来注入绝对的或相对的位置信息。

练习

  1. 假设设计一个深度架构,通过堆叠基于位置编码的自注意力层来表示序列。可能会存在什么问题?
  2. 请设计一种可学习的位置编码方法。

相关文章:

  • 【GAN 图像生成】
  • 【Python】Python多行输入储存为字典,值为列表
  • ServiceEntry WorkloadEntry WorkloadGroup
  • 《十年国庆游,洞察中国旅游新趋势》
  • GraphRAG
  • 模糊测试SFuzz亮相第32届中国国际信息通信展览会
  • 帆软下拉框设置
  • MySql的慢查询(慢日志)
  • 【Echarts地图开发全流程加全套代码】
  • AI时代,程序员会被取代吗?
  • [算法日常] 分层图最短路
  • mock方法内容的匿名方法
  • 关于HTML 案例_个人简历展示02
  • 动手学深度学习(李沐)PyTorch 第 3 章 线性神经网络
  • Jmeter的使用方法
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • css布局,左右固定中间自适应实现
  • IDEA 插件开发入门教程
  • Java,console输出实时的转向GUI textbox
  • Less 日常用法
  • mac修复ab及siege安装
  • node 版本过低
  • Redis 中的布隆过滤器
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue.js源码(2):初探List Rendering
  • Vue学习第二天
  • 翻译:Hystrix - How To Use
  • 服务器之间,相同帐号,实现免密钥登录
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 力扣(LeetCode)357
  • 前端学习笔记之观察者模式
  • 前端自动化解决方案
  • 嵌入式文件系统
  • 使用agvtool更改app version/build
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 应用生命周期终极 DevOps 工具包
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #pragma once与条件编译
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (rabbitmq的高级特性)消息可靠性
  • (二)JAVA使用POI操作excel
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • 、写入Shellcode到注册表上线
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • .net专家(张羿专栏)
  • /3GB和/USERVA开关
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?