TensorBoard (वजन) हिस्टोग्राम को समझना


120

TensorBoard में अदिश मानों को देखना और समझना वास्तव में सीधा है। हालांकि, यह स्पष्ट नहीं है कि हिस्टोग्राम ग्राफ को कैसे समझा जाए।

उदाहरण के लिए, वे मेरे नेटवर्क भार के हिस्टोग्राम हैं।

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

(सूर्यास्त के लिए बग धन्यवाद तय करने के बाद) इनकी यहां छवि विवरण दर्ज करें व्याख्या करने का सबसे अच्छा तरीका क्या है? परत 1 वजन ज्यादातर सपाट दिखता है, इसका क्या मतलब है?

मैंने यहां नेटवर्क कंस्ट्रक्शन कोड जोड़ा।

X = tf.placeholder(tf.float32, [None, input_size], name="input_x")
x_image = tf.reshape(X, [-1, 6, 10, 1])
tf.summary.image('input', x_image, 4)

# First layer of weights
with tf.name_scope("layer1"):
    W1 = tf.get_variable("W1", shape=[input_size, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer1 = tf.matmul(X, W1)
    layer1_act = tf.nn.tanh(layer1)
    tf.summary.histogram("weights", W1)
    tf.summary.histogram("layer", layer1)
    tf.summary.histogram("activations", layer1_act)

# Second layer of weights
with tf.name_scope("layer2"):
    W2 = tf.get_variable("W2", shape=[hidden_layer_neurons, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer2 = tf.matmul(layer1_act, W2)
    layer2_act = tf.nn.tanh(layer2)
    tf.summary.histogram("weights", W2)
    tf.summary.histogram("layer", layer2)
    tf.summary.histogram("activations", layer2_act)

# Third layer of weights
with tf.name_scope("layer3"):
    W3 = tf.get_variable("W3", shape=[hidden_layer_neurons, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer3 = tf.matmul(layer2_act, W3)
    layer3_act = tf.nn.tanh(layer3)

    tf.summary.histogram("weights", W3)
    tf.summary.histogram("layer", layer3)
    tf.summary.histogram("activations", layer3_act)

# Fourth layer of weights
with tf.name_scope("layer4"):
    W4 = tf.get_variable("W4", shape=[hidden_layer_neurons, output_size],
                         initializer=tf.contrib.layers.xavier_initializer())
    Qpred = tf.nn.softmax(tf.matmul(layer3_act, W4)) # Bug fixed: Qpred = tf.nn.softmax(tf.matmul(layer3, W4))
    tf.summary.histogram("weights", W4)
    tf.summary.histogram("Qpred", Qpred)

# We need to define the parts of the network needed for learning a policy
Y = tf.placeholder(tf.float32, [None, output_size], name="input_y")
advantages = tf.placeholder(tf.float32, name="reward_signal")

# Loss function
# Sum (Ai*logp(yi|xi))
log_lik = -Y * tf.log(Qpred)
loss = tf.reduce_mean(tf.reduce_sum(log_lik * advantages, axis=1))
tf.summary.scalar("Q", tf.reduce_mean(Qpred))
tf.summary.scalar("Y", tf.reduce_mean(Y))
tf.summary.scalar("log_likelihood", tf.reduce_mean(log_lik))
tf.summary.scalar("loss", loss)

# Learning
train = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)

4
मैंने अभी देखा कि आप अंतिम परत पर सक्रियण का उपयोग नहीं कर रहे हैं। आप शायद मतलब था tf.nn.softmax(tf.matmul(layer3_act, W4))
सूर्योदय

@sunside धन्यवाद। यह पता चलता है हिस्टोग्राम डिबगिंग के लिए भी बहुत उपयोगी है। मैंने pics अपडेट किया।
किम

1
@SungKim मैं एक संदर्भ के रूप में आपके कार्यान्वयन का उपयोग कर रहा हूं, लेकिन आप पूर्वाग्रह कैसे जोड़ते हैं? ऐशे ही? B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())और layer1_bias = tf.add(layer1, B1)औरtf.summary.histogram("bias", layer1_bias)
गर्ट Kommer

1
@SungKim अगर आपके पास अभी भी लॉग डायरेक्टरी है, तो क्या आप इसे अघी बोर्डों पर अपलोड कर सकते हैं ? एक इंटरैक्टिव डैशबोर्ड में हिस्टोग्राम को देखना बहुत अच्छा होगा
अगस्ट बिरो डिक

@SungKim को परिभाषित करके आप अपने कोड को ठीक कर लेंगे input_sizeताकि हम इसे चला सकें और परिणाम देखेंtensorboard
मारियो

जवाबों:


131

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

सामान्य तौर पर, हिस्टोग्राम एक दूसरे मूल्यों के सापेक्ष मूल्य की घटनाओं की संख्या प्रदर्शित करते हैं। सीधे शब्दों में, यदि संभव मान एक सीमा में हैं 0..9और आप 10मूल्य पर एक स्पाइक देखते हैं 0, तो इसका मतलब है कि 10 इनपुट मूल्य मान लेते हैं 0; इसके विपरीत, यदि हिस्टोग्राम 1सभी मूल्यों के लिए एक पठार दिखाता है 0..9, तो इसका मतलब है कि 10 आदानों के लिए, प्रत्येक संभव मूल्य बिल्कुल एक बार 0..9होता है । जब आप अपने कुल योग द्वारा सभी हिस्टोग्राम मूल्यों को सामान्य करते हैं, तो आप प्रायिकता के वितरण की कल्पना करने के लिए हिस्टोग्राम का भी उपयोग कर सकते हैं; यदि आप ऐसा करते हैं, तो आप सहजता से उस संभावना को प्राप्त करेंगे जिसके साथ एक निश्चित मान (एक्स अक्ष पर) अन्य इनपुट्स की तुलना में दिखाई देगा।

अब layer1/weights, पठार का अर्थ है:

  • अधिकांश वजन -0.15 से 0.15 की सीमा में हैं
  • यह (ज्यादातर) समान रूप से इन मूल्यों में से किसी के लिए एक वजन होने की संभावना है, यानी वे (लगभग) समान रूप से वितरित किए जाते हैं

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

इसकी तुलना में, layer1/activationsघंटी की वक्र (गाऊसी) जैसी आकृति बनाती है: मान इस मामले में एक विशिष्ट मूल्य के आसपास केंद्रित होते हैं 0, लेकिन वे इससे अधिक या छोटे भी हो सकते हैं (समान रूप से इसकी संभावना है, क्योंकि यह सममित है)। अधिकांश मान माध्य के आसपास दिखाई देते हैं 0, लेकिन मान किस सीमा तक -0.8होते हैं 0.8। मुझे लगता है कि layer1/activationsएक बैच में सभी परत आउटपुट पर वितरण के रूप में लिया जाता है। आप देख सकते हैं कि समय के साथ मूल्य बदलते हैं।

परत 4 हिस्टोग्राम मुझे कुछ विशिष्ट नहीं बताता है। आकार से, यह सिर्फ दिखा रहा है कि चारों ओर कुछ वजन मूल्य हैं -0.1, 0.05और 0.25एक उच्च संभावना के साथ घटित होते हैं; एक कारण यह हो सकता है कि वास्तव में प्रत्येक न्यूरॉन के अलग-अलग हिस्से समान जानकारी उठाते हैं और मूल रूप से बेमानी हैं। इसका मतलब यह हो सकता है कि आप वास्तव में एक छोटे नेटवर्क का उपयोग कर सकते हैं या आपके नेटवर्क में ओवरफिटिंग को रोकने के लिए अधिक विशिष्ट विशेषताओं को सीखने की क्षमता है। हालांकि ये सिर्फ धारणाएं हैं।

इसके अलावा, जैसा कि पहले ही नीचे टिप्पणी में कहा गया है, पूर्वाग्रह इकाइयों को जोड़ें। उन्हें छोड़ने से, आप अपने नेटवर्क को संभवतः अमान्य समाधान के लिए विवश कर रहे हैं।


5
पूर्वाग्रह न होना एक बहुत बुरा विचार हो सकता है - यह वास्तव में अंकों के एक (उच्च-आयामी) बादल के माध्यम से एक रेखा खींचने की कोशिश करने जैसा है, लेकिन मूल्य 0 से गुजरने के लिए मजबूर किया जा रहा है; यह काम कर सकता है, और आपको कुछ समाधान देगा, लेकिन संभावना है कि यह एक बुरा या बस गलत है।
सूरज

1
मैं आपको हिस्टोग्राम से बहुत दुख के साथ नहीं बता सकता। (हालांकि मेरा जवाब अपडेट किया गया है।)
सूरज

1
यह शायद अब थोड़ा सा प्रशिक्षित करना चाहिए। विशेष रूप से आपके पहले परिणामों को देखते हुए, layer4/Qpredऐसा लगता है कि यह बहुत बेहतर हो सकता है। वजन के लिए एक ही रहने के रूप में ... मुझे लगता है कि गड़बड़ है, लेकिन मैं अभी इसका मतलब नहीं कर सकता। हो सकता है कि यह वास्तव में सही वितरण है, लेकिन यह देखते हुए कि इसमें कोई बदलाव नहीं है, मुझे लगता है कि विश्वास करना मुश्किल है।
सूर्योदय

1
@ बायस के ऊपर नेटवर्क वेट को अपडेट करने को प्राथमिकता देने के लिए क्या कोई तरीका है? जैसा कि पूर्वाग्रह के साथ-साथ अंतिम परत भी सभी त्रुटि को चूसने लगती है। मैं एक ऐसा ही मुद्दा रख रहा हूं, जहां केवल पूर्वाग्रह अद्यतन हैं, और वजन हिस्टोग्राम अपेक्षाकृत अपरिवर्तित रहता है।
ममाफोकु

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