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

**กลไกความใส่ใจ** (attention mechanism) หรือ **แอตเทนชัน** (attention) ในโครงข่ายประสาทเทียม เป็นเทคนิคที่ออกแบบมาเพื่อเลียนแบบกระบวนการความใสใจในการรับรู้ของมนุษย์

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

กลไกที่คล้ายกับกลไกความใส่ใจได้ถูกเสนอขึ้นมาตั้งแต่ช่วงปี 1990 ภายใต้ชื่อต่อไปนี้:

* มอดูลแบบคูณ (multiplicative module)
* หน่วยซิกมาไพ (sigma-pi unit)
* โครงข่ายไฮเปอร์ (hyper-network)

มีเทคนิคมากมายที่ประยุกต์ใช้กลไกความใส่ใจได้แก่:

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

## ความเป็นมา
กลไกความใส่ใจได้รับการออกแบบให้เป็นส่วนประกอบที่ทำหน้าที่ดังต่อไปนี้:

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

ตัวอย่างเช่น ลองพิจารณาการแปลด้วยเครื่อง ซึ่งเป็นงานที่ไม่ได้ทำง่าย ๆ โดยแค่แทนคำต่อคำ เนื่องจากลำดับคำในภาษาต่าง ๆ นั้นมีความแตกต่างกัน ดังนั้น เมื่อแปลงแถวลำดับเวกเตอร์คำป้อนเข้าเป็นลำดับเวกเตอร์คำเอาท์พุต จำเป็นต้องแปลงลำดับให้เป็นลำดับ (seq2seq) นอกจากนี้แล้ว ยังมีกรณีที่การอ้างอิงเฉพาะส่วนที่อยู่ใกล้นั้นไม่เพียงพอ จำเป็นต้องพิจารณาคำที่อยู่ก่อนหน้าไปไกลด้วย ตัวอย่างเช่นในการแปลประโยคคำถามภาษาอังกฤษเป็นภาษาไทย ต้องใช้คำว่า "Do" (i=0) ด้านหน้าสุดเพื่ออ้างอิงในการสร้าง "หรือ?" ต่อท้าย (i=L) กล่าวคือ จำเป็นต้องคำนึงถึงคำที่อยู่ไกลได้ด้วย นอกจากนี้ เนื่องจากความยาวของประโยคไม่คงที่ จึงจำเป็นต้องสามารถรองรับข้อมูลป้อนเข้าที่มีความยาวตามที่ต้องการได้ การเรียนรู้เชิงปฏิบัติเกี่ยวกับลำดับเวกเตอร์ขนาดยาวโดยใช้แบบจำลองขนาดใหญ่ต้องใช้ความสามารถในการประมวลผลแบบคู่ขนานสูง

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

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

## แนวคิด
การคำนวนภายในกลไกความใส่ใจทำโดย "ผลรวมถ่วงน้ำหนักแบบไม่ตายตัวขึ้นอยู่กับเควียรีของลำดับเวกเตอร์ป้อนเข้า"

กลไกความใส่ใจจะทำการคำนวณผลรวมถ่วงน้ำหนักของเวกเตอร์ป้อนเข้า \boldsymbol{x}_k แต่ละตัว แล้วได้เวกเตอร์ขาออก \boldsymbol{y}_i (โดย k เป็นดัชนีของข้อมูลป้อนเข้า ส่วน i เป็นดัชนีของข้อมูลขาออก) ในที่นี้ ค่าน้ำหนักไม่ได้เป็นเพียงค่าคงที่ แต่ได้มาจากการคำนวณ การคำนวณจากเวกเตอร์ \boldsymbol{c}_i ที่แสดงข้อมูลที่โยงกับค่าขาออกตัวที่ i กับตัวเวกเตอร์ป้อนเข้านั้นเอง อาจแสดงแนวคิดการคำนวณได้ดังสูตรต่อไปนี้

: \boldsymbol{y_i}
= \sum_k w_{ik} \boldsymbol{x}_k
= \sum_k f(\boldsymbol{c}_i, \boldsymbol{x}_k) \boldsymbol{x}_k

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

กลไกความใส่ใจนี้สามารถพิจารณาใหม่ได้จากมุมมองอื่น กลไกความใส่ใจจะทำการเตรียม **ค่า** \boldsymbol{v}_k (value) ที่บวกเพิ่มโดยขึ้นกับค่าป้อนเข้า \boldsymbol{x}_k และตัวจำแนก \boldsymbol{k}_k ที่สรุปรวบข้อมูล เรียกว่า **คีย์** (key)  จากนั้นก็เตรียมเวกเตอร์**เควียรี** (query) \boldsymbol{q}_k ที่ขึ้นกับข้อมูลความเกี่ยวพันกับค่าขาออกแต่ละค่า แล้วกำหนดค่าน้ำหนักของค่าที่ขึ้นกับความสอดคล้องระหว่างเควียรีกับคีย์ กล่าวคือ แสดงได้ดังสูตรต่อไปนี้:

: \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)

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

เพื่อที่จะเปลี่ยนแนวคิดนี้ให้เป็นการดำเนินการที่ใช้งานได้จริง ต้องดำเนินการอย่างเป็นรูปธรรมดังต่อไปนี้ อันดับแรก หากไม่มีข้อจำกัดเรื่องขนาดของ w_{ik} แล้ว เวกเตอร์ขาออกจะแจกแจงออกไปเมื่อเจอค่าป้อนเข้าที่มีความยาวมากเป็นอนันต์ ดังนั้นจึงกำหนดให้จำกัดให้ผลรวมค่าน้ำหนักเป็น 1 (\sum_k w_{ik} = 1) ได้มีการนิยามฟังก์ชันที่วัดความสอดคล้องระหว่างเควียรีและคีย์ภายในข้อจำกัดนี้ (กลไกเควียรี-คีย์) แต่ฟังก์ชันนี้มีการใช้งานอยู่หลายรูปแบบ แบบที่มักใช้งานคือใช้ฟังก์ชันซอฟต์แมกซ์กับผลคูณจุด \boldsymbol{q}_i \cdot \boldsymbol{k}_k 

## ตัวอย่างการแปลภาษา
หากต้องการสร้างเครื่องแปลจากภาษาอังกฤษเป็นภาษาฝรั่งเศส จะต้องประกอบตัวเข้ารหัส/ตัวถอดรหัสพื้นฐานเข้ากับหน่วยความใส่ใจ (ดูภาพด้านล่าง) ในตัวอย่างที่ง่ายที่สุด หน่วยความใส่ใจประกอบด้วยผลคูณจุดของสถานะของตัวเข้ารหัสแบบถดถอย และไม่จำเป็นต้องฝึก ในความเป็นจริง หน่วยของความใส่ใจประกอบด้วยชั้นโครงข่ายประสาทเทียมแบบเชื่อมต่อสมบูรณ์ 3 ชั้นที่เรียกว่า เควียรี-คีย์-ค่า (query-key-value) ซึ่งต้องมีการฝึก
thumb| วิดีโอแสดงลำดับการแปลภาษาทีละขั้นตอน
[none|thumb|660x660px| แผนผังของตัวเข้ารหัส/ตัวถอดรหัสที่ประกอบด้วยกลไกความใส่ใจ ด้านซ้าย (สีดำ) คือตัวเข้ารหัส/ตัวถอดรหัส (นั่นคือเป็น[ตัวเข้ารหัสอัตโนมัติ) ตรงกลาง (สีส้ม) คือหน่วยความใส่ใจ และด้านขวา (สีเทาและ 3 สี) คือผลการคำนวณ พื้นที่สีเทาในเมทริกซ์ H และเวกเตอร์ w (ขวาสุด) หมายถึงค่าศูนย์ ตัวเลขห้อยระบุขนาดเวกเตอร์ และตัวห้อยตัวอักษร i และ i - 1 ระบุขั้นตอนเวลา]]

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

แนวคิดเรื่องน้ำหนักความใส่ใจนี้ช่วยแก้ปัญหา "ความสามารถในการอธิบาย" ที่โครงข่ายประสาทเทียมมักถูกวิพากษ์วิจารณ์ หากเป็นโครงข่ายที่ทำการแปลคำต่อคำโดยไม่คำนึงถึงลำดับของคำจะได้เป็นเมทริกซ์ที่เกือบจะมีแต่องค์ประกอบแนวทแยง ในทางกลับกัน การที่มีค่าที่ไม่ใช่ในแนวทแยงอยู่นั้นบ่งชี้ว่ากลไกความใส่ใจนั้นมีความละเอียดอ่อนกว่านั้น ในการผ่านตัวถอดรหัสครั้งแรก 94% ของน้ำหนักความใส่ใจอยู่ที่คำภาษาอังกฤษคำแรก "I" ดังนั้นโครงข่ายจึงแสดงคำว่า "je" ในการผ่านตัวถอดรหัสครั้งที่สอง คำภาษาอังกฤษที่สาม "you" ได้ค่าน้ำหนักความใส่ใจ 88% ดังนั้นจึงแสดง "t" ในประโยคสุดท้าย คำภาษาอังกฤษที่สอง "ความรัก" ได้ค่าน้ำหนักความใส่ใจ 95% ดังนั้นจึงแสดง "aime"

## รูปแบบอื่น
กลไกความใส่ใจหลายรูปแบบที่ใช้ค่าถ่วงน้ำหนักแบบยืดหยุ่น ตัวอย่างได้แก่:

* ความใส่ใจแบบบวก (additive attention): หรือเรียกว่า Bahdanau Attention
* ความใส่ใจแบบทวีคูณ (multiplicative): หรือที่เรียกว่า Luong Attention
* ความใส่ใจในตัว (self-attention)

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

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

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

## อ้างอิง

หมวดหมู่:การเรียนรู้ของเครื่อง