cover1_compressed

بازپس‌انتشار خطا از صفر – بخش اول: گرادیان، گراف محاسباتی و قاعده زنجیره‌ای

۱. چرا شبکه عصبی باید گرادیان خطا را به عقب منتقل کند؟

شبکه عصبی در مرحله انتشار رو‌به‌جلو (Forward Propagation) مجموعه‌ای از محاسبات را روی داده‌های ورودی انجام می‌دهد و در نهایت خروجی تولید می‌کند. اما تولید خروجی، حتی اگر از نظر ریاضی کاملاً صحیح انجام شده باشد، به معنای یادگیری نیست. برای یادگیری، شبکه باید بتواند تشخیص دهد که پارامترهای آن چگونه در خطای پیش‌بینی نقش داشته‌اند.

فرض کنید شبکه‌ای برای پیش‌بینی فروش روزانه یک فروشگاه طراحی کرده‌ایم. ورودی‌های شبکه شامل تعداد بازدیدکنندگان، میزان تخفیف و هزینه تبلیغات است. شبکه با استفاده از وزن‌ها و بایاس‌های خود، فروش روز بعد را تخمین می‌زند.

اگر فروش واقعی با مقدار پیش‌بینی‌شده متفاوت باشد، می‌توانیم خطای پیش‌بینی را محاسبه کنیم؛ اما هنوز به پرسش مهم‌تری پاسخ نداده‌ایم:

کدام وزن‌ها باید تغییر کنند، در چه جهتی و با چه میزان حساسیتی نسبت به خطا؟

این همان مسئله‌ای است که محاسبه گرادیان و الگوریتم بازپس‌انتشار خطا (Backpropagation) برای حل آن به کار می‌روند.

۱.۱. تفاوت محاسبه خروجی و یادگیری از خطا

برای روشن‌شدن مسئله، یک مدل بسیار ساده را در نظر می‌گیریم:

y^=wx+b\hat{y}=wx+b

که در آن:

• x: مقدار ورودی؛
• w: وزن ورودی؛
• b: بایاس؛
• ŷ: خروجی پیش‌بینی‌شده مدل.

فرض کنید داده‌های آموزشی زیر را داریم:

x=3,w=2,b=1x=3,\qquad w=2,\qquad b=1

در نتیجه:

y^=(2)(3)+1=7\hat{y}=(2)(3)+1=7

اگر مقدار واقعی برابر (y=10) باشد، مدل به‌اندازه ۳ واحد کمتر از مقدار واقعی پیش‌بینی کرده است.

برای اندازه‌گیری اختلاف پیش‌بینی و مقدار واقعی، تابع زیان زیر را انتخاب می‌کنیم:

ℒ=12(y^−y)2\mathcal{L}=\frac{1}{2}(\hat{y}-y)^2

ضریب ۱/۲ برای ساده‌شدن مشتق‌گیری انتخاب شده است و در این مثال، محل مقدار کمینه زیان را تغییر نمی‌دهد.

با جایگذاری اعداد:

ℒ=12(7−10)2=12(9)=4.5\mathcal{L}=\frac{1}{2}(7-10)^2=\frac{1}{2}(9)=4.5

اکنون می‌دانیم مقدار زیان برابر ۴٫۵ است. بااین‌حال، این عدد به‌تنهایی مشخص نمی‌کند وزن و بایاس چگونه باید تغییر کنند.

برای مثال، افزایش وزن از ۲ به ۲٫۱ خروجی را به مقدار زیر می‌رساند:

y^new=(2.1)(3)+1=7.3\hat{y}_{\mathrm{new}}=(2.1)(3)+1=7.3

زیان جدید برابر است با:

ℒnew=12(7.3−10)2=3.645\mathcal{L}_{\mathrm{new}}=\frac{1}{2}(7.3-10)^2=3.645

در نتیجه، افزایش وزن به‌اندازه ۰٫۱ موجب کاهش زیان به‌اندازه ۰٫۸۵۵ شده است.

اما اگر بایاس را به‌جای وزن افزایش دهیم، چه اتفاقی می‌افتد؟ آیا اثر آن نیز همین مقدار خواهد بود؟

این پرسش، ما را از مفهوم «خطا» به مفهوم «حساسیت خطا» هدایت می‌کند.

۱.۲. گرادیان چه اطلاعاتی در اختیار شبکه قرار می‌دهد؟

گرادیان (Gradient) مجموعه مشتق‌های جزئی تابع زیان نسبت به پارامترهای مدل است. برای مدلی با دو پارامتر (w) و (b)، گرادیان به‌صورت زیر نوشته می‌شود:

∇ℒ=[∂ℒ∂w∂ℒ∂b]\nabla\mathcal{L}= \begin{bmatrix} \frac{\partial\mathcal{L}}{\partial w}\\[4pt] \frac{\partial\mathcal{L}}{\partial b} \end{bmatrix}

هر مشتق جزئی نشان می‌دهد اگر یک پارامتر اندکی تغییر کند و سایر پارامترها ثابت بمانند، زیان با چه نرخ لحظه‌ای تغییر خواهد کرد.

برای مدل خطی ما:

ℒ(w,b)=12(wx+b−y)2\mathcal{L}(w,b)=\frac{1}{2}(wx+b-y)^2

مشتق زیان نسبت به وزن برابر است با:

∂ℒ∂w=(wx+b−y)x\frac{\partial\mathcal{L}}{\partial w}=(wx+b-y)x

و مشتق نسبت به بایاس:

∂ℒ∂b=wx+b−y\begin{equation} \frac{\partial\mathcal{L}}{\partial b}=wx+b-y \end{equation}

این روابط در بخش‌های بعدی فصل از قاعده زنجیره‌ای استخراج خواهند شد. فعلاً از آن‌ها برای تفسیر مفهوم گرادیان استفاده می‌کنیم.

با قرار دادن مقادیر مثال:

∂ℒ∂w=(7−10)(3)=−9∂ℒ∂b=7−10=−3\begin{aligned} \frac{\partial\mathcal{L}}{\partial w}&=(7-10)(3)=-9\\ \frac{\partial\mathcal{L}}{\partial b}&=7-10=-3 \end{aligned}

پس:

∇ℒ=[−9−3]\boxed{\nabla\mathcal{L}= \begin{bmatrix} -9\\ -3 \end{bmatrix}}

این نتیجه دو نکته مهم دارد. نخست، در وضعیت فعلی مدل، افزایش اندک هر دو پارامتر می‌تواند زیان را کاهش دهد، زیرا مشتق هر دو منفی است. دوم، اندازه حساسیت زیان نسبت به وزن، با واحد پارامتر مربوط، سه برابر حساسیت آن نسبت به بایاس است.

البته مقایسه مستقیم اندازه مشتق‌ها برای پارامترهایی با مقیاس یا واحد متفاوت همیشه نشان‌دهنده اهمیت نسبی آن‌ها نیست. این مقایسه در مثال حاضر صرفاً رفتار محلی تابع زیان را نشان می‌دهد.

۱.۳. نمایش محاسبات در گراف

در نمودار زیر، تمام محاسبات اصلی مدل نمایش داده شده‌اند.

شکل ۱-۱. مسیر محاسبه خروجی و گرادیان

اعداد این شکل از یک مثال آموزشی ساختگی به دست آمده‌اند. مسیر پیوسته، محاسبه خروجی و زیان را نشان می‌دهد؛ مسیر خط‌چین، محاسبه گرادیان را به‌صورت مفهومی نمایش می‌دهد.

۱.۴. بررسی رفتار تابع زیان با تغییر وزن

برای اینکه مفهوم مشتق ملموس‌تر شود، بایاس را ثابت نگه می‌داریم و وزن را تغییر می‌دهیم.

تابع زیان در این حالت عبارت است از:

ℒ(w)=12(3w−9)2\mathcal{L}(w)=\frac{1}{2}(3w-9)^2

شکل ۱-۲. تغییر زیان با تغییر وزن

در این مثال بایاس برابر ۱ و مقدار واقعی خروجی برابر ۱۰ ثابت است.

نمودار نشان می‌دهد در (w=2)، با افزایش وزن، زیان ابتدا کاهش می‌یابد. این مشاهده با مشتق منفی در همان نقطه سازگار است. در (w=3)، زیان به صفر می‌رسد و مشتق آن نیز صفر می‌شود.

توجه کنیم که گرادیان در یک نقطه، شیب محلی تابع را مشخص می‌کند؛ نه اینکه مقدار تغییر زیان برای هر گام دلخواه دقیقاً برابر حاصل‌ضرب گرادیان در آن گام باشد.

۱.۵. چرا روش تغییر آزمایشی تک‌تک وزن‌ها کافی نیست؟

در مثال ساده بالا، فقط دو پارامتر داشتیم و می‌توانستیم مقدار زیان را با تغییر آن‌ها محاسبه کنیم. اما یک شبکه چندلایه ممکن است میلیون‌ها پارامتر داشته باشد.

اگر بخواهیم مشتق هر پارامتر را با روش تفاضل مرکزی محاسبه کنیم، برای هر پارامتر به دو ارزیابی تابع زیان نیاز داریم:

∂ℒ∂θi≈ℒ(θi+h)−ℒ(θi−h)2h\frac{\partial\mathcal{L}}{\partial\theta_i}\approx\frac{\mathcal{L}(\theta_i+h)-\mathcal{L}(\theta_i-h)}{2h}

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

در مقابل، Backpropagation با استفاده مجدد از محاسبات میانی و انتقال نظام‌مند گرادیان‌ها در جهت معکوس، تمام گرادیان‌ها را با هزینه‌ای که معمولاً هم‌مرتبه با هزینه محاسبه رو‌به‌جلو شبکه است به دست می‌آورد (Goodfellow et al., 2016).

این مزیت محاسباتی، یکی از دلایل اساسی کاربرد Backpropagation در یادگیری عمیق است.

۱.۶. یک مثال کاربردی دیگر: پیش‌بینی مصرف انرژی

فرض کنید یک مدل خطی ساده برای پیش‌بینی مصرف انرژی یک دستگاه داریم:

y^=0.5x1+0.2x2+1\hat{y}=0.5x_1+0.2x_2+1

در این مثال ساختگی، (x1) و (x2) ویژگی‌های عددی نرمال‌سازی‌شده مربوط به مدت فعالیت و بار دستگاه هستند. فرض کنید:

x1=4,x2=5,y=5x_1=4,\qquad x_2=5,\qquad y=5

خروجی مدل:

y^=0.5(4)+0.2(5)+1=4\hat{y}=0.5(4)+0.2(5)+1=4

زیان:

ℒ=12(4−5)2=0.5\mathcal{L}=\frac{1}{2}(4-5)^2=0.5

مشتق زیان نسبت به خروجی:

∂ℒ∂y^=4−5=−1\frac{\partial\mathcal{L}}{\partial\hat{y}}=4-5=-1

بنابراین:

∂ℒ∂w1=−1(4)=−4∂ℒ∂w2=−1(5)=−5∂ℒ∂b=−1\begin{aligned} \frac{\partial\mathcal{L}}{\partial w_1}&=-1(4)=-4\\ \frac{\partial\mathcal{L}}{\partial w_2}&=-1(5)=-5\\ \frac{\partial\mathcal{L}}{\partial b}&=-1 \end{aligned}
پارامترمقدارگرادیان
وزن مدت فعالیت۰٫۵۴-
وزن بار دستگاه۰٫۲۵-
بایاس۱۱-

این مثال نشان می‌دهد گرادیان تنها به اختلاف خروجی و مقدار واقعی وابسته نیست؛ بلکه مقدار ورودی مرتبط با هر وزن نیز در آن نقش دارد.

ازاین‌رو، پیش‌پردازش و مقیاس‌بندی ویژگی‌ها می‌توانند بر مقیاس گرادیان‌ها اثر بگذارند. تحلیل جامع این موضوع به فصل بهینه‌سازی و آماده‌سازی داده‌ها تعلق دارد.

۱.۷. جمع‌بندی

تا اینجا سه نتیجه به دست آورده‌ایم.

نخست، محاسبه مقدار زیان برای یادگیری کافی نیست. شبکه به اطلاعاتی درباره حساسیت زیان نسبت به پارامترهای خود نیاز دارد.

دوم، مشتق هر پارامتر مشخص می‌کند که تغییر کوچک آن پارامتر، در شرایط ثابت‌بودن سایر پارامترها، چگونه بر زیان اثر می‌گذارد.

سوم، محاسبه مستقل مشتق‌ها با اجرای مکرر کل شبکه در مقیاس بزرگ پرهزینه است. Backpropagation با استفاده از ساختار وابستگی محاسبات، این مسئله را به‌صورت کارآمد حل می‌کند.

تمرین‌های بخش اول

  • تمرین ۱ ـ محاسباتی: برای مدل (ŷ = wx + b)، با مقادیر (x=4)، (w=1.5)، (b=2) و (y=10)، خروجی، زیان مربعی نصف‌شده و گرادیان وزن و بایاس را محاسبه کنید.
  • تمرین ۲ ـ کاربردی: یک فروشگاه اینترنتی از دو ویژگی «تعداد بازدیدکنندگان» و «بودجه تبلیغات» برای پیش‌بینی فروش استفاده می‌کند. توضیح دهید چرا مقایسه مستقیم اندازه گرادیان دو وزن، بدون توجه به واحد و مقیاس ورودی‌ها، ممکن است گمراه‌کننده باشد.
  • تمرین ۳ ـ تحلیلی: در مدل (ŷ=2w+1)، مقدار واقعی (y=9) است. وزن متناظر با زیان صفر را به دست آورید و نشان دهید مشتق تابع زیان در آن نقطه صفر است.
  • تمرین ۴ ـ مفهومی: تفاوت مقدار زیان، گرادیان زیان و تغییر پارامتر در یک گام بهینه‌سازی را توضیح دهید.
  • تمرین ۵ ـ پژوهشی مقدماتی: چرا محاسبه گرادیان با تفاضل مرکزی، با وجود هزینه زیاد، همچنان برای بررسی صحت پیاده‌سازی Backpropagation مفید است؟

منابع

Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep learning. MIT Press.

Nielsen, M. A. (2015). Neural networks and deep learning. Determination Press.

Bishop, C. M. (2006). Pattern recognition and machine learning. Springer.

۲. گراف محاسباتی؛ چگونه مسیر محاسبه به مسیر انتقال گرادیان تبدیل می‌شود؟

در بخش پیشین مشاهده کردیم که مقدار زیان به‌تنهایی مشخص نمی‌کند هر پارامتر شبکه چه سهمی در تغییر خطا دارد. همچنین دیدیم که مشتق‌گیری مستقل از هر پارامتر، با اجرای مکرر کل شبکه، برای مدل‌های بزرگ پرهزینه است.

اکنون مسئله دقیق‌تری پیش روی ما قرار دارد: چگونه می‌توان یک محاسبه پیچیده را به عملیات ساده‌تر تقسیم کرد تا هم خروجی آن محاسبه شود و هم مشتق‌های موردنیاز را بتوان به‌شکلی منظم به دست آورد؟

پاسخ در مفهوم گراف محاسباتی (Computational Graph) نهفته است. گراف محاسباتی، نمایش ساختاری یک محاسبه ریاضی به‌صورت مجموعه‌ای از عملیات و وابستگی‌های میان آن‌هاست. این نمایش، بنیان محاسباتی بازپس‌انتشار خطا و مشتق‌گیری خودکار در حالت معکوس را فراهم می‌کند (Goodfellow et al., 2016; Baydin et al., 2018).

۲.۱. چرا یک فرمول ریاضی را به گراف تبدیل می‌کنیم؟

فرض کنید یک شرکت برای محاسبه درآمد حاصل از فروش محصول، از رابطه زیر استفاده می‌کند:

R=pqR=pq

در این رابطه، (p) قیمت هر واحد محصول، (q) تعداد واحدهای فروخته‌شده و (R) درآمد فروش است.

اگر قیمت هر واحد ۲۰۰ هزار تومان و تعداد فروش ۳۰ واحد باشد، درآمد برابر است با:

R=200×30=6000R=200\times30=6000

بنابراین درآمد ۶۰۰۰ هزار تومان، معادل ۶ میلیون تومان خواهد بود.

اکنون فرض کنید شرکت می‌خواهد سود خود را محاسبه کند و هزینه کل برابر ۱۰۰۰ هزار تومان باشد:

P=R−C\begin{equation} P=R-C \end{equation}

در نتیجه:

P=6000−1000=5000P=6000-1000=5000

سود شرکت ۵ میلیون تومان است.

می‌توان این دو رابطه را در یک فرمول ترکیب کرد:

P=pq−C\begin{equation} P=pq-C \end{equation}

این فرمول کوتاه است، اما دو عملیات مستقل در آن وجود دارد: ابتدا ضرب قیمت در تعداد فروش، سپس کم‌کردن هزینه از درآمد.

گراف محاسباتی همین ترتیب را آشکار می‌کند.

شکل ۲-۱. گراف محاسباتی سود فروشگاه

در شکل ۲-۱. مقادیر پولی داخل نمودار برحسب هزار تومان هستند. هر گره عملیاتی، مقدار ورودی‌های خود را دریافت کرده و نتیجه‌ای محاسبه می‌کند که در مراحل بعدی استفاده می‌شود.

تفاوت اصلی این نمودار با فرمول فشرده (P=pq-C) در آن است که مقادیر میانی، ترتیب عملیات و وابستگی هر خروجی به ورودی‌های قبلی به‌صورت آشکار نمایش داده شده‌اند.

این ویژگی زمانی اهمیت بیشتری پیدا می‌کند که به‌جای دو عملیات، صدها یا هزاران عملیات وابسته داشته باشیم.

۲.۲. اجزای گراف محاسباتی

یک گراف محاسباتی را می‌توان با چهار جزء اصلی توضیح داد: متغیرهای ورودی، عملیات، مقادیر میانی و خروجی نهایی.

برای نمونه، تابع زیر را در نظر بگیرید:

f(x)=(2x+1)2\begin{equation} f(x)=(2x+1)^2 \end{equation}

به‌جای محاسبه مستقیم، آن را به سه مرحله تقسیم می‌کنیم:

u=2xv=u+1f=v2\begin{aligned} u&=2x\\ v&=u+1\\ f&=v^2 \end{aligned}

اگر (x=3) باشد:

u=2(3)=6v=6+1=7f=72=49\begin{aligned} u&=2(3)=6\\ v&=6+1=7\\ f&=7^2=49 \end{aligned}
گامعملیاتورودیخروجی
۱ضرب در ۲(x=3)(u=6)
۲جمع با ۱(u=6)(v=7)
۳توان دوم(v=7)(f=49)

در این مثال، (u) و (v) متغیرهای میانی هستند. این متغیرها صرفاً برای ساده‌ترکردن نوشتن فرمول ایجاد نشده‌اند؛ در زمان محاسبه گرادیان نیز اطلاعات ارزشمندی در اختیار ما قرار می‌دهند.

۲.۳. انتشار رو‌به‌جلو در گراف محاسباتی

فرایند محاسبه مقادیر از ورودی به خروجی، عبور رو‌به‌جلو (Forward Pass) نام دارد.

در مثال قبل، محاسبات به ترتیب زیر انجام می‌شوند:

شکل ۲-۲. انتشار رو‌به‌جلو با نمایش محاسبات

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

بااین‌حال، همین مقادیر در عبور رو‌به‌عقب موردنیاز خواهند بود. برای مثال، مشتق تابع توان دوم (v^2) به مقدار (v) وابسته است؛ بنابراین دانستن اینکه (v=7) بوده، محاسبه مشتق را ساده می‌کند.

۲.۴. بازگشت گرادیان در همان گراف

اکنون فرض کنید بخواهیم بدانیم تغییر کوچک (x) چه اثری بر (f) دارد.

تابع اصلی عبارت است از:

f(x)=(2x+1)2f(x)=(2x+1)^2

با مشتق‌گیری مستقیم:

dfdx=2(2x+1)×2\frac{df}{dx}=2(2x+1)\times2

در (x=3):

dfdx=2(7)(2)=28\frac{df}{dx}=2(7)(2)=28

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

ابتدا از آخرین عملیات شروع می‌کنیم:

f=v2f=v^2

مشتق محلی:

dfdv=2v=14\frac{df}{dv}=2v=14

در مرحله قبل:

v=u+1v=u+1

بنابراین:

dvdu=1\frac{dv}{du}=1

و در اولین عملیات:

u=2xu=2x

پس:

dudx=2\frac{du}{dx}=2

حاصل‌ضرب این مشتق‌ها برابر است با:

dfdx=dfdvdvdududxdfdx=14×1×2=28\begin{aligned} \frac{df}{dx}&=\frac{df}{dv}\frac{dv}{du}\frac{du}{dx}\\ \boxed{\frac{df}{dx}}&\boxed{=14\times1\times2=28} \end{aligned}

این محاسبه، نخستین نمونه ساده از منطق بازپس‌انتشار است: مشتق‌های محلی از انتهای مسیر به ابتدای آن ترکیب می‌شوند.

شکل ۲-۳. مقایسه محاسبات Forward و Backward

در شکل ۲-۳. در عبور رو‌به‌جلو مقادیر محاسبه می‌شوند و در عبور رو‌به‌عقب، حساسیت خروجی نسبت به متغیرهای میانی و ورودی به دست می‌آید. مقدار اولیه گرادیان خروجی نسبت به خودش برابر یک است.

این شکل تفاوت مهمی را آشکار می‌کند: جهت حرکت محاسبات Forward و Backward مخالف یکدیگر است، اما هر دو از همان ساختار وابستگی استفاده می‌کنند.

۲.۵. گراف محاسباتی دارای چند مسیر

تا اینجا تمام مثال‌ها یک مسیر محاسباتی اصلی داشتند. اما در شبکه‌های عصبی، ممکن است یک متغیر در چند عملیات مختلف استفاده شود.

برای مثال، تابع زیر را در نظر بگیرید:

f(x)=x2+3x\begin{equation} f(x)=x^2+3x \end{equation}

