जब मैं PyTorch में एडम ऑप्टिमाइज़र के साथ सीखने की दर घटाता हूं तो नुकसान अचानक बढ़ जाता है


11

मैं ऑप्टिमाइज़र (साथ ) और एकल चैनल ऑडियो स्रोत पृथक्करण कार्य के auto-encoderसाथ एक नेटवर्क का प्रशिक्षण दे रहा हूं । जब भी मैं एक कारक द्वारा सीखने की दर को कम करता हूं, तो नेटवर्क हानि अचानक कूद जाती है और फिर सीखने की दर में अगले क्षय तक घट जाती है।Adamamsgrad=TrueMSE loss

मैं Pytorch का उपयोग नेटवर्क कार्यान्वयन और प्रशिक्षण के लिए कर रहा हूं।

Following are my experimental setups:

 Setup-1: NO learning rate decay, and 
          Using the same Adam optimizer for all epochs

 Setup-2: NO learning rate decay, and 
          Creating a new Adam optimizer with same initial values every epoch

 Setup-3: 0.25 decay in learning rate every 25 epochs, and
          Creating a new Adam optimizer every epoch

 Setup-4: 0.25 decay in learning rate every 25 epochs, and
          NOT creating a new Adam optimizer every time rather
          using PyTorch's "multiStepLR" and "ExponentialLR" decay scheduler 
          every 25 epochs

मुझे सेटअप # 2, # 3, # 4 के लिए बहुत आश्चर्यजनक परिणाम मिल रहे हैं और इसके लिए कोई स्पष्टीकरण देने में असमर्थ हूं। निम्नलिखित मेरे परिणाम हैं:

Setup-1 Results:

Here I'm NOT decaying the learning rate and 
I'm using the same Adam optimizer. So my results are as expected.
My loss decreases with more epochs.
Below is the loss plot this setup.

प्लॉट-1:

सेटअप -1 परिणाम

optimizer = torch.optim.Adam(lr=m_lr,amsgrad=True, ...........)

for epoch in range(num_epochs):
    running_loss = 0.0
    for i in range(num_train):
        train_input_tensor = ..........                    
        train_label_tensor = ..........
        optimizer.zero_grad()
        pred_label_tensor = model(train_input_tensor)
        loss = criterion(pred_label_tensor, train_label_tensor)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    loss_history[m_lr].append(running_loss/num_train)

Setup-2 Results:  

Here I'm NOT decaying the learning rate but every epoch I'm creating a new
Adam optimizer with the same initial parameters.
Here also results show similar behavior as Setup-1.

Because at every epoch a new Adam optimizer is created, so the calculated gradients
for each parameter should be lost, but it seems that this doesnot affect the 
network learning. Can anyone please help on this?

प्लॉट -2:

सेटअप -2 परिणाम

for epoch in range(num_epochs):
    optimizer = torch.optim.Adam(lr=m_lr,amsgrad=True, ...........)

    running_loss = 0.0
    for i in range(num_train):
        train_input_tensor = ..........                    
        train_label_tensor = ..........
        optimizer.zero_grad()
        pred_label_tensor = model(train_input_tensor)
        loss = criterion(pred_label_tensor, train_label_tensor)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    loss_history[m_lr].append(running_loss/num_train)

Setup-3 Results: 

As can be seen from the results in below plot, 
my loss jumps every time I decay the learning rate. This is a weird behavior.

If it was happening due to the fact that I'm creating a new Adam 
optimizer every epoch then, it should have happened in Setup #1, #2 as well.
And if it is happening due to the creation of a new Adam optimizer with a new 
learning rate (alpha) every 25 epochs, then the results of Setup #4 below also 
denies such correlation.

प्लॉट-3:

सेटअप -3 परिणाम

decay_rate = 0.25
for epoch in range(num_epochs):
    optimizer = torch.optim.Adam(lr=m_lr,amsgrad=True, ...........)

    if epoch % 25 == 0  and epoch != 0:
        lr *= decay_rate   # decay the learning rate

    running_loss = 0.0
    for i in range(num_train):
        train_input_tensor = ..........                    
        train_label_tensor = ..........
        optimizer.zero_grad()
        pred_label_tensor = model(train_input_tensor)
        loss = criterion(pred_label_tensor, train_label_tensor)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    loss_history[m_lr].append(running_loss/num_train)

Setup-4 Results:  

In this setup, I'm using Pytorch's learning-rate-decay scheduler (multiStepLR)
which decays the learning rate every 25 epochs by 0.25.
Here also, the loss jumps everytime the learning rate is decayed.

जैसा कि नीचे की टिप्पणियों में @ डेनिस ने सुझाव दिया था, मैंने दोनों ReLUऔर 1e-02 leakyReLUगैर- प्रसंगों के साथ प्रयास किया । लेकिन, परिणाम समान लगते हैं और नुकसान पहले कम हो जाता है, फिर बढ़ जाता है और फिर उच्च मूल्य पर संतृप्त होता है, जो कि मैं सीखने की दर में गिरावट के बिना प्राप्त करूंगा।

