Make your own Neural Network #3

Thana Hongsuwan
8 min readDec 28, 2023

--

ในสองบทความที่ผ่านมาเราพูดถึง Predictor ซึ่งสามารถทำนายค่าที่เหมาะสม และ Classifier ที่สามารถแบ่งกลุ่มข้อมูล ซึ่งทำได้โดยใช้สมการเชิงเส้น แต่ในบทความนี้จะชี้ให้เห็นปัญหาบางอย่างที่แนวทางทั้งสอง ไม่สามารถจัดการได้

บทความนี้เรียบเรียงจาก หนังสือ Make your own Neural Network

Sometimes One Classifier Is Not Enough

Predictor และ Classifier ง่ายๆ ที่เราใช้งานกันมาจนถึงตอนนี้ — ที่รับข้อมูลเข้า ทำการคำนวณบางอย่าง แล้วส่งผลลัพธ์ออกมา แม้ว่าจะมีประสิทธิภาพค่อนข้างดีอย่างที่เราเพิ่งเห็น แต่ก็ไม่เพียงพอที่จะแก้ไขปัญหาที่น่าสนใจบางอย่างที่เราหวังว่าจะใช้ Neural Network แก้ไขได้

ก่อนอื่น เราจะแสดงข้อจำกัดของตัวจัดประเภทเชิงเส้นผ่านตัวอย่างง่ายๆ แต่ชัดเจน เหตุผลที่เราต้องการทำเช่นนี้แทนที่จะกระโดดตรงไปยังการพูดคุยเกี่ยวกับNeural Network ก็คือ คุณลักษณะการออกแบบที่สำคัญของ Neural Network นั้นมาจากการทำความเข้าใจข้อจำกัดนี้ ดังนั้นจึงควรใช้เวลานิดหน่อย

เราจะเปลี่ยนเกียร์จากเรื่องแมลงในสวน ไปสำรวจโลกของฟังก์ชันตรรกะแบบบูล (Boolean logic) ฟังดูเป็นศัพท์เทคนิคฟังยากไม่ต้องกังวลไปเลย จอร์จ บูล เป็นนักคณิตศาสตร์และนักปรัชญา และชื่อของเขาก็ติดกับฟังก์ชันพื้นฐานอย่าง AND (และ) กับ OR (หรือ) นี่แหละ

ฟังก์ชันตรรกะแบบบูลเปรียบเสมือนฟังก์ชันของภาษาหรือการคิด เช่น ถ้าเราพูดว่า “คุณจะได้กินของหวานก็ต่อเมื่อคุณกินผักหมดแล้ว และถ้าคุณยังหิวอยู่” เรากำลังใช้ฟังก์ชัน AND แบบบูล ฟังก์ชัน AND แบบบูลจะเป็นจริงก็ต่อเมื่อเงื่อนไขทั้งสองเป็นจริงเท่านั้น จะไม่จริงหากมีเพียงเงื่อนไขเดียวที่เป็นจริง ดังนั้น ถ้าหิว แต่ยังไม่ได้กินผัก ก็ไม่ได้กินของหวาน

ในทำนองเดียวกัน ถ้าเราพูดว่า “ไปเล่นสวนสนุกได้ถ้าเป็นวันหยุดสุดสัปดาห์ หรือคุณจะลาพักร้อนประจำปีก็ได้” เราจะใช้ฟังก์ชัน OR ของบูล ฟังก์ชัน OR ของบูลเป็นจริง ถ้าอย่างน้อยหนึ่งในเงื่อนไขเป็นจริง ไม่จำเป็นต้องทั้งสองเงื่อนไขเป็นจริง เหมือนกับฟังก์ชัน AND เลย ดังนั้น ถ้าไม่ใช่วันหยุดสุดสัปดาห์ แต่อย่างไรก็ตาม คุณได้จองลาพักร้อนประจำปีไว้แล้ว คุณก็สามารถไปเล่นสวนสนุกได้

ถ้าเราย้อนกลับไปดูตอนที่เราเรียนรู้เกี่ยวกับฟังก์ชันครั้งแรก เราจะเห็นว่าฟังก์ชันเป็นเหมือนเครื่องจักรที่รับข้อมูลเข้า ทำอะไรบางอย่างกับข้อมูลนั้น แล้วจึงส่งผลลัพธ์ออกมา ฟังก์ชันตรรกะบูลโดยทั่วไปรับข้อมูลเข้า 2 ตัว และส่งผลลัพธ์ออกมา 1 ตัว

คอมพิวเตอร์มักแทนค่าความจริงด้วยตัวเลข 1 และความเท็จด้วยตัวเลข 0 ตารางต่อไปนี้แสดงฟังก์ชัน AND และ OR แบบตรรกะโดยใช้สัญกรณ์แบบย่อนี้สำหรับทุกการผสมของข้อมูลเข้า A และ B

คุณมองเห็นได้ชัดเจนเลยว่า ฟังก์ชัน AND จะเป็นจริง เฉพาะเมื่อ A และ B เป็นจริงทั้งคู่ เช่นเดียวกัน คุณจะเห็นว่า OR จะเป็นจริงเมื่อใดก็ตามที่ A หรือ B (อย่างน้อยหนึ่งตัว) เป็นจริง

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

ลองนึกภาพการใช้ตัวจำแนกเชิงเส้นอย่างง่ายเพื่อเรียนรู้จากข้อมูลการฝึกอบรมว่าข้อมูลนั้นถูกควบคุมโดยฟังก์ชันตรรกะแบบบูลหรือไม่ นั่นเป็นสิ่งที่เป็นธรรมชาติและมีประโยชน์สำหรับนักวิทยาศาสตร์ที่ต้องการค้นหาจุดเชื่อมโยงเชิงสาเหตุหรือความสัมพันธ์ระหว่างข้อสังเกตบางอย่างกับข้อสังเกตอื่นๆ ตัวอย่างเช่น มีโรคมาลาเรียมากขึ้นเมื่อฝนตกและร้อนกว่า 35 องศาหรือไม่? มีโรคมาลาเรียมากขึ้นเมื่อเงื่อนไขใดข้อหนึ่ง (Boolean OR) เป็นจริงหรือไม่?

กราฟด้านล่างนี้ ซึ่งแสดงข้อมูลเข้าสองตัว A และ B ของฟังก์ชันตรรกะเป็นพิกัดบนกราฟ กราฟแสดงให้เห็นว่าเฉพาะเมื่อทั้งคู่เป็นจริง โดยมีค่าเป็น 1 ผลลัพธ์ก็จะเป็นจริงเช่นกัน แสดงเป็นสีเขียว ผลลัพธ์ที่เป็นเท็จจะแสดงเป็นสีแดง

คุณจะสังเกตเห็นเส้นตรงที่แบ่งพื้นที่สีแดงออกจากพื้นที่สีเขียว เส้นตรงนั้นคือฟังก์ชันเชิงเส้นที่ตัวจำแนกเชิงเส้นสามารถเรียนรู้ได้ เช่นเดียวกับที่เราทำมาก่อนหน้านี้

เราจะไม่ลงรายละเอียดการคำนวณเชิงตัวเลขเหมือนที่เคยทำมาก่อน เนื่องจากตัวอย่างนี้ไม่ได้มีอะไรแตกต่างในหลักการจากที่ผ่านมา

จริงๆ แล้ว มีเส้นแบ่งแบบนี้หลากหลายรูปแบบที่สามารถทำงานได้ดีเท่ากัน แต่ประเด็นสำคัญคือเป็นไปได้จริงที่ตัวจำแนกเชิงเส้นอย่างง่ายในรูปแบบ y = ax + b จะสามารถเรียนรู้ฟังก์ชัน AND แบบบูลได้

คราวนี้ลองดูฟังก์ชัน OR แบบบูล ที่พล็อตในลักษณะเดียวกัน

คราวนี้เฉพาะจุด (0,0) เท่านั้นที่เป็นสีแดง เนื่องจากมันสอดคล้องกับกรณีที่ทั้ง A และ B เป็นเท็จ ส่วนคู่ข้อมูลเข้าที่เหลือทั้งหมดจะมี A หรือ B อย่างใดอย่างหนึ่งเป็นจริง ดังนั้นผลลัพธ์จึงเป็นจริง ความสวยงามของแผนภาพนี้คือมันแสดงให้เห็นได้ชัดเจนว่า เป็นไปได้ที่ตัวจำแนกเชิงเส้นจะสามารถเรียนรู้ฟังก์ชัน OR แบบบูลได้เช่นกัน

มีฟังก์ชันบูลีนอีกตัวหนึ่งเรียกว่า XOR ย่อมาจาก eXclusive OR ซึ่งมีเอาต์พุตเป็นจริงก็ต่อเมื่อข้อมูลเข้า A หรือ B อย่างใดอย่างหนึ่งเป็นจริง แต่ไม่ใช่ทั้งสองอย่าง นั่นก็คือเมื่อข้อมูลเข้าเป็นเท็จทั้งคู่ หรือเป็นจริงทั้งคู่ ผลลัพธ์จะเป็นเท็จ ตารางต่อไปนี้สรุปข้อมูลนี้:

คราวนี้ลองมาพล็อตสมการเส้นตรง ของ XOR โดยสีเขียว คือเป็นจริง และสีแดงคือเป็นเท็จ

นี่เป็นเรื่องท้าทาย! เพราะจะเห็นได้ว่าเราไม่สามารถแยกพื้นที่สีแดงออกจากพื้นที่สีน้ำเงินด้วยเส้นแบ่งตรงเพียงเส้นเดียวได้

อันที่จริง มันเป็นไปไม่ได้เลยที่จะมีเส้นตรงเพียงเส้นเดียวที่สามารถแบ่งแยกพื้นที่สีแดงออกจากพื้นที่สีเขียวสำหรับตรรกะแบบ XOR ได้ นั่นหมายความว่า ตัวจำแนกเชิงเส้นแบบธรรมดาไม่สามารถเรียนรู้ตรรกะแบบ XOR ได้ ถ้าถูกนำเสนอด้วยข้อมูลฝึกอบรมที่ควบคุมโดยฟังก์ชัน XOR

เราเพิ่งแสดงให้เห็นถึงข้อจำกัดที่สำคัญของตัวจำแนกเชิงเส้นแบบธรรมดา ตัวจำแนกเชิงเส้นแบบธรรมดานั้นไม่มีประโยชน์ หากปัญหาพื้นฐานไม่สามารถแยกออกจากกันด้วยเส้นตรงได้

Neural Network จะเข้ามาแก้ปัญหานี้ ซึ่ง Neural Network มีประโยชน์สำหรับงานจำนวนมากที่ไม่สามารถแยกออกจากกันโดยใช้สมการเชิงเส้นได้ ซึ่งเส้นตรงเส้นเดียวไม่สามารถช่วยได้

ดังนั้นเราจะต้องแก้ไข

โชคดีที่การแก้ไขไม่ยากนัก จากภาพด้านล่างจะเห็นได้ว่า เราสามารถใช้เส้นตรง 2 เส้นในการแยกแต่ละส่วนได้ ในเมื่อไม่สามารถตัวจำแนกตัวเดียวเพื่อทำงานได้ เราจะใช้ตัวจำแนกหลายตัวทำงานร่วมกัน นี่เป็นแนวคิดหลักของ Neural Network คุณสามารถจินตนาการได้แล้วว่าเส้นตรงหลายเส้นสามารถเริ่มแบ่งแยกแม้กระทั่งบริเวณรูปทรงแปลก ๆ เพื่อการจำแนกประเภทได้

ก่อนที่เราจะเจาะลึกไปสู่การสร้างเครือข่ายประสาทเทียมที่ประกอบด้วยตัวจำแนกจำนวนมากทำงานร่วมกัน ลองย้อนกลับไปยังธรรมชาติและพิจารณาสมองของสัตว์ที่เป็นแรงบันดาลใจให้กับแนวทางเครือข่ายประสาทเทียมกันก่อน

Neurons, Nature’s Computing Machines

ขอพูดถึงความลึกลับของสมองสัตว์ ที่แม้กระทั่งสมองของสิ่งมีชีวิตตัวเล็กๆ อย่างนกพิราบ ก็ยังมีความสามารถเหนือกว่าคอมพิวเตอร์ดิจิทัลอย่างมาก แม้คอมพิวเตอร์จะมีชิ้นส่วนอิเล็กทรอนิกส์จำนวนมหาศาล พื้นที่จัดเก็บข้อมูลมหาศาล และทำงานด้วยความเร็วสูงกว่าสมองธรรมชาติที่เป็นเนื้ออ่อนนุ่มนิ่มก็ตาม แต่ก็ยังทำงานสู้สมองนกพิราบไม่ได้

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

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

มาดูโครงสร้างพื้นฐานของสมองกัน เซลประสาทมีชื่อเรียกว่า Neural

แม้จะมีเซลล์ประสาท (นิวรอน) หลากหลายรูปแบบ แต่พวกมันทั้งหมดต่างส่งสัญญาณไฟฟ้าจากปลายด้านหนึ่งไปอีกด้านหนึ่ง เริ่มจากเส้นใยรับสัญญาณ (เดนไดรต์) ไปตามเส้นใยส่งสัญญาณ (แอ็กซอน) และสิ้นสุดที่ปลายประสาท สัญญาณเหล่านี้จะถูกส่งต่อจากนิวรอนหนึ่งไปยังอีกนิวรอน

นี่คือวิธีที่ร่างกายรับรู้แสง เสียง สัมผัส ความร้อน และอื่นๆ สัญญาณจากเซลล์ประสาทรับสัมผัสเฉพาะทางจะถูกส่งผ่านระบบประสาทไปยังสมองของคุณ ซึ่งส่วนใหญ่ก็ประกอบด้วยเซลล์ประสาทเช่นกัน

