首页 > 其他分享 >李沐大佬-动手学深度学习笔记-注意力机制

李沐大佬-动手学深度学习笔记-注意力机制

时间:2024-11-19 22:44:09浏览次数:1  
标签:输出 笔记 解码器 value key 李沐 query 大佬 注意力

注意力机制(显示考虑随意线索)
随意线索:查询query
每个输入是一个value和不随意线索key的对
通过注意力池化层偏向性选择某些输入

历史演变:

  • 非参注意力池化层:60年代提的Nadaraya-Watson核回归,类似于knn
  • 如果使用高斯核,fx 函数类似于softmax和y(y是一个value)的乘积
  • 参数化注意力机制:在这基础上引入可以学习的w(w是个标量),就是在softmax里面加入w

批量矩阵乘法:torch.bmm

注意力分数(query和key的相似度)

  • 回顾:注意力分数是softmax里面的函数a,和softmax一起整体就是注意力权重alpha(大于等于0,加起来等于1,是分数的softmax结果)
  • 讨论注意力分数函数a:
    1)Additive Attention(加性注意力):等价于将key和query合并起来放入到一个隐藏大小为h输出大小为1的单隐藏层MLP,好处是key、value、query可以是任意长度
    2) Scaled Dot-Product Attention(缩放点积注意力):query和key都是同样长度,q和ki作内积再除以根号d,d是query的维度,d的作用是使得对参数不那么敏感(如果下一次输入很长,计算的注意力分数a会很大)
  • 代码实现时注意:
    遮蔽softmax(masked_softmax):invalid数要设置为很小:1e-6,不能是0,为了解决padding后只考虑valid的值

使用注意力机制的seq2seq

  • 加入注意力:
    1)编码器对每次词的输出作为key和value(它们是一样的,就是每次rnn最后的输出)
    2)解码器rnn对上一个词的预测输出是query
    3)注意力输出和下一个词的词嵌入合并进入rnn
  • Seq2seq中通过隐状态在编码器和解码器中传递信息
  • 注意力机制根据解码器rnn的输出匹配合适的编码器rnn输出更有效的传递信息(如何更有效的使用encode的信息)

延伸:图像attention:会去扣patch,扣很多子图出来,一个子图就是一个key-value

自注意力和位置编码
自注意力:

  • 自注意力池化层将xi当作key、value、query来对序列抽取得到y1,…,yn
  • 自注意力适合很长的序列,因为能看的比较长,最长路径是o(1)
  • 完全并行、最长序列为1、但对长序列计算复杂度高
    位置编码:
  • 跟CNN/RNN不同,自注意力并没有记录位置信息
  • 位置编码将位置信息注入到输入里(假设序列是X,使用位置编码矩阵P来输出X+P作为自编码输入,P有点类似于计算机二进制编码,使用sin、cos函数,表示相对位置-类似于旋转投影线性变换),使得自注意力能够记忆位置信息

self-attention就是一个layer(网络层)

Transformer
架构:

  • 基于编码器-解码器架构处理序列对
  • 与使用注意力的seq2seq不同,Transformer是纯基于注意力(注意力是类似于self-attention)
    多头注意力:
  • 对同一key、value、query,希望抽取不同的信息:例如使用短距离关系和长距离关系
  • 多头注意力使用h个独立的注意力池化:合并各head输出得到最终输出
    有掩码的多头注意力:
  • 解码器对序列中一个元素输出时,不应考虑该元素之后的元素
  • 可以通过掩码来实现,即设置valid长度
    基于位置的前馈网络:
  • 将输入形状由(b,n,d)变换成(bn,d)
  • 作用2个全连接层
  • 输出形状由(bn,d)变化回(b,n,d)
  • 等价于2层和窗口为1的1维卷积层
    残差和层归一化:
  • 残差为了做很深
  • 批量归一化对特征/通道里元素进行归一化:不适合序列长度会变的nlp应用
  • 层归一化对每个样本里的元素进行归一化
    信息传递:
  • 将编码器中输出y1,…,yn作为解码器中第I个Tranformer块中多头注意力的key和value:它的query来自目标序列
  • 意味着编码器和解码器中块的个数和输出维度都是一样的
    预测:
  • 预测第t+1个输出时,解码器中输入前t个预测值
  • 在自注意力中,前t个预测值作为key和value,第t个预测值还作为query
    总结:
  • Tranformer是一个纯使用注意力的编码-解码器
  • 编码器和解码器都有n个Transformer块
  • 每个块里使用多头(自)注意力,基于位置的前馈网络和层归一化

