- GPT คือ Transformer ที่ผ่านการฝึกล่วงหน้าด้วยข้อมูลขนาดใหญ่ เพื่อทำนายการแจกแจงความน่าจะเป็นของชิ้นส่วนข้อความถัดไป แล้วสุ่มตัวอย่างซ้ำ ๆ จากการแจกแจงนั้นเพื่อสร้างประโยค
- โครงสร้างเดียวกันนี้ไม่ได้ใช้แค่กับการสร้างข้อความเท่านั้น แต่ยังใช้กับ การรู้จำเสียงพูด, เสียงสังเคราะห์, การสร้างภาพ และการแปลด้วย โดยที่นี่จะโฟกัสที่การทำนายโทเค็นถัดไป ซึ่งเป็นพื้นฐานของเครื่องมือแบบ ChatGPT
- ข้อความอินพุตถูกแบ่งเป็นโทเค็นและกลายเป็น เวกเตอร์ embedding จากนั้นผ่านบล็อก attention และบล็อก multilayer perceptron พร้อมซึมซับบริบทรอบข้าง
- GPT-3 มี พารามิเตอร์ 175,000 ล้านตัว อยู่ในเมทริกซ์ประมาณ 28,000 ชุด โดยเฉพาะ embedding และ unembedding อย่างละประมาณ 617 ล้านน้ำหนัก
- เวกเตอร์สุดท้ายจะผ่านเมทริกซ์ unembedding และ softmax เพื่อกลายเป็นการแจกแจงความน่าจะเป็นของโทเค็นถัดไป ส่วน temperature ใช้ปรับสมดุลระหว่างความคาดเดาได้กับความหลากหลาย
บทบาทพื้นฐานของ GPT และ Transformer
- คำสามคำใน GPT หมายถึง Generative, Pretrained, และ Transformer ตามลำดับ
- Generative หมายถึงการสร้างข้อความใหม่
- Pretrained หมายถึงการถูกฝึกด้วยข้อมูลมหาศาลก่อน แล้วจึงสามารถปรับให้เหมาะกับงานเฉพาะผ่านการฝึกเพิ่มเติมได้
- Transformer คือโครงสร้างโครงข่ายประสาทเทียมที่ถูกมองว่าเป็นสิ่งประดิษฐ์สำคัญของกระแส AI ในปัจจุบัน
- Transformer ถูกใช้ในโมเดลหลายรูปแบบ
- โมเดลที่รับเสียงเป็นอินพุตแล้วสร้างข้อความถอดเสียง
- โมเดลที่สร้างเสียงสังเคราะห์จากข้อความ
- เครื่องมือที่สร้างภาพจากคำบรรยายข้อความอย่าง DALL-E และ Midjourney
- การแปลด้วยเครื่อง ซึ่งเป็นการใช้งานดั้งเดิมของ Transformer ที่ Google แนะนำครั้งแรกในปี 2017
- รูปแบบที่กล่าวถึงที่นี่คือ โมเดลทำนายข้อความถัดไป ซึ่งเป็นพื้นฐานของเครื่องมืออย่าง ChatGPT
- รับข้อความ และในบางกรณีอาจรับภาพหรือเสียงรอบข้างด้วย แล้วทำนายสิ่งที่จะตามมา
- เอาต์พุตคือการแจกแจงความน่าจะเป็นของชิ้นส่วนข้อความต่าง ๆ ที่อาจตามมา
วิธีที่การทำนายโทเค็นถัดไปกลายเป็นการสร้างข้อความ
- การทำนายคำถัดไปกับการสร้างข้อความดูเผิน ๆ เหมือนเป็นเป้าหมายคนละอย่าง แต่ถ้าเรียกใช้โมเดลทำนายซ้ำ ๆ ก็สามารถสร้างข้อความยาวได้
- ป้อนข้อความเริ่มต้นเข้าไป
- โมเดลสร้างการแจกแจงความน่าจะเป็นของชิ้นส่วนถัดไป
- สุ่มตัวอย่างจากการแจกแจงนั้นแล้วนำไปต่อท้ายข้อความ
- ป้อนข้อความใหม่ทั้งหมดกลับเข้าไป แล้วทำกระบวนการเดิมซ้ำ
- หากรัน GPT-2 บนโน้ตบุ๊กด้วยวิธีเดียวกัน จะมีตัวอย่างที่เรื่องราวไม่ค่อยต่อเนื่องกัน
- เมื่อเปลี่ยนไปใช้ GPT-3 API ที่ขยายโครงสร้างพื้นฐานเดียวกันให้ใหญ่ขึ้น ก็สามารถสร้างเรื่องราวที่ดูสมเหตุสมผลกว่าได้
- กระบวนการที่ ChatGPT และโมเดลภาษาขนาดใหญ่อื่น ๆ สร้างคำตอบทีละคำ โดยแก่นแล้วก็คือ การทำนายและการสุ่มตัวอย่างซ้ำ ๆ
- จุดเริ่มต้นง่าย ๆ สำหรับทำเป็นแชตบอตคือการจัดสถานการณ์การสนทนาให้อยู่ในรูปข้อความ
- ใส่ system prompt ที่กำหนดว่า AI assistant ที่เป็นประโยชน์กำลังโต้ตอบกับผู้ใช้
- ใส่คำถามของผู้ใช้เป็นชิ้นส่วนแรกของบทสนทนา
- ให้โมเดลทำนายว่า assistant แบบนั้นจะพูดต่อว่าอะไร
- เพื่อให้วิธีนี้ทำงานได้ดี จำเป็นต้องมีขั้นตอนการฝึกเพิ่มเติม
การไหลของข้อมูลภายใน Transformer
- อินพุตถูกแบ่งเป็นชิ้นเล็ก ๆ เรียกว่า โทเค็น
- ในข้อความ โทเค็นอาจเป็นคำ ส่วนหนึ่งของคำ หรือชุดอักขระที่พบบ่อย
- หากมีภาพหรือเสียงรวมอยู่ด้วย แพตช์ของภาพหรือชิ้นส่วนเสียงก็อาจเป็นโทเค็นได้
- โทเค็นแต่ละตัวเชื่อมกับ เวกเตอร์ ซึ่งเป็นรายการตัวเลข
- เวกเตอร์นี้เข้ารหัสความหมายของชิ้นส่วนนั้นในรูปแบบใดรูปแบบหนึ่ง
- หากมองเป็นพิกัดในปริภูมิมิติสูง คำที่มีความหมายคล้ายกันมักมีแนวโน้มจะอยู่ใกล้กันในรูปเวกเตอร์
- ลำดับของเวกเตอร์จะผ่าน บล็อก attention ก่อน
- บล็อก attention ทำให้เวกเตอร์แลกเปลี่ยนข้อมูลกันและอัปเดตค่าของตนเองได้
- จัดการความหมายที่เปลี่ยนตามบริบท เช่นคำว่า model ใน “a machine learning model” กับ model ใน “a fashion model”
- รับผิดชอบว่าคำใดเกี่ยวข้องกับการอัปเดตความหมายของคำอื่นมากน้อยเพียงใด และจะอัปเดตอย่างไร
- จากนั้นเวกเตอร์จะผ่านบล็อกที่เรียกว่า multilayer perceptron หรือ feed-forward layer
- ในขั้นตอนนี้เวกเตอร์จะไม่สื่อสารกัน แต่ผ่านการคำนวณแบบเดียวกันแบบขนาน
- เปรียบได้กับการถามรายการคำถามยาว ๆ กับเวกเตอร์แต่ละตัว แล้วอัปเดตตามคำตอบ
- เครือข่ายทั้งหมดทำซ้ำบล็อก attention และบล็อก multilayer perceptron
- ระหว่างกลางยังมีขั้นตอน normalization ด้วย แต่ละไว้ในภาพรวมระดับสูง
- ในตอนท้ายคาดหวังว่าใจความสำคัญของประโยคจะถูกบรรจุอยู่ในเวกเตอร์ตัวสุดท้ายของลำดับ
- ใช้เวกเตอร์สุดท้ายนั้นเพื่อสร้างการแจกแจงความน่าจะเป็นของโทเค็นถัดไปทั้งหมดที่เป็นไปได้
รูปแบบของดีปเลิร์นนิงและขนาดพารามิเตอร์ของ GPT-3
- ดีปเลิร์นนิงคือแนวทางของแมชชีนเลิร์นนิงที่ใช้ข้อมูลกำหนดพฤติกรรมของโมเดล
- ใช้กับปัญหาที่ต้องการสัญชาตญาณและการจดจำรูปแบบ เช่น การสร้างป้ายกำกับจากภาพ หรือการทำนายคำถัดไปหลังข้อความ
- แทนที่จะระบุขั้นตอนเป็นโค้ดเหมือน AI ยุคแรก ๆ จะสร้างโครงสร้างที่ยืดหยุ่นพร้อมพารามิเตอร์ที่ปรับได้ แล้วปรับค่าจากข้อมูลตัวอย่าง
- การถดถอยเชิงเส้นเป็นตัวอย่างแมชชีนเลิร์นนิงที่ง่ายที่สุด
- ใช้กับกรณีที่อินพุตและเอาต์พุตต่างเป็นตัวเลขเดียว เช่น พื้นที่บ้านกับราคา
- หาเส้นตรงที่เหมาะสมที่สุดด้วยพารามิเตอร์ต่อเนื่องสองตัว คือความชันและจุดตัดแกน y
- GPT-3 ไม่ได้มีสองตัว แต่มี พารามิเตอร์ 175,000 ล้านตัว
- โมเดลขนาดมหึมาแบบนี้อาจ overfit กับข้อมูลฝึก หรืออาจฝึกไม่ได้เลย
- โมเดลดีปเลิร์นนิงถูกมองว่าเป็นตระกูลโมเดลที่ได้รับการพิสูจน์ในช่วงหลายทศวรรษล่าสุดว่าสเกลได้ดี
- อัลกอริทึมการฝึกร่วมที่เชื่อมตระกูลนี้เข้าด้วยกันคือ backpropagation
- เพื่อให้ backpropagation ทำงานได้ดีในสเกลใหญ่ โมเดลต้องเป็นไปตามรูปแบบบางอย่าง
- อินพุตต้องแทนด้วยอาร์เรย์ของจำนวนจริง
- อาร์เรย์จะผ่านหลายเลเยอร์และถูกแปลงเป็นอาร์เรย์ของจำนวนจริงแบบอื่นต่อเนื่องกัน
- เลเยอร์สุดท้ายของโมเดลข้อความคือรายการตัวเลขที่แทนการแจกแจงความน่าจะเป็นของโทเค็นถัดไปทั้งหมดที่เป็นไปได้
- พารามิเตอร์ของดีปเลิร์นนิงโดยทั่วไปเรียกว่า น้ำหนัก
- วิธีที่น้ำหนักมีปฏิสัมพันธ์กับข้อมูลคือผลรวมถ่วงน้ำหนัก
- มีฟังก์ชันไม่เชิงเส้นแทรกอยู่ระหว่างกลางด้วย แต่ไม่ได้ขึ้นกับพารามิเตอร์
- การแทนจริงมักรวบเป็นการคูณเมทริกซ์-เวกเตอร์ มากกว่าการเปิดเผยผลรวมถ่วงน้ำหนักโดยตรง
- น้ำหนัก 175,000 ล้านตัวของ GPT-3 ถูกจัดอยู่ใน เมทริกซ์ประมาณ 28,000 ชุด
- เมทริกซ์เหล่านี้แบ่งเป็น 8 หมวด
- น้ำหนักของโมเดลคือ “สมอง” ที่ได้จากการฝึก ส่วนข้อมูลที่ถูกประมวลผลในการรันหนึ่งครั้งคือการเข้ารหัสกรณีเฉพาะ เช่น ข้อความอินพุต
Embedding, ขนาดบริบท และการแจกแจงความน่าจะเป็นของเอาต์พุต
- ขั้นแรกคือการแบ่งข้อความอินพุตเป็นโทเค็น แล้วแปลงแต่ละโทเค็นเป็นเวกเตอร์
- โทเค็นจริงอาจเป็นส่วนหนึ่งของคำหรือเครื่องหมายวรรคตอน แต่ในคำอธิบายจะมองเหมือนเป็นคำเพื่อให้เข้าใจง่าย
- โมเดลมี vocabulary หรือรายการโทเค็นที่เป็นไปได้ไว้ล่วงหน้า
- เมทริกซ์ embedding กำหนดว่าแต่ละโทเค็นจะถูกแปลงเป็นเวกเตอร์ใด
- เขียนแทนด้วย W_E
- ค่าเริ่มจากการสุ่ม แต่ถูกกำหนดด้วยการฝึกจากข้อมูล
- ขนาด vocabulary ของ GPT-3 คือ 50,257 และมิติ embedding คือ 12,288
- เมื่อนำสองค่านี้คูณกัน เมทริกซ์ embedding จะมีน้ำหนักประมาณ 617 ล้านตัว
- word embedding สามารถมองเป็นจุดในปริภูมิมิติสูงได้
- คำที่มีความหมายคล้ายกันมักมีแนวโน้มอยู่ใกล้กัน
- เมื่อการฝึกดำเนินไป embedding มีแนวโน้มจะจัดวางโดยทิศทางต่าง ๆ ในปริภูมิมีความหมาย
- มีตัวอย่างความสัมพันธ์ woman - man กับ king - queen และ Italy - Germany + Hitler เข้าใกล้ Mussolini
- ในตัวอย่าง queen ยังกล่าวถึงข้อควรระวังด้วยว่า embedding ของ queen จริง ๆ อาจอยู่ไกลกว่าการเป็น king รูปเพศหญิงแบบง่าย ๆ
- dot product เป็นวิธีวัดว่าเวกเตอร์สองตัวจัดแนวกันมากเพียงใด
- หากอยู่ทิศทางเดียวกันจะเป็นบวก หากตั้งฉากกันจะเป็น 0 และหากอยู่ทิศทางตรงข้ามจะเป็นลบ
- ใช้ dot product ทดสอบสมมติฐานว่า cats - cat อาจเป็นทิศทางที่แทนความเป็นพหูพจน์
- ค่าของคำนามพหูพจน์มีแนวโน้มสูงกว่าคำนามเอกพจน์
- ยังมีกรณีที่ dot product กับคำอย่าง one, two, three ให้ค่าที่เพิ่มขึ้นด้วย
- เวกเตอร์ของ Transformer ต้องไม่เพียงแทนคำคำเดียว แต่ต้องสามารถ ซึมซับบริบท ได้ด้วย
- เวกเตอร์ที่สร้างขึ้นตอนแรกมีเพียงความหมายของโทเค็นเดี่ยวที่ได้จากเมทริกซ์ embedding
- เป้าหมายคือเมื่อผ่านเครือข่ายแล้ว จะบรรจุความหมายที่เฉพาะเจาะจงยิ่งขึ้นโดยสะท้อนทั้งคำรอบข้างและบริบทที่อยู่ไกลออกไป
- context size ของ GPT-3 คือ 2048 ซึ่งถูกฝึกให้ประมวลผลเวกเตอร์ 2048 ตัวในครั้งเดียว
- ขนาดบริบทนี้จำกัดความยาวของข้อความที่โมเดลสามารถนำมาพิจารณาเมื่อทำนายคำถัดไป
- สิ่งนี้เชื่อมโยงกับสาเหตุที่แชตบอตอย่าง ChatGPT รุ่นแรก ๆ ให้ความรู้สึกว่าสูญเสียบริบทในการสนทนายาว ๆ
- ขั้นตอนสุดท้ายคือการสร้างการแจกแจงความน่าจะเป็นของโทเค็นถัดไป
- นำเวกเตอร์ตัวสุดท้ายของบริบทสุดท้ายไปคูณกับ เมทริกซ์ unembedding W_U เพื่อสร้างรายการตัวเลขที่มีขนาดเท่า vocabulary
- องค์ประกอบแต่ละตัวของเอาต์พุตดิบนี้เรียกว่า logit ของการทำนายคำถัดไป
- W_U มีแถวที่สอดคล้องกับโทเค็นแต่ละตัวใน vocabulary และความยาวของแต่ละแถวเท่ากับมิติ embedding
- สำหรับ GPT-3 แล้ว W_U เพิ่มพารามิเตอร์อีกประมาณ 617 ล้านตัวเช่นกัน
- เมื่อรวม embedding และ unembedding พารามิเตอร์สะสมจะเกิน 1,000 ล้านตัวเล็กน้อย
- softmax แปลงรายการตัวเลขใด ๆ ให้เป็นการแจกแจงความน่าจะเป็นที่ถูกต้อง
- แต่ละค่าต้องอยู่ระหว่าง 0 ถึง 1 และผลรวมทั้งหมดต้องเท่ากับ 1
- ยกกำลัง e สำหรับตัวเลขอินพุตแต่ละตัวเพื่อให้เป็นบวก แล้วหารด้วยผลรวมทั้งหมดเพื่อ normalize
- ค่าอินพุตที่มากจะได้ความน่าจะเป็นสูงใกล้ 1 ส่วนค่าที่น้อยจะเข้าใกล้ 0
- วิธีนี้นุ่มนวลกว่าการเลือกเฉพาะค่าสูงสุด ทำให้ค่าที่สูงใกล้เคียงกันยังได้รับความน่าจะเป็นที่มีความหมายได้
- temperature ใช้ปรับความแหลมของการแจกแจง softmax
- ถ้า T สูง ค่าต่ำ ๆ จะได้รับน้ำหนักมากขึ้น ทำให้การแจกแจงสม่ำเสมอขึ้น
- ถ้า T ต่ำ ค่าสูงจะครอบงำมากขึ้น
- T=0 คือกรณีสุดขั้วที่น้ำหนักทั้งหมดไปรวมอยู่ที่ค่าสูงสุด
- ที่ temperature 0 จะเลือกคำที่คาดเดาได้มากที่สุดเสมอ และในตัวอย่างจะสร้างเรื่องราวจำเจแบบ Goldilocks
- temperature ที่สูงขึ้นเปิดโอกาสให้เลือกคำที่มีความเป็นไปได้น้อยกว่า แต่ในตัวอย่างเรื่องเริ่มอย่างสร้างสรรค์ขึ้นก่อนจะกลายเป็นไร้ความหมายอย่างรวดเร็ว
- API ไม่อนุญาตให้ตั้ง temperature มากกว่า 2 ซึ่งไม่ใช่เหตุผลทางคณิตศาสตร์ แต่เป็นข้อจำกัดตามอำเภอใจเพื่อกันไม่ให้เครื่องมือสร้างผลลัพธ์ที่ไร้ความหมายเกินไป
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ถ้ามีใครรู้ว่า GPT ทำงานอย่างไร มีเรื่องหนึ่งที่อยากถาม เดิมคิดว่าโมเดลพวกนี้เลือก คำถัดไปที่น่าจะเป็นไปได้มากที่สุด แต่ถ้าเลือก “หนึ่งในคำที่น่าจะเป็นไปได้” มันอาจนำไปสู่สถานการณ์ที่รายการคาดการณ์คำถัดไปหลังจากนั้นมีความเป็นไปได้น้อยลงมากหรือเปล่า
ถ้าคำนวณได้ ดูเหมือนว่าการนำ “สองคำรวมกัน” มาเป็นตัวเลือก แล้วขยายต่อไปเป็น 3, 4, n คำ น่าจะได้เปรียบกว่า เลยสงสัยว่ามีวิธีแบบนี้ไหม
หลังจากดูวิดีโอและอ่านคอมเมนต์แล้ว จึงได้รู้ว่านี่คือ beam search และใช้ร่วมกับ temperature ที่ควบคุมพฤติกรรมแบบนี้
temperature กับ
top_kเป็นพารามิเตอร์ที่ค่อนข้างคล้ายกัน และถูกนำมาใช้เพื่อสะท้อนว่าประโยคแต่ละประโยคที่มนุษย์พูดนั้นคาดเดาไม่ได้ในเชิงความน่าจะเป็น นี่คือตัวอย่างที่ทำซ้ำกราฟเก่าจากเอกสาร Hugging Face ปี 2018/2019 ในลักษณะคล้ายกันเมื่อปี 2021: https://lilianweng.github.io/posts/2021-01-02-controllable-t...beam search ที่มีความยาวมากกว่านี้มากอาจดีกว่า หรือวิธีที่ผสมหลายเทคนิคเข้าด้วยกันอาจใช้ได้ดี แต่ผมไม่คิดว่าเป็นเช่นนั้น ส่วน query-key-value ของ Transformer นั้นในหลายแง่มุมจะโฟกัสไปที่ผลรวมเดียวในความสัมพันธ์กับบริบททั้งหมด ตัวสถาปัตยกรรมเองไม่ได้ถูกปรับให้เข้ากับหน่วยที่ยาวกว่าแบบนี้ และก็ไม่มีระบบพื้นฐานแบบ “สองโทเค็น”
ถ้าโทเค็นของโมเดล GPT ส่วนใหญ่มี 50,000–100,000 ตัว ก็จะต้องดูพารามิเตอร์มากขึ้นมากอย่าง 50,000*50,000 และยังเกิดปัญหาความเบาบางของข้อมูลด้วย ต่อให้ยังไม่คิดถึงความซับซ้อนในการฝึก องค์ประกอบจำนวนมากของโมเดล GPT ก็เน้นไปที่การดึงความมั่งคั่งของโทเค็นเดี่ยวหรือดัชนีโทเค็นเดี่ยวมากเกินไป จึงยากจะมองว่าออกแบบมาให้เหมาะกับ beam search แบบนี้
เทคนิคอย่าง beam search ช่วยได้ก็จริง แต่เพิ่มได้เพียงการปรับปรุงระดับตัวคูณคงที่เท่านั้น ถึงอย่างนั้น โมเดลภาษาขนาดใหญ่ก็ยังมาถึงสมรรถนะในปัจจุบันได้แม้มีข้อจำกัดเหล่านี้
ตัวอย่างคือ beam search: https://www.width.ai/post/what-is-beam-search
โดยสาระสำคัญคือการคงหน้าต่างความน่าจะเป็นของโทเค็นที่คาดการณ์ไว้ เพื่อยกระดับคุณภาพของผลลัพธ์สุดท้าย
ถ้า chunk เป็นบล็อกที่ใหญ่ขึ้น กระบวนการทั้งหมดนี้จะถูกผสมเข้าด้วยกัน และสามารถทำสิ่งเดียวกันในพื้นที่เชิงแนวคิดได้ เช่น หากใช้วิธีมาตรฐานอย่าง sentence embedding มันก็จะกลายเป็นบล็อกงานสำหรับการเปรียบเทียบ
นึกไม่ออกเลยว่าจะมีใครเหมาะไปกว่านี้ในการสอน กลไก attention ให้คนทั่วไป เหมือนฝันเป็นจริง
ถ้ายังไม่ได้ดูบทก่อน ๆ ขอแนะนำอย่างยิ่งจริง ๆ
ถ้าชอบสิ่งนี้ ช่องของ Andrej Karpathy ก็มีวิดีโอน่าสนใจที่อธิบาย neural network และการทำงานภายใน เหมาะสำหรับคนที่รู้การเขียนโปรแกรม
ผมเองก็กระโดดเข้าไปแบบไม่รู้อะไร และแม้เขาจะแนะนำให้ดูวิดีโอก่อนหน้า ผมก็คิดผิดไปเองว่าจะเข้าใจได้ขณะดู มีคำศัพท์ที่จำเป็นต้องรู้จริง ๆ ถึงจะเก็บเกี่ยวได้เต็มที่
พอยอมถอยไปเรียนอย่างอื่นเพื่อเติมช่องว่าง แล้วกลับมาดูอีกครั้ง วิดีโอของเขาก็มีคุณค่ามากขึ้นอย่างชัดเจน ถ้าใครจะเรียน neural network ผมขอแนะนำอย่างยิ่งให้เรียนรู้จากความผิดพลาดของผม
เป็นยาแก้พิษที่ดีอย่างไม่น่าเชื่อท่ามกลางคอนเทนต์วันเมษาหน้าโง่ อยากฉีดเข้ากระแสเลือดโดยตรงเลย
ที่เกี่ยวข้องกัน ภาพแสดงผลแบบอินเทอร์แอกทีฟ นี้ก็น่าดู: https://bbycroft.net/llm
การสนทนาก่อนหน้า: https://news.ycombinator.com/item?id=38505211
3B1B เป็นหนึ่งใน ผู้สอน STEM ที่ดีที่สุดบน YouTube
เขาบอกว่าโทเค็นถัดไปได้มาจากการ สุ่มตัวอย่าง logits ของคอลัมน์สุดท้ายหลัง unembedding แล้วถ้าอย่างนั้นมันไม่ใช่แค่เอาโทเค็นสุดท้ายกลับมาอีกครั้งหรือ? หรือมีขั้นตอนไหนที่ขนาดเมทริกซ์เปลี่ยนเป็น N+1?
รอวิดีโอถัด ๆ ไปอยู่ ครั้งนี้รู้สึกว่าในที่สุดผมอาจจะเข้าใจและซึมซับได้ว่าสิ่งเหล่านี้ทำงานอย่างไร