前提・実現したいこと
何故、損失関数の値が上がっていくのかの理由と、その対処法を知りたいです。
使用している損失関数、最適アルゴリズム
損失関数 MSELoss
最適アルゴリズム SGD
発生している問題・エラーメッセージ
現在、ツイッターbotがbotかそうではないか(0or1)の判断をする機械学習プログラムをpytorchで作っています。
そこで、以下のような事態に遭遇しました。
正解データの0と、1の数です。
0 1073
1 197
###BCELoss使用
####SGD lr =0.005 エポック数 500
###--------------------------追記(修正依頼参照)--------------------------
BCEWithLogitsLoss使用
####SGD lr =0.005 エポック数 500
####SGD lr =0.005 エポック数 2000
###Adamの挙動確認 layer =self.l1のみ(Sigmoid不使用)、BCEWithLogitsLoss使用
該当のソースコード
python
1import torch 2import torch.nn as nn 3import torch.optim as optimizers 4class MLP(nn.Module): 5 def __init__(self,input_dim,output_dim): 6 super().__init__() 7 self.l1 = nn.Linear(input_dim,1) 8 self.a1 = nn.Sigmoid() 9 self.l2 = nn.Linear(3,1) 10 self.a2 = nn.Sigmoid() 11 12 self.layers = [self.l1,self.a1] 13 14 def forward(self,x): 15 for layer in self.layers: 16 x = layer(x) 17 return x 18 19device = torch.device("cuda" if torch.cuda.is_available() else "cpu") 20 21model = MLP(x_train.shape[1],1).to(device) 22 23criterion = nn.BCELoss() 24 25def compute_loss(t,y): 26 return criterion(y,t) 27 28optimizers = optimizers.SGD(model.parameters(),lr=0.005)
python
1import matplotlib.pyplot as plt 2from sklearn.utils import shuffle 3 4def train_step(x,t): 5 model.train() 6 preds = model(x) 7 loss = compute_loss(t,preds) 8 loss.backward() 9 optimizers.step() 10 return loss 11 12epochs = 1000 13train_loss_list = [] 14test_loss_list = [] 15 16""" 17データの整形 18""" 19 20x_train_row = x_train.values.reshape(-1,x_train.shape[1]) 21x_test_row = x_test.values.reshape(-1,x_test.shape[1]) 22 23for epoch in range(epochs): 24 train_loss = 0 25 test_loss = 0 26 27 x_train_row,y_train_row=shuffle(x_train_row,y_train_row) 28 x_ = torch.tensor(x_train_row).float().to(device) 29 t_ = torch.tensor(y_train_row).float().to(device) 30 loss = train_step(x_,t_).data.cpu().numpy() 31 train_loss = loss.item() 32 33 train_loss_list.append(train_loss) 34 now_epoch = epoch 35 36 37plt.plot(np.arange(0,now_epoch+1,1),train_loss_list) 38plt.xlabel("epoch数") 39plt.ylabel("BCELoss")
試したこと
考えてみました。
SGDは確率的に、-(y-t)なので、yが小さくなるにつれてy-tは、0になっていくはずです。なので、y=0、t=1となれば確かに上昇はします。が、グラフの上昇はそれが約4000エポック起こり続けていると言うことになるかと思います。yは、0以下の数字を取ることはないので、何が起きてるのか結局理解できませんでした。
その他
初心者なので考え方自体が間違っているかもしれませんが、その際はご指摘頂けますと幸いでございます。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー