10.3注意力的评价函数

news/2025/2/19 14:30:49/

1. 注意力的构造函数

1.1 <key, value> , query

key :代表从原始输入x 中, 从事物自身本来所固有的某一个属性(或多个属性上)上提取出来的特征, 这些特征可以抽象的表示原始输入;

value: 从原始输入中, 进行映射,在另外一个特征维度上来表征输入;

query: (即可以是人脑的意识作用下, 也可以是机器学习出来的)提炼出来的一种属性特征;

1.2 注意力层的输出

在这里插入图片描述

上图的步骤:

  1. 使用 query 的属性与 key 的属性,通过注意力的评价函数, 得到 key 与 query 之间的注意力分数;

  2. 注意分数通过softmax 便得到注意力权重;

  3. 将注意力权重 作用到各个 value 上,得到最终注意力层的输出;

即最终该注意力层的输出: 是注意力权重与各个vaule 值的加权和得到;

1.3 注意力层数学描述

用数学语言描述,假设有一个查询 q u e r y ∈ R v query \in \mathbb{R}^v queryRv
m m m 个“键-值”对 ( k 1 , v 1 ) , . . . . ( k m , v m ) (k_1, v_1), .... (k_m, v_m) (k1,v1),....(km,vm),
其中 k i ∈ R k , v i ∈ R v k_i \in \mathbb{R}^k, v_i \in \mathbb {R}^v kiRk,viRv

则,注意力层的输出函数就被表示成值的加权和:

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

其中注意力权重,

  1. 先通过注意力评分函数将查询和键 ( q , k q, k q,k)两个向量映射成标量,
  2. 再经过softmax运算得到的。

α ( q , k i ) = s o f t m a x ( a ( q , k i ) ) = exp ⁡ ( a ( q , k i ) ) ∑ j = 1 m exp ⁡ ( a ( q , k j ) ) ∈ R . \alpha(\mathbf{q}, \mathbf{k}_i) = \mathrm{softmax}(a(\mathbf{q}, \mathbf{k}_i)) = \frac{\exp(a(\mathbf{q}, \mathbf{k}_i))}{\sum_{j=1}^m \exp(a(\mathbf{q}, \mathbf{k}_j))} \in \mathbb{R}. α(q,ki)=softmax(a(q,ki))=j=1mexp(a(q,kj))exp(a(q,ki))R.

正如我们所看到的,选择不同的注意力评分函数会导致不同的注意力汇聚操作。

在本节中,我们将介绍两个流行的评分函数,稍后将用他们来实现更复杂的注意力机制。

2. 带有mask 的softmax 运算;

正如上面提到的,softmax操作用于输出一个概率分布作为注意力权重。

在某些情况下,并非所有的值都应该被纳入到注意力汇聚中。 例如,为了在 9.5节中高效处理小批量数据集, 某些文本序列被填充了没有意义的特殊词元。

为了仅将有意义的词元作为值来获取注意力汇聚, 我们可以指定一个有效序列长度(即词元的个数), 以便在计算softmax时过滤掉超出指定范围的位置。

通过这种方式,我们可以在下面的masked_softmax函数中 实现这样的掩蔽softmax操作(masked softmax operation), 其中任何超出有效长度的位置都被掩蔽并置为0。

具体的实现:
便是 通过在最后一个轴 上 使用 掩蔽查过有效长度的数字来实现;

3. 加性注意力

一般来说,当查询和键是不同长度的矢量时, 我们可以使用加性注意力作为评分函数。 给定查询 q ∈ R q \mathbf{q} \in \mathbb{R}^q qRq
和 键 k ∈ R k \mathbf{k} \in \mathbb{R}^k kRk, 加性注意力(additive attention)的评分函数为:

a ( q , k ) = w v ⊤ tanh ( W q q + W k k ) ∈ R , a(\mathbf q, \mathbf k) = \mathbf w_v^\top \text{tanh}(\mathbf W_q\mathbf q + \mathbf W_k \mathbf k) \in \mathbb{R}, a(q,k)=wvtanh(Wqq+Wkk)R,

