| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> PyTorch——实现自注意力机制(self-attention) -> 正文阅读 |
|
[人工智能]PyTorch——实现自注意力机制(self-attention) |
文章目录1 原理简述??Self-Attention Layer 一次检查同一句子中的所有单词的注意力,这使得它成为一个简单的矩阵计算,并且能够在计算单元上并行计算。 此外,Self-Attention Layer 可以使用下面提到的 Multi-Head 架构来拓宽视野,也就是多头注意力机制。Self-Attention Layer 基本结构如下:
W
q
,
W
k
,
W
v
\boldsymbol{W^q, W^k,W^v}
Wq,Wk,Wv 由网络训练而来。注意力矩阵是由 Query 和 Key 计算得到,方式由许多种,如点积、缩放点积等。Value 可以看作是信息提取器,将根据单词的注意力提取一个唯一的值,也即某个特征有多少成分被提取出来。下面计算一种注意力矩阵的方式:缩放点积。 矩阵化如下: 在上述的 self-attention 中,我们最终只得到一个注意力矩阵,也就是说这个注意力矩阵所关注的信息只偏句子之间的一种关系,但是在时序序列中,往往特征之间不止一种关系,所以我们要提取多个注意力矩阵,这样可以捕获更多的信息,这种注意力机制也就是 多头注意力机制(Multi-Heads)。在实现过程中,我们只需要将原始的
q
i
,
k
i
,
v
i
\boldsymbol{q^i,k^i,v^i}
qi,ki,vi 分裂为
n
\boldsymbol{n}
n 个就得到
n
\boldsymbol{n}
n 头自注意力机制了。 2 PyTorch 实现定义 num_attention_heads 为注意力机制的头数,input_size 为输入特征维度,hidden_size 为 q i , k i , v i \boldsymbol{q^i,k^i,v^i} qi,ki,vi 的总维度,这样每个头的维度也可以求出,定义为 attention_head_size:
定义 W q , W k , W v \boldsymbol{W^q, W^k,W^v} Wq,Wk,Wv,通过全连接网络生成:
使用输入特征乘 W q , W k , W v \boldsymbol{W^q, W^k,W^v} Wq,Wk,Wv 得到 Query,Key,Value 矩阵,维度为 ( b a t c h _ s i z e , s e q _ l e n , h i d d e n _ s i z e ) (batch\_size,seq\_len, hidden\_size) (batch_size,seq_len,hidden_size):
求多头注意力机制的 W q , W k , W v \boldsymbol{W^q, W^k,W^v} Wq,Wk,Wv,头数为 num_attention_heads,并要调换维度,即将 s e q _ l e n seq\_len seq_len 维度与 n u m _ a t t e n t i o n _ h e a d s num\_attention\_heads num_attention_heads 维度对换,最终 W q , W k , W v \boldsymbol{W^q, W^k,W^v} Wq,Wk,Wv 维度为 ( b a t c h _ s i z e , n u m _ a t t e n t i o n _ h e a d s , s e q _ l e n , a t t e n t i o n _ h e a d _ s i z e ) (batch\_size,num\_attention\_heads,seq\_len,attention\_head\_size) (batch_size,num_attention_heads,seq_len,attention_head_size):
将 Q \boldsymbol{Q} Q 和 K \boldsymbol{K} K 矩阵做点积运算,并进行缩放,得到注意力矩阵的维度为 ( b a t c h _ s i z e , n u m _ a t t e n t i o n _ h e a d s , s e q _ l e n , s e q _ l e n ) (batch\_size,num\_attention\_heads,seq\_len,seq\_len) (batch_size,num_attention_heads,seq_len,seq_len):
对注意力矩阵进行归一化,归一化的维度为 3,矩阵的维度不发生变化:
将注意力矩阵乘以矩阵 V \boldsymbol{V} V,得到输出特征,维度为 ( b a t c h _ s i z e , n u m _ a t t e n t i o n _ h e a d s , s e q _ l e n , a t t e n t i o n _ h e a d _ s i z e ) (batch\_size,num\_attention\_heads,seq\_len,attention\_head\_size) (batch_size,num_attention_heads,seq_len,attention_head_size):
将各头的注意力矩阵进行拼接,contiguous() 是将 tensor 的内存变成连续的,否则进行 view 操作时会报错,至于原因可参考:https://blog.csdn.net/kdongyi/article/details/108180250:
全部代码:
测试:
结果:
参考: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 4:24:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |