กลไกความใส่ใจ

กลไกความใส่ใจ (attention mechanism) หรือ แอตเทนชัน (attention) ในโครงข่ายประสาทเทียม เป็นเทคนิคที่ออกแบบมาเพื่อเลียนแบบกระบวนการความใสใจในการรับรู้ของมนุษย์
กลไกความใส่ใจมีส่วนช่วยในการเสริมน้ำหนักของข้อมูลป้อนเข้าบางส่วนที่สำคัญ และทำให้ส่วนอื่นอ่อนลง แนวคิดนี้ได้แรงบันดาลใจมาจากการที่ว่าโครงข่ายควรให้ความสำคัญกับข้อมูลบางส่วนที่แม้ว่าจะเล็ก ๆ แต่ก็มีสำคัญมากขึ้น มีความยืดหยุ่นในการขึ้นอยู่กับบริบทเพื่อกำหนดว่าส่วนใดของข้อมูลมีความสำคัญมากกว่าส่วนอื่น ๆ เมื่อเทียบกับวิธีการถ่วงน้ำหนักแบบมาตรฐานที่ให้ค่าคงที่ตลอดการดำเนินการ วิธีการนี้ใช้ "ค่าน้ำหนักแบบอ่อน" ซึ่งสามารถเปลี่ยนแปลงได้ขณะดำเนินการได้
กลไกที่คล้ายกับกลไกความใส่ใจได้ถูกเสนอขึ้นมาตั้งแต่ช่วงปี 1990 ภายใต้ชื่อต่อไปนี้:
มีเทคนิคมากมายที่ประยุกต์ใช้กลไกความใส่ใจได้แก่:
ความเป็นมา.
กลไกความใส่ใจได้รับการออกแบบให้เป็นส่วนประกอบที่ทำหน้าที่ดังต่อไปนี้:
ตัวอย่างเช่น ลองพิจารณาการแปลด้วยเครื่อง ซึ่งเป็นงานที่ไม่ได้ทำง่าย ๆ โดยแค่แทนคำต่อคำ เนื่องจากลำดับคำในภาษาต่าง ๆ นั้นมีความแตกต่างกัน ดังนั้น เมื่อแปลงแถวลำดับเวกเตอร์คำป้อนเข้าเป็นลำดับเวกเตอร์คำเอาท์พุต จำเป็นต้องแปลงลำดับให้เป็นลำดับ (seq2seq) นอกจากนี้แล้ว ยังมีกรณีที่การอ้างอิงเฉพาะส่วนที่อยู่ใกล้นั้นไม่เพียงพอ จำเป็นต้องพิจารณาคำที่อยู่ก่อนหน้าไปไกลด้วย ตัวอย่างเช่นในการแปลประโยคคำถามภาษาอังกฤษเป็นภาษาไทย ต้องใช้คำว่า "Do" (<math>i=0</math>) ด้านหน้าสุดเพื่ออ้างอิงในการสร้าง "หรือ?" ต่อท้าย (<math>i=L</math>) กล่าวคือ จำเป็นต้องคำนึงถึงคำที่อยู่ไกลได้ด้วย นอกจากนี้ เนื่องจากความยาวของประโยคไม่คงที่ จึงจำเป็นต้องสามารถรองรับข้อมูลป้อนเข้าที่มีความยาวตามที่ต้องการได้ การเรียนรู้เชิงปฏิบัติเกี่ยวกับลำดับเวกเตอร์ขนาดยาวโดยใช้แบบจำลองขนาดใหญ่ต้องใช้ความสามารถในการประมวลผลแบบคู่ขนานสูง
ตัวอย่างเช่นชั้นโครงข่ายประสาทป้อนไปข้างหน้าสามารถใช้สำหรับ seq2seq โดยการถ่วงน้ำหนักในทิศทางเวลาได้ แต่เนื่องจากค่าน้ำหนักเป็นตัวเลขคงที่ จึงไม่สามารถจัดการลำดับเวกเตอร์ที่มีความยาวตามใด ๆ ตามที่ต้องการได้ โครงข่ายประสาทแบบสังวัตนาการสามารถใช้สำหรับ seq2seq ที่มีความยาวไม่แน่นอนได้ แต่ต้องใช้เคอร์เนลขนาดใหญ่หรือหลายชั้นเพื่อจัดการส่วนที่ขึ้นกับระยะไกล แม้ว่าแบบจำลองโครงข่ายประสาทแบบเวียนซ้ำจะสามารถตอบสนองความต้องการทั้ง 3 ข้อในทางทฤษฎีได้ แต่ในทางปฏิบัติเป็นที่ทราบกันดีว่าข้อมูลส่วนที่พึ่งพาระยะไกลจะหายไปในระหว่างการถดถอยแต่ละขั้น
ความจำเป็นนี้ไม่ได้จำกัดอยู่แค่ที่การประมวลภาษาธรรมชาติเช่นการแปลด้วยเครื่อง แต่ยังจำเป็นในงานต่าง ๆ มากมาย เช่น การรู้จำแบบ ที่อ้างถึงวัตถุที่อยู่ห่างไกลในภาพ และ การสังเคราะห์เสียงพูด ที่บันทึกการเปลี่ยนแปลงของระดับเสียงในระยะยาว ด้วยเหตุนี้ กลไกความใส่ใจจึงได้รับการเสนอและใช้เป็นส่วนประกอบที่รับข้อมูลป้อนเข้าโดยตรงในแต่ละตำแหน่งเมื่อแปลงสายอักขระที่มีความยาวใด ๆ ให้เป็นแถวลำดับ
แนวคิด.
การคำนวนภายในกลไกความใส่ใจทำโดย "ผลรวมถ่วงน้ำหนักแบบไม่ตายตัวขึ้นอยู่กับเควียรีของลำดับเวกเตอร์ป้อนเข้า"
กลไกความใส่ใจจะทำการคำนวณผลรวมถ่วงน้ำหนักของเวกเตอร์ป้อนเข้า <math>\boldsymbol{x}_k</math> แต่ละตัว แล้วได้เวกเตอร์ขาออก <math>\boldsymbol{y}_i</math> (โดย <math>k</math> เป็นดัชนีของข้อมูลป้อนเข้า ส่วน <math>i</math> เป็นดัชนีของข้อมูลขาออก) ในที่นี้ ค่าน้ำหนักไม่ได้เป็นเพียงค่าคงที่ แต่ได้มาจากการคำนวณ การคำนวณจากเวกเตอร์ <math>\boldsymbol{c}_i</math> ที่แสดงข้อมูลที่โยงกับค่าขาออกตัวที่ <math>i</math> กับตัวเวกเตอร์ป้อนเข้านั้นเอง อาจแสดงแนวคิดการคำนวณได้ดังสูตรต่อไปนี้
 <math>\boldsymbol{y_i}
