注意力机制、Encoder、Decoder

2023-05-16

注意力机制

开始我们先想一个问题:假设我要找工作,我怎么才能知道我在一个公司可能拿到多少工资呢?
将全公司所有人的工资进行平均?这显然不合理吧。
一个合理的想法是找到这个公司和我相同或类似岗位且与我教育经历、工作经验相似的人的工资做平均,这样的到平均显然就更接我可能拿到的工资。
其中:已知公司每个员工岗位经历等以及对应工资分别是Key和Value(K_i, V_i)
而我就是Query(Q),最后想要得到的工资就是求的Value

注意力机制的目的就是找到一个函数F[Q, (K_i, V_i)]通过Query找到相似的Key, 并根据与每个Key的相似度赋予不同的权重Weight, 通过这个权重Weight与对应Value求出目标Query的价值Value。
这个寻找Query相似的Key的 限制条件(相似度判别方法) 就是注意力。

Attention机制:神经网络接收的输入是很多大小不一的向量,并且不同向量向量之间有一定的关系,但是实际训练的时候无法充分发挥这些输入之间的关系而导致模型训练结果效果极差。注意力机制迫使模型在解码时学会将注意力集中在输入序列的特定部分,而不是仅仅依赖于decoder的输入。

定义:从大量输入信息里面选择小部分的有用信息来重点处理,并忽略其他信息,这种能力就叫做注意力(Attention)

计算

  1. 输入Query、Key、Value;
  2. 根据Query和Key计算两者之间的相关性/相似性(常见方法点乘、余弦相似度,一般用点乘),得到注意力得分;
  3. 对注意力得分进行缩放scale(除以维度的根号),再softmax归一化,再得到权重系数;
  4. 根据权重系数对Value值进行加权求和,得到Attention Value(此时的V是具有一些注意力信息的,更重要的信息更关注,不重要的信息被忽视了);

f ( q , ( k 1 , v 1 ) , … , ( k m , v m ) ) = ∑ i = 1 m α ( q , k i ) v i ∈ R v f\left(\mathbf{q},\left(\mathbf{k}_{1}, \mathbf{v}_{1}\right), \ldots,\left(\mathbf{k}_{m}, \mathbf{v}_{m}\right)\right)=\sum_{i=1}^{m} \alpha\left(\mathbf{q}, \mathbf{k}_{i}\right) \mathbf{v}_{i} \in \mathbb{R}^{v} f(q,(k1,v1),,(km,vm))=i=1mα(q,ki)viRv

α ( q , k i ) = softmax ⁡ ( a ( q , k i ) ) = exp ⁡ ( a ( q , k i ) ) ∑ j = 1 m exp ⁡ ( a ( q , k j ) ) ∈ R . \alpha\left(\mathbf{q}, \mathbf{k}_{i}\right)=\operatorname{softmax}\left(a\left(\mathbf{q}, \mathbf{k}_{i}\right)\right)=\frac{\exp \left(a\left(\mathbf{q}, \mathbf{k}_{i}\right)\right)}{\sum_{j=1}^{m} \exp \left(a\left(\mathbf{q}, \mathbf{k}_{j}\right)\right)} \in \mathbb{R} . α(q,ki)=softmax(a(q,ki))=j=1mexp(a(q,kj))exp(a(q,ki))R.

在这里插入图片描述

正如上图所示,选择不同的注意力评分函数a会导致不同的注意力汇聚操作。

一些需要注意的点

  1. 为什么softmax前要缩放?为什么是除以维度的根号?
  2. 缩放是因为softmax归一化是有问题的,当缩放前的某个元素非常大的时候,softmax会把大部分的概率分给这个大的元素,这就会产生一个类似one-hot的向量,softmax反向传播会导致梯度消失。所以在softmax前缩放,缓解这种问题。
  3. 除以维度的根号因为我们希望输入softmax的数据是均值为0,方差为1。
  4. 一般K和V是相同的,或者是存在一定的联系的。
  5. 新的向量Attention Value表示了Key 和Value(Key 一般和Value相同),而且Attention Value还暗含了Q的信息。总结下:通过查询遍历Key找出Key里面的关键点,然后再和Value组合成一个新的向量去表示Key。
  6. 为什么不能用Key和Key自乘得到相似度,而要新建一个Q?
  7. 如果Key自乘得到相似度,这个时候得到的其实是一个对称矩阵,相当于把Key投影到同一个空间中,泛化能力弱。

自注意力机制

从上面注意力机制可以看出,其中的Key和Query没有本质区别,只是一个是已知的、一个是未知的。自注意力机制就是Query、Key、Value全部来自已知的X序列中,通过类似做完形填空的方式自主学习找到每个X_i与其他X_k(k ≠ i)之间的关系。

Attention和Self-Attention的区别:

  1. Attention中K和V往往是同源的(也可以不同源),而Q没有任何要求,所以attention其实是一个很宽泛的概念,没有规定Q、K、V是怎么来的,只要满足QKV相乘计算相似度这种流程的都是注意力机制(所以才有通道注意力机制、空间注意力机制);
  2. Self-Attention属于Attention,要求QKV必须同源,依然代表X,本质上可以看作是相等的,只是对同一个词向量X乘上了参数矩阵,作了空间上的变换;

计算

  1. 通过共享参数W_Q、W_K、W_V ​和X运算得到Q、K、V;
  2. 接下来和注意力机制一模一样;
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Z本质上还是X向量,只不过包含了一些新的信息:包含X中每个向量和所有向量之间的相似度,让x1/x2…去关注更重要的词向量

位置编码

位置编码

为什么需要位置编码?
self-attention是并行就意味着它是可以同时计算每个位置和其他位置的相关性的,也就是说词与词之间是不存在顺序关系的。所以如果打乱一句话,那么这句话里的词向量依然不变,即无位置关系。

总结:self-attention不像RNN那样有先后顺序,可以找到每个序列的位置,self-attention只是负责计算每个位置和其他位置的相关性。为了解决这个问题,就提出了位置编码。

怎么做位置编码?
在这里插入图片描述

在这里插入图片描述

  1. 对词向量进行编码生成embedding x1(shape1);
  2. 生成相应的位置编码 positional emcoding t1(shape1),如上t1包含x1和x2,x1和x3的位置关系;
  3. 两者相加add(embedding +positional emcoding),生成最终的输入特征 Embedding with time signal(shape1);

位置编码的生成方式
1、正余弦生成
P E ( p o s , 2 i ) = sin ⁡ ( p o s / 1000 0 2 i / d ) P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s / 1000 0 2 i / d ) \begin{array}{c} P E_{(p o s, 2 i)}=\sin \left(p o s / 10000^{2 i / d}\right) \\ P E_{(p o s, 2 i+1)}=\cos \left(p o s / 10000^{2 i / d}\right) \end{array} PE(pos,2i)=sin(pos/100002i/d)PE(pos,2i+1)=cos(pos/100002i/d)

