प्रतिगमन के लिए एक तंत्रिका नेटवर्क का प्रशिक्षण हमेशा माध्य की भविष्यवाणी करता है


9

मैं प्रतिगमन के लिए एक सरल दृढ़ तंत्रिका नेटवर्क का प्रशिक्षण दे रहा हूं, जहां कार्य एक छवि में एक बॉक्स के (x, y) स्थान की भविष्यवाणी करना है:

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

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

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

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

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

नेटवर्क के आउटपुट में दो नोड्स हैं, एक एक्स के लिए, और एक वाई के लिए। बाकी नेटवर्क एक मानक कनवसनल न्यूरल नेटवर्क है। नुकसान बॉक्स की अनुमानित स्थिति और जमीनी सच्चाई की स्थिति के बीच एक मानक मतलब चुकता त्रुटि है। मैं इनमें से 10000 चित्रों पर प्रशिक्षण ले रहा हूं, और 2000 को मान्य कर रहा हूं।

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

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

मैंने इसे इस ग्राफ में दिखाए गए की तुलना में कई अधिक युगों के लिए चलाया है, और नुकसान अभी भी कम नहीं हुआ है। दिलचस्प बात यह है कि नुकसान वास्तव में एक बिंदु पर बढ़ जाता है।

इसलिए, ऐसा लगता है कि नेटवर्क केवल एक अच्छा प्रशिक्षण सीखने के बजाय प्रशिक्षण डेटा के औसत की भविष्यवाणी कर रहा है। यह क्यों हो सकता है पर कोई विचार? मैं एडम का उपयोग 0.01 के प्रारंभिक सीखने की दर के साथ अनुकूलक के रूप में कर रहा हूं, और सक्रियण के रूप में रिलेस कर रहा हूं


यदि आप मेरे कुछ कोड (Keras) में रुचि रखते हैं, तो यह नीचे है:

# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))


# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)

क्या आपके वास्तविक नमूनों के शीर्ष उदाहरणों पर चित्र हैं? क्या वह 5 अलग-अलग नमूने हैं? प्रतीत होता है कि छवियों में कोई जानकारी नहीं है जो सामान्य बनाने में मदद करेगी। मेरा मतलब है, आपको सफेद वर्ग के x, y स्थान को खोजने के लिए एक तंत्रिका जाल की आवश्यकता नहीं है, आप बस छवि को पार्स कर सकते हैं और एक सफेद पिक्सेल की तलाश कर सकते हैं। इस मॉडल के लिए अपनी दृष्टि के बारे में थोड़ा और विस्तार से बताएं। क्या कुछ अस्थायी पैटर्न है, जिससे आप अगले स्थान की भविष्यवाणी कर रहे हैं?
2

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

1
1) पहली कन्टक्ट लेयर पर आपके इनपुट का आकार 3 (आरबीजी) चैनलों का उपयोग कर रहा है, लेकिन आपके डेटा ग्रेसिसेले (1 चैनल) 2 हैं) आपको इसकी ज़रूरत नहीं है कि बहुत से लेयर और फ़िल्टर, वास्तव में मुझे लगता है कि एक ही लेयर है, और मुट्ठी भर छोटी गुठली ठीक होगी।
फोटॉक्स

क्या आप सुनिश्चित हैं कि छवियां वास्तव में लक्ष्यों के अनुरूप हैं?
user31264

1
जैसे @photox कहता है, आपको कंफर्ट लेयर की जरूरत नहीं है। इन्हें जोड़ने से ऑप्टिमाइज़र को एक अच्छा समाधान खोजने में अधिक मुश्किल होती है। यदि आप 3 दोषी परतों को हटाते हैं तो मुझे संदेह है कि आपका "मॉडल" काम करेगा।
Pieter

जवाबों:


8

ऑप्टिमाइज़र एक (उप) इष्टतम समाधान करने में असमर्थ है। क्यों? आपकी समस्या बहुत आसान है और / या आपका मॉडल बहुत जटिल है।

बहुत आसान समस्या

जैसा कि @photox ने पहले ही कहा था कि इस समस्या को केवल एक छिपी हुई परत से हल किया जा सकता है। मुझे यह भी संदेह है कि यह एक छिपी हुई परत के बिना किया जा सकता है। ऐसा इसलिए है क्योंकि यह समस्या रैखिक रूप से अलग है

मुझे इसका उदाहरण दें। छिपी हुई परतों और एक रेखीय सक्रियण फ़ंक्शन के बिना एक तंत्रिका नेटवर्क की कल्पना करें (आप इसे रैखिक प्रतिगमन भी कह सकते हैं)। वर्ग के x- स्थान की गणना करने के लिए प्रत्येक पिक्सेल x-आउटपुट से जुड़ा होता है। पिक्सल का पहला कॉलम वजन से जुड़ा होता है1/width। दूसरा स्तंभ वजन के साथ जुड़ा हुआ है2/width। यह अंतिम कॉलम (जैसे कॉलम) तक जारी रहता हैn) जो वजन से जुड़ा है n/width। चूंकि कुछ पिक्सेल गैर-शून्य होते हैं, इसलिए आउटपुट का सक्रियण वर्ग के x-निर्देशांक में रैखिक होता है। इसलिए, एक रेखीय फ़ंक्शन वर्ग के स्थान की गणना कर सकता है।

कई समाधान हैं:

  • एक कठिन समस्या चुनें, जैसे छवि वर्गीकरण
  • शोर जोड़ें, जैसे नमक-और-काली मिर्च या सफेद-शोर
  • समस्या को और अधिक कठिन बनाइए, उदाहरण के लिए, लाल वर्ग के स्थान की भविष्यवाणी करते हुए, जबकि पृष्ठभूमि में बहुत सारे अलग-अलग रंग के वृत्त होते हैं

बहुत जटिल मॉडल

आपके मॉडल में कुछ भाग होते हैं जो कि एक मीठा इष्टतम खोजने के लिए ऑप्टिमाइज़र की मदद नहीं करते हुए बहुत अधिक जटिलता जोड़ते हैं।

उदाहरण के लिए, दृढ़ परतें। पहली परत में आकार के 32 दृढ़ फ़िल्टर हैं5×5। आप इन फ़िल्टर को सीखने की क्या उम्मीद करते हैं? छवि वर्गीकरण में ये फिल्टर किनारों, कोनों, ग्रेडिएंट्स और ब्लब्स का पता लगाना सीखते हैं। लेकिन इस मामले में केवल कुछ फिल्टर हैं जो समझ में आते हैं। मैं बाएं से दाएं और इसके विपरीत से और ऊपर से नीचे और इसके विपरीत से किनारे के बारे में सोच सकता हूं। आपके मामले में इस प्रकार लगभग 28 फिल्टर हैं जो सिर्फ यादृच्छिक शोर जोड़ते हैं। इन (या सिर्फ पूरी परत) को हटाना ऑप्टिमाइज़र के लिए एक इष्टतम खोजने के लिए बहुत आसान बनाता है जो काम करता है।

एक अन्य उदाहरण एडम ऑप्टिमाइज़र है जिसमें बहुत सारे अतिरिक्त पैरामीटर हैं। एडम ऑप्टिमाइज़र इन मापदंडों के साथ अच्छी तरह से काम कर सकता है, लेकिन आप SGDडिफ़ॉल्ट मानों के साथ एक साधारण ऑप्टिमाइज़र के साथ शुरुआत क्यों नहीं करते हैं।

इस प्रकार आप कई अनुकूलन कर सकते हैं:

  • LinearRegressionscikit-learn से उपयोग करें । ठीक है, यह वह नहीं है जो आप चाहते हैं, लेकिन मैं सिर्फ यह बताना चाहता हूं कि यह मॉडल कितना जटिल है।
  • दृढ़ परतों को हटा दें
  • छिपी हुई Denseपरतों का आकार घटाएं
  • डिफ़ॉल्ट SGDअनुकूलक का उपयोग करें
  • यदि आप एक छिपी हुई परत का उपयोग कर रहे हैं, तो आपको sigmoidसक्रियण का प्रयास करना चाहिए । आप छिपी हुई परत के प्रत्येक नोड का पता लगाने के बारे में सोच सकते हैं कि क्या एक निश्चित स्थान पर एक वर्ग है।
  • यदि यह सब काम नहीं करता है, तो यह जानने के लिए कि क्या यह बहुत अधिक है या बहुत कम है, सीखने की दर के साथ प्रयोग करें।

पी.एस.

मुझे लगता है कि आपको Adit Deshpande का यह ब्लॉगपोस्ट पसंद आएगा ।


मुझे बताएं कि क्या इन समाधानों ने आशावादी व्यवहार को बदल दिया है।
पीटर

धन्यवाद, यह बहुत उपयोगी है। मैं आपके सुझावों की कोशिश कर रहा हूं। हालाँकि, मैं आपके पहले बिंदु को नहीं समझता। मैं उलझन में हूं कि क्यों, यदि समस्या बहुत सरल है, तो अधिक जटिल समस्या की तुलना में अनुकूलन करना कठिन है। किसी दिए गए नेटवर्क के लिए, अधिक जटिल समस्या की तुलना में एक सरल समस्या को अनुकूलित करना कठिन क्यों होगा? एक साधारण समस्या में, मैंने सोचा होगा कि बहुत मजबूत ग्रेडिएंट और एक मजबूत वैश्विक इष्टतम होगा। लेकिन आपकी पहली बात कहती है कि समस्या की सरलता अनुकूलन को कठिन बनाती है, यह सुझाव देती है कि एक अधिक जटिल समस्या अनुकूलन में मदद करेगी ...
कर्निवास

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

> "मैं उलझन में हूं कि क्यों, यदि समस्या बहुत सरल है, तो अधिक जटिल समस्या की तुलना में अनुकूलन करना कठिन है।" क्योंकि एक जटिल मॉडल में मॉडलिंग की बहुत क्षमता होती है जो इसका उपयोग नहीं करता है। यह अधिकता शोर का परिचय देती है और वास्तविक संकेत को खोजने में कठिन बनाती है।
पीटर

> "मैं इन दोनों में से किसी को भी इस समस्या के कारण के रूप में नहीं खरीदता हूं" - जवाब को देखते हुए, वे एक अभ्यास बिंदु-से-दृश्य से लिखे गए हैं। यदि आपका जटिल मॉडल ठीक से नहीं बदलता है, तो डिबग करने के तरीकों में से एक सरल मॉडल का उपयोग करना है।
पीटर

0

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

हालाँकि, आउटपुट चर पर कुछ परिवर्तन इसके पैमाने को संशोधित करने या बदलने के लिए किए जा सकते हैं। इसके परिणामस्वरूप अधिक समान प्रकार का वितरण हो सकता है। उदाहरण के लिए, छवि पहचान कार्यों में हिस्टोग्राम समतुल्य या इसके विपरीत वृद्धि कभी-कभी सही निर्णय लेने के पक्ष में काम करती है।


-1

यह एक सामान्य ओवरफिटिंग समस्या की तरह दिखता है। आपका डेटा बेहतर परिणाम प्राप्त करने के लिए पर्याप्त जानकारी प्रदान नहीं करता है। ट्रेन डेटा की सभी बारीकियों को याद रखने के लिए आप अपने साथ जटिल एनएन का चयन करते हैं । हानि कभी भी शून्य नहीं हो सकती है, क्योंकि यह आपके ग्राफ पर है। BTW ऐसा लगता है कि आपके सत्यापन में बग है या सत्यापन सेट सत्यापन के लिए अच्छा नहीं है क्योंकि सत्यापन हानि भी शून्य हो रही है।


5
सवाल कहता है कि नेटवर्क लगभग हमेशा शून्य का उत्पादन करता है। यह ओवरफिटिंग नहीं बल्कि गंभीर अंडरफिटिंग का मामला होगा । सीखने की अवस्था में प्रशिक्षण और सत्यापन त्रुटि के बीच कोई अंतर नहीं है, यह दर्शाता है कि ओवरफ़िटिंग की समस्या नहीं है (त्रुटि शून्य नहीं है, स्केल लॉगरिदमिक है)
user20160

-1