متغیر (x) از دو مسیر در مقدار نهایی (f) نقش دارد:

u=x2v=3xf=u+v\begin{aligned} u&=x^2\\ v&=3x\\ f&=u+v \end{aligned}

اگر (x=2) باشد:

u=4,v=6,f=10u=4,\qquad v=6,\qquad f=10

برای محاسبه مشتق کل، باید اثر هر دو مسیر را در نظر بگیریم:

dfdx=∂f∂ududx+∂f∂vdvdx\frac{df}{dx}=\frac{\partial f}{\partial u}\frac{du}{dx}+\frac{\partial f}{\partial v}\frac{dv}{dx}

از آنجا که:

∂f∂u=1,∂f∂v=1,dudx=2x=4,dvdx=3\frac{\partial f}{\partial u}=1,\quad \frac{\partial f}{\partial v}=1,\qquad \frac{du}{dx}=2x=4,\quad \frac{dv}{dx}=3

نتیجه می‌شود:

dfdx=4+3=7\boxed{\frac{df}{dx}=4+3=7}

شکل ۲-۴. جمع گرادیان‌ها در مسیرهای منشعب

در شکل ۲-۴. متغیر (x) در دو مسیر مستقل ظاهر شده است. در بازپس‌انتشار، سهم گرادیان‌های بازگشتی از هر دو مسیر باید جمع شود.

اصل مهم: اگر یک متغیر در چند مسیر محاسباتی بر خروجی اثر بگذارد، مشتق کل نسبت به آن متغیر، حاصل جمع مشارکت‌های تمام مسیرهای وابسته است.

این اصل در شبکه‌های چندشاخه، اتصال‌های میان‌بُر و ساختارهای پیچیده‌تر اهمیت اساسی دارد. در بخش چهارم فصل، قاعده زنجیره‌ای را برای چنین گراف‌هایی به‌صورت دقیق‌تر استخراج خواهیم کرد.

۲.۶. تبدیل یک نورون مصنوعی به گراف محاسباتی

اکنون گراف محاسباتی را به مسئله اصلی فصل، یعنی شبکه عصبی، متصل می‌کنیم.

یک نورون با دو ورودی را در نظر بگیرید:

z=w1x1+w2x2+ba=φ(z)\begin{aligned} z&=w_1x_1+w_2x_2+b\\ a&=\varphi(z) \end{aligned}

فرض کنید تابع فعال‌سازی φ در این مثال، ReLU باشد:

φ(z)=max⁡(0,z)\varphi(z)=\max(0,z)

مقادیر زیر را انتخاب می‌کنیم:

x1=2,x2=3,w1=0.4,w2=0.2,b=0.1x_1=2,\quad x_2=3,\qquad w_1=0.4,\quad w_2=0.2,\quad b=0.1

محاسبه نورون:

z=(0.4)(2)+(0.2)(3)+0.1z=0.8+0.6+0.1=1.5\begin{aligned} z&=(0.4)(2)+(0.2)(3)+0.1\\ z&=0.8+0.6+0.1=1.5 \end{aligned}

چون (z) مثبت است:

a=ReLU⁡(1.5)=1.5a=\operatorname{ReLU}(1.5)=1.5

فرض کنید مقدار هدف برابر (y=2) باشد و زیان به شکل زیر تعریف شود:

ℒ=12(a−y)2\mathcal{L}=\frac{1}{2}(a-y)^2

در نتیجه:

ℒ=12(1.5−2)2=0.125\mathcal{L}=\frac{1}{2}(1.5-2)^2=0.125

گراف محاسباتی این نورون شامل عملیات ضرب، جمع، فعال‌سازی و محاسبه زیان است. در این ساختار، هر وزن مستقیماً بر یک حاصل‌ضرب اثر می‌گذارد و اثر آن از طریق جمع وزن‌دار، تابع فعال‌سازی و تابع زیان به خروجی نهایی منتقل می‌شود.

شکل ۲-۵. گراف محاسباتی نورون با مقادیر عددی

در شکل ۲-۵. در مسیر رو‌به‌جلو، مقدار خروجی و زیان محاسبه شده است. مقادیر گرادیان نیز در بخش پایینی نشان داده شده‌اند و استخراج کامل آن‌ها در بخش پنجم فصل انجام خواهد شد.

در این مثال، هر مرحله از محاسبات نورون به یک عملیات ساده تبدیل شده است. همین ساختار برای یک لایه یا شبکه چندلایه نیز قابل استفاده است؛ تفاوت در تعداد گره‌ها، ابعاد متغیرها و وابستگی‌های میان آن‌هاست.

۲.۷. گراف محاسباتی شبکه چندلایه

برای شبکه‌ای با دو لایه پارامتردار، محاسبات رو‌به‌جلو به‌صورت زیر هستند:

z(1)=W(1)x+b(1)a(1)=φ(1)(z(1))z(2)=W(2)a(1)+b(2)a(2)=φ(2)(z(2))ℒ=ℓ(a(2),y)\begin{equation} \begin{aligned} z^{(1)}&=W^{(1)}x+b^{(1)}\\ a^{(1)}&=\varphi^{(1)}(z^{(1)})\\ z^{(2)}&=W^{(2)}a^{(1)}+b^{(2)}\\ a^{(2)}&=\varphi^{(2)}(z^{(2)})\\ \mathcal{L}&=\ell(a^{(2)},y) \end{aligned} \end{equation}

در این روابط، W^(l) ماتریس وزن‌های لایه l، b^(l) بردار بایاس و a^(l) خروجی فعال‌سازی همان لایه است.

برای نمایش وابستگی‌ها، گراف را می‌توان به شکل زیر خلاصه کرد:

شکل ۲-۶. مسیر محاسبات در شبکه دو‌لایه

در شکل ۲-۶. نمای خلاصه‌شده شبکه است؛ گره‌های فعال‌سازی خروجی و عملیات داخلی هر لایه برای خوانایی ادغام شده‌اند. در بخش هفتم، گراف کامل با مقادیر عددی و ابعاد ماتریسی توسعه می‌یابد.

در این شبکه، خروجی لایه اول به ورودی لایه دوم تبدیل می‌شود. بنابراین وزن‌های لایه اول به‌طور غیرمستقیم بر زیان نهایی اثر می‌گذارند. محاسبه این اثر غیرمستقیم همان مسئله‌ای است که Backpropagation با استفاده از قاعده زنجیره‌ای حل می‌کند.

۲.۸. چرا مقادیر میانی را ذخیره می‌کنیم؟

در محاسبات رو‌به‌عقب، مشتق یک عملیات معمولاً به مقادیر محاسبه‌شده در مسیر رو‌به‌جلو وابسته است.

برای نمونه:

u=x2u=x^2

مشتق آن برابر است با:

dudx=2x\frac{du}{dx}=2x

بنابراین هنگام محاسبه گرادیان، دانستن مقدار (x) ضروری است.

یا برای تابع Sigmoid:

a=σ(z)=11+e−za=\sigma(z)=\frac{1}{1+e^{-z}}

مشتق برابر است با:

σ′(z)=a(1−a)\sigma'(z)=a(1-a)

در این حالت می‌توان از مقدار فعال‌سازی (a) که در مرحله رو‌به‌جلو محاسبه شده است، برای به دست آوردن مشتق استفاده کرد.

در نتیجه، ذخیره مقادیر میانی می‌تواند از محاسبات تکراری جلوگیری کند؛ هرچند نگهداری این مقادیر به حافظه نیاز دارد. روش‌های پیشرفته‌تر، مانند باز‌محاسبه انتخابی فعال‌سازی‌ها، میان هزینه حافظه و محاسبات مصالحه برقرار می‌کنند.

در فصل حاضر، برای روشن‌ماندن الگوریتم، ابتدا فرض می‌کنیم مقادیر لازم از Forward Pass ذخیره شده‌اند.

۲.۹. مثال تکمیلی: محاسبه هزینه تولید با گراف چندمرحله‌ای

فرض کنید هزینه کل تولید یک محصول از رابطه زیر محاسبه می‌شود:

C(q)=2q2+5q+100C(q)=2q^2+5q+100

که (q) تعداد واحد تولید و (C) هزینه برحسب واحد پولی فرضی است.

برای (q=10):

u=q2=100v=2u=200r=5q=50C=v+r+100=350\begin{aligned} u&=q^2=100\\ v&=2u=200\\ r&=5q=50\\ C&=v+r+100=350 \end{aligned}

حال می‌خواهیم بدانیم افزایش بسیار کوچک مقدار تولید، هزینه را با چه نرخی تغییر می‌دهد.

مشتق مسیر اول:

dvdq=2(2q)=4q=40\frac{dv}{dq}=2(2q)=4q=40

مشتق مسیر دوم:

drdq=5\frac{dr}{dq}=5

بنابراین:

dCdq=40+5=45\boxed{\frac{dC}{dq}=40+5=45}

این مقدار، هزینه نهایی (Marginal Cost) در (q=10) را در مدل پیوسته نشان می‌دهد. نباید آن را بدون تقریب یا محاسبه جداگانه، با افزایش دقیق هزینه ناشی از تولید یک واحد کامل برابر دانست.

برای مثال:

C(11)=2(121)+55+100=397C(11)=2(121)+55+100=397

و بنابراین:

C(11)−C(10)=397−350=47C(11)-C(10)=397-350=47

اختلاف میان ۴۵ و ۴۷ نشان می‌دهد مشتق، نرخ تغییر لحظه‌ای را بیان می‌کند، درحالی‌که اختلاف دو مقدار تابع، تغییر واقعی در یک فاصله محدود را اندازه می‌گیرد.

این تمایز در تفسیر گرادیان‌های شبکه عصبی نیز اهمیت دارد.

۲.۱۰. تمرین‌ها و مسائل بخش دوم

  • تمرین ۱ ـ ترسیم گراف: تابع (f(x)=3x^2+2) را به عملیات ساده تقسیم کنید. برای (x=2)، مقادیر تمام گره‌ها را محاسبه کرده و گراف آن را ترسیم کنید.
  • تمرین ۲ ـ مشتق مسیر: برای تابع (f(x)=(x+2)^3)، گراف محاسباتی بسازید و مشتق آن را در (x=1) از طریق مشتق‌های محلی به دست آورید.
  • تمرین ۳ ـ مسیرهای منشعب: تابع (f(x)=x^3+2x^2) را در نظر بگیرید. با استفاده از دو مسیر مستقل، مشتق تابع را در (x=2) محاسبه کنید.
  • تمرین ۴ ـ کاربرد مالی: سود یک شرکت از رابطه (P(q)=20q-2q^2-30) پیروی می‌کند. گراف محاسباتی تابع را رسم کرده و حساسیت سود نسبت به تعداد تولید را در (q=3) محاسبه کنید.
  • تمرین ۵ ـ نورون مصنوعی: برای نورونی با x₁ = ۱، x₂ = ۲، w₁ = ۰٫۵، w₂ = −۰٫۲، b = ۰٫۱ و فعال‌سازی ReLU، تمام مقادیر رو‌به‌جلو را محاسبه کنید. سپس با فرض y = ۱، زیان مربعی نصف‌شده را به دست آورید.
  • تمرین ۶ ـ تحلیل محاسباتی: توضیح دهید چرا ذخیره‌کردن مقدار فعال‌سازی‌های میانی می‌تواند محاسبه گرادیان را آسان‌تر کند و در عین حال مصرف حافظه را افزایش دهد.

پاسخ منتخب: تمرین ۲

برای تابع:

f(x)=(x+2)3f(x)=(x+2)^3

ابتدا تعریف می‌کنیم:

u=x+2,f=u3u=x+2,\qquad f=u^3

در (x=1):

u=3,f=27u=3,\qquad f=27

مشتق‌های محلی:

dfdu=3u2=27dudx=1\begin{aligned} \frac{df}{du}&=3u^2=27\\ \frac{du}{dx}&=1 \end{aligned}

بنابراین:

dfdx=27×1=27\boxed{\frac{df}{dx}=27\times1=27}

منابع بخش دوم

Baydin, A. G., Pearlmutter, B. A., Radul, A. A., & Siskind, J. M. (2018). Automatic differentiation in machine learning: A survey. Journal of Machine Learning Research, 18(153), 1–43.

Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep learning. MIT Press.

Griewank, A., & Walther, A. (2008). Evaluating derivatives: Principles and techniques of algorithmic differentiation (2nd ed.). SIAM.

۳. مشتق محلی؛ از تغییر یک متغیر تا محاسبه حساسیت

۳.۱. مشتق چه چیزی را اندازه‌گیری می‌کند؟

فرض کنید مدیر یک کارخانه می‌خواهد بداند افزایش مقدار تولید چه اثری بر هزینه کل دارد.

برای یک مدل آموزشی ساده، هزینه تولید را به‌صورت زیر تعریف می‌کنیم:

C(q)=2q2+100\begin{equation} C(q)=2q^2+100 \end{equation}

در این رابطه، (q) مقدار تولید و (C) هزینه کل برحسب واحد پولی فرضی است.

اگر مقدار تولید ۵ واحد باشد:

C(5)=2(5)2+100=150C(5)=2(5)^2+100=150

اگر تولید به ۶ واحد افزایش یابد:

C(6)=2(6)2+100=172C(6)=2(6)^2+100=172

پس افزایش هزینه برای این تغییر برابر است با:

ΔC=172−150=22\Delta C=172-150=22

و نرخ تغییر متوسط هزینه در این فاصله:

ΔCΔq=221=22\frac{\Delta C}{\Delta q}=\frac{22}{1}=22

اما آیا نرخ تغییر هزینه دقیقاً در نقطه (q=5) نیز برابر ۲۲ است؟

خیر. مقدار ۲۲، نرخ تغییر متوسط در فاصله ۵ تا ۶ است. برای محاسبه نرخ تغییر لحظه‌ای، باید فاصله تغییر را به صفر نزدیک کنیم.

تعریف مشتق چنین است:

C′(q)=limh→0⁡C(q+h)−C(q)h\begin{equation} C'(q)=\lim_{h\to0}\frac{C(q+h)-C(q)}{h} \end{equation}

در این رابطه، (h) تغییر کوچک در مقدار تولید است.

اکنون تابع هزینه را جایگذاری می‌کنیم:

C′(q)=limh→0⁡2(q+h)2+100−(2q2+100)hC'(q)=\lim_{h\to0}\frac{2(q+h)^2+100-(2q^2+100)}{h}

با بسط عبارت:

(q+h)2=q2+2qh+h2(q+h)^2=q^2+2qh+h^2

بنابراین:

C′(q)=limh→0⁡4qh+2h2hC'(q)=\lim_{h\to0}\frac{4qh+2h^2}{h}

برای h ≠ ۰، صورت و مخرج را بر h تقسیم می‌کنیم:

C′(q)=limh→0⁡(4q+2h)C'(q)=\lim_{h\to0}(4q+2h)

در نتیجه:

