当前位置: 首页 > news >正文

transformer-注意力评分函数

目录

10.2 节使用了高斯核来对查询和键之间的关系建模,10.6中的高斯核指数部分可以视为注意力评分函数,简称评分函数,然后把这个函数的输出结果输入softmax 函数中进行运算,通过上述步骤,将得到与键对应的值的概率分布,最后,注意力汇聚的输出就是基于这些注意力权重的值的加权和。


评分函数 注意力权重 输出

softmax

查询

10-4 计算注意力汇聚输出加权

数学语言描述假设有一个查询q 属于 Rqm(ki, ,,,v1),,,,(km,Vm) 其中ki属于Rk

Vi属于Rv注意力汇聚函数f表示加权

f(q,(k1, V1)) = Sigma a(q,ki) Vi属于Rv

其中查询qKi注意力权重通过注意力评分函数a两个向量映射标量再经过softmax运算得到

正如图10-4所示选择不同注意力评分函数a会导致不同注意力汇聚操作介绍两个流行评分函数稍后将用实现更复杂注意力机制

import math

import torch

from torch import nn

from d2l import torch as d2l

10.3.1 掩蔽softmax操作

上面提到softmax操作用于输出一个概率分布注意力权重在某些情况并非所有都应该纳入注意力汇聚中例如为了9.5高校处理小批量数据集某些文本序列填充没有意义特殊词元为了仅将有意义词元作为获取注意力汇聚可以指定一个有效序列长度以便计算softmax过滤掉超出指定范围位置下面masked_softmax函数实现了这样掩蔽softmax操作其中任何超出有效长度位置都被掩蔽设置0.

def masked_softmax(X, valid_lens):

通过在最后一个轴上掩蔽元素来执行softmax操作

X:3D张量valid_lens:1D2D张量

if valid_lens is None:

return nn.functional.softmax(X, dim = -1)

else:

shape = X.shape

if valid_lens.dim() == 1:

valid_lens = torch.repeat_interleave(valid_lens, shape[1])

else:

valid_lens = valid_lens.reshape(-1)

最后一个掩蔽元素使用一个非常负值替换从而softmax输出0

X=d2l.sequence_mask(X.reshape(-1, shape[-1], valid_lens, value=-1e6))

return nn.functional_softmax(X.reshape(shape), dim=-1)

为了掩饰函数如何工作考虑两个2x4矩阵表示样本这两个样本有效长度分别23经过掩蔽softmax操作超出有效长度都被掩蔽0

masked_softmax(torch.rand(2,2,4), torch.tensor([2,3]))

同样也可以使用二维张量矩阵样本中每一行指定有效长度

masked_softmax(torch.rand(2,2,4), torch.tensor([1,3],[2,4]))

10.3.2 加性注意力

当查询不同长度向量可以使用加性注意力作为评分函数给定查询q属于Rqk属于Rk,加性注意力评分函数

学习参数Wq属于RkxqWk属于RhxkWt属于Rh 查询连接起来后输入一个多层感知MLP感知机包含一个隐藏隐藏单元一个参数h通过使用tanh作为激活函数并且禁用偏置

下面实现加性注意力

class AdditiveAttention(nn.Module)

加性注意力

def __init__(self, key_size, query_size, num_hiddens, dropout, **kwargs):

super(AdditiveAttention, self).__init__(**kwargs)

self.W_k = nn.Linear(key_size, num_hiddens, bias = False)

self.W_q = nn.Linear(query_size, num_hiddens, bias = False)

self.W_v = nn.Linear(num_hiddens, 1, bias = False)

def forward(self, queries, keys, values, valid_lens):

queries, keys = self.W_q(queries), self.W_k(keys)

#在维度扩展后

#queries形状(batch_size, 查询数,1,num_hidden)

#key 的形状(batch_size, 1, 键-值对数,num_hiddens)

#使用广播方式求和

features = queries.unsqueeze(2) + keys.unqueeze(1)

features = torch.tanh(features)

#self.w_v仅有一个输出因此形状移除最后维度

scores形状(batch_size, 查询数,键-值对数)

scores = self.w_v(features).squeeze(-1)

self.attention_weights = masked_softmax(scores, valid_lens)

values 形状batch_size, -对数维度

return torch.bmm(self.dropout(self.attention_weights), values)

用一个小例子演示上面additiveAttention其中查询形状大小步数词元序列长度实际输出2,1,20注意力汇聚输出形状 批量大小查询步数维度

queries, keys = torch.normal(0,1,(2,1,20)), torch.ones(2, 10, 2)

#values小批量两个值矩阵相同

values = torch.arange(40, dtype = torch.float32).reshape(1, 10, 4).repeat(2, 1, 1)

valid_lens = torch.tensor([2, 6])

attention = AdditiveAttention(key_size = 2, query_size=20, num_hiddens=8, dropout = 0.1)

attention.eval()

attention(queries, keys, values, valid_lens)

尽管加性注意力包含了可学习参数由于本例每个都是相同因此注意力权重均匀指定有效长度决定

d2l.show_heatmaps(attention.attention_weights.reshape(1,1,2,10)):

xlabel='keys', ylabel='Queries'

10.3.3 缩放点积注意力

使用点积可以得到计算效率更高评分函数但是点积操作要求查询具有相同长度d假设查询的所有元素都是独立随机变量并且都满足均值单位方差那么两个向量点积均值0方差d为确保无论向量长度如何点积方差不考虑向量长度情况都是1我们点积除以 根号d缩放点积注意力评分函数

在实践中我们通常小批量角度i考虑提高效率例如基于n查询m-计算注意力其中查询长度d, 长度v查询Q属于Rnxd

下面缩放点积注意力的实现使用暂退进行模型正则化

class DotProdductAttention(nn.Module):

缩放点积注意力

def __init__(self, dropout, **kwargs):

super(DotProductAttention, self).__init__(**kwargs)

self.dropout = nn.Dropout(dropout)

#queries 形状batch_szie,查询数d

#keys形状batch_size, -对数d

values形状batch_size -对数维度

valid_lens形状batch_size, 或者batch_size, valid_lens = None

def forward(self, queries, keys, values, valid_lens = None):

d = queries.shape[-1]

设置transpose_b=True为了交换keys最后两个维度

scores = torch.bmm(queries, keys.transpose(1,2))/math.sqrt(d)

self.attention_weights = masked_softmax(scores, valid_lens)

return torch.bmm(self.dropout(self.attention_weights), values)

为了演示上述DotProductAttention我们使用加性注意力例子相同有效长度对于点积操作我们查询特征维度特征维度大小相同

queries = torch.normal(0, 1, (2, 1, 2))

attention = DotProductAttention(dropout=0.5)

attention.eval()

attention(queries, keys, values, valid_lens)

加性注意力演示相同由于包含是相同元素这些元素无法通过任何查询进行区分因此获得均匀注意力权重

d2l.show_heatmaps(attention.attention_weights.reshape(1, 1, 2, 10)),

xlabel='Keys', ylabel='Queries'

小结注意力汇聚输出计算可以作为加权平均选择不同注意力评分函数会带来不同注意力汇聚操作

当查询不同长度向量可以使用加性注意力评分函数他们长度相同使用缩放点积注意力评分函数计算效率更高

http://www.dtcms.com/a/486000.html

相关文章:

  • 破解 Shuffle 阻塞:Spark RDD 宽窄依赖在实时特征工程中的实战与未来
  • TypeScript入门学习
  • 西固网站建设平台12306网站花多少钱做的
  • Linux运维实战:云原生设计与实施DockerK8S(视频教程)
  • Chroma 开源的 AI 应用搜索与检索数据库(即向量数据库)
  • 楼宇自控 DDC 系统 + IBMS 智能化集成系统:构建建筑智慧运营双核心
  • 《深度学习框架核心之争:PyTorch动态图与早期TensorFlow静态图的底层逻辑与实战对比》
  • 固件下printf函数分析
  • 做外贸都得有网站吗秦皇岛网站排名公司
  • AI-Native 能力反思(三):Prompt Engineering 自我提升神器
  • 基于Django+Vue2+MySQL前后端分离的红色故事分享平台
  • LangGraph 工作流全解析:从 Prompt 到智能体编排的革命
  • JAVA算法练习题day42
  • 天津市建设工程备案网站什么是网站的层次
  • 【基础算法】BFS
  • 国家工信部网站备案查询系统公司网址怎么做出来的
  • 做网站都用到哪些软件asp源码打开网站
  • React组件生命周期节点触发时机(组件加载Mount、组件更新Update、组件卸载Unmount)组件挂载
  • 月球矩阵日志:Swift 6.2 主线程隔离抉择(上)
  • 无需 iCloud 在 iPhone 之间传输文本消息
  • Flink受管状态自定义序列化原理深度解析与实践指南
  • Unity Visual Graph粒子系统 Plexus 效果
  • 淘宝里网站建设公司可以吗无经验能做sem专员
  • seo技术秋蝉河北网站优化建设
  • C++微服务 UserServer 设计与实现
  • 设计模式篇之 迭代器模式 Iterator
  • Spring MVC 多租户架构与数据隔离教程
  • MySQL数据库如何实现主从复制
  • 如何在 Docker 中设置环境变量 ?
  • 【C++】STL容器--list的使用