借助上面的公式,我们可以得到一个特定位置的 d m o d e l d_{model} dmodel 维的位置向量,并且借助三角函数的性质
{ sin ⁡ ( α + β ) = sin ⁡ α cos ⁡ β + cos ⁡ α sin ⁡ β cos ⁡ ( α + β ) = cos ⁡ α cos ⁡ β − sin ⁡ α sin ⁡ β \left\{\begin{array}{l} \sin (\alpha+\beta)=\sin \alpha \cos \beta+\cos \alpha \sin \beta \\ \cos (\alpha+\beta)=\cos \alpha \cos \beta-\sin \alpha \sin \beta \end{array}\right. {sin(α+β)=sinαcosβ+cosαsinβcos(α+β)=cosαcosβsinαsinβ
我们可以得到:
{ P E (  pos  + k , 2 i ) = P E (  pos  , 2 i ) × P E ( k , 2 i + 1 ) + P E (  pos  , 2 i + 1 ) × P E ( k , 2 i ) P E (  pos  + k , 2 i + 1 ) = P E (  pos  , 2 i + 1 ) × P E ( k , 2 i + 1 ) − P E (  pos  , 2 i ) × P E ( k , 2 i ) \left\{\begin{array}{l} P E(\text { pos }+k, 2 i)=P E(\text { pos }, 2 i) \times P E(k, 2 i+1)+P E(\text { pos }, 2 i+1) \times P E(k, 2 i) \\ P E(\text { pos }+k, 2 i+1)=P E(\text { pos }, 2 i+1) \times P E(k, 2 i+1)-P E(\text { pos }, 2 i) \times P E(k, 2 i) \end{array}\right. {PE( pos +k,2i)=PE( pos ,2i)×PE(k,2i+1)+PE( pos ,2i+1)×PE(k,2i)PE( pos +k,2i+1)=PE( pos ,2i+1)×PE(k,2i+1)PE( pos ,2i)×PE(k,2i)
可以看出,对于 p o s + k pos+k pos+k位置的向量某一维 2 i 2i 2i 2 i + 1 2i+1 2i+1而言,可以表示为 p o s pos pos位置与 k k k位置的位置向量的 2 i 2i 2i 2 i + 1 2i+1 2i+1维的线性组合,这样的线性组合意味着位置向量中蕴含着相对位置信息。

前面我们知道位置编码其实就是让t1知道x1和x2,x1和x3的位置关系。从公式角度理解为什么?

sin(pos+k) = sin(pos)*cos(k) + cos(pos)*sin(k)  # sin 表示的是偶数维度
cos(pos+k) = cos(pos)*cos(k) - sin(pos)*sin(k)  # cos 表示的是奇数维度

这个公式告诉我们:位置 p o s + k pos + k pos+k 是 位置 p o s pos pos 和 位置 k k k 的线性组合
即当我知道 位置 p o s + k pos+k pos+k 那内部就会暗含 位置 p o s pos pos 和 位置 k k k 的信息
所以,此时即使打乱了词的位置关系,位置编码也会发生改变 这就解决了transformer的问题

2、自学习生成
这种方式比较简单,就直接随机初始化和x1一样shape的随机变量,然后训练网络的时候自动学习即可。

多头注意力机制

Multi-Head Self-Attention得到的新的词向量可以比Self-Attention得到的词向量有进一步提升。

什么是多头?(一般是使用8头)
在这里插入图片描述

理论做法:

  1. 输入X;
  2. 对应8个single head,对应8组W_Q、W_K、W_V再分别进行self-attention,得到Z_0 - Z_7;
  3. 再把Z_0 - Z_7拼接concat起来;
  4. 再做一次线性变换(降维)得到 Z;

源码:

  1. 输入X;
  2. 根据W_Q、W_K、W_V,生成Q、K、V;
  3. 再把Q拆分成q_1 - q_7,K拆分成k_1 - k_7,V拆分成v_1 - v_7;
  4. head_0 - head_7分别在qkv_1 - qkv_7上做自注意力机制
  5. 再把z_0 - z_7拼接concat起来;
  6. 再做一次线性变换(降维)得到 Z;

为什么多头?有什么作用?
机器学习的本质: y = σ ( w x + b ) y=σ(wx+b) y=σ(wx+b),其实就是在做非线性变换。把数据x(它是不合理的),通过非线性变换,变成数据y(合理)。
非线性变换的本质:空间变换,改变空间上的位置坐标。
self-attention本质,通过非线性变换,把原始数据空间上的X点位置映射到新空间上的点Z上。
muti-head self-attention:把输入数据X,再把X通过非线性变换,映射到8个不同的子空间上,然后通过这8个不同的子空间去找最终的新空间上的点Z。这样可以捕捉更加丰富的特征信息,效果更好。

简单来说就是可以通过更多不同的维度观察Query与Key之间的联系,更好的计算Q与K的权重。

  1. 注意力机制 & 自注意力模型
  2. 【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码
  3. 自注意力机制(Self-Attention)
  4. 详解自注意力机制中的位置编码(第一部分
  5. Transformer模型详解(图解最完整版)
  6. 【Transformer专题】一、Attention is All You Need(Transformer入门)
  7. Embedding层的作用
  8. EMBEDDING层作用
  9. 注意力机制
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

注意力机制、Encoder、Decoder 的相关文章

随机推荐

  • 【Gazebo入门教程】第八讲 Gazebo中的日志与回放

    Gazebo入门教程 第八讲 Gazebo中的日志与回放 文章目录 Gazebo入门教程 第八讲 Gazebo中的日志与回放一 日志记录1 日志内容介绍2 日志记录 二 日志回放 总结 前言 xff1a 在之前的Gazebo教程中 xff0
  • 一键式AI绘画,让你也能体验当画师的魅力(附原理分析)

    文章目录 讲在前面一 Novel AI1 网站介绍2 AI作画 二 AI绘画的内在原理1 Diffusion Model的基本过程2 扩散模型的兴起 讲在前面 大概在今年10月初期 xff0c AI作画的热潮突然被掀起 xff0c 这股潮流
  • 类与对象:C++编程知识回顾与拓展 第一篇

    类与对象 C 43 43 编程知识回顾与拓展 第一篇 前言 在步入研究生生涯以来 xff0c 痛感自身编程知识与能力的不足 xff0c 亟需重新回顾 xff0c 并重点学习关于C 43 43 中面向对象 类 STL等关键知识 xff0c 提
  • OpenStreetMap:对抗谷歌帝国的共享开源地图

    OpenStreetMap xff1a 对抗谷歌帝国的共享免费地图 讲在前面 在步入自动驾驶的学习之后 xff0c 不可避免地我需要去了解在驾驶领域中选择的地图格式 xff0c 而随着研究的进一步深入 xff0c 我逐步了解到两种较为主流的
  • Copilot:AI自动写代码,人工智能究竟还能取代什么?

    Copilot xff1a AI自动写代码 xff0c 人工智能究竟还能取代什么 xff1f 前言 在AI绘画掀起一阵热潮之后 xff0c AI写代码又逐渐进入了我们的视野 xff0c 似乎这一步我们还没想到就迅速到来了 xff0c 难道说
  • Debian9的各个版本的下载地址

    以下为debian 9 6版的下载地址 xff0c 不同镜像对应不同的Linux桌面环境 官网下载地址 共三个镜像文件 xff0c 一般只下载第一个就行了 xff0c 当然也可以全部现在 xff0c 启动时先选择第一个光盘 xff0c 如果
  • EPOLL的简单使用

    1 EPOLL简介 epoll是linux下的一个处理多路I O复用的机制 xff0c 基于事件通知 xff0c 能够高效的处理多个SOCKET连接 2 基本函数 使用epoll xff0c 基本的函数只有三个 xff1a 1 创建 xff
  • 001 Rust 网络编程,实现 TCP 服务端和客户端程序

    本例子用Rust实现一个基于TCP的echo的服务端和客户端的程序 xff0c 用Rust演示简单的网络程序 服务端 服务端实现类似于我们之前写过的http服务端的实现 涉及到的知识点主要是std io和std net 代码如下 xff1a
  • Qt Android开发问题汇总

    Qt Android开发问题汇总 摘要1 Qt Quick编写Android应用 xff0c 使状态栏颜色和应用保持一致总结 摘要 作为一名工作中使用Qt的开发者 xff0c 主要做的是桌面应用开发 开发Android应用主要是想要尝试移动
  • 自定义 Qt Quick Controls

    自定义 Qt Quick Controls 使用 Qt Quick 编写界面时 xff0c 使用 Qt Quick Controls xff08 指Qt Quick Controls 2 xff09 模块中提供的大量控件 xff0c 可以快
  • Rust基础 - 变量

    Rust基础 变量 摘要开始变量的可变性 Mutability 名称覆盖 Name Shadowing 常量 摘要 这是Rust语言的基础教程 本文讲解了Rust的变量 常量 名称覆盖 Shadowing 开始 开始学习Rust xff0c
  • xrdp远程登录恢复上一次登陆会话

    本文参考Xrdp Tip How to reconnect to the existing session while using the xrdp package from Ubuntu Repository 首先连接远程桌面是观察连接时
  • XRDP远程连接错误总结

    XRDP远程连接错误总结 XRDP无法连接 xff0c 出错信息如下 xff1a 解决方案 xff1a 编辑文件 etc xrdp sesman ini sudo gedit etc xrdp sesman ini 在末尾加上 xff1a
  • linux提示 “软件包系统已损坏” 问题解决

    今天启动ubuntu xff0c 发现无法安装软件 xff0c 系统提示错误 软件包系统已损坏 xff0c 检查您是否使用了第三方源 如果是就禁用它们 xff0c 它们常常导致问题 然后在终端中运行以下命令 xff1a apt get in
  • DINO在Windows环境下训练 自定义数据集

    简介 论文 xff1a https link zhihu com target 61 https 3A arxiv org abs 2203 03605 代码 xff1a https link zhihu com target 61 htt
  • 【转载&翻译】Debian配置Networking 和 apt-get 源信息 & 开启root远程登录权限

    1 简介 初始安装完debian 7 7 0时 xff0c 需要首先配置网络及apt get源 xff0c 才能正常使用 2 debian配置 2 1 debian 7 7 0配置网络及apt get源 2 1 1 配置网络 静态IP 修改
  • DETR详解

    Github源码 xff1a facebookresearch detr Github注释版源码 xff1a HuKai97 detr annotations 论文 xff1a End to End Object Detection wit
  • 目标检测模型总结

    1 问题概况 1 1 定义 目标检测的任务是对画面中的目标进行定位和分类 定位是指回归目标的矩形框 xff0c 分类是指对目标框进行类别区分 1 2 主要问题 目标检测任务主要解决以下几个问题 xff1a 目标的种类和数量 目标的尺寸 外界
  • Windows10 远程即使输入对方邮箱和密码也无法登录(“用户名密码错误”)

    问题 Win10远程桌面无论使用什么账号密码均无法正常登陆Win10共享文件无法被其他设备使用任何账号正常访问 各种需要使用Win10系统账号与密码登陆的服务出现账号密码正确但无法访问的情况 原因 触发条件 xff1a 在Win10电脑激活
  • 注意力机制、Encoder、Decoder

    注意力机制 开始我们先想一个问题 xff1a 假设我要找工作 xff0c 我怎么才能知道我在一个公司可能拿到多少工资呢 xff1f 将全公司所有人的工资进行平均 xff1f 这显然不合理吧 一个合理的想法是找到这个公司和我相同或类似岗位且与