因果注意力(or 掩码注意力)代码实现

Self-attention公式推导及代码整理 文章是整理的如何不费力的理解self-attention公式的方法,以及如何理解其中的代码这是文章结构,按照如下流程:简化版self-attention(无矩阵权重)——self-attention——Causal attention——Multi-head attention就可以掌握self-attention及其变种的由来。 阅读详情
import torch
import torch.nn as nn
import math
import numpy as np


class CausalSelfAttention(nn.Module):
    def __init__(self, hidden_dim, n_heads, dropout=0.0):
        super().__init__()
        self.hidden_dim = hidden_dim
        self.n_heads = n_heads
        self.head_dim = hidden_dim // n_heads
        assert hidden_dim % n_heads == 0, "hidden_dim 必须能被 n_heads 整除"
        self.query = nn.Linear(hidden_dim, hidden_dim)
        self.key = nn.Linear(hidden_dim, hidden_dim)
        self.value = nn.Linear(hidden_dim, hidden_dim)
        self.output = nn.Linear(hidden_dim, hidden_dim)
        self.dropout = nn.Dropout(p=dropout)
    

    def forward(self, x, mask=None):
        q = self.query(x)
        k = self.key(x)
        v = self.value(x)
        return self.get_attention_scores(q, k, v, mask=mask)

    def get_attention_scores(self, q, k, v, mask=None):
        B, L, H = q.shape
        # 重塑张量以适应多头注意力
        q = q.view(B, L, self.n_heads, self.head_dim)
        k = k.view(B, L, self.n_heads, self.head_dim)
        v = v.view(B, L, self.n_heads, self.head_dim)
        # 调整维度顺序以进行批量矩阵乘法
        q = q.permute(0, 2, 1, 3) # (batch_size, num_heads, seq_len, head_dim)
        k = k.permute(0, 2, 1, 3)
        v = v.permute(0, 2, 1, 3)
        # 计算注意力分数
        attention_scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.head_dim)  # (batch_size, num_heads, seq_len, seq_len)
        if mask is not None:
            attention_scores = attention_scores.masked_fill_(mask==0, float('-inf'))
        # 计算注意力权重
        attention_weights = torch.softmax(attention_scores, dim=-1)
        attention_weights = self.dropout(attention_weights)
        # 计算输出
        out = torch.matmul(attention_weights, v) # (batch_size, num_heads, seq_len, head_dim)
        # 调整维度顺序并重塑回原始形状
        out = out.permute(0, 2, 1, 3).contiguous().view(B, L, H)
        out = self.output(out)
        return out

def generate_mask(x, causal=False):
    B, L, _ = x.shape
    original = torch.ones((L, L), dtype=torch.bool)
    if causal:
        mask = torch.tril(torch.ones((L, L), dtype=torch.bool)).unsqueeze(0).unsqueeze(0) # [1, 1, seq_len, seq_len]
    else:
        mask = torch.ones((L, L), dtype=torch.bool).unsqueeze(0).unsqueeze(0)  # [1, 1, seq_len, seq_len]
    return mask

if __name__ == "__main__":
    batch_size = 8
    seq_len = 16
    hidden_dim = 512
    num_heads = 8
    causal = True
    dropout = 0.1
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    # 创建模型实例并移动到目标设备
    model = CausalSelfAttention(hidden_dim=hidden_dim, n_heads=num_heads, dropout=dropout).to(device)
    # 生成输入张量并移动到目标设备
    x = torch.randn(batch_size, seq_len, hidden_dim).to(device)
    # 生成掩码并移动到目标设备
    if causal:
        mask = generate_mask(x, causal=True).to(device)
    else:
        mask = generate_mask(x, causal=False).to(device)
    # 前向传播
    output = model(x, mask=mask)
    print(output.shape)

