Google Machine Learning Crash Course ภาษาไทย

เรียนพื้นฐาน Machine Learning (Python/ R programming) ต่อยอดจากหลักสูตร ML Crash Course โดย Google แอดสรุปมาเป็นภาษาไทย (อย่างไม่เป็นทางการ)

  • ใช้เวลาเรียนประมาณ 15 ชั่วโมง (ตามหลักสูตรต้นฉบับ)
  • สำหรับนักเรียนที่อยากรันโค้ด Python จะมีตัวอย่างใน Google Colab ตามหลักสูตรในคอร์สต้นฉบับ
  • สำหรับนักเรียนที่อยากรันโค้ด R ต้องติดตั้งโปรแกรม R และ RStudio Desktop เพื่อทำตามบทเรียนในหลักสูตรนี้
  • ⭐️ หน้าเว็บไซต์นี้แอดออกแบบมาสำหรับการแสดงผลที่ดีบนคอมพิวเตอร์ (เรียนบนคอมจะสนุกกว่านะคร้าบ)

Lessons

  • Introduction to ML
  • Framing
  • Descending to ML
  • Linear Regression in R
  • Reducing Loss
  • First Step with TF (Keras)
  • Generalization
  • Training and Test Sets
  • Validation Set
  • Representation
  • Feature Crosses
  • Regularization Simplicity
  • Logistic Regression
  • Classification
  • Regularization Sparsity
  • Neural Networks
  • Training Neural Nets
  • Multiclass Neural Nets
  • Embeddings

Useful Links

Last Update

4 มีนาคม 2563

1. Introduction to ML

แนะนำคอร์สเรียน ML Crash Course โดยปีเตอร์ นอร์วิก

Transcript – ยินดีต้อนรับนักเรียนทุกคนเข้าสู่คอร์สออนไลน์ machine learning crash course ผมชื่อ Peter Norvig ปี 2001 ผมมีโอกาสได้ร่วมงานกับ Google ตำแหน่งของผมตอนนั้นคือ “Director of Machine Learning” ผมรู้ว่า ML จะเป็นเครื่องมือที่มีความสำคัญที่จะช่วยวิศวกรที่ Google และบริษัทต่างๆทั่วโลกเข้าใจข้อมูลมากขึ้น make sense of their data

เวลานั้นผมก็ไม่คิดว่า ML มันจะเติบโตและพัฒนาได้มากขนาดนี้ มีความต้องการวิศวกรในสายงานนี้ “ML engineer” อย่างมากในปัจจุบัน คอร์สเรียนนี้ออกแบบมาเพื่อให้นักเรียนได้ฝึกฝนทักษะที่จำเป็นเกี่ยวกับ machine learning ประโยชน์ที่ได้จากการศึกษา ML ในคอร์สนี้มีสามอย่าง

Peter Norvig ปัจจุบันเป็น director of research ของ Google เป็นผู้เขียนตำราเรียน Artificial Intelligence: A Modern Approach ร่วมกับ Stuart Russell

ข้อแรก ML จะช่วยลดเวลาในการเขียนโปรแกรม ถ้าวันนี้เราอยากจะเขียนโปรแกรมเพื่อแก้คำผิด (spelling errors) เราอาจจะต้องเขียนกฎและตัวอย่างมากมาย (if-else, rules of thumb) เราอาจต้องใช้เวลาเขียนโปรแกรมหลายสัปดาห์เพื่อให้ได้โปรแกรมที่ทำงานได้โอเคร หรือเราจะเลือกใช้ off-the-shelf ML algorithm (พวก library ต่างๆ เช่น TensorFlow, PyTorch เป็นต้น) เรียนรู้จากข้อมูล/ตัวอย่างที่เราเตรียมไว้ และได้โปรแกรมที่สามารถทำงานได้โอเครเหมือนกัน “reliable program” ภายในเวลาไม่กี่ชั่วโมง

