টেনসরবোর্ড (ওজন) হিস্টোগ্রামগুলি বোঝা


120

টেনসরবোর্ডে স্কেলারের মানগুলি বোঝা এবং বোঝা সত্যিই সোজা। তবে হিস্টোগ্রাফ গ্রাফগুলি কীভাবে বোঝা যায় তা পরিষ্কার নয়।

উদাহরণস্বরূপ, এগুলি আমার নেটওয়ার্ক ওজনের হিস্টোগ্রাম ogra

এখানে চিত্র বর্ণনা লিখুন

(সূর্যমুখী একটি বাগ সংশোধন করার পরে) এখানে চিত্র বর্ণনা লিখুন এগুলি ব্যাখ্যা করার সর্বোত্তম উপায় কী? স্তর 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))
সূর্যমুখী

@ সুনসাইড ধন্যবাদ দেখা যাচ্ছে হিস্টগ্রাম ডিবাগিংয়ের জন্যও খুব কার্যকর। আমি ছবিগুলি আপডেট করেছি।
সুং কিম

1
@ সুংকিম আমি আপনার প্রয়োগটিকে রেফারেন্স হিসাবে ব্যবহার করছি, তবে আপনি কীভাবে পক্ষপাতটি যুক্ত করবেন? এটার মত? 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)
গার্ট কমার

1
@ সুংকিম যদি আপনার এখনও লগ ডিরেক্টরি থাকে তবে আপনি কি এটি অজি বোর্ডগুলিতে আপলোড করতে পারবেন ? ইন্টারেক্টিভ ড্যাশবোর্ডে হিস্টোগ্রামগুলি দেখে ভাল লাগবে
আগস্ট বিরো

@ সুংকিম আপনি কি আপনার কোডটি সংজ্ঞায়িত করে ঠিক করবেন input_sizeযাতে আমরা এটি চালাতে পারি এবং এর ফলাফলটি দেখতে পারিtensorboard
মারিও

উত্তর:


131

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

সাধারণভাবে, হিস্টোগ্রামগুলি একে অপরের মানগুলির সাথে সম্পর্কিত কোনও মানের সংখ্যার সংখ্যা প্রদর্শন করে। সহজভাবে বলতে গেলে, যদি সম্ভাব্য মানগুলি একটি সীমার মধ্যে থাকে 0..9এবং আপনি 10মানটির উপরে একটি স্পাইক দেখতে পান 0, এর অর্থ হ'ল 10 ইনপুটগুলি মান ধরে 0; বিপরীতে, যদি হিস্টোগ্রামের 1সমস্ত মানের জন্য একটি মালভূমি দেখায় 0..9, এর অর্থ হ'ল 10 ইনপুটগুলির জন্য, প্রতিটি সম্ভাব্য মান ঠিক একবারে 0..9ঘটে । আপনি যখন হিস্টোগ্রামের মানগুলিকে মোট যোগফল দিয়ে স্বাভাবিক করেন তখন আপনি সম্ভাব্যতা বন্টনগুলিকে কল্পনা করতে হিস্টোগ্রামগুলিও ব্যবহার করতে পারেন; যদি আপনি এটি করেন তবে আপনি স্বজ্ঞাতভাবে একটি নির্দিষ্ট মান (x অক্ষের উপর) প্রদর্শিত হবে (অন্যান্য ইনপুটগুলির সাথে তুলনা করুন) অর্জন করবেন।

এখন জন্য 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একটি উচ্চ সম্ভাবনা সঙ্গে ঘটতে হতে থাকে; একটি কারণ হতে পারে, সেখানে প্রতিটি নিউরনের বিভিন্ন অংশ আসলে একই তথ্য গ্রহণ করে এবং মূলত অনর্থক red এর অর্থ এই হতে পারে যে আপনি প্রকৃতপক্ষে একটি ছোট নেটওয়ার্ক ব্যবহার করতে পারেন বা আপনার নেটওয়ার্ককে অতিরিক্ত মানসিক চাপ প্রতিরোধ করার জন্য আরও বিশিষ্ট বৈশিষ্ট্যগুলি শেখার সম্ভাবনা রয়েছে। এগুলি যদিও অনুমান মাত্র।

এছাড়াও, নীচের মন্তব্যে যেমন ইতিমধ্যে বলা হয়েছে, পক্ষপাত ইউনিট যুক্ত করুন। এগুলি ছেড়ে দিয়ে আপনি আপনার নেটওয়ার্কটিকে একটি সম্ভাব্য অবৈধ সমাধানে জোর করে সীমাবদ্ধ করছেন।


5
মোটেও পক্ষপাতিত্ব না রাখা খুব খারাপ ধারণা হতে পারে - এটি সত্যই (পয়েন্টের উচ্চতর মাত্রা) মেঘের মধ্য দিয়ে একটি লাইন আঁকতে চেষ্টা করার মতো, তবে মান 0 দিয়ে যেতে বাধ্য করা; এটি কার্যকর হতে পারে এবং আপনাকে কিছু সমাধান দেবে, তবে সম্ভাবনা এটি খুব খারাপ বা কেবল ভুল।
সূর্যমুখী

1
আমি হিস্টোগ্রাম থেকে দুঃখের সাথে অনেক কিছুই বলতে পারি না। (যদিও আমার উত্তর আপডেট করেছে))
সূর্যমুখী

1
এটি সম্ভবত এখন আরও দীর্ঘ প্রশিক্ষণ করা উচিত। বিশেষত আপনার প্রথম ফলাফল দেওয়া, layer4/Qpredদেখে মনে হচ্ছে এটি আরও ভাল হতে পারে। ওজন একই রকম থাকার জন্য ... আমি দেখতে পাই মাছ ধরা, কিন্তু আমি এখনই এটি বুঝতে পারি না। এটি সত্যিকারের সঠিক বিতরণ হতে পারে, তবে কোনও পরিবর্তন হয় নি বলে বিশ্বাস করা আমার পক্ষে কঠিন।
সূর্যমুখী

1
@ সুনসাইডে কোনও পক্ষপাতদুষ্ট নেটওয়ার্ক ওজন আপডেট করার অগ্রাধিকার দেওয়ার কী পদ্ধতি আছে? বায়াসগুলি পাশাপাশি শেষ স্তরটি সমস্ত ত্রুটি চুষতে পারে বলে মনে হয়। আমার একই ধরণের সমস্যা হচ্ছে যেখানে কেবলমাত্র পক্ষপাতিত্বই আপডেট করা হয়েছে এবং ওজন হিস্টগ্রাম অপেক্ষাকৃত অপরিবর্তিত রয়েছে।
মামাফোকু

2
অ্যাক্টিভেশন করার আগে ব্যাচের আদর্শ ব্যবহার করা হলে পক্ষপাত না করা ঠিক আছে
তোশা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.