= \sum_k w_{ik} \boldsymbol{x}_k
= \sum_k f(\boldsymbol{c}_i, \boldsymbol{x}_k) \boldsymbol{x}_k</math>
ดังที่เห็นได้จากสูตรนี้ กลไกความใส่ใจจะคำนวณน้ำหนักสำหรับค่าขาออกแต่ละค่าจากเวกเตอร์แสดงความเกี่ยวพันและเวกเตอร์ป้อนเข้า แล้วพิจารณาค่าป้อนเข้าทั้งหมดตามน้ำหนัก ทำให้สามารถพิจารณาแถวลำดับข้อมูลป้อนเข้าทั้งหมดต่อเวกเตอร์ขาออกแต่ละตัวได้โดยตรง ในขณะที่จัดการลำดับเวกเตอร์ที่มีความยาวตามต้องการผ่านการคำนวณน้ำหนักแบบไม่คงที่
กลไกความใส่ใจนี้สามารถพิจารณาใหม่ได้จากมุมมองอื่น กลไกความใส่ใจจะทำการเตรียม ค่า <math>\boldsymbol{v}_k</math> (value) ที่บวกเพิ่มโดยขึ้นกับค่าป้อนเข้า <math>\boldsymbol{x}_k</math> และตัวจำแนก <math>\boldsymbol{k}_k</math> ที่สรุปรวบข้อมูล เรียกว่า คีย์ (key) จากนั้นก็เตรียมเวกเตอร์เควียรี (query) <math>\boldsymbol{q}_k</math> ที่ขึ้นกับข้อมูลความเกี่ยวพันกับค่าขาออกแต่ละค่า แล้วกำหนดค่าน้ำหนักของค่าที่ขึ้นกับความสอดคล้องระหว่างเควียรีกับคีย์ กล่าวคือ แสดงได้ดังสูตรต่อไปนี้:
 <math>\boldsymbol{y_i}