प्लॉट -4 परिणाम दिखाता है।

प्लॉट -4:

यहाँ छवि विवरण दर्ज करें

scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer=optimizer, milestones=[25,50,75], gamma=0.25)

scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer=optimizer, gamma=0.95)

scheduler = ......... # defined above
optimizer = torch.optim.Adam(lr=m_lr,amsgrad=True, ...........)

for epoch in range(num_epochs):

    scheduler.step()

    running_loss = 0.0
    for i in range(num_train):
        train_input_tensor = ..........                    
        train_label_tensor = ..........
        optimizer.zero_grad()
        pred_label_tensor = model(train_input_tensor)
        loss = criterion(pred_label_tensor, train_label_tensor)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    loss_history[m_lr].append(running_loss/num_train)

संपादन:

  • जैसा कि टिप्पणियों में सुझाया गया है और नीचे उत्तर दिया गया है, मैंने अपने कोड में बदलाव किए हैं और मॉडल को प्रशिक्षित किया है। मैंने उसी के लिए कोड और प्लॉट जोड़े हैं।
  • मैं विभिन्न साथ की कोशिश की lr_schedulerमें PyTorch (multiStepLR, ExponentialLR)और उसी के लिए भूखंडों में सूचीबद्ध हैं Setup-4, जैसा कि नीचे टिप्पणी में @Dennis ने सुझाव दिया।
  • टिप्पणी में @ डेनिस द्वारा सुझाव के रूप में leakyReLU के साथ कोशिश कर रहा है।

कोई मदद। धन्यवाद


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
बेन एन

जवाबों:


8

मुझे कोई कारण नहीं है कि सीखने की दर में गिरावट का कारण उन नुकसानों में कूदना चाहिए जो आप देख रहे हैं। इसे "धीमा" करना चाहिए कि आप कितनी जल्दी "चाल" करते हैं, जो एक नुकसान के मामले में है जो अन्यथा लगातार सिकुड़ता है, कम से कम, सबसे खराब, बस अपने नुकसान (उन छलांगों के बजाय) में एक पठार का नेतृत्व करना चाहिए।

आपके कोड में पहली चीज जो मैं देख रहा हूं, वह यह है कि आप ऑप्टिमाइज़र को हर युग से स्क्रैच से फिर से बनाते हैं। मैंने निश्चित रूप से बताने के लिए PyTorch के साथ पर्याप्त काम नहीं किया है, लेकिन क्या यह हर बार ऑप्टिमाइज़र की आंतरिक स्थिति / मेमोरी को नष्ट नहीं करता है? मुझे लगता है कि आपको युगों के माध्यम से लूप से पहले, बस एक बार ऑप्टिमाइज़र बनाना चाहिए। यदि यह वास्तव में आपके कोड में एक बग है, तो यह वास्तव में उस मामले में अभी भी एक बग होना चाहिए जहां आप सीखने की दर में गिरावट का उपयोग नहीं करते हैं ... लेकिन शायद आप बस वहां भाग्यशाली हों और उसी नकारात्मक प्रभाव का अनुभव न करें। बग।

सीखने की दर में गिरावट के लिए, मैं एक मैनुअल समाधान के बजाय, इसके लिए आधिकारिक एपीआई का उपयोग करने की सलाह दूंगा। अपने विशेष मामले में, आप एक StepLR अनुसूचक को तुरंत बदलना चाहेंगे :

  • optimizer = ADAM ऑप्टिमाइज़र, जिसे आपको केवल एक बार इंस्टेंट करना चाहिए।
  • step_size = 25
  • gamma = 0.25

फिर आप बस scheduler.step()प्रत्येक युग की शुरुआत में कॉल कर सकते हैं (या शायद अंत में? एपीआई लिंक में उदाहरण इसे हर युग की शुरुआत में कहता है)।


यदि, उपरोक्त परिवर्तनों के बाद, आप अभी भी समस्या का अनुभव करते हैं, तो यह आपके प्रत्येक प्रयोग को कई बार चलाने और औसत परिणाम (सभी प्रयोगों के लिए प्लॉट लाइनों) को प्लॉट करने के लिए भी उपयोगी होगा। आपके प्रयोग सैद्धांतिक रूप से पहले 25 युगों के दौरान समान होने चाहिए, लेकिन हम अभी भी दो आंकड़ों के बीच उन पहले 25 युगों के दौरान भारी अंतर देखते हैं जिसमें कोई सीखने की दर में गिरावट नहीं होती है (उदाहरण के लिए, एक आंकड़ा ~ 28K के नुकसान पर शुरू होता है, दूसरा) ~ 40K के नुकसान पर शुरू होता है)। यह बस अलग-अलग रैंडम इनिशियलाइज़ेशन के कारण हो सकता है, इसलिए यह अच्छा होगा कि आप अपने प्लॉट्स से उस नॉनडेटर्मिनिसिम को एवरेज करें।


1
टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
बेन एन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.