Python dictionary และ Neural network เหมือน/ต่างกันอย่างไร
เชื่อว่ามีหลายคนที่เคยเรียนและเขียน Python ไม่ว่าจะเรียนในวิชา COM PROG หรือเรียนจาก course online หรือเรียนจากการลองผิดลองถูก ซึ่งก็ต้องรู้จัก dictionary ในภาษา python อย่างหลีกเลี่ยงไม่ได้
คุณรู้สึกยังไงกับ python dictionary ง่าย พอใช้ได้ ยาก??? แต่ถ้ามานั่งอ่าน Neural network ก็ต้องร้อง OMG กันไปตามๆกัน
แต่ถ้าคุณรู้ความเหมือน / แตกต่างกันของ dictionary และ neural network คุณก็จะไม่ต้องร้อง OMG อีกต่อไป (หรือร้องอยู่แต่ร้องน้อยลง)
ก่อนอื่นเรามาทบทวนกันก่อนว่า Python dictionary มันแตกต่างจาก dictionary แบบ Oxford dictionary ยังไง
Python dictionary VS dictionary in human language
Dictionary ในภาษามนุษย์นั้นเป็นเครื่องมือที่ใช้ในการแปลภาษาหนึ่ง ไปเป็นอีกภาษาหนึ่ง
ส่วน Python dictionary นั้นเป็นการแปลงอะไรก็ได้ที่เก็บไว้ในตัวแปรได้ ไปเป็นอะไรก็ได้อีกอย่างที่เก็บไว้ในตัวแปรได้ (ตัวเลข ข้อความ ชุดข้อความ ชุดตัวเลข ตัวเลขผสมข้อความ บลาๆๆ เก็บไว้ในตัวแปรได้)
อย่างเช่น เราจะแปลง เลขตั้งแต่ 1 ถึง 10 ให้เป็นเลขยกกำลังสอง
1 => 1
2 => 4
3 => 9
4 => 16
5 => 25
6 => 36
7 => 49
8 => 64
9 => 81
10 => 100
เราสามาระเขียนเป็น Python dictionary ได้ดังนี้
d = dict()
d[1] = 1
d[2] = 4
d[3] = 9
d[4] = 16
d[5] = 25
d[6] = 36
d[7] = 49
d[8] = 64
d[9] = 81
d[10] = 100
ซึ่งก็จะเห็นว่ามันก็แค่เอาชื่อตัวแปร d มาครอบตัวซ้ายมือด้วย […] และ เปลี่ยนเครื่องหมายชี้ => เป็น = ซึ่งถ้าเขียน blog ให้คนอ่านและไม่ได้กำลังสอน python ก็ใช้แบบ … => … แทนจะดีกว่า
เพื่อความเข้าใจที่ง่าย ในการเปรียบเทียบกับ Neural network เราจะใช้การเขียนแบบ … => … หรือ … (คำอธิบาย) … เพื่อให้เห็นภาพได้ง่าย
Python dictionary นั้นมีคุณสมบัติอย่างไรบ้าง?
- สามารถแปลงค่าค่าหนึ่ง ไปเป็นค่าอีกค่าหนึ่งได้ ไม่ว่าข้อมูลจะเป็นประเภทอะไร
- การแปลงเป็นไปอย่างแม่นยำ ตามที่เราเขียนความสัมพันธ์ไว้เป้ะๆ ไม่มีผิดเพี้ยน
- แต่เราต้องรู้ความสัมพันธ์ของทุกค่าที่เป็นไปได้ อย่างเช่นในตัวอย่างข้างต้น เราต้องเขียนความสัมพันธ์ตั้งแต่เลข 1 ถึง 10 ให้ครบทุกเลข ถ้าเราเขียนขาดไปแค่เลขเดียวอย่างเช่นเราเขียนแค่ 1 ถึง 9 ก็จะพังเลย
- คำตอบจะตอบ 1 แค่ 10 ตัว ตอบ 0 ไปตั้ง 1000 ตัว ก็ไม่มีปัญหาอะไร (เรียกว่าไม่มีความ balance เลย)
- เมื่อเราเขียน code เสร็จ ก็รันได้เลย ไม่ว่าจะใช้วิธี for loop หรือ hardcode
- Python dictionary ไม่กินทรัพยาการการประมวลผลมาก
- แล้วถ้ามีเลขตั้งแต่ 1 ถึง 1000 หล่ะก็ ได้มือหงิงแน่ถ้าทำแบบนี้ (เรียกการทำแบบนี้ว่าการ hardcode)
- คงมีคนคิดว่าถ้ามีเลข 1 ถึง 1000 ก็แค่ for loop ไป ไม่เห็นยากเลย
- แล้วถ้าเกิดเราไม่รู้ด้วยหล่ะว่าเลขข้างหลังมันคำนวณมายังไง อย่างเช่น input เป็นภาพ ซึ่งสามารถมองเป็น ตัวเลขค่าสีของแต่ละจุด เรียงกันเป็น array 3 มิติ (WIDTH, HEIGHT, RGB) แล้วแปลงออกมาเป็น output 0 หรือ 1 ซึ่งหมายถึงเป็นภาพแมวใช่หรือไม่ เราก็คงไม่รู้ว่าเราจะต้องทำท่าตีลังกากลับหลังยังไงกับ input เพื่อให้ได้ output ที่ต้องการ เราก็ใช้ for loop สร้างไม่ได้ ถ้าใช้มือก็คงไม่มีวันเสร็จ เพราะค่าที่เป็นไปได้มีเยอะมาก มากจน for loop 100 ปีก็ยังไม่เสร็จ
- เอแล้วจะทำไงดีนะ อ่านต่อแล้วกัน
Neural network นั้นมีคุณสมบัติอย่างไรบ้าง?
- สามารถแปลงค่าค่าหนึ่ง ไปเป็นค่าอีกค่าหนึ่งได้ แต่ข้อมูลต้องเป็นชุดของตัวเลขเท่านั้น
- การแปลงเป็นแค่การประมาณค่า ไม่มีทางแม่นยำ 100% ถ้าเป็นการคำนวณเลขก็จะได้แค่คำตอบที่ใกล้เคียง แต่ไม่ถูกต้อง
- เราไม่จำเป็นต้องรู้ความสัมพันธ์ของทุกค่า ความสัมพันธ์ที่เรารู้ทั้งหมดเรียกว่าข้อมูล แต่เราต้องรู้ให้มากที่สุดเพื่อเอามา train ถ้าเรารู้ไม่มากพอ ก็จะตอบมั่วในส่วนที่ไม่รู้
- ข้อมูลที่นำมา train นั้นจะต้องมีความ balance กล่าวคือ ถ้าเกิดมีคำตอบแค่ 1, 2, 3, 4 ข้อมูลก็จำเป็นต้องมีความสัมพันธ์ที่ตอบ 1, 2, 3, 4 เท่าๆกัน อย่างละ 25%
- Neural network กินทรัพยาการการประมาณผลเยอะมาก ถึงขนาดต้องใช้ GPU ราคาเป็นแสนในการ Train เลยก็ว่าได้
- การจะรันให้ได้ผลลัพธ์ตามที่ต้องการมีหลายขั้นตอน ดังนี้
- เราต้องเขียน code ส่วน train แล้วทำการ train ก่อน ซึ่งใช้เวลานาน
- เมื่อ train เสร็จต้อง save model ออกมา
- แล้วเขียน code โหลด model เข้าไปก่อน
- แล้วจึงค่อยเรียกใช้ model นั้น ถึงจะทำงานได้
- จะเห็นว่าจากคุณสมบัติที่ว่าเราไม่จำเป็นต้องรู้ความสัมพันธ์ของทุกค่า นั้นทำให้เราสามารถแก้ปัญหาที่ถามว่าภาพที่เป็นแมวใช่หรือไม่ เนื่องจากเราแค่ใช้ภาพแมวกับภาพอย่างอื่น ดึงมาจากเน็ตแค่ประมาณสักอย่างละ 10000 ภาพ มาสร้างความสัมพันธ์กันให้ได้มากที่สุด ไม่จำเป็นต้องหาความสัมพันธ์ของภาพทั้งจักรวาลเหมือนการใช้ dictionary
- แต่ปัญหาเลขยกกำลัง 2 นั้น neural network จะทำได้แย่กว่ามาก อธิบายด้วยตัวอย่างจะเห็นภาพกว่า ซึ่ง neural network จะตอบประมาณนี้
1 => 0.93
2 => 4.2
3 => 10.21
4 => 15.46
...
10 => 97.33
...
100 => 9513.22
สรุปแล้ว Python dictionary เหมือน / แตกต่างจาก Neural network อย่างไร?
- Python dictionary สามารถแปลงค่าชนิดอะไรก็ได้ เป็นชนิดอะไรก็ได้ แต่ Neural network สามารถทำได้แค่การแปลงตัวเลข ไปเป็น ตัวเลข
- ถ้าหากต้องการใช้ Neural network ทำเกี่ยวกับสิ่งที่ไม่ใช่ตัวเลข ต้องใช้วิธีการปกติที่ไม่ใช้ Neural network ในการแปลงให้เป็นตัวเลขก่อนแล้วจึงค่อยนำมาเข้า Neural network
- Python dictionary จะทำงานได้ถูกต้องเมื่อรู้ครบทุกความสัมพันธ์ แต่ Neural network ไม่จำเป็นต้องรู้ครบทุกความสัมพันธ์ แต่จะได้เป็นค่าประมาณ ไม่ถูกต้อง 100%
- Python dictionary นั้นเมื่อสร้างเสร็จแล้ว สามารถนำไปใช้งานได้เลย แต่ Neural network เมื่อสร้างตัว model เสร็จแล้วต้องทำการ Train ก่อน ถึงทำงานได้
- Python dictionary ไม่กินทรัพยาการการประมวลผลมาก แต่ Neural network กินทรัพยาการการประมาณผลเยอะมาก ถึงขนาดต้องใช้ GPU ราคาเป็นแสนในการ Train เลยก็ว่าได้
- สำหรับ Neural network ทั้ง input และ output ที่นำเข้าไปในขั้นตอนการ Train จะต้องมีความ balance
- ถ้าหากงานไหนสามารถใช้วิธีปกต ิแล้วทำงานได้ Perfect ก็ไม่ควรใช้ Neural network ส่วนงานไหนที่ยากมาก หรือใช้วิธีปกติแล้วทำงานได้แย่ จึงหันมาพิจารณาการใช้ Neural network