Deep Learning แบบฉบับสามัญชน EP 2 Optimization & Activation Function เรียนกันสบายๆสไตส์ชิลๆ

Source: Deep Learning on Medium


Go to the profile of Mr.P L

“without hard work, nothing grows but weeds”

บทความก่อนหน้าได้พูดถึงประวัติของ Neural network และก็ Optimization กับ Activation function แบบพื้นๆ (พื้นมากกกกกกกกกกก) ทีนี้บทความนี้ก็จะมาขยายความและพูดถึงความแตกต่างของแต่ละ Function หรือว่า Algorithm ว่าต่างกันอย่างไร และตอนนี้ตัวไหนบ้างที่เป็นที่นิยม

โดยในบทความนี้จะมีแต่การพูดถึงทฤษฏี โดยถ้าอยากลงแลปให้ไปที่บทความถัดไปได้เลย แต่ก็ต้องอ่านก่อนเพื่อที่จะได้เข้าใจว่าทำไมถึงต้องรู้จักกับ Optimize และ Activation เพื่อที่จะเลือกใช้ได้ถูกต้อง

Optimization Algorithm

คืออะไร ?

ปกติแล้วถ้าเราใช้ machine learning ตัวไหนก็ตาม มันคือการใช้หลักคณิตศาสตร์ในการแบ่งกลุ่ม ตาม training set ที่เราใช้ฝึกฝน เมื่อฝึกเสร็จแล้วก็จบ นำไปใช้งานได้เลยแต่ว่าใน Deep Learning เนี่ยระหว่างที่ฝึกฝนตัว neuron ก็จะปรับปรุงค่า error และ loss ได้ด้วย เพื่อให้ได้ค่าที่ดีที่สุด โดยจะต้องใช้สิ่งที่เรียกว่า Optimization โดยสิ่งนี้จะทำการเปลี่ยนแปลงค่า น้ำหนัก (Weight) และค่า Bias ที่เชื่อมกับ neuron นั้นเอง

มีกี่ประเภท

ตัว Optimization ถูกแบ่งออกมาเป็น 2 ประเภทได้แก่

  1. First Order Optimization Algorithms
  2. Second Order Optimization Algorithms

ประเภทแรกเราจะคุ้นเคยกันดีนั้นคือตระกูลของ Gradient ส่วนอีกประเภทจะถูกเรียกว่า Hessian ทำหน้าที่คล้ายกับแบบแรกแต่จะใช้ทรัพยากรเยอะกว่าเลยไม่ค่อยนิยมแต่แบบหลังจะทำงานได้ไวกว่าถ้าเรารู้จัก dataset และผลลัพธ์ของเราดีพอ

มี Optimization ตัวไหนบ้างที่นิยมและดัง

https://towardsdatascience.com/types-of-optimization-algorithms-used-in-neural-networks-and-ways-to-optimize-gradient-95ae5d39529f

Gradient Descent

ผมเคยเขียนอธิบายไว้บนความนี้แล้ว

ซึ่งข้างในผมได้อธิบายถึง GD เฉยๆ และ ยกตัวอย่างของ SGD ในกลางลู่เข้าศูนย์กลางไปแล้ว ลองย้อนกลับไปอ่านได้ครับ

ตระกูลย่อยๆของ Gradient Descent ประกอบด้วย

1. Stochastic gradient descent

Stochastic Gradient Descent(SGD) เป็นอัลกอริทึมที่อัพเดทค่าพารามิเตอร์ในทุกๆชุดข้อมูลฝึกฝน เป็นอัลกอริทึมที่ค่อนข้างไว อัพเดทแค่ครั้งเดียวต่อการเทรน 1 รอบ

θ=θ−η⋅∇J(θ;x(i);y(i)) , โดยที่ {x(i) ,y(i)} คือชุดข้อมูลฝึกฝน.