标签:输出,笔记,解码器,value,key,李沐,query,大佬,注意力
From: https://www.cnblogs.com/celeven1996/p/18555772

相关文章

  • 学习笔记(三十九):默认界面扫码
    基本概念默认界面扫码能力提供系统级体验一致的扫码界面,ScanKit对系统相机权限进行了预授权,调用接口时,无需开发者再次申请相机权限。适用于不同扫码场景的应用开发场景介绍默认界面扫码能力提供了系统级体验一致的扫码界面以及相册扫码入口,支持单码和多码识别,支持多种识码类......
  • mini-lsm通关笔记Week2Day4
    项目地址:https://github.com/skyzh/mini-lsm个人实现地址:https://gitee.com/cnyuyang/mini-lsmSummary在本章中,您将:实现一个分级合并策略,并在合并模拟器上进行仿真。将分级合并策略纳入系统。要将测试用例复制到启动器代码中并运行它们,cargoxcopy-test--week2--d......
  • 三维测量与建模笔记 - 点特征提取 - 4.3 Harris特征点
            在3D重建应用中,很重要的一个场景是找到两幅图像中的同名特征点,这个过程需要对特征点进行提取和描述。    从上面描述可以看出,如果窗口处于颜色变化不明显或者没有变化的区域,E的值很小或为0;如果窗口处于边缘位置,则值变化相对较小;如果窗口处于角点......
  • 三维测量与建模笔记 - 点特征提取 - 4.4 SIFT
        上图展示了DoG空间的一个例子,不同的 和k所产生的细节是不一样的。    关于SIFT的更详细的描述,可以参考一下链接:关键点检测SIFT算法笔记-CSDN博客文章浏览阅读1.7k次,点赞3次,收藏10次。SIFT(ScaleInvariantFeatureTransform),尺度不变特......
  • C++ Lambda表达式笔记
    1.什么是Lambda表达式?Lambda表达式是C++11引入的一种特性,允许定义匿名函数(没有名字的函数),并且可以像普通函数一样调用,甚至可以作为参数传递给其他函数。基本语法:[capture_list](parameters)->return_type{function_body};[capture_list]:捕获列表,决定外部变量如何......
  • Java小白成长记(创作笔记一)
    目录序言思维导图 开发流程新建SpringBoot并整合MybatisPlus        新建SpringBoot整合MybatisPlus统一结果封装全局异常处理引入数据库序言   在一个充满阳光的早晨,一位对编程世界充满好奇的年轻人小小白,怀揣着梦想与激情,踏上了学习Java编程的......
  • 【读书笔记-《网络是怎样连接的》- 6】Chapter3_1集线器与交换机
    本章的主要内容是经过网线传输的网络包,如何经过集线器,交换机与路由器,最终进入互联网。本篇首先来介绍集线器与交换机的转发操作。1网络信号在网线与集线器中的传输从计算机发出来的网络包需要经过集线器,交换机与路由器的转发操作,最终到达目的地,如下图所示。1.1网线与......
  • Web前端学习笔记三:准备开发环境
    1.安装编辑器和浏览器编辑器选择:VisualStudioCode;下载链接:VisualStudioCode-CodeEditing.Redefined 。浏览器选择:GoogleChrome网络浏览器2.下载插件汉化:chinese打开网页:openinbrowser3.设置默认浏览器控制面板——默认程序——设置默认程序——Web浏览......
  • 【学习笔记】dp 优化
    决策单调性优化目前只知道应用于形如\(f_i=min{g_j+w(j,i)}\)的式子。四边形不等式对于函数\(f(x,y)\),若其对于任意\(l_1\lel_2\ler_2\ler_1\)有\(f(l_1,r_2)+f(l_2,r_1)\lef(l_1,r_1)+f(l_2,r_2)\),我们称其满足四边形不等式。简记为交叉不大于包含。斜率优化目前......
  • MyBatis 学习笔记
    MyBatis执行器JDBC的执行过程分为四步:获取数据库连接(Connection)预编译SQL(PrepareStatement)设置参数执行SQL(ResultSet)MyBatis提供了执行器Executor将这一过程进行封装,对外提供SqlSession让用户通过调用其API直接操作数据库,因为SqlSession持有执行器Executor......