= Attention(\boldsymbol{q}_i, K, V)
= \sum_k g(\boldsymbol{q}_i, \boldsymbol{k}_k) \boldsymbol{v}_k
= \sum_k f(\boldsymbol{c}_i, \boldsymbol{x}_k) h(\boldsymbol{x}_k)</math>
แม้ว่าจะมีรูปแบบเกือบจะเหมือนกับสูตรแนวคิดแรก แต่ก็มีความยืดหยุ่นเพิ่มขึ้นในการแปลงข้อมูลที่ป้อนเข้าให้เป็นค่าแล้วจึงดำเนินการหาผลรวม
เพื่อที่จะเปลี่ยนแนวคิดนี้ให้เป็นการดำเนินการที่ใช้งานได้จริง ต้องดำเนินการอย่างเป็นรูปธรรมดังต่อไปนี้ อันดับแรก หากไม่มีข้อจำกัดเรื่องขนาดของ <math>w_{ik}</math> แล้ว เวกเตอร์ขาออกจะแจกแจงออกไปเมื่อเจอค่าป้อนเข้าที่มีความยาวมากเป็นอนันต์ ดังนั้นจึงกำหนดให้จำกัดให้ผลรวมค่าน้ำหนักเป็น 1 (<math display="inline">\sum_k w_{ik} = 1</math>) ได้มีการนิยามฟังก์ชันที่วัดความสอดคล้องระหว่างเควียรีและคีย์ภายในข้อจำกัดนี้ (กลไกเควียรี-คีย์) แต่ฟังก์ชันนี้มีการใช้งานอยู่หลายรูปแบบ แบบที่มักใช้งานคือใช้ฟังก์ชันซอฟต์แมกซ์กับผลคูณจุด <math>\boldsymbol{q}_i \cdot \boldsymbol{k}_k</math> 
ตัวอย่างการแปลภาษา.
หากต้องการสร้างเครื่องแปลจากภาษาอังกฤษเป็นภาษาฝรั่งเศส จะต้องประกอบตัวเข้ารหัส/ตัวถอดรหัสพื้นฐานเข้ากับหน่วยความใส่ใจ (ดูภาพด้านล่าง) ในตัวอย่างที่ง่ายที่สุด หน่วยความใส่ใจประกอบด้วยผลคูณจุดของสถานะของตัวเข้ารหัสแบบถดถอย และไม่จำเป็นต้องฝึก ในความเป็นจริง หน่วยของความใส่ใจประกอบด้วยชั้นโครงข่ายประสาทเทียมแบบเชื่อมต่อสมบูรณ์ 3 ชั้นที่เรียกว่า เควียรี-คีย์-ค่า (query-key-value) ซึ่งต้องมีการฝึก
เมื่อดูเป็นเมทริกซ์ จะเห็นได้ว่าค่าน้ำหนักความใส่ใจจะบ่งบอกว่าโครงข่ายปรับแบ่งความใส่ใจไปตามบริบทอย่างไร
แนวคิดเรื่องน้ำหนักความใส่ใจนี้ช่วยแก้ปัญหา "ความสามารถในการอธิบาย" ที่โครงข่ายประสาทเทียมมักถูกวิพากษ์วิจารณ์ หากเป็นโครงข่ายที่ทำการแปลคำต่อคำโดยไม่คำนึงถึงลำดับของคำจะได้เป็นเมทริกซ์ที่เกือบจะมีแต่องค์ประกอบแนวทแยง ในทางกลับกัน การที่มีค่าที่ไม่ใช่ในแนวทแยงอยู่นั้นบ่งชี้ว่ากลไกความใส่ใจนั้นมีความละเอียดอ่อนกว่านั้น ในการผ่านตัวถอดรหัสครั้งแรก 94% ของน้ำหนักความใส่ใจอยู่ที่คำภาษาอังกฤษคำแรก "I" ดังนั้นโครงข่ายจึงแสดงคำว่า "je" ในการผ่านตัวถอดรหัสครั้งที่สอง คำภาษาอังกฤษที่สาม "you" ได้ค่าน้ำหนักความใส่ใจ 88% ดังนั้นจึงแสดง "t" ในประโยคสุดท้าย คำภาษาอังกฤษที่สอง "ความรัก" ได้ค่าน้ำหนักความใส่ใจ 95% ดังนั้นจึงแสดง "aime"
รูปแบบอื่น.
กลไกความใส่ใจหลายรูปแบบที่ใช้ค่าถ่วงน้ำหนักแบบยืดหยุ่น ตัวอย่างได้แก่:
สำหรับโครงข่ายประสาทแบบสังวัตนาการ กลไกความใส่ใจยังสามารถแบ่งตามมิติที่กลไกทำงาน คืออาจแยกตามปริภูมิ หรือแยกตามช่อง หรือทั้งสองอย่างรวมกัน
ตัวแปรเหล่านี้จะรวมค่าป้อนเข้าฝั่งตัวเข้ารหัสอีกครั้ง และแจกแจงใหม่ไปยังขาออกเป้าหมายแต่ละรายการ ในหลายกรณี เมทริกซ์ที่มีลักษณะคล้ายสหสัมพันธ์ของผลคูณจุดจะให้ปัจจัยในการถ่วงน้ำหนักใหม่ (ดูคำอธิบายประกอบ)
การใช้งาน.
แบบจำลองที่ยืนพื้นจากสถาปัตยกรรมทรานส์ฟอร์เมอร์นั้นใช้กลไกความใส่ใจเป็นแกนหลัก ทรานส์ฟอร์เมอร์มีเมทริกซ์น้ำหนักอิสระหลายตัวในภายในชั้นเดียวกัน