The concept of Dropout in the deep neural net Vs Implementation.

Pisit Bee
Boobee
Published in
2 min readMay 8, 2019

สำหรับการ ทำ สร้าง Model หนึ่งที่สามารถทำไปใช้งานได้จริงนั้น หลายๆ คนคงต้องรู้จัก เทคนิค Drop out. Drop out เป็น เทคนิคหนึ่งที่ช่วยแก้ปัญหาไม่ให้ model นั้นเกิดปัญหา Overfitting เกินไป (สำหรับใครที่ยังไม่ทราบรายละเอียดติดไว้ก่อนนะครับ ) Overfitting พูดง่ายๆ คือ model จำข้อสอบแทนที่จะรู้จักการทำข้อสอบ เวลาไปเจอข้อสอบที่ไม่เคยทำก็ ไปไม่เป็น ประมาณนี้ละกัน

ดังนั้นจึงมีคนคิด เทคนิค Dropout มาช่วยแก้ปัญหานี้ขึ้น หลักการก็คือ ทำการ Random เพื่อที่จะ Drop node บาง node ที่อยู่ใน Neural Network(NN) เพื่อไม่ให้ node ใด node หนึ่งมีอิทธิพลมากเกินไป ก็คือ ช่วยๆ กัน เรียนรู้บ้าง โดยเราสามารถ ปรับได้ตั้งแต่ 0.1–1 ที่ไม่เอา 0 เพราะ ถ้า 0 คือ Drop ทิ้งหมดเลยแล้วจะเหลือใครทำงาน ?? ตัวอย่างเช่น ถ้าเรา Drop 60 % ก็คือ เหลือ Node ทำงานจริงๆ อยู่ 40% ดังภาพ

source : https://markojerkic.com/what-is-dropout-deep-learning/

จะสังเกตุว่า เวลา Train บางตัวถูกปิดทำงานได้จริงๆ 40% ดังนั้น model พยายามปรับ Weight เพื่อที่จะให้มันทำงานให้อยู่ในช่วง 0–1 เวลา Train Weight เหล่านี้ก็ พยายามดันตัวเองไปให้สามารถทำงานได้ ตอน Train

Dropout and testing

แล้วเวลาตอน Test ละ แน่นอน ตอน Test เราจะเปิด Node ทั้งหมด สำหรับการ Test หรือการทำไปใช้งานจริงๆ ดังนั้น node ทุกตัวก็จะส่ง แรง Weight มาให้เต็มกำลังของมัน (input * weight) จะเกิดอะไรขึ้นเมื่อทุกตัว ส่งมาให้ สรุป มันวิ่งทะลุเกิน 1 ออกไปครับ ซึ่งไม่ควร วิธีแก้ปัญหาก็คือ เวลา Test เราต้อง หาร แรง Weight ลงเท่ากับจำนวน ที่เราเคย drop ไปตอน Train จากตัวอย่างเรา Drop ไป 60 ก็หาร ด้วย 60

ปัญหาต่อมา อ่าวอย่างนี้เราก็ต้องทราบด้วยซิว่าเวลา Train เรา Drop ไปเท่าไร เราจะได้มา หารทิ้ง ตอน Test ใช่ครับ จริงๆ ก็ควร แต่มีวิธีที่ฉลาดกว่านั้น

Implementation with Dropout

สำหรับการ Implementation กับ Dropout เราไม่ได้ทำอย่าง Concept จริงๆ วิธีก็คือ เราทำการ คูณเป็นจำนวน 1.6 เท่าของที่มีอยู่ครับ งง ใช่ไหม ตัวอย่างเช่น สมมุติว่า Drop ไป 60% ดังนั้น node ที่เหลือ สมมุติว่า node นึ่งให้ค่า output ออกมา 0.78 จะต้องถูกเอาไปหาร กับ 0.4 กลายเป็น 1.95 ซึ่ง ตัว 0.4 เนี่ย ทำหน้าที่ชดเชยเพื่อน node ที่ถูก Drop ทิ้ง ก็เหมือนทำหน้าที่แทนเพื่อนที่หายไปครับ ส่วนตัวที่ ถูก Drop ไปจะให้ output เป็น 0 ไป

คราวนี้ ตอนเวลาที่เราจะทดสอบ เพื่อน node ที่หายไปจะมาครบ (เหมือนตอนสอบเลย ตอนเรียนไม่มา ต้องทำ lab ส่งให้แทน) ทีนี้ node แต่ละ node ก็ทำหน้าที่ของมันไป ไม่ต้อง คูณ หาร อะไรเพิ่มเพิ่ม ซึ่งสะดวกกับตอน Test มากครับ

คร่าวๆ สำหรับ Dropout ก็ประมาณนี้ ส่วน Code ลองเราไป Test ดูพฤติกรรมมันดูได้ครับด้านล่างเลย

ตัวอย่างผลการรัน ชุด 2 บรรทัดบน เป็น output จาก node ที่ยังไม่ถูก drop นะครับ ด้านล่างคือถูก drop ไปแล้ว สังเกตุ ลูกศรสีแดง จะเห็นว่า node นี้ถูก drop ออกไปเลยให้ output เป็น 0 ส่วน สีเขียว ไม่ได้ถูก drop แต่ค่าที่ออกมาไม่ใช่ตัวเดิม เพราะถูกหารด้วย 0.4 ตอน train ครับ 0.15123928 / 0.4 = 0.3780982

Code ตัวอย่าง

import tensorflow as tf
import numpy as np
tf.reset_default_graph()
xs = tf.placeholder(shape=[None, 10], dtype=tf.float32, name="Xinput")
fc1 = tf.layers.dense(inputs=xs,units=10,name="fc1")
drop_conv1 = tf.layers.dropout(fc1, rate=0.6, training=True) #rate is drop out rate
with tf.Session() as sess:
img_batch = np.ones(10)
img_batch = img_batch.reshape(-1, 10)
sess.run(tf.global_variables_initializer())
fc_val, drop_conv1 = sess.run([fc1, drop_conv1], feed_dict={xs: img_batch})
print(fc_val)
print(drop_conv1)

--

--