PyTorch核心张量算子

覆盖:扩散模型 / DiT / 图像视频 / 机器人动作序列

约定记号:
X,Y\boldsymbol{X},\boldsymbol{Y}X,Y 代表张量;N,B,C,T,H,WN,B,C,T,H,WN,B,C,T,H,W = 批次、通道、时序、高、宽

一、维度变换算子(特征排布,最高频)

1. tensor.view(*shape) / torch.reshape

数学:重塑张量元素排布,元素顺序不变
设原张量 X∈Ra×b×c\boldsymbol{X} \in \mathbb{R}^{a\times b\times c}XRa×b×c
reshape(X, [a⋅b, c])∈Rab×c \mathrm{reshape}(\boldsymbol{X},\,[a\cdot b,\,c]) \in \mathbb{R}^{ab\times c} reshape(X,[ab,c])Rab×c
限制:元素总数不变;view要求内存连续,reshape自动处理连续性。
场景:DiT时空维度打平、latent变形、动作序列维度重组。

2. torch.permute(d₀,d₁,…)

维度重排列,无复制(非连续张量)
例:X∈RB,C,H,W\boldsymbol{X}\in\mathbb{R}^{B,C,H,W}XRB,C,H,W
permute(X, [B,H,W,C]) \mathrm{permute}(\boldsymbol{X},\,[B,H,W,C]) permute(X,[B,H,W,C])
场景:图像 BCHW ↔ BHWC、视频调换时序/空间维度、注意力维度对齐。

3. torch.unsqueeze(dim) / squeeze(dim)

unsqueeze(X, d):RD0×…Dk→RD0×⋯×1×…Dk \mathrm{unsqueeze}(\boldsymbol{X},\,d): \mathbb{R}^{D_0\times\dots D_k} \rightarrow \mathbb{R}^{D_0\times\dots\times 1\times\dots D_k} unsqueeze(X,d):RD0×DkRD0××1×Dk
新增长度为1的维度;squeeze移除长度=1维度。
场景:单张图像扩batch维、给latent增加时序维度适配视频模型输入。

4. torch.stack([X₁,X₂,…,Xₙ], dim)

新增维度堆叠
Xi∈RH,W\boldsymbol{X}_i\in\mathbb{R}^{H,W}XiRH,W
Z=stack([X1,X2], 0)  ⟹  Z∈R2×H×W \boldsymbol{Z} = \mathrm{stack}([\boldsymbol{X}_1,\boldsymbol{X}_2],\,0) \implies \boldsymbol{Z}\in\mathbb{R}^{2\times H\times W} Z=stack([X1,X2],0)ZR2×H×W
公式表达:
Z[0]=X1,Z[1]=X2 \boldsymbol{Z}[0]=\boldsymbol{X}_1,\quad \boldsymbol{Z}[1]=\boldsymbol{X}_2 Z[0]=X1,Z[1]=X2
👉 KV Cache组装、多帧latent构建时序维度。

5. torch.cat([X₁,X₂], dim)

现有维度拼接,不新增维度
X1,X2∈RB,C,H,W\boldsymbol{X}_1,\boldsymbol{X}_2\in\mathbb{R}^{B,C,H,W}X1,X2RB,C,H,W
Z=cat([X1,X2], 2)∈RB,C,2H,W \boldsymbol{Z} = \mathrm{cat}([\boldsymbol{X}_1,\boldsymbol{X}_2],\,2) \in \mathbb{R}^{B,C,2H,W} Z=cat([X1,X2],2)RB,C,2H,W
场景:拼接条件嵌入、前后帧特征、历史动作序列。

二、采样 & 扩散核心数值算子

1. torch.randn_like(X)

ε∼N(0,I) \boldsymbol{\varepsilon} \sim \mathcal{N}(0,\boldsymbol{I}) εN(0,I)
标准高斯噪声,扩散模型根基:
xt=αˉtx0+1−αˉtε \boldsymbol{x}_t = \sqrt{\bar{\alpha}_t}\boldsymbol{x}_0 + \sqrt{1-\bar{\alpha}_t}\boldsymbol{\varepsilon} xt=αˉt x0+1αˉt ε

2. torch.lerp(a, b, weight) 线性插值

lerp(a,b,w)=(1−w)⋅a+w⋅b \mathrm{lerp}(\boldsymbol{a},\boldsymbol{b},w) = (1-w)\cdot \boldsymbol{a} + w\cdot \boldsymbol{b} lerp(a,b,w)=(1w)a+wb
应用:扩散采样更新latent、流匹配积分、动作轨迹平滑、帧插值。

3. torch.clamp(x, min, max)

