深度学习 Transformer 的自注意力机制掩码

A

01

引言

深度学习 Transformer 自注意力机制中的掩码(Mask)是一种关键技术,用于控制模型在处理序列数据时哪些位置的信息可以被相互关注。掩码在不同的上下文中有不同的应用,但总体目的是防止在处理序列的当前位置时“泄露”未来位置的信息或者忽略无关的位置。

02

理解

常见的掩码类型:

1. 遮蔽未来的信息(Look-ahead Mask)

在自回归任务中,如语言模型或机器翻译,每个输出应该仅依赖于它之前的输出。因此,需要一个掩码来确保在计算当前输出时忽略所有未来的位置。

这种掩码通常是一个上三角矩阵,其中对角线及以下的元素为 True(表示掩蔽),对角线以上的元素为 False(表示不掩蔽)。

2. 填充掩码(Padding Mask)

在处理变长序列时,通常需要将序列填充到相同的长度。填充的位置对于模型来说是无关的,因此需要一个掩码来告诉模型忽略这些位置。

这种掩码通常基于一个二进制矩阵,其中填充位置为 True(表示掩蔽),非填充位置为 False。

自注意力机制中的掩码应用

在自注意力层中,掩码用于修改注意力分数,使得被掩码的位置的权重为零(或接近零),从而在计算注意力加权平均时忽略这些位置。具体步骤如下:

1. 计算注意力分数

通常通过计算查询(Query)、键(Key)之间的点积,然后除以缩放因子(通常是键向量的维度的平方根)。

2. 应用掩码

将掩码与注意力分数相乘。对于填充掩码,可以直接将 True 位置的分数设置为一个非常小的负数(如 -1e9),这样在应用 softmax 函数时,这些位置的权重将接近于零。

对于遮蔽未来的信息的掩码,同样可以将被掩码位置的分数设置为一个非常小的负数。

3. 计算注意力权重

使用 softmax 函数对修改后的注意力分数进行归一化,得到注意力权重。

4. 计算加权平均

使用注意力权重对值(Value)向量进行加权平均,得到最终的输出。

5. 例子

在代码段中,return subsequent_mask == 0 这个表达式用于生成一个布尔类型的张量,指定了哪些位置应该被掩蔽。

解释

subsequent_mask 是一个通过 torch.triu 创建的上三角矩阵,其中对角线和对角线以上的元素被设置为 1(因为 torch.triu 默认创建一个上三角矩阵,其中对角线及以上位置为 True,以下为 False)。在调用 .type(torch.uint8) 后,这些值被转换为 1(真)和 0(假)。

当执行 subsequent_mask == 0 时,此操作会逐一检查 subsequent_mask 中的每个元素是否等于 0:

  • 如果元素值为 0(即原来是 False),则表达式结果为 True。

  • 如果元素值为 1(即原来是 True),则表达式结果为 False。

因此,返回的张量将具有以下特性:

  • 对角线及以下的元素(原始掩码中的值为0的地方)在返回的张量中会变为 True,表示这些位置应该被掩蔽(即在注意力计算中忽略这些位置)。

  • 对角线以上的元素(原始掩码中的值为1的地方)在返回的张量中会变为 False,表示不需要掩蔽这些位置。

例子

假设 size=3,则 subsequent_mask 为:

  1 1 1
  0 1 1
  0 0 1

经过 subsequent_mask == 0 操作后,得到的张量为:


False  False  False
True   False  False
True   True   False

03

代码

假设有一个简单的自注意力计算:

import torch
import torch.nn.functional as F

query = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)
key = torch.tensor([[5, 6], [7, 8]], dtype=torch.float32)
value = torch.tensor([[9, 10], [11, 12]], dtype=torch.float32)

# 计算点积
scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(query.size(-1))

# 创建一个遮蔽未来的掩码
mask = torch.triu(torch.ones_like(scores), diagonal=1) == 0

# 应用掩码
scores = scores.masked_fill(mask, float('-inf'))

# 计算注意力权重
attention = F.softmax(scores, dim=-1)

# 计算加权平均
output = torch.matmul(attention, value)

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值