Notifications
Clear all

VSB Power Line Fault Detection — ตรวจสอบหาความผิดปกติบนสัญญาณไฟฟ้า 3 เฟส

12 ข้อความ
1 Users
1 Likes
10.6 K Views
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

ออกแบบระบบการวัดผล validation score ด้วย Stratified K-Folds (2)

ก่อนที่เราจะพูดถึง Stratified K-Folds เราควรพูดถึง Simple K-Folds ก่อน โดย Simple K-Folds เป็นวิธี validation ที่สามารถแก้ปัญหาข้อ (1) ที่ว่าเรามีจำนวน data น้อยเกินไปได้ (แต่ไม่ได้แก้ปัญหาข้อ (2) ที่เรามี very imbalance data)

วิธี Simple K-Folds จะแบ่งข้อมูลเป็น K ส่วน (เรียกว่า K folds) เท่าๆ กัน และจะใช้ K-1 folds ในการสอน และ 1 fold ในการทำ validation ซึ่งดูเผินๆ ก็เหมือนการทำ validation split ธรรมดาในกระทู้ข้างบน  แต่สังเกตว่าเราสามารถทำกระบวนการนี้ซ้ำได้ K ครั้ง โดยในแต่ละครั้ง fold ทดสอบเราก็จะไม่เหมือนเดิม ไล่จาก fold ที่ 1st ไปยัง fold ที่ Kth  และ folds สอนก็เป็น K-1 folds ที่เหลือ

นั่นคือด้วยวิธีการ Simple K-Folds นี้ เราสามารถทำ validation split ได้ K ครั้งนั่นเอง  และสังเกตว่าทุกๆ validation split จะไม่ซ้ำกันเลย และผลทดสอบทั้งหมด K ครั้งถ้าเราเอามารวมกันจะเท่ากับจำนวน Training Data พอดี  ดังนั้นการทำ Simple K-Folds นี้แม้เราจะเสียเวลาในกระบวนการสอนและทดสอบเพิ่ม K เท่าตัว แต่เราใช้ข้อมูลทั้้งหมดอย่างคุ้มค่า นั่นคือเราใช้ข้อมูล Training Data ทั้งหมดเป็น Validation Set ด้วย

เนื่องจากข้อมูลที่ใช้ทำ validation มีเยอะกว่าวิธี simple split ในกระทู้บน ผล Validation score ของ Simple K-Folds ก็จะมีความแม่นยำมากขึ้นกว่า simple split มากครับ

 

Simple K-Folds ยังไม่ดีพอ

อย่างไรก็ดีในกรณี VSB ซึ่งเรามีปัญหา Imbalance Data อยู่ด้วย, simple K-Folds อาจให้คำตอบที่พลาดได้ในบาง fold เช่น บาง fold อาจจะบังเอิญไม่มีข้อมูล class 1 อยู่เลย (เพราะ class 1 เดิมมีน้อยอยู่แล้ว และสุ่มมาไม่อยู่ใน fold นี้เลย) ทำให้ model ที่ทำ validate บน fold นี้จะได้ Score MCC ต่ำผิดปกติ

วิธี upgrade simple K-Folds ให้จัดการ imbalance data ได้ก็คือ Stratified K-Folds ครับ!!  ไอเดียของ stratified K-Folds จริงๆ แล้วง่ายมาก นั่นคือในการแบ่ง K-Folds นั้นแทนที่จะสุ่มข้อมูลอะไรก็ได้ตรงๆ เหมือน Simple K-Folds, วิธี stratified K-Folds จะสุ่มแบบการันตีว่าทุกๆ folds จะมีสัดส่วนของทุกๆ classes เท่าๆ กันด้วย ซึ่งอธิบายได้ในรูปด้านล่างครับ

โดยในภาพประกอบนี้สมมติ K=4  และเรามี Class ทั้งหมด 3 classes คือ A,B และ C โดยค่อนข้าง Imbalance โดย A มีสัดส่วนที่น้อยที่สุด และ C มีสัดส่วนที่เยอะทีสุด ตามภาพครับ ... ในการสุ่มตรงๆ ถ้าเราแบ่ง folds เป็น K folds เราอาจโชคร้ายว่าบาง fold อาจไม่มี Class A เลยก็เป็นได้