ข้อสอง ML ช่วยให้เราปรับปรุงสินค้าและบริการได้ดียิ่งขึ้นสำหรับกลุ่มลูกค้าของเรา ตัวอย่างเช่น ถ้าเราสร้างโปรแกรมแก้คำผิดภาษาอังกฤษโดยเขียนโค้ดเองทั้งหมดเลย (hard code by hand) โปรแกรมนี้ประสบความสำเร็จมาก และเราต้องการจะต่อยอดโปรแกรมนี้ไปสู่ภาษาอื่นๆอีก 100 ภาษา เราต้องเขียนโค้ดใหม่เองทั้งหมดเลยสำหรับแต่ละภาษา กว่าจะเสร็จคงใช้เวลาหลายปี แต่ถ้าวันนี้เราประยุกต์ใช้ ML สิ่งที่เราต้องทำคือการเก็บข้อมูลของแต่ละภาษา และป้อนข้อมูลเข้าสู่โมเดล (เป้าหมายคือเรียนรู้และแก้คำผิดของแต่ละภาษา)

และข้อที่สาม ML ช่วยให้เราแก้ปัญหาที่ตัวเราในฐานะโปรแกรมเมอร์ ก็ไม่รู้ว่าจะเขียนโค้ดยังไง “have no idea how to do by hand” ตัวอย่างเช่น ผมจำหน้าเพื่อนๆของผมได้ทุกคนเลย การจดจำใบหน้ามนุษย์และการเข้าใจภาษา natural language เกิดขึ้นในระดับจิตใต้สำนึก “subconsciously” โดยที่เราไม่ต้องใช้ความพยายามเยอะ ถ้าวันนี้เราต้องเขียนโปรแกรมคอมพิวเตอร์ด้วยมือ โค้ดของเราต้องยุ่งเหยิงมากแน่ๆ (ในปัจจุบันไม่มีใครเขียนโค้ดวิเคราะห์ใบหน้าและภาษาธรรมชาติด้วยวิธี hard code by hand) แต่งานเหล่านี้คืองานที่ machine learning สามารถทำได้ดี และดีขึ้นเรื่อยๆในปัจจุบัน

ผมไม่ต้องบอกโปรแกรมว่ามันต้องทำอะไร แค่ให้มันเห็นตัวอย่างเยอะๆ และโปรแกรม ML จะเรียนรู้ด้วยตัวของมันเอง “the task can be solved” นอกจากเหตุผลสามข้อที่ผมเพิ่งอธิบายไป ยังมีเรื่องของปรัชญาอีกด้วย ML ช่วยเปลี่ยนวิธีการที่มนุษย์คิดเกี่ยวกับปัญหาหนึ่งๆ วิศวกรที่ออกแบบซอฟต์แวร์ถูกสอนมาให้ใช้คณิตศาสตร์และคิดแบบมีตรรกะเพื่อทดสอบโปรแกรมที่เราสร้างขึ้นมา แต่เมื่อพูดถึง ML มุมมองของเราเปลี่ยนจากการใช้ mathematical science ไปเป็น natural science เราศึกษาดูตัวอย่างจากโลกที่เต็มไปด้วยความไม่แน่นอน ออกแบบการทดลอง และใช้สถิติ (ไม่ใช่ตรรกะแบบเก่า) เพื่อวิเคราะห์ข้อมูลจากการทดลองต่างๆ

ความสามารถในการคิดอย่างนักวิทยาศาสตร์ (และใช้ ML) จะช่วยเปิดโอกาสให้กับพวกเราได้ค้นหาความรู้ใหม่ๆ ขอให้ทุกคนสนุกกับการเดินทางครั้งนี้ และมีความสุขกับการเรียน happy exploring!

Optional Reading
  • อ่านเพิ่มเติมเรื่อง Rules of Machine Learning ได้ที่นี่
  • ดูวีดีโอแนะนำคอร์สเรียนของ Peter Norvig ได้ที่นี่

2. Framing

Photo by Tae Fuller on Pexels.com

บทที่สองจะเป็นการปูพื้นฐานคำศัพท์ที่นักเรียนควรรู้เกี่ยวกับ machine learning โดยมีวีดีโอสั้นๆอธิบายโดย D. Sculley นักวิจัยของ Google โดยโฟกัสของคอร์สนี้จะเน้นที่ supervised learning เป็นหลัก (i.e. ทำ predictions สำหรับ unlabeled data)

ML systems เรียนรู้ที่จะผสมผสาน input ต่างๆในโมเดลเพื่อทำนายผล label ข้อมูลใหม่ที่เราไม่เคยเห็นมาก่อน – D. Sculley

