You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tensorflow_probability.ScaleMatvecDiag:左乘还是右乘的困惑求解

关于tensorflow_probability.bijectors.ScaleMatvecDiag运算逻辑的澄清

问题核心

官方文档中说明tfp.bijectors.ScaleMatvecDiag的映射关系为 Y = g(X; scale) = scale @ X(即scale矩阵左乘X),但实际测试发现该bijector执行的是X @ scale(X右乘scale矩阵)的运算逻辑。

测试验证

基础运算测试

测试代码:

import numpy as np
import tensorflow_probability as tfp
tfb = tfp.bijectors

x = [[1., 2.], [3., 4.]]
b = tfb.ScaleMatvecDiag(scale_diag=[-1., 2.])
print(b.forward(x))

实际输出:

[[-1.,  4.],
 [-3.,  8.]]

按照文档描述的左乘逻辑,预期输出应为:

print(np.diag([-1., 2.]) @ x)

预期结果:

[[-1., -2.],
 [ 6.,  8.]]

维度兼容性验证

补充维度测试进一步验证运算逻辑:

y = [[1., 2, 3], [4, 5, 6]]  # shape (2,3)
z = [[1., 2], [3, 4], [5, 6]]  # shape (3,2)

b.forward(y)  # 报错:ValueError: Dimensions 2 and 3 are not compatible
b.forward(z)  # 输出shape为(3, 2)

若按左乘逻辑,scale是(2,2)矩阵,左乘(2,3)的y是合法的(结果shape(2,3)),但实际报错;而右乘逻辑下,(3,2)的z右乘(2,2)的scale,结果shape(3,2),与实际输出一致。

逻辑澄清

这种差异源于文档对输入X的维度假设:文档中默认X是列向量(shape为(D, 1),D为特征维度),此时scale @ X(左乘列向量)的结果,与将X视为行向量(shape(1,D))执行X @ scale(右乘)的结果在数值上是转置等价的。

而实际使用中,若输入是批量样本矩阵(每行一个样本,shape(N,D)),ScaleMatvecDiag会对每个样本行执行元素级的缩放(等价于行向量右乘对角scale矩阵),最终表现为X @ diag(scale_diag)的运算效果,这与测试结果完全匹配。

内容的提问来源于stack exchange,提问作者user26459532

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:58:26