บทความ
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: Pii
| Blockchain
แก้ปัญหาเวเนซูเอล่าด้วยบล็อคเชน
ครั้งหนึ่งประเทศเวเนซูเอล่าเคยเป็นเมืองที่มีทรัพยากรอย่าง ทองและน้ำมัน อย่างเหลือเฟือ มีธรรมชาติที่สมบูรณ์สวยงามทั้งป่าเขาทะเล ผู้คนจากทั่วทุกมุมโลกได้ย้ายถิ่นฐานไปอาศัยที่นั่น ทำให้เวเนซูเอล่ากลายเป็นเมืองที่ได้ชื่อว่าเป็น Switzerland แห่ง Latin America มีความร่ำรวยมั่งคั่งเป็นอันดับต้นๆของโลกเลยทีเดียวจากวันนั้นมาวันนี้เวเนซูเอล่าไม่เหลือภาพในฝันดังกล่าวอีกต่อไป ผู้คนในประเทศต่างพยายามอพยพออก โรคร้ายที่เคยถูกกำจัดจนหายไปแล้วได้กลับมาระบาดอีกครั้งเนื่องจากการรักษาพยาบาลมีปัญหา เด็กๆในประเทศมีความเสี่ยงเสียชีวิตจากการขาดสารอาหาร ด้วยสภาพที่ประเทศขาดอาหารและยาเป็นอย่างมาก ผู้คนจึงต้องลักลอบเข้าไปหาจากประเทศโคลัมเบียและส่วนมากไม่กลับมาอีก รวมไปถึงค่าเงินโบลีวาร์ของประเทศเองก็มีความผันผวนอย่างมากตลอดเวลาสภาพของเวเนซูเอล่าตอนนี้คือรัฐบาลควบคุมสภาพเศรฐกิจของประเทศอย่างเข้มงวด การซื้อขายอาหารและยาในประเทศขาดความโปร่งใส อาหารถูกใช้เป็นข้อต่อรองข้อเสนอต่างๆ การโอนเงินจากต่างประเทศเข้ามาโดยเฉพาะกรณี Western Union จะถูกรัฐบาลหักไปถึง 56 เปอร์เซ็นในแต่ละครั้ง ก่อนที่จะแปรสภาพมาเป็นเงินโบลีวาร์ที่แทบไม่มีค่าอะไรเลย คนส่วนมากจึงตั้งราคาสินค้าต่างๆเป็นดอลล่า(เงินสหรัฐอเมริกา)หรือเปโซ(เงินโคลัมเบีย)เพราะมีความน่าเชื่อถือมากกว่าวันนี้บล็อคเชนจึงเป็นแสงสว่างเป็นทางออกเป็นคำตอบของชาวเวเนซูเอล่า โดยเป็นสื่อกลางการแลกเปลี่ยนระหว่างคนนอกประเทศและในประเทศที่ปราศจากการแทรกแซงจากรัฐบาลปัจจุบัน คนนอกจะซื้อเหรียญคริปโตและแลกเปลี่ยนกับคนในโดยที่คนในสามารถขายเหรียญคริปโตเป็น ดอลล่า หรือ เปโซ มาใช้จ่ายซื้อขายอาหารและยาได้ตามปกติสกุลเงินบล็อคเชนต่างๆสามารถสร้างระบบเศรฐกิจขึ้นอีกวงหนึ่งในประเทศเวเนซูเอล่าได้เอง การอาศัยอยู่ในประเทศที่ค่าเงินของประเทศผันผวนอย่างหนักตลอดเวลาก็เปรียบเสมือนเป็นทาสของรัฐบาลประเทศนั้นๆนั่นเอง(ทรัพย์สินจะมีค่าหรือไร้ค่าขึ้นอยู่กับการบงการของรัฐบาล) แต่การใช้สกุลเงินบล็อคเชนทำให้การแทรกแซงใดๆเป็นไปไม่ได้ ทำให้เศรฐกิจที่พึ่งค่าเงินนี้สามารถเดินหน้าต่อไปได้ สามารถซื้อขายแลกเปลี่ยนได้ทั้งภายในและภายนอกประเทศเองจากรายงานช่วงปลายปีที่แล้ว(พ.ศ. 2561) ชาวเวเนซูเอล่ารวมถึงชาวโคลัมเบียต่างเริ่มมีการใช้เหรียญ Dash อย่างกว้างขวางมากขึ้นเรื่อยๆ โดยในเดือนมกราคม มีร้านค้ารับเหรียญ Dash อยู่ 1 ร้าน จนสิ้นปีธันวาคม มีทั้งหมดประมาณ 350 ร้านค้า ซึ่งทีมงานผู้สร้างเหรียญ Dash ก็ได้ทำการลงพื้นที่เพื่อให้ข้อมูลผู้ใช้งานโดยตรงนี่เป็นเพียงตัวอย่างหนึ่งของการประยุกต์ใช้บล็อคเชนแก้ปัญหาขนาดใหญ่ระดับประเทศ ซึ่งแท้จริงแล้วเป็นแค่จุดเริ่มต้นของเทคโนโลยีนี้เท่านั้น วันนี้บล็อคเชนเป็นเครื่องมือสำคัญยิ่งในการกอบกู้สังคมหรือประเทศที่ล้มเหลวจากการบริหารของรัฐบาลหรือสถาบันขนาดใหญ่ใดๆ ในไม่ช้าเวเนซูเอล่าอาจเป็นบทพิสูจน์ให้โลกได้เห็นถึงศักยภาพความเป็นไปได้ของ บล็อคเชน เทคโนโลยีแห่ง ความเชื่อ(Trust) เป็นจุดเริ่มต้นของการเปลี่ยนแปลงสังคมมนุษย์สู่ยุคใหม่
โดย: Kan Ouivirach
| Machine Learning
Cross Validation กับ ML
บทความนี้เราจะมาทำให้โมเดล Machine Learning ของเราน่าเชื่อถือโดยใช้เทคนิคที่เรียกว่า Cross Validation กัน โดยทั่วไปแล้ว เราจะนำเอาเทคนิคนี้มาวัด Performance ของโมเดล เลือกโมเดลที่ดีที่สุดแล้ว นอกจากนี้เรายังนำเอา เทคนิคนี้มาช่วยป้องกันปัญหา Overfitting ที่ได้เขียนถึงในบทความ ปัญหา Overfitting ใน Machine Learning คืออะไร [link ไปบทความเก่า] อีกด้วยนะเมื่อก่อนคำถามที่ผมโดนถามบ่อยๆ เป็นคำถามแรกๆ เลย (หลายๆ คนก็น่าจะโดนถามเหมือนกัน) ตอนที่นำเสนอผลที่ได้จากโมเดล คือ “ได้ทำ Cross Validation มาหรือยัง?” ถ้าคำตอบคือยัง ก็แปลว่าเราไม่ต้องนำเสนอต่อล่ะ T Tเทคนิคนี้จึงเป็นเทคนิคที่สำคัญมาก ที่ทุกคนควรรู้และทำให้เป็นถ้าจะมาสายนี้ครับ เรามาทำความรู้จักกับมันกันดีกว่าชื่อวิธีการที่ใช้กันโดยทั่วไปคือ k-fold Cross Validation โดยที่ค่า k จะเป็นตัวเลขหนึ่งที่เราจะเลือกมาเพื่อแบ่งเป็นจำนวนของกลุ่มข้อมูล เช่น ถ้า k = 5 เราก็จะแบ่งข้อมูลออกเป็น 5 กลุ่ม (หรือ fold) นั่นเองสรุปขั้นตอนโดยรวมจะประมาณนี้สลับข้อมูลแบบ randomแบ่งข้อมูลออกเป็นกลุ่มตามจำนวน k ที่กำหนด สมมุติว่าเราแบ่งออกเป็น 5 กลุ่ม เพื่อให้เข้าใจง่ายขึ้นจะแสดงข้อมูลแต่ละกลุ่มเป็นตัวเลขแบบนี้ [1, 2, 3, 4, 5]เราจะนำข้อมูล 4 กลุ่ม เช่น [2, 3, 4, 5] ไปสอนโมเดล และอีก 1 กลุ่มที่เหลือ [1] ไปทดสอบโมเดล จดผลลัพธ์ไว้ เช่น จดค่า Accuracy ไว้พอเสร็จแล้ว รอบถัดไปเราก็จะนำข้อมูล [1, 3, 4, 5] ไปสอน และอีก 1 กลุ่มที่เหลือ [2] ไปทดสอบโมเดลทำแบบนี้วนไปจนกว่าเราจะได้ทดสอบกับกลุ่มข้อมูลครบทั้ง 5 กลุ่มพอทำครบเราก็จะนำเอาค่า Accuracy หรือค่าอื่นๆ ที่เราจดไว้มาหาค่าเฉลี่ย แล้วเราก็จะได้ Performance ของโมเดลของเราไปนำเสนอเป็นที่เรียบร้อย ^^ ถ้าเราอยากปรับปรุงโมเดลของเรา เราก็ทำ Cross Validation แบบนี้อีก แล้วดูว่าค่าเฉลี่ยที่เราได้มามีค่ามากขึ้นหรือเปล่า ถ้ามากขึ้นก็แปลว่าโมเดลเราดีขึ้นนั่นเองจะเห็นได้ว่าการทำแบบนี้ทำให้ข้อมูลผ่านโมเดลของเราทั้งหมด ลดความลำเอียงของโมเดลของเรา และทำให้โมเดลนั้นน่าเชื่อถือมากขึ้นเผื่อมีใครอยากลอง บทความก่อนหน้านี้เราลองเล่น Machine Learning โดยใช้ scikit-learn [link ไปบทความเก่า] ทีนี้ถ้าเราอยากลองทำ Cross Validation ล่ะ? ก็ทำได้ตามนี้เลย>>> from sklearn.cross_validation import cross_val_score>>> knn = KNeighborsClassifier(n_neighbors=5)>>> scores = cross_val_score(knn, X, y, cv=10, scoring=’accuracy’)>>> print(scores)[ 1. 0.93333333 1. 1. 0.86666667 0.933333330.93333333 1. 1. 1. ]จะเห็นได้ว่าเราไม่จำเป็นต้องแบ่งเป็น Training Data หรือ Test Data ก่อน เราสามารถโยนข้อมูลทั้งหมดทั้ง X และ y เข้าไปยัง cross_val_score ได้เลย โดยฟังก์ชั่นนี้จะไปแบ่งกลุ่มข้อมูลให้เราเองสุดท้ายถ้าอยากหาค่าเฉลี่ย เราก็>>> print(scores.mean())0.966666666667สุดท้ายแล้วก็อยากฝากไว้ครับว่าอย่าใจร้อนเอาโมเดลของเราไปใช้งานจริง ถ้าเห็นว่าผลของมันออกมาดี ซึ่งผลที่ออกมาดี อาจจะเป็นเพราะโมเดลของเรา Overfit ก็เป็นได้ อยากให้เสริมความมั่นใจด้วยการทำ Cross Validation กันก่อนทุกครั้งนะครับ :)
โดย: Laris
| IoT
มาเริ่มต้นเขียนโปรแกรม IoT กันดีกว่า
สวัสดีค่ะท่านผู้อ่านทุกท่าน วันนี้เราจะมาเริ่มเขียนโปรแกรมลงบนบอร์ด ESP32 ตามสัญญากันนะคะ ซึ่งบทความเราจะเริ่มติดต่อกับอุปกรณ์ IoT หรือว่าแตะฝั่ง Hardware กันแล้วค่ะ (ตื่นเต้นกันมั้ย :p) และเพื่อความง่ายต่อการเริ่มต้นเราจะใช้ Framework: Arduino มาเขียนโปรแกรมกันวันนี้ค่ะบอร์ด TTGO T8หากเราไปค้นคำว่า “Arduino” ใน Google เราอาจจะเจอ “บอร์ด Arduino” มากมายอย่าเพิ่งตกใจไปนะคะ เพราะว่า Arduino มีทั้ง Board และ Framework ซึ่งใบบทความนี้เราจะใช้ ESP32 Board ร่วมกับ “Framework Arduino” และ Hardware ที่จะใช้วันนี้คือบอร์ด TTGO T8 ซึ่งใช้ชิป ESP32 ของบริษัท Espressif Systems ค่ะ ส่วนใครที่มีบอร์ดอื่นๆที่เป็น ESP32 ก็สามารถเอามาใช้ได้เลยนะคะ บอร์ดนี้ใกล้มือผู้เขียน ติดกระเป๋ามาด้วย เลยหยิบมาทำ Demo ให้ดูกันค่ะเริ่ม ติดตั้ง Arduino กันก่อนทุกระบบปฏิบัติการ สามารถดาวน์โหลด Arduino IDE ได้ที่ https://www.arduino.cc/en/Main/Software แต่ ก็ยังมี Editor หรือ IDE อีกหลายตัวที่เรายังสามารถเขียน Arduino และ ESP32 อีกนะคะ แต่วันนี้เราไปลุยกับ Arduino IDE กันก่อนเนอะarduino.ccหลังจากนั้นเปิดโปรแกรมแล้วจะได้หน้าตาแบบภาพข้างล่างค่ะ แต่ Arduino IDE อย่างเดียวไม่สามารถเขียน ESP32 ได้ เราต้องลงเพิ่มอีกนิดหน่อยค่ะหน้าจอเขียนโปรแกรม Arduinoติดตั้ง ESP32 SDKเข้าเมนู Arduino → Preferences แล้วในช่อง Additional Boards Manager URLs ใส่ https://dl.espressif.com/dl/package_esp32_index.json (คลิ๊กเพื่อ อ่านเพิ่มเติม)หน้าจอ Preferencesเมื่อเข้ามา Board Manager แล้ว รอสักครู่ หลังจากนั้นเลือก esp32 by Espressif Systems แล้วกด Install ได้เลยค่ะติดตั้งบอร์ด ESP32 เริ่มต้นเขียนโปรแกรม Arduinoเริ่มต้นด้วยการ เปิดตัวอย่าง Blink ขึ้นมาจากเมนู Examples → Blinkแล้วทดสอบอัพโหลดโปรแกรม เอาฤกษ์ โดยการกดปุ่ม Sketch → Upload เอาชัยกันก่อนด้วยโปรแกรม Blink ค่ะ… (อย่าลืมแก้หมายเลข Pin ให้เป็นไปตามคู่มือของบอร์ดนะคะ อย่าง TTGO T8 จะเป็นขา 21ผลการรันโปรแกรม Blinkเริ่มต้นเขียนโปรแกรม IoTหลังจากผ่านด่านทดสอบกันมาแล้ว เราจะเริ่มมาเขียนโปรแกรมสำหรับเชื่อมในแบบ Internet of things กันค่ะ เราจะลองเล่นกันไปก่อนนะคะ แล้วจะค่อยๆกลับมาเรียนกันอีกทีตอนหลังค่ะ (อย่าเพิ่งตกใจกันไปก่อนหน้าาา)ซึ่งเราจะเริ่มกันด้วยลง Library: ArduinoJson (v5.13.3) และ CMMC MQTT Connector (v1.2.0) โดยการเข้าที่เมนู Sketch → Include Library → Manage Libraries กดค้นหาแล้วเลือก Install ได้เลยค่ะหลังจากนั้นเลือกเปิดตัวอย่าง basic_mqtt ขึ้นมาค่ะหน้าจอตัวอย่างโปรแกรม basic_mqttหลังจากนั้นเปิดหน้าต่าง _config.h แล้วแก้ไขข้อมูลเบื้องต้นของเราค่ะ ซึ่งเราเลือก MQTT Broker ของ hivemq มาใช้กันนะคะ (จากในภาพจะแก้หลักๆที่ DEVICE_NAME และ MQTT_PREFIX) ที่เหลือคงกันไว้เหมือนเดิมกันก่อนนะคะ_config.hหลังจากนั้นเกิด Serial Monitor ขึ้นมาก็จะเห็นภาพข้างล่างนี้ค่ะSerial Monitor Consoleหลังจากนั้นเราจะมาลองควบคุมอุปกรณ์เราผ่าน hivemq web client กันนะคะ แต่จะต่างกับบทความก่อนๆที่เราจะใช้ mosquitto_pub ซึ่งเป็น client แบบ native แต่ที่เรากำลังใช้กันเป็น webclient ซึ่งวิ่งบน websocket protocol ซึ่งจะ binding เข้ากับ mqtt protocol (ซึ่งเป็น tcp) และตรงข้อนี้จะเป็น Feature ของ MQTT Broker นะคะ ซึ่งไม่ได้ถูกกำหนดไว้ใน Spec ของ MQTT Standard นะคะ แต่เราค่อยมาพูดถึง MQTT กันต่อในบทความถัดๆไปกันนะคะส่วนวันนี้เราจะเข้า http://www.hivemq.com/demos/websocket-client/ ไปและกด connect กันก่อนได้เลยค่ะ ในช่อง Publish: Topic เราก็ใส่ Prefix และ Device Name ของเราไป อย่างในโค๊ดตัวอย่างก็จะใส่ MYAPP/DEVICE001/$/commandและสั่ง ON และ OFF เพื่อสั่งเปิดและ ปิดค่ะ (ตามในโค๊ดดูได้ที่ไฟล์ _receive.h ค่ะ)หน้าจอแสดง mqtt websocket clientหลังจากนั้นก็ลองกด Publish ดู ก็จะให้ผลแบบในภาพค่ะภาพสาธิตแสดงการ Publish ข้อมูลเข้าบอร์ด ESP32เท่านี้ก็จะสั่งงานเปิด-ปิด อุปกรณ์ IoT ของเราได้แล้วค่ะ ไม่ยากเลยใช่มั้ยคะหลังจากนี้เราจะเอา IoT Device มาเชื่อมต่อกับ Home Assistant กัน เพื่อเริ่มต้นทำ Home Automation กันนะคะ ส่วนรายละเอียดส่วนอื่นๆ ก็จะทยอยเพิ่มเติมให้ในบทความถัดๆไปเช่นกันนะคะ
โดย: Pii
| Blockchain
ทำความเข้าใจ อีเธอเรียม คอนแสตนติโนเปิ้ล 27 ก.พ. 2562 (ที่ถูกเลื่อน)
คนที่ลงทุนในเหรียญอีเธอเรียมไม่จำเป็นต้องรู้เรื่องเทคนิคนี้นะครับ การอัพเดทที่จะมีขึ้นจะไม่มีผลกระทบกับผู้ถือเหรียญอีเธอเรียมแต่อย่างใด บทสรุปการอัพเดทระบบอีเธอเรียมนี้เหมาะสำหรับนักพัฒนาและผู้สนใจในเทคโนโลยีนี้เป็นพิเศษหลังจากที่อีเธอเรียมถูกเลื่อนกำหนด hard fork(การอัพเดทระบบ) ออกไป จากกำหนดเดิมที่ block เบอร์ 7,080,000 ซึ่งควรจะมีขึ้นในช่วงวันเสาร์ที่ 19 มกราคม พ.ศ. 2562 ที่ผ่านมา มาเป็น block เบอร์ 7,280,000 แทน ซึ่งควรจะมีขึ้นในช่วงประมาณวันพุธที่ 27 กุมภาพันธ์ พ.ศ. 2562 สาเหตุเนื่องจากมีคนพบบั๊กใน EIP ที่ถูกเสนอขึ้น จึงได้มีการเลื่อนระยะเวลา fork ออกไป 2 แสนบล็อค หรือ 6 สัปดาห์ โดยประมาณEIP(Ethereum Improvement Proposal) หรือข้อเสนอเพื่อปรับปรุงระบบอีเธอเรียม ที่จะเกิดขึ้นในเวอร์ชั่นคอนแสตนทีนโนเปิ้ลนั้นมี 5 ข้อประกอบไปด้วยEIP 145: Bitwise shifting instructions in EVMข้อนี้คือการเพิ่ม Bitwise Shifting native function ให้ระบบทำงานได้ สะดวก เร็ว และประหยัดขึ้นEIP 1014: Skinny CREATE2ทำให้สามารถอ้างถึงและเรียกใช้ address ที่ยังไม่ได้ถูกสร้างขึ้นได้EIP 1052: EXTCODEHASH opcodeเพิ่มประสิทธิภาพการทำงานในส่วนการเช็ค bytecode ของตัว contractEIP 1234: Constantinople Difficulty Bomb Delay and Block Reward Adjustmentปรับค่าระบบให้เหมาะสมกับสภาพระบบปัจจุบันEIP 1283: Net gas metering for SSTORE without dirty mapsลดขั้นตอนการทำงานที่ไม่จำเป็นทำให้ระบบประหยัดขึ้นบั๊กที่กล่าวถึงด้านต้นถูกพบที่ EIP 1283 ช่องโหว่ดังกล่าวทำให้ระบบถูกโจมตีได้ด้วย Reentrancy Attacks ในช่วงที่กำหนดการถูกเลื่อนออกไป ได้มีทั้งคนที่เสนอให้ยกเลิก EIP 1283 ออกจากชุดอัพเดทนี้ และคนที่เสนอให้แก้ไขรายละเอียดบางส่วนของ EIP 1283 ใหม่ ซึ่งดูเหมือนได้มีการปรับแก้ EIP 1283 ไปเป็นที่เรียบร้อยแล้วความเร็วในการต่อบล็อค(เขียนข้อมูลลงระบบ) หลังจากการอัพเดทจะยังคงอยู่ที่ประมาณ 15 วินาทีเหมือนเดิม เนื่องจากมาตรฐานของระบบอีเธอเรียมต้องการความปลอดภัยและความเสถียรสูง ซึ่งความเร็วดังกล่าวอาจเร็วขึ้นได้อีกมากหลังการพัฒนา PoS(Prove of Stake) ในอนาคต ในส่วนของค่าใช้จ่ายในการใช้งานระบบ อาจลดลงได้มากน้อยตามกรณีที่การใช้งานที่ตรงกันกับการปรับปรุงระบบในรอบนี้สำหรับใครที่ต้องการติดตามการอัพเดทครั้งนี้แบบลงลึกถึง spec โค้ด และเทสเคส สามารถตามไปอ่านได้ ที่นี่ ส่วนใครที่สนใจ best practice สำหรับการพัฒนา application บน Ethereum สามารถศึกษาได้จากเว็บ Openzeppelin ครับ ซึ่งจริงๆแล้ว Openzeppelin เองก็มีโมดูลช่วยป้องกัน Reentrancy Attacks ดังกล่าวให้เรียบร้อยแล้วครับ
โดย: Kan Ouivirach
| Machine Learning
ปัญหา Overfitting คืออะไร
ปัญหา Overfitting คือ?แล้วจะรู้ได้อย่างไรว่าเจอปัญหานี้แล้ว?มีวิธีอะไรบ้างที่ใช้ป้องกัน?ปัญหา Overfitting คือ?Overfitting เป็นปัญหาที่ฮิตที่สุดในการทำ Machine Learning บอกได้เลยว่าเป็นปัญหาที่ทุกคนต้องเจอ และหลายๆ คนอาจจะพลาดพลั้งกับมันมาแล้ว รวมทั้งตัวผมเองด้วย T T ขอยกประโยคจาก Wiki มาเลยตามนี้In statistics, overfitting is “the production of an analysis that corresponds too closely or exactly to a particular set of data, and may therefore fail to fit additional data or predict future observations reliably”.การวิเคราห์ใดๆ ที่ผูกติดกับข้อมูลนั้นๆ มากเกินไป การวิเคราะห์นั้นจะไม่สามารถไปทำนายผลข้อมูลนอกเหนือจากนั้น หรือในอนาคตได้ ผมมักจะยกตัวอย่างของกบในกะลามาอธิบายรูปจากเว็บ 500pxกบในกะลาจะรู้จักแต่ข้อมูลที่อยู่ในกะลา เมื่อมันออกมาเห็นข้อมูลในโลกภายนอกแล้วมันจะตอบอะไรไม่ได้เลย :D นั่นแหละครับ ปัญหา Overfitting สุดฮิตของเรา หรือถ้าเราพูดในภาษา Machine Learning ก็จะพูดได้ว่า โมเดลของเรานั้นไม่ Generalize กับข้อมูลใหม่ๆ นั่นเองOverfitting เป็นปัญหาที่เราจำเป็นต้องแก้ เพราะว่าโมเดลของเราแปลผลลัพธ์จากข้อมูลผิดไปเลย แล้วเราก็ไม่สามารถนำโมเดลของเราไปทำนายผลอะไรได้เลย การฝืนนำเอาไปใช้จะส่งผลเสียมากกว่าผลลัพธ์แน่นอนโมเดลที่เราอยากได้คือโมเดลในรูปด้านล่างทางซ้าย (Just right!) จะเป็นโมเดลที่มีความสามารถ Generalize ข้อมูลได้ดีกว่า แล้วเวลามีข้อมูลใหม่ๆ เข้ามาจะทำนายผลได้ดีกว่าโมเดลทางขวา (overfitting)รูปจาก Quoraแล้วจะรู้ได้อย่างไรว่าเจอปัญหานี้แล้ว?วิธีตรวจสอบง่ายๆ วิธีหนึ่ง เราจะแบ่งข้อมูลออกเป็น 2 ชุด คือชุด Training Set และ Test Set แล้วลองดูค่า Metric อย่าง Accuracy ถ้าเราได้ค่า Accuracy จาก Training Set มากกว่าค่า Accuracy จาก Test Set เยอะๆ เช่น ได้ 99% Accuracy กับ Training Set แต่ได้ 50% กับ Test Set นั่นก็แปลว่าเราเจอ Overfitting แล้วครับอีกวิธีหนึ่งคือถ้าเราได้ 100% Accuracy กับ Training Set ก็ให้สงสัยไว้ก่อนเลยว่าเราเจอ Overfitting ครับ ให้นึกไว้เสมอเลยว่าไม่มีโมเดลอะไรที่ Perfectจริงๆ มีอีกหลายเทคนิคที่ใช้ตรวจสอบปัญหานี้นะ ซึ่งเทคนิคเหล่านั้นก็ประยุกต์เอาจากวิธีตรวจสอบที่กล่าวมา ;)มีวิธีอะไรบ้างที่ใช้ป้องกัน?จริงอยู่ที่ Overfitting เป็นปัญหาที่ฮิต แต่เราก็มีวิธีป้องกันนะ ใช้เทคนิคประมาณนี้เพิ่มจำนวนข้อมูลทำ Cross Validationทำ Feature Selection เอา Feature ที่ไม่สำคัญออก เลือกแต่ Feature ที่จำเป็นทำ RegularizationEarly StoppingEnsembling…จริงๆ มีอีกเยอะเลย จะค่อยๆ มาเล่าให้อ่านกันในบทความต่อๆ ไปนะครับ ^^
โดย: Laris
| IoT
รู้จัก Home Assistant ตอนที่ 2
บทความที่แล้ว เราได้ทำการติดตั้งและเปิดใช้งานเจ้า Home Assistant กันไปแล้ว วันนี้เราจะมาพูดถึง Sensor Component เบื้องต้นกันนะคะ นั่นก็คือ MQTT Binary Sensor ค่ะMQTT Binary Sensor ComponentMQTT Binary Sensorจุดเด่นของ MQTT Binary Sensor Component คือ ความสามารถในการเชื่อม Home Assistant ของเราเข้ากับ MQTT Protocol และมีการรับ Input เป็นการแสดงสถานะ ‘เปิด’ หรือ ‘ปิด’ และแสดงสถานะปัจจุบันของอุปกรณ์ค่ะเริ่มต้น Config MQTT Binary Sensor Componentเริ่มจากการเปิด Web Interface ของ Home Assistant กันก่อนค่ะ สามารถเข้าไปดูได้ที่ http://<ip-address>:8123 เช่น http://127.0.0.1:8123ตัวอย่างหน้า Loginหน้า Overview ของ Home Assistantครั้งแรกที่เข้าหน้า Web เราต้องสร้าง User ก่อนค่ะ สร้างเสร็จและทำการ Login แล้ว จะเห็นหน้า Overview ค่ะ ถึงตรงนี้ Home Assistant ก็พร้อมให้เราใช้งานแล้วค่ะ สิ่งแรกที่ต้องทำ คือ หาไฟล์ configuration.yaml กันก่อนค่ะ configuration.yaml เป็นไฟล์ที่เก็บ Configuration ของ Component ที่เราจะใช้ค่ะ ซึ่งหาได้ตามข้างล่างนี้เลยค่ะตำแหน่งของไฟล์ Configuration ในแต่ละ ระบบปฏิบัติการเมื่อหาไฟล์เจอแล้ว.. ก็เปิดขึ้นมาดูเลยค่ะ จะเห็นค่า Default Configurations ที่ใช้สำหรับเปิดหน้า Web Interface และ Device Discovery ค่ะ หากว่าเราต้องการใช้งาน Component ไหนใน HASS ง่ายๆค่ะ เราแค่เพิ่มค่า Settings ของ Component นั้นๆ ใน configuration.yaml ค่ะ และตามสัญญาค่ะ จากบทความที่แล้ว เราได้เกริ่นไว้ว่าเราจะมาลองหนึ่งใน Component ยอดฮิตของ Home Asistant กัน ซึ่งก็คือ MQTT Binary Sensor ค่ะการปรับแต่ง Home Assistant เพื่อเชื่อมต่อกับ MQTT Brokermqtt: broker: IP_ADDRESS_BROKERเสร็จแล้วก็มาเซทค่าให้ MQTT Binary Sensor ค่ะ ซึ่ง MQTT Binary Sensor Platform จะใช้ MQTT Message Payload ในการตั้งค่าสถานะ (State) ของ Binary Sensor ซึ่งมีด้วยกันอยู่ 2 สถานะค่ะ ‘ON’ หรือ ‘OFF’ หรือ ปิดและเปิดนั่นเองค่ะเสร็จแล้วก็มาเซทค่าให้ MQTT Binary Sensor ค่ะ ซึ่ง MQTT Binary Sensor Platform จะใช้ MQTT Message Payload ในการตั้งค่าสถานะ (State) ของ Binary Sensor ซึ่งมีด้วยกันอยู่ 2 สถานะค่ะ ‘ON’ หรือ ‘OFF’ หรือ ปิดและเปิดนั่นเองค่ะค่าสถานะ (State) จะมีการอัพเดทก็ต่อเมื่อมี Message ใหม่ถูก Publish ตามที่เซทไว้ที่ state_topic และมี Payload ที่ตรงกับค่า payload_on และ payload_offที่เราตั้งค่าไว้ค่ะ ซึ่งอาจจะเป็น ‘ON/OFF’ หรือ ‘1/0’ อันนี้ก็แล้วแต่เราจะตั้งนะคะbinary_sensor:- platform: mqttname: "Window Contact Sensor"state_topic: "home-assistant/window/contact"payload_on: "ON"payload_off: "OFF"availability_topic: "home-assistant/window/availability"payload_available: "online"payload_not_available: "offline"หลังจากตั้งค่า Configuration สำหรับ MQTT Binary Sensor …อย่าลืม RESTART นะคะ….. (Configuration > General > Server Management)เราสามารถตั้งค่าให้ MQTT Binary Sensor รับค่าเวลา Offline ได้ค่ะ โดยจะใช้ availability_topic เป็นตัวกำหนดค่ะ หาก มีการเซทค่าให้กับ availability_topic และ Device ของเรา Offline ไป (เช่น Offline ด้วยการ Publish payload_not_available ใน Topic ชื่อ availability_topic) ใน Home Assistant ก็จะขึ้นว่า unavailable ในหน้า Web ค่ะ (Figure 3) ตัว MQTT Protocol เองก็จะมีฟีเจอร์ LWT (Last-will and Testament) และ Retain เอาไว้ช่วยอัพเดตสถานะของอุปกรณ์ได้โดยอัตโนมัติ หรือหากลองก็สามารถลองได้ด้วยคำสั่งด้านล่าง$ mosquitto_pub -h <your running broker> -t home-assistant/window/availability -m "offline"หากต้องการให้ Device เรา เปลี่ยน State เป็น ON/OFF ก็สามารถทำได้ ด้วย Command Line เราก็จะได้หน้า Overview บน Web เช่นรูปข้างล่างค่ะ (Figure 4)$ mosquitto_pub -h <your running broker> -p 1883 -t home-assistant/window/contact -m "ON"$ mosquitto_pub -h <your running broker> -p 1883 -t home-assistant/window/contact -m "OFF"Figure 3Figure 4อ้างอิงจาก Home Assistant : MQTT Binary Sensor
โดย: Kan Ouivirach
| Machine Learning
เล่น Machine Learning แบบชิลๆ กับ scikit-learn
ทำความรู้จักกับข้อมูล Iris Data Setการโหลดข้อมูลการเตรียมข้อมูลการสร้าง Machine Learning โมเดลการนำโมเดลไปจำแนกข้อมูล หรือทำนายผลการเรียนรู้ที่ดีที่สุดวิธีหนึ่งคือการลงมือทำ บทความนี้เราจะมาลองลงมือเล่น Machine Learning แบบชิลๆ กับ scikit-learn กัน ตั้งแต่การโหลดข้อมูล จนถึงการสร้างโมเดลเอาไปจำแนกข้อมูล หรือทำนายผลเลยhttps://scikit-learn.org/scikit-learn เป็น Machine Learning Library ในภาษา Python ที่เราสามารถเอาไปทำทั้ง Supervised Learning หรือ Unsupervised Learning ได้ (ไม่มี Reinforcement Learning นะ ทำไม?) แล้วเราถึงเลือกใช้ Library นี้มาลอง?เป็น Library ที่ออกแบบมาให้ง่ายต่อการใช้งาน มี Algorithm ใน Machine Learning ที่นิยมใช้กันอยู่ใน Library นี้มีเอกสารการใช้งานที่ดี อันนี้ดีงามจริงๆ เพราะว่ามีโค้ดตัวอย่างให้ด้วยมีแทบทุก Task ใน Machine Learning ให้ใช้ เช่น Classification, Regression, Clustering, Model Selection, Preprocessing และอื่นๆ อีกมากมายติดตั้งโดยการใช้คำสั่ง : pip install scikit-learnทำความรู้จักกับข้อมูล Iris Data Setรูปจาก UCI Machine Learning Repositoryขั้นตอนแรกสุดคือเราต้องมาทำความรู้จักกับข้อมูลที่เราจะเอามาเล่นก่อน เนื่องจากเราจะมาลองเล่นกันแบบชิลๆ เลยเอาข้อมูลดอก Iris มาก่อนเลย เป็นข้อมูลที่ง่าย และดูจะเป็นข้อมูลที่ผ่านมือทุกคนที่ทำงานในสายนี้มาแล้วเลยทีเดียว ซึ่งมันควรจะผ่านมือพวกเราด้วยเช่นกัน :Dโจทย์ของเราจากข้อมูลชุดนี้คือ เราจะต้องจำแนกจากข้อมูลให้ได้ว่าข้อมูลนั้นเป็นดอก Iris ชนิดไหน ระหว่าง Setosa, Versicolor หรือ Virginica ซึ่งข้อมูลที่เราจะได้มาจะมี ความยาวกับความกว้างของกลีบเลี้ยง (Sepal Length & Width) หน่วยเป็นเซนติเมตร (cm) และความยาวกับความกว้างของกลีบดอก (Petal Length & Width) หน่วยเป็นเซนติเมตร (cm) เช่นกันการโหลดข้อมูลความดีงามของ scikit-learn นั้นคือ เราสามารถลองเล่นข้อมูลมาตรฐานได้โดยไม่ต้องไปโหลดมาเอง ซึ่งข้อมูล Iris ก็รวมอยู่ในนั้น เราสามารถลองใช้ได้ตามนี้>>> from sklearn import neighbors, datasets>>> iris = datasets.load_iris()หน้าตาที่ได้ก็จะประมาณนี้>>> print(iris.data) [[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] [4.7 3.2 1.3 0.2] [4.6 3.1 1.5 0.2] [5. 3.6 1.4 0.2] [5.4 3.9 1.7 0.4] [4.6 3.4 1.4 0.3]…เราสามารถดูว่าข้อมูลแต่ละคอลัมน์คืออะไรได้ตามนี้>>> print(iris.feature_names)[‘sepal length (cm)’, ‘sepal width (cm)’, ‘petal length (cm)’, ‘petal width (cm)’]ค่าพวกนี้เราเรียกว่า Feature ได้ครับ Feature คือข้อมูลที่เราคิดว่าจะนำไปแยกแยะสิ่งต่างๆ ที่เราต้องการจำแนก ยกตัวอย่างเช่น ถ้าเราต้องการจำแนกว่าข้อมูลไหนคือรถยนต์ ข้อมูลไหนคือรถมอเตอร์ไซค์ Feature หนึ่งที่เราจะใช้ก็อาจจะเป็น จำนวนล้อ ครับ ในที่นี้ข้อมูล Iris เราก็จะมี Feature เป็นจำนวน 4 Feature นั่นเองส่วนข้อมูลชนิดของดอก Iris จะถูกเก็บอยู่ใน iris.target ครับ>>> print(iris.target)[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]ตัว scikit-learn จะแปลงค่ามาเป็นตัวเลขให้เราแล้ว พร้อมที่จะนำเอาไปสร้างโมเดล แต่ถ้าเราอยากรู้ว่าแต่ละตัวเลขหมายความว่าอะไร เราดูจาก iris.target_names ได้ครับ>>> print(iris.target_names)[‘setosa’ ‘versicolor’ ‘virginica’]โดย Setosa คือเลข 0 ส่วน Versicolor คือเลข 1 และ Virginica คือเลข 2 ตามลำดับ (index ของ List ใน Python เริ่มที่เลข 0)การเตรียมข้อมูลเพื่อให้ดูง่ายๆ จะขอเก็บ Feature ทั้ง 4 ค่าในตัวแปร X และข้อมูลชนิดของดอก Iris ในตัวแปร y ตามนี้>>> X, y = iris.data, iris.targetทีนี้เวลาที่เราจะสร้างโมเดล เราจะแบ่งออกเป็น 2 Phases โดย Phase ที่ 1 คือ Training และ Phase ที่ 2 คือ Prediction หรือ Testing ตามรูปด้านล่างครับรูป Supervised Classification จาก http://www.nltk.org/book/ch06.htmlตอนที่เราอยู่ Training Phase เราจะดึงเอา Feature จากข้อมูล (ทำ Feature Extracting) มาใส่ Machine Learning Algorithm ส่วนตอนที่เราอยู่ Testing Phase เราก็จะเอาข้อมูลที่ไม่เคยเห็นมาก่อน หรือข้อมูลที่เอาไว้ทดสอบ มาดึง Feature ด้วย วิธี Feature Extracting แบบเดียวกับที่เราทำใน Training Phase ย้ำนะครับ ต้องเป็นวิธี Feature Extracing แบบเดียวกันทีนี้เราจะต้องแบ่งข้อมูลออกเป็น 2 ส่วน สำหรับแต่ละ Phase ทำได้ดังนี้>>> from sklearn.model_selection import train_test_split>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)เรากำลังแบ่งข้อมูลสำหรับเอาไว้ทดสอบ (X_test กับ y_test) เป็นจำนวน 30% และที่เหลือเอาไว้สร้างโมเดล (X_train กับ y_train)การสร้าง Machine Learning โมเดลบทความนี้ขอเลือกใช้ k-nearest neighbors มาลองเล่น คร่าวๆ ก็คือว่า เรากำลังจะหาเพื่อนใกล้ๆ เรา (จำนวน k) แล้วดูว่าเพื่อนแบบไหนมีมากกว่ากัน เราก็จะไปกับเพื่อนกลุ่มนั้น ส่วนรายละเอียดเดี๋ยวจะมาเล่าให้อ่านในบทความต่อๆ ไปนะครับ :Dเราจะนำเอา X_train กับ y_train มาใช้ในขั้นตอนนี้ครับ ตามนี้เลย>>> from sklearn import neighbors>>> knn = neighbors.KNeighborsClassifier(n_neighbors=15)>>> knn.fit(X_train, y_train)KNeighborsClassifier(algorithm=’auto’, leaf_size=30, metric=’minkowski’, metric_params=None, n_jobs=1, n_neighbors=15, p=2, weights=’uniform’)จบ Training Phase.. ใช้โค้ดแค่ 3 บรรทัดเราก็ได้โมเดลเอาไปลองเล่นได้ล่ะครับ เย้~ บทความนี้เราเน้นชิลๆ ดังนั้นเราจะข้ามขั้นตอนพวก Evaluate หรือ Validate ไปก่อนนะครับการนำโมเดลไปจำแนกข้อมูล หรือทำนายผลขั้นตอนสุดท้ายของเราล่ะครับ เราจะนำโมเดลของเราไปใช้จำแนกข้อมูล หรือทำนายผล ขั้นตอนนี้เราจะเอา X_test กับ y_test มาใช้>>> from sklearn.metrics import accuracy_score>>> y_pred = knn.predict(X_test)>>> print(accuracy_score(y_test, y_pred))0.9555555555555556เรียบร้อยครับ ได้ความแม่นยำประมาณ 95.56%บทความนี้ไม่ได้กล่าวถึงขั้นตอนการติดตั้ง Environment ต่างๆ ให้ใช้งานนะครับ จุดประสงค์คืออยากจะให้เห็นภาพรวมว่าการทำ Machine Learning จะมีขั้นตอนประมาณไหนบ้าง ซึ่งจริงๆ ยังมีขั้นตอนอื่นอีกนะ เช่น Feature Engineering, Model Validation, Model Evaluation อะไรพวกนี้ สำหรับคนที่ไม่คุ้นกับโค้ดเลย ผมแนะนำให้ติดตั้ง Anaconda ครับ ซึ่งจะมี scikit-learn มาให้เรียบร้อยแล้ว เรากดใช้ Jupyter Notebook แล้วเอาโค้ดด้านบนไปรันได้เลยหวังว่าการเห็นภาพรวมแบบตั้งแต่ต้นจนจบ (end-to-end) แบบนี้ จะทำให้เข้าใจการทำ Machine Learning กันมากขั้นนะครับ
โดย: Laris
| IoT
รู้จัก Home Assistant ตอนที่ 1
สวัสดีท่านผู้อ่านทุกท่านค่ะ หลังจากบทความที่ผ่านมา เราคุยกันถึงเรื่อง คำจำกัดความของ “Internet of Things” โดยการพูดถึง “IoT Reference Model” เพื่อเป็นการจูน หรือทำความรู้จักโลกของ IoT กันไปแล้วทางผู้เขียนก็ตั้งใจกันไว้ว่าหลังจากนี้จะค่อยๆลงลึกทางด้านเทคนิคมากขึ้น ซึ่งในบทความนี้ผู้เขียนเลือกใช้วิธีการเรียนรู้ IoT จาก OpenSource Software กันไปก่อนค่อยๆปูทางลงไปก่อนจะไปถึงการเขียนโปรแกรมลงใน Embedded Device หรือพวก Hardware ต่างๆนั่นเองผู้เขียนได้เลือก “Home Assistant” มาให้ทำความรู้จักกันก่อนค่ะHome Assistant เป็น Open Source สำหรับทำ Home Automation เป็นหลัก และเขียนขึ้นด้วย Python และสามารถใช้ Track, Control, และใช้ Automate Device ได้ โดยที่ไม่จำเป็นต้อง Store ข้อมูลไว้บน Cloud ไม่ต้องห่วงว่าข้อมูลส่วนตัวเราจะถูกเปิดเผยค่ะ ตัว Home Assistant Architecture แบ่งได้ 3 layers โดยจะมีHome Control ทำหน้าที่ควบคุมและเก็บข้อมูลจาก devicesHome Automation รับข้อมูลมาจาก Home Control และส่ง Commands ไปยัง devices ผ่าน Home Controller ซึ่ง Commands เหล่านี้มาจาก Configuration ที่ User ได้ตั้งค่าไว้Smart Home ทำตาม Commands ที่เกิดจากการเรียนรู้ด้วยตัวเอง (Self — learning)Home Assistant ComponentHome Assistant สามารถขยายขีดความสามารถไปได้อีกด้วย ‘Componet’ ซึ่งในแต่ละ Component จะมีหน้าที่ของแต่ละตัวเฉพาะเจาะจง ตัว Component นั้นถูกเขียนด้วยภาษา Python นั่นหมายความว่า อะไรที่ Python ทำได้ เจ้า Component นี่ก็ทำได้เหมือนกัน นอกจากนี้ Home Assistant เองก็ได้ทำ Built-in Components เพื่อให้นำมาใช้ได้เลยอีกด้วย แต่ถ้าหากเราอยาก Custom ของเราเอง ก็ใช้ Component มาทำได้เลยค่ะตัว Home Assistant Frontend เองก็ได้ถูกออกแบบมาเพื่อสำหรับใช้ในรูปแบบ Mobile โดยเฉพาะ ซึ่งได้ Polymer Framework เข้ามาช่วยในส่วน Frontend จะเห็นว่าหน้าตาของ Home Assistant Frontend มีความคล้ายกับการใช้งาน Mobile Application จริงๆ ในส่วนของ Home Assistant Backend ก็จะใช้ Python 3 ซึ่งถูกสร้างมาเพื่อให้สามารถ Extend ได้ โดยใช้ Components ค่ะตัวอย่าง หน้าตาของ Home Assistant Frontendการติดตั้ง Home Assistantในส่วนของการติดตั้ง Home Assistant นั้นสามารถติดตั้งได้หลายวิธีนะคะ แต่วันนี้ทางผู้เขียนอยากจะขอแนะนำวิธีการติดตั้งด้วย 2 วิธีดังนี้ค่ะติดตั้งด้วย Python 3 + Virtual Environmentติดตั้งด้วย Docker1. วิธีการติดตั้งด้วย Python 3 + Virtual Environmentเริ่มจากการสร้าง Virtual Environment กันก่อนเลยค่ะ ในจุดที่ต้องการด้วยคำสั่ง (อย่าลืม ติดตั้ง Python3 ก่อนนะคะ)$ python3 -m venv homeassistantสร้างเสร็จแล้วก็เปิดใช้งาน Virtual Environment ค่ะ$ cd homeassistant$ source bin/activateจากนั้นก็ติดตั้ง wheel และ homeassistant ค่ะ$ python3 -m pip install wheel$ python3 -m pip install homeassistantเริ่มเปิดใช้งาน Home Assistant เลยค่ะ$ hass --open-ui2. วิธีการติดตั้งด้วย Dockerสามารถทำได้ในหลาย Platform เลยค่ะ ไม่ว่าจะเป็นLinuxRaspberry Pi (Raspbian)macOS 1. LINUX$ docker run -d — name="home-assistant" -v /PATH_TO_YOUR_CONFIG:/config -v /etc/localtime:/etc/localtime:ro — net=host homeassistant/home-assistant2. RASPBERRY PI 3 (RASPBIAN)$ docker run -d — name="home-assistant" -v /PATH_TO_YOUR_CONFIG:/config -v /etc/localtime:/etc/localtime:ro --net=host homeassistant/raspberrypi3-homeassistant3. macOS$ docker run -d — name="home-assistant" -v /PATH_TO_YOUR_CONFIG:/config -e "TZ=Asia/Bangkok" -p 8123:8123 homeassistant/home-assistantสำคัญว่าอย่าลืมแก้ไข /PATH_TO_YOUR_CONFIG ให้เป็นตำแหน่งที่เก็บ Configuration ค่ะตัวอย่าง ถ้าที่อยู่ไฟล์เป็น /home/pi/homeassistant คำสั่งที่ใช้ก็จะเป็น$ docker run -d — name="home-assistant" -v /home/pi/homeassistant:/config -v /etc/localtime:/etc/localtime:ro --net=host homeassistant/raspberrypi3-homeassistantบทความนี้เราได้ทำความรู้จักกับ Home Assistant พร้อมทั้งวิธีการติดตั้ง และการทดลองใช้งาน Home Assistant กันไปแล้ว ในรอบถัดไปเราจะมารู้จักกับ Component ยอดฮิต อย่าง MQTT Binary Sensor ว่าคืออะไร ใช้งานอย่างไร ส่งข้อมูลหากันได้ยังไง แล้วจะค่อยๆลงลึกไปถึงระดับ Protocol ยอดฮิตอย่าง MQTT กันต่อไปค่ะ
โดย: Kan Ouivirach
| Machine Learning
Machine เรียนรู้กันอย่างไร?
Machine เรียนรู้กันอย่างไร?การเรียนรู้ 3 รูปแบบหลัก- Supervised learning- Unsupervised learning- Reinforcement learningการนำเอาไปใช้แก้ปัญหาบทความที่ผ่านมา “เริ่มต้นเรียนรู้ Machine Learning อย่างไรให้สนุก?” (https://www.digitalskill.org/contents/5)  ได้พูดเกริ่นๆ ไว้หน่อยแล้วว่า Machine Learning เนี่ย หัวใจของมันคือส่วนของการ “Learning” ครับ บทความนี้ก็เลยอยากจะมาพูดถึงเรื่องนี้ไว้สักหน่อย  ;)Machine เรียนรู้กันอย่างไร?การเรียนรู้ของ Machine เนี่ย จริงๆ แนวทางก็เหมือนกับของคนเรานั่นแหละ เนื่องจากแต่ไหนแต่ไรมาเราก็มีความพยายามจะทำให้ Machine นั้นเหมือนคนเราให้ได้มากที่สุดอยู่แล้วเนอะ ทีนี้เวลาคนเราเรียนรู้อะไรสักอย่างเรามักจะแอบส่องคนอื่นว่าเค้าทำอะไรในสถานการณ์นั้นๆ แล้วถ้าเกิดเราเจอสถานการณ์นั้นบ้าง เราก็ตัดสินใจทำตามเค้าเลยมองหาข้อมูลสนับสนุนต่างๆ ในสถานการณ์หนึ่งๆ แล้วพยายามที่จะหาสิ่งที่ดีที่สุดมาช่วยในการตัดสินใจลองผิดลองถูก ถ้าผิดก็เจ็บตัว ถ้าถูกก็ทำต่อไปทั้ง 3 พฤติกรรมการเรียนรู้ของคนเหล่านี้จะพาเราเข้าสู่เรื่องของการเรียนรู้ของ Machine ที่จะพูดถึงล่ะการเรียนรู้ 3 รูปแบบหลักรูปแบบที่ 1 Supervised Learning หรือ “แอบส่องคนอื่นว่าเค้าทำอะไรในสถานการณ์นั้นๆ แล้วถ้าเกิดเราเจอสถานการณ์นั้นบ้าง เราก็ตัดสินใจทำตามเค้าเลย”สมการ Supervised Learningการเรียนรู้แบบนี้คือการ Supervise ตัว Machine ให้เรียนรู้ตามที่เราบอก จากสมการในรูปด้านบน จะได้ว่าถ้าเรามีฟังก์ชั่นอยู่ฟังก์ชั่นหนึ่ง ตอนที่เราสอนเครื่อง เราจะให้คู่ข้อมูล x กับ y เข้าไปเป็นจำนวนหนึ่ง ถ้าข้อมูลนั้นมีจำนวนมากพอ ตอนที่เราโยน x ตัวใหม่เข้าไป ฟังก์ชั่นนี้ก็จะสามารถไปหา y ที่เหมาะสมให้เราได้ยกตัวอย่างเช่น ถ้าเราให้ข้อมูลว่าสิ่งๆ หนึ่งมีหน้าตาน่ารัก มีขน หน้ากลมๆ หูตั้ง (x) สิ่งๆ นั้นคือ แมว (y) นะ จากนั้น ตอนที่เครื่องที่เราสอนเห็นข้อมูล x ของแมวตัวใหม่เข้ามา เครื่องจะสามารถบอกได้ว่าสิ่งๆ นั้นคือแมวSupervised Learning นี้เป็นการเรียนรู้ที่เราใช้แก้ปัญหาเกือบทุกปัญหาในโลกนี้เลยทีเดียวนะ ไม่ว่าจะเป็นปัญหา Face Detection/Recognition หรือ Self-Driving Car พวกนี้ เราก็จำเป็นต้อง Supervise ให้เครื่องรู้จักคำตอบที่เราป้อนให้มันด้วยแต่ก็มีข้อจำกัดที่เราต้องระลึกไว้ก็คือ Machine นั้นจะรู้จักแค่คำตอบที่เราเคย Supervise มันไปเท่านั้น เช่น ถ้าเราสอนเครื่องด้วยข้อมูลหมากับแมวไปเท่านั้น พอเวลาที่มีข้อมูลของวัวเข้ามา เครื่องจะไม่สามารถบอกได้ว่าสิ่งๆ นั้นคือวัว เครื่องจะตอบได้แค่หมากับแมวรูปแบบที่ 2 Unsupervised Learning หรือ “มองหาข้อมูลสนับสนุนต่างๆ ในสถานการณ์หนึ่งๆ แล้วพยายามที่จะหาสิ่งที่ดีที่สุดมาช่วยในการตัดสินใจ”สมการ Unsupervised Learningดูจากสมการด้านบนจะเห็นว่า y ได้หายไปแล้ว หมายความว่าเราไม่ต้องบอกว่าข้อมูลนั้นๆ (x) มีคำตอบเป็นอะไร ในที่นี้เราจะโยนข้อมูลเข้าไปในฟังก์ชั่นและให้ Machine นั้นพยายามที่จะเอาข้อมูลไปประมวลผลหาความสัมพันธ์ต่างๆ และนำเสนอผลลัพธ์ที่ได้ออกมาให้เราเห็น ตรงจุดนี้จะไม่เหมือนกับแบบ Supervised นะ ที่ว่าแบบ Supervised จะมีการอนุมาน (inference) ออกมาเป็นคำตอบ แต่แบบ Unsupervised จะไม่มีการตัดสินใจใดๆ การตัดสินใจจะเป็นหน้าที่ของคนยกตัวอย่างเช่น ถ้าเราต้องการจะแบ่งกลุ่มของลูกค้าที่ชอบสินค้าเหมือนๆ กัน Machine ก็จะแค่นำเสนอข้อมูลที่แบ่งกลุ่มออกมาแค่นั้นเอง ส่วนเราจะเอาไปทำอะไรต่อก็เป็นหน้าที่ของเราเองรูปแบบที่ 3 Reinforcement Learning หรือ “ลองผิดลองถูก ถ้าผิดก็เจ็บตัว ถ้าถูกก็ทำต่อไป”สมการ Reinforcement Learningอ้างอิงจากสมการด้านบน ตัวแปร y ในที่นี้ไม่ใช่คำตอบแบบใน Supervised Learning แต่มันคือ action ส่วน x คือข้อมูลที่เข้ามา และ z คือ reward นึกภาพง่ายๆ เลยคือ เวลาที่เราฝึกสุนัข :D ถ้าเราอยากให้สุนัขสวัสดีแบบยกขาหน้าขึ้น ถ้ามันยกขาเราก็ให้ขนมมัน ช่วงแรกๆ มันก็จะทำผิดทำถูก แต่หลังๆ ไปสุนัขของเราก็จะทำได้เองเลย ในที่นี้ การยกขาหน้าขึ้นคือ y คำสั่งที่เราสั่งสุนัขคือ x ส่วนขนมก็คือ z นั่นเองการเรียนรู้แบบนี้ส่วนใหญ่เรานำไปใช้กับหุ่นยนต์หรือเกม ให้หุ่นยนต์หรือเกมค้นหาเส้นทางที่ดีที่สุดเองจากการลองผิดลองถูกการนำเอาไปใช้แก้ปัญหาก่อนที่เราจะนำเอา Learning แต่ละรูปแบบไปใช้ เราต้องเข้าใจปัญหาก่อนว่าปัญหาของเราคืออะไร เราถึงจะเลือกใช้รูปแบบการ Learning ได้ถูก และเหมาะสมครับ เช่น ถ้าเราต้องการที่จะจำแนกอีเมลว่าเป็นสแปมหรือไม่ใช่สแปม ปัญหานี้เราควรจะนำเอา Supervised Learning มาแก้ปัญหา ถ้าเราต้องการจะแบ่ง Segment ของลูกค้า หรือต้องการจะแนะนำสินค้าใหม่ๆ จาก User Preference เราก็ควรที่จะใช้ Unsupervised Learning เข้ามา ส่วน Reinforcement Learning ก็อาจจะเป็นปัญหาแนวที่เราต้องการที่จะ optimize อะไรสักอย่างเพื่อให้ได้ action และนำ action นั้นไปเรียนรู้ต่อแบบอัตโนมัติ ถ้าปัญหาของเรามีการรับ feedback เข้ามาเพื่อการเรียนรู้ เราก็สามารถเอา Reinforcement Learning ไปแก้ปัญหาได้Enjoy Learning ครับ :)
โดย: Kan Ouivirach
| Machine Learning
มาทำความรู้จัก Machine Learning Process กัน
ทำไม Process ถึงสำคัญ?หน้าตา Machine Learning Process (มี 5 ส่วนหลักๆ)เข้าใจปัญหาเตรียมข้อมูล และทำความคุ้นเคยกับข้อมูลนั้นสร้าง Machine Learning โมเดลปรับปรุงโมเดล และผลลัพธ์นำเสนอผลงาน และนำโมเดลไปใช้งานจริงสรุปทำไม Process ถึงสำคัญ?Process นั้นเป็นตัวที่จะช่วยทำให้เราสามารถปฏิบัติตาม ทำงานตามขั้นตอนต่างๆ อย่างเป็นระบบ สามารถจัดการสิ่งต่างๆ ได้อย่างมีระเบียบ รวมไปถึงการเรียนรู้งานนั้นๆ อีกด้วย ซึ่งแน่นอนว่าการทำงานด้าน Machine Learning ก็ต้องมี Process เหมือนกัน มาลองดูกันนะว่าหน้าตามันจะเป็นอย่างไรหน้าตา Machine Learning Processก็จะประมาณนี้Machine Learning Processเรามาทำความเข้าใจกันต่อดีกว่าว่าขั้นตอนแต่ละขั้นเราจะทำอะไรกันบ้าง ก่อนอื่นผมขอแบ่งรูปด้านบนออกมาเป็น 5 ส่วนหลักๆ ได้แก่ทำความเข้าใจปัญหาเตรียมข้อมูล และทำความคุ้นเคยกันข้อมูลนั้นสร้าง Machine Learning โมเดลปรับปรุงโมเดล และผลลัพธ์นำเสนอผลงาน และนำโมเดลไปใช้งานจริงส่วนที่ 1 ทำความเข้าใจปัญหาทำความเข้าใจปัญหาก่อนที่เราจะทำอะไรก็ตามเราต้องเข้าใจปัญหาก่อน ปัญหาคืออะไร? เราจะแก้มันอย่างไร? เราจะแก้มันด้วยวิธีไหน? (Understand)ส่วนที่ 2 เตรียมข้อมูล และทำความคุ้นเคยกับข้อมูลนั้นเตรียมข้อมูล และทำความคุ้นเคยกับข้อมูลนั้นเมื่อเราเข้าใจปัญหาแล้ว เรื่องที่ตามมาก็คือเราต้องมีข้อมูลครับ ถ้าไม่มีข้อมูล Process นี้จบครับ >_< ไม่ต้องทำอะไรต่อเลย LOL ดังนั้นเราต้องมีข้อมูลก่อน ถ้าเรามีข้อมูลอยู่แล้วก็เยี่ยมเลย แต่ถ้าไม่มีเราก็ต้องออกไปเก็บข้อมูลมาก่อนครับ หรือดึงข้อมูลจากระบบที่เรามี (Collect) จากนั้นเราก็ค่อยมาทำความรู้จักกับข้อมูลนั้นๆ (Explore Viz) ไม่ว่าจะเอามาพลอตกราฟ หรือเอามาดูการกระจายตัวของค่าบางค่าในข้อมูล รวมไปถึงอาจจะคำนวณหาค่าทางสถิติพื้นฐานต่างๆ เช่น ค่าเฉลี่ย พอเราเริ่มคุ้นแล้ว เราค่อยมาลองปัดฝุ่น ทำความสะอาดข้อมูลของเรา (Clean) เช่นถ้าข้อมูลช่องไหนมีไม่ครบ เราก็อาจจะหาค่าหนึ่งมาเติมเข้าไป หรือว่าข้อมูลไหนไม่จำเป็นในการวิเคราะห์ก็ตัดทิ้งไปเป็นต้น สุดท้ายเราจะมาปรับข้อมูลของเราให้เราสามารถนำเข้าไปสร้างโมเดลได้ (Transform) ทำไมต้องทำขั้นตอนนี้? เพราะว่า Machine Learning โมเดลนั้นจะรับ input ที่เป็นแบบ fix จำนวน column ครับ และส่วนใหญ่เราต้องแปลงข้อมูลจากข้อความให้กลายเป็นตัวเลขก่อนถึงจะเอาไปสอนโมเดลนั้นได้ส่วนที่ 3 สร้าง Machine Learning โมเดลสร้าง Machine Learning โมเดลในส่วนนี้เราจะเริ่มสร้างโมเดลกันครับ (Model) สำหรับผู้เริ่มต้นผมแนะนำให้เอาโมเดลที่มีอยู่มาทดลองใช้เลยครับ ไม่ว่าจะเป็น Naive Bayes หรือ Support Vector Machine หรือโมเดลอื่นๆ ก็ได้ครับ จังหวะนี้อย่ารีบร้อนไปลงในรายละเอียดหรือสมการของโมเดลนั้นๆ นะครับ อาจจะท้อได้ นอกจากที่เราจะสร้างโมเดลได้แล้ว เราจะต้องทดสอบโมเดลได้ด้วยนะ ว่าถูกจริงหรือเปล่า ดีจริงหรือเปล่า (Validate) ซึ่งตรงนี้จะขอไปกล่าวถึงในบทความต่อๆ ไปนะครับ :)ส่วนที่ 4 ปรับปรุงโมเดล และผลลัพธ์ปรับปรุงโมเดล และผลลัพธ์จากประสบการณ์ของตัวเอง และทุกคนที่ได้พูดคุยกันมา ส่วนนี้เป็นส่วนที่ใช้เวลาเยอะสุดครับ พูดได้ว่าประมาณ 90% เลยทีเดียว สังเกตจากรูปครับ ส่วนที่ 4 นี้จะรวมส่วนที่ 2 และส่วนที่ 3 เข้าไปด้วยกัน และเราจะวนลูปทำเรื่อยๆ ปรับปรุงไปเรื่อยๆ ลองโมเดลใหม่ไปเรื่อยๆ จนกว่าผลที่ได้จะพอใจ หรือจนกว่าจะได้โมเดลที่แม่นยำได้ตามเป้าหมายที่ตั้งไว้ครับ ข้อแนะนำของผมที่จะทำให้ทุกคนทำงานในส่วนนี้ได้อย่างมีความสุขคือ “จงหลงรักข้อมูลนั้นซะ” ครับ เพราะคุณจะใช้เวลากับส่วนนี้ :)ในส่วนนี้ถ้าเราคิดว่าเรามีข้อมูลไม่พอ เราก็ควรกลับไปที่ Collect ใหม่ครับ แล้วค่อยกลับเข้าลูปตามเดิมส่วนที่ 5 (ส่วนสุดท้าย) นำเสนอผลงาน และนำโมเดลไปใช้งานจริงนำเสนอผลงาน และนำโมเดลไปใช้งานจริงสุดท้ายแล้วเราต้องนำผลที่ได้ไปนำเสนอครับ (Communicate Viz) อาจจะไปนำเสนอกับหัวหน้า หรือ stakeholder ก็ได้ ส่วนนี้ไม่ได้ทำเพื่อจะอวดอะไรใครนะครับ แต่มันคือขั้นตอนที่สำคัญขั้นตอนหนึ่งคือ “การรับ Feedback” กลับมา เพื่อเอามาต่อยอดกับผลงานเรา รวมไปถึงการนำโมเดลไปใช้งานจริง (Deploy) แน่นอนครับ มันก็คือ “การรับ Feedback” อีกช่องทางหนึ่ง เมื่อเราลองใช้งานจริงแล้ว เราก็จะมีผลลัพธ์ที่สามารถนำกลับมาพัฒนาต่อยอดได้อีก ตามรูปเลยครับ ลูกศรเราย้อนกลับไปที่ Understand :)สรุปเราได้เรียนรู้หน้าตาของ Machine Learning Process ไปแล้ว ซึ่งการมี Process ที่ดี จะทำให้เราทำงานได้เป็นระบบ และต่อยอดจากองค์ความรู้เดิมได้ง่ายขึ้น จริงๆ แล้ว Process ของแต่ละคน แต่ละทีมก็อาจจะแตกต่างกันไปนะ เริ่มต้นลองยึดสักแบบหนึ่ง แล้วค่อยๆ ปรับเปลี่ยนไปตามความเหมาะสมก็ได้ครับ ;)

พบบทสัมภาษณ์ได้ที่นี่เร็ว ๆ นี้

พบDigital Skill บนสื่อ ได้ที่นี่เร็ว ๆ นี้