Python dictionary และ Neural network เหมือน/ต่างกันอย่างไร

Chomtana Chanjaraswichai
Super AI Engineer
Published in
2 min readFeb 1, 2021
Left: Python dictionary, Right: 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

--

--