jax.lax.associative_scan#

jax.lax.associative_scan(fn, elems, reverse=False, axis=0)[源代码]#

并行执行具有结合性二元运算的扫描。

有关结合性扫描的介绍,请参阅 [BLE1990]

参数:
  • fn (Callable) –

    一个 Python 可调用对象,实现具有签名的结合性二元运算 r = fn(a, b)。函数 fn 必须是结合性的,即,它必须满足方程式 fn(a, fn(b, c)) == fn(fn(a, b), c)

    输入和结果是与 elems 匹配的数组(可能是嵌套的 Python 树结构)。每个数组都有一个维度来代替 axis 维度。fn 应该在 axis 维度上逐元素应用(例如,通过在逐元素函数上使用 jax.vmap())。

    结果 r 与两个输入 ab 具有相同的形状(和结构)。

  • elems – 一个(可能是嵌套的 Python 树结构)数组,每个数组都有一个大小为 num_elemsaxis 维度。

  • reverse (bool) – 一个布尔值,表示扫描是否应相对于 axis 维度反向进行。

  • axis (int) – 一个整数,用于标识应该进行扫描的轴。

返回值:

一个(可能是嵌套的 Python 树结构)数组,其形状和结构与 elems 相同,其中 axis 的第 k 个元素是通过递归应用 fn 来组合 elems 沿 axis 的前 k 个元素的结果。例如,给定 elems = [a, b, c, ...],结果将是 [a, fn(a, b), fn(fn(a, b), c), ...]

示例 1:数字数组的部分和

>>> lax.associative_scan(jnp.add, jnp.arange(0, 4))
Array([0, 1, 3, 6], dtype=int32)

示例 2:矩阵数组的部分积

>>> mats = jax.random.uniform(jax.random.key(0), (4, 2, 2))
>>> partial_prods = lax.associative_scan(jnp.matmul, mats)
>>> partial_prods.shape
(4, 2, 2)

示例 3:数字数组的反向部分和

>>> lax.associative_scan(jnp.add, jnp.arange(0, 4), reverse=True)
Array([6, 6, 5, 3], dtype=int32)
[BLE1990]

Blelloch, Guy E. 1990. “前缀和及其应用。”,卡内基梅隆大学计算机科学学院技术报告 CMU-CS-90-190。