รูปนี้เป็นภาพร่างเส้นประสาทในสมองนกพิราบ วาดโดยนักประสาทวิทยาชาวสเปนเมื่อปี 1889 คุณจะเห็นส่วนสำคัญ ๆ ได้แก่ เดนไดรต์ (เส้นใยรับสัญญาณ) และปลายประสาท

จำนวนเซลล์ประสาท (นิวรอน) ที่จำเป็นสำหรับงานที่ซับซ้อนและน่าสนใจนั้น ขึ้นอยู่กับอะไรบ้าง?

สมองมนุษย์อันทรงพลังของเรามีเซลล์ประสาทประมาณ 100 พันล้านเซลล์เลยทีเดียว! ในขณะที่แมลงวันผลไม้นั้นมีเซลล์ประสาทเพียงแค่ 100,000 เซลล์ แต่พวกมันก็สามารถบิน กินอาหาร หลบหนีอันตราย หาอาหาร และทำอีกหลายอย่างที่ค่อนข้างซับซ้อนได้ ซึ่งจำนวนเซลล์ประสาท 100,000 เซลล์ นั้นอยู่ในขอบเขตที่คอมพิวเตอร์สมัยใหม่สามารถจำลองได้

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

อะไรคือเคล็ดลับ?

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

มาดูกันดีกว่าว่าเซลล์ประสาททำงานอย่างไร เซลล์ประสาทรับสัญญาณไฟฟ้าเป็นอินพุต แล้วปล่อยสัญญาณไฟฟ้าอีกอันเป็นเอาท์พุต ดูคล้ายกับเครื่องจักรที่ทำนายหรือจำแนกประเภทที่เราศึกษากันไปก่อนหน้านี้เลย ซึ่งรับอินพุต เข้าสู่กระบวนการประมวลผล แล้วปล่อยผลลัพธ์ออกมา

แน่นอน เราไม่สามารถแสดงเซลล์ประสาทเป็นฟังก์ชันเชิงเส้นได้ง่ายๆ เหมือนที่เราเคยทำ

นั่นเพราะเซลล์ประสาทในทางชีววิทยาไม่ได้มีรูปแบบเอาท์พุตเป็นเพียงแค่ฟังก์ชันเชิงเส้นของอินพุตเท่านั้น กล่าวอีกนัยหนึ่ง ผลลัพธ์ของเซลล์ประสาทจะไม่อยู่ในรูปของ ผลลัพธ์ = (ค่าคงที่ * อินพุต) + (ค่าคงที่อีกตัว)

ข้อมูลชี้ให้เห็นว่าเซลล์ประสาทไม่ได้ตอบสนองง่าย ๆ แต่จะระงับสัญญาณไว้จนกว่าสัญญาณจะแรงมากพอที่จะกระตุ้นให้เกิดสัญญาณออก สิ่งนี้เหมือนกับการมีขอบเขตของการเริ่มทำงาน (threshold) ที่ต้องถึงก่อนจึงจะผลิตสัญญาณใด ๆ ออกมา เหมือนน้ำในแก้ว น้ำจะไม่ล้นออกมาก่อนจนกว่าจะเต็มแก้ว การทำงานแสดงตามรูป

ฟังก์ชันที่รับสัญญาณเข้าและสร้างสัญญาณออกโดยคำนึงถึงขีดเริ่มทำงาน เรียกว่าฟังก์ชันกระตุ้น (activation function) ในทางคณิตศาสตร์ มีฟังก์ชันกระตุ้นหลายอย่างที่ทำให้เกิดผลนี้ได้ ฟังก์ชันขั้นบันได (step function) อย่างง่ายคือหนึ่งในตัวอย่างที่สามารถทำงานในลักษณะนี้ได้

ใช่แล้ว สำหรับค่าอินพุตที่ต่ำ ผลลัพธ์จะเท่ากับศูนย์ แต่เมื่อถึงระดับสัญญาณที่เกินขีดเริ่มทำงาน ผลลัพธ์จะกระโดดขึ้นทันที เซลล์ประสาทประดิษฐ์ที่ทำงานแบบนี้จะคล้ายกับเซลล์ประสาทในธรรมชาติจริงๆ นักวิทยาศาสตร์ใช้คำว่า “เซลล์ประสาทยิงสัญญาณ” (fire) เมื่อสัญญาณเข้าถึงขีดเริ่มทำงาน

เราสามารถพัฒนาฟังก์ชันขั้นบันไดให้ดีขึ้น ฟังก์ชันรูปตัว S ด้านล่างนี้เรียกว่า “ฟังก์ชันซิกมอยด์” (sigmoid function) มันค่อยเป็นค่อยไปมากกว่าฟังก์ชันขั้นบันได ทำให้ดูเป็นธรรมชาติและสมจริงยิ่งขึ้น เพราะธรรมชาติมักไม่ค่อยมีเส้นแบ่งเขตที่แข็งกร้าวชัดเจน!

ฟังก์ชันซิกมอยด์รูปตัว S นี้แหละ ที่เราจะใช้ต่อไปในการสร้างเครือข่ายประสาทเทียม นักวิจัยปัญญาประดิษฐ์เองก็ใช้ฟังก์ชันอื่นๆ ที่คล้ายกัน แต่ซิกมอยด์นั้นเรียบง่ายและเป็นที่นิยมมาก

ฟังก์ชันซิกมอยด์ บางครั้งเรียกว่าฟังก์ชันโลจิสติก (logistic function) มีนิยามดังนี้

อย่าเพิ่งกลัวไปกับสมการข้างต้นนะครับ ตัว e ที่เห็นนั่นคือค่าคงที่ทางคณิตศาสตร์ที่มีค่าประมาณ 2.71828… มันเป็นตัวเลขที่น่าสนใจ ปรากฏในหลายสาขาของคณิตศาสตร์และฟิสิกส์ ส่วนที่ใส่ “…” ไว้นั้นหมายความว่าทศนิยมของมันยังดำเนินต่อไปไม่มีที่สิ้นสุด ตัวเลขประเภทนี้นี่มีชื่อเก๋ๆ ว่า “ทรานเซนเดนทัลนัมเบอร์” (transcendental numbers)

แต่สำหรับเรา แค่คิดว่า e เป็น 2.71828 ก็พอ! x คืออินพุตที่ถูกใส่เครื่องหมายลบแล้วนำไปแทนค่าในยกกำลัง e ผลลัพธ์ที่ได้บวกกับ 1 กลายเป็น 1 + e^x สุดท้ายคือการหาอินเวอร์สของทั้งหมด นั่นคือการหาร 1 ด้วย 1 + e^x

นั่นคือสิ่งที่ฟังก์ชันข้างบนทำกับอินพุต x เพื่อให้ได้ค่าเอาท์พุต y ไม่น่ากลัวอย่างที่คิดใช่มั้ยล่ะ!

  • เมื่อ x เป็นศูนย์ e^x จะมีค่าเท่ากับ 1 เนื่องจากอะไรก็ตามที่ยกกำลัง 0 จะมีค่าเท่ากับ 1
  • ดังนั้น y จะกลายเป็น 1 / (1 + 1) หรือ 1/2
  • สรุปได้ว่า ฟังก์ชันซิกมอยด์พื้นฐานตัดแกน y ที่จุด y = 1/2

มีอีกเหตุผลสำคัญมาก ๆ ที่เราเลือกใช้ฟังก์ชันซิกมอยด์เหนือฟังก์ชันรูป S อื่น ๆ มากมายในการคำนวณผลลัพธ์ของเซลล์ประสาทเทียม นั่นคือการคำนวณของฟังก์ชันซิกมอยด์นั้นง่ายกว่าฟังก์ชันรูป S อื่น ๆ เยอะเลย! เราจะเห็นประโยชน์ของข้อดีนี้ชัดเจนขึ้นเมื่อลงมือสร้างเครือข่ายประสาทเทียมจริง ๆ

เพราะในการสร้างเครือข่ายประสาทเทียมที่มีเซลล์ประสาทจำนวนมาก ๆ นั้น ต้องมีการคำนวณซ้ำ ๆ หลายล้านครั้ง ดังนั้นการใช้ฟังก์ชันที่คำนวณง่ายอย่างซิกมอยด์จึงช่วยประหยัดเวลาและพลังงานในการประมวลผลได้อย่างมหาศาล

มาต่อเรื่องเซลล์ประสาทกันดีกว่า คราวนี้ลองคิดว่าเราจะสร้างแบบจำลองเซลล์ประสาทเทียมขึ้นมายังไง

สิ่งแรกที่ต้องเข้าใจคือ เซลล์ประสาทในธรรมชาติรับสัญญาณเข้าเป็นจำนวนมาก ไม่ใช่แค่แค่สัญญาณเดียว เหมือนกับที่เราเพิ่งเห็นเครื่องจักรตรรกะแบบบูลีนที่มีสองอินพุต ดังนั้น แนวคิดที่มีอินพุตมากกว่าหนึ่งไม่ใช่เรื่องแปลกหรือใหม่เลย

แล้วเราจะจัดการกับอินพุตมากมายเหล่านี้ยังไง? ก็แค่เอามารวมกันด้วยการบวกเข้าด้วยกันไง! ผลรวมที่ได้จะกลายเป็นอินพุตสำหรับฟังก์ชันซิกมอยด์ ซึ่งควบคุมผลลัพธ์ที่ออกมา เป็นวิธีที่สะท้อนการทำงานของเซลล์ประสาทจริง ๆ ภาพข้างล่างนี้อธิบายแนวคิดการรวมอินพุตแล้วใช้ขีดเริ่มทำงานกับผลรวมที่ได้:

ถ้าสัญญาณรวมกันไม่แรงพอ ผลของฟังก์ชันขีดเริ่มทำงานแบบซิกมอยด์จะทำให้สัญญาณออกถูกระงับไว้ แต่ถ้าผลรวม x ของอินพุตมากพอ เอฟเฟกต์ของซิกมอยด์จะ “ยิง” เซลล์ประสาทให้ทำงาน

ที่น่าสนใจคือ แม้จะมีเพียงอินพุตเดียวเท่านั้นที่แรง และอินพุตอื่นๆ เล็กน้อย มันก็อาจเพียงพอที่จะกระตุ้นเซลล์ประสาทให้ทำงานได้ นอกจากนี้ เซลล์ประสาทยังสามารถทำงานได้แม้ว่าอินพุตบางตัวจะเกือบแรงพอที่จะกระตุ้นแต่ละตัวไม่สำเร็จ แต่เมื่อรวมกันแล้ว สัญญาณก็แรงพอที่จะผ่านขีดเริ่มทำงาน

แนวคิดนี้สะท้อนให้เห็นถึงการทำงานที่ซับซ้อนและยืดหยุ่นกว่าของเซลล์ประสาทเทียม เพราะมันสามารถรวมสัญญาณจากอินพุตต่างๆ เพื่อให้ได้ผลลัพธ์ สื่อให้เห็นถึงการคำนวณแบบ “ฟัซซี” ในระดับหนึ่ง

สัญญาณจะรวบรวมโดย เดนไดรต์ (Dendrites) และรวมกันเพื่อสร้างสัญญาณที่แรงขึ้น หากสัญญาณแรงมากพอที่จะผ่าน threshold เซลล์ประสาทจะยิงสัญญาณออกจาก แอกซอน (Axon) เพื่อไปสู่ เดนไดรต์ ตัวถัดไป รูปด้านล่างนี้แสดงการเชื่อมโยงของเซลล์ประสาท

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

คุณจะเห็นได้ว่ามีส่วนประกอบสามชั้น แต่ละชั้นมีนิวรอนหรือโหนดสามโหนด นอกจากนี้ คุณยังสามารถเห็นว่าแต่ละโหนดเชื่อมต่อกับทุกโหนดในชั้นก่อนหน้าและชั้นถัดไป

เยี่ยมมาก! แต่ส่วนไหนของสถาปัตยกรรมสุดเจ๋งนี้ที่ทำการเรียนรู้? แล้วเราปรับอะไรเพื่อตอบสนองต่อตัวอย่างการฝึกอบรม? มีพารามิเตอร์ที่เราสามารถปรับแต่งได้เหมือนความชันของตัวแบ่งประเภทเชิงเส้นที่เราเห็นไปก่อนหน้านี้หรือไม่?

สิ่งที่ชัดเจนที่สุดคือ สามารถปรับความแรง ของแต่ละการเชื่อมต่อระหว่างโหนดต่างๆ นอกจากนั้นภายในโหนด ยังสามารถปรับสัดส่วนของแต่ละอินพุต รวมถึงสามารถปรับรูปแบบของฟังก์ชันซิกมอยด์ได้ด้วย แต่จะซับซ้อนกว่าการปรับความแรงของการเชื่อมต่อระหว่างโหนดต่างๆ เพียงอย่างเดียว

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

“ตัวเลขเล็กๆ ข้างๆ สัญลักษณ์น้ำหนัก อาจจะดูแปลก แต่มันมีความหมายนะ! w 2,3 คือน้ำหนักของสัญญาณที่เดินทางระหว่างโหนด 2 ในชั้นหนึ่ง ไปยังโหนด 3 ในชั้นถัดไป ส่วน w 1,2 คือน้ำหนักที่ลดทอนหรือขยายสัญญาณระหว่างโหนด 1 กับโหนด 2 ในชั้นถัดไป ภาพนี้แสดงการไหลของสัญญาณระหว่างชั้นที่หนึ่งกับสอง ด้วยการเน้นเชื่อมต่อสองเส้นนี้ ช่วยให้เห็นภาพชัดเจนขึ้น

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