คำศัพท์ที่ทุกคนต้องรู้จัก
  • Labels คือตัวแปรตามที่เราต้องการทำนายหรือในหนังสือเราใช้ตัวย่อว่า y
  • Features คือตัวแปรต้นหรือ input variables โมเดล ML ง่ายๆอาจจะใช้แค่หนึ่งฟีเจอร์ หรือโมเดลที่ซับซ้อนมากๆอาจใช้เป็นล้านๆฟีเจอร์เลยก็ได้ ในหนังสือเราใช้ตัวย่อว่า x
  • Examples คือข้อมูลแต่ละแถวหรือ observations ใน dataset ของเรา ในคอร์สเรียนของ Google ใช้ตัวย่อเป็น x (bold face ตัวหนา) แทนการเขียนเวคเตอร์
  • Models คือสมการคณิตศาสตร์ (หรือไม่ได้อยู่ในรูปแบบสมการก็ได้) ที่ใช้แสดงความสัมพันธ์ของ features และ label โดยเราสามารถแบ่งออกเป็นสอง phases
    • Training คือขั้นตอนการสร้าง หรือเรียนรู้ learn from data
    • Inference คือการนำโมเดลที่เทรนเสร็จแล้วไปทำนายผลข้อมูลใหม่หรือ unlabeled examples (จำง่ายๆว่า inference = prediction ก็ได้)

มาลองดูตัวอย่างการทำนายราคาบ้านในรัฐแคลิฟอร์เนีย ประเทศอเมริกาด้านล่าง ข้อมูลชุดนี้มีทั้งหมด 5 ตัวอย่าง โดยที่สามคอลัมน์แรก [housingMedianAge, totalRooms, totalBedrooms] คือ features และคอลัมน์ที่สี่ [medianHouseValue] คือ label ที่เราต้องการทำนาย

ตัวอย่างข้อมูล labeled examples สำหรับเทรนโมเดล ที่มา – Google

ML อีกนิยามหนึ่งคือการทำ function approximation หรือเขียนเป็นสมการง่ายๆแบบนี้ y = f(x) สิ่งที่ machine learning ทำคือการหา f หรือฟังก์ชันที่ map values ของ x ได้ใกล้เคียงกับ y มากที่สุด

เราสามารถเทรนโมเดลด้วย 5 ตัวอย่างด้านบน เสร็จแล้วใช้โมเดลที่ได้มาทำนาย 3 ตัวอย่างใหม่ด้านล่าง สังเกตว่าข้อมูลใหม่จะมีแค่คอลัมน์ features ไม่มีคอลัมน์ label เราเรียกข้อมูลนี้ว่า unlabeled examples

ตัวอย่างข้อมูล unlabeled examples สำหรับทำนาย ที่มา – Google
ความแตกต่างระหว่าง Regression vs. Classification

Supervised learning สามารถแบ่งเป็นสองประเภทใหญ่ๆ (สังเกตง่ายๆจากตัวแปร label ที่เราต้องการทำนาย)

  • Regression ใช้ทำนาย continuous values เช่น ราคาบ้านในตัวอย่างด้านบน
  • Classification ใช้ทำนาย discrete values เช่น อีเมลเป็น spam หรือเปล่า? ใช่/ ไม่ใช่
แบบทดสอบความเข้าใจ

บทเรียนของ Google จะมี quiz สั้นๆเพื่อทดสอบความเข้าใจด้วย จงเลือกคำตอบที่ถูกต้องด้านล่าง

Q1. สมมติวันนี้เราต้องการสร้างโมเดล supervised machine learning เพื่อทำนายอีเมลแบบ spam หรือ not spam ข้อความใดต่อไปนี้ถูกต้อง (เลือกได้มากกว่าหนึ่งคำตอบ)
ข้อมูลอีเมล์ที่ไม่ได้ถูก marked ว่าเป็น spam หรือ not spam เรียกว่า unlabeled examples
ข้อความใน subject header หรือชื่ออีเมลน่าจะเป็น label ที่ดี
เราใช้ unlabeled examples ในการเทรนโมเดล
Label ของข้อมูลบางตัวอย่างอาจจะไม่ถูกต้องหรือ unreliable

