گراف محاسباتی و پس‌انتشار

گرادیان یک تابع زیان را با قاعده‌ی زنجیره‌ای روی گراف محاسباتی دستی حساب کنی و بدانی چرا گرادیان در شبکه‌های عمیق محو یا منفجر می‌شود.

14 دقیقه مطالعه · 5 سؤال تمرینی · یادگیری ماشین میانی و پیشرفته

گراف محاسباتی و قاعده‌ی زنجیره‌ای

هر محاسبه‌ی شبکه‌ی عصبی را می‌شود به‌صورت یک گراف محاسباتی (Computational Graph) نوشت: گره‌ها عملیات ساده‌اند (جمع، ضرب، تابع فعال‌سازی) و یال‌ها مقادیر میانی را جابه‌جا می‌کنند.

هر گره فقط باید مشتق محلی خودش را بداند. اگر z=g(u)z = g(u) و u=h(w)u = h(w) باشد، طبق قاعده‌ی زنجیره‌ای:

∂L∂w=∂L∂z⋅∂z∂u⋅∂u∂w\frac{\partial L}{\partial w} = \frac{\partial L}{\partial z}\cdot\frac{\partial z}{\partial u}\cdot\frac{\partial u}{\partial w}

مثال: برای L=(y^−y)2L = (\hat y - y)^2 با y^=wx+b\hat y = wx + b:

∂L∂w=2(y^−y)⋅x\frac{\partial L}{\partial w} = 2(\hat y - y)\cdot x

یعنی «گرادیانِ رسیده از بالا» ضرب در «مشتق محلی» گره.

پس‌انتشار: مشتق‌گیری خودکار در حالت معکوس

پس‌انتشار (Backpropagation) همان مشتق‌گیری خودکار در حالت معکوس (Reverse-mode Autodiff) است:

  1. گذر رو به جلو: مقادیر همه‌ی گره‌ها حساب و برای استفاده‌ی بعدی ذخیره می‌شوند.
  2. گذر رو به عقب: از ∂L/∂L=1\partial L/\partial L = 1 شروع می‌کنیم و گره‌ها را به ترتیب عکس توپولوژیک پیمایش می‌کنیم. هر گره گرادیان ورودی‌هایش را از روی گرادیان خروجی و مشتق محلی می‌سازد.

چرا حالت معکوس؟ زیان یک اسکالر است ولی پارامترها میلیون‌ها هستند. حالت معکوس گرادیان نسبت به همه‌ی پارامترها را با هزینه‌ای در حد چند برابر یک گذر رو به جلو می‌دهد. حالت پیشرو برای هر پارامتر یک گذر جدا لازم داشت.

بهای این کار حافظه است: فعال‌سازی‌های گذر رو به جلو باید تا گذر رو به عقب نگه داشته شوند.

محوشدن و انفجار گرادیان

در یک شبکه‌ی LL لایه، گرادیان لایه‌های اول از حاصل‌ضرب ژاکوبی‌های همه‌ی لایه‌های بعدی به دست می‌آید. اگر این عوامل مدام کوچک‌تر از ۱ باشند، گرادیان به‌صورت نمایی محو می‌شود (Vanishing)؛ اگر بزرگ‌تر از ۱ باشند، منفجر می‌شود (Exploding).

سیگموید مثال کلاسیک است:

σ′(z)=σ(z)(1−σ(z))≤14\sigma'(z) = \sigma(z)\big(1 - \sigma(z)\big) \le \tfrac14

پس هر لایه‌ی سیگموید گرادیان را در ضریبی حداکثر 14\tfrac14 ضرب می‌کند (یعنی دست‌کم ۴ برابر کوچکش می‌کند)، اگر وزن‌ها بزرگ نباشند.

راه‌حل‌های رایج: فعال‌سازی ReLU (مشتق ۱ برای ورودی مثبت)، مقداردهی اولیه‌ی درست، نرمال‌سازی، اتصال باقیمانده (Residual) و برای انفجار، بریدن گرادیان (Gradient Clipping).

تمرین‌های این درس را حل کن (رایگان)