หมายว่าว่าอย่างไร? ในเครือข่ายประสาทเทียม ขณะที่มันเรียนรู้และปรับปรุงผลลัพธ์ด้วยการปรับน้ำหนักเชื่อมภายในเครือข่าย น้ำหนักบางตัวจะกลายเป็นศูนย์หรือใกล้เคียงศูนย์ สิ่งนี้หมายความว่าการเชื่อมต่อเหล่านั้นไม่ส่งผลต่อเครือข่ายอีกต่อไป เพราะสัญญาณไม่ไหลผ่าน เชื่อมต่อที่น้ำหนักเป็นศูนย์เปรียบเหมือนถูกตัดขาด เนื่องจากสัญญาณที่ไหลผ่านถูกคูณด้วยศูนย์ ผลลัพธ์จึงเป็นศูนย์

Following Signals Through A Neural Network

เห็นภาพเครือข่ายประสาทเทียม 3 ชั้น ที่เซลล์ประสาททุกตัวเชื่อมกับทุกเซลล์ในชั้นถัดไปและชั้นก่อนหน้าแล้ว มันน่าสนใจ ใช่ไหมล่ะ!

แต่… แค่คิดว่าจะต้องคำนวณเส้นทางเดินของสัญญาณตั้งแต่เข้าสู่ระบบจนไปถึงผลลัพธ์ผ่านแต่ละชั้นนี่ฟังดูชวนมึนหัว แล้วก็… เหมือนงานหินเลยแหละ!

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

ให้เราลองจินตนาการว่าอินพุตสองตัวคือ 1.0 และ 0.5 รูปต่อไปนี้แสดงอินพุตเหล่านี้เข้าสู่เครือข่ายประสาทเทียมขนาดเล็กนี้

เช่นเดียวกับก่อนหน้านี้ แต่ละโหนดจะแปลงผลรวมของอินพุตให้เป็นเอาต์พุตโดยใช้ฟังก์ชันกระตุ้น (Activation Function) เราจะใช้ฟังก์ชันซิกมอยด์ y = 1 / (1 + e^-x ) โดยที่ x เป็น ผลรวมของสัญญาณขาเข้า ไปยังเซลล์ประสาท และ y คือเอาต์พุตของเซลล์ประสาทนั้น

มาถึงเรื่องน้ำหนักเชื่อมกันแล้วสินะ! คำถามดีมาก ว่าเราควรเริ่มต้นด้วยค่าอะไรดี ลองนึกถึงน้ำหนักแบบสุ่มๆ ดูสิ เช่น

● w 1,1 = 0.9
● w 1,2 = 0.2
● w 2,1 = 0.3
● w 2,2 = 0.8

การเริ่มต้นด้วยค่าสุ่มไม่ใช่ความคิดที่แย่อะไร อันที่จริง มันคือสิ่งที่เราทำตอนเลือกค่าความชันเริ่มต้นสำหรับตัวจำแนกประเภทเชิงเส้นแบบง่ายๆ ก่อนหน้านี้ด้วยซ้ำ จำได้มั้ยว่าค่าสุ่มนั้นค่อยๆ ได้รับการปรับปรุงให้ดีขึ้นเรื่อยๆ จากการที่ตัวจำแนกประเภทเรียนรู้ตัวอย่างใหม่ๆ หลักการเดียวกันนี้ก็น่าจะใช้ได้กับน้ำหนักเชื่อมของเครือข่ายประสาทเทียมเช่นกัน

เครือข่ายประสาทเทียมขนาดเล็กนี้มีน้ำหนักเชื่อมเพียงสี่ตัวเท่านั้น เนื่องจากเป็นจำนวนรวมของทุกการเชื่อมต่อระหว่างโหนดทั้งสองในแต่ละชั้น ภาพต่อไปนี้แสดงตัวเลขทั้งหมดที่เราได้ทำการกำหนดไว้:

มาเริ่มต้นคำนวณกัน

ชั้นแรกของโหนดคือชั้นอินพุต ซึ่งไม่มีหน้าที่อะไรนอกจากรับสัญญาณอินพุต กล่าวอีกนัยหนึ่ง โหนดอินพุตจะไม่นำฟังก์ชันการกระตุ้นไปใช้กับอินพุต ไม่มีเหตุผลพิเศษอะไรมากไปกว่านั้น สรุปว่าชั้นแรกของเครือข่ายประสาทเทียมคือชั้นอินพุต และสิ่งที่ชั้นนี้ทำคือแสดงอินพุตเท่านั้น

ชั้นอินพุตแรก 1 นั้นง่าย ไม่จำเป็นต้องมีการคำนวณใดๆ

ถัดไปคือเลเยอร์ที่สอง ซึ่งเราจำเป็นต้องคำนวณ สำหรับแต่ละโหนดในเลเยอร์นี้ เราต้องคำนวณผลรวมของอินพุตทุกตัวที่คูณกับค่าน้ำหนักของแต่ละเส้นทาง จากนั้นจึงนำเข้าสู่ฟังก์ชันซิกมอยด์ y = 1 / (1 + e ^ -x) จึงจะได้เป็นผลลัพธ์ของเลเยอร์ที่สอง แผนภาพข้างล่างนี้แทนการทำงานของแต่ละโหนด ซึ่งเหมือนกับแผนภาพก่อนหน้านี้ แต่แสดงให้เห็นถึงการทำงานที่ประกอบด้วย ผลรวมของอินพุตทุกตัวที่คูณกับค่าน้ำหนักของแต่ละเส้นทาง และผ่านฟังก์ชันซิกมอยด์ จึงจะได้เป็นเอาท์พุต

เอาละ! เราจะโฟกัสไปที่โหนด 1 ในเลเยอร์ 2 ก่อน ทั้งสองโหนดในเลเยอร์อินพุตแรกเชื่อมต่อกับมัน โหนดอินพุตเหล่านั้นมีค่า 1.0 และ 0.5 ลิงค์จากโหนดแรกมีค่าน้ำหนัก 0.9 ลิงค์จากโหนดที่สองมีค่าน้ำหนัก 0.3 ดังนั้นผลรวมของอินพุตที่ปรับแล้วคือ:

x = (เอาท์พุตจากโหนดแรก * ค่าน้ำหนักของเส้นทาง) + (เอาท์พุตจากโหนด 2 * ค่าน้ำหนักของเส้นทาง)
x = (1.0 * 0.9) + (0.5 * 0.3)
x = 0.9 + 0.15
x = 1.05

ถ้าเราไม่ปรับค่าของอินพุต จะมีเพียงการบวกสัญญาณแบบง่ายๆ คือ 1.0 + 0.5 แต่เราไม่ต้องการแบบนั้น การปรับค่าน้ำหนักต่างหากที่ทำให้เกิดการเรียนรู้ในเครือข่ายประสาทเทียม เนื่องจากหากค่าน้ำหนักเหล่านี้ได้รับการปรับแต่งอย่างต่อเนื่อง จะทำให้ผลลัพธ์ดีขึ้นเรื่อยๆ เรามาลองดูกันต่อไป

เมื่อได้ค่า x = 1.05 มาแล้วสำหรับผลรวมอินพุตที่เข้าสู่โหนดแรกของเลเยอร์ที่สอง จากนั้นเราสามารถคำนวณเอาต์พุตของโหนดโดยใช้ฟังก์ชันกระตุ้น y = 1 / (1 + e^-x) สามารถใช้เครื่องคิดเลขในการคำนวณได้ คำตอบคือ y = 1 / (1 + 0.3499) = 1 / 1.3499 ดังนั้น y = 0.7408

เยี่ยมมาก! ตอนนี้เราได้เอาต์พุตจริงจากหนึ่งในสองโหนดเอาต์พุตของเครือข่ายแล้ว ลองคำนวณอีกครั้งกับโหนดที่เหลือซึ่งเป็นโหนด 2 ในชั้นที่สอง อินพุตที่ปรับรวม x คือ

x = (เอาท์พุตจากโหนดแรก * ค่าน้ำหนักของเส้นทาง) + (เอาท์พุตจากโหนด 2 * ค่าน้ำหนักของเส้นทาง)
x = (1.0 * 0.2) + (0.5 * 0.8)
x = 0.2 + 0.4
x = 0.6

ได้ค่า x แล้ว ตอนนี้เราสามารถคำนวณเอาต์พุตของโหนด 2 ของชั้นที่ 2 โดยใช้ฟังก์ชันกระตุ้นซิกมอยด์ y = 1 / (1 + e^-x) โดยการกดเครื่องคิดเลข เราจะได้ค่า y = 1 / (1 + 0.5488) = 1 / (1.5488) ดังนั้น y = 0.6457

แผนภาพต่อไปนี้แสดงเอาต์พุตของเครือข่ายที่เราเพิ่งคำนวณไป

นั่นเป็นงานหนักพอสมควรเลยนะ แค่เพื่อจะได้เอาต์พุตสองอันจากเครือข่ายที่เรียบง่ายมากเท่านั้นเอง ถ้าเป็นเครือข่ายที่ใหญ่กว่านี้คงไม่อยากคำนวณด้วยมือเลย! โชคดีที่คอมพิวเตอร์เหมาะมากสำหรับการคำนวณมากมายอย่างรวดเร็วและไม่เบื่อ

ใช่แล้ว ถึงแม้เราจะคำนวณผลลัพธ์สำหรับเครือข่ายสองชั้นด้วยมือได้แล้ว แต่ถ้าจะให้เขียนโปรแกรมคำนวณสำหรับเครือข่ายขนาดใหญ่ที่มีชั้นมากกว่า 2 ชั้น มีโหนดในแต่ละชั้นเป็น 4, 8 หรือแม้กระทั่ง 100 กว่าโหนด คงเป็นเรื่องน่าเบื่อและมีโอกาสผิดพลาดสูง แค่เขียนโค้ดสำหรับโหนดและชั้นทั้งหมดก็เหนื่อยแล้ว ยังไม่ต้องพูดถึงการคำนวณอีก

โชคดีที่คณิตศาสตร์ช่วยให้เราสร้างการคำนวณสำหรับเอาต์พุตของเครือข่ายประสาทเทียมได้อย่างกระชับ แม้จะมีเลเยอร์และโหนดมากมาย ความกระชับนี้ไม่เพียงแค่ดีสำหรับมนุษย์อย่างเรา แต่ยังเยี่ยมยอดสำหรับคอมพิวเตอร์ด้วย เพราะคำสั่งจะสั้นกว่าและประมวลผลได้มีประสิทธิภาพกว่าด้วย

คณิตศาสตร์ที่เราจะนำมาใช้เพื่อให้การทำงานที่เร็วขึ้น คือ เมทริกซ์ ซึ่งเราจะมาดูกันต่อไป

Matrix Multiplication is Useful .. Honest!

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

ก่อนหน้านี้ เราได้ลองคำนวณผลลัพธ์ของโครงข่ายประสาทเทียมแบบสองชั้นที่มีเพียงสองโหนดในแต่ละชั้นด้วยตนเอง ซึ่งนั่นก็ถือว่าเป็นงานที่ต้องอาศัยความพยายามพอสมควรแล้ว แต่ลองนึกภาพดูว่า หากเราต้องทำแบบเดียวกันนี้สำหรับโครงข่ายประสาทเทียมที่มีถึงห้าชั้นและโหนดละร้อยโหนดล่ะ เพียงแค่เขียนการคำนวณที่จำเป็นทั้งหมดออกมา ก็คงจะเป็นงานใหญ่โตเลยทีเดียว… การผสมผสานสัญญาณทั้งหมดเข้าด้วยกัน การคูณด้วยน้ำหนักที่เหมาะสม การใช้ฟังก์ชันกระตุ้นซิกมอยด์ สำหรับแต่ละโหนดในแต่ละชั้น … คิดแล้วก็เหนื่อยแทนเลย!

แล้วเมทริกซ์จะช่วยอะไรเราได้บ้าง? เมทริกซ์ช่วยเราสองทางครับ อย่างแรก มันช่วยย่นย่อการเขียนคำนวณที่ยืดยาวให้กลายเป็นรูปแบบสั้น ๆ ง่าย ๆ ซึ่งดีกับพวกเราชาวมนุษย์ เพราะเราไม่ชอบทำอะไรที่ดูน่าเบื่อ และยังมีแนวโน้มที่จะทำพลาดอีกต่างหาก ประโยชน์ที่สองคือ ภาษาโปรแกรมคอมพิวเตอร์หลายภาษานั้นเข้าใจการทำงานกับเมทริกซ์ และเนื่องจากการคำนวณจริง ๆ นั้นเป็นงานซ้ำ ๆ ภาษาโปรแกรมจึงสามารถรับรู้รูปแบบและทำมันได้อย่างรวดเร็วและมีประสิทธิภาพ

สรุปแล้ว เมทริกซ์ช่วยให้เราแสดงการคำนวณที่เราต้องทำอย่างกระชับและง่ายดาย และคอมพิวเตอร์สามารถคำนวณผลลัพธ์ได้อย่างรวดเร็วและมีประสิทธิภาพ

ตอนนี้เรารู้แล้วว่าทำไมเราถึงต้องเรียนรู้เมทริกซ์ มาเริ่มกันเลยดีกว่า รับรองว่าผมจะอธิบายให้ชัดเจน

เมทริกซ์เป็นเพียงตาราง ตารางสี่เหลี่ยมจัตุรัส ของตัวเลขเท่านั้น นั่นแหละ ไม่มีอะไรที่ซับซ้อนไปกว่านั้น

หากคุณเคยใช้โปรแกรมสเปรดชีตมาก่อน ก็น่าจะคุ้นเคยกับการทำงานกับตัวเลขที่จัดเรียงอยู่ในตารางอยู่แล้ว ซึ่งบางคนอาจเรียกว่าตาราง แต่เราก็สามารถเรียกมันว่าเมทริกซ์ได้ด้วยเช่นกัน

นั่นคือเมทริกซ์ ตารางหรือตารางตัวเลข เช่นเดียวกับตัวอย่างเมทริกซ์ขนาด “2 x 3” ต่อไปนี้

