Python 如何通过顺序语言建模将LSTM的损失矢量化
所以我有一个涉及语言建模的任务,我通过了所有的单元测试,但是我的代码运行太慢了。我想这是因为我计算损失的方式。我们给出的公式如下: 我的天真实现如下所示:Python 如何通过顺序语言建模将LSTM的损失矢量化,python,numpy,deep-learning,pytorch,Python,Numpy,Deep Learning,Pytorch,所以我有一个涉及语言建模的任务,我通过了所有的单元测试,但是我的代码运行太慢了。我想这是因为我计算损失的方式。我们给出的公式如下: 我的天真实现如下所示: losses_batch_list = [] batch_size = log_probas.size(0) for b in range(batch_size): seq_length = max([i for i, e in enumerate(mask[b,:]) if e != 0]) + 1 loss_batc
losses_batch_list = []
batch_size = log_probas.size(0)
for b in range(batch_size):
seq_length = max([i for i, e in enumerate(mask[b,:]) if e != 0]) + 1
loss_batch = 0
for t in range(seq_length):
for n in range(self.vocabulary_size):
if targets[b, t] == n:
loss_batch += log_probas[b, t, n].detach()
loss_batch = - loss_batch / seq_length
losses_batch_list.append(loss_batch)
loss = torch.tensor(np.mean(losses_batch_list))
return loss
但是这个循环一直运行,因为词汇表的大小与GPT1大致相同(~40000),并且序列长度高达255(由于填充,因此掩码更短)。
有人对如何矢量化/加速这方面有什么建议吗?
我知道这是正确的,但我不能用它报告任何结果。。。
谢谢 B=批量大小
T=序列长度(填充)
N=声音大小
如果类型(掩码b)=torch.bool:
mask=mask.view(-1)#(B,T)->(B*T,)
其他:
mask=mask.bool().view(-1)#(B,T)->(B*T,)
log_probas=log_probas.view(-1,N)#(B,T,N)->(B*T,N)
targets=target.view(-1,1)#(B,T)->(B*T,1)
丢失=火炬。聚集(log_probas[mask],-1,target[mask])#没有填充令牌的丢失
损失=损失。平均值()
为什么代码片段中会出现双缩进(已编辑)?@desertnaut谢谢我不知道为什么会出现这种情况Hey@emily谢谢!这不太管用,我得到以下错误:数组几乎不等于4位小数实际值:2.763376474380493期望值:2.9091644287109375你知道这可能来自哪里吗:)我对Torchi还是很陌生,我想这是因为在你的代码中,首先计算每个序列的平均损失,然后计算批次序列的平均损失。但在我的例子中,损失是通过平均整个批次的代币损失来计算的。例如,a=[1,2,3],b=[1,2,3,4,5],np.mean(a+b)=2.625,(np.mean(a)+np.mean(b))/2=2.5