আমি পাইটর্চে অ্যাডাম অপ্টিমাইজারের সাথে শিক্ষার হার ক্ষয় করলে হঠাৎ হঠাৎ লোকসান


11

আমি অপটিমাইজার (সাথে ) এবং একক চ্যানেল অডিও সোর্স পৃথককরণ কার্যের জন্য একটি auto-encoderনেটওয়ার্ক প্রশিক্ষণ দিচ্ছি । যখনই আমি একটি ফ্যাক্টর দ্বারা শেখার হার ক্ষয় করি, নেটওয়ার্ক ক্ষতি হঠাৎ করে লাফিয়ে যায় এবং তারপরে শিখার হারের পরবর্তী ক্ষয় হওয়া পর্যন্ত হ্রাস পায়।Adamamsgrad=TrueMSE loss

আমি নেটওয়ার্ক বাস্তবায়ন এবং প্রশিক্ষণের জন্য পাইটরঞ্চ ব্যবহার করছি।

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:

সেটআপ -১ ফলাফল

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:

সেটআপ -২ ফলাফল

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:

সেটআপ -৩ ফলাফল

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 দ্বারা প্রস্তাবিত।
  • মন্তব্যগুলিতে @ ডেনিসের পরামর্শ অনুসারে লিকিরেলু দিয়ে চেষ্টা করা।

কোন সাহায্য. ধন্যবাদ


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
বেন এন

উত্তর:


8

ক্ষয়িষ্ণু শিক্ষার হারগুলি আপনি যে ক্ষতির মধ্যে লক্ষ করছেন তাতে ধরণের জাম্প তৈরি হওয়ার কোনও কারণ আমি দেখতে পাচ্ছি না। এটি "ধীরে ধীরে" হওয়া উচিত যাতে আপনি কত দ্রুত "সরান", যা ক্ষতির ক্ষেত্রে অন্যথায় ধারাবাহিকভাবে সঙ্কুচিত হওয়া উচিত, সবচেয়ে খারাপভাবে, কেবল আপনার ক্ষতির মধ্যে একটি মালভূমির দিকে পরিচালিত করা উচিত (বরং সেই লাফিয়ে লাফিয়ে)।

আমি আপনার কোডে প্রথম জিনিসটি পর্যবেক্ষণ করি তা হ'ল আপনি প্রতিটি পর্ব স্ক্র্যাচ থেকে পুনরায় তৈরি করে optim আমি পাইটর্চের সাথে এখনও নিশ্চিতভাবে বলার জন্য পর্যাপ্ত পরিশ্রম করি নি, তবে এটি প্রতিবারই অপ্টিমাইজারের অভ্যন্তরীণ অবস্থা / স্মৃতিটিকে ধ্বংস করে না? আমি মনে করি আপনার পর্বগুলির মধ্য দিয়ে লুপ দেওয়ার আগে আপনার একবারে কেবলমাত্র অপ্টিমাইজার তৈরি করা উচিত। এটি যদি আপনার কোডটিতে প্রকৃতপক্ষে একটি বাগ হয় তবে আপনি যদি শেখার হার ক্ষয় না করেন সে ক্ষেত্রে এটি অবশ্যই ত্রুটিপূর্ণ হওয়া উচিত ... তবে সম্ভবত আপনি সেখানে ভাগ্যবান হন এবং এর একই নেতিবাচক প্রভাবগুলি অনুভব করেন না বাগ।

শেখার হার ক্ষয় হওয়ার জন্য, আমি ম্যানুয়াল সমাধানের পরিবর্তে এর জন্য অফিসিয়াল এপিআই ব্যবহার করার পরামর্শ দেব । আপনার বিশেষ ক্ষেত্রে, আপনি একটি স্টেপএলআর শিডিয়ুলার ইনস্ট্যান্ট করতে চাইবেন :

  • optimizer = অ্যাডাম অপ্টিমাইজার, যা সম্ভবত আপনার কেবল একবার ইনস্ট্যান্ট করা উচিত।
  • step_size = 25
  • gamma = 0.25

তারপরে আপনি কেবল scheduler.step()প্রতিটি যুগের শুরুতে কল করতে পারেন (বা শেষে হতে পারে? এপিআই লিঙ্কের উদাহরণটি এটি প্রতিটি যুগের শুরুতে কল করে)।


উপরের পরিবর্তনের পরেও, আপনি যদি সমস্যাটি এখনও অনুভব করেন তবে আপনার প্রতিটি পরীক্ষা একাধিকবার চালানো এবং গড় ফলস (বা সমস্ত পরীক্ষার জন্য প্লট লাইন) চালানো কার্যকর হবে। আপনার পরীক্ষাগুলি তাত্ত্বিকভাবে প্রথম 25 যুগের সময় অভিন্ন হওয়া উচিত, তবে আমরা এখনও এখনও সেই প্রথম 25 যুগের মধ্যে দুটি চিত্রের মধ্যে বিশাল পার্থক্য দেখতে পাই যেখানে কোন শিক্ষার হার ক্ষয় হয় না (উদাহরণস্বরূপ, একটি চিত্র 28 ডলার ক্ষতিতে শুরু হয়, অন্যটি ~ 40 কে লোকসান দিয়ে শুরু হয়)। এটি কেবল বিভিন্ন এলোমেলো সূচনাগুলির কারণে হতে পারে, সুতরাং আপনার প্লটগুলির মধ্যে ননডেটেরিমিনিস্ট্রিমাইজেশন গড় করা ভাল।


1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
বেন এন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.