วิธีการ Stratified 4-Folds นี้การันตีว่าจะไม่มีปัญหานี้เกิดขึ้นด้วยการสุ่มแบ่ง Class A เป็น 4 ส่วนเท่าๆ กัน, แบ่ง Class B เป็น 4 ส่วนเท่าๆ กัน และ Class C เป็น 4 ส่วนเท่าๆ กันเช่นกันครับ

จากนั้นในการสร้าง Fold แต่ละ fold ก็จะสุ่มนำ 1/4 ของ Class A, B และ C มารวมกันทำให้การันตีว่าในการสุ่มแบ่ง 4 folds ตามกระบวนการนี้นั้น ทุกๆ fold จะมีสัดส่วนของ classes ทั้งหมดใกล้เคียงกับ training data ตั้งต้นครับ  

ทั้งนี้ดูวิธีการสุ่มแบ่ง validation set ในแต่ละ fold (K=4) ตามรูปข้างบนเลยครับ

This post was modified 5 years ago 4 times by The Neural Engineer

   
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

ไอเดียการเรียนรู้โมเดลด้วย Bidirectional LSTM

ในโพสต์ข้างบนเราได้เข้าใจ

(1) ที่มาที่ไปของปัญหา

(2) การ Formulate ปัญหาให้อยู่ในรูปของ Machine Classification

(3) มาตรวัดผล และการออกแบบกระบวนการวัดผลให้มีความแม่นยำทางสถิติ

(4) กระบวนการ Preprocess ข้อมูลเบื้องต้น

เพื่อนๆ สังเกตไหมครับว่า ในกระบวนการแก้ปัญหาต่างๆ ด้วย Deep Learning นี้เราต้องทำความเข้าใจปัญหา ออกแบบปัญหาให้อยู่ในรูปคณิตศาสตร์และออกแบบระบบทดสอบให้ดีก่อนที่จะคิดเรื่องการสร้าง Deep Learning Model ถ้ากระบวนการดังกล่าวเรียบร้อยดีแล้ว การสร้างโมเดลก็จะทำได้ง่ายขึ้นมากครับ

ในที่นี้เราจะทำนายว่าสัญญาณไฟฟ้ามาจากสายไฟที่เริ่มมีปัญหาหรือไม่ (class 1) ด้วยโมเดล LSTM ครับ โดย Model LSTM นั้นเป็น Sequential Model ที่มี Input / Output ที่อาจมองอย่างง่ายๆ ดังนี้

Input : Sequence of Vectors --> { LSTM with SoftMax } -->  Output : Prediction [0 หรือ 1]

สังเกตว่า LSTM ต้องการ input เป็น "ลำดับ" (Sequence) ของ vector ในทางคณิตศาสตร์ ดังนั้นเราต้องแปลงข้อมูลสัญญาณไฟเราให้อยู่ในรูปนี้ก่อนครับ ... จริงๆ แล้วใน 1 example, ข้อมูลสัญญาณไฟ 3 เฟส (แต่ละเฟสมีค่า voltage ที่วัดมา 8แสนค่า) ที่เรามี เราอาจมองเป็น Sequence of Vectors ขนาด (800,000 x 3) ได้เลย โดยไม่ต้องทำอะไร

อย่างไรก็ดีในกรณีนี้ข้อมูลต่อ 1 example อาจจะมีขนาดใหญ่เกินไป และข้อมูลทั้งหมดทำให้หน่วยความจำของ GPU ไม่เพียงพอในการเรียนรู้ ดังนั้นเราจะใช้วิธี Sliding Windows ในการแปลงข้อมูลให้เล็กลงครับ

ไอเดียของ Sliding Windows อาจแสดงได้ง่ายๆ ดังภาพข้างล่าง โดยเราจะกำหนดขนาดของ Window ขึ้นมา (ในที่นี้เพื่อความง่ายให้ขนาดของ window = 1% ของความยาวสัญญาณ = 8,000 หน่วยวัด) และสกัด Features ต่างๆ จำนวน D features ออกมาจากข้อมูลใน window นี้ครับ โดย Features ต่างๆ อาจจะเป็นค่าทางสถิติที่สำคัญของ Signal ใน window นั้นๆ เช่น mean, sigma, percentile ต่างๆ หรือใครจะ creative วัดค่าที่ซับซ้อนขึ้นเช่น Entropy ของ window นี้ก็ได้ครับ (รายละเอียดการทำจริงดูได้ใน Workshop Notebook ตามลิงก์ข้างล่าง)

