【问题标题】:Compasion of two approaches of exponentiating elements of a matrix对矩阵元素求幂的两种方法的比较
【发布时间】:2020-11-04 18:00:52
【问题描述】:

我有两种方法对jnp = jax.numpy 中的矩阵求幂。一种 直截了当的:

jnp.exp(-X/reg)

还有一些额外的操作:

def exp_reg(X, reg):
    K = jnp.empty_like(X)
    K = jnp.divide(X, -reg)
    return jnp.exp(K)

但是,当我测试它们时:

%timeit jnp.exp(-X/reg).block_until_ready()
%timeit exp_reg(X, reg).block_until_ready()

尽管表面上增加了一些额外开销,但第二种方法的表现却优于其他方法。我运行了一个%timeit,其矩阵大小为 2000 x 2000:

7.85 ms ± 567 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
5.19 ms ± 52.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

为什么会这样?

【问题讨论】:

    标签: performance numpy jax


    【解决方案1】:

    这里的区别在于操作的顺序。

    jnp.exp(-X/reg) 中,您正在否定X 的每个条目,然后将结果的每个条目除以reg。这是数组X 的两次传递。

    exp_reg 中,您否定reg(大概是一个标量值?),然后将X 除以结果。这是X 的一次传递。

    如果X 很大,我预计第一种方法会比第二种方法稍慢,因为多次通过X

    幸运的是,由于您使用的是 JAX,您可以jit 编译您的代码,在这种情况下,XLA 通常可以优化这些等价的操作顺序。实际上,对于您的两个函数,编译消除了差异:

    from jax import jit
    import jax.numpy as jnp
    import numpy as np
    
    def exp_reg1(X, reg):
      return jnp.exp(-X/reg)
    
    def exp_reg2(X, reg):
      K = jnp.divide(X, -reg)
      return jnp.exp(K)
    
    X = jnp.array(np.random.rand(1000, 1000))
    reg = 2.0
    
    %timeit exp_reg1(X, reg)
    # 100 loops, best of 3: 3.17 ms per loop
    %timeit exp_reg2(X, reg)
    # 100 loops, best of 3: 2.2 ms per loop
    
    # Trigger compilation
    jit(exp_reg1)(X, reg)
    jit(exp_reg2)(X, reg)
    
    %timeit jit(exp_reg1)(X, reg)
    # 1000 loops, best of 3: 1.92 ms per loop
    %timeit jit(exp_reg2)(X, reg)
    # 100 loops, best of 3: 1.84 ms per loop
    

    (旁注:没有理由在将操作结果分配给同名变量之前预先分配一个空数组K)。

    【讨论】:

    • 非常感谢您的解释!
    • 矩阵元素的取幂与矩阵的指数相比如何? en.wikipedia.org/wiki/Matrix_exponential
    • @develarist 我对 matrix 指数不感兴趣,我要求按元素取幂
    • 我知道,但是为什么要选择逐元素取幂而不是矩阵的指数
    • @develarist 为了满足你的好奇心,我会告诉你真正的原因。最优传输问题的 sinkhorn 迭代使用元素的 elementwise 指数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多