我有一个28000x300大小的矩阵,名为Gloves_vecs。这个想法是计算所有其他行的损失,并相应地更新它们。这是执行此操作的功能。
wrap_content
我正在使用numba和numpy。我发现使用numba编写自己的点乘积函数可以稍微加快np.dot的速度。元素明智的减法也是如此。 这都是这些功能
@njit(nopython=True, fastmath=True)
def return_loss(length, cooccur, glove_vecs, bias, alpha, epochs):
#Calculate Loss
for epoch in range(epochs):
total_loss = 0
for i in range(length):
for j in range(length):
loss = dot(glove_vecs[i], glove_vecs[j]) + bias[i] + bias[j] - cooccur[i][j]
mul, temp = alpha * loss, glove_vecs[j]
glove_vecs[j] = element_wise_subtract(glove_vecs[j], mul, glove_vecs[i])
glove_vecs[i] = element_wise_subtract(glove_vecs[i], mul, temp)
bias[i], bias[j] = bias[i] - mul, bias[j] - mul
total_loss+= 0.5 * (loss**2)
print(total_loss, epoch)
return glove_vecs
当前,运行1个纪元即外部循环需要近12分钟。我尝试使用@njit(nopython=True, fastmath=True)
def dot(v1, v2):
out = 0
for k in range(len(v1)):
out+= v1[k] * v2[k]
return out
@njit(nopython=True, fastmath=True)
def element_wise_subtract(v1, mul, v2):
for k in range(len(v1)):
v1[k]-= mul * v2[k]
return v1
的numba parallel=True
模式,但是它在提高性能的同时还给出了错误的结果。
是否可以在prange
函数中避免两个内部for循环?还是有其他方法可以减少所需时间?