خطای پنهان در bf16 و AdamW: چرا بروزرسانی وزنها متوقف میشود؟ — Bf16 might be freezing your weight updates
خلاصه
هنگام فاینتیون مدلها با فرمت bf16 و به کارگیری مستقیم AdamW، تغییرات کوچک وزنی به دلیل محدودیت مانتیسا نادیده گرفته میشوند. این پدیده به طور ناخواسته مدل را به یک تمریندهنده تنک (Sparse) تبدیل میکند که فقط وزنهای کوچک را آپدیت کرده و بقیه را فریز میکند.
مقدمه و زمینه
در دنیای یادگیری ماشین، فرمتهای ممیز شناور (Floating-Point) نقش حیاتی در مصرف حافظه و سرعت پردازش دارند. فرمت bf16 (Brain Floating Point) با داشتن ۸ بیت توان (Exponent) و ۷ بیت مانتیسا (Mantissa)، دامنه عددی مشابه fp32 را پوشش میدهد اما دقت کمتری دارد. در فرآیند فاینتیون مدلهای بزرگ، اگر به جای نگهداری یک نسخه مرجع از وزنها با دقت fp32، مستقیماً از وزنهای bf16 استفاده کنید و بهینهسازی مثل torch.optim.AdamW را روی آنها اعمال کنید، رفتار عجیبی رخ میدهد.
مکانیسم پدید آمدن این مشکل
ساختار ممیزهای شناور به گونهای است که فاصله بین مقادیر مجاور (گپها) با بزرگتر شدن اعداد افزایش مییابد. در bf16، گپ بین دو عدد مجاور حدود 1/128 تا 1/256 مقدار خود عدد است. هنگامی که یک بهینهساز مانند Adam گام کوچکی برای تغییر وزن برمیدارد، اگر این تغییر کمتر از نصف گپ موجود باشد، مقدار جدید به عدد قبلی گرد میشود و تغییر عملاً گم میشود.
- در نرخهای یادگیری (Learning Rate) پایین (مانند
1e-6)، فقط وزنهای بسیار کوچک تغییرات کافی برای عبور از این آستانه را دارند. - وزنهای بزرگتر به دلیل این گرد شدن، هیچگاه آپدیت نمیشوند و ثابت باقی میمانند.
- در نتیجه، فرمت
bf16به طور ناخواسته به عنوان یک ماسک وزنی (Weight Mask) عمل میکند که فقط حدود ۵ درصد از وزنهای کوچک مدل را آموزش داده و ۹۵ درصد بقیه را فریز میکند.
تاثیر بر الگوریتم AdamW و کدهای واقعی
بررسی کدهای واقعی منتشر شده برای مقالاتی مانند Quiet-STaR نشان میدهد که عدم استفاده از نسخه پشتیبان (Master Copy) با دقت fp32 باعث بروز این رفتار شده است. نویسنده مقاله اصلی با بررسی وزنهای مدل Mistral-7B پس از فاینتیون متوجه شد که فقط کسر کوچکی از وزنها تغییر کردهاند و اگر از یک بهینهساز دقیق fp32 استفاده شود، مدل دچار واگرایی (Divergence) شده و اصطلاحاً منفجر میشود.
در واقع، پایداری بسیاری از دستورالعملهای فاینتیون منتشر شده در ادبیات یادگیری ماشین، نتیجه یک باگ گرد کردن است؛ نرخ یادگیری پایین عملاً با دور ریختن ۹۹ درصد آپدیتها کار میکند و این نقص محاسباتی از خراب شدن مدل جلوگیری میکند.
دیدگاه جامعه هکرنیوز
بحثهای شکل گرفته در هکرنیوز پیرامون این مقاله نکات جالبی را روشن کرد:
- برخی کاربران به راهکارهای جایگزین مانند آپدیت احتمالی (Probabilistic Update) اشاره کردند تا گامهای کوچک به جای گرد شدن صفر، شانس درستی برای اعمال شدن داشته باشند.
- تعدادی از مهندسان یادآوری کردند که ضرورت نگهداری یک نسخه
fp32از وزنها برای بهینهسازها موضوع جدیدی نیست و از زمان رواجfp16شناخته شده بود. - بحثهایی نیز درباره مزایای فاینتیون در
fp16برای کاهش خطای ادغام LoRA مطرح شد.
چرا برای مهندسان اهمیت دارد؟
اگر در حال بهینهسازی یا فاینتیون مدلهای زبانی بزرگ روی سختافزارهای مدرن هستید و به طور مستقیم از وزنهای bf16 بدون Master Weights استفاده میکنید، ممکن است به طور ناخودآگاه رفتار بهینهساز خود را تغییر دهید. شناخت این محدودیتها کمک میکند تا علت شکست یا موفقیت عجیب برخی دستورالعملهای آموزشی را درک کنید و از خطاهای پنهان در پپلاینهای تمرین مدل جلوگیری نمایید.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل