از مدل پایه تا assistant: SFT، RLHF، DPO و GRPO
مدل پایه برای هایکو یک جمله را تکرار میکند؛ سپس reward model یاد میگیرد طول را به درستی ترجیح دهد.
در این صفحه
از GPT-2 — یک مدل زبانی که بهخوبی pretrained شده — بخواهید درباره دریا یک هایکو بنویسد:
prompt: Write a haiku about the sea.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.گیج نشده و در کارش هم شکست نخورده است. دقیقاً همان کاری را میکند که فصل 10 برایش آموزش داده: با داشتن مقداری متن، ادامهای محتمل برای آن تولید کند. در اینترنت، خطی مثل Write a haiku about the sea. اغلب با نثری درباره دریا دنبال میشود، و جملهای که همین حالا آمده بهطور غیرمعمولی احتمال دارد دوباره ظاهر شود. مدل یک پیشبینیکننده عالی next-token است و یک assistant بیفایده.
حالا همان درخواست را به مدلی بدهید که به همان روش ساخته شده — Qwen2.5، نیم میلیارد پارامتر، چهار برابر اندازه GPT-2 بالا و با این حال طبق هر استانداردی در 2026 هنوز کوچک — اما پس از مراحلی از آموزش که این فصل دربارهشان است:
Whispers of the ocean,
Silent depths where waves meet,
Mysteries in the vast blue.چهار برابر شدن پارامترها به مدل یاد نمیدهد دست از حرفزدن بردارد. فاصله بین این دو خروجی نه scale است، نه معماری و نه حجم داده. این فاصله post-training است: مرحلهای دوم، چندین مرتبه کوچکتر از pretraining، که یک پیشبینیکننده متن را به چیزی تبدیل میکند که پاسخ میدهد.
مرحله اول: نشان دادن اینکه پاسخ چه شکلی است
لینک به بخش: مرحله اول: نشان دادن اینکه پاسخ چه شکلی استقدم اول کمزرقوبرقترین قدم است و بیشتر کار را انجام میدهد. نمونههایی از instructionها همراه با پاسخهای خوب جمعآوری کنید، و آموزش را روی آنها با همان loss از فصل 8 ادامه دهید — پیشبینی token بعدی — اما فقط روی بخش پاسخ. این همان supervised fine-tuning یا SFT است.
هیچ چیز تازهای درباره زبان آموزش داده نمیشود. چیزی که آموزش داده میشود یک قالب است: اینکه متنی با این شکل، با متنی با آن شکل دنبال میشود، و بعد متوقف میشود. دوباره به شکست مدل پایه نگاه کنید. در جمله اول به سؤال پاسخ داد و بعد نتوانست متوقف شود، چون در آموزش آن هیچ چیز پایان یک پاسخ را علامتگذاری نکرده بود. توقف یک رفتار آموختهشده است.
به همین دلیل هم باید به مدل گفته شود مرزها کجا هستند، و این همان کاری است که یک chat template انجام میدهد:
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
What is the capital of France?<|im_end|>
<|im_start|>assistantآن نشانگرهای <|im_start|> و <|im_end|> tokenهای واقعی در واژگان هستند، پیش از fine-tuning اضافه شدهاند، و مدل میلیونها بار آنها را دقیقاً در همین موقعیتها دیده است. مدل از همینها میفهمد نوبت چه کسی است و یک نوبت کجا تمام میشود.
اگر template را حذف کنید و یک سؤال خام به مدل بدهید، دارید دنبالهای به آن میدهید که در آموزش ندیده است. اندازهگیریشده، همان مدل، همان سؤال، همان greedy decoding:
بدون template — رشته خام What is the capital of France?:
The capital of France is Paris.
To verify this, I will use a simple
Python code snippet to confirm that
Paris is indeed the capital city of
France.
[...and then it starts writing a
Python script to check its own answer]با template:
The capital of France is Paris.پاسخ در هر دو درست است، اما بدون نشانگرها مدل به نوشتن Python برای بررسی خودش منحرف میشود، چون promptی که دریافت کرده شبیه هیچ چیزی نیست که روی آن fine-tuned شده باشد. این رایجترین علت جملهای مثل «وقتی مدل را مستقیم صدا زدم احمقتر شد» است: template تزئین دور مدل نیست، بخشی از مدل است، و template اشتباه یک افت کیفیت خاموش است که هیچ خطایی هم همراهش نمیآید.
مرحله دوم، و مسئلهای که برای حل آن وجود دارد
لینک به بخش: مرحله دوم، و مسئلهای که برای حل آن وجود داردSFT سقف دارد، و سقف آن داده است. برای fine-tuning روی یک demonstration باید کسی پاسخ ایدهآل را بنویسد — و برای بیشتر پرسشهای جالب، نوشتن پاسخ خوب سخت، کند، گران است، و دقیقاً یک پاسخ تولید میکند که نمیتوانید کیفیتش را راستیآزمایی کنید.
چیزی که آدمها در آن خوباند مقایسه است. وقتی دو پاسخ نشان داده شود، یک annotator میتواند در چند ثانیه با اطمینان بگوید کدام بهتر است، بیآنکه بتواند هیچکدام را تولید کند. کل مرحله دوم بر همین واقعیت ساخته شده، و این همان بخشی است که بیشتر توضیحها وارونه میفهمند:
انسانها پاسخها را نمینویسند. آنها جفتها را رتبهبندی میکنند.
پس داده از جفتها تشکیل شده است — یک prompt، دو پاسخ، و اینکه کدام برنده شده. این را نمیتوان وارد next-token loss کرد، چون هیچ دنباله هدفی وجود ندارد. به ماشین دیگری نیاز دارد.
reward model، و اینکه واقعاً چه چیزی یاد میگیرد
لینک به بخش: reward model، و اینکه واقعاً چه چیزی یاد میگیردنمیتوانید هنگام آموزش از انسان بخواهید هر پاسخ را امتیازدهی کند — این یعنی میلیونها قضاوت. پس مدلی آموزش میدهید که از انسانها تقلید کند: یک reward model که پاسخ را میگیرد و یک عدد اسکالر برمیگرداند.
آموزش آن از مقایسهها از نتیجهای در سال 1952 استفاده میکند. مدل Bradley–Terry2 میگوید اگر دو آیتم قدرتهای پنهان داشته باشند، احتمال اینکه یکی دیگری را شکست دهد تابع logistic اختلاف آنهاست. اگر این را برگردانید، به یک loss تبدیل میشود: با فرض اینکه انسان را به ترجیح داده، بیشینه کنید
که در code کل حلقه آموزش است:
loss = -F.logsigmoid(reward(chosen) - reward(rejected)).mean() دقت کنید مدل هرگز چه چیزی نمیبیند: یک امتیاز مطلق. فقط تفاوتها را یاد میگیرد، و این دقیقاً همان چیزی است که داده شامل آن است.
حالا بخشی که ارزش اندازهگیری دارد. reward model چیزی را یاد میگیرد که annotatorها پاداش دادهاند، و annotatorها آدماند. اینجا شبیهسازیای داریم که در آن کیفیت واقعی یک پاسخ فقط به مفید و درست بودن وابسته است — طول هیچ ارزشی ندارد — اما annotator شبیهسازیشده وقتی همه چیز نزدیک است ترجیح ملایمی به پاسخهای طولانیتر دارد، که یک سوگیری انسانی مستند است. reward model را روی 2000 مقایسه آموزش دهید و وزنهایش را بخوانید:
| سوگیری طول در annotator | وزن آموختهشده روی مفید | روی درست | روی طول |
|---|---|---|---|
| 0.0 | +1.00 | +1.00 | +0.01 |
| 0.3 | +0.98 | +1.00 | +0.15 |
| 0.6 | +0.97 | +1.00 | +0.27 |
| 1.2 | +1.00 | +0.99 | +0.59 |
reward model کاملاً درست کار میکند. با وفاداری ترجیحاتی را یاد گرفته که به آن نشان داده شده — از جمله بخشی از آن ترجیحات که هیچ ربطی به کیفیت ندارد. reward model معیار خوبی نیست؛ معیار چیزی است که annotatorها انتخاب کردهاند، و هر سوگیری در مجموعه annotation اکنون ضریبی در یک تابع مشتقپذیر است که مدلی بسیار بزرگتر قرار است آن را بهینه کند.
Reward hacking، اندازهگیریشده
لینک به بخش: Reward hacking، اندازهگیریشدهو این ما را به اتفاقی میرساند که وقتی آن را بهینه میکنید رخ میدهد. به policy بودجه ثابتی از تلاش بدهید تا بین ویژگیهای پاسخ خرج کند، با یک عدمتقارن واقعبینانه: مفید بودن و درست بودن گراناند، و طولانیتر بودن ارزان است — فقط به نوشتن ادامه میدهید.
reward به ازای هر واحد تلاش، برای مدل آموزشدیده بالا: مفید 8.26، درست 8.31، طول 31.70. طول تقریباً چهار برابر بهتر از درستی سود میدهد، نه چون reward model خراب است، بلکه چون ارزان است.
در برابر آن reward بهینه کنید و هر دو عدد را ببینید:
| امتیاز reward model | کیفیت واقعی | طول تولیدشده | |
|---|---|---|---|
| policy شروع | 12.588 | 0.974 | 3.365 |
| پس از بهینهسازی | 31.696 | 0.000 | 12.497 |
reward با ضریب 2.5 بالا رفت. چیزی که قرار بود reward اندازه بگیرد به صفر رسید. policy کشف کرد که میتواند با طولانی نوشتن و هیچ نگفتن امتیاز فوقالعاده بگیرد، و هیچ بخشی از حلقه آموزش راهی برای فهمیدن این نداشت، چون reward model درون حلقه همان تعریف خوب است.
این reward hacking است، و اگر تا به حال فکر کردهاید چرا مدلهای chat اینقدر پرحرفاند، این جدول بخش بزرگی از پاسخ است.
جریمه KL واقعاً چه چیزی میخرد
لینک به بخش: جریمه KL واقعاً چه چیزی میخرددفاع استاندارد این است که policy را برای دور شدن بیش از حد از نقطه شروعش جریمه کنیم، با اندازهگیری فاصله از طریق KL divergence از فصل 4:
مرجع همان مدل SFT است — policy پیش از مرحله reinforcement. ادعا این است که این کار مانع میشود مدل به رفتار تباه سرگردان شود. بیایید ببینیم چه مقدار از این ادعا از اندازهگیری جان سالم به در میبرد. همان تنظیمات، با sweep روی :
| reward | کیفیت واقعی | طول | KL | |
|---|---|---|---|---|
| 0 | 31.699 | 0.000 | 12.498 | 2.994 |
| 1 | 31.697 | 0.000 | 12.497 | 2.993 |
| 5 | 28.318 | 0.285 | 10.700 | 2.163 |
| 15 | 12.860 | 1.542 | 2.552 | 0.151 |
| 30 | 10.426 | 1.719 | 1.303 | 0.025 |
| 60 | 9.632 | 1.769 | 0.908 | 0.005 |
| فقط مدل مرجع | 9.162 | 1.791 | 0.687 | 0 |
سطر آخر را در برابر بقیه بخوانید. در و جریمه هیچ کاری نمیکند: reward آنقدر از KL باارزشتر است که optimizer جریمه را میپردازد و باز هم hack میکند. بین 5 و 15 رفتار ناگهان تغییر میکند. و تا ، کیفیت واقعی دوباره به 1.769 برگشته — که هنوز پایینتر از 1.791 است که مدل مرجع پیش از شروع همه اینها داشت.
یک نکته احتیاطی پیش از اینکه این عدد جایی نقل شود: 1.791 سطر آخر و 0.974 که جدول اول به policy شروع میدهد، دو اندازهگیری متفاوت از همان مدل پیش از RL هستند که جداگانه در دو آزمایش گرفته شدهاند. سطرها را فقط درون یک جدول مقایسه کنید، نه بین جدولها — نتیجه هر جدول بر سطرهای خودش استوار است و هیچکدام به baseline دیگری وابسته نیست.
پس خلاصه صادقانه این نیست که «جریمه KL جلوی reward hacking را میگیرد». این است:
جریمه KL جلوی reward hacking را نمیگیرد. فقط محدود میکند policy چقدر میتواند از مرجع دور شود — و چون شکست به حرکت نیاز دارد، این کمک میکند. اما قلاده است، نه اصلاحکننده: در پایین قلاده پاره میشود، و در بالا مدل مرجع را پس میگیرید و کل مرحله گران هیچ چیزی نخریده است.
بازه مفید باریک است، جای آن به reward model وابسته است، و هیچ راهی برای پیدا کردنش وجود ندارد جز نگاه کردن. به همین دلیل مدل مرجع باید خوب باشد — KL کف کیفیت مرجع است، نه سقفی روی شکست — و این بخش بزرگی از دلیل دشوار بودن این مرحله در عمل است، نه در اصل.
PPO، و چرا DPO آن را کنار زد
لینک به بخش: PPO، و چرا DPO آن را کنار زدالگوریتمی که باعث شد این کار در scale جواب بدهد Proximal Policy Optimization بود.3 در یک پاراگراف: advantage هر پاسخ را برآورد میکند، policy را بهروزرسانی میکند تا احتمال پاسخهای بالاتر از baseline را افزایش دهد، و اندازه هر بهروزرسانی منفرد را clip میکند تا یک برآورد advantage بزرگ نتواند policy را در یک قدم نابود کند. وقتی روی مدلهای زبانی اعمال شود4 یعنی چهار مدل همزمان در بازی باشند — policy، reference، reward model و critic — و policy در طول آموزش نمونههای تازه تولید کند.
کار میکند، InstructGPT و همه چیزهای مشتقشده از آن را تولید کرد، و واقعاً دشوار است: چهار مدل در حافظه، sampling در حلقه آموزش، و شهرتی برای ناپایداری که سزاوارش است. وانمود کردن اینکه میتوان آن را در یک پست وبلاگی پیادهسازی کرد صادقانه نبود، پس این فصل چنین کاری نمیکند.
چیزی که برای بیشتر کاربردها جایگزینش شد از دیدن یک نکته آمد. objective بالا که با KL regularized شده یک policy بهینه با فرم بسته دارد، و آن عبارت را میتوان وارونه کرد: reward را میتوان بر حسب policy بهینه و reference نوشت. با جایگذاری آن در Bradley–Terry loss، reward model کاملاً ناپدید میشود. چیزی که باقی میماند یک supervised loss روی جفتهای ترجیحی است — بدون sampling، بدون critic، بدون reward model، دو مدل در حافظه بهجای چهار.
این Direct Preference Optimization است،5 و دو خط دارد:
def dpo_loss(pi_w, pi_l, ref_w, ref_l, beta=0.1):
"""pi_* and ref_* are summed log-probabilities of a full response."""
logits = beta * ((pi_w - ref_w) - (pi_l - ref_l))
return -F.logsigmoid(logits) بخوانید چه میگوید. مقداری که بالا برده میشود این است که policy نسبت به reference چقدر بیشتر برنده را ترجیح میدهد، منهای اینکه چقدر بیشتر بازنده را ترجیح میدهد. reference جریمهای نیست که بعداً به آن پیچ شده باشد — داخل loss است، و به همین دلیل DPO به term جداگانه KL نیاز ندارد.
مهمترین ویژگی در gradient است. loss و gradient آن را روی همان جفت در پنج state متفاوت policy ارزیابی کنید:
| state مربوط به policy | loss | بزرگی gradient |
|---|---|---|
| از قبل برنده را بهشدت ترجیح میدهد | 0.5130 | 0.0401 |
| از قبل آن را ضعیف ترجیح میدهد | 0.6685 | 0.0488 |
| یکسان با reference | 0.6931 | 0.0500 |
| بازنده را ترجیح میدهد | 0.7981 | 0.0550 |
| بازنده را بهشدت ترجیح میدهد | 1.0055 | 0.0634 |
هرچه policy بیشتر اشتباه کند، gradient بزرگتر میشود. جفتهایی که مدل از قبل درست مدیریت میکند تقریباً هیچ سهمی ندارند؛ جفتهایی که وارونه میفهمد بهروزرسانی را غالب میکنند. DPO هر مثال را بر اساس اینکه policy در همان لحظه چقدر اشتباه است وزندهی میکند، بهصورت خودکار، بدون scheduling — و همین خود-وزندهی سازوکاری است که کاری را انجام میدهد که در PPO برآورد advantage و critic انجام میدادند. (loss در سطر سوم دقیقاً است، که لنگر بررسی هر پیادهسازی است: policyای که با reference خودش یکسان است هیچ چیزی یاد نگرفته و باید روی بایستد.)
GRPO6 مسیر متفاوتی برای خروج از همان مسئله میگیرد. حلقه sampling را نگه میدارد اما critic را حذف میکند: بهجای آموزش مدلی برای پیشبینی baseline، یک گروه پاسخ برای همان prompt نمونهبرداری میکند و مستقیماً از میانگین reward گروه بهعنوان baseline استفاده میکند. advantage یک پاسخ یعنی چقدر از خواهر و برادرهایش بهتر بوده است. این یک مدل کامل را با batch بزرگتر عوض میکند، و همین چیزی است که آموزش با reward قابلراستیآزمایی — موضوع فصل 12 — را عملی کرد.
نمایش جزئیات
سه قطعه دیگر از چشمانداز post-training، کوتاه.
RLAIF و Constitutional AI.7 annotator لازم نیست انسان باشد. به یک مدل مجموعهای مکتوب از اصول بدهید و از آن بخواهید خروجیهای خودش را نقد و بازنویسی کند، یا بین دو نامزد انتخاب کند، و dataset ترجیحی دارید که با سرعت و هزینه ماشین تولید شده است. ایراد واضح — اینکه مدل دارد تکلیف خودش را نمره میدهد — واقعی است، و پاسخ صادقانه این است که بهتر از چیزی که به نظر میرسد کار میکند، چون قضاوت از تولید آسانتر است؛ همان عدمتقارنی که کل فصل بر آن تکیه دارد.
LIMA، و اینکه این کار چقدر داده کمی میخواهد.8 هزار demonstration با دقت curate شده یک assistant رقابتی تولید کرد. توضیح پیشنهادی این است که pretraining از قبل دانش و قالب را نصب کرده، و post-training فقط باید انتخاب کند کدام رفتارهای موجود مدل به سطح بیاید. اگر این درست باشد، کیفیت داده post-training بر کمیت آن غالب است — و رفتار این حوزه از آن زمان نشان میدهد آدمها به آن باور دارند.
LoRA و QLoRA.910 Fine-tuning هر وزن یک مدل بزرگ به حافظه برای وزنها، gradientهایشان و state مربوط به optimizer نیاز دارد — همان شانزده بایت به ازای هر پارامتر در فصل 10، روی دو میانگینی که فصل 6 با دست ساخت — در scaleی که به کلاستر نیاز دارد. LoRA وزنهای اصلی را freeze میکند و یک جفت ماتریس low-rank را کنارشان آموزش میدهد، و پارامترهای قابلآموزش را چندین مرتبه کاهش میدهد؛ QLoRA علاوه بر آن base منجمد را به 4 بیت quantize میکند. هر دو اینجا بهعنوان تکنیک پوشش داده میشوند. اینکه fine-tuning اصلاً چیز درستی برای خرج کردن پول هست یا نه سؤال دیگری است، و متعلق به فصل 20 است.
مالیات alignment، و پرسشی که هیچکس پاسخ نداده است
لینک به بخش: مالیات alignment، و پرسشی که هیچکس پاسخ نداده استدو چیز را با خود جلو ببرید.
اول اینکه این مرحله هزینه دارد، و بهصورت capability ظاهر میشود. مدلها اغلب پس از alignment training در بعضی benchmark taskها بهطور قابلاندازهگیری بدتر میشوند — همان alignment tax — چون objective عوض شده است: پاسخی که ایمن، محتاط و خوشقالب است همیشه پاسخی نیست که accuracy را بیشینه کند. بخشی از این فاصله با مهندسی کم شده، و بخشی از آن یک trade-off واقعی است، نه bugی برای رفع کردن.
دوم پرسشی است که واژه aligned پنهان میکند. aligned با چه کسی؟ زنجیره این است: شرکتی guidelineها را مینویسد، پیمانکاران آنها را تفسیر میکنند، مقایسههایشان reward model را آموزش میدهد، reward model یک policy را شکل میدهد، و policy به سؤال کسی پاسخ میدهد که هیچکدام از اینها را ندیده است. هر حلقه انتخابی است که آدمهایی مشخص انجام دادهاند، و هیچیک از الگوریتمهای این فصل هیچ نظری درباره خوب بودن آن انتخابها ندارد.
این یک آرایه خطابی نیست. دلیل عینی این است که چرا دو مدل frontier درخواستهای متفاوتی را رد میکنند، چرا همان مدل بین نسخهها نظرش عوض میشود، و چرا «aligned» توصیف یک فرایند است نه خاصیت یک artefact. ریاضیات این فصل تثبیتشده است. آن بخش نه.
بعد به کجا میرود
لینک به بخش: بعد به کجا میرودPost-training به مدل یاد داد پاسخ دهد. به آن یاد نداد پیش از پاسخ دادن فکر کند، و این دو تفاوتی دارند که معلوم میشود قابل آموزش است.
فصل 12 درباره این است که وقتی به مدل اجازه میدهید در زمان پاسخگویی، نه در زمان آموزش، computation بیشتری روی یک سؤال سخت خرج کند چه اتفاقی میافتد — chain of thought، reinforcement learning از rewardهای قابلراستیآزمایی، و دلیل اینکه مدلی که روند کارش را نشان میدهد صرفاً خودش را توضیح نمیدهد، بلکه متفاوت محاسبه میکند. همچنین بدهی این فصل را صاف میکند: GRPO در آن حضور دارد، کاری را انجام میدهد که قبلاً critic در PPO انجام میداد، روی rewardهایی که اصلاً به annotator نیاز ندارند چون یک proof یا check میشود یا نمیشود.
منابع و روش
لینک به بخش: منابع و روشنسلهای بالا از gpt2 و Qwen/Qwen2.5-0.5B-Instruct با greedy decoding آمدهاند، پس دقیقاً بازتولید میشوند. فصل 11 از Hugging Face LLM Course اگر بخواهید بهجای شبیهسازی، نمونه واقعی را اجرا کنید، SFT و DPO را با trl و peft قدمبهقدم توضیح میدهد؛ فصل 7 از کتاب Sebastian Raschka با عنوان Build a Large Language Model (From Scratch) instruction fine-tuning را از ابتدا تا انتها بدون کتابخانه پیادهسازی میکند.
ارجاعات
لینک به بخش: ارجاعات-
Sutton, R. S. and Barto, A. G. Reinforcement Learning: An Introduction, 2nd edition (MIT Press, 2018). این ارجاع عمدی است: کادر واژگان بالا کوچکترین زیرمجموعه قابلاستفاده است، و موضوع واقعی یک کتاب است. ↩
-
Bradley, R. A. and Terry, M. E. Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons. Biometrika 39(3/4), pp. 324–345 (1952). مدل pairwise-comparison که زیر هر reward model مورد استفاده امروز قرار دارد. ↩
-
Schulman, J., Wolski, F., Dhariwal, P., Radford, A. and Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347 (2017). ↩
-
Ouyang, L. et al. Training language models to follow instructions with human feedback. arXiv:2203.02155 (2022). InstructGPT — مقالهای که دستورالعمل سهمرحلهای را استاندارد کرد. پیش از آن Christiano et al. (arXiv:1706.03741) بود که یادگیری reward model از مقایسههای انسانی را معرفی کرد، و Stiennon et al. (arXiv:2009.01325) که آن را روی خلاصهسازی به کار برد. ↩
-
Rafailov, R., Sharma, A., Mitchell, E., Ermon, S., Manning, C. D. and Finn, C. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290 (2023). استخراجی که reward model را حذف میکند در بخش 4 است و ارزش خواندن کامل را دارد؛ کوتاهتر از شهرتش است. ↩
-
Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). GRPO را در بخش 4.1 معرفی میکند. ↩
-
Bai, Y. et al. Constitutional AI: Harmlessness from AI Feedback. arXiv:2212.08073 (2022). ↩
-
Zhou, C. et al. LIMA: Less Is More for Alignment. arXiv:2305.11206 (2023). ↩
-
Hu, E. J. et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685 (2021). ↩
-
Dettmers, T., Pagnoni, A., Holtzman, A. and Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023). ↩