راه
۶ کیو· متوسطمتوسطPYTHON۴ ثانیه · ۲۵۶ مگابایت

نیم‌دقت و مقیاس‌دهی زیان

در آموزش با دقت مختلط (mixed precision) بخشی از محاسبه با float16 انجام می‌شود: دو برابر سریع‌تر و نصف حافظه، ولی بازه‌ی عددهایش کوچک است. کوچک‌ترین عدد مثبت float16 حدود 6×10−86 \times 10^{-8} است و بزرگ‌ترینش ۶۵۵۰۴. گرادیانی کوچک‌تر از نصف آن کوچک‌ترین عدد، در float16 صفر می‌شود (underflow) و آن به‌روزرسانی گم می‌شود.

چاره‌ی torch.cuda.amp.GradScaler: زیان را پیش از backward در عدد بزرگی مثل S=216S = 2^{16} ضرب کن، تا همه‌ی گرادیان‌ها SS برابر شوند و از ناحیه‌ی صفر بیرون بیایند؛ پیش از گام بهینه‌ساز تقسیم بر SS کن.

تابع fp16_report(g, scale) گرادیان‌های g (همه غیرصفر) را می‌گیرد و سه نسبت برمی‌گرداند:

  1. نسبت گرادیان‌هایی که با تبدیل مستقیم به np.float16 صفر می‌شوند؛
  2. همان نسبت وقتی اول در scale ضرب و بعد تبدیل می‌شوند؛
  3. نسبت گرادیان‌هایی که بعد از ضرب در scale و تبدیل، بی‌نهایت می‌شوند (overflow) — دلیل این‌که GradScaler اگر بی‌نهایت دید آن گام را رد می‌کند و SS را کوچک می‌کند.

نمونه‌ها

ورودی نمونه ۱
[[-0.0491, 1.98e-06, 5.9e-05, 1.95e-10, -0.00816, -4.47e-05, 2.9e-07, 0.019, -1.53e-07, -5.78e-06, 2.56e-09, -1.71e-06], 1024.0]
خروجی نمونه ۱
[0.1667, 0.0, 0.0]

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود