python सुधारित रैखिक इकाइयों के साथ बैकप्रोपेगेशन



numpy neural-network (1)

यद्यपि मैंने समस्या के स्रोत को निर्धारित किया है, मैं इसे छोड़ने के लिए जा रहा हूँ यदि यह किसी और को लाभ हो सकता है

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

मैं वर्तमान में एमएनआईएसटी डाटासेट पर -5 से .5 तक समान रूप से वितरित प्रारंभिक वजन का उपयोग कर रहा हूं और यह बहुत तेज़ी से सीख रहा है।

मैंने एक गहन तंत्रिका नेटवर्क में पश्चप्रक्रिया सक्रियण फ़ंक्शन और सॉफ्टमैक्स आउटपुट के साथ बैकप्रोपेगेशन को लागू करने के लिए कुछ कोड लिखा है।

def backprop_deep(node_values, targets, weight_matrices):
    delta_nodes = node_values[-1] - targets
    delta_weights = delta_nodes.T.dot(node_values[-2])
    weight_updates = [delta_weights]
    for i in xrange(-2, -len(weight_matrices)- 1, -1):
        delta_nodes = dsigmoid(node_values[i][:,:-1]) * delta_nodes.dot(weight_matrices[i+1])[:,:-1]
        delta_weights = delta_nodes.T.dot(node_values[i-1])
        weight_updates.insert(0, delta_weights)
    return weight_updates

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

def backprop_relu(node_values, targets, weight_matrices):
    delta_nodes = node_values[-1] - targets
    delta_weights = delta_nodes.T.dot(node_values[-2])
    weight_updates = [delta_weights]
    for i in xrange(-2, -len(weight_matrices)- 1, -1):
        delta_nodes = (node_values[i]>0)[:,:-1] * delta_nodes.dot(weight_matrices[i+1])[:,:-1]
        delta_weights = delta_nodes.T.dot(node_values[i-1])
        weight_updates.insert(0, delta_weights)
    return weight_updates

हालांकि, नेटवर्क अब सीखता नहीं है, और वजन जल्दी शून्य पर जाते हैं और वहां रहने के लिए। मैं पूरी तरह से स्टम्प्ड हूं





backpropagation