Python广播机制:张量的影分身术

目录

广播的核心逻辑

[1. 从末尾维度开始对齐](#1. 从末尾维度开始对齐)

[2. 如果两个维度中有一个为 1 → 可以广播](#2. 如果两个维度中有一个为 1 → 可以广播)

[3. 只有在不满足以上规则时才报错](#3. 只有在不满足以上规则时才报错)

[一个极其形象的例子:行向量 + 列向量](#一个极其形象的例子:行向量 + 列向量)

[回到 PyTorch:广播的三种常用场景](#回到 PyTorch:广播的三种常用场景)

[情况 1:标量与张量运算](#情况 1:标量与张量运算)

[情况 2:mask 扩展成 attention 的 4 维](#情况 2:mask 扩展成 attention 的 4 维)

[情况 3:不同 batch 维的张量做 pairwise 操作](#情况 3:不同 batch 维的张量做 pairwise 操作)


广播(broadcasting)在 Python 的科学计算里有点像"张量界的影分身术"。你给它一个形状不一致的张量,它不会抱怨,而是想办法自动把它们扩展成可对齐的形状,再进行计算。关键是它并不真的复制数据,而是用一个"虚拟扩展"的方式完成整个过程。

你在深度学习里天天用它:attention mask、位置编码、batch 操作......背后都是广播在默默干活。


广播的核心逻辑

广播的规则其实很俩字:对齐

解释成程序员话,就是:

进行逐元素运算(加减乘除)时,两端的张量必须形状一致;

如果不一致,Python(准确说是 NumPy-style broadcasting)会按规则自动扩展。

规则简单但很精妙:

1. 从末尾维度开始对齐

例如:

python 复制代码
A.shape = [2, 3, 4]
B.shape =        [4]

最后维度 4 对齐 → OK

倒数第二维:B 没有维度,相当于是 [1] → 可以广播

最终 B 会被视为 [1, 1, 4]

这一步很关键:

Python 会把缺失的维度看成 1,就像插空位一样。


2. 如果两个维度中有一个为 1 → 可以广播

比如:

python 复制代码
[2, 3, 1]
[2, 3, 4]

最后维度 1 → 扩展为 4

前两个维度一致 → 完全匹配

最终变成:

python 复制代码
[2, 3, 4]

这一条是所有广播的灵魂。


3. 只有在不满足以上规则时才报错

例如:

python 复制代码
[2, 3, 5]
[2, 3, 4]

最后一维 5 vs 4

没有一个是 1,也不能对齐 → 报错。


一个极其形象的例子:行向量 + 列向量

你看:

python 复制代码
row = [1, 2, 3]       shape = [1, 3]
col = [[1],[2],[3]]   shape = [3, 1]

相加就得到一个 3×3 的矩阵:

python 复制代码
[[2, 3, 4],
 [3, 4, 5],
 [4, 5, 6]]

广播过程像这样:

row → [1, 3] 变成 [3, 3]

col → [3, 1] 变成 [3, 3]

但注意:它们根本没有真正复制成 3×3,只是"伪扩展"

这也是为什么广播性能很好。


回到 PyTorch:广播的三种常用场景

你作为深度学习开发者,这三个场景会天天撞到。

情况 1:标量与张量运算

复制代码
x + 3

3 被当成形状 [],自动扩展成与 x 一样的形状。


情况 2:mask 扩展成 attention 的 4 维

你的例子:

python 复制代码
[batch, seq] → [batch, 1, seq, seq]

这完全依赖广播规则让 mask 匹配 attention logit 的形状。


情况 3:不同 batch 维的张量做 pairwise 操作

比如做距离:

python 复制代码
A: [B, N, D]
B: [B, M, D]

A.unsqueeze(2) → [B, N, 1, D]
B.unsqueeze(1) → [B, 1, M, D]

相减 → [B, N, M, D]

这里的广播让 N×M 的 pairwise 距离轻松完成。


一句话总结(但挺准确的)

广播机制让:

维度为 1 的地方可以"假装"变成任意大小,
缺失的维度可以"假装"存在,
最终让张量的每一元素都能参与运算。

这种"假装扩展"的设计,让你的模型能写得简洁又高效。

相关推荐
是娇娇公主~14 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
2401_8747325314 小时前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
SuperEugene14 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
FreakStudio14 小时前
0 元学嵌入式 GUI!保姆级 LVGL+MicroPython 教程开更,从理论到实战全搞定
python·单片机·嵌入式·面向对象·电子diy
xuxie9915 小时前
N11 ARM-irq
java·开发语言
wefly201716 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
luanma15098016 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默16 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
剑穗挂着新流苏31216 小时前
117_PyTorch 实战:利用训练好的模型进行单张图片验证
人工智能·python·深度学习
Lethehong17 小时前
Python Selenium全栈指南:从自动化入门到企业级实战
python·selenium·测试工具·自动化