งานวิจัย · arXiv 2106.09685
LoRA: การปรับขนาดอันดับต่ำของแบบจำลองภาษาขนาดใหญ่ (Low-Rank Adaptation of Large Language Models)
LoRA: Low-Rank Adaptation of Large Language Models
เผยแพร่ cs.CLcs.AIcs.LG arXivPDF
สรุปสามบรรทัด
- 🎯 การทำ full fine-tuning โมเดลภาษาขนาดมหึมาอย่าง GPT-3 175B ต้องเทรนใหม่และจัดเก็บพารามิเตอร์นับแสนล้านตัวต่องานปลายทาง ทำให้เกิดคอขวดด้านพื้นที่จัดเก็บ, VRAM และการดีพลอย
- 🔧 แช่แข็งเมทริกซ์น้ำหนักที่พรีเทรนไว้ แล้วแทรกเมทริกซ์แยกย่อยอันดับต่ำ () เข้าไปใน dense layers ของ Transformer โดยคูณสเกลผลคูณด้วย และสามารถรวมค่าน้ำหนักตอนดีพลอยได้โดยไม่เพิ่มเวลาแฝง
- 📈 สำหรับ GPT-3 175B นั้น LoRA ลดพารามิเตอร์ที่ต้องเทรนลง 10,000 เท่า และลด VRAM ลง 3 เท่า (จาก 1.2TB เหลือ 350GB) ขณะที่คงประสิทธิภาพเทียบเท่าหรือเหนือกว่า full fine-tuning บน GLUE, WikiSQL และ SAMSum
บทคัดย่อ
กระบวนทัศน์ที่สำคัญอย่างหนึ่งของการประมวลผลภาษาธรรมชาติคือการพรีเทรนโมเดลขนาดใหญ่บนข้อมูลทั่วไป แล้วนำมาปรับใช้ (adaptation) กับงานหรือโดเมนเฉพาะ แต่เมื่อโมเดลมีขนาดใหญ่ขึ้น การทำ full fine-tuning ซึ่งต้องเทรนพารามิเตอร์ทั้งหมดใหม่จึงทำได้ยาก ตัวอย่างเช่น GPT-3 175B การดีพลอยอินสแตนซ์ของโมเดลที่ fine-tune แยกกันสำหรับแต่ละงาน ซึ่งแต่ละตัวมี 175B พารามิเตอร์นั้นมีค่าใช้จ่ายสูงเกินไป เราจึงขอนำเสนอ Low-Rank Adaptation หรือ LoRA ซึ่งใช้วิธีแช่แข็ง (freeze) ค่าน้ำหนักของโมเดลที่พรีเทรนไว้ แล้วแทรกเมทริกซ์แยกย่อยอันดับต่ำที่สามารถเทรนได้ (trainable rank decomposition matrices) เข้าไปในแต่ละเลเยอร์ของสถาปัตยกรรม Transformer ช่วยลดจำนวนพารามิเตอร์ที่ต้องเทรนสำหรับงานปลายทางได้อย่างมหาศาล เมื่อเทียบกับ GPT-3 175B ที่ fine-tune ด้วย Adam พบว่า LoRA สามารถลดพารามิเตอร์ที่ต้องเทรนลงได้ถึง 10,000 เท่า และลดการใช้หน่วยความจำ GPU ได้ถึง 3 เท่า โดย LoRA ยังคงให้คุณภาพของโมเดลเทียบเท่าหรือดีกว่า full fine-tuning บน RoBERTa, DeBERTa, GPT-2 และ GPT-3 แม้ว่าจะมีพารามิเตอร์ที่ต้องเทรนน้อยกว่า ความเร็วในการเทรน (throughput) สูงกว่า และแตกต่างจากวิธีแบบ adapter ตรงที่ไม่มีเวลาแฝงในการอนุมาน (inference latency) เพิ่มขึ้นเลย นอกจากนี้เรายังตรวจสอบเชิงประจักษ์เกี่ยวกับ rank-deficiency ในการปรับใช้โมเดลภาษา ซึ่งช่วยอธิบายประสิทธิภาพของ LoRA เราได้เผยแพร่แพ็กเกจที่ช่วยให้ใช้งาน LoRA ร่วมกับโมเดล PyTorch ได้อย่างง่ายดาย พร้อมทั้งโค้ดและโมเดลเช็กพอยต์สำหรับ RoBERTa, DeBERTa และ GPT-2 ไว้ที่ https://github.com/microsoft/LoRA
บทคัดย่อต้นฉบับ (ภาษาอังกฤษ)
An important paradigm of natural language processing consists of large-scale pre-training on general domain data and adaptation to particular tasks or domains. As we pre-train larger models, full fine-tuning, which retrains all model parameters, becomes less feasible. Using GPT-3 175B as an example -- deploying independent instances of fine-tuned models, each with 175B parameters, is prohibitively expensive. We propose Low-Rank Adaptation, or LoRA, which freezes the pre-trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks. Compared to GPT-3 175B fine-tuned with Adam, LoRA can reduce the number of trainable parameters by 10,000 times and the GPU memory requirement by 3 times. LoRA performs on-par or better than fine-tuning in model quality on RoBERTa, DeBERTa, GPT-2, and GPT-3, despite having fewer trainable parameters, a higher training throughput, and, unlike adapters, no additional inference latency. We also provide an empirical investigation into rank-deficiency in language model adaptation, which sheds light on the efficacy of LoRA. We release a package that facilitates the integration of LoRA with PyTorch models and provide our implementations and model checkpoints for RoBERTa, DeBERTa, and GPT-2 at https://github.com/microsoft/LoRA.
คู่มือการอ่าน
ปัญหาและแรงจูงใจ
การปรับโมเดลภาษาที่พรีเทรนขนาดใหญ่ให้เข้ากับงานปลายทางที่หลากหลายนั้น โดยดั้งเดิมจะพึ่งพา full fine-tuning (การอัปเดตพารามิเตอร์ทั้งหมดจาก เป็น ) สำหรับสถาปัตยกรรมขนาดมหึมาอย่าง GPT-3 175B การจัดเก็บและให้บริการโมเดลขนาด 175B พารามิเตอร์แยกตามแต่ละงานมีค่าใช้จ่ายสูงมาก ทั้งด้านพื้นที่จัดเก็บ, หน่วยความจำ GPU และภาระของ I/O เทคนิคการปรับจูนแบบประหยัดพารามิเตอร์ก่อนหน้านี้มีข้อเสียที่เห็นได้ชัด:
- Series Adapter Layers: แทรกโมดูลคอขวด (bottleneck modules) แบบเรียงลำดับเข้าไปในบล็อก Transformer เนื่องจากการทำงานแบบเรียงลำดับนี้ไม่สามารถประมวลผลแบบขนานได้ จึงทำให้เกิดเวลาแฝงในการอนุมาน (inference latency) สูงขึ้นอย่างมาก โดยทำให้ forward pass ช้าลงถึง ในกรณีที่ให้บริการแบบออนไลน์ด้วย GPU เดี่ยวและ batch ขนาดเล็ก
- Prefix / Prompt Tuning: ทำการหาค่าที่เหมาะสมที่สุดของเวกเตอร์พรอมต์แบบต่อเนื่องที่เติมหน้า activation ของเลเยอร์ วิธีเหล่านี้ยากต่อการหาค่าที่เหมาะสม (optimize), สเกลไม่เป็นไปตามความยาวพรอมต์แบบ monotonic และยังแย่งใช้ความยาวของลำดับข้อมูล (sequence length) ที่ควรมีไว้สำหรับบริบทของข้อความ
LoRA จัดการกับข้อแลกเปลี่ยนระหว่างประสิทธิภาพและคุณภาพนี้ โดยอาศัยสมมติฐานว่าการอัปเดตค่าน้ำหนัก ในระหว่างการถ่ายทอดการเรียนรู้ไปยังงานปลายทางนั้นมี intrinsic rank ต่ำ
แนวคิดสำคัญ
- Low-Rank Reparametrization: สำหรับเมทริกซ์แบบ dense ที่ถูกแช่แข็ง ให้แปลงพารามิเตอร์ของการอัปเดตเป็น โดยที่ , และอันดับ
- ไม่เพิ่มเวลาแฝงในการอนุมาน (Zero Added Inference Latency): เนื่องจากการเปลี่ยนพารามิเตอร์เป็นแบบเชิงเส้น เมทริกซ์อันดับต่ำที่เทรนแล้วจึงสามารถรวม (fold) เข้ากับค่าน้ำหนักที่พรีเทรนไว้ได้โดยตรง () ณ เวลาดีพลอย ทำให้ได้สถาปัตยกรรมในการอนุมานที่เหมือนเดิมทุกประการและไม่มีการเพิ่มเวลาแฝงเมื่อเทียบกับการ fine-tuning
- โมเดลฐานร่วมพร้อมสลับใช้งานได้ทันที (Shared Base Model with Hot-Swapping): โมเดลขนาดใหญ่ที่ถูกแช่แข็งจะคงอยู่ในหน่วยความจำ GPU เพียงชุดเดียว การสลับงานจึงทำได้โดยการเปลี่ยนเฉพาะเมทริกซ์อันดับต่ำ และ เท่านั้น ซึ่งช่วยลดพื้นที่จัดเก็บจากระดับหลายร้อยกิกะไบต์เหลือเพียงไม่กี่สิบเมกะไบต์
- Selective Attention Adaptation: การประยุกต์ใช้การแยกย่อยอันดับต่ำเฉพาะกับโพรเจกชันของ self-attention (โดยเฉพาะ query และ value ) ให้ผลลัพธ์ที่แข่งขันได้ดี ขณะที่ปล่อยให้เลเยอร์ MLP feed-forward ถูกแช่แข็งไว้
ระเบียบวิธี (Method)
สำหรับเลเยอร์ dense projection ที่สร้างเอาต์พุต ทาง LoRA จะปรับเปลี่ยนการคำนวณเป็น:
รายละเอียดสำคัญในการนำไปใช้งาน:
- การกำหนดค่าเริ่มต้น (Initialization): ถูกกำหนดค่าเริ่มต้นจากการแจกแจงแบบเกาส์เซียน และ ถูกกำหนดค่าเริ่มต้นเป็นศูนย์ เพื่อให้แน่ใจว่า เมื่อเริ่มต้นการเทรน
- ตัวคูณสเกล (Scaling Factor): ผลลัพธ์การอัปเดต จะถูกคูณด้วยสเกล โดยที่ เป็นไฮเปอร์พารามิเตอร์คงที่ เมื่อหาค่าเหมาะสมด้วย Adam การตั้งค่า ให้เท่ากับค่า rank เริ่มต้นจะช่วยให้ไม่ต้องปรับอัตราการเรียนรู้ (learning rate) ใหม่เมื่อทดลองเปลี่ยนค่า
- การรวมค่าน้ำหนักเพื่อดีพลอย (Deployment Merging): ในสภาพแวดล้อมจริง เมทริกซ์น้ำหนักที่ปรับแล้ว จะถูกคำนวณและเก็บไว้จริงในรูป เมื่อต้องการเปลี่ยนงาน จะกู้คืน ด้วยการลบออก () และรวมเข้ากับค่าน้ำหนักของ adapter ชุดใหม่ ()
- เลเยอร์เป้าหมาย (Target Layers): แม้ว่าจะสามารถใช้ได้กับเลเยอร์ dense ใดๆ แต่การทดลองมุ่งเน้นไปที่ attention projections ของ Transformer () เป็นหลัก โดยการใช้ LoRA ที่ กับ และ ให้ประสิทธิภาพสำหรับงานปลายทางที่ดีที่สุด
ผลการทดลอง
- GPT-3 175B: LoRA ลดพารามิเตอร์ที่ต้องเทรนจาก 175,255.8M เหลือ 4.7M ( หรือ ) หรือ 37.7M () ส่งผลให้ขนาดเช็กพอยต์ลดลงจาก 350GB เหลือ 35MB (ลดลง 10,000 เท่า) และลด VRAM ในการเทรนจาก 1.2TB เหลือ 350GB ขณะที่ความเร็วในการเทรนเพิ่มขึ้น (จาก 32.5 เป็น 43.1 tokens/s ต่อ V100 GPU)
- ความแม่นยำของงานปลายทาง (GPT-3):
- ความแม่นยำในการตรวจสอบ logical form บน WikiSQL: Full fine-tuning ทำได้ ; LoRA (37.7M) ทำได้
- ความแม่นยำในการตรวจสอบ matched บน MultiNLI: Full fine-tuning ทำได้ ; LoRA (4.7M) ทำได้
- การสรุปบทสนทนาบน SAMSum: Full fine-tuning ได้คะแนน ROUGE-1/2/L ที่ 52.0 / 28.0 / 44.5; LoRA (4.7M) ทำได้ 53.8 / 29.8 / 45.9
- RoBERTa และ DeBERTa (GLUE Benchmark): บน RoBERTa Large ทาง LoRA ทำคะแนนเฉลี่ยเทียบเท่า fine-tuning ( เทียบกับ ) โดยใช้พารามิเตอร์เพียง 0.8M เทียบกับ 355.0M และบน DeBERTa XXL (1.5B) LoRA ทำคะแนนเฉลี่ยบน GLUE ได้ ด้วยพารามิเตอร์ 4.7M เทียบกับ ของ full fine-tuning (พารามิเตอร์ 1,500.0M)
- การวิเคราะห์ Intrinsic Rank: การวิเคราะห์ความคล้ายคลึงของสเปซย่อย (subspace similarity) เผยให้เห็นว่า ทิศทางเอกฐานชั้นนำ (top singular directions) ของ สำหรับ และ มีความซ้อนทับกันอย่างมาก (ความคล้ายคลึงแบบปรับมาตรฐาน สำหรับมิติที่ 1) นอกจากนี้ ยังช่วยขยายทิศทางที่มีอยู่แต่ไม่ได้เน้นเด่นชัดใน โดยมีอัตราการขยายสัญญาณ สำหรับ
ข้อจำกัดและประเด็นที่ยังเปิดกว้าง
- การประมวลผลเป็นกลุ่มสำหรับหลายงาน (Multi-Task Batching): เมื่อรวมค่าน้ำหนักอันดับต่ำ เข้ากับ เพื่อขจัดเวลาแฝงในการอนุมานแล้ว การจัดอินพุตจากหลายงานให้อยู่ในแบทช์เดียวกัน (batching) ในการทำ forward pass ครั้งเดียวยังคงทำได้ยาก
- การเลือกเลเยอร์ตามการสำรวจ (Heuristic Layer Selection): แนวทางปฏิบัติในปัจจุบันยังคงพึ่งพาการทดลองเชิงประจักษ์ (เช่น การปรับ และ ) มากกว่ากรอบการทำงานตามทฤษฎีที่จะระบุว่าควรเลือกปรับเมทริกซ์ตัวใดบ้างระหว่างเลเยอร์ attention และ MLP
- การเปลี่ยนแปลงโดเมนแบบสุดขั้ว (Extreme Domain Shifts): สำหรับงานปลายทางที่แตกต่างจากการแจกแจงตอนพรีเทรนอย่างมาก (เช่น การปรับ LLM ภาษาอังกฤษให้เข้ากับภาษาปลายทางที่ต่างกันโดยสิ้นเชิง) การปรับแต่งด้วยอันดับต่ำอาจให้ผลลัพธ์ที่ไม่เพียงพอเมื่อเทียบกับการใช้อันดับสูงหรือการปรับโมเดลทั้งหมด
คำศัพท์สำคัญ
- Low-Rank Adaptation (LoRA)
- วิธีการ fine-tune แบบประหยัดพารามิเตอร์ที่แช่แข็งค่าน้ำหนักโมเดลฐาน และเทรนเมทริกซ์แยกย่อยอันดับต่ำควบคู่ไปกับเลเยอร์ dense
- Intrinsic Rank
- มิติยังผลที่ต่ำหรือจำนวนเอกฐานเวกเตอร์ขั้นต่ำที่จำเป็นต่อการจับการปรับเปลี่ยนพารามิเตอร์ที่มีความหมายระหว่างการถ่ายทอดการเรียนรู้สู่งานเฉพาะ
- Adapter Layers
- โมดูลคอขวดภายนอกที่แทรกเข้าไปแบบเรียงลำดับในบล็อก Transformer ซึ่งทำให้เกิดการคำนวณแบบขนานไม่ได้และเพิ่มเวลาแฝงในการอนุมาน
- Prefix Tuning
- กลยุทธ์การปรับแต่งที่เติมเวกเตอร์ต่อเนื่องที่เทรนได้ไว้หน้าโทเค็นอินพุตหรือ hidden states ของแต่ละเลเยอร์ ซึ่งจะลดพื้นที่บริบทของลำดับข้อมูลที่ใช้งานได้
- Weight Folding / Weight Merging
- การบวกเมทริกซ์อันดับต่ำ ทางคณิตศาสตร์เข้ากับเมทริกซ์น้ำหนักที่พรีเทรนไว้ โดยตรงเพื่อขจัดโอเวอร์เฮดขณะรันไทม์ระหว่างการอนุมาน
- Grassmann Distance Subspace Similarity
- เมทริก ที่ใช้วัดการซ้อนทับกันของ column spans ระหว่างเมทริกซ์เอกฐานเวกเตอร์แบบเชิงตั้งฉากของการอัปเดตการปรับแต่ง
- Feature Amplification Factor
- อัตราส่วนระหว่าง Frobenius norm ของ กับโพรเจกชันของ บนสเปซย่อยเอกฐานของ ซึ่งใช้วัดว่าทิศทางเฉพาะของงานถูกเน้นให้เด่นชัดขึ้นมากเพียงใด
คำถามที่พบบ่อย
เหตุใด LoRA จึงไม่เพิ่มเวลาแฝงในการอนุมาน (inference latency) เมื่อเทียบกับ adapters?
เนื่องจาก LoRA เป็นการแปลงเชิงเส้น () จึงสามารถคำนวณผลคูณอันดับต่ำ แล้วบวกเข้ากับ ล่วงหน้าก่อนนำไปใช้งานได้ทันที () การอนุมานจึงเป็นการคูณเมทริกซ์แบบปกติ โดยไม่มีเลเยอร์คอขวดแบบเรียงลำดับที่ทำให้เกิดเวลาแฝงเหมือนในสถาปัตยกรรม adapter
ควรนำ LoRA ไปใช้กับเมทริกซ์น้ำหนักตัวใดของ Transformer?
การทดลองบน GPT-3 แสดงให้เห็นว่าการปรับค่าน้ำหนักโพรเจกชันของทั้ง query () และ value () ให้ผลลัพธ์ดีที่สุดภายใต้งบประมาณพารามิเตอร์ที่กำหนด การปรับเมทริกซ์ attention หลายตัวด้วย rank ขนาดเล็ก (เช่น ) ให้ผลลัพธ์ที่ดีกว่าการทุ่มพารามิเตอร์ทั้งหมดให้กับเมทริกซ์ชนิดเดียวด้วย rank ที่สูงกว่า
ค่า rank $r$ ขนาดเท่าใดจึงจะเพียงพอสำหรับการปรับโมเดลภาษาขนาดใหญ่?
ค่า rank ที่มีขนาดเล็กมาก เช่น , หรือ มักจะเพียงพอต่องานปลายทางส่วนใหญ่ การวิเคราะห์ความคล้ายคลึงของสเปซย่อยแสดงให้เห็นว่า เอกฐานเวกเตอร์ชั้นนำที่เรียนรู้ได้จาก rank ขนาดเล็กมีความซ้อนทับกับที่เรียนรู้ได้จาก rank ขนาดใหญ่ (เช่น ) อย่างมีนัยสำคัญ ในขณะที่ rank ขนาดใหญ่กว่ามักจะจับเฉพาะสัญญาณรบกวนแบบสุ่มจากการทำ optimization
LoRA มีวิธีการกำหนดค่าเริ่มต้น (initialize) ให้กับเมทริกซ์อันดับต่ำอย่างไร?
เมทริกซ์ จะถูกกำหนดค่าเริ่มต้นด้วยการแจกแจงแบบเกาส์เซียนแบบสุ่ม ส่วนเมทริกซ์ จะถูกกำหนดค่าเริ่มต้นให้เป็นศูนย์ ซึ่งวิธีนี้ทำให้มั่นใจได้ว่า เมื่อเริ่มต้นการเทรน ทำให้การส่งต่อข้อมูลแบบไปข้างหน้า (forward pass) ของโมเดลพรีเทรนยังคงเดิมไม่เปลี่ยนแปลง
คำอธิบายในหน้านี้เขียนโดย AI จากงานวิจัยและอาจมีข้อผิดพลาด โปรดอ่านต้นฉบับเพื่อดูรายละเอียด