其中可学习的参数是 W q ∈ R h × q \mathbf W_q\in\mathbb R^{h\times q} WqRh×q , W k ∈ R h × k \mathbf W_k\in\mathbb R^{h\times k} WkRh×k, w v ∈ R h \mathbf w_v\in\mathbb R^{h} wvRh,

如 前面图中所示, 将查询和键连结起来后输入到一个多层感知机(MLP)中, 感知机包含一个隐藏层,其隐藏单元数是一个超参数。 通过使用作为激活函数,并且禁用偏置项。

下面我们来实现加性注意力。

#@save
class AdditiveAttention(tf.keras.layers.Layer):"""Additiveattention."""def __init__(self, key_size, query_size, num_hiddens, dropout, **kwargs):super().__init__(**kwargs)self.W_k = tf.keras.layers.Dense(num_hiddens, use_bias=False)self.W_q = tf.keras.layers.Dense(num_hiddens, use_bias=False)self.w_v = tf.keras.layers.Dense(1, use_bias=False)self.dropout = tf.keras.layers.Dropout(dropout)def call(self, queries, keys, values, valid_lens, **kwargs):queries, keys = self.W_q(queries), self.W_k(keys)# 在维度扩展后,# queries的形状:(batch_size,查询的个数,1,num_hidden)# key的形状:(batch_size,1,“键-值”对的个数,num_hiddens)# 使用广播方式进行求和features = tf.expand_dims(queries, axis=2) + tf.expand_dims(keys, axis=1)features = tf.nn.tanh(features)# self.w_v仅有一个输出,因此从形状中移除最后那个维度。# scores的形状:(batch_size,查询的个数,“键-值”对的个数)scores = tf.squeeze(self.w_v(features), axis=-1)self.attention_weights = masked_softmax(scores, valid_lens)# values的形状:(batch_size,“键-值”对的个数,值的维度)return tf.matmul(self.dropout(self.attention_weights, **kwargs), values)

4. 缩放点积注意力

使用点积可以得到计算效率更高的评分函数, 但是点积操作要求查询和键具有相同的长度 d。 假设查询和键的所有元素都是独立的随机变量, 并且都满足零均值和单位方差, 那么两个向量的点积的均值为0,方差为 d {d} d

为确保无论向量长度如何, 点积的方差在不考虑向量长度的情况下仍然是1, 我们将点积除以 d \sqrt{d} d , 则缩放点积注意力(scaled dot-product attention)评分函数为:
a ( q , k ) = q ⊤ k / d . a(\mathbf q, \mathbf k) = \mathbf{q}^\top \mathbf{k} /\sqrt{d}. a(q,k)=qk/d .

在实践中,我们通常从小批量的角度来考虑提高效率, 例如基于个查询和个键-值对计算注意力, 其中查询和键的长度为,值的长度为。

查询 Q ∈ R n × d \mathbf Q\in\mathbb R^{n\times d} QRn×d、 键 K ∈ R m × d \mathbf K\in\mathbb R^{m\times d} KRm×d和 值 V ∈ R m × v \mathbf V\in\mathbb R^{m\times v} VRm×v的缩放点积注意力是:

s o f t m a x ( Q K ⊤ d ) V ∈ R n × v . \mathrm{softmax}\left(\frac{\mathbf Q \mathbf K^\top }{\sqrt{d}}\right) \mathbf V \in \mathbb{R}^{n\times v}. softmax(d QK)VRn×v.

在下面的缩放点积注意力的实现中,我们使用了暂退法进行模型正则化。