मैं वास्तव में एक समान समस्या पर काम कर रहा था। मूल रूप से, मेरे पास एक सफेद पृष्ठभूमि पर डॉट्स का एक गुच्छा था और मैं एक एनएन को प्रशिक्षित कर रहा था जो पहले पृष्ठभूमि पर रखे गए डॉट को पहचानने के लिए था। जिस तरह से मुझे काम करने के लिए मिला वह सिर्फ एक पूरी तरह से जुड़ी हुई न्यूरॉन्स की परत (इसलिए 1-परत एनएन) का उपयोग करना था। उदाहरण के लिए, एक 100x100 छवि के लिए, मेरे पास 10,000 इनपुट न्यूरॉन्स (पिक्सेल) होंगे जो सीधे 2 आउटपुट न्यूरॉन्स (निर्देशांक) से जुड़े होंगे। PyTorch में, जब मैंने पिक्सेल मानों को एक टेंसर में परिवर्तित किया, तो यह मेरा डेटा स्वचालित रूप से सामान्य कर रहा था, मतलब घटाकर और मानक विचलन द्वारा विभाजित। सामान्य मशीन सीखने की समस्याओं में, यह ठीक है, लेकिन एक छवि के लिए नहीं जहां एक छवि में रंगीन पिक्सेल की संख्या में असमानता हो सकती है (यानी आपका जहां केवल कुछ सफेद पिक्सेल हैं)। इसलिए, मैंने सभी पिक्सेल तीव्रता मूल्यों को 255 से विभाजित करके सामान्य रूप से सामान्य किया (इसलिए वे अब सामान्य सामान्यीकरण तकनीक के बिना 0-1 की सीमा में हैं जो सभी तीव्रता के मूल्यों को एक सामान्य वितरण में फिट करने की कोशिश करता है)। फिर, मेरे पास अभी भी मुद्दे थे क्योंकि यह प्रशिक्षण सेट में पिक्सल के औसत समन्वय की भविष्यवाणी कर रहा था। इसलिए, मेरा समाधान सीखने की दर को बहुत अधिक निर्धारित करना था, जो लगभग सभी एमएल प्रशिक्षकों और ट्यूटोरियल के खिलाफ जाता है। 1e-3, 1e-4, 1e-5 का उपयोग करने के बजाय, जैसा कि ज्यादातर लोग कहते हैं, मैं स्टोकेस्टिक क्रमिक वंश के साथ 1 या 0.1 की सीखने की दर का उपयोग कर रहा था। इसने मेरे मुद्दों को तय किया और मेरे नेटवर्क ने आखिरकार मेरे प्रशिक्षण सेट को याद रखना सीख लिया। यह बहुत अच्छी तरह से सेट किए गए परीक्षण के लिए सामान्य नहीं करता है, लेकिन कम से कम यह कुछ हद तक काम करता है, जो आपके प्रश्न पर सुझाए गए अन्य सभी की तुलना में बेहतर समाधान है। अब सामान्य सामान्यीकरण तकनीक के बिना 0-1 की सीमा में फिर से एक सामान्य वितरण के लिए सभी तीव्रता मूल्यों को फिट करने की कोशिश करता है)। फिर, मेरे पास अभी भी मुद्दे थे क्योंकि यह प्रशिक्षण सेट में पिक्सल के औसत समन्वय की भविष्यवाणी कर रहा था। इसलिए, मेरा समाधान सीखने की दर को बहुत अधिक निर्धारित करना था, जो लगभग सभी एमएल प्रशिक्षकों और ट्यूटोरियल के खिलाफ जाता है। 1e-3, 1e-4, 1e-5 का उपयोग करने के बजाय, जैसा कि ज्यादातर लोग कहते हैं, मैं स्टोकेस्टिक क्रमिक वंश के साथ 1 या 0.1 की सीखने की दर का उपयोग कर रहा था। इसने मेरे मुद्दों को तय किया और मेरे नेटवर्क ने आखिरकार मेरे प्रशिक्षण सेट को याद रखना सीख लिया। यह बहुत अच्छी तरह से सेट किए गए परीक्षण के लिए सामान्य नहीं करता है, लेकिन कम से कम यह कुछ हद तक काम करता है, जो आपके प्रश्न पर सुझाए गए अन्य सभी की तुलना में बेहतर समाधान है। अब सामान्य सामान्यीकरण तकनीक के बिना 0-1 की सीमा में फिर से एक सामान्य वितरण के लिए सभी तीव्रता मूल्यों को फिट करने की कोशिश करता है)। फिर, मेरे पास अभी भी मुद्दे थे क्योंकि यह प्रशिक्षण सेट में पिक्सल के औसत समन्वय की भविष्यवाणी कर रहा था। इसलिए, मेरा समाधान सीखने की दर को बहुत अधिक निर्धारित करना था, जो लगभग सभी एमएल प्रशिक्षकों और ट्यूटोरियल के खिलाफ जाता है। 1e-3, 1e-4, 1e-5 का उपयोग करने के बजाय, जैसा कि ज्यादातर लोग कहते हैं, मैं स्टोकेस्टिक क्रमिक वंश के साथ 1 या 0.1 की सीखने की दर का उपयोग कर रहा था। इसने मेरे मुद्दों को तय किया और मेरे नेटवर्क ने आखिरकार मेरे प्रशिक्षण सेट को याद रखना सीख लिया। यह बहुत अच्छी तरह से सेट किए गए परीक्षण के लिए सामान्य नहीं करता है, लेकिन कम से कम यह कुछ हद तक काम करता है, जो आपके प्रश्न पर सुझाए गए अन्य सभी की तुलना में बेहतर समाधान है।

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