बहुत लंबे समय तक प्रशिक्षण के दौरान एडम ऑप्टिमाइज़र के साथ अजीब व्यवहार


11

मैं 64 बेतरतीब ढंग से उत्पन्न डेटा बिंदुओं पर एक एकल अवधारणात्मक (1000 इनपुट इकाइयों, 1 आउटपुट, कोई छिपी हुई परतों) को प्रशिक्षित करने की कोशिश कर रहा हूं। मैं एडम ऑप्टिमाइज़र का उपयोग करके पाइटोरेक का उपयोग कर रहा हूं:

import torch
from torch.autograd import Variable

torch.manual_seed(545345)
N, D_in, D_out = 64, 1000, 1

x = Variable(torch.randn(N, D_in))
y = Variable(torch.randn(N, D_out))

model = torch.nn.Linear(D_in, D_out)
loss_fn = torch.nn.MSELoss(size_average=False)

optimizer = torch.optim.Adam(model.parameters())
for t in xrange(5000):
  y_pred = model(x)
  loss = loss_fn(y_pred, y)

  print(t, loss.data[0])

  optimizer.zero_grad()
  loss.backward()
  optimizer.step()

प्रारंभ में, नुकसान जल्दी से कम हो जाता है, जैसा कि अपेक्षित था:

(0, 91.74887084960938)
(1, 76.85824584960938)
(2, 63.434078216552734)
(3, 51.46927261352539)
(4, 40.942893981933594)
(5, 31.819372177124023)

लगभग 300 पुनरावृत्तियों, त्रुटि शून्य के पास पहुँचती है:

(300, 2.1734419819452455e-12)
(301, 1.90354676465887e-12)
(302, 2.3347573874232808e-12)

यह कुछ हजार पुनरावृत्तियों के लिए जाता है। हालाँकि, बहुत लंबे समय तक प्रशिक्षण के बाद, त्रुटि फिर से बढ़ने लगती है:

(4997, 0.002102422062307596)
(4998, 0.0020302983466535807)
(4999, 0.0017039275262504816)

ये क्यों हो रहा है?


मुझे नहीं लगता कि ओवरफिटिंग इसे समझाती है - प्रशिक्षण हानि ऊपर जा रही है, सत्यापन हानि नहीं। उदाहरण के लिए, ऐसा नहीं होता है जब केवल एडेम के साथ ही एसडब्ल्यूई का उपयोग किया जाता है।
बाई ली

मॉडल में 1000 पैरामीटर हैं और केवल 1 डेटा बिंदु है, इसलिए मॉडल को डेटा बिल्कुल फिट होना चाहिए और नुकसान शून्य होना चाहिए।
बाई ली

ओह सॉरी, आप सही कह रहे हैं। 64 डेटा पॉइंट हैं।
बाई ली

64 डेटा बिंदु (यानी, बाधाएं) और 1000 पैरामीटर हैं, इसलिए मापदंडों के लिए विकल्प ढूंढना संभव है ताकि त्रुटि शून्य हो (और यह विश्लेषणात्मक रूप से करना आसान है)। मेरा प्रश्न यह है कि आदम को यह क्यों नहीं मिला।
बाई ली

जवाबों:


19

अभिसरण के अंत में यह छोटी अस्थिरता आदम (और आरएमएसप्रॉप) की एक विशेषता है कि यह कैसे अनुमान लगाता है कि हाल के कदमों और ढाल द्वारा इनका मतलब है।

एक चीज जो एडम करता है वह हाल के ग्रेडिएंट्स और ग्रेडर के वर्गों के रोलिंग ज्यामितीय माध्यम को बनाए रखता है। ग्रेडिएंट के वर्गों का उपयोग वर्तमान चरण को तय करने के लिए वर्तमान ढाल को विभाजित करने के लिए (एक अन्य रोलिंग माध्य) करने के लिए किया जाता है। हालाँकि, जब आपकी ढाल शून्य के बहुत करीब हो जाती है, तो इससे ढाल के वर्ग इतने कम हो जाएंगे कि उनमें या तो बड़ी गोलाई वाली त्रुटियां हैं या वे प्रभावी रूप से शून्य हैं, जो अस्थिरता का परिचय दे सकती हैं (उदाहरण के लिए एक दीर्घकालिक स्थिर ढाल एक आयाम से एक अपेक्षाकृत छोटा कदम है10-10 सेवा 10-5अन्य परिंदों में बदलाव के कारण ), और कदम का आकार फिर से बसने से पहले, चारों ओर कूदना शुरू कर देगा।

यह वास्तव में एडम को आपकी समस्या के लिए अधिक बुनियादी ढाल वंश की तुलना में कम स्थिर और बदतर बना देता है, यह मानते हुए कि आप संख्यात्मक रूप से शून्य हानि के करीब पहुंचना चाहते हैं क्योंकि गणना आपकी समस्या के लिए अनुमति देती है।

गहरी सीखने की समस्याओं पर अभ्यास में, आप इस अभिसरण के करीब नहीं पहुंचते हैं (और कुछ नियमितीकरण तकनीकों के लिए जैसे कि जल्दी रोकना, आप वैसे भी नहीं करना चाहते हैं), इसलिए यह आमतौर पर समस्या के प्रकारों पर व्यावहारिक चिंता नहीं है एडम के लिए डिजाइन किया गया था।

आप वास्तव में RMSProp के लिए अलग-अलग ऑप्टिमाइज़र की तुलना में ऐसा होते हुए देख सकते हैं (RMSProp वह काली रेखा है - लक्ष्य तक पहुँचते ही बहुत अंतिम चरण देखें):

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

आप एडम को अधिक स्थिर बना सकते हैं और सीखने की दर को कम करके वास्तविक अभिसरण के करीब लाने में सक्षम हैं। उदाहरण के लिए

optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

अनुकूलन करने में अधिक समय लगेगा। का उपयोग करते हुए lr=1e-5आप 20,000 पुनरावृत्तियों के लिए प्रशिक्षित करने के लिए इससे पहले कि आप अस्थिरता को देखने की जरूरत है और अस्थिरता कम नाटकीय है, मूल्यों के आसपास मंडराना10-7


यह एक शानदार दृश्य है, नील। वास्तविक आयाम क्या हैं? X और y क्या दर्शा रहा है? क्या फ्रेम प्रति फ्रेम कुछ डेल्टा टी या एन युग हैं? मुझे लगता है कि स्टार दो चयनित मापदंडों के संबंध में असमानता (त्रुटि) के स्थलाकृतिक प्रतिनिधित्व में वैश्विक इष्टतम है। क्या मेरा अनुमान सही है?
डगलस डेसेको

यह मेरा दृश्य नहीं है, आप इसे कई स्थानों पर पाएंगे। आयाम एक परीक्षण फ़ंक्शन के लिए इनपुट मापदंडों की मनमानी इकाइयाँ हैं, और ग्राफ़ उस फ़ंक्शन के लिए समोच्च रेखाएं दिखाता है (फिर से मनमानी इकाइयों में, संभवतः बढ़ा हुआ है ताकि एनएन ठीक काम करता है)। प्रत्येक फ़्रेम एक भार अद्यतन चरण है। यह शायद एक मिनी-बैच अपडेट के बराबर है, और SGD के व्यवहार के कारण, मुझे उम्मीद है कि यह वास्तव में परीक्षण फ़ंक्शन के वास्तविक ढाल का उपयोग करके हल किया जा रहा है - अर्थात कोई डेटा सेट या नमूना नहीं है।
नील स्लेटर

1

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

मैं दृष्टिकोण के एक जोड़े के बारे में सोच सकते हैं:

  1. आप एक ऊपरी / निचले बाउंड के साथ ग्रेडिएंट को क्लिप कर सकते हैं लेकिन यह अभिसरण की गारंटी नहीं देता है और इसके परिणामस्वरूप कुछ स्थानीय मिनिमा में फंसने से प्रशिक्षण फ्रीज हो सकता है और कभी भी इससे बाहर नहीं निकल सकता है।

  2. एक उच्च बैच आकार, अधिक युगों और एक क्षयकारी सीखने की दर के साथ प्रशिक्षित करें। अब मेरे पास कोई व्यावहारिक प्रमाण नहीं है कि बैच आकार बढ़ने से बेहतर ग्रेडिएंट्स मिलते हैं, लेकिन मैंने आपके जैसी समस्याओं का सामना करके जो देखा है, ऐसा करने से लगभग हमेशा मदद मिली है।

मुझे यकीन है कि अन्य विधियां (जैसे चक्रीय सीखने की दर आदि) हैं जो आंकड़ों के आधार पर एक इष्टतम सीखने की दर को खोजने की कोशिश करती हैं।

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