掩码模型 vs. 因果模型:NLP 核心范式的全面指南 在自然语言处理(NLP)中,掩码语言模型(MLMs)和因果语言模型(CLMs)是构建基于 Transformer 模型的基础方法。它们的数学基础——MLMs 的双向注意力和 CLMs 的因果掩码——支撑了它们的优势。给定序列 $ X = [x_1, x_2, \ldots, x_n] $,标记子集 $ M $ 被掩码(例如,替换为 [MASK])。,BERT 使用特殊的 [CLS] 标记,其最终隐藏状态用作情感分析等任务的序列表示。K $ 和 $ V $ 是查询、键和值矩阵,$ d_k $ 是键维度。 阅读详情

相关推荐

GPT - 因果掩码(Causal Mask)

本节代码定义了一个函数,用于生成因果掩码(Causal Mask)。因果掩码通常用于自注意力机制中,以确保模型在解码时只能看到当前及之前的位置,而不能看到未来的信息。这种掩码在自然语言处理任务(如语言生成)中非常重要,因为它模拟了人类阅读或写作时的顺序性。

qq_60245590的博客 1836

从零开始实现大语言模型(六):因果注意力机制

因果注意力机制(causal attention)是一种特殊的自注意力机制,其在计算context向量$z_i$之前,会使用掩码(mask)屏蔽$x_{i+1}, x_{i+2}, \cdots, x_n$,使注意力权重$\alpha_{i,i+1}, \alpha_{i,i+2}, \cdots, \alpha_{in}$全都等于0,生成的context向量$z_i$只与$x_1, x_2, \cdots, x_i$相关,模型只根据历史信息预测下一个token。

RuizhiHe 5026

Keras多头注意力中因果掩码的实现:时间序列预测防信息泄露

在序列建模任务中,注意力机制通过计算序列元素间的关联权重,赋予模型捕捉长距离依赖的能力。其核心原理是计算查询(Query)、键(Key)和值(Value)之间的交互,并通过Softmax归一化得到注意力分布。为了确保模型在预测时仅依赖历史信息,防止未来数据泄露,需要引入因果掩码(Causal Masking)技术。这一技术对于构建可靠的**自回归**模型至关重要,尤其在**时间序列预测**领域,如金融、气象和能源消耗分析。通过生成一个下三角矩阵,将未来位置的注意力权重置零,从而强制模型遵循时间上的因果关系。

weixin_28737603的博客 350

torchtune注意力掩码:因果掩码与填充掩码实现

在大型语言模型(LLM)的训练与推理过程中,注意力掩码(Attention Mask)扮演着至关重要的角色。它能够控制模型在计算注意力时的可见范围,有效避免信息泄露并提升模型性能。本文将深入解析torchtune框架中两种核心注意力掩码——因果掩码(Causal Mask)与填充掩码(Padding Mask)的实现原理、应用场景及代码实践。 ## 掩码基础:为何需要注意力掩码? 注意力机制允

gitblog_00758的博客 776

2.3 解码器结构、因果掩码与归一化:原书第2章实现细节速览

摘要(149字):本文详解Transformer解码器关键实现细节:1)因果掩码确保自回归性,通过softmax前赋-∞屏蔽未来位置;2)Norm机制对比Pre-Norm(先Norm后子层+残差)与Post-Norm(先子层后Norm+残差),前者训练更稳定;3)归一化变体解析RMSNorm与LayerNorm的计算差异;4)典型Decoder块执行顺序为Norm→Attention→残差→Norm→FFN→残差。强调工程中需保持掩码逻辑一致,避免混淆Norm类型与残差位置。

yonggeit的博客 3250

【大语言模型 15】因果掩码与注意力掩码实现:深度学习中的信息流控制艺术

在Transformer架构中,掩码机制是控制信息流动的关键技术,决定了模型能够"看到"哪些信息。本文从最基础的掩码概念出发,深入解析因果掩码的数学原理和高效实现,详细讲解Padding掩码的处理技巧,并提供批量处理优化方案。我们将通过直观的可视化、完整的代码实现和性能对比,帮助读者掌握这门控制时序信息流动的艺术,为构建高效的语言模型奠定坚实基础。

