注意力机制(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

相关文章

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL