Transformer中的自注意力机制计算过程分析

news/2024/7/19 10:43:10 标签: transformer, 深度学习, 人工智能

目录

1 什么是自注意力机制

2 自注意力的计算过程


1 什么是自注意力机制

自注意力机制(Self-Attention)顾名思义就是关注单个序列内部元素之间的相关性,不仅可以用于 seq2seq 的机器翻译模型,还能用于情感分析、内容提取等场景。因此分析网络如何表达出“单个序列”与“内部元素”之间的相关性这一问题可以回答开头所述的大部分疑问。

2 自注意力的计算过程

如图1所示,假设网络某一个自注意力层的输入向量序列为 \left \{ a_{1},\cdots ,a_{n} \right \}a_{i}\left ( i=1,2,\cdots ,n \right )维度均为 d_{model},该层的输出向量序列为 \left \{ o_{1},\cdots ,o_{n} \right \}o_{i}\left ( i=1,2,\cdots ,n \right ) 的维度同样都为 d_{model}

首先将 \left \{ a_{1},\cdots ,a_{n} \right \} 分别乘以同一个矩阵\mathbf{\mathit{W}_{\mathit{K}}}\mathbf{\mathit{W}_{\mathit{Q}}}\mathbf{\mathit{W}_{\mathit{V}}} 得到 key 向量  \mathbf{\mathit{k}_{\mathit{n}}}、query 向量 \mathbf{\mathit{q}_{\mathit{n}}} 以及 value 向量 \mathbf{\mathit{v}_{\mathit{n}}},且维度均为 d_{model}

然后以 \mathbf{\mathit{a}}_{1} 输出到 \mathbf{\mathit{o}}_{1} 的过程为例。把 \mathbf{\mathit{q}}_{1} 依次与所有的key做点积后得到初步的注意力值  a_{1,i}\left ( i=1,2,\cdots ,n \right ),图1所示。

图1 自注意力计算过程1 

然后将 a_{1,i} 经过 softmax 函数归一化得到最终的注意力权重 a_{1,n}^{'} ,这个 a_{1,n}^{'} 可以看作我们给输入向量序列中的每个位置的向量打分,而这个分数决定了当我们在一个特定的位置处理一个向量时,在输入的句子的其他部分应该给予多少关注。

图2 注意力权重计算

