Transformer 迁移辅助算子集合:补齐 Tensor 相对旧 AD 张量缺失的 N 维算子,并为每个算子提供显式反向传播实现。
TensorOps
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| ZerosLike | 1 | 创建与 tensor 同形状的全零张量。 |
| CloneTensor | 1 | 深拷贝张量。用于「同一个梯度同时属于两个分支」的场景 (例如 AddNorm 反向对 A 与 B 给出同一份 dx,必须各自持有独立副本)。 |
| ZeroInPlace | 1 | 把张量的全部元素置零(原地)。 |
| Accumulate | 1 | 原地累加:target += grad(要求形状一致)。 |
| ScaleInPlace | 1 | 原地缩放:tensor *= scalar。 |
| Scale | 1 | 按标量缩放(返回新张量)。 |
| ElementwiseMultiply | 1 | 逐元素乘法(Hadamard 积)。 |
| Heaviside | 1 | ReLU 反向所需的阶跃掩码:元素 > 0 取 1,否则取 0。 |
| HeNormalInit | 1 | 旧 AD 张量 GenerateNormalRandomValues() 的等价实现: 以倒数第二维作为 fan-in 做 He 缩放的正态初始化。 |
| ArgMaxLastDim | 1 | 对最后一维做 argmax,返回每个 slice 的最大值位置 (等价于旧 AD 张量的 GetMaxIndex(),用于 [batch, 1, dict])。 |
| BatchedMatMul | 1 | 对最后两维做矩阵乘:C[..., i, j] = Σ_k A[..., i, k] * B[..., k, j]。 |
| BatchedMatMulBackward | 1 | TensorOps.BatchedMatMul()) 的反向传播。 |
| TransposeLastTwo | 1 | 交换最后两维(任意 rank >= 2)。 |
| ConcatLastDim | 1 | 沿最后一维拼接若干张量(其余维度必须一致),等价于旧 AD 张量的 Concat。 |
| SplitLastDim | 1 | TensorOps.ConcatLastDim()) 的反向:沿最后一维等分切回各分量。 |
| MaskUpperTriangular | 1 | 把最后两维的上三角(j > i)原地置为负无穷,用于因果掩码。 |
| SoftmaxLastDim | 1 | 沿最后一维做数值稳定的 softmax。 |
| SoftmaxBackward | 1 | softmax 的反向传播:dx_i = y_i · (dy_i − Σ_j dy_j·y_j)。 |
| AddNormForward | 1 | 残差相加后沿最后一维做 LayerNorm:C = (A + B − mean) / sqrt(var + eps)。 |
| AddNormBackward | 1 | TensorOps.AddNormForward()) 的反向传播。 |
| VecAdd | 1 | 把一维向量加到张量最后一维:C[..., j] = T[..., j] + v[j]。 |
| VecAddBackward | 1 | TensorOps.VecAdd()) 对偏单向量的反向:沿其余维度求和。 |
| FlattenLastTwo | 1 | 把最后两维压平为 [..., 1, I*J](行优先顺序不变)。 |
| UnflattenLastTwo | 1 | TensorOps.FlattenLastTwo()) 的反向:还原为原始形状。 |
| DropoutMask | 1 | 按固定掩码做 dropout:先整体放大 1/(1-rate),再把掩码位置清零。 |
| DropoutMaskBackward | 1 | TensorOps.DropoutMask()) 的反向:同一掩码位置梯度置零并做同样的缩放。 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| Seed | 1 | 参数初始化的随机种子。设定后所有 TensorOps.HeNormalInit()) 都从同一个 确定性随机序列取值,从而让整次训练可复现。 |
04 Fields
| Name | Overloads | Summary |
|---|---|---|
| AddNormEps | 2 | AddNorm(残差 + LayerNorm)使用的数值稳定项,与旧实现保持一致。 |
| _random | 1 | 参数初始化使用的随机数发生器(全局共享,模型构建阶段单线程使用)。 |
05 Members
Tensor)创建与 tensor 同形状的全零张量。
Tensor)深拷贝张量。用于「同一个梯度同时属于两个分支」的场景 (例如 AddNorm 反向对 A 与 B 给出同一份 dx,必须各自持有独立副本)。
Tensor)把张量的全部元素置零(原地)。
Tensor, Tensor)原地累加:target += grad(要求形状一致)。
Tensor, Double)原地缩放:tensor *= scalar。
Tensor, Double)按标量缩放(返回新张量)。
Tensor, Tensor)逐元素乘法(Hadamard 积)。
Tensor)ReLU 反向所需的阶跃掩码:元素 > 0 取 1,否则取 0。
Int32())旧 AD 张量 GenerateNormalRandomValues() 的等价实现: 以倒数第二维作为 fan-in 做 He 缩放的正态初始化。
初始化使用本模块内部的随机数发生器;通过 TensorOps.Seed 设定种子即可让 整个模型的初始化(进而整次训练)完全可复现。
Tensor)对最后一维做 argmax,返回每个 slice 的最大值位置 (等价于旧 AD 张量的 GetMaxIndex(),用于 [batch, 1, dict])。
Tensor, Tensor)对最后两维做矩阵乘:C[..., i, j] = Σ_k A[..., i, k] * B[..., k, j]。
当 b 为二维张量时,它在所有 block 上广播(共享一份权重), 与旧 SIMDMatMul.Solve 语义一致。B 为二维时走「reshape + 2D SIMD MatMul」 的快路径,其它情况按 block 逐块计算。
Tensor, Tensor, Tensor, Tensor, Tensor)TensorOps.BatchedMatMul() 的反向传播。
dA = dC · Bᵀ;dB = Σ_block Aᵀ · dC(B 为二维时对全部 block 求和, 因为前向阶段它是被共享使用的)。
Tensor)交换最后两维(任意 rank >= 2)。
Tensor())沿最后一维拼接若干张量(其余维度必须一致),等价于旧 AD 张量的 Concat。
Tensor, Int32)TensorOps.ConcatLastDim() 的反向:沿最后一维等分切回各分量。
Tensor)把最后两维的上三角(j > i)原地置为负无穷,用于因果掩码。
掩码后的位置经过 softmax 后输出恒为 0,其上游梯度也自然为 0 (dx_i = y_i·(dy_i − Σ dy·y),而 y_i = 0),因此本算子不需要单独的反向实现。
Tensor)沿最后一维做数值稳定的 softmax。
Tensor, Tensor)softmax 的反向传播:dx_i = y_i · (dy_i − Σ_j dy_j·y_j)。
| Name | Type | Description |
|---|---|---|
y | Tensor | 前向阶段 softmax 的输出 |
dy | Tensor | 上游梯度 |
Tensor, Tensor, Double(), Double())残差相加后沿最后一维做 LayerNorm:C = (A + B − mean) / sqrt(var + eps)。
与旧 AD 张量的 AddNorm 完全一致:eps = 0.001,且没有可学习的 γ / β。 均值与逆标准差按最后一个维度逐 slice 缓存,供反向传播使用。
Tensor, Tensor, Tensor, Double(), Double())TensorOps.AddNormForward() 的反向传播。
x̂ = (x − μ)·invStd,精确反向公式为: dx = invStd · (dy − mean(dy) − x̂ · mean(dy ⊙ x̂))。
对 x = A + B 的梯度;由于 A 与 B 在加法处是对称的, dA = dB = 返回值。
Tensor, Tensor)把一维向量加到张量最后一维:C[..., j] = T[..., j] + v[j]。
Tensor)TensorOps.VecAdd() 对偏单向量的反向:沿其余维度求和。
Tensor)把最后两维压平为 [..., 1, I*J](行优先顺序不变)。
Tensor, Int32())TensorOps.FlattenLastTwo() 的反向:还原为原始形状。
Tensor, Boolean(), Double)按固定掩码做 dropout:先整体放大 1/(1-rate),再把掩码位置清零。
| Name | Type | Description |
|---|---|---|
tensor | Tensor | 输入张量 |
mask | Boolean() | 长度为最后一维的布尔掩码,True 表示丢弃 |
rate | Double | 丢弃概率 |
Tensor, Boolean(), Double)TensorOps.DropoutMask() 的反向:同一掩码位置梯度置零并做同样的缩放。
参数初始化的随机种子。设定后所有 TensorOps.HeNormalInit() 都从同一个 确定性随机序列取值,从而让整次训练可复现。
AddNorm(残差 + LayerNorm)使用的数值稳定项,与旧实现保持一致。
参数初始化使用的随机数发生器(全局共享,模型构建阶段单线程使用)。