当您的模型不能过度拟合一小部分数据时,这意味着什么?
What it means when your model can't overfit a small batch of data?
我正在尝试训练 RNN 模型将句子分为 4 类,但它似乎不起作用。我尝试过拟合 4 个有效的示例(蓝线),但即使只有 8 个示例(红线)也不起作用,更不用说整个数据集了。
我尝试了 hidden_size
和 embedding_size
的不同学习率和大小,但似乎没有帮助,我错过了什么?我知道,如果模型无法过度拟合小批量,则意味着应该增加容量,但在这种情况下,增加容量没有任何效果。
架构如下:
class RNN(nn.Module):
def __init__(self, embedding_size=256, hidden_size=128, num_classes=4):
super().__init__()
self.embedding = nn.Embedding(len(vocab), embedding_size, 0)
self.rnn = nn.RNN(embedding_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, num_classes)
def forward(self, x):
#x=[batch_size, sequence_length]
x = self.embedding(x) #x=[batch_size, sequence_length, embedding_size]
_, h_n = self.rnn(x) #h_n=[1, batch_size, hidden_size]
h_n = h_n.squeeze(0)
out = self.fc(h_n) #out=[batch_size, num_classes]
return out
输入数据是标记化的句子,用 0 填充到批次中最长的句子,例如一个样本是:[2784, 9544, 1321, 120, 0, 0]。数据来自 AG_NEWS 来自 torchtext 数据集的数据集。
训练代码:
model = RNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=LR)
model.train()
for epoch in range(NUM_EPOCHS):
epoch_losses = []
correct_predictions = []
for batch_idx, (labels, texts) in enumerate(train_loader):
scores = model(texts)
loss = criterion(scores, labels)
loss.backward()
optimizer.step()
optimizer.zero_grad()
epoch_losses.append(loss.item())
correct = (scores.max(1).indices==labels).sum()
correct_predictions.append(correct)
epoch_avg_loss = sum(epoch_losses)/len(epoch_losses)
epoch_avg_accuracy = float(sum(correct_predictions))/float(len(labels))
这个问题是由于梯度消失引起的,它已通过使用批量归一化得到解决。
我正在尝试训练 RNN 模型将句子分为 4 类,但它似乎不起作用。我尝试过拟合 4 个有效的示例(蓝线),但即使只有 8 个示例(红线)也不起作用,更不用说整个数据集了。
我尝试了 hidden_size
和 embedding_size
的不同学习率和大小,但似乎没有帮助,我错过了什么?我知道,如果模型无法过度拟合小批量,则意味着应该增加容量,但在这种情况下,增加容量没有任何效果。
架构如下:
class RNN(nn.Module):
def __init__(self, embedding_size=256, hidden_size=128, num_classes=4):
super().__init__()
self.embedding = nn.Embedding(len(vocab), embedding_size, 0)
self.rnn = nn.RNN(embedding_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, num_classes)
def forward(self, x):
#x=[batch_size, sequence_length]
x = self.embedding(x) #x=[batch_size, sequence_length, embedding_size]
_, h_n = self.rnn(x) #h_n=[1, batch_size, hidden_size]
h_n = h_n.squeeze(0)
out = self.fc(h_n) #out=[batch_size, num_classes]
return out
输入数据是标记化的句子,用 0 填充到批次中最长的句子,例如一个样本是:[2784, 9544, 1321, 120, 0, 0]。数据来自 AG_NEWS 来自 torchtext 数据集的数据集。
训练代码:
model = RNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=LR)
model.train()
for epoch in range(NUM_EPOCHS):
epoch_losses = []
correct_predictions = []
for batch_idx, (labels, texts) in enumerate(train_loader):
scores = model(texts)
loss = criterion(scores, labels)
loss.backward()
optimizer.step()
optimizer.zero_grad()
epoch_losses.append(loss.item())
correct = (scores.max(1).indices==labels).sum()
correct_predictions.append(correct)
epoch_avg_loss = sum(epoch_losses)/len(epoch_losses)
epoch_avg_accuracy = float(sum(correct_predictions))/float(len(labels))
这个问题是由于梯度消失引起的,它已通过使用批量归一化得到解决。