注意力机制(Attention Mechanism)学习笔记

2023-11-02 01:30

本文主要是介绍注意力机制(Attention Mechanism)学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考自:https://blog.csdn.net/qq_40027052/article/details/78421155 对内容进行抽取的少许补充。
还有 https://spaces.ac.cn/archives/4765/comment-page-3。在后面加入了此文的内容。

原理是一个encoder、decoder框架:输入句子Source,目标句子target。

source=<x1,x2…xm>,target=<y1,y2…yn>。

将输入句子通过非线性变换转化为中间语义表示C:C=F(x1,x2…,xm)(之前的),attention模型的不同之处在于:中间语义表示C会被替换成根据当前生成单词而不断变化的Ci。理解Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci。

y1=f(C1)
y2=f(C2,y1)
y3=f(C3,y1,y2)

每个Ci可能对应着不同的源语句子单词的注意力分配概率分布。

C i = ∑ j = 1 L x a i j h j C_i = \sum_{j=1}^{L_x} a_{ij}h_j Ci=j=1Lxaijhj

Lx是输入句子source的长度 Lx=||Source||,aij代表在Target输出第i个单词时Source输入句子中第j个单词的注意力分配系数(所以统计所有的输入单词,就知道对应第i个的输出概率(中间语义表示C的概率分布)。)而hj则是Source输入句子中第j个单词的语义编码,假设Ci下标i就是上面例子所说的“ 汤姆” ,那么Lx就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分别是输入句子每个单词的语义编码,对应的注意力模型权值则分别是0.6,0.2,0.2。(这里f函数代表Encoder对输入英文单词的某种变换函数,比如如果Encoder是用的RNN模型的话,这个f函数的结果往往是某个时刻输入xi后隐层节点的状态值)

如何知道注意力分配系数aij呢:
RNN作为具体模型的Encoder-Decoder框架:(感觉RNN就是,平常的DNN,同一层之间是没有连接的,只有前后层有连接,而RNN的同一层隐藏层之间有连接)
image

注意力分配概率分布值的通用计算过程:
image

函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。
这是一个RNN的decoder,要想知道目标单词yi,我们已知target之前的单词(i-1,i-2…,1),和所有的source单词,即通过函数F(hj,Hi-1)来获得目标单词yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。

Attention机制的本质思想

将Source中的构成元素想象成是由一系列的< Key,Value >数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。即可以将其本质思想改写为如下公式:

A t t e n t i o n ( Q u e r y , S o u r c e ) = ∑ j = 1 L x S i m i l a r i t y ( Q u e r y , K e y i ) ∗ V a l u e i Attention(Query,Source)=\sum_{j=1}^{L_x} Similarity(Query,Key_i)*Value_i Attention(Query,Source)=j=1LxSimilarity(Query,Keyi)Valuei

可以将其归纳为两个过程:第一个过程是根据Query和Key计算权重系数(根据Query和Key计算两者的相似性或者相关性;对得到的原始分值进行归一化处理),第二个过程根据权重系数对Value进行加权求和。

image

1. 计算两者的相似性或者相关性。

在第一个阶段,可以引入不同的函数和计算机制,根据Query和某个Keyi,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:

image

2. 归一化处理

第一阶段产生的分值根据具体产生的方法不同其数值取值范围也不一样,第二阶段引入类似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。即一般采用如下公式计算:

image

3. 计算Attention数值(Ci)

第二阶段的计算结果ai即为Valuei对应的权重系数,然后进行加权求和即可得到Attention数值:
image


参考 https://spaces.ac.cn/archives/4765/comment-page-3

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q k T d k ) V Attention(Q,K,V)=softmax(\frac{Qk^T}{\sqrt{dk}})V Attention(Q,K,V)=softmax(dk QkT)V

和上面 C i = ∑ j = 1 L x a i j h j C_i = \sum_{j=1}^{L_x} a_{ij}h_j Ci=j=1Lxaijhj类似,有

A t t e n t i o n ( q t , K , V ) = ∑ s = 1 m 1 Z e x p ( &lt; q t , k t &gt; Z ) v s Attention(q_t,K,V)=\sum_{s=1}^{m} \frac{1}{Z} exp(\frac{&lt;q_t,k_t&gt;}{Z})v_s Attention(qt,K,V)=s=1mZ1exp(Z<qt,kt>)vs

其中Z是归一化因子。事实上q,k,v分别是query,key,value的简写,K,V是一一对应的,它们就像是key-value的关系,那么上式的意思就是通过qt这个query,通过与各个ks内积的并softmax的方式,来得到qt与各个vs的相似度,然后加权求和,得到一个dv维的向量(qt是target中某个元素query,一个qt得到dv维(source的长度)的attention值,比如对于某个target单词汤姆,对应的source里的<tom,chase,jerry>的attention值为(0.6,0.2,0.2))。其中因子 d k \sqrt{dk} dk 起到调节作用,使得内积不至于太大(太大的话softmax后就非0即1了,不够“soft”了)。

Position Embedding

这样的模型并不能捕捉序列的顺序!换句话说,如果将K,V按行打乱顺序(相当于句子中的词序打乱),那么Attention的结果还是一样的。这就表明了,到目前为止,Attention模型顶多是一个非常精妙的“词袋模型”而已。(词袋模型:比如nature language processing,翻译时三个单词作为一个词去翻译,而不是三个单词去翻译)。
机器翻译时需要学习顺序信息,才能更好的改进翻译效果。

Position Embedding,也就是“位置向量”,将每个位置编号,然后每个编号对应一个向量,通过结合位置向量和词向量,就给每个词都引入了一定的位置信息,这样Attention就可以分辨出不同位置的词了。

构造Position Embedding的公式:

{ P E 2 i ( p ) = s i n ( p / 1000 0 2 i / d p o s ) P E 2 i + 1 ( p ) = c o s ( p / 1000 0 2 i / d p o s ) \begin{cases} PE_{2i}(p)= sin(p/10000^{2i/d_{pos}}) \\ PE_{2i+1}(p)= cos(p/10000^{2i/d_{pos}}) \end{cases} {PE2i(p)=sin(p/100002i/dpos)PE2i+1(p)=cos(p/100002i/dpos)

有dpos维的位置向量,i=1,2,…,dpos,将id为p的位置映射为一个dpos维的位置向量,这个向量的第i个元素的数值就是 P E i ( p ) PE_i(p) PEi(p)

这篇关于注意力机制(Attention Mechanism)学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/327159

相关文章

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Jvm sandbox mock机制的实践过程

《Jvmsandboxmock机制的实践过程》:本文主要介绍Jvmsandboxmock机制的实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景二、定义一个损坏的钟1、 Springboot工程中创建一个Clock类2、 添加一个Controller

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示