ตามธรรมเนียมแล้ว เรามักจะระบุจำนวนแถวก่อนจำนวนคอลัมน์ ดังนั้น เมทริกซ์นี้จึงไม่ใช่เมทริกซ์ขนาด “3 x 2” แต่เป็นเมทริกซ์ขนาด “2 x 3”

ยังมีอีกเรื่องครับ บางคนใช้วงเล็บเหลี่ยม [ ] ครอบเมทริกซ์ ในขณะที่บางคนใช้วงเล็บธรรมดา ( ) เหมือนที่เราใช้นี้ ทั้งสองแบบสามารถใช้ได้ ขึ้นอยู่กับความนิยมและความเหมาะสม

อันที่จริง ข้อมูลในเมทริกซ์ไม่จำเป็นต้องเป็นตัวเลขเสมอไป แต่อาจเป็นข้อมูลที่เราตั้งชื่อไว้ โดยยังไม่ได้มีการกำหนดค่าตัวเลขที่แท้จริงก็ได้ เมทริกซ์ต่อไปนี้จึงเป็นเมทริกซ์ที่แต่ละสมาชิกเป็นตัวแปรที่สามารถมีค่าเป็นตัวเลขได้ แต่เรายังไม่ได้กำหนดค่าตัวเลขให้ในตอนนี้

เมทริกซ์ที่เกี่ยวกับเครือข่ายประสาทเทียม มักจะใช้การคูณเมทริกซ์ ซึ่งเราเรียนกันมาแล้วสมัยมัธยม แต่หากใครจำไม่ได้ จะอธิบายอีกครั้ง

จะเห็นว่า เราไม่ได้คูณสมาชิกของเมทริกซ์ ในตำแหน่งที่ตรงกัน ตัวอย่างเช่น สมาชิกบนซ้ายของคำตอบไม่ได้เป็น 1 x 5 และสมาชิกล่างขวาก็ไม่ได้เป็น 4 x 8

การคูณเมทริกซ์ใช้วิธีการเฉพาะ ถ้าสังเกตจากภาพด้านบนก็อาจจะพอเข้าใจได้ แต่ถ้ายังไม่เข้าใจ ให้ลองดูตัวอย่างต่อไปนี้ ซึ่งแสดงให้เห็นว่าสมาชิกบนซ้ายของคำตอบคำนวณอย่างไร

สังเกตว่าสมาชิกที่อยู่มุมบนซ้ายเป็นผลลัพธ์จากการคูณกันระหว่างสมาชิกในแถวบนสุดของเมทริกซ์แรกกับสมาชิกในคอลัมน์ซ้ายสุดของเมทริกซ์ที่สอง โดยไล่คูณสมาชิกไปทีละคู่ตามแถวและคอลัมน์ที่กำหนด พร้อมทั้งบวกผลคูณที่ได้ไปเรื่อยๆ ดังนั้น ในการคำนวณสมาชิกมุมบนซ้ายของผลลัพธ์ เราจะเริ่มต้นเคลื่อนไปตามแถวบนสุดของเมทริกซ์แรก ซึ่งเราจะพบเลข 1 จากนั้น เมื่อเราเริ่มเคลื่อนลงไปตามคอลัมน์ซ้ายสุดของเมทริกซ์ที่สอง เราจะพบเลข 5 เราคูณ 1 กับ 5 และเก็บผลลัพธ์ ซึ่งคือ 5 เอาไว้ จากนั้นขยับขวาไปตามแถวและลงไปตามคอลัมน์เพื่อหาเลข 2 และ 7 การคูณ 2 กับ 7 ให้ผลลัพธ์ 14 ซึ่งเราก็เก็บไว้เช่นกัน เมื่อถึงจุดนี้เป็นจุดสิ้นสุดของแถวและคอลัมน์แล้ว ดังนั้นจึงบวกตัวเลขทั้งหมดที่เราเก็บไว้ ซึ่งก็คือ 5 + 14 เท่ากับ 19 นั่นคือสมาชิกมุมบนซ้ายของเมทริกซ์ผลลัพธ์

โอ้! ผมอธิบายไปมากมายเลยนะนั้น แต่ถ้าดูจากรูปจะเข้าใจง่ายกว่าคำอธิบาย ลองทำดูอีกครั้ง รูปด้านล่างนี้แสดงวิธีการคำนวณสมาชิกมุมล่างขวา

จะเห็นได้ว่า เมื่อเราไล่ตามแถวและคอลัมน์ที่เรากำลังคำนวณ (ซึ่งในตัวอย่างนี้คือแถวที่สองและคอลัมน์ที่สอง) จะพบการคูณกันระหว่าง 3 x 6 และ 4 x 8 ซึ่งเท่ากับ 18 + 32 ได้ผลลัพธ์เป็น 50

เพื่อความสมบูรณ์ การคำนวณสมาชิกมุมล่างซ้ายสามารถทำได้โดย 3 x 5 + 4 x 7 = 15 + 28 = 43 เช่นเดียวกัน การคำนวณสมาชิกมุมบนขวาสามารถทำได้โดย 1 x 6 + 2 x 8 = 6 + 16 = 22

ต่อไปนี้เป็นการแสดงให้เห็นการทำงาน โดยใช้ตัวแปรแทนตัวเลข

นี่เป็นวิธีในการอธิบายแนวทางที่เราใช้ในการคูณเมทริกซ์ ด้วยการใช้ตัวแปร ซึ่งอาจเป็นตัวเลขใดๆ ก็ได้ เราได้ทำให้แนวทางทั่วไปในการคูณเมทริกซ์ชัดเจนยิ่งขึ้น นี่เป็นแนวทางทั่วไป เนื่องจากสามารถใช้ได้กับเมทริกซ์ที่มีขนาดต่างกันด้วย

แม้ว่าเรากล่าวว่ามันใช้ได้ผลกับเมทริกซ์ที่มีขนาดต่างกัน แต่ก็มีข้อจำกัดที่สำคัญ คือ เราจะคูณเมทริกซ์สองตัวใดๆ เมทริกซ์ทั้งสองจะต้องเข้ากันได้ คุณอาจสังเกตเห็นสิ่งนี้แล้วเมื่อไล่ตามแถวในเมทริกซ์แรก และไล่ตามคอลัมน์ในเมทริกซ์ที่สอง หากจำนวนสมาชิกในแถวไม่ตรงกับจำนวนสมาชิกในคอลัมน์ วิธีการนี้ก็จะใช้ไม่ได้ ดังนั้น คุณจึงไม่สามารถคูณเมทริกซ์ขนาด “2 คูณ 2” กับเมทริกซ์ขนาด “5 คูณ 5” ได้ ลองทำดูแล้วคุณจะเข้าใจว่าทำไมมันถึงใช้ไม่ได้ ในการคูณเมทริกซ์ จำนวนคอลัมน์ในเมทริกซ์แรกต้องเท่ากับจำนวนแถวในเมทริกซ์ที่สอง

ในหนังสือบางเล่ม จะเรียกการคูณเมทริกซ์แบบนี้เรียกว่า dot product หรือ inner product จริงๆ แล้ว มีการคูณเมทริกซ์หลายแบบ เช่น ผลคูณไขว้ (cross product) แต่ dot product เป็นเพียงรูปแบบเดียวที่เราสนใจในกรณีนี้