This post was modified 5 years ago 4 times by The Neural Engineer

   
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  
ไอเดียการเรียนรู้โมเดลด้วย Bidirectional LSTM (2)
 
จากนั้น เราก็จะสกัดเวกเตอร์ขนาด D นี้ในทุกๆ windows ซึ่งจากตัวอย่างนี้เรากำหนดขนาดของ windows เท่ากับ 1% ดังนั้นเราก็จะมีเวกเตอร์ D นี้จำนวน 100 เวกเตอร์ครับ ซึ่งก็ทำให้เราได้ Sequence of 100 vectors เป็น input ของ LSTM ตามที่เราต้องการแล้วครับ!!
 
 
เมื่อนำ Sequence of Vectors นี้ใส่เข้าไปใน LSTM เราก็จะสร้างกระบวนการเรียนรู้โมเดล (ปรับจูน parameters ของโมเดล) ได้ตามที่ต้องการครับ โดยเนืื่องจากปัญหานี้เป็นปัญหา Binary Classification เราสามารถใช้ Cross Entropy Loss เพื่อทำการ Backpropagation หา parameters ที่ดีได้ครับ (เสต็ปนี้ใช้ Keras เพียง 1 บรรทัด 🙂
 
สังเกตว่า Sequence of Vectors นั้นเราอาจมองเป็น matrix ขนาด (100 x D) ได้ ในบริบทของ Neural Networks เราจะเรียกว่าเป็น Tensor 2D หรือ Tensor 2มิติครับ
และในทางปฏิบ้ัติ Keras จะรับ Batch ของหลายๆ สัญญาณไฟพร้อมๆ กันทำให้เราต้องเตรียม Input Data ให้อยู่ในรูป Tensor 3D ครับ โดยมิติก็จะเป็น (2904 x 100 x D) ครับ ซึ่งก็ตรงไปตรงมาเพราะเรามี 2904 examples, แต่ละ example มี 100 time-step และ แต่ละ time-step เป็น vector ใน D มิิติตามกระทู้บน
 
ขั้นตอนอย่างละเอียด step-by-step สามารถดูได้ใน Workshop Notebook ครับ

   
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

การรวม Prediction จาก K-Folds ด้วย Ensemble

เนื่องจากว่าเราออกแบบการทดสอบระบบด้วย K-Folds ใช่ไหมครับ ดังนั้นเราก็จะมีโมเดลทั้งหมด K Models ที่เราได้ฝึกสอนไว้ตามจำนวน folds, ในการทำนายจริง ถ้าเราจะเลือกเพียงโมเดลเดียวมาทำนาย ก็จะทำให้เสียคุณค่าของโมเดลอื่นๆ ไปฟรีๆ  ดังนั้นวิธีการที่ง่ายและได้ผลดีก็คือ "รวมคำทำนายของทั้ง K models" เข้าด้วยกันครับ วิธีนี้เรียกว่า "K-Fold Ensemble" (คล้ายๆ Avenger Assemble :p ) ซึ่งแสดงในรูปด้านล่างครับ  โดยวิธีการรวมคำทายอาจมีตั้งแต่ง่ายๆ คือเอา ค่าความน่าจะเป็นของทุกโมเดลมาเฉลี่ยกัน หรือวิธีที่ซับซ้อนมากขึ้นคือพยายามหา weights ตามความแม่นยำของแต่ละโมเดล

สำหรับเนื้อหาของปัญหา VSB หรือ ปัญหาตรวจสอบหาความผิดปกติบนสัญญาณไฟฟ้า 3 เฟส ด้วย Deep Learning model ก็อธิบายภาพรวมหมดแล้วครับ เพื่อนๆ ที่พร้อมจะลุยแก้ปัญหาจริงแล้วก็ขอเชิญเข้าไปที่ workshop ได้เลยครับ หรือถ้าผมอธิบายอะไรตกหล่นหรือมีข้อสงสัยตรงไหน เพื่อนๆ สามารถโพสต์ถามในกระทู้นี้หรือใน workshop ได้เลยครับผม


   
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

ถ้าเพื่อนๆ พร้อมแล้วสามารถเข้าไปทำ Workshop ของปัญหา VSB ได้ที่นี่เลยครับ

https://www.kaggle.com/ratthachat/workshop-lstm


   
ตอบกลับอ้างอิง
Page 2 / 2
Share: