在pytorch中计算困惑度
calculate perplexity in pytorch
我刚刚使用 pytorch 训练了一个 LSTM 语言模型。 class 的主体是这样的:
class LM(nn.Module):
def __init__(self, n_vocab,
seq_size,
embedding_size,
lstm_size,
pretrained_embed):
super(LM, self).__init__()
self.seq_size = seq_size
self.lstm_size = lstm_size
self.embedding = nn.Embedding.from_pretrained(pretrained_embed, freeze = True)
self.lstm = nn.LSTM(embedding_size,
lstm_size,
batch_first=True)
self.fc = nn.Linear(lstm_size, n_vocab)
def forward(self, x, prev_state):
embed = self.embedding(x)
output, state = self.lstm(embed, prev_state)
logits = self.fc(output)
return logits, state
现在我想写一个函数,根据训练好的语言模型(一些分数,如困惑等),计算一个句子的好坏。
我有点迷茫,不知道该如何计算。
类似的样本会有很大用处。
使用交叉熵损失时,您只需使用指数函数torch.exp()
根据损失计算困惑度。
所以这只是一些虚拟示例:
import torch
import torch.nn.functional as F
num_classes = 10
batch_size = 1
# your model outputs / logits
output = torch.rand(batch_size, num_classes)
# your targets
target = torch.randint(num_classes, (batch_size,))
# getting loss using cross entropy
loss = F.cross_entropy(output, target)
# calculating perplexity
perplexity = torch.exp(loss)
print('Loss:', loss, 'PP:', perplexity)
在我的例子中,输出是:
Loss: tensor(2.7935) PP: tensor(16.3376)
如果你想得到每个词的困惑度,你只需要注意这一点,你也需要有每个词的损失。
这里是一个简洁的语言模型示例,可能看起来很有趣,它还计算输出的困惑度:
我刚刚使用 pytorch 训练了一个 LSTM 语言模型。 class 的主体是这样的:
class LM(nn.Module):
def __init__(self, n_vocab,
seq_size,
embedding_size,
lstm_size,
pretrained_embed):
super(LM, self).__init__()
self.seq_size = seq_size
self.lstm_size = lstm_size
self.embedding = nn.Embedding.from_pretrained(pretrained_embed, freeze = True)
self.lstm = nn.LSTM(embedding_size,
lstm_size,
batch_first=True)
self.fc = nn.Linear(lstm_size, n_vocab)
def forward(self, x, prev_state):
embed = self.embedding(x)
output, state = self.lstm(embed, prev_state)
logits = self.fc(output)
return logits, state
现在我想写一个函数,根据训练好的语言模型(一些分数,如困惑等),计算一个句子的好坏。
我有点迷茫,不知道该如何计算。
类似的样本会有很大用处。
使用交叉熵损失时,您只需使用指数函数torch.exp()
根据损失计算困惑度。
所以这只是一些虚拟示例:
import torch
import torch.nn.functional as F
num_classes = 10
batch_size = 1
# your model outputs / logits
output = torch.rand(batch_size, num_classes)
# your targets
target = torch.randint(num_classes, (batch_size,))
# getting loss using cross entropy
loss = F.cross_entropy(output, target)
# calculating perplexity
perplexity = torch.exp(loss)
print('Loss:', loss, 'PP:', perplexity)
在我的例子中,输出是:
Loss: tensor(2.7935) PP: tensor(16.3376)
如果你想得到每个词的困惑度,你只需要注意这一点,你也需要有每个词的损失。
这里是一个简洁的语言模型示例,可能看起来很有趣,它还计算输出的困惑度: