【问题标题】:Best way to compute the moving average of word vectors in JAX在 JAX 中计算词向量的移动平均值的最佳方法
【发布时间】:2021-08-26 13:49:07
【问题描述】:

假设我有一个形状为(n_words, model_dim) 的矩阵W,其中n_words 是句子中的单词数,model_dim 是表示单词向量的空间维度。计算这些向量的移动平均值的最快方法是什么?

例如,窗口大小为 2(窗口长度 = 5),我可以有这样的东西(这会引发错误 TypeError: JAX 'Tracer' objects do not support item assignment):

from jax import random
import jax.numpy as jnp

# Fake word vectors (17 words vectors of dimension 32)
W = random.normal(random.PRNGKey(0), shape=(17, 32)) 

ws = 2          # window size
N = W.shape[0]  # number of words

new_W = jnp.zeros(W.shape)

for i in range(N):
    window = W[max(0, i-ws):min(N, i+ws+1)]
    n = window.shape[0]
    for j in range(n):
        new_W[i] += W[j] / n

我想jnp.convolve 有一个更快的解决方案,但我不熟悉它。

【问题讨论】:

    标签: python jax


    【解决方案1】:

    这看起来像您正在尝试进行卷积,因此jnp.convolve 或类似方法可能是一种性能更高的方法。

    也就是说,您的示例有点奇怪,因为 n 永远不会大于 4,因此您只能访问 W 的前四个元素。此外,您会覆盖内部循环的每次迭代中的前一个值,因此new_W 的每一行仅包含W 前四行之一的缩放副本。

    将您的代码更改为我认为您的意思,并使用index_update 使其与 JAX 的不可变数组兼容:

    from jax import random
    import jax.numpy as jnp
    
    # Fake word vectors (17 words vectors of dimension 32)
    W = random.normal(random.PRNGKey(0), shape=(17, 32)) 
    
    ws = 2          # window size
    N = W.shape[0]  # number of words
    
    new_W = jnp.zeros(W.shape)
    
    for i in range(N):
        window = W[max(0, i-ws):min(N, i+ws)]
        n = window.shape[0]
        for j in range(n):
          new_W = new_W.at[i].add(window[j] / n)
    

    这是一个更有效的卷积方面的等价物:

    from jax.scipy.signal import convolve
    kernel = jnp.ones((4, 1))
    new_W_2 = convolve(W, kernel, mode='same') / convolve(jnp.ones_like(W), kernel, mode='same')
    
    jnp.allclose(new_W, new_W_2)
    # True
    

    【讨论】:

    • 谢谢指正,我确实应该写new_W[i] += W[j] / nwindow = W[max(0, i-ws):min(N, i+ws+1)]
    • 您能否详细说明 2 convolve 的作用?我想我得到了形状 (4, 1) 的形状(也可能是 (4, model_dim) 不?)但我没有得到分母!
    • convolve(jnp.ones_like(W), kernel, mode='same') 似乎以与n 在我的代码中缩放相同的方式正确缩放。
    • 另外,在我上次编辑之后,您代码中的内核应该是:kernel = jnp.ones((5, 1)) 这样它就以中间词为中心
    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多