#@save
class DotProductAttention(tf.keras.layers.Layer):"""Scaleddotproductattention."""def __init__(self, dropout, **kwargs):super().__init__(**kwargs)self.dropout = tf.keras.layers.Dropout(dropout)# queries的形状:(batch_size,查询的个数,d)# keys的形状:(batch_size,“键-值”对的个数,d)# values的形状:(batch_size,“键-值”对的个数,值的维度)# valid_lens的形状:(batch_size,)或者(batch_size,查询的个数)def call(self, queries, keys, values, valid_lens, **kwargs):d = queries.shape[-1]scores = tf.matmul(queries, keys, transpose_b=True)/tf.math.sqrt(tf.cast(d, dtype=tf.float32))self.attention_weights = masked_softmax(scores, valid_lens)return tf.matmul(self.dropout(self.attention_weights, **kwargs), values)

5. 小结

  • 选择不同的注意力评价函数在注意力层中带来不同的注意力操作。

  • 当查询和键是不同长度的矢量时,可以使用可加性注意力评分函数。

  • 当它们的长度相同时,使用缩放的“点-积”注意力评分函数的计算效率更高。


http://www.ppmy.cn/news/213414.html

相关文章

注意力机制QKV的作用 简单易懂

关于注意力机制&#xff0c;一直都了解的比较浅显&#xff0c;只知道怎么去计算&#xff0c;但是具体算出来的怎么就体现了词跟词之间的关系一点都不清楚。 后来在b站上看到一个讲解transformer的视频&#xff0c;里边给了一个特别简单易懂的解释&#xff0c;就把它粘过来分享一…

【C++/嵌入式笔试面试八股】一、38.面向对象 | C++11新标准 | 异常处理

面向对象 135.面向对象和面向过程有什么区别? 面向对象编程强调的是数据和方法的封装,即将数据和相关的操作封装在一起,形成一个对象。面向对象编程的核心是类(Class)和对象(Object)的概念,通过类定义对象的属性和方法,然后通过实例化对象来进行操作。面向对象编程可…

Go Web下GORM框架使用(二)

〇、前言 本文将会写一个前后端分离的的小项目&#xff0c;本文将会只实现后端。 一、定义全局变量与模型 本文需要一个数据库&#xff0c;因此将这个数据库定义为全局变量将会非常轻松。 var (DB *gorm.DB )type Todo struct {ID int json:"id"Title s…

以太网交换机的生成树协议STP

以太网交换机的生成树协议STP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;以太网交换机的生成树协议STP 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 如下图所示以太网中出现链路故障导致部分主机间无法进行通信 如何提高以太网的可靠性&am…

线程引入的开销

单线程程序既不存在线程调度&#xff0c;也不存在同步开销&#xff0c;而且不需要使用锁来保证数据结构的一致性。在多个线程的调度和协调过程中都需要一定的性能开销&#xff1a;对于为了提升性能而引入的线程来说&#xff0c;并行带来的性能提升必须超过并发导致的开销。 上下…

C#委托

C#委托 文章目录 C#委托委托定义委托实例化Action与Func 委托是一种动态调用方法的类型&#xff0c;委托是对方法的抽象和封装。 函数指针。 调用委托时&#xff0c;委托包含的所有方法将被执行。 委托定义 delegate关键字 修饰符 delegate 返回值类型 委托名( 参数列表 )…

QSS中position属性的作用及应用场景详解

概述 QSS&#xff08;Qt Style Sheets&#xff09;是用于美化和定制化Qt应用程序的样式表语言。其中的position属性是用于控制元素的定位方式。了解和掌握position属性的使用方法对于创建精美的用户界面布局至关重要。本文将详细介绍QSS中position属性的作用、用法以及一些常见…

教你win7显卡驱动如何安装,win7电脑显卡驱动的安装方法

win7显卡驱动安装失败怎么办?显卡是电脑重要配置之一,想要显卡正常工作,就需要给电脑装上显卡驱动.最近有朋友反映自己的显卡驱动安装不上怎么办.下面小白教下大家win7显卡驱动安装失败的解决方法.更多win11安装教程 1.打开系统界面后&#xff0c;先点击控制面板主页。 2.点击…