โดยในทุกๆครั้งที่มีการอัพเดท ค่าพารามิเตอร์ที่อัพเดทจะมีค่าความแปรปรวนสูงและส่งผลกับค่า Loss function แปรผันไปตาม different intensities โดยขั้นตอนเหล่านี้เป็นสิ่งที่ดีเพราะมันช่วยให้เราสามารถค้นพบค่าที่น้อยที่สุดได้ (ไปอยู่ใจกลางดาวได้นั้นเอง) แต่วิธีนี้มีปัญหาคือยิ่งเราลู่ลงต่ำเท่าไหร่ ค่าที่ได้ก็จะยิ่งแปรปรวนและซับซ้อนมากยิ่งขึ้น

ยิ่งอัพเดทค่ายิ่งแปรปรวนเยอะ ต่างจาก GD ที่ค่าวิ่งเข้าหาเป้าหมายแบบตรงๆเลย

2. Mini Batch Gradient Descent

ถูกพัฒนาขึ้นเพื่อหนีปัญหาของ Gradient Descent ทั้งหลายโดยการนำข้อดีของ Gradient Descent และ Stochastic Gradient Descent มารวมกันและสำหรับอัลกอริทึมนี้เราจะอัพเดทค่าเป็น “ชุด” โดยภายในชุดจะประกอบด้วยข้อมูลจำนวน n ข้อมูลนั้นเอง

เปรียบเทียบทั้ง 3 วิธี

Momentum

ในการปรับค่าในแต่ละครั้งของ SGD จะสร้างความแปรปรวนเกิดขึ้นมาก ทำให้ยากที่ลู่เข้าจุดที่ต่ำสุดได้ (best optimize) จึงได้มีอัลกอริทึมที่ชื่อว่า “Momentum” เกิดขึ้น ถูกคิดค้นเพื่อเร่งความเร็วในการ optimize ของ SGD โดยการให้ความสำคัญในการพุ่งไปยังทิศทางที่ใกล้จุดกลางมากที่สุดก่อนแล้วทำให้ทิศทางที่ไม่เกี่ยวข้องความสำคัญลดลง ทำให้เกิดทิศทางที่ “ถูกต้อง” เกิดขึ้น โดยเป็นการเพิ่ม fraction ‘γ’ เข้ามาในการ update ทิศทางในแต่ละครั้ง

V(t)=γV(t−1)+η∇J(θ).

และอัพเดทค่าพารามิเตอร์ด้วย θ=θ−V(t) .

ป.ล. ค่า γ นิยมตั้งไว้ที่ 0.9 หรือค่าที่ใกล้เคียงกัน.

Adagrad

เป็น Optimize ที่สามารถปรับค่าค่า Learning Rate ให้เหมาะสมกับพารามิเตอร์ได้ โดยจะมีการอัพเดทจำนวนมากสำหรับค่าพารามิเตอร์ที่มีจำนวนน้อย และอัพเดทไม่มากนักถ้าค่าพารามิเตอร์มีจำนวนมากและด้วยเหตุนี้ Optimizer ตัวนี้จึงเป็นที่นิยมสำหรับ Sparse data (ข้อมูลที่กระจัดกระจาย)

โดยค่า Learning Rate จะถูกเปลี่ยนทุกๆครั้งสำหรับพารามิเตอร์ θ (ทิศทางในการเคลื่อนที่) โดยอ้างอิงจากทิศทางที่ผ่านมาที่ผ่านการคำนวณจาก Gradient descent มาแล้ว

https://www.slideshare.net/ssuser77b8c6/an-overview-of-gradient-descent-optimization-algorithms

AdaDelta

เป็นตัวต่อยอดมาจาก AdaGrad โดยสามารถลบปัญหา decaying learning Rate ที่เกิดขึ้นใน AdaGrad ได้ โดยแทนที่จะเก็บสะสมการคำนวณทั้งหมดที่ผ่านมาของ Gradient แต่ AdaDelta จะถูกจำกัดการสะสมค่าการคำนวณของ Gradient ได้นั้นเองเพื่อแก้ขนาดค่าของ W ที่จะเกิดขึ้น

แทนที่จะเก็บค่า w ที่ได้รับการอัพเดทมาก่อนหน้านี้ที่ยังไม่เวิร์ค จึงเปลี่ยนเป็นการหาผลรวมของ gradients ทำแบบนี้ซ้ำๆไปเรื่อยๆ เพื่อการแก้ปัญหา decaying learning rate ของ gradients ที่ผ่านมาทั้งหมด

https://www.slideshare.net/ssuser77b8c6/an-overview-of-gradient-descent-optimization-algorithms

Adam

ชื่อยาวๆคือ Adaptive Moment Estimation เป็น optimizer ที่สามารถปรับ learning rates สำหรับพารามิเตอร์ในแต่ละครั้งได้และยังสามารถแก้ปัญหา decaying ของ gradients ในแต่ละสเต็ปที่ผ่านมาได้เหมือนกับ AdaDelta อีกทั้งยังอธิบายการเกิด decaying average ของ gradients M(t)ที่ผ่านมาได้อีกด้วย เหมือนกับ momentum

Adam เป็น optimizer ที่เป็นที่นิยมมากที่สุดเพราะรวมจุดเด่นของแต่ละ Optimizer แล้วลบจุดด้อยต่างๆออกไปทั้งการ decaying learning rate ของ adagrad ช่วยให้โมเดลไม่หยุดเรียนได้ อีกทั้งยังไวกว่า Gradient Descent และลดปัญหาการแกว่งของพารามิเตอร์ได้อีกด้วย

แต่ก็ยังสรุปไม่ได้ว่า Adam เป็นตัวที่ดีที่สุดเพราะในปัจจุบันมี optimizer ออกใหม่กันบ่อยมาก เราก็ต้องขยันอัพเดทและอ่าน paper อยู่สม่ำเสมอเพื่ออัพเดทให้ทันด้วย

Activation Function

คืออะไร

บล็อกที่ผมใช้อ้างอิงคือ towardsdatascience ได้เขียนอธิบายไว้อย่างสั้นและเข้าใจง่ายๆได้ว่า…..

Iit’s just a thing function that you use to get the output of node. It is also known as Transfer Function.

มันก็แค่ฟังก์ชั่นที่ใช้เพื่อหา output ของ node หรือรู้จักอีกชื่อว่า Transfer Function

สั้นไปไหน…..

ทำไมถึงต้องใช้ Activation Function ใน Neural Networks ?

ใช้ในการกำหนด output ของ Neural Network ว่าใช่หรือไม่ ? โดยการนำไป maps กับผลลัพธ์ตั้งแต่ 0 จนถึง 1 หรือ -1 จนถึง 1 ฯลฯ (ขึ้นอยู่กับฟังก์ชั่นที่เราเลือก)

Activation Functions แบ่งได้ 2 แบบ

1 ฟังก์ชั่นแบบเชิงเส้น

2 ฟังก์ชั่นแบบไม่ใช่เชิงเส้น

https://medium.com/@krishnakalyan3/introduction-to-exponential-linear-unit-d3e2904b366c

มีอะไรบ้าง

Linear Function

เป็นฟังก์ชั่นธรรมดา แค่ maps ค่าเข้ากับเส้น ไม่ได้มีความซับซ้อนอะไรจึงไม่เป็นที่นิยม

Sigmoid Function

หน้าต่างคุ้นๆมั้ย ?

เป็นฟังก์ชั่นที่ S curve สาเหตุที่เป็นที่นิยมเพราะค่า output ของมัน (0–1) ดังนั้นมันจึงเหมาะสมมากหากเราต้องการหาค่าความน่าจะเป็น (probability) ของ output โดยค่า prob จะมีตั้งแต่ 0 จนถึง 1 สำหรับรายละเอียดเพิ่มเติมผมเคยเขียนไว้ในบล็อกนี้แล้วลองกลับไปอ่านได้ครับ

แต่มันยังมีข้อเสียตรงที่ Sigmoid function อาจจะส่งผลให้ neural network ติดขัดได้ขณะเวลาที่เทรนโมเดล

