详解 torch.triu:上三角矩阵的高效构造(中英双语)
详解 torch.triu:上三角矩阵的高效构造
在深度学习和矩阵运算中,我们经常需要构造上三角矩阵(Upper Triangular Matrix),其中主对角线以下的元素全部设为 0。PyTorch 提供了一个高效的函数 torch.triu(),用于生成上三角矩阵,并允许我们灵活地调整对角线的偏移量。
在本篇博客中,我们将深入探讨:
torch.triu()的基本用法- 第二个参数
diagonal如何影响结果 torch.triu(all_ones, -1 * 2 + 1)会生成什么- 代码示例与应用场景
1. torch.triu 的基本用法
1.1 语法
torch.triu(input, diagonal=0)
input:输入张量(必须是 2D 矩阵)diagonal:指定从哪条对角线开始保留元素:diagonal=0(默认):保留主对角线及其上的元素diagonal>0:向上偏移diagonal行diagonal<0:向下偏移diagonal行
1.2 示例:默认 diagonal=0
import torchA = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]
])B = torch.triu(A)
print(B)
输出:
tensor([[1, 2, 3],[0, 5, 6],[0, 0, 9]])
解释:
- 主对角线(
1, 5, 9)及其上方元素(2, 3, 6)被保留 - 下三角部分(
4, 7, 8)被置为0
2. diagonal 参数的作用
2.1 diagonal > 0:向上偏移
B = torch.triu(A, diagonal=1)
print(B)
输出:
tensor([[0, 2, 3],[0, 0, 6],[0, 0, 0]])
解释:
diagonal=1表示从主对角线上方一行开始保留元素- 主对角线元素(
1, 5, 9)被置为0 - 仅保留
2, 3, 6
2.2 diagonal < 0:向下偏移
B = torch.triu(A, diagonal=-1)
print(B)
输出:
tensor([[1, 2, 3],[4, 5, 6],[0, 8, 9]])
解释:
diagonal=-1表示从主对角线下一行开始保留元素- 主对角线以上元素仍保留
- 下三角部分的
7变成0,但4, 8仍然保留
3. torch.triu(all_ones, -1 * 2 + 1) 解析
假设:
all_ones = torch.ones(5, 5)
B = torch.triu(all_ones, -1 * 2 + 1)
print(B)
让我们拆解 diagonal 参数:
-1 * 2 + 1 = -1- 这等价于
torch.triu(all_ones, -1)
all_ones 矩阵:
tensor([[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1]])
torch.triu(all_ones, -1) 结果:
tensor([[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[0, 1, 1, 1, 1],[0, 0, 1, 1, 1],[0, 0, 0, 1, 1]])
解释:
diagonal=-1意味着主对角线及其上一行都保留- 低于
-1的部分被置0
4. torch.triu() 的应用场景
4.1 生成注意力掩码(Transformer)
在 Transformer 的自回归解码过程中,我们使用 torch.triu() 生成上三角掩码(mask),避免未来信息泄露:
seq_len = 5
mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1)
mask = mask.masked_fill(mask == 1, float('-inf'))
print(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.]])
用于 softmax 计算,使模型只能关注当前及之前的 token。
4.2 计算上三角矩阵的和
A = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]
])
upper_sum = torch.triu(A).sum()
print(upper_sum) # 26
解释:
- 只保留
1, 2, 3, 5, 6, 9 1 + 2 + 3 + 5 + 6 + 9 = 26
4.3 生成 Pascal 三角形
n = 5
pascal = torch.triu(torch.ones(n, n), diagonal=0)
for i in range(1, n):for j in range(1, i+1):pascal[i, j] = pascal[i-1, j-1] + pascal[i-1, j]
print(pascal)
输出:
tensor([[1., 0., 0., 0., 0.],[1., 1., 0., 0., 0.],[1., 2., 1., 0., 0.],[1., 3., 3., 1., 0.],[1., 4., 6., 4., 1.]])
5. 总结
torch.triu()用于生成上三角矩阵,对角线以下的元素设为 0。diagonal控制保留的最小对角线:diagonal=0:默认保留主对角线及以上diagonal>0:向上偏移,更多元素变0diagonal<0:向下偏移,更多元素被保留
torch.triu(all_ones, -1 * 2 + 1)生成diagonal=-1的上三角矩阵。- 常见应用:
- Transformer 掩码
- 矩阵运算
- 构造 Pascal 三角形
🚀 torch.triu() 是矩阵计算和深度学习中必不可少的函数,掌握它可以优化你的 PyTorch 代码!
Understanding torch.triu: Constructing Upper Triangular Matrices in PyTorch
In deep learning and matrix computations, upper triangular matrices are widely used, where all elements below the main diagonal are set to zero. PyTorch provides the efficient function torch.triu() to generate upper triangular matrices and allows flexible control over which diagonal to retain.
In this blog post, we will explore:
- The basic usage of
torch.triu() - How the second parameter
diagonalaffects the output - What
torch.triu(all_ones, -1 * 2 + 1)generates - Practical examples and applications
1. Introduction to torch.triu
1.1 Syntax
torch.triu(input, diagonal=0)
input: The input tensor (must be a 2D matrix).diagonal: Specifies which diagonal to retain:diagonal=0(default): Retains the main diagonal and elements above it.diagonal>0: Shifts retention upwards.diagonal<0: Shifts retention downwards.
1.2 Example: Default diagonal=0
import torchA = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]
])B = torch.triu(A)
print(B)
Output:
tensor([[1, 2, 3],[0, 5, 6],[0, 0, 9]])
Explanation:
- The main diagonal (
1, 5, 9) and elements above it (2, 3, 6) are retained. - The lower triangular part (
4, 7, 8) is set to0.
2. Understanding the diagonal Parameter
2.1 diagonal > 0: Shift upwards
B = torch.triu(A, diagonal=1)
print(B)
Output:
tensor([[0, 2, 3],[0, 0, 6],[0, 0, 0]])
Explanation:
diagonal=1retains elements from one row above the main diagonal.- The main diagonal (
1, 5, 9) is set to0. - Only elements
2, 3, 6are preserved.
2.2 diagonal < 0: Shift downwards
B = torch.triu(A, diagonal=-1)
print(B)
Output:
tensor([[1, 2, 3],[4, 5, 6],[0, 8, 9]])
Explanation:
diagonal=-1retains elements from one row below the main diagonal.- The main diagonal and upper part remain unchanged.
- The lowest element
7is set to0, but4, 8are retained.
3. What does torch.triu(all_ones, -1 * 2 + 1) generate?
Assume:
all_ones = torch.ones(5, 5)
B = torch.triu(all_ones, -1 * 2 + 1)
print(B)
Breaking down diagonal:
-1 * 2 + 1 = -1- Equivalent to
torch.triu(all_ones, -1)
all_ones matrix:
tensor([[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1]])
torch.triu(all_ones, -1) result:
tensor([[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[0, 1, 1, 1, 1],[0, 0, 1, 1, 1],[0, 0, 0, 1, 1]])
Explanation:
diagonal=-1means retaining the main diagonal and one row below it.- Elements below
-1are set to0.
4. Applications of torch.triu()
4.1 Generating Attention Masks (Transformers)
In Transformers, upper triangular masks are used to prevent future information leakage during autoregressive decoding:
seq_len = 5
mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1)
mask = mask.masked_fill(mask == 1, float('-inf'))
print(mask)
Output (Mask Matrix):
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.]])
This ensures that the model can only attend to current and past tokens.
4.2 Summing the Upper Triangular Matrix
A = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]
])
upper_sum = torch.triu(A).sum()
print(upper_sum) # 26
Explanation:
- Retains only
1, 2, 3, 5, 6, 9 1 + 2 + 3 + 5 + 6 + 9 = 26
4.3 Constructing Pascal’s Triangle
n = 5
pascal = torch.triu(torch.ones(n, n), diagonal=0)
for i in range(1, n):for j in range(1, i+1):pascal[i, j] = pascal[i-1, j-1] + pascal[i-1, j]
print(pascal)
Output:
tensor([[1., 0., 0., 0., 0.],[1., 1., 0., 0., 0.],[1., 2., 1., 0., 0.],[1., 3., 3., 1., 0.],[1., 4., 6., 4., 1.]])
5. Conclusion
torch.triu()constructs upper triangular matrices, setting elements below the specified diagonal to zero.- The
diagonalparameter controls which diagonal to retain:diagonal=0: Retains the main diagonal and above.diagonal>0: Shifts upwards, removing more elements.diagonal<0: Shifts downwards, keeping more elements.
torch.triu(all_ones, -1 * 2 + 1)generates an upper triangular matrix withdiagonal=-1.- Common use cases:
- Transformers attention masks
- Matrix computations
- Constructing Pascal’s triangle
🚀 torch.triu() is an essential function for matrix computations and deep learning, making PyTorch code more efficient and readable!
后记
2025年2月23日14点50分于上海,在GPT4o大模型辅助下完成。
相关文章:
详解 torch.triu:上三角矩阵的高效构造(中英双语)
详解 torch.triu:上三角矩阵的高效构造 在深度学习和矩阵运算中,我们经常需要构造上三角矩阵(Upper Triangular Matrix),其中主对角线以下的元素全部设为 0。PyTorch 提供了一个高效的函数 torch.triu(),用…...
[ TypeScript ] “undefined extends xxx“ 总是为 true 的 bug
版本号 "typescript": "^5.7.3", "unplugin": "^2.2.0",说明 在使用 unplugin 时 , 我定义插件的参数是 必填的, 使用时却是一个可空参数, 不传参也不会报错, (options?: UserOptions) > Return 😲😲&…...
高清下载油管视频到本地
下载工具并安装: yt-dlp官网地址: GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官网地址: Download FFmpeg 注:记住为其添加环境变量 操作命令: 该指令表示以720p码率下载VIDEO_UR…...
Hadoop常用操作命令
在NameNode节点格式化集群 初始化集群 hdfs namenode -format启动HDFS sbin/start-dfs.sh启动yarn sbin/start-yarn.sh启动NodeManager yarn-daemon.sh start nodemanager启动DataNode hadoop-daemon.sh start datanode启动SecondaryNameNode hadoop-daemon.sh start se…...
[HOT 100] 2439. 最小化数组中的最大值
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 2439. 最小化数组中的最大值 - 力扣(LeetCode) 2. 题目描述 给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。 每一步操作中&#…...
【JavaEE进阶】图书管理系统 - 贰
目录 🌲前言 🎄设计数据库 🍃引⼊MyBatis和MySQL驱动依赖 🌳Model创建 🎍约定前后端交互接口 🍀服务器代码 🚩控制层 🚩业务层 🚩数据层 🌴前端代码…...
Vue学习教程-14内置指令
文章目录 前言一、v-text指令二、v-html指令三、v-cloak指令四、v-once指令五、v-pre指令六、其他指令 前言 Vue.js 提供了许多内置指令(Directives),这些指令用于在模板中添加特殊功能。内置指令以 v- 前缀开始。 v-text : 更新元素的 tex…...
【蓝桥杯单片机】客观题
一、第十三届省赛(一) 二、第十三届省赛(二)...
C++ 设计模式-访问者模式
C++访问者模式 一、模式痛点:当if-else成为维护噩梦 开发动物园管理系统,最初的需求很简单: class Animal {}; class Cat : public Animal {}; class Dog : public Animal {};// 处理动物叫声 void makeSound(Animal* a) {if (auto c = dynamic_cast<Cat*>(a)) {st…...
靶场之路-Kioptix Level-1 mod_ssl 缓冲区溢出漏洞
声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章笔记的只是方便各位师傅学习知识,以下网站涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一、准备工作 首先使用 vmware 导入靶机文件, 然后网络模式改成 nat 模式即可 我们打…...
【Viewer.js】vue3封装图片查看器
效果图 需求 点击图片放大可关闭放大的 图片 下载 cnpm in viewerjs状态管理方法 stores/imgSeeStore.js import { defineStore } from pinia export const imgSeeStore defineStore(imgSeeStore, {state: () > ({showImgSee: false,ImgUrl: ,}),getters: {},actions: {…...
stm32mp采用spi接口扩展can
在 STM32MP 系列微处理器中,通过 SPI 转 CAN 功能扩展 CAN 接口需要结合硬件设计(如使用 SPI 接口的 CAN 控制器芯片)和 Linux 驱动配置。以下是详细的实现步骤和关键点: 硬件选型与连接 常用 SPI 转 CAN 芯片MCP2515:经典 SPI 转 CAN 控制器,支持 CAN 2.0B。MCP2517FD:…...
forge-1.21.x模组开发(二)给物品添加功能
功能效果 创建一个兑换券,当使用兑换券对着兑换机右键时,获得一条烤鱼 创建兑换券 创建ExchangeCouponsItem.java,继承Item,定义兑换券内容 public class ExchangeCouponsItem extends Item {public ExchangeCouponsItem(Prop…...
创建第一个 Maven 项目(一)
一、引言 在 Java 开发的广袤天地中,Maven 宛如一位全能的管家,发挥着举足轻重的作用。它是一个基于项目对象模型(POM)的项目管理和构建自动化工具,极大地简化了 Java 项目的开发流程。 Maven 的核心优势之一在于其强…...
网络运维学习笔记 022 HCIA-Datacom新增知识点03园区网典型组网架构及案例实战
园区网典型组网架构及案例实战 园区网:内部运行了园区网协议的一个主体网络 园区网络典型架构 园区网络常用协议与技术: 接入层: VLAN、生成树、链路聚合、AAA、dhcp-snooping等 汇聚层:DHCP、堆叠、链路聚合、生成树、OSPF、静…...
python-leetcode-二叉树的直径
543. 二叉树的直径 - 力扣(LeetCode) # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solutio…...
ubuntu中打包与压缩命令详解
Ubuntu 中打包与压缩命令详解 在 Ubuntu 系统中,打包和压缩文件是常见的操作。通过打包和压缩,可以将多个文件或目录合并为一个文件,并减小文件大小以节省存储空间或方便传输。本文将详细介绍 Ubuntu 中常用的打包与压缩命令及其用法。 目录…...
Linux MySQL 8.0.29 忽略表名大小写配置
Linux MySQL 8.0.29 忽略表名大小写配置 问题背景解决方案遇到的问题: 问题背景 突然发现有个大写的表报不存在。 在Windows上,MySQL是默认支持忽略大小写的。 这个时候你要查询一下是不是没有配置: SHOW VARIABLES LIKE lower_case_table…...
【c++】【线程池】线程池模式
【c】【线程池】线程池模式 1 L/F领导者与跟随者模式 概述:在此模式中,线程池中的线程分为:领导者(Leader),跟随者(Follower)和工作者(Processor) 领导者线…...
Next.js 学习-1
Next.js学习 引用:https://www.nextjs.cn/learn/basics/create-nextjs-app 先试试水吧,正好dify用的这个构建的前端项目。 使用 如果您尚未安装 Node.js,请 从此处安装。要求 Node.js 10.13 或更高版本。 好吧得用新的了,记得…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