熵数实验室 1517

大模型基础:注意力掩码

《大模型基础:注意力掩码》深入探讨了AI开发中的核心概念,重点解析了注意力掩码的技术原理与Python实现。文章从基本定义、关键术语入手,详细介绍了核心算法原理,包括参数初始化、前向传播、损失计算和反向传播等关键步骤。通过示例代码展示了完整的模型训练流程,涵盖数据处理、模型构建和性能评估。最后总结了注意力掩码在大模型开发中的重要性,为AI从业者提供了实用的技术指导和最佳实践建议。

编程世界如山海,探索不止。 1万+

告别色差!用Python+TCS34725颜色传感器实现精准色彩还原(附完整校准代码)

本文详细介绍了如何利用Python和TCS34725颜色传感器实现专业级色彩还原方案。通过双阶校准法(白光校准和黑电平校准)和进阶的光照自适应技术,解决传感器原始数据不准的问题,并提供完整的校准代码和实战案例,帮助开发者实现ΔE<3的高精度色彩识别。

weixin_30836759的博客 209

注意力机制中三种掩码技术详解和Pytorch实现

最后我们来做个总结,在自然语言处理和其他序列处理任务中,使用不同类型的掩码来管理和优化模型处理信息的方式是非常关键的。这些掩码主要包括填充掩码、序列掩码和前瞻掩码,每种掩码都有其特定的使用场景和目的。填充掩码(Padding Mask):-目的:确保模型在处理填充的输入数据时不会将这些无关的数据当作有效信息处理。应用:主要用于处理因数据长度不一致而进行的填充操作,在模型的输入层或注意力机制中忽略这些填充数据。功能:帮助模型集中于实际的、有效的输入数据,避免因为处理无意义的填充数据而导致的性能下降。

deephub 7789

用MFRC522+STM32打造智能门禁:从硬件选型到云端控制全流程

本文详细介绍了基于STM32微控制器和MFRC522射频模块构建智能门禁系统的完整流程。从硬件选型、电路设计、底层驱动开发,到系统软件架构与状态机设计,并最终实现通过ESP8266模块接入云端平台(如OneNET)进行远程控制和数据可视化。项目深入探讨了MFRC522的SPI通信、卡片操作流程、天线调试以及云端MQTT集成等关键技术,为嵌入式开发者提供了一个从本地感知到云端管控的物联网项目实战参考。

raspberrypi5的博客 741

图解链表 —— JAVA中的单链表基本操作

文章目录1. 什么是链表2. 链表的种类3. 创建单链表3.1 创建 Node 类(车厢类)3.2 创建 MySingleList (火车类)4. 单链表的基本操作4.1 增加链表元素4.1.1 在链表头部添加元素4.1.2 在链表任意位置添加元素4.1.3 在链表尾部添加元素4.2 删除链表元素4.2.1 删除第一个节点元素4.2.2 删除任意位置 index 元素4.2.3 删除链表中指定元素的第一个节点4.2.4 删除链表的所有指定元素4.3 查找链表元素4.3.1 判断链表中是否包含元素 data4

AlinaQ05的博客 2502

图像大模型中的注意力和因果掩码

图像领域中 LLM 的对应物。尽管iGPT已经存在 2 年多了,但自回归尚未得到充分探索。在本文中,作者表明,当使用 AIM 对网络进行预训练时,一组图像数据集上的下游任务的平均准确率会随着数据和参数的增加而线性增加。要运行下面的代码,请使用我的在这篇博客中,我们将了解自注意力中的 Casual Masking 是什么,然后看看 PrefixLM 是如何设计的。在阅读这篇博客之前,我强烈建议你先观看这个。让我们先加载所需的库。让我们创建一个大小为 224x224 的图像,其中补丁大小为 32。

新缸中之脑 1050

功率电感的设计步骤

学习视频原链接截图1截图2。

qq_32419593的博客 4887

PyTorch FlexAttention技术实践:基于BlockMask实现因果注意力与变长序列处理