Q2. สมมติวันนี้เราต้องการสร้าง personalized shoe recommendation แนะนำรองเท้าคู่ที่เหมาะสมสำหรับลูกค้าแต่ละคน ข้อความใดต่อไปนี้ถูกต้อง (เลือกได้มากกว่าหนึ่งคำตอบ)
“ขนาดรองเท้า” เป็นฟีเจอร์ที่น่าจะเป็นประโยชน์ในการสร้างโมเดล
รองเท้าที่ลูกค้าชอบ (user adores) เป็นฟีเจอร์ที่มีประโยชน์มากๆ
ความสวยงามของรองเท้า เป็นฟีเจอร์ที่น่าจะเป็นประโยชน์
Log ที่เก็บข้อมูลว่าลูกค้ากดอ่านรายละเอียดของรองเท้าหรือเปล่า

3. Descending to ML

วีดีโอสอน Linear Regression โดย D. Sculley ที่มา Google

บทที่สาม D. Sculley อธิบายทฤษฎี linear regression ที่เป็นพื้นฐานสำคัญของหลายๆโมเดลขั้นสูง ดูวีดีโอสอนได้ที่นี่ (2.49 นาที) โดยตัวอย่างในวีดีโอนี้คือการทำนายราคาบ้านในแคลิฟอร์เนีย

Linear Regression คือสมการเส้นตรง y = wx + b ที่ลากตัดผ่านข้อมูลของเราได้ดีที่สุด (error ต่ำที่สุด) ในกรณีที่เรามี x หลายตัวแปร เราจะเรียกว่า “Hyperplane”

สมการ linear regression แบบที่ง่ายที่สุดคือมีตัวแปร y หนึ่งตัวและ x หนึ่งตัว เราเรียกสมการนี้ว่า simple linear regression โดยที่ w คือ slope หรือความชันของเส้นตรงและ b คือ y-intercept หรือจุดตัดแกนตั้ง y axis (machine learning เรียกค่าสัมประสิทธิ์ w ว่า weight และ b ว่า bias)

y = f(x) = wx + b

เราจะรู้ได้ยังไงว่าโมเดลของเราดีที่สุด

ทุกๆโมเดล machine learning จะมีฟังก์ชันที่ใช้คำนวณค่า error ของโมเดล (หรือค่า loss) สำหรับ linear regression ตัวที่เรานิยมใช้ชื่อว่า L2 Loss หรือ squared error เขียนเป็นสมการได้แบบนี้

วิธีการคำนวณ L2 Loss คือการหาความแตกต่างระหว่างค่าจริงและค่าที่โมเดลทำนาย เสร็จแล้วยกกำลังสอง ในการทำงานจริงเรามี loss function ให้เลือกใช้งานอีกหลายตัว (ไม่มี loss function ไหนที่ดีที่สุด ขึ้นอยู่กับปัญหาที่เราต้องการแก้และข้อมูลที่เรามี) ด้านล่างคือ pseudo code แสดงขั้นตอนการคำนวณ L2 Loss

