ต้นขั้ว คู่มือฉบับเต็มสำหรับการปรับแต่งโมเดลภาษาขนาดใหญ่อย่างละเอียด - Unite.AI
เชื่อมต่อกับเรา

ปัญญาประดิษฐ์

คู่มือฉบับเต็มสำหรับการปรับแต่งโมเดลภาษาขนาดใหญ่อย่างละเอียด

mm
วันที่อัพเดท on

โมเดลภาษาขนาดใหญ่ (LLM) เช่น GPT-4, LaMDA, PaLM และอื่นๆ ได้บุกโจมตีโลกด้วยความสามารถอันน่าทึ่งในการทำความเข้าใจและสร้างข้อความที่เหมือนมนุษย์ในหัวข้อต่างๆ มากมาย โมเดลเหล่านี้ได้รับการฝึกอบรมล่วงหน้าเกี่ยวกับชุดข้อมูลขนาดใหญ่ที่ประกอบด้วยคำศัพท์หลายพันล้านคำจากอินเทอร์เน็ต หนังสือ และแหล่งข้อมูลอื่นๆ

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

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

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

การปรับแต่งโมเดลภาษาขนาดใหญ่อย่างละเอียด

การปรับแต่งโมเดลภาษาขนาดใหญ่อย่างละเอียด

การปรับแต่งแบบละเอียดคืออะไร?

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

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

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

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

ทำไมต้อง Fine-Tune LLM

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

  1. การปรับแต่งโดเมน: ทุกสาขา ตั้งแต่กฎหมาย การแพทย์ ไปจนถึงวิศวกรรมซอฟต์แวร์ ต่างก็มีแบบแผนภาษา ศัพท์เฉพาะ และบริบทที่แตกต่างกันออกไป การปรับแต่งอย่างละเอียดช่วยให้คุณปรับแต่งโมเดลทั่วไปเพื่อทำความเข้าใจและสร้างข้อความที่ปรับให้เหมาะกับโดเมนเฉพาะได้
  2. ความเชี่ยวชาญเฉพาะด้าน: LLM สามารถปรับแต่งอย่างละเอียดสำหรับงานการประมวลผลภาษาธรรมชาติต่างๆ เช่น การสรุปข้อความ การแปลด้วยเครื่อง การตอบคำถาม และอื่นๆ ความเชี่ยวชาญพิเศษนี้ช่วยเพิ่มประสิทธิภาพในงานเป้าหมาย
  3. การปฏิบัติตามข้อมูล: อุตสาหกรรมที่มีการควบคุมอย่างเข้มงวด เช่น การดูแลสุขภาพและการเงิน มีข้อกำหนดความเป็นส่วนตัวของข้อมูลที่เข้มงวด การปรับแต่งอย่างละเอียดช่วยให้สามารถฝึกอบรม LLM เกี่ยวกับข้อมูลองค์กรที่เป็นกรรมสิทธิ์พร้อมทั้งปกป้องข้อมูลที่ละเอียดอ่อน
  4. ข้อมูลที่มีป้ายกำกับจำกัด: การได้รับชุดข้อมูลที่มีป้ายกำกับขนาดใหญ่สำหรับโมเดลการฝึกตั้งแต่เริ่มต้นอาจเป็นเรื่องท้าทาย การปรับแต่งอย่างละเอียดช่วยให้บรรลุผลการปฏิบัติงานที่แข็งแกร่งจากตัวอย่างภายใต้การดูแลที่จำกัด โดยใช้ประโยชน์จากความสามารถของโมเดลที่ได้รับการฝึกอบรมล่วงหน้า
  5. กำลังอัปเดตโมเดล: เมื่อมีข้อมูลใหม่ในโดเมนเมื่อเวลาผ่านไป คุณสามารถปรับแต่งโมเดลเพิ่มเติมเพื่อรวมความรู้และความสามารถล่าสุดได้
  6. บรรเทาอคติ: LLM สามารถรับรู้อคติทางสังคมจากข้อมูลก่อนการฝึกอบรมในวงกว้าง การปรับแต่งชุดข้อมูลที่รวบรวมไว้อย่างละเอียดสามารถช่วยลดและแก้ไขอคติที่ไม่พึงประสงค์เหล่านี้ได้

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

