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

transformer中的build_attention_mask

build_attention_mask 方法的作用是构建一个因果注意力掩码,用于屏蔽 Transformer 模型中的未来位置。

因果注意力掩码的工作原理

因果注意力掩码通过将未来位置的注意力权重设置为负无穷大,从而确保这些位置的注意力得分在 softmax 计算中接近于零。具体来说,这个掩码矩阵是一个上三角矩阵,其中上三角部分(不包括对角线)被设置为负无穷大。这样,当计算第 𝑖个位置的注意力分数时,只会考虑位置
0 到 𝑖的内容,而忽略位置 𝑖+1及之后的位置,这对于生成任务(如语言模型)非常重要。下面是这个方法的实现和详细解释:

详细解释

  1. 掩码矩阵的构建

    • 掩码矩阵 mask 的形状为 ([context_length, context_length])。
    • mask.fill_(float("-inf")) 将矩阵的所有元素初始化为负无穷大。
    • mask.triu_(1) 将上三角部分(不包括对角线)设置为零。
  2. 应用掩码

    • 在计算注意力分数时,这个掩码会被添加到注意力分数矩阵中。
    • 由于被掩盖的部分被设置为负无穷大,它们在 softmax 计算中会得到接近零的权重,从而 effectively 被忽略。

示例

假设 context_length 为 5,那么生成的掩码 mask 将如下所示:

tensor([[  0., -inf, -inf, -inf, -inf],[  0.,   0., -inf, -inf, -inf],[  0.,   0.,   0., -inf, -inf],[  0.,   0.,   0.,   0., -inf],[  0.,   0.,   0.,   0.,   0.]])

计算注意力分数时的效果

在计算注意力分数时,假设我们有以下示例:

  • 输入序列:[x_0, x_1, x_2, x_3, x_4]
  • 注意力权重矩阵形状:[context_length, context_length]

计算第 ( i ) 个位置的注意力分数时,将使用掩码矩阵对注意力权重进行修正:

未加掩码时的注意力权重矩阵:
[[a00, a01, a02, a03, a04],[a10, a11, a12, a13, a14],[a20, a21, a22, a23, a24],[a30, a31, a32, a33, a34],[a40, a41, a42, a43, a44]]加上掩码后的注意力权重矩阵:
[[a00, -inf, -inf, -inf, -inf],[a10,  a11, -inf, -inf, -inf],[a20,  a21,  a22, -inf, -inf],[a30,  a31,  a32,  a33, -inf],[a40,  a41,  a42,  a43,  a44]]

为什么可以确保位置 ( i ) 只能关注位置 ( 0 ) 到 ( i )

  • 对于位置 ( 0 ),只有 ( a00 ) 会被保留,其他的都被设置为负无穷大。
  • 对于位置 ( 1 ),只有 ( a10 ) 和 ( a11 ) 会被保留,其他的都被设置为负无穷大。
  • 对于位置 ( 2 ),只有 ( a20 ), ( a21 ), ( a22 ) 会被保留,其他的都被设置为负无穷大。
  • 对于位置 ( 3 ),只有 ( a30 ), ( a31 ), ( a32 ), ( a33 ) 会被保留,其他的都被设置为负无穷大。
  • 对于位置 ( 4 ),所有的 ( a40, a41, a42, a43, a44 ) 都会被保留,因为它已经是最后一个位置。

这种掩码方式确保了模型在生成第 ( i ) 个位置的输出时,不会看到第 ( i+1 ) 及之后的位置的输入。

代码示例

以下是一个简单的代码示例,展示了如何使用 build_attention_mask 生成掩码并应用到注意力机制中:

import torchclass ExampleModel:def __init__(self, context_length):self.context_length = context_lengthdef build_attention_mask(self):mask = torch.empty(self.context_length, self.context_length)mask.fill_(float("-inf"))mask.triu_(1)return mask# 假设 context_length 为 5
context_length = 5
model = ExampleModel(context_length)
attention_mask = model.build_attention_mask()print(attention_mask)# 示例的注意力权重矩阵
attention_weights = torch.randn(context_length, context_length)# 加上掩码后的注意力权重矩阵
masked_attention_weights = attention_weights + attention_mask
print(masked_attention_weights)

总结

build_attention_mask 方法通过生成一个上三角掩码矩阵,确保了每个位置 ( i ) 只能关注位置 ( 0 ) 到 ( i ),而不能关注位置 ( i+1 ) 及之后的位置。这个机制通过在注意力分数计算中设置负无穷大,使得这些位置在 softmax 计算中得到接近零的权重,从而 effectively 被忽略。这对于生成任务(如语言模型)非常重要,确保模型在生成时只依赖已生成的部分,而不会看到未来的输入。

相关文章:

  • HTTP 请求中的 Content-Type 类型详解
  • [15] 使用Opencv_CUDA 模块实现基本计算机视觉程序
  • Uniapp在屏幕尺寸低于960出现样式错乱(开箱即用)
  • setInterval 定时任务执行时间不准验证
  • Redis晋级之路!!
  • 阅读笔记:明朝那些事儿妖孽横行的宫廷
  • 基于Vue-cli脚手架搭建项目使用ElementUI组件
  • vue3第五阶段开发文档,后台管理系统
  • STM32 Customer BootLoader 刷新项目 (二) 方案介绍
  • Day8 —— 大数据技术之HBase
  • CPP-类对象大小的组成
  • Pip换源秘籍:让你的Python包飞行起来!
  • 美团携手HarmonyOS SDK,开启便捷生活新篇章
  • 佳能打印机问题解决
  • 发表在SIGMOD 2024上的高维向量检索/向量数据库/ANNS相关论文
  • 自己简单写的 事件订阅机制
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [LeetCode] Wiggle Sort
  • angular学习第一篇-----环境搭建
  • CSS中外联样式表代表的含义
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Git的一些常用操作
  • java 多线程基础, 我觉得还是有必要看看的
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue2.0 实现互斥
  • 机器学习中为什么要做归一化normalization
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何选择开源的机器学习框架?
  • 运行时添加log4j2的appender
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 数据可视化之下发图实践
  • ​ArcGIS Pro 如何批量删除字段
  • ​水经微图Web1.5.0版即将上线
  • $.ajax()方法详解
  • (007)XHTML文档之标题——h1~h6
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (11)MATLAB PCA+SVM 人脸识别
  • (done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (k8s中)docker netty OOM问题记录
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (WSI分类)WSI分类文献小综述 2024
  • (zhuan) 一些RL的文献(及笔记)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计高校学生选课系统
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十)Flink Table API 和 SQL 基本概念
  • (十三)Flink SQL
  • (转)C语言家族扩展收藏 (转)C语言家族扩展