= L2 Loss
= sum((actual - prediction(x))^2)
= sum((y - y')^2)

Sculley ใช้ตัวย่อ y สำหรับ label หรือ actual ส่วน y’ คือค่าที่เราทำนาย เราสามารถมองค่า Loss เป็นเหมือนการทำโทษโมเดลของเราเวลาทำนายผลผิดก็ได้ (ภาษาอังกฤษใช้คำว่า Loss = Penalty) วิธีการแปลผลค่า Loss ถ้าค่าสูงแปลว่าโมเดลทำนายผิดเยอะ ถ้าค่า Loss ต่ำแปลว่าโมเดลทำนายได้ใกล้กับค่าจริงมาก ถ้าค่า Loss เท่ากับศูนย์แปลว่าโมเดลสามารถทำนายได้ถูกต้องทั้งหมด

ความสัมพันธ์เชิงเส้นตรง

คอร์สเรียน Google ยกตัวอย่างโมเดลความสัมพันธ์ระหว่างจำนวนจิ้งหรีด (crickets) กับอุณหภูมิเซลเซียส เมื่อเราพล็อต scatter plot จะเห็นว่ารูปแบบความสัมพันธ์ของสองตัวแปรเป็นแบบเส้นตรง และมีความสัมพันธ์เชิงบวก แปลว่า จิ้งหรีดจะออกมามากขึ้นเวลาอุณหภูมิสูงขึ้น (หรือลดลงเวลาอากาศเริ่มหนาว)

ความสัมพันธ์ของจำนวนจิ้งหรีดและอุณหภูมิ ที่มา Google

เส้นตรงที่ลากตัดผ่านข้อมูลในรูปด้านบนคือ the best fitted line หรือโมเดลที่ทำให้ L2 Loss มีค่าต่ำที่สุด

ในกรณีที่เรามีตัวแปร x หรือ features มากกว่าหนึ่งตัวแปร เราจะเรียกโมเดลนี้ว่า “Multiple Linear Regression” ซึ่งหลักการทำงานของโมเดลยังเหมือนเดิม คือการหาค่า optimal weights และ bias ที่ทำให้ loss ต่ำที่สุด (minimize loss); y = b + w1x2 + w2x2 + w3x3 + …

การเทรนโมเดลและค่า Loss

Training คือขั้นตอนการเรียนรู้เพื่อหาค่า weights และ bias ที่ดีที่สุดจากข้อมูล labeled examples ที่เราป้อนให้กับ machine learning algorithm ในกรณีของ supervised learning การเทรนโมเดลคือการหาค่า weights และ bias ที่ทำให้ค่า loss ต่ำที่สุด Sculley เรียกกระบวนการนี้ว่า “empirical risk minimization

พิจารณาสองรูปด้านล่าง รูปไหนที่โมเดลทำงานได้ดีกว่า (มีค่า loss ต่ำกว่า)?

Two Cartesian plots, each showing a line and some data points. In the first plot, the line is a terrible fit for the data, so the loss is high. In the second plot, the line is a a better fit for the data, so the loss is low.
โมเดลด้านขวามีค่า loss โดยรวมต่ำกว่า (ทำนายได้แม่นยำกว่า) ที่มา Google

เนื่องจาก L2 Loss ที่เราคำนวณจะเป็นผลรวมของ loss ตลอดทั้งเส้น regression ถ้าเราต้องการหาว่าโดยเฉลี่ยต่อ example ค่า average loss ของเราเป็นเท่าไหร่ เราสามารถหาร L2 Loss ด้วยจำนวน examples ได้ตามสูตรด้านล่าง (เราใช้ N แทนจำนวน examples ใน dataset)

MSE คือ metric ที่เรานิยมใช้เทรนโมเดลตระกูล regression ในสายงาน ML ในทางปฏิบัติยังมี metrics อื่นๆ เช่น MAE, RMSE, R2 ที่เราสามารถใช้เทรนโมเดลได้อีกด้วยขึ้นอยู่กับสถานการณ์และข้อมูลที่เรามี

สรุป ML algorithm จะเรียนรู้ฟังก์ชัน (ในกรณีของ linear regression คือการหาค่า optimized weights และ bias) ที่ทำให้ค่า loss ของโมเดลต่ำที่สุด โดย loss >= 0 ยิ่งค่าเข้าใกล้ศูนย์แปลว่าโมเดลทำนายผลได้แม่นยำยิ่งขึ้น

แบบทดสอบความเข้าใจ

สิ่งที่นักเรียนต้องทำ – ค้นหาใน Google ว่าความแตกต่างในแง่การคำนวณระหว่าง L1 และ L2 Loss คืออะไร และตอบคำถามด้านล่าง

Q3. สูตรการคำนวณ L1 และ L2 Loss ต่อไปนี้ข้อใดถูกต้อง?
L1 Loss = sum(|y – y’|) และ L2 Loss = sum((y – y’)^2)
ถูกต้องนะคร้าบ
L1 Loss = sum((y – y’)^2) และ L2 Loss = sum(|y – y’|)
ลองอ่านทบทวนเรื่อง L1, L2 อีกครั้งนะครับ L1 ใช้ absolute ส่วน L2 ใช้ squared
วิธีคำนวณ MSE ด้วยภาษา R

เราสามารถเขียนโค้ดเพื่อคำนวณ mse ใน R ได้ง่ายๆ สำหรับเพื่อนๆที่ยังไม่เคยเขียน R มาก่อน สามารถสมัครคอร์สออนไลน์ฟรี Intro to R ได้ที่นี่ ใช้เวลาเรียนประมาณ 2 ชั่วโมง

## create actual and prediction vectors
actual <- c(25, 30, 32, 28, 45)
prediction <- c(22, 34, 32, 30, 41)

## compute loss (MSE)
sse <- sum((actual - prediction)**2)
mse <- sse / length(actual)
print(mse)

หรือถ้าต้องการเขียนเป็นฟังก์ชันเพื่อนำไปใช้กับข้อมูลอื่นๆก็ได้ ตั้งชื่อฟังก์ชันว่า MSE รับสอง arguments คือ actual และ prediction โดยทั้งสองตัวต้องเป็นเวคเตอร์ความยาวเท่ากัน

## define function
MSE <- function(actual, prediction) {
  ## check if both vectors are of the same length
  stopifnot(length(actual) == length(prediction))
  ## return mse
  mean((actual - prediction)**2)
}
แบบทดสอบความเข้าใจ

จุดสีแดงในกราฟคือ actual ส่วนเส้นตรงสีน้ำเงินคือโมเดล linear regression หรือ prediction ทบทวนสูตร MSE = sum((y – y’)**2) / N

Q4. จากรูปด้านบน โมเดลซ้ายหรือขวามี Mean Squared Error หรือ MSE สูงกว่ากัน?
โมเดลขวา
ถูกต้องนะคร้าบ MSE = (2^2 + 2^2) / 10 = 0.8 โดยสัญลักษณ์ ^ คือการยกกำลัง
โมเดลซ้าย
MSE = (1^2 + 1^2 + 1^2 + 1^2) / 10 = 0.4 โดยสัญลักษณ์ ^ คือการยกกำลัง

4. Tutorial Linear Regression in R

หัวข้อนี้ แอดเพิ่มเติมจากคอร์สของ Google โดยเราจะมาลองสร้าง linear regression ง่ายๆด้วย base ฟังก์ชัน lm() ของ R โดย lm ย่อมาจากคำว่า “linear modeling”

Note – ตัวอย่างนี้ แอดยังไม่ได้สอนเรื่องการทำ train test split หรือ train validate test sets แต่เราจะโฟกัสที่การเทรนโมเดลอย่างเดียว บทต่อๆไปของ crash course จะลงลึกเรื่องการทดสอบโมเดลมากขึ้น

โค้ด R ด้านล่างเราเทรนโมเดล simple linear regression โดยใช้คอลัมน์ mpg เป็น label และ hp เป็น feature เสร็จแล้วเราใช้ฟังก์ชัน predict() เพื่อทำนายผล และคำนวณ loss ตามลำดับ

## built-in dataset
head(mtcars)

## train model
linear_reg <- lm(mpg ~ hp, data = mtcars)

## look at weights
coef(linear_reg)

## inference i.e. make prediction
p <- predict(linear_reg)

## compute loss
L2_loss <- sum((mtcars$mpg - p)**2)
N <- nrow(mtcars)
mse <- L2_loss/ N
print(mse)

สำหรับตัวอย่างในคอร์ส Google จะใช้ข้อมูลราคาบ้านในแคลิฟอร์เนีย เราสามารถดาวน์โหลดไฟล์ csv ได้ด้วยฟังก์ชัน read.csv() ตามตัวอย่างด้านล่าง เสร็จแล้วพรีวิวข้อมูลด้วยฟังก์ชัน str() หรือ head()

## read dataset
california <- read.csv("https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv", stringsAsFactors = FALSE)

## explore data
str(california)

## print first six rows
head(california)

โจทย์ – คอลัมน์ median_house_value ใน California dataset คือ label ที่เราต้องการทำนาย ลองเลือกตัวแปร 2-3 ตัวเป็นฟีเจอร์และสร้างโมเดล linear regression คำนวณค่า mse ใน R

Coming Soon

สำหรับเนื้อหาบทต่อๆไป สามารถติดตามอัพเดทได้ทางเฟซบุ๊คเพจของเรา 😜

กษิดิศ สตางค์มงคล data analyst R

Kasidis Satangmongkol

Data Analyst

แอดทอย ทำเพจ เขียนบล๊อก สอนหนังสือ ชอบเรียนออนไลน์ 😛