详解 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
:向上偏移,更多元素变0
diagonal<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
diagonal
affects 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=1
retains elements from one row above the main diagonal.- The main diagonal (
1, 5, 9
) is set to0
. - Only elements
2, 3, 6
are 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=-1
retains elements from one row below the main diagonal.- The main diagonal and upper part remain unchanged.
- The lowest element
7
is set to0
, but4, 8
are 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=-1
means retaining the main diagonal and one row below it.- Elements below
-1
are 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
diagonal
parameter 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 或更高版本。 好吧得用新的了,记得…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...

Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...
智能体革命:企业如何构建自主决策的AI代理?
OpenAI智能代理构建实用指南详解 随着大型语言模型(LLM)在推理、多模态理解和工具调用能力上的进步,智能代理(Agents)成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同,智能代理能够自主执行工…...