clamp(x,a,b)={ax<axa≤x≤bbx>b \mathrm{clamp}(x,a,b)= \begin{cases} a & x<a\\ x & a\le x\le b\\ b & x>b \end{cases} clamp(x,a,b)= axbx<aaxbx>b
场景:VAE解码值域限制防止数值溢出黑图、机器人动作限幅。

4. torch.sqrt,exp⁡,log⁡\texttt{torch.sqrt},\exp,\logtorch.sqrt,exp,log

扩散调度器通用:
σt=1−αˉt,αˉt=∏s=1tαs \sigma_t=\sqrt{1-\bar{\alpha}_t},\quad \bar{\alpha}_t=\prod_{s=1}^t \alpha_s σt=1αˉt ,αˉt=s=1tαs
Flow Matching / Cosmos世界模型大量使用对数、指数计算SNR、时间条件。

三、掩码与条件选择

1. torch.masked_fill(mask, value)

Yi,j={vmaski,j=TrueXi,jmaski,j=False \boldsymbol{Y}_{i,j}= \begin{cases} v & \mathrm{mask}_{i,j}=True\\ \boldsymbol{X}_{i,j} & \mathrm{mask}_{i,j}=False \end{cases} Yi,j={vXi,jmaski,j=Truemaski,j=False
场景:Inpaint区域填充噪声;注意力padding位置填充 −∞-\infty

2. torch.where(cond, x, y)

where(c,x,y)i={xici=Trueyici=False \mathrm{where}(c,\boldsymbol{x},\boldsymbol{y})_{i}= \begin{cases} \boldsymbol{x}_i & c_i=\mathrm{True}\\ \boldsymbol{y}_i & c_i=\mathrm{False} \end{cases} where(c,x,y)i={xiyici=Trueci=False
场景:根据掩码混合原图latent与噪声latent。

四、注意力矩阵运算(DiT / Transformer / KV Cache)

1. torch.matmul(a,b) / @

矩阵乘法
C=AB,Cij=∑kAikBkj \boldsymbol{C} = \boldsymbol{A}\boldsymbol{B},\quad C_{ij}=\sum_k A_{ik}B_{kj} C=AB,Cij=kAikBkj
自注意力核心:
Attn(Q,K,V)=softmax(QK⊤dh)V \mathrm{Attn}(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V})=\mathrm{softmax}\left(\frac{\boldsymbol{Q}\boldsymbol{K}^\top}{\sqrt{d_h}}\right)\boldsymbol{V} Attn(Q,K,V)=softmax(dh QK)V

2. torch.transpose(d1,d2)

(X⊤)ij=Xji (\boldsymbol{X}^\top)_{ij}=X_{ji} (X)ij=Xji
常用写法:K.transpose(-1,-2) 适配QK相乘。

3. F.softmax(x, dim)

softmax(x)i=exi∑jexj \mathrm{softmax}(\boldsymbol{x})_i = \frac{e^{x_i}}{\sum_j e^{x_j}} softmax(x)i=jexjexi

五、重采样算子(图像/视频latent缩放)

F.interpolate

连续空间重采样,以bilinear为例:
f^(u,v)=∑i∑jwij⋅f(xi,yj) \hat{f}(u,v)=\sum_i\sum_j w_{ij}\cdot f(x_i,y_j) f^(u,v)=ijwijf(xi,yj)
场景:VAE上下采样、latent分辨率调整、视频时序缩放。

六、时序序列算子(机器人动作 / 视频)

1. torch.diff(X, dim)

相邻差分
Δxt=xt+1−xt \Delta \boldsymbol{x}_t = \boldsymbol{x}_{t+1}-\boldsymbol{x}_t Δxt=xt+1xt
用途:由位置序列求解速度、加速度。

2. torch.cumsum(X, dim)

累积和
cumsum(X)t=∑k=1tXk \mathrm{cumsum}(\boldsymbol{X})_t=\sum_{k=1}^t \boldsymbol{X}_k cumsum(X)t=k=1tXk
Flow Matching积分、由速度积分得到轨迹。

七、归一化变换(图像VAE预处理)

x.sub_(mean).div_(std)

x^=x−μσ \hat{x} = \frac{x-\mu}{\sigma} x^=σxμ
反归一化:
x=x^⋅σ+μ x = \hat{x}\cdot\sigma + \mu x=x^σ+μ
常用:图像 [0,1]↔[−1,1][0,1]\leftrightarrow[-1,1][0,1][1,1] 转换输入VAE。

八、内存连续性

tensor.contiguous()

张量底层内存由非连续 → 连续排布
数学上不改变张量数值,改变存储布局;
permute/transpose后直接view会报错,必须调用。

熟练运用PyTorch张量算子完成扩散模型、视频时序与机器人动作序列开发:
通过stack/cat/permute/view/unsqueeze实现张量维度重组;依托randn_like\mathrm{randn\_like}randn_like生成高斯噪声,结合lerp\mathrm{lerp}lerp线性插值实现扩散与流匹配采样迭代;利用clamp\mathrm{clamp}clamp控制数值范围,masked_fill/where\mathrm{masked\_fill/where}masked_fill/where实现条件生成与图像修复;基于matmul/transpose/softmax\mathrm{matmul/transpose/softmax}matmul/transpose/softmax搭建自注意力计算;使用interpolate\mathrm{interpolate}interpolate完成潜空间分辨率重采样;借助diff/cumsum\mathrm{diff/cumsum}diff/cumsum对动作序列做差分与积分运算;同时掌握contiguous()处理维度置换后的内存连续性问题。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