ทำความเข้าใจกับ TensorBoard (น้ำหนัก) ฮิสโทแกรม


120

การดูและทำความเข้าใจค่าสเกลาร์ใน TensorBoard นั้นตรงไปตรงมามาก อย่างไรก็ตามยังไม่มีความชัดเจนในการทำความเข้าใจกราฟฮิสโตแกรม

ตัวอย่างเช่นเป็นฮิสโทแกรมของน้ำหนักเครือข่ายของฉัน

ใส่คำอธิบายภาพที่นี่

(หลังจากแก้ไขข้อผิดพลาดแล้วด้วย sunside) ใส่คำอธิบายภาพที่นี่ วิธีที่ดีที่สุดในการตีความสิ่งเหล่านี้คืออะไร? น้ำหนักของเลเยอร์ 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 ขอบคุณ ปรากฎว่าฮิสโตแกรมมีประโยชน์มากสำหรับการดีบักเช่นกัน ฉันอัปเดตรูปภาพ
Sung Kim

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)
Gert Kommer

1
@SungKim ถ้าคุณยังมีไดเรกทอรีบันทึกคุณสามารถอัปโหลดไปยังAughie Boards ได้ไหม จะเป็นการดีที่จะได้เห็นฮิสโตแกรมในแดชบอร์ดแบบโต้ตอบ
Agost Biro

@SungKim คุณจะแก้ไขรหัสของคุณโดยกำหนดinput_sizeเพื่อให้เราสามารถเรียกใช้และดูผลลัพธ์ในtensorboard
Mario

คำตอบ:


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มีแนวโน้มที่จะเกิดขึ้นกับความน่าจะเป็นสูงกว่า; เหตุผลอาจจะเป็นไปได้ว่าบางส่วนที่แตกต่างกันของแต่ละเซลล์ประสาทมีจริงรับข้อมูลเดียวกันและมีพื้นซ้ำซ้อน ซึ่งอาจหมายความว่าคุณสามารถใช้เครือข่ายขนาดเล็กหรือเครือข่ายของคุณมีศักยภาพที่จะเรียนรู้คุณสมบัติที่แตกต่างเพิ่มเติมเพื่อป้องกันการติดตั้งมากเกินไป นี่เป็นเพียงข้อสันนิษฐานเท่านั้น

นอกจากนี้ตามที่ระบุไว้แล้วในความคิดเห็นด้านล่างให้เพิ่มหน่วยอคติ การปล่อยให้พวกเขาออกไปแสดงว่าคุณกำลังบังคับเครือข่ายของคุณอย่างเข้มงวดเพื่อเป็นวิธีการแก้ปัญหาที่ไม่ถูกต้อง


5
การไม่มีอคติเลยอาจเป็นความคิดที่แย่มาก - มันเหมือนกับการพยายามลากเส้นผ่านจุด (มิติสูง) แต่ถูกบังคับให้ผ่านค่า 0 มันอาจจะทำงานและจะให้คุณบางวิธีการแก้ปัญหา แต่โอกาสที่มันจะไม่ดีหรือผิดเพียงอย่างใดอย่างหนึ่ง
อาบแดด

1
ฉันไม่สามารถบอกอะไรคุณได้มากนักจากฮิสโตแกรมน่าเศร้า (อัปเดตคำตอบของฉันแล้ว)
sunside

1
ตอนนี้น่าจะฝึกได้นานกว่านี้หน่อย โดยเฉพาะอย่างยิ่งสำหรับผลลัพธ์แรกของคุณlayer4/Qpredดูเหมือนว่ามันจะดีขึ้นมาก สำหรับน้ำหนักยังคงเหมือนเดิม ... ฉันรู้สึกว่ามันคาว แต่ตอนนี้ฉันไม่สามารถเข้าใจได้ อาจเป็นไปได้ว่าเป็นการกระจายที่ถูกต้อง แต่เนื่องจากไม่มีการเปลี่ยนแปลงใด ๆ เลยฉันพบว่ามันยากที่จะเชื่อ
อาบแดด

1
@sunside มีวิธีใดในการจัดลำดับความสำคัญของการอัปเดตน้ำหนักเครือข่ายเหนืออคติหรือไม่? เนื่องจากอคติและเลเยอร์สุดท้ายดูเหมือนจะดูดข้อผิดพลาดทั้งหมด ฉันมีปัญหาที่คล้ายกันซึ่งมีการอัปเดตเฉพาะอคติและฮิสโตแกรมน้ำหนักยังคงไม่เปลี่ยนแปลง
mamafoku

2
การไม่มีอคติก็โอเคถ้าใช้ batch norm ก่อนเปิดใช้งาน
Tosha
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.