การปรับแต่งโมเดลภาษาขนาดใหญ่อย่างละเอียด

การปรับแต่งโมเดลภาษาขนาดใหญ่อย่างละเอียด

แผนภาพที่ให้มาจะสรุปกระบวนการนำไปใช้และใช้งานโมเดลภาษาขนาดใหญ่ (LLM) สำหรับแอปพลิเคชันระดับองค์กรโดยเฉพาะ ในขั้นต้น โมเดลที่ได้รับการฝึกอบรมล่วงหน้า เช่น T5 จะถูกป้อนข้อมูลบริษัทที่มีโครงสร้างและไม่มีโครงสร้าง ซึ่งอาจมาในรูปแบบต่างๆ เช่น CSV หรือ JSON ข้อมูลนี้ผ่านกระบวนการควบคุมดูแล ไม่มีการควบคุมดูแล หรือถ่ายโอนกระบวนการปรับแต่งอย่างละเอียด ซึ่งเพิ่มความเกี่ยวข้องของแบบจำลองกับความต้องการเฉพาะของบริษัท

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

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

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

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

แนวทางการปรับแต่งอย่างละเอียด

มีสองกลยุทธ์หลักในการปรับแต่งโมเดลภาษาขนาดใหญ่:

1) การปรับแต่งแบบละเอียดแบบเต็ม

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

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

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

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

2) วิธีการปรับแต่งที่มีประสิทธิภาพ

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

วิธีการปรับแต่งที่มีประสิทธิภาพยอดนิยมบางวิธี ได้แก่:

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

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

แน่นอนว่าฉันสามารถให้คำอธิบายโดยละเอียดเกี่ยวกับ LoRA (Low-Rank Adaptation) พร้อมทั้งสูตรทางคณิตศาสตร์และตัวอย่างโค้ดได้ LoRA เป็นเทคนิคการปรับแต่งแบบละเอียดที่มีประสิทธิภาพตามพารามิเตอร์ (PEFT) ที่ได้รับความนิยม ซึ่งได้รับความสนใจอย่างมากในด้านการปรับตัวโมเดลภาษาขนาดใหญ่ (LLM)

LoRA คืออะไร?

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

การกำหนดทางคณิตศาสตร์

LoRA (การปรับอันดับต่ำ) เป็นวิธีการปรับแต่งอย่างละเอียดสำหรับโมเดลภาษาขนาดใหญ่ (LLM) ที่แนะนำการอัปเดตเมทริกซ์น้ำหนักระดับต่ำ สำหรับเมทริกซ์น้ำหนัก 0∈, LoRA เพิ่มเมทริกซ์ระดับต่ำ มี และ ที่นี่มี คืออันดับ วิธีการนี้ช่วยลดจำนวนพารามิเตอร์ที่สามารถฝึกได้อย่างมาก ทำให้สามารถปรับให้เข้ากับงานดาวน์สตรีมได้อย่างมีประสิทธิภาพโดยใช้ทรัพยากรการคำนวณน้อยที่สุด เมทริกซ์น้ำหนักที่อัปเดตได้รับจาก .

การอัปเดตระดับต่ำนี้สามารถตีความได้ว่าเป็นการปรับเปลี่ยนเมทริกซ์น้ำหนักดั้งเดิม $W_{0}$ โดยการเพิ่มเมทริกซ์ระดับต่ำ $BA$ ข้อได้เปรียบที่สำคัญของสูตรนี้คือ แทนที่จะอัปเดตพารามิเตอร์ $d \times k$ ทั้งหมดใน $W_{0}$ LoRA จำเป็นต้องปรับพารามิเตอร์ $r \times (d + k)$ ทั้งหมดใน $A$ และ $B ให้เหมาะสมเท่านั้น $ ซึ่งช่วยลดจำนวนพารามิเตอร์ที่สามารถฝึกได้อย่างมาก