ทำไมเราถึงต้องลงไปในหลุมดำการคูณเมทริกซ์ที่ดูยุ่งยากและพีชคณิตที่น่ารังเกียจด้วยละ? จริงๆ แล้วมันมีเหตุผลที่ดีมาก … แต่ตอนนี้ต้องรอไปก่อน!

ลองดูสิว่าอะไรจะเกิดขึ้นถ้าเราแทนโครงข่ายประสาทเทียมของเรา ด้วยโครงสร้างแบบเมทริกซ์ โดยเมตริกซ์แรกเป็น เมทริกซ์ขนาด 2 คูณ 2 ซึ่งเก็บค่าน้ำหนัก และเมทริกซ์ที่สองเป็นเมทริกซ์ขนาด 2 คูณ 1 ซึ่งเก็บอินพุต หากเราใช้แนวทางการคูณแบบเมทริกซ์เราจะได้รูปแบบการคูณเหมือนกับก่อนหน้านี้

น่ามหัศจรรย์!

เมทริกซ์แรกบรรจุน้ำหนักระหว่างโหนดของสองชั้น ส่วนเมทริกซ์ที่สองบรรจุสัญญาณของชั้นป้อนเข้าแรก คำตอบที่เราได้จากการคูณเมทริกซ์สองตัวนี้ คือสัญญาณรวมที่ถูกปรับเข้าสู่โหนดของชั้นที่สอง ลองดูให้ดีสิ แล้วคุณจะสังเกตเห็นสิ่งนี้ โหนดแรกมี input_1 แรกที่ถูกปรับโดยน้ำหนัก w1,1 บวกกับ input_2 ที่สองที่ถูกปรับโดยน้ำหนัก w2,1 ค่าเหล่านี้คือค่าของ x ก่อนหน้าจะเข้าสู่ฟังก์ชันกระตุ้นซิกมอยด์ (sigmoid activation function)

แผนภาพต่อไปนี้แสดงสิ่งนี้อย่างชัดเจนยิ่งขึ้น

นี่มีประโยชน์มากจริงๆ!

ทำไมน่ะเหรอ? เพราะเราสามารถแสดงการคำนวณทั้งหมดที่นำไปสู่การหาค่าสัญญาณรวมที่ถูกปรับ (x) เข้าสู่แต่ละโหนดของชั้นที่สอง โดยใช้การคูณเมทริกซ์ โดยเขียนเป็นสมการได้ดังนี้:

X = W.I

โดย W คือ เมทริกซ์ของน้ำหนัก (weights), I คือ เมทริกซ์ของสัญญาณป้อนเข้า (inputs), และ X คือ เมทริกซ์ผลลัพธ์ของสัญญาณรวมที่ถูกปรับเข้าสู่ชั้นที่ 2 โดยปกติเมทริกซ์มักจะเขียนด้วยตัวอักษรหนา (bold) เพื่อแสดงให้เห็นว่าค่าเหล่านั้นเป็นเมทริกซ์ ไม่ใช่ตัวเลขเดี่ยวๆ

มาถึงตอนนี้เราไม่ต้องสนใจแล้วว่าในแต่ละชั้นจะมีกี่โหนด หากเรามีโหนดมากขึ้น เมทริกซ์ก็จะแค่ใหญ่ขึ้น วิธีการทำงานก็ยังเหมือนเดิม ไม่จำเป็นต้องเขียนอะไรให้ยาวหรือใหญ่ขึ้น เราแค่เขียน W.I เหมือนเดิม ไม่ว่า I จะมี 2 องค์ประกอบ หรือ 200 องค์ประกอบก็ตาม! การทำงานก็เหมือนเดิม

นอกจากนั้นหากภาษาโปรแกรมคอมพิวเตอร์สามารถประมวลผลเมทริกซ์ได้ ก็จะทำงานในการคำนวณ X = W.I ทั้งหมดได้โดยที่เราไม่ต้องให้เขียนคำสั่งให้คำนวณในแต่ละโหนดหรือแต่ละชั้นเลย สามารถทำงานได้โดยใช้การทำงานเดียว

ยอดเยี่ยมมากใช่มั้ยละ! ด้วยการเข้าใจการคูณเมทริกซ์เพียงเล็กน้อย ได้มอบเครื่องมืออันทรงพลังให้กับเราในการนำไปใช้กับเครือข่ายประสาทเทียมโดยไม่ต้องใช้ความพยายามมาก

คราวนี้มาต่อที่ฟังก์ชันกระตุ้น ง่ายมากและไม่ต้องการการคูณเมทริกซ์ สิ่งที่เราต้องทำคือนำฟังก์ชันซิกมอยด์ (sigmoid function) ไปใช้กับแต่ละองค์ประกอบ y = 1/(1+e^-x) ของเมทริกซ์ X เท่านั้น

ฟังดูง่ายเกินไปหรือเปล่า แต่มันก็ง่ายแหละ เพราะเราไม่ต้องรวมสัญญาณจากโหนดที่แตกต่างกัน เนื่องจากเราทำไปแล้วในขั้นตอนนี้ และคำตอบอยู่ในเมทริกซ์ X ดังที่เราได้เห็นก่อนหน้านี้ ฟังก์ชันกระตุ้นเพียงใช้เกณฑ์และบีบอัดการตอบสนองเพื่อให้เหมือนในเซลล์ประสาทชีวภาพมากขึ้น ดังนั้นผลลัพธ์สุดท้ายจากชั้นที่สองคือ

O = sigmoid ( X )

O ที่เขียนด้วยตัวอักษรหนาคือเมทริกซ์ ซึ่งประกอบด้วยเอาต์พุตทั้งหมดจากชั้นสุดท้ายของเครือข่ายประสาทเทียม

นิพจน์ X = W ∙ I ใช้ได้กับการคำนวณระหว่างชั้นหนึ่งและชั้นถัดไป หากเรามี 3 ชั้น เราก็เพียงแค่ทำการคูณเมทริกซ์อีกครั้ง โดยใช้เอาต์พุตของชั้นที่สองเป็นอินพุตของชั้นที่สาม แต่แน่นอนว่ารวมและปรับโดยใช้น้ำหนักมากขึ้น

จบกันทีกับทฤษฎีเมทริกซ์ มาลองดูกันว่ามันทำงานกับตัวอย่างจริงอย่างไร แต่คราวนี้เราจะใช้เครือข่ายประสาทเทียมที่ใหญ่ขึ้นเล็กน้อย โดยมี 3 ชั้น แต่ละชั้นมี 3 โหนด

รอบทความถัดไปนะครับ

--

--

Thana Hongsuwan
Thana Hongsuwan

Written by Thana Hongsuwan

Maker สมัครเล่น สนใจเทคโนโลยีด้าน Hardware เช่น Arduino, ESP8266, ESP32, Internet of Things, Raspberry P, Deep Learning

No responses yet