ดังนั้น softmax function จึงใช้งานได้มากกว่า sigmoid function ในกรณีที่เราต้องการทำ multiclass classification นั้นเอง

Tanh OR Hyperbolic Tangent Function

S Curve เหมือนกัน แต่ output ต่างกัน ต้องสังเกตุดีๆ

หน้าตาของมันจะคล้ายกับ Sigmoid แต่ output ของมันคือ (-1 จนถึง 1) ซึ่ง sigmoid คือ (0 จนถึง 1)

จุดเด่นของฟังก์ชั่นนี้คือถ้าค่าที่ได้ออกมาเป็นค่าติดลบก็จะมีแนวโน้มไป maps กับค่าที่เป็นลบสูง โดยถ้าค่าเป็น 0 ก็จะมีแนวโน้มไป maps กับค่าใกล้ๆ 0 ในกราฟสูงมาก

tanh function ถูกนิยมนำไปใช้กับ classification ที่มี 2 คลาส

ReLU Function

เปรียบเทียบระหว่าง sigmoid และ ReLU

เป็นฟังก์ชั่นที่ได้รับความนิยมสูงสุดที่ในโลกขณะนี้ นิยมใช้ใน Convolutional Neural Network หรือ Deep Learning

ถ้าเราดูจากกราฟ ReLU จะมีแค่ครึ่งเดียว โดยที่ถ้าค่าต่ำกว่า 0 จะได้ output เป็น 0 โดยทันที หากค่ามากกว่าหรือเท่ากับ 0 ก็จะได้ output ที่มากกว่า 0 นั้นเอง

Range: [ 0 to infinity]

แต่ปัญหาของคือการแปลงค่าลบเป็น 0 ทั้งหมดนั้นจะลดความสามารถของโมเดลในการเทรนจากข้อมูล หมายความว่าไม่ว่าค่าจะเป็นค่าเท่าใดก็ตามหากติดลบแล้ว เข้าสู่ ReLU function ก็จะกลายเป็น 0 ทันที ทำให้ส่งกระทบว่ากราฟของเราไม่สามารถ map ค่าติดลบอะไรได้เลย

Leaky ReLU Function

ReLU vs Leaky ReLU

ถูกออกแบบมาเพื่อแก้ปัญหาของ ReLU นั้นคือการรั่ว (Leaky) นั้นเอง

การรั่วนี้จะช่วยเพิ่ม range ของ ReLU ออกไปกลายเป็น (-infinity ถึง infinity) นั้นเอง โดยการใช้ค่า a โดยค่า a จะเป็น 0.01 หากเมื่อใดก็ตามค่า a != 0.01 เราจะเรียกว่า Randomized ReLU

สรุป

จากบทความนี้เราจะได้รู้จักกับ Optimizer และ Activation Function ไปแล้ว ก็จะเห็นว่าตัวไหนดีกว่ากัน ตัวไหนน่าใช้ สถานการณ์ที่เหมาะสมกับ แต่มันยังมีอะไรที่ลึกกว่านี้อีกมาก เพราะสุดท้ายแล้วการเลือกใช้พวกนี้ก็ขึ้นอยู่กับ data ของเราอยู่ดี

โดยบทความนี้จะมีแต่ทฤษฏีทั้งหมดเพื่อบทความถัดไปโดยเฉพาะ ในบทความถัดไปเราจะลองแยกภาพหมาแมวแบบง่ายๆด้วย keras และลองทำการปรับ Optimization และ Activation เพื่อให้เห็นถึงความแตกต่างว่า ถ้าใช้ optimization แบบนี้กับแบบนี้จะเกิดอะไรขึ้น

บทความถัดไป

Deep Learning แบบสามัญชน EP 3 Keras with Image Classification : แยกภาพหมากับแมวแบบง่ายๆ

Github : https://github.com/peeratpop/Deep_learning_easy_style

Medium : https://medium.com/@pingloaf

facebook : https://www.facebook.com/nping.loaf

แหล่งอ้างอิง (REFERENCE)