将权重 a_{1,n}^{'} 与 \mathbf{\mathit{v}}_{i}\left ( i=1,2,\cdots ,n \right ) 加权相乘之后再相加得到 \mathbf{\mathit{a}_{\boldsymbol{\mathit{i}}}} 对应的自注意力输出向量 \mathbf{\mathit{o}_{\boldsymbol{\mathit{1}}}} ,如图3所示。

 图3 自注意力计算3

其他的计算方法与此相同,最终的计算结果如图4所示。其中 \mathbf{\mathit{a}_{\boldsymbol{\mathit{i}}}} 与相应的 \mathbf{\mathit{o}_{\boldsymbol{\mathit{i}}}} 的维度相同,都是 d_{model} 整个注意力机制中只有\mathbf{\mathit{W}_{\mathit{K}}}、 \mathbf{\mathit{W}_{\mathit{Q}}}以及 \mathbf{\mathit{W}_{\mathit{V}}} 三个矩阵是可学习的参数。

 图4 自注意力计算4

进一步地,既然每个输入向量 \mathbf{\mathit{a}_{\boldsymbol{\mathit{i}}}} 都是乘以相同的矩阵,那么可以将所有输入向量 \left \{ a_{1},\cdots ,a_{n} \right \}整合为一个矩阵 \mathbf{\mathit{A}}=\left [ \mathbf{\mathit{a}_{1}},\cdots ,\mathbf{\mathit{a}_{n}} \right ]_{d_{model}\times n},然后把三种输出向量 \mathbf{\mathit{k}_{\mathit{i}}}\mathbf{\mathit{q}_{\mathit{i}}} 以及 \mathbf{\mathit{v}_{\mathit{i}}} 也整合成矩阵的形式分别为 \mathbf{\mathit{K}}\mathbf{\mathit{Q}}\mathbf{\mathit{V}},比如 \mathbf{\mathit{K}} 可以写为下式所示的形式:

此时的输出矩阵就可以写成下式的结果:

这里的矩 softmax\left ( \mathbf{\mathit{QK}^{T}} \right ) 就是注意力矩阵,代表着当处理当前位置向量时,其他位置的向量对当前位置向量的影响程度。

Transformer中的输出矩阵还乘以了一个缩放系数 \frac{1}{\sqrt{d_{k}}}d_{k} 是  \mathbf{\mathit{k}_{\mathit{n}}} 的维度。所以最终的输出是下式所示的形式:

在这里使用矩阵运算的目的是可以提升计算效率。


http://www.niftyadmin.cn/n/5402963.html

相关文章

重学Springboot3-@ConditionalOnXxx条件注解

重学Springboot3-ConditionalOnXxx条件注解 引言常见的条件注解常见的条件注解示例扩展条件注解1. ConditionalOnJndi2. ConditionalOnJava3. ConditionalOnCloudPlatform4. ConditionalOnEnabledResourceChain5. 自定义条件注解 总结 引言 Spring Boot 提供了一组强大的条件注…

我在代码随想录|写代码Day30 | 贪心算法 | 435. 无重叠区间,763.划分字母区间, 56. 合并区间, 738.单调递增的数字

&#x1f525;博客介绍&#xff1a; 27dCnc &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: <<数据结构与算法>> 专题 : 数据结构帮助小白快速入门算法 &…

【flink】Rocksdb TTL状态全量快照持续递增

flink作业中的MapState开启了TTL&#xff0c;并且使用rocksdb作为状态后端配置了全量快照方式&#xff08;同时启用全量快照清理&#xff09;&#xff0c;希望能维持一个平稳的运行状态&#xff0c;但是经观察后发现效果不达预期&#xff0c;不仅checkpoint size持续缓慢递增&a…

数据迁移DTS | 云上MySQL 数据库迁移至达梦数据库

引入 云上 MySQL 数据库 —> 向达梦国产化数据库迁移 下载&安装 达梦客户端工具 DM->可参考之前国产化专栏达梦文章 创建模式 在客户端分别依次执行以下命令脚本&#xff08;这里没有通过客户端管理工具去创建达梦数据库的模式&#xff0c;当然也可以通过图形化界…

如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?

原文链接&#xff1a;如何用ChatGPTGEEENVIPython进行高光谱&#xff0c;多光谱成像遥感数据处理&#xff1f; 第一&#xff1a;遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二&#xff1a;ChatGPT ChatGPT可以做什么&#xff1f; ChatGPT演示使用 …

vue3 + vite 项目可以使用纯Js开发吗?

答案&#xff1a;可以 创建项目&#xff1a; 按照链接参考或者按官方&#xff1a; webstorm 创建vue3 vite 项目-CSDN博客 项目目录 tsconfig.json 配置允许js allowJs指定是否编译js文件&#xff0c;在任意文件当中,如果我们模块使用js写的&#xff0c;那么我们需要 将all…

ant-design-vue如何限制图片上传的尺寸?

handleBeforeUpload(file, fileList) {// fileList 只包含了当次上传的文件列表&#xff0c;不包含已上传的文件列表// 所以长度要加上已上传的文件列表的长度const isLimit this.fileList.length fileList.length > this.limit;const indexOfFile fileList.findIndex(it…

Leetcode—65. 有效数字【困难】

2024每日刷题&#xff08;118&#xff09; Leetcode—65. 有效数字 实现代码 class Solution { public:bool isNumber(string s) {if(s.empty()) {return false;}bool seenNum false;bool seenE false;bool seenDot false;for(int i 0; i < s.size(); i) {switch(s[i]…