我有一个非常不平衡的数据集。https://cl.awaisathar.com/citation-sentiment-corpus/上课时间:829负类:280中立类别:7627
这是我的网络:
Sentiment_LSTM(
(embedding): Embedding(5491, 400)
(lstm): LSTM(400, 512, num_layers=2, batch_first=True, dropout=0.5)
(dropout): Dropout(p=0.5, inplace=False)
(fc): Linear(in_features=512, out_features=3, bias=True)
(sig): Sigmoid()
)
丢失功能:
lr=0.001
criterion = nn.BCELoss()
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
在小班教学中我的准确性很低。我该如何进一步改善?
我会尝试使用softmax而不是三个Sigmoids。使用sigmoids,可以对三个条件独立的分布进行建模。这并不是您真正想要的,因为评论可以是肯定的,中性的或否定的,但不能同时例如是肯定的和中性的—它们根本不是独立的。使用softmax,概率分布将在三个类别中分布,并且模型可能更好地理解为正意味着同时不是中立。
还请注意,对于softmax,您需要使用NLLLoss
或NLLLoss
而不是CrossEntropyLoss
。
如果这还不够,您可以为损失增加权重,因此正面和负面评论在培训中会更加突出。为此,您需要自己减少损失。设置CrossEntropyLoss
,这样就不会得到一个单一的数字,而是一个损失值的向量,批次中的每个示例一个。然后,您可以将其乘以权重向量(我将从将权重设置为0.5(中性)和1(其他两项)开始)。然后,您可以仅通过在张量上调用BCELoss
方法来平均损失。