นี่คือตัวอย่างใน Python โดยใช้ peft ไลบรารีเพื่อใช้ LoRA กับ LLM ที่ได้รับการฝึกอบรมล่วงหน้าสำหรับการจัดประเภทข้อความ:

</div>
<div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color="">from</span> transformers <span class="token" data-darkreader-inline-color="">import</span> AutoModelForSequenceClassification
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color="">from</span> peft <span class="token" data-darkreader-inline-color="">import</span> get_peft_model<span class="token" data-darkreader-inline-color="">,</span> LoraConfig<span class="token" data-darkreader-inline-color="">,</span> TaskType
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Load pre-trained model</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">model <span class="token" data-darkreader-inline-color="">=</span> AutoModelForSequenceClassification<span class="token" data-darkreader-inline-color="">.</span>from_pretrained<span class="token" data-darkreader-inline-color="">(</span><span class="token" data-darkreader-inline-color="">"bert-base-uncased"</span><span class="token" data-darkreader-inline-color="">,</span> num_labels<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">2</span><span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Define LoRA configuration</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">peft_config <span class="token" data-darkreader-inline-color="">=</span> LoraConfig<span class="token" data-darkreader-inline-color="">(</span>task_type<span class="token" data-darkreader-inline-color="">=</span>TaskType<span class="token" data-darkreader-inline-color="">.</span>SEQ_CLS<span class="token" data-darkreader-inline-color="">, </span>r<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">8</span><span class="token" data-darkreader-inline-color="">,</span>  <span class="token" data-darkreader-inline-color=""># Rank of the low-rank update</span>
lora_alpha<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">16</span><span class="token" data-darkreader-inline-color="">,</span></code><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Scaling factor for the low-rank update</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">    target_modules<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">[</span><span class="token" data-darkreader-inline-color="">"q_lin"</span><span class="token" data-darkreader-inline-color="">,</span> <span class="token" data-darkreader-inline-color="">"v_lin"</span><span class="token" data-darkreader-inline-color="">]</span><span class="token" data-darkreader-inline-color="">,</span>  <span class="token" data-darkreader-inline-color=""># Apply LoRA to the query and value layers</span>
<span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Create the LoRA-enabled model</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">model <span class="token" data-darkreader-inline-color="">=</span> get_peft_model<span class="token" data-darkreader-inline-color="">(</span>model<span class="token" data-darkreader-inline-color="">,</span> peft_config<span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Fine-tune the model with LoRA</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># ... (training code omitted for brevity)</span></code></div>
</div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">

ในตัวอย่างนี้ เราโหลดแบบจำลอง BERT ที่ได้รับการฝึกอบรมล่วงหน้าสำหรับการจำแนกลำดับและกำหนดการกำหนดค่า LoRA ที่ r พารามิเตอร์ระบุอันดับของการอัพเดตระดับต่ำและ lora_alpha เป็นปัจจัยการปรับขนาดสำหรับการอัพเดต ที่ target_modules พารามิเตอร์บ่งชี้ว่าเลเยอร์ใดของโมเดลควรได้รับการอัพเดตระดับต่ำ หลังจากสร้างโมเดลที่เปิดใช้งาน LoRA แล้ว เราสามารถดำเนินการตามกระบวนการปรับแต่งอย่างละเอียดโดยใช้ขั้นตอนการฝึกอบรมมาตรฐานได้

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

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

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

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

กระบวนการปรับแต่งอย่างละเอียด

