详解 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 或更高版本。 好吧得用新的了,记得…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