C′(q)=4q\begin{equation} \boxed{C'(q)=4q} \end{equation}

در نقطه (q=5):

C′(5)=20\boxed{C'(5)=20}

این نتیجه نشان می‌دهد اگر مقدار تولید در نزدیکی ۵ واحد، به‌اندازه بسیار کوچکی تغییر کند، هزینه با نرخ تقریبی ۲۰ واحد پولی به‌ازای هر واحد تولید تغییر خواهد کرد.

نکته آموزشی: مشتق، تغییر واقعی تابع برای یک گام بزرگ را مشخص نمی‌کند؛ بلکه حساسیت محلی تابع را اندازه می‌گیرد.

شکل ۳-۱. تابع هزینه و خط مماس در مقدار تولید ۵ واحد

نمای شماتیک تابع (C(q)=2q^2+100) و مماس آن در (q=5). شیب مماس برابر ۲۰ است. محور عمودی هزینه را نشان می‌دهد.

برای مقایسه عددی دقیق‌تر، تغییرهای کوچک‌تر را بررسی می‌کنیم.

تغییر تولید (h)هزینه جدید (C(5+h))نرخ تغییر متوسط
۱۱۷۲۲۲
۰٫۵۱۶۰٫۵۲۱
۰٫۱۱۵۲٫۰۲۲۰٫۲
۰٫۰۱۱۵۰٫۲۰۰۲۲۰٫۰۲
۰٫۰۰۱۱۵۰٫۰۲۰۰۰۲۲۰٫۰۰۲

مشاهده می‌کنیم که هرچه (h) کوچک‌تر می‌شود، نرخ تغییر متوسط به مقدار مشتق یعنی ۲۰ نزدیک‌تر می‌شود.

این همان منطقی است که در محاسبه گرادیان شبکه عصبی استفاده می‌شود: مشتق مشخص می‌کند تغییر کوچک یک پارامتر، چه اثری بر خروجی یا زیان خواهد گذاشت.

۳.۲. مشتق محلی چیست؟

فرض کنید یک گره محاسباتی، مقدار (u) را دریافت کرده و خروجی (v) را تولید می‌کند:

v=g(u)v=g(u)

مشتق محلی این گره برابر است با:

dvdu=g′(u)\begin{equation} \boxed{\frac{dv}{du}=g'(u)} \end{equation}

این مشتق تنها رابطه میان ورودی و خروجی همان عملیات را توصیف می‌کند. برای محاسبه آن لازم نیست بدانیم متغیر (u) چگونه تولید شده یا خروجی (v) در کدام عملیات بعدی استفاده خواهد شد.

برای مثال، اگر:

v=3u+2v=3u+2

مشتق محلی برابر است با:

dvdu=3\frac{dv}{du}=3

این یعنی تغییر بسیار کوچک u به‌اندازه Δu، تغییر خروجی را تقریباً به‌اندازه ۳Δu ایجاد می‌کند:

Δv≈3Δu\Delta v\approx3\Delta u

اگر (u) از ۴ به ۴٫۰۱ تغییر کند، چون تابع خطی است:

v(4)=14,v(4.01)=14.03v(4)=14,\qquad v(4.01)=14.03

پس:

Δv=0.03\Delta v=0.03

که دقیقاً با رابطه زیر مطابقت دارد:

3(0.01)=0.033(0.01)=0.03

در توابع غیرخطی، این رابطه معمولاً تقریبی است و برای تغییرهای کوچک دقت بیشتری دارد.

۳.۳. مشتق محلی عملیات پایه

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

برای فهم Backpropagation لازم است مشتق محلی این عملیات را بشناسیم.

۳.۳.۱. مشتق گره جمع

فرض کنید:

z=x+yz=x+y

اگر (y) ثابت باشد، افزایش (x) به‌اندازه ۰٫۱ موجب افزایش (z) به همان اندازه می‌شود.

بنابراین:

∂z∂x=1\frac{\partial z}{\partial x}=1

به همین ترتیب:

∂z∂y=1\frac{\partial z}{\partial y}=1

مثال عددی:

x=4,y=7,z=4+7=11x=4,\qquad y=7,\qquad z=4+7=11

اگر (x) از ۴ به ۴٫۲ افزایش یابد:

znew=4.2+7=11.2z_{\mathrm{new}}=4.2+7=11.2

پس:

Δz=0.2,ΔzΔx=1\Delta z=0.2,\qquad \frac{\Delta z}{\Delta x}=1

تفسیر: گره جمع، حساسیت خروجی نسبت به هر ورودی را بدون تغییر مقیاس عبور می‌دهد.

۳.۳.۲. مشتق گره ضرب

فرض کنید:

z=xyz=xy

مشتق نسبت به (x)، درحالی‌که (y) ثابت است:

∂z∂x=y\boxed{\frac{\partial z}{\partial x}=y}

و مشتق نسبت به (y):

∂z∂y=x\boxed{\frac{\partial z}{\partial y}=x}

مثال کاربردی: درآمد یک فروشگاه

R=pqR=pq

اگر:

p=200,q=30p=200,\qquad q=30

آنگاه:

R=6000R=6000

مشتق درآمد نسبت به قیمت:

∂R∂p=q=30\frac{\partial R}{\partial p}=q=30

و مشتق درآمد نسبت به تعداد فروش:

∂R∂q=p=200\frac{\partial R}{\partial q}=p=200

این مشتق‌ها تحت فرض ثابت‌ماندن ورودی دیگر محاسبه شده‌اند. در دنیای واقعی ممکن است افزایش قیمت، تعداد فروش را نیز تغییر دهد؛ آن اثر رفتاری در مدل ساده (R=pq) لحاظ نشده است.

شکل ۳-۲. گره ضرب و مشتق‌های محلی آن

۳.۳.۳. مشتق گره توان

اگر:

z=xnz=x^n

که (n) یک توان ثابت حقیقی است و تابع در نقطه موردنظر مشتق‌پذیر باشد، مشتق به‌صورت زیر است:

dzdx=nxn−1\begin{equation} \frac{dz}{dx}=nx^{n-1} \end{equation}

برای مثال:

z=x3,dzdx=3x2z=x^3,\qquad \frac{dz}{dx}=3x^2

در (x=2):

dzdx=3(2)2=12\frac{dz}{dx}=3(2)^2=12

این یعنی در نزدیکی (x=2)، افزایش کوچک ورودی به‌اندازه ۰٫۰۱، خروجی را تقریباً ۰٫۱۲ افزایش می‌دهد.

مقدار دقیق:

2.013−23=0.1206012.01^3-2^3=0.120601

مقدار تقریبی مبتنی بر مشتق:

12(0.01)=0.1212(0.01)=0.12

اختلاف این دو مقدار، ناشی از غیرخطی‌بودن تابع است.

۳.۳.۴. مشتق گره تقسیم

اگر:

z=xy,y≠0z=\frac{x}{y},\qquad y\neq0

آنگاه:

∂z∂x=1y,∂z∂y=−xy2\frac{\partial z}{\partial x}=\frac{1}{y},\qquad \frac{\partial z}{\partial y}=-\frac{x}{y^2}

فرض کنید هزینه متوسط تولید از تقسیم هزینه کل بر تعداد تولید به دست آید:

A=CqA=\frac{C}{q}

اگر:

C=1000,q=20C=1000,\qquad q=20

آنگاه:

A=50A=50

مشتق هزینه متوسط نسبت به هزینه کل، با ثابت‌بودن مقدار تولید:

∂A∂C=120=0.05\frac{\partial A}{\partial C}=\frac{1}{20}=0.05

و مشتق نسبت به تعداد تولید، با ثابت‌بودن هزینه کل:

∂A∂q=−1000202=−2.5\frac{\partial A}{\partial q}=-\frac{1000}{20^2}=-2.5

توجه کنید که این تحلیل، هزینه کل را مستقل از تعداد تولید فرض می‌کند. اگر هزینه کل خود تابعی از (q) باشد، برای محاسبه مشتق کل باید وابستگی آن را نیز در نظر گرفت.

۳.۴. مشتق جزئی؛ وقتی یک گره چند ورودی دارد

تا اینجا برخی گره‌ها دارای یک ورودی و برخی دارای دو ورودی بودند. برای گره‌هایی با چند ورودی، از مفهوم مشتق جزئی (Partial Derivative) استفاده می‌کنیم.

فرض کنید:

z=2x1+3x2z=2x_1+3x_2

مشتق نسبت به (x1)، درحالی‌که (x2) ثابت است:

∂z∂x1=2\frac{\partial z}{\partial x_1}=2

و مشتق نسبت به (x2):

∂z∂x2=3\frac{\partial z}{\partial x_2}=3

این دو مشتق نشان می‌دهند خروجی نسبت به تغییرهای کوچک هر ورودی، با ثابت‌ماندن ورودی دیگر، چه حساسیتی دارد.

مثال کاربردی: پیش‌بینی هزینه تبلیغات

فرض کنید یک مدل ساده، تعداد سفارش‌های روزانه را از دو ورودی پیش‌بینی می‌کند:

y^=0.8x1+1.5x2+10\hat{y}=0.8x_1+1.5x_2+10

که در آن:

• x₁: تعداد واحدهای تبلیغات آنلاین؛
• x₂: تعداد واحدهای تبلیغات محیطی؛
• ŷ: تعداد سفارش پیش‌بینی‌شده.

فرض کنید:

x1=20,x2=10x_1=20,\qquad x_2=10

آنگاه:

y^=0.8(20)+1.5(10)+10y^=16+15+10=41\begin{aligned} \hat{y}&=0.8(20)+1.5(10)+10\\ \hat{y}&=16+15+10=41 \end{aligned}

مشتق‌های جزئی:

∂y^∂x1=0.8,∂y^∂x2=1.5\frac{\partial\hat{y}}{\partial x_1}=0.8,\qquad \frac{\partial\hat{y}}{\partial x_2}=1.5

بنابراین در این مدل، افزایش یک واحدی تبلیغات محیطی، با ثابت‌ماندن تبلیغات آنلاین، اثر عددی بیشتری بر خروجی دارد.

اما این نتیجه به‌تنهایی نشان‌دهنده اثربخشی اقتصادی بیشتر تبلیغات محیطی نیست؛ زیرا هزینه هر واحد تبلیغ و رابطه واقعی تبلیغات با سفارش‌ها مشخص نشده است.

۳.۵. مشتق محلی در تابع زیان

در شبکه عصبی، آخرین گره محاسباتی معمولاً تابع زیان (Loss Function) است.

یکی از ساده‌ترین توابع زیان برای آموزش مفاهیم مشتق‌گیری، زیان مربعی نصف‌شده است:

ℒ=12(y^−y)2\begin{equation} \mathcal{L}=\frac{1}{2}(\hat{y}-y)^2 \end{equation}

در این رابطه، ŷ پیش‌بینی مدل و y مقدار واقعی است.

با ثابت‌بودن (y)، مشتق زیان نسبت به خروجی مدل برابر است با:

∂ℒ∂y^=y^−y\begin{equation} \boxed{\frac{\partial\mathcal{L}}{\partial\hat{y}}=\hat{y}-y} \end{equation}

برای مثال، اگر:

y^=7,y=10\hat{y}=7,\qquad y=10

آنگاه:

∂ℒ∂y^=−3\frac{\partial\mathcal{L}}{\partial\hat{y}}=-3

اگر پیش‌بینی به ۱۲ افزایش یابد:

∂ℒ∂y^=12−10=2\frac{\partial\mathcal{L}}{\partial\hat{y}}=12-10=2

در حالت اول، مشتق منفی است و افزایش کوچک پیش‌بینی، زیان را کاهش می‌دهد. در حالت دوم، مشتق مثبت است و کاهش کوچک پیش‌بینی، زیان را کاهش می‌دهد.

شکل ۳-۳. زیان مربعی نصف‌شده برای مقدار واقعی ۱۰

این نمودار نشان می‌دهد علامت مشتق چگونه جهت محلی کاهش زیان را مشخص می‌کند.

۳.۶. مشتق توابع فعال‌سازی

توابع فعال‌سازی (Activation Functions) از اجزای مهم شبکه‌های عصبی هستند. در این فصل، تمرکز ما بر مشتق آن‌ها و نقش این مشتق در انتقال گرادیان است؛ تحلیل کامل ویژگی‌های معماری و مقایسه توابع فعال‌سازی به فصل اختصاصی آن‌ها تعلق دارد.

۳.۶.۱. تابع Sigmoid

تابع Sigmoid به‌صورت زیر تعریف می‌شود:

σ(z)=11+e−z\begin{equation} \sigma(z)=\frac{1}{1+e^{-z}} \end{equation}

مشتق آن:

σ′(z)=σ(z)(1−σ(z))\begin{equation} \boxed{\sigma'(z)=\sigma(z)(1-\sigma(z))} \end{equation}

برای نمونه، اگر (z=0) باشد:

σ(0)=12=0.5\sigma(0)=\frac{1}{2}=0.5

پس:

σ′(0)=0.5(1−0.5)=0.25\sigma'(0)=0.5(1-0.5)=0.25

اگر (z=2) باشد:

σ(2)≈0.8808\sigma(2)\approx0.8808

بنابراین:

σ′(2)≈0.8808(1−0.8808)≈0.1050\sigma'(2)\approx0.8808(1-0.8808)\approx0.1050
مقدار (z)خروجی Sigmoidمشتق Sigmoid
4-۰٫۰۱۸۰۰٫۰۱۷۷
2-۰٫۱۱۹۲۰٫۱۰۵۰
۰۰٫۵۰۰۰۰٫۲۵۰۰
۲۰٫۸۸۰۸۰٫۱۰۵۰
۴۰٫۹۸۲۰۰٫۰۱۷۷

جدول نشان می‌دهد وقتی مقدار (z) از صفر بسیار دور می‌شود، مشتق Sigmoid به صفر نزدیک می‌شود. این رفتار می‌تواند در شبکه‌های عمیق به کوچک‌شدن گرادیان‌های منتقل‌شده کمک کند.

۳.۶.۲. تابع ReLU

تابع ReLU به‌صورت زیر تعریف می‌شود:

ReLU⁡(z)=max⁡(0,z)\operatorname{ReLU}(z)=\max(0,z)

مشتق آن برای نقاط غیرصفر:

ReLU′⁡(z)={0z<01z>0\begin{equation} \operatorname{ReLU}'(z)= \begin{cases} 0 & z<0\\ 1 & z>0 \end{cases} \end{equation}

در نقطه (z=0)، مشتق کلاسیک وجود ندارد. در پیاده‌سازی‌های رایج، یک مقدار قراردادی برای مشتق یا زیرگرادیان انتخاب می‌شود؛ اغلب صفر.

مثال:

اگر:

z=−2z=-2

آنگاه:

a=ReLU⁡(−2)=0,ReLU′⁡(−2)=0a=\operatorname{ReLU}(-2)=0,\qquad \operatorname{ReLU}'(-2)=0

اما اگر:

z=3z=3

آنگاه:

a=3,ReLU′⁡(3)=1a=3,\qquad \operatorname{ReLU}'(3)=1

در مسیر رو‌به‌عقب، مشتق محلی صفر موجب می‌شود گرادیان عبوری از آن مسیر نیز صفر شود. این مسئله یکی از دلایل اهمیت رفتار فعال‌سازی نورون‌ها در آموزش شبکه است.

شکل ۳-۴. تابع ReLU

سپس شکل ۳-۵. مشتق ReLU

در نقطه صفر، تابع ReLU پیوسته است اما مشتق کلاسیک ندارد. دایره‌های توخالی در نمودار مشتق نشان می‌دهند مقدار مشتق در آن نقطه به‌صورت ریاضی تعریف نشده است.

۳.۶.۳. تابع Tanh

تابع تانژانت هیپربولیک (Hyperbolic Tangent) برابر است با:

tanh⁡(z)=ez−e−zez+e−z\tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}

مشتق آن:

ddztanh⁡(z)=1−tanh2⁡(z)\begin{equation} \boxed{\frac{d}{dz}\tanh(z)=1-\tanh^2(z)} \end{equation}

برای (z=0):

tanh⁡(0)=0,tanh′⁡(0)=1\tanh(0)=0,\qquad \tanh'(0)=1

برای (z=1):

tanh⁡(1)≈0.7616\tanh(1)\approx0.7616

پس:

tanh′⁡(1)=1−(0.7616)2≈0.4200\tanh'(1)=1-(0.7616)^2\approx0.4200

در اینجا نیز مشتق تابع، ضریب حساسیت محلی گره فعال‌سازی است.

۳.۷. مثال یکپارچه: محاسبه مشتق‌های محلی یک نورون

اکنون تمام مفاهیم این بخش را در یک مثال ترکیب می‌کنیم.

فرض کنید نورونی برای پیش‌بینی یک شاخص عددی عملکرد طراحی شده است:

z=w1x1+w2x2+ba=σ(z)ℒ=12(a−y)2\begin{aligned} z&=w_1x_1+w_2x_2+b\\ a&=\sigma(z)\\ \mathcal{L}&=\frac{1}{2}(a-y)^2 \end{aligned}

داده‌های آموزشی ساختگی:

x1=1,x2=2,w1=0.2,w2=0.3,b=0.1,y=1x_1=1,\quad x_2=2,\qquad w_1=0.2,\quad w_2=0.3,\quad b=0.1,\qquad y=1

ابتدا انتشار رو‌به‌جلو را انجام می‌دهیم:

z=0.2(1)+0.3(2)+0.1z=0.9\begin{aligned} z&=0.2(1)+0.3(2)+0.1\\ z&=0.9 \end{aligned}

خروجی Sigmoid:

a=σ(0.9)≈0.710950a=\sigma(0.9)\approx0.710950

زیان:

ℒ=12(0.710950−1)2≈0.041775\mathcal{L}=\frac{1}{2}(0.710950-1)^2\approx0.041775

اکنون مشتق‌های محلی را محاسبه می‌کنیم.

مشتق تابع زیان نسبت به خروجی نورون:

∂ℒ∂a=a−y∂ℒ∂a≈−0.289050\begin{aligned} \frac{\partial\mathcal{L}}{\partial a}&=a-y\\ \frac{\partial\mathcal{L}}{\partial a}&\approx-0.289050 \end{aligned}

مشتق Sigmoid:

∂a∂z=a(1−a)∂a∂z≈0.710950(0.289050)≈0.205500\begin{aligned} \frac{\partial a}{\partial z}&=a(1-a)\\ \frac{\partial a}{\partial z}&\approx0.710950(0.289050)\approx0.205500 \end{aligned}

مشتق‌های محلی جمع وزن‌دار:

∂z∂w1=x1=1,∂z∂w2=x2=2,∂z∂b=1\frac{\partial z}{\partial w_1}=x_1=1,\qquad \frac{\partial z}{\partial w_2}=x_2=2,\qquad \frac{\partial z}{\partial b}=1

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

به‌عنوان پیش‌نمایش:

∂ℒ∂w1=∂ℒ∂a∂a∂z∂z∂w1∂ℒ∂w1≈(−0.289050)(0.205500)(1)∂ℒ∂w1≈−0.0594\begin{aligned} \frac{\partial\mathcal{L}}{\partial w_1}&=\frac{\partial\mathcal{L}}{\partial a}\frac{\partial a}{\partial z}\frac{\partial z}{\partial w_1}\\ \frac{\partial\mathcal{L}}{\partial w_1}&\approx(-0.289050)(0.205500)(1)\\ \boxed{\frac{\partial\mathcal{L}}{\partial w_1}}&\boxed{\approx-0.0594} \end{aligned}

و برای وزن دوم:

∂ℒ∂w2≈(−0.289050)(0.205500)(2)∂ℒ∂w2≈−0.1188\begin{aligned} \frac{\partial\mathcal{L}}{\partial w_2}&\approx(-0.289050)(0.205500)(2)\\ \boxed{\frac{\partial\mathcal{L}}{\partial w_2}}&\boxed{\approx-0.1188} \end{aligned}

برای بایاس نیز:

∂ℒ∂b≈−0.0594\boxed{\frac{\partial\mathcal{L}}{\partial b}\approx-0.0594}

این مثال نشان می‌دهد که چگونه مشتق‌های محلیِ ساده، در کنار یکدیگر گرادیان پارامترهای شبکه را تشکیل می‌دهند.

۳.۸. جدول مرجع مشتق‌های محلی

عملیاترابطهمشتق محلی
جمع(z=x+y)z/∂x = ۱ ∂
تفریق(z=x-y)(  z/ ∂ y=-1 ∂)
ضرب(z=xy)(  z/ ∂ x=y ∂)
تقسیم(z=x/y)( z/ ∂ x=1/y ∂)
توان(z=x^n)(dz/dx=nx^{n-1})
نمایی(z=e^x)(dz/dx=e^x)
لگاریتم طبیعی(z=ln x)(dz/dx=1/x)
Sigmoid(z=sigma(x))(dz/dx=z(1-z))
Tanh(z=tanh(x))(dz/dx=1-z^2)
ReLU(z=max(0,x))صفر برای (x<0)، یک برای (x>0)

این جدول، قواعد محاسباتی موردنیاز بخش‌های بعدی فصل را فراهم می‌کند. شرایط دامنه، مانند (yne0) در تقسیم و (x>0) در لگاریتم حقیقی، باید هنگام استفاده رعایت شوند.

۳.۹. تمرین‌ها و مسائل بخش سوم

  • تمرین ۱ ـ مشتق محلی: تابع (f(x)=4x^2+3x) را در نظر بگیرید. مشتق آن را محاسبه کرده و مقدار مشتق را در (x=2) به دست آورید.
  • تمرین ۲ ـ تحلیل حساسیت: درآمد یک شرکت برابر (R=pq) است. اگر قیمت ۱۵۰ و مقدار فروش ۴۰ باشد، مشتق درآمد نسبت به هر متغیر را محاسبه و تفسیر کنید.
  • تمرین ۳ ـ مشتق تابع فعال‌سازی: برای (z=-1)، مقدار Sigmoid و مشتق آن را تا چهار رقم اعشار محاسبه کنید.
  • تمرین ۴ ـ مقایسه ReLU و Sigmoid: اگر ورودی یک نورون برابر (z=-3) باشد، مشتق محلی ReLU و Sigmoid را محاسبه کنید. تفاوت این دو را از نظر عبور گرادیان توضیح دهید.
  • تمرین ۵ ـ کاربرد صنعتی: تابع هزینه تولید برابر (C(q)=3q^2+10q+50) است. هزینه نهایی را در (q=5) محاسبه کنید و آن را با افزایش دقیق هزینه از ۵ به ۶ واحد مقایسه کنید.
  • تمرین ۶ ـ گراف محاسباتی: تابع (f(x,y)=(xy+2)^2) را به عملیات ساده تقسیم کنید. برای (x=2) و (y=3)، مقدار خروجی و مشتق‌های محلی تمام گره‌ها را محاسبه کنید.
  • تمرین ۷ ـ پیاده‌سازی مقدماتی: بدون استفاده از کتابخانه‌های مشتق‌گیری خودکار، برنامه‌ای در پایتون بنویسید که مقدار تابع (f(x)=x^3)، مشتق تحلیلی آن و مشتق عددی تفاضل مرکزی را در چند نقطه محاسبه و مقایسه کند.

پاسخ تشریحی منتخب: تمرین ۵

تابع هزینه:

C(q)=3q2+10q+50C(q)=3q^2+10q+50

مشتق:

C′(q)=6q+10C'(q)=6q+10

در (q=5):

C′(5)=6(5)+10=40C'(5)=6(5)+10=40

مقدار هزینه در ۵ واحد:

C(5)=3(25)+50+50=175C(5)=3(25)+50+50=175

مقدار هزینه در ۶ واحد:

C(6)=3(36)+60+50=218C(6)=3(36)+60+50=218

افزایش دقیق هزینه:

218−175=43218-175=43

بنابراین هزینه نهایی در نقطه ۵ برابر ۴۰ است، درحالی‌که افزایش واقعی هزینه برای یک واحد کامل تولید برابر ۴۳ است.

این اختلاف ناشی از انحنای تابع هزینه است.

منابع علمی بخش سوم

Bishop, C. M. (2006). Pattern recognition and machine learning. Springer.

Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep learning. MIT Press.

Griewank, A., & Walther, A. (2008). Evaluating derivatives: Principles and techniques of algorithmic differentiation (2nd ed.). SIAM.

Baydin, A. G., Pearlmutter, B. A., Radul, A. A., & Siskind, J. M. (2018). Automatic differentiation in machine learning: A survey. Journal of Machine Learning Research, 18(153), 1–43.

4. قاعده زنجیره‌ای در شبکه‌های عصبی

در بخش سوم آموختیم که هر عملیات در گراف محاسباتی، مشتق محلی مشخصی دارد. برای مثال، مشتق یک گره ضرب نسبت به یکی از ورودی‌ها برابر ورودی دیگر است و مشتق تابع Sigmoid را می‌توان از خروجی همان تابع محاسبه کرد.

اما در یک شبکه عصبی، وزن‌ها مستقیماً به تابع زیان متصل نیستند. تغییر یک وزن ابتدا بر جمع وزن‌دار نورون اثر می‌گذارد؛ سپس خروجی تابع فعال‌سازی را تغییر می‌دهد و در نهایت مقدار زیان را تحت تأثیر قرار می‌دهد.

بنابراین باید بتوانیم اثر یک تغییر را از میان چند عملیات متوالی دنبال کنیم.

ابزار ریاضی انجام این کار، قاعده زنجیره‌ای (Chain Rule) است. این قاعده، مبنای محاسبه گرادیان در الگوریتم بازپس‌انتشار خطا محسوب می‌شود (Goodfellow et al., 2016; Baydin et al., 2018).

۴.۱. چرا مشتق‌های محلی به‌تنهایی کافی نیستند؟

فرض کنید یک شرکت برای برآورد هزینه حمل‌ونقل محصولات، از مدل ساده زیر استفاده می‌کند:

u=3x+2C=u2\begin{aligned} u&=3x+2\\ C&=u^2 \end{aligned}

در این مدل آموزشی، (x) یک شاخص عددی فعالیت حمل‌ونقل، (u) مقدار میانی و (C) شاخص هزینه است.

برای (x=2):

u=3(2)+2=8C=82=64\begin{aligned} u&=3(2)+2=8\\ C&=8^2=64 \end{aligned}

اکنون می‌خواهیم بدانیم تغییر کوچک (x) چه اثری بر (C) دارد.

از بخش قبل می‌دانیم:

dudx=3,dCdu=2u\frac{du}{dx}=3,\qquad \frac{dC}{du}=2u

در (u=8):

dCdu=16\frac{dC}{du}=16

اما هیچ‌کدام از این مشتق‌ها به‌تنهایی پاسخ مسئله نیستند.

مشتق اول نشان می‌دهد (u) نسبت به (x) چقدر حساس است؛ مشتق دوم حساسیت (C) نسبت به (u) را نشان می‌دهد. برای یافتن حساسیت (C) نسبت به (x)، باید این دو اثر را ترکیب کنیم.

قاعده زنجیره‌ای بیان می‌کند:

dCdx=dCdududx\begin{equation} \boxed{\frac{dC}{dx}=\frac{dC}{du}\frac{du}{dx}} \end{equation}

در نتیجه:

dCdx=16×3=48\frac{dC}{dx}=16\times3=48

این مقدار نشان می‌دهد در نزدیکی x = ۲، افزایش بسیار کوچک x به‌اندازه Δx، هزینه را تقریباً به‌اندازه ۴۸Δx تغییر می‌دهد.

نمایش محاسبات در نمودار

شکل ۴-۱. قاعده زنجیره‌ای در دو عملیات متوالی

در عبور رو‌به‌جلو مقدار هر گره محاسبه می‌شود. در عبور رو‌به‌عقب، گرادیان دریافتی در مشتق محلی هر عملیات ضرب می‌شود.

۴.۲. استخراج قاعده زنجیره‌ای از تعریف مشتق

برای درک عمیق‌تر، فرض کنید:

y=f(u),u=g(x)y=f(u),\qquad u=g(x)

در نتیجه:

y=f(g(x))y=f(g(x))

اگر (x) اندکی تغییر کند، ابتدا (u) و سپس (y) تغییر خواهند کرد.

در نقاطی که توابع مربوط مشتق‌پذیرند، برای تغییرهای کوچک می‌توان نوشت:

Δu=g′(x)Δx+o(Δx),Δy=f′(u)Δu+o(Δu)\Delta u=g'(x)\Delta x+o(\Delta x),\qquad \Delta y=f'(u)\Delta u+o(\Delta u)

نماد o(Δx) نشان‌دهنده جمله‌ای است که نسبت آن به Δx، با نزدیک‌شدن Δx به صفر، به صفر میل می‌کند.

با جایگذاری تغییر (u) در رابطه دوم، نتیجه می‌شود:

Δy=f′(u)g′(x)Δx+o(Δx)\Delta y=f'(u)g'(x)\Delta x+o(\Delta x)

بنابراین:

dydx=f′(u)g′(x)\boxed{\frac{dy}{dx}=f'(u)g'(x)}

یا به شکل رایج:

dydx=dydududx\boxed{\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}}

این رابطه فقط یک دستور محاسباتی نیست؛ بیان می‌کند که حساسیت یک خروجی نسبت به ورودی اولیه، از ترکیب حساسیت‌های محلی مراحل میانی حاصل می‌شود.

مثال ۴-۱. بررسی قاعده زنجیره‌ای با دو روش

تابع زیر را در نظر بگیرید:

f(x)=(2x+1)3f(x)=(2x+1)^3

روش اول: مشتق‌گیری مستقیم

با بسط عبارت:

f(x)=8x3+12x2+6x+1f(x)=8x^3+12x^2+6x+1

پس:

f′(x)=24x2+24x+6f'(x)=24x^2+24x+6

در (x=2):

f′(2)=24(4)+24(2)+6=150f'(2)=24(4)+24(2)+6=150

روش دوم: قاعده زنجیره‌ای

ابتدا:

u=2x+1u=2x+1

سپس:

f=u3f=u^3

مشتق‌های محلی:

dudx=2,dfdu=3u2\frac{du}{dx}=2,\qquad \frac{df}{du}=3u^2

در (x=2)، مقدار (u=5) است. بنابراین:

dfdu=3(25)=75,dfdx=75×2=150\frac{df}{du}=3(25)=75,\qquad \boxed{\frac{df}{dx}=75\times2=150}

هر دو روش به نتیجه یکسان می‌رسند. مزیت روش دوم زمانی آشکار می‌شود که به‌جای دو عملیات، صدها عملیات متوالی داشته باشیم.

۴.۳. قاعده زنجیره‌ای در یک مسیر چندمرحله‌ای

فرض کنید یک مدل آموزشی برای محاسبه شاخص عملکرد فروش از سه مرحله تشکیل شده است:

u=2xv=u+3s=v2F=s5\begin{aligned} u&=2x\\ v&=u+3\\ s&=v^2\\ F&=\frac{s}{5} \end{aligned}

برای (x=1)، انتشار رو‌به‌جلو چنین است:

u=2v=5s=25F=5\begin{aligned} u&=2\\ v&=5\\ s&=25\\ F&=5 \end{aligned}

اکنون مشتق‌های محلی:

dudx=2dvdu=1dsdv=2v=10dFds=15=0.2\begin{aligned} \frac{du}{dx}&=2\\ \frac{dv}{du}&=1\\ \frac{ds}{dv}&=2v=10\\ \frac{dF}{ds}&=\frac{1}{5}=0.2 \end{aligned}

طبق قاعده زنجیره‌ای:

dFdx=dFdsdsdvdvdududxdFdx=0.2×10×1×2=4\begin{equation} \begin{aligned} \frac{dF}{dx}&=\frac{dF}{ds}\frac{ds}{dv}\frac{dv}{du}\frac{du}{dx}\\ \boxed{\frac{dF}{dx}}&\boxed{=0.2\times10\times1\times2=4} \end{aligned} \end{equation}

شکل ۴-۲. محاسبات کامل در گراف چهارمرحله‌ای

در شکل ۴-۲. مقدار هر گره در مسیر Forward و گرادیان متناظر در مسیر Backward نشان داده شده است. ترتیب خواندن مقادیر گرادیان از راست به چپ است.

۴.۴. قاعده زنجیره‌ای در گراف‌های چندمسیره

در بسیاری از محاسبات، یک متغیر از چند مسیر مختلف بر خروجی اثر می‌گذارد.

در چنین شرایطی، فقط ضرب مشتق‌ها کافی نیست؛ باید مشارکت گرادیان‌های مسیرهای مختلف نیز جمع شود.

تابع زیر را در نظر بگیرید:

f(x)=x2+3xf(x)=x^2+3x

آن را به سه عملیات تقسیم می‌کنیم:

u=x2v=3xf=u+v\begin{aligned} u&=x^2\\ v&=3x\\ f&=u+v \end{aligned}

اگر (x=2) باشد:

u=4,v=6,f=10u=4,\qquad v=6,\qquad f=10

از مسیر اول:

∂f∂ududx=1×4=4\frac{\partial f}{\partial u}\frac{du}{dx}=1\times4=4

از مسیر دوم:

∂f∂vdvdx=1×3=3\frac{\partial f}{\partial v}\frac{dv}{dx}=1\times3=3

پس:

dfdx=4+3=7\begin{equation} \boxed{\frac{df}{dx}=4+3=7} \end{equation}

در حالت کلی، اگر f به متغیرهای میانی u₁، …، uₘ وابسته باشد و همه این متغیرها تابع x باشند:

dfdx=∑j=1m∂f∂ujdujdx\begin{equation} \boxed{\frac{df}{dx}=\sum_{j=1}^{m}\frac{\partial f}{\partial u_j}\frac{du_j}{dx}} \end{equation}

این رابطه در گراف‌های چندشاخه و شبکه‌های عصبی با اتصالات متعدد اهمیت ویژه‌ای دارد.

مثال ۴-۲. یک ورودی با دو اثر متفاوت

فرض کنید تابع هزینه یک فرایند صنعتی به‌صورت زیر تعریف شده است:

C(x)=2x2+5x+100C(x)=2x^2+5x+100

در این مدل ساختگی، (x) شاخص شدت فعالیت دستگاه است.

در (x=3):

C(3)=2(9)+15+100=133C(3)=2(9)+15+100=133

مشتق از مسیر درجه دوم:

d(2x2)dx=4x=12\frac{d(2x^2)}{dx}=4x=12

مشتق از مسیر خطی:

d(5x)dx=5\frac{d(5x)}{dx}=5

در نتیجه:

C′(3)=12+5=17\boxed{C'(3)=12+5=17}

این عدد نشان می‌دهد حساسیت کل هزینه نسبت به شاخص فعالیت دستگاه، حاصل جمع دو اثر متفاوت است.

اگر فقط یکی از مسیرها را در نظر بگیریم، مشتق کل را اشتباه محاسبه خواهیم کرد.

۴.۵. قاعده زنجیره‌ای در یک نورون مصنوعی

اکنون به مسئله اصلی فصل بازمی‌گردیم.

یک نورون با دو ورودی را در نظر بگیرید:

z=w1x1+w2x2+ba=σ(z)ℒ=12(a−y)2\begin{align} z&=w_1x_1+w_2x_2+b \\ a&=\sigma(z) \\ \mathcal{L}&=\frac{1}{2}(a-y)^2 \end{align}

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

برای وزن اول:

∂ℒ∂w1=∂ℒ∂a∂a∂z∂z∂w1\begin{equation} \frac{\partial\mathcal{L}}{\partial w_1}=\frac{\partial\mathcal{L}}{\partial a}\frac{\partial a}{\partial z}\frac{\partial z}{\partial w_1} \end{equation}

از بخش سوم می‌دانیم:

∂ℒ∂a=a−y∂a∂z=a(1−a)∂z∂w1=x1\begin{aligned} \frac{\partial\mathcal{L}}{\partial a}&=a-y\\ \frac{\partial a}{\partial z}&=a(1-a)\\ \frac{\partial z}{\partial w_1}&=x_1 \end{aligned}

پس:

∂ℒ∂w1=(a−y)a(1−a)x1\begin{equation} \boxed{\frac{\partial\mathcal{L}}{\partial w_1}=(a-y)a(1-a)x_1} \end{equation}

به همین ترتیب:

∂ℒ∂w2=(a−y)a(1−a)x2\begin{equation} \boxed{\frac{\partial\mathcal{L}}{\partial w_2}=(a-y)a(1-a)x_2} \end{equation}

و برای بایاس:

∂ℒ∂b=(a−y)a(1−a)\begin{equation} \boxed{\frac{\partial\mathcal{L}}{\partial b}=(a-y)a(1-a)} \end{equation}

این روابط نشان می‌دهند گرادیان هر وزن از سه عامل تشکیل شده است: اختلاف پیش‌بینی و مقدار واقعی، مشتق تابع فعال‌سازی و مقدار ورودی مرتبط با آن وزن.

مثال ۴-۳. محاسبه کامل گرادیان یک نورون Sigmoid

از داده‌های مثال بخش سوم استفاده می‌کنیم:

x1=1,x2=2,w1=0.2,w2=0.3,b=0.1,y=1x_1=1,\quad x_2=2,\qquad w_1=0.2,\quad w_2=0.3,\quad b=0.1,\quad y=1

ابتدا:

z=0.2(1)+0.3(2)+0.1=0.9a=σ(0.9)≈0.710950ℒ=12(0.710950−1)2≈0.041775\begin{aligned} z&=0.2(1)+0.3(2)+0.1=0.9\\ a&=\sigma(0.9)\approx0.710950\\ \mathcal{L}&=\frac{1}{2}(0.710950-1)^2\approx0.041775 \end{aligned}

مشتق زیان نسبت به خروجی:

∂ℒ∂a=0.710950−1=−0.289050\frac{\partial\mathcal{L}}{\partial a}=0.710950-1=-0.289050

مشتق Sigmoid:

∂a∂z≈0.710950(1−0.710950)≈0.205500\frac{\partial a}{\partial z}\approx0.710950(1-0.710950)\approx0.205500

اکنون:

∂ℒ∂z=(−0.289050)(0.205500)≈−0.0594\frac{\partial\mathcal{L}}{\partial z}=(-0.289050)(0.205500)\approx-0.0594

برای وزن اول:

∂ℒ∂w1≈−0.0594(1)=−0.0594\frac{\partial\mathcal{L}}{\partial w_1}\approx-0.0594(1)=-0.0594

برای وزن دوم:

∂ℒ∂w2≈−0.0594(2)=−0.1188\frac{\partial\mathcal{L}}{\partial w_2}\approx-0.0594(2)=-0.1188

برای بایاس:

∂ℒ∂b≈−0.0594\frac{\partial\mathcal{L}}{\partial b}\approx-0.0594

شکل ۴-۳. مسیر عددی گرادیان در نورون Sigmoid

در شکل ۴-۳. در مسیر رو‌به‌جلو، خروجی و زیان محاسبه می‌شوند. در مسیر رو‌به‌عقب، مشتق‌های محلی تابع زیان، Sigmoid و جمع وزن‌دار با یکدیگر ترکیب می‌شوند.

۴.۶. معرفی متغیر خطای محلی نورون

در مثال قبل مشاهده کردیم که عبارت زیر در گرادیان تمام وزن‌ها و بایاس تکرار می‌شود:

(a−y)a(1−a)(a-y)a(1-a)

برای جلوگیری از تکرار محاسبات، این مقدار را با نماد δ نمایش می‌دهیم:

δ=∂ℒ∂z\begin{equation} \boxed{\delta=\frac{\partial\mathcal{L}}{\partial z}} \end{equation}

در نورون Sigmoid با زیان مربعی نصف‌شده:

δ=(a−y)a(1−a)\delta=(a-y)a(1-a)

در نتیجه:

∂ℒ∂wi=δxi,∂ℒ∂b=δ\boxed{\frac{\partial\mathcal{L}}{\partial w_i}=\delta x_i},\qquad \boxed{\frac{\partial\mathcal{L}}{\partial b}=\delta}

در مثال عددی ما:

δ≈−0.0594\delta\approx-0.0594

بنابراین:

∂ℒ∂w1=δ(1)≈−0.0594∂ℒ∂w2=δ(2)≈−0.1188\begin{aligned} \frac{\partial\mathcal{L}}{\partial w_1}&=\delta(1)\approx-0.0594\\ \frac{\partial\mathcal{L}}{\partial w_2}&=\delta(2)\approx-0.1188 \end{aligned}

این ساده‌سازی، پایه فرمول‌بندی Backpropagation در یک لایه و سپس شبکه چندلایه است.

توجه: (delta) در اینجا به معنی اختلاف ساده پیش‌بینی و هدف نیست؛ بلکه گرادیان زیان نسبت به ورودی پیش‌فعال‌سازی نورون، یعنی (z)، است. این تمایز در شبکه‌های چندلایه اهمیت زیادی دارد.

۴.۷. قاعده زنجیره‌ای در حالت برداری

تا اینجا با توابع اسکالر کار کردیم. اما یک لایه شبکه عصبی معمولاً چند نورون دارد و خروجی آن یک بردار است.

فرض کنید:

𝐳=W𝐱+𝐛\begin{equation} \mathbf{z}=W\mathbf{x}+\mathbf{b} \end{equation}

که در آن:

𝐱∈ℝn,W∈ℝm×n,𝐛,𝐳∈ℝm\mathbf{x}\in\mathbb{R}^n,\qquad W\in\mathbb{R}^{m\times n},\qquad \mathbf{b},\mathbf{z}\in\mathbb{R}^m

اگر تابع زیان ℒ به بردار 𝐳 وابسته باشد، گرادیان زیان نسبت به ورودی 𝐱 برابر است با:

∇𝐱ℒ=W⊤∇𝐳ℒ\begin{equation} \boxed{\nabla_{\mathbf{x}}\mathcal{L}=W^{\top}\nabla_{\mathbf{z}}\mathcal{L}} \end{equation}

این رابطه را می‌توان از مشتق جزئی هر مؤلفه استخراج کرد.

چون:

zj=∑i=1nWjixi+bjz_j=\sum_{i=1}^{n}W_{ji}x_i+b_j

داریم:

∂zj∂xi=Wji\frac{\partial z_j}{\partial x_i}=W_{ji}

بنابراین:

∂ℒ∂xi=∑j=1m∂ℒ∂zjWji\frac{\partial\mathcal{L}}{\partial x_i}=\sum_{j=1}^{m}\frac{\partial\mathcal{L}}{\partial z_j}W_{ji}

که همان رابطه ماتریسی بالا است.

مثال ۴-۴. محاسبه گرادیان برداری با اعداد واقعی

فرض کنید:

W=[1234],∇𝐳ℒ=[0.5−1]W= \begin{bmatrix} 1&2\\ 3&4 \end{bmatrix},\qquad \nabla_{\mathbf{z}}\mathcal{L}= \begin{bmatrix} 0.5\\ -1 \end{bmatrix}

آنگاه:

W⊤=[1324]W^{\top}= \begin{bmatrix} 1&3\\ 2&4 \end{bmatrix}

پس:

∇𝐱ℒ=[1324][0.5−1]\nabla_{\mathbf{x}}\mathcal{L}= \begin{bmatrix} 1&3\\ 2&4 \end{bmatrix} \begin{bmatrix} 0.5\\ -1 \end{bmatrix}

مؤلفه اول:

1(0.5)+3(−1)=−2.51(0.5)+3(-1)=-2.5

مؤلفه دوم:

2(0.5)+4(−1)=−32(0.5)+4(-1)=-3

بنابراین:

∇𝐱ℒ=[−2.5−3]\boxed{\nabla_{\mathbf{x}}\mathcal{L}= \begin{bmatrix} -2.5\\ -3 \end{bmatrix}}

شکل ۴-۴. انتقال گرادیان در یک تبدیل خطی دو‌بعدی

در شکل ۴-۴. ضرب ماتریس ترانهاده وزن‌ها در گرادیان خروجی، گرادیان ورودی لایه را تولید می‌کند. در این مثال، همه ابعاد با یکدیگر سازگارند.

این رابطه یکی از مهم‌ترین ابزارهای ریاضی Backpropagation در شبکه‌های چندلایه است.

۴.۸. تفاوت قاعده زنجیره‌ای و الگوریتم Backpropagation

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

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

در مقابل، Backpropagation یک روش محاسباتی سازمان‌یافته برای استفاده از قاعده زنجیره‌ای روی گراف محاسباتی است. این روش با ذخیره یا باز‌محاسبه مقادیر موردنیاز و استفاده مجدد از گرادیان‌های میانی، از انجام محاسبات تکراری جلوگیری می‌کند.

به بیان دیگر:

قاعده زنجیره‌ای+ساختار گراف محاسباتی+استفاده مجدد از گرادیان‌ها⟶Backpropagation\boxed{\text{قاعده زنجیره‌ای}+\text{ساختار گراف محاسباتی}+\text{استفاده مجدد از گرادیان‌ها}\longrightarrow\text{Backpropagation}}

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

۴.۹. تمرین‌ها و مسائل بخش چهارم

  • تمرین ۱ ـ قاعده زنجیره‌ای ساده: برای تابع f(x) = (3x + 2)²، مشتق را با دو روش بسط مستقیم و قاعده زنجیره‌ای به دست آورید و در x = ۱ مقایسه کنید.
  • تمرین ۲ ـ گراف چندمرحله‌ای: تابع f(x) = ln(2x² + 1) را به عملیات ساده تقسیم کرده و مشتق آن را در x = ۲ محاسبه کنید.
  • تمرین ۳ ـ مسیرهای منشعب: تابع f(x) = x³ + 4x² + 2x را به سه مسیر مستقل تقسیم کرده و مشتق آن را در x = ۲ محاسبه کنید.
  • تمرین ۴ ـ نورون Sigmoid: نورونی با x₁ = ۲، x₂ = ۱، w₁ = ۰٫۱، w₂ = ۰٫۴، b = ۰ و y = ۱ در نظر بگیرید. مقدار خروجی، زیان مربعی نصف‌شده و گرادیان هر پارامتر را محاسبه کنید.
  • تمرین ۵ ـ حالت برداری: اگر:
W=[2−113],∇𝐳ℒ=[12]W= \begin{bmatrix} 2&-1\\ 1&3 \end{bmatrix}, \qquad \nabla_{\mathbf{z}}\mathcal{L}= \begin{bmatrix} 1\\ 2 \end{bmatrix}

گرادیان ∇_𝐱 ℒ را محاسبه کنید.

  • تمرین ۶ ـ تحلیل مفهومی: توضیح دهید چرا در یک گراف محاسباتی چندشاخه، ضرب مشتق‌های یک مسیر به‌تنهایی برای محاسبه مشتق کل کافی نیست.
  • تمرین ۷ ـ پیاده‌سازی: برنامه‌ای بنویسید که تابع (f(x)=(2x+1)^3) را به سه عملیات ساده تقسیم کرده، مقادیر Forward را ذخیره کند و در مرحله Backward مشتق تابع را بدون Autograd محاسبه کند.

پاسخ تشریحی منتخب: تمرین ۵

داریم:

W⊤=[21−13]W^{\top}= \begin{bmatrix} 2&1\\ -1&3 \end{bmatrix}

پس:

∇𝐱ℒ=W⊤∇𝐳ℒ=[21−13][12]\begin{aligned} \nabla_{\mathbf{x}}\mathcal{L}&=W^{\top}\nabla_{\mathbf{z}}\mathcal{L}\\ &= \begin{bmatrix} 2&1\\ -1&3 \end{bmatrix} \begin{bmatrix} 1\\ 2 \end{bmatrix} \end{aligned}

بنابراین:

∇𝐱ℒ=[45]\boxed{\nabla_{\mathbf{x}}\mathcal{L}= \begin{bmatrix} 4\\ 5 \end{bmatrix}}

زیرا:

2(1)+1(2)=4,−1(1)+3(2)=52(1)+1(2)=4,\qquad -1(1)+3(2)=5

منابع علمی بخش چهارم

Baydin, A. G., Pearlmutter, B. A., Radul, A. A., & Siskind, J. M. (2018). Automatic differentiation in machine learning: A survey. Journal of Machine Learning Research, 18(153), 1–43.

Bishop, C. M. (2006). Pattern recognition and machine learning. Springer.

Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep learning. MIT Press.

Griewank, A., & Walther, A. (2008). Evaluating derivatives: Principles and techniques of algorithmic differentiation (2nd ed.). SIAM.

Sidebar atefi
دکتر محمدرضا عاطفی

عضو هیئت علمی دانشگاه
رئیس هیئت مدیره گروه ناب
هم بنیان گذار شرکت دانش بنیان
مشاور شرکت ها و سازمان های بزرگ کشور

آنچه می خوانید

Cover3 compressed 300x169
هوش مصنوعی

بازپس‌انتشار خطا از صفر – بخش سوم: پیاده‌سازی با پایتون و بررسی گرادیان‌ها

8. پیاده‌سازی Backpropagation بدون Autograd؛ ساخت یک موتور یادگیری عصبی از پایه در بخش هفتم، بازپس‌انتشار خطا را در یک شبکه چندلایه با محاسبات عددی کامل بررسی کردیم. اکنون می‌خواهیم همان روابط ریاضی را به یک برنامه عملیاتی تبدیل کنیم؛ برنامه‌ای که بتواند شبکه‌هایی با تعداد لایه‌ها و نورون‌های متفاوت

توضیحات بیشتر »
Cover2 compressed 1 300x169
هوش مصنوعی

بازپس‌انتشار خطا از صفر – بخش دوم: محاسبه گرادیان و آموزش الگوریتم در شبکه چندلایه

5. — Backpropagation یک نورون؛ از محاسبه خطا تا اصلاح وزن‌ها در بخش چهارم، قاعده زنجیره‌ای را برای گراف‌های محاسباتی و شبکه‌های عصبی بررسی کردیم. اکنون می‌خواهیم از این دانش برای حل یک مسئله عملی استفاده کنیم: چگونه یک نورون مصنوعی با مشاهده خطای پیش‌بینی، مقدار وزن‌ها و بایاس خود

توضیحات بیشتر »
Cover1 compressed 1 300x169
هوش مصنوعی

بازپس‌انتشار خطا از صفر – بخش اول: گرادیان، گراف محاسباتی و قاعده زنجیره‌ای

۱. چرا شبکه عصبی باید گرادیان خطا را به عقب منتقل کند؟ شبکه عصبی در مرحله انتشار رو‌به‌جلو (Forward Propagation) مجموعه‌ای از محاسبات را روی داده‌های ورودی انجام می‌دهد و در نهایت خروجی تولید می‌کند. اما تولید خروجی، حتی اگر از نظر ریاضی کاملاً صحیح انجام شده باشد، به معنای

توضیحات بیشتر »
error: محتوا غیر قابل انتخاب و کپی است.