โดยไม่คำนึงถึงกลยุทธ์การปรับแต่ง กระบวนการโดยรวมสำหรับความเชี่ยวชาญ LLM เป็นไปตามกรอบการทำงานทั่วไป:

  1. การเตรียมชุดข้อมูล: คุณจะต้องได้รับหรือสร้างชุดข้อมูลที่มีป้ายกำกับซึ่งแมปอินพุต (พร้อมท์) กับเอาต์พุตที่ต้องการสำหรับงานเป้าหมายของคุณ สำหรับงานการสร้างข้อความ เช่น การสรุป นี่จะเป็นการป้อนข้อความไปยังคู่เอาต์พุตสรุป
  2. การแยกชุดข้อมูล: ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุด แบ่งชุดข้อมูลที่มีป้ายกำกับของคุณออกเป็นชุดฝึก การตรวจสอบ และการทดสอบ ซึ่งจะแยกข้อมูลสำหรับการฝึกโมเดล การปรับไฮเปอร์พารามิเตอร์ และการประเมินขั้นสุดท้าย
  3. การปรับแต่งไฮเปอร์พารามิเตอร์: จำเป็นต้องปรับพารามิเตอร์ เช่น อัตราการเรียนรู้ ขนาดแบทช์ และกำหนดการฝึกอบรมเพื่อการปรับแต่งข้อมูลของคุณอย่างมีประสิทธิภาพสูงสุด ซึ่งมักจะเกี่ยวข้องกับชุดการตรวจสอบความถูกต้องเล็กๆ น้อยๆ
  4. การฝึกโมเดล: ใช้ไฮเปอร์พารามิเตอร์ที่ปรับแล้ว รันกระบวนการปรับให้เหมาะสมแบบละเอียดในชุดการฝึกแบบเต็มจนกว่าประสิทธิภาพของโมเดลในชุดการตรวจสอบจะหยุดการปรับปรุง (หยุดก่อนกำหนด)
  5. การประเมินผล: ประเมินประสิทธิภาพของแบบจำลองที่ได้รับการปรับแต่งอย่างละเอียดในชุดทดสอบแบบจัดขึ้น ซึ่งประกอบด้วยตัวอย่างจริงสำหรับกรณีการใช้งานเป้าหมาย เพื่อประเมินประสิทธิภาพในโลกแห่งความเป็นจริง
  6. การปรับใช้และการตรวจสอบ: เมื่อพอใจแล้ว โมเดลที่ได้รับการปรับแต่งอย่างละเอียดจะสามารถนำมาใช้เพื่อการอนุมานกับอินพุตใหม่ได้ การตรวจสอบประสิทธิภาพและความแม่นยำในช่วงเวลาหนึ่งเพื่อเบี่ยงเบนแนวคิดเป็นสิ่งสำคัญ

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

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

การปรับแต่งขั้นสูง: ผสมผสานผลตอบรับของมนุษย์

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

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

RLHF (การเรียนรู้การเสริมแรงจากความคิดเห็นของมนุษย์): สิ่งนี้ขยาย PPO โดยการนำความคิดเห็นของมนุษย์มารวมเข้ากับกระบวนการเรียนรู้โดยตรง แทนที่จะเป็นรูปแบบการให้รางวัลคงที่ รางวัลจะมาจากการประเมินโดยมนุษย์ซ้ำๆ เกี่ยวกับผลลัพธ์ของ LLM ในระหว่างการปรับแต่งอย่างละเอียด

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

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

ความเสี่ยงและข้อจำกัดที่อาจเกิดขึ้น

แม้ว่า LLM ที่ปรับแต่งอย่างละเอียดจะทรงพลังอย่างมาก แต่ก็ไม่ได้ปราศจากความเสี่ยงที่ต้องได้รับการจัดการอย่างระมัดระวัง:

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

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

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

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

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

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

อนาคต: การปรับแต่งโมเดลภาษาตามขนาดที่ต้องการ

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

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

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

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

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