填充掩码与因果掩码的主要区别在于其批次依赖性,即掩码值取决于每个序列中填充token的具体位置。鉴于目前网络上缺乏关于FlexAttention处理填充输入序列的完整代码示例和技术讨论,本文将详细阐述一种实现方法,该方法同时涵盖了因果注意力机制的实现。要使用此功能,需要将掩码定义为布尔类型张量。我们通过attention-gym仓库进行安装,这样可以确保组件间的兼容性,同时获取其可视化工具的使用权限。从可视化结果可以观察到,填充token和未来token的注意力权重都被有效地屏蔽,验证了实现的正确性。

deephub 5219

多算法数据预测——BP、ELM、LSTM、BiLSTM和SAELSTM,附Matlab源码

本文将为大家介绍基于BP、ELM、LSTM、BiLSTM和SAELSTM多种算法的数据预测,并提供相应的Matlab源码。SAELSTM算法是一种结合自动编码器和LSTM神经网络的深度学习方法,用于时间序列数据预测。ELM算法是一种单层前向神经网络,在单次训练过程中直接产生输出权重,从而具有快速学习和良好推广性能。多算法数据预测——BP、ELM、LSTM、BiLSTM和SAELSTM,附Matlab源码。总体来看,采用多种算法进行数据预测可以提高预测准确率,并可根据不同场景选择适合的算法。

qq_39605374的博客 864

Python爬虫实战:使用Scrapy+Playwright高效爬取全球石油价格历史数据

python复制下载# 产品信息# 日期信息# 价格数据price = scrapy.Field() # 收盘价open = scrapy.Field() # 开盘价high = scrapy.Field() # 最高价low = scrapy.Field() # 最低价volume = scrapy.Field() # 交易量change_percent = scrapy.Field() # 涨跌幅# 元数据。

2201_76125261的博客 1020

揭秘因果掩码:语言模型中的注意力控制机制

在当今人工智能飞速发展的时代,**因果掩码机制**已成为语言模型领域的重要技术。这个看似复杂的概念,实际上是一种让模型"专注当下"的神奇工具。想象一下,如果一个人只能根据已经说过的内容来预测接下来要说什么,这就是因果掩码的核心原理。 ## 🔍 什么是因果掩码? **因果掩码机制**是一种特殊的注意力控制技术。简单来说,它就像一个"遮罩",阻止模型在生成文本时"偷看"未来的信息。就像我们人类写

gitblog_00270的博客 970

matplotlib保存图片设置分辨率总是96dpi,好烦躁,教你一招轻松解决

matplotlib保存图片设置分辨率总是96dpi,好烦躁,教你一招轻松解决 目录 matplotlib保存图片设置分辨率总是96dpi,好烦躁,教你一招轻松解决 #使用plt.savefig("cm.png",dpi = 300)为什么不管用 #plt.rcParams也不管用 #解决方案 在做论文的过程中,许多期刊或者会议对图片的分辨率有明确的要求,例如,dpi=300。 之前画曲线图都是采取保存方式为savefig(dpi=300),然后查看保存图片的属性信息,然而你看到的现象是

data+scenario+science+insight 8800

Transformer多头自注意力及掩码机制详解

在本文中我们重点介绍Transformer中的掩码机制及多头自注意力模块的原理以及代码实现。掩码机制是Transformer中非常重要的一个部分,在模型结构图中的三个地方有用到掩码机制,如下图所示。Transformer中的掩码分为两种,分别是填充mask和因果mask。在下图中,1和2所在为位置为填充mask,3所在的位置为因果mask。

m0_64148253的博客 1万+

[Dify实战] 招聘筛简历机器人:自动筛选、排序、生成面试要点-带绑定资源

摘要:本文介绍了如何利用Dify优化简历筛选流程,解决人工筛选耗时、标准不统一等问题。通过结构化输出"评分+亮点+风险+面试关注点",将主观判断转化为规则化流程。关键步骤包括:设计标准化Prompt、配置权重排序策略、确保公平合规性、与ATS系统对接,以及持续优化评估指标。该方法能显著提升筛选效率(缩短招聘周期)、增强一致性(避免主观偏差),并为面试官提供结构化参考信息,最终实现更高效精准的人才筛选。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 581

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

多模态大模型掩码梳理笔记:因果掩码,视觉-语言任务掩码设计

多模态大模型如何针对不同的任务设计Attention Mask

学习记录 2262

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

FlashAttention因果掩码实现:自回归模型关键技术支持

在当今大语言模型(LLM)和生成式AI的浪潮中,自回归(Auto-Regressive)模型已成为核心技术。这类模型在生成文本时,每个位置只能关注其前面的位置,这种约束通过因果掩码(Causal Mask)实现。然而,传统的因果注意力实现面临着**内存占用二次增长**和**计算效率低下**的双重挑战。 FlashAttention通过创新的IO感知算法和硬件优化,彻底改变了这一局面。其因果掩码实...

gitblog_00503的博客 1119

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【大语言模型】—— 自注意力机制及其变体(交叉注意力、因果注意力、多头注意力)的代码实现

本文介绍了注意力机制的几种变体及其PyTorch代码实现。主要包括: Self-Attention:基础自注意力机制,通过Q、K、V计算注意力权重,适用于序列内部建模。 CrossAttention:让一个序列关注另一个序列,典型应用于Transformer解码器-编码器交互和多模态任务。 CausalAttention:通过三角掩码实现因果性,确保只能关注当前位置之前的token,适用于自回归生成任务。 MultiHeadSelfAttention:多头注意力机制,将输入分割到多个子空间并行计算注意力,最

我们都是被分成两半的人,一边热爱生活,一边憎恨生活。面对生活,我们总是在矛盾的两端摇摆,在反复的矛盾和犹豫中,一边踉跄前行,一边重振旗鼓。我渴望改变,渴望变得更好,渴望找到出口……就像一个溺水人的挣扎,就像一个救生圈。我是一个矛盾集合体,想要变得快乐,但是 1346

因果注意力(Causal Attention)完整原理与从零 NumPy 实现

因果注意力(Causal Attention)是一种自注意力机制,广泛应用于自回归模型中,尤其是在自然语言处理和时间序列预测等任务中。它的核心思想是在生成每个时间步的输出时,只关注当前时间步及之前的时间步,确保生成过程的因果性,从而避免模型在预测时依赖未来的信息。

SimpleLearning 7219

一文看懂注意力机制:点积注意力机制、QKV含义、自注意力、多头注意力、注意力掩码

Q权重矩阵的作用是将输入序列中的每个元素(如词向量)转换为查询向量(Query Vector)。每个位置的查询向量(qiq_iqi​)代表该位置“想要获取的信息类型”。例如,在句子“猫追狗”中,“追”这个词的查询向量可能会主动去寻找“动作的发出者”和“动作的接收者”相关的信息。直观理解:可以把查询向量想象成“问题”——比如“我需要和谁关联?”“谁对我重要?K权重矩阵的作用是将输入序列中的每个元素转换为键向量(Key Vector)。每个位置的键向量(kjk_jkj​。

TracyCoder的博客 1645

通俗理解注意力掩码(Attention Mask)

注意力掩码:深度学习中的关键机制 本文深入解析了注意力机制及其核心组件注意力掩码的原理与应用。注意力机制通过动态分配权重模拟人类认知,其数学表达式为Query、Key、Value的交互计算。在实际应用中,注意力掩码通过布尔/数值矩阵控制信息流,主要解决两大问题:处理不同长度序列的Padding Mask(防止关注填充符)和确保因果关系的Causal Mask(防止模型"偷看"未来信息)。文章详细介绍了各类掩码的实现细节,包括PyTorch代码示例,并探讨了其在机器翻译、BERT、GPT等

1482
上一篇: kmeans实现
下一篇: Image和base64相互转化
SmartDemo
博客等级 码龄9年 176粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值