2017-11-26 10 views
3

私は、出力として単一の値を持ち、サイズ10の3つの入力のみを供給して、単純な2層ニューラルネットワークの実験を行っています。私は入力を正規化し、学習率を下げました。これは、2つの層に完全に接続されたニューラルネットワークは、このデータ私の単純なフィードフォワードニューラルネットワークが発散するのはなぜですか(ピクト)?

Features: 

0.8138 1.2342 0.4419 0.8273 0.0728 2.4576 0.3800 0.0512 0.6872 0.5201 
1.5666 1.3955 1.0436 0.1602 0.1688 0.2074 0.8810 0.9155 0.9641 1.3668 
1.7091 0.9091 0.5058 0.6149 0.3669 0.1365 0.3442 0.9482 1.2550 1.6950 
[torch.FloatTensor of size 3x10] 


Targets 
[124, 125, 122] 
[torch.FloatTensor of size 3] 

コードは簡単な例から構成されていると私は損失関数としてMSELossを使用していますに自明フィットすることができるはず私の理解です。わずか数回反復すると、損失は無限に発散します。

features = torch.from_numpy(np.array(features)) 

x_data = Variable(torch.Tensor(features)) 
y_data = Variable(torch.Tensor(targets)) 

class Model(torch.nn.Module): 
    def __init__(self): 
     super(Model, self).__init__() 
     self.linear = torch.nn.Linear(10,5) 
     self.linear2 = torch.nn.Linear(5,1) 

    def forward(self, x): 
     l_out1 = self.linear(x) 
     y_pred = self.linear2(l_out1) 
     return y_pred 

model = Model() 

criterion = torch.nn.MSELoss(size_average = False) 
optim = torch.optim.SGD(model.parameters(), lr = 0.001) 

def main(): 
    for iteration in range(1000): 
     y_pred = model(x_data) 
     loss = criterion(y_pred, y_data) 

     print(iteration, loss.data[0]) 
     optim.zero_grad() 

     loss.backward() 
     optim.step() 

助けてください。おかげ

はEDIT:

確かに、単にlearning rateが高すぎることが原因だったようです。 0.00001に設定すると、コンバージェンスが非常に遅くなりますが、コンバージェンスの問題が修正されます。

+0

勾配降下を実行する前に機能を正規化することをお勧めします。ノーマライズはより速いコンバージェンス(通常)を提供し、各反復でのグラデーションはフィーチャの大きさに基づいているため、学習率を上げることができます。テスト時間には、トレーニングセットの場合と同じ方法でテストデータセットのフィーチャを正規化する必要があります。 – rayryeng

+0

こんにちは、機能は実際には、平均を差し引いて標準偏差で割る標準的な方法で実際に既に正規化されています。元のデータは、ゼロとおよそ10,000の間で分布しています。 –

答えて

0

yの代わりにログ(y)を予測して、収束性をさらに向上させることができます。また、Adamオプティマイザ(適応学習率)はバッチ正規化(例えば、線形レイヤー間)を助けます。

関連する問題