مشتقات
تغییر تصادفی و جستجوی وزن ها و سوگیری های بهینه به یک دلیل اصلی مثمر ثمر نبود: تعداد ترکیبات احتمالی وزن ها و سوگیری ها بی نهایت است و برای دستیابی به هر موفقیتی به چیزی هوشمندانه تر از شانس خالص نیاز داریم. هر وزن و سوگیری نیز ممکن است درجات مختلفی از تأثیر بر کاهش داشته باشد – این تأثیر به خود پارامترها و همچنین به نمونه فعلی بستگی دارد که ورودی لایه اول است. سپس این مقادیر ورودی در وزن ها ضرب می شوند، بنابراین داده های ورودی بر خروجی نورون تأثیر می گذارند و بر تأثیری که وزن ها بر از دست دادن می گذارند تأثیر می گذارد. همین اصل در مورد بایاس ها و پارامترهای لایه های بعدی نیز صدق می کند و خروجی های لایه قبلی را به عنوان ورودی در نظر می گیرد. این بدان معنی است که تأثیر بر مقادیر خروجی به پارامترها و همچنین نمونه ها بستگی دارد – به همین دلیل است که ما مقدار تلفات هر نمونه را به طور جداگانه محاسبه می کنیم. در نهایت، عملکرد چگونگی تأثیر وزن یا سوگیری بر کاهش کلی لزوما خطی نیست. برای اینکه بدانیم چگونه وزن ها و تعصبات را تنظیم کنیم، ابتدا باید تأثیر آنها را بر ضرر درک کنیم.
یکی از مفاهیمی که باید به آن توجه کرد این است که ما به وزن ها و سوگیری ها و تأثیر آنها بر تابع از دست دادن اشاره می کنیم. با این حال، تابع از دست دادن حاوی وزن یا تعصب نیست. ورودی این تابع خروجی مدل است و وزن ها و سوگیری نورون ها بر این خروجی تأثیر می گذارد. بنابراین، حتی اگر ضرر را از خروجی مدل محاسبه کنیم، نه وزن ها/سوگیری ها، این وزن ها و سوگیری ها
به طور مستقیم بر ضرر تأثیر می گذارد.
در فصل های آینده، با توضیح مشتقات جزئی، گرادیان ها، نزول گرادیان و پس انتشار دقیقا توضیح خواهیم داد. اساسا، ما محاسبه خواهیم کرد که هر وزن و سوگیری مفرد چقدر مقدار ضرر را تغییر می دهد (چقدر بر آن تأثیر می گذارد) با توجه به یک نمونه (زیرا هر نمونه یک خروجی جداگانه تولید می کند، بنابراین یک مقدار ضرر جداگانه نیز تولید می کند)، و چگونه این وزن یا بایاس را تغییر دهیم تا مقدار ضرر کاهش یابد. به یاد داشته باشید – هدف ما در اینجا کاهش تلفات است و این کار را با استفاده از گرادیان نزول انجام خواهیم داد. از سوی دیگر، گرادیان نتیجه محاسبه مشتقات جزئی است و ما آن را با استفاده از قانون زنجیره ای برای به روز رسانی تمام وزن ها و بایاس ها به عقب انتشار می دهیم. نگران نباشید اگر هنوز چندان منطقی نیست. ما همه این اصطلاحات و نحوه انجام این اقدامات را در این فصل و فصل های آینده توضیح خواهیم داد.
برای درک مشتقات جزئی، باید با مشتقات شروع کنیم، که مورد خاصی از مشتقات جزئی هستند – آنها از توابعی محاسبه می شوند که پارامترهای منفرد را می گیرند.
تأثیر یک پارامتر بر خروجی
بیایید با یک تابع ساده شروع کنیم و متوجه شویم که منظور از “تاثیر” چیست. یک تابع بسیار ساده y=2x که x را به عنوان ورودی می گیرد:
def f(x):
return 2*x
حالا بیایید کدی در اطراف این ایجاد کنیم تا داده ها را تجسم کنیم – NumPy و Matplotlib را وارد می کنیم، آرایه ای از 5 مقدار ورودی را از 0 تا 4 ایجاد می کنیم، خروجی تابع را برای هر یک از این مقادیر ورودی محاسبه می کنیم و نتیجه را به صورت خطوط بین نقاط متوالی ترسیم می کنیم. مختصات این نقاط ورودی ها به صورت x و خروجی های تابع به صورت y هستند:
import matplotlib.pyplot as plt
import numpy as np
def f(x):
return 2*x
x = np.array(range(5))
y = f(x)
print(x)
print(y)
>>>
[0 1 2 3 4]
[0 2 4 6 8]
plt.plot(x, y)
plt.show()
شکل 7.01: عملکرد خطی y=2x نمودار شده است
شیب
این به نظر می رسد خروجی تابع f(x) = 2x است که یک خط است. چگونه می توانید تاثیری را که x بر y خواهد داشت تعریف کنید؟ برخی می گویند ، “y دو x است” روش دیگر برای توصیف تأثیر یک تابع خطی مانند این از جبر می آید: شیب. ” برخیزید بیش از دویدن” ممکن است عبارتی باشد که از مدرسه به یاد می آورید. شیب یک خط:
این تغییر در y تقسیم بر تغییر در x است، یا در ریاضیات – دلتا y تقسیم بر دلتا x. پس شیب f(x) = 2x چقدر است؟
برای محاسبه شیب، ابتدا باید هر دو نقطه ای را که روی نمودار تابع قرار دارند برداریم و آنها را کم کنیم تا تغییر محاسبه شود. کم کردن نقاط به ترتیب به معنای کم کردن ابعاد x و y آنها است. تقسیم تغییر در y بر تغییر در x شیب را برمی گرداند:
در ادامه کد، تمام مقادیر x را در یک آرایه تک بعدی NumPy نگه می داریم، x، و همه نتایج در یک آرایه تک بعدی، y. برای انجام همان عملیات، x[0] و y[0] را برای نقطه اول می گیریم، سپس x[1] و y[1] را برای نقطه دوم می گیریم. اکنون می توانیم شیب بین آنها را محاسبه کنیم:
print((y[1]-y[0]) / (x[1]-x[0]))
>>>
2.0
جای تعجب نیست که شیب این خط 2 است. می توان گفت اندازه گیری تأثیری که x بر y دارد 2 است. ما می توانیم شیب را به همین ترتیب برای هر تابع خطی محاسبه کنیم، از جمله توابع خطی که چندان واضح نیستند.
در مورد یک تابع غیرخطی مانند f(x)=2x2
def f(x):
return 2*x**2
این تابع نموداری ایجاد می کند که یک خط مستقیم تشکیل نمی دهد:
شکل 7.02: تقریب تابع سهموی y=2×2 نمودار شده است
آیا می توانیم شیب این منحنی را اندازه گیری کنیم؟ بسته به اینکه از کدام 2 نقطه استفاده کنیم ، شیب های مختلف را اندازه گیری می کنیم:
y = f(x) # Calculate function outputs for new function
print(x)
print(y)
>>>
[0 1 2 3 4]
[ 0 2 8 18 32]
حالا برای اولین جفت امتیاز:
print((y[1]-y[0]) / (x[1]-x[0]))
>>>
2
و برای یکی دیگر:
print((y[3]-y[2]) / (x[3]-x[2]))
>>>
10
شکل 7.03: تقریب مماس های نمونه تابع سهموی
Anim 7.03: https://nnfs.io/bro
چگونه می توانیم تأثیری را که x بر y در این تابع غیرخطی دارد اندازه گیری کنیم؟ حساب دیفرانسیل و انتگرال پیشنهاد می کند که شیب خط مماس را در x (برای یک مقدار ورودی خاص به تابع) اندازه گیری کنیم، که شیب لحظه ای (شیب در این نقطه) را به ما می دهد که مشتق است. خط مماس با کشیدن یک خط بین دو نقطه ایجاد می شود که روی یک منحنی “بی نهایت نزدیک” هستند، اما این منحنی باید در نقطه اشتقاق قابل تمایز باشد. این بدان معنی است که باید پیوسته و صاف باشد (ما نمی توانیم شیب را در چیزی که می توانیم به عنوان “گوشه تیز” توصیف کنیم ، محاسبه کنیم ، زیرا شامل تعداد بی نهایت شیب است). سپس، چون این یک منحنی است، هیچ شیب واحدی وجود ندارد. شیب بستگی به جایی دارد که آن را اندازه گیری می کنیم. برای ارائه یک مثال فوری ، می توانیم با استفاده از این نقطه و دیگری که در x گرفته شده است ، مشتق تابع را در x تقریب بزنیم ، اما با یک دلتای بسیار کوچک به آن اضافه شده است ، مانند 0.0001. این عدد یک انتخاب رایج است زیرا خطای خیلی بزرگی ایجاد نمی کند (هنگام تخمین مشتق) یا باعث نمی شود کل عبارت از نظر عددی ناپایدار باشد (Δx ممکن است به دلیل وضوح عدد ممیز شناور به 0 گرد شود). این به ما امکان می دهد همان محاسبه شیب را مانند قبل انجام دهیم ، اما در دو نقطه ای که بسیار نزدیک به یکدیگر هستند و در نتیجه تقریب خوبی از شیب در x ایجاد می شود:
p2_delta = 0.0001
x1 = 1
x2 = x1 + p2_delta # دلتا را اضافه کنید
y1 = f(x1) # نتیجه در نقطه اشتقاق
y2 = f(x2) # نتیجه در نقطه دیگر، نزدیک
approximate_derivative = (y2-y1)/(x2-x1)
print(approximate_derivative)
>>>
4.0001999999987845
همانطور که به زودی یاد خواهیم گرفت، مشتق 2×2 در x=1 باید دقیقا 4 باشد. تفاوتی که می بینیم
(~4.0002) از روشی که برای محاسبه مماس استفاده می شود می آید. ما یک دلتا را به اندازه کافی کوچک انتخاب کردیم تا مشتق را تا حد امکان دقیق تقریبی کنید اما به اندازه کافی بزرگ باشد تا از خطای گرد کردن جلوگیری شود. برای توضیح بیشتر، یک مقدار دلتا بی نهایت کوچک یک مشتق دقیق را تقریبی می کند. با این حال، مقدار دلتا باید از نظر عددی پایدار باشد، به این معنی که دلتای ما نمی تواند از محدودیت های دقت ممیز شناور پایتون (نمی تواند بیش از حد باشد
هر چند کوچک باشد که ممکن است به 0 گرد شود و همانطور که می دانیم، تقسیم بر 0 “غیرقانونی” است). بنابراین، راه حل ما بین تخمین مشتق و ثابت ماندن از نظر عددی محدود است، بنابراین این خطای کوچک اما قابل مشاهده را معرفی می کند.
مشتق عددی
این روش محاسبه مشتق تمایز عددی نامیده می شود – محاسبه شیب خط مماس با استفاده از دو نقطه بی نهایت نزدیک ، یا مانند راه حل کد – محاسبه شیب یک خط مماس ساخته شده از دو نقطه که “به اندازه کافی نزدیک” بودند. ما می توانیم تجسم کنیم که چرا این کار را در دو نقطه بسته با موارد زیر انجام می دهیم:
شکل 7.04: چرا می خواهیم از 2 نقطه استفاده کنیم که به اندازه کافی نزدیک هستند – عدم دقت دلتای بزرگ.
شکل 7.05: چرا می خواهیم از 2 نقطه استفاده کنیم که به اندازه کافی نزدیک هستند – دقت دلتای بسیار کوچک.
Anim 7.04-7.05: https://nnfs.io/cat
می بینیم که هرچه این دو نقطه به یکدیگر نزدیکتر باشند، خط مماس صحیح تر به نظر می رسد.
در ادامه تمایز عددی ، اجازه دهید خطوط مماس و نحوه تغییر آنها را بسته به جایی که آنها را محاسبه می کنیم ، تجسم کنیم. برای شروع، نمودار این تابع را با استفاده از arange() Numpy دانه ای تر می کنیم و به ما امکان می دهد با مراحل کوچکتر ترسیم کنیم. تابع np.arange() پارامترهای شروع، توقف و گام را می گیرد و به ما امکان می دهد کسری از یک مرحله را برداریم، مانند 0.001 در یک زمان:
import matplotlib.pyplot as plt
import numpy as np
def f(x):
return 2*x**2
# np.arange (شروع، توقف، مرحله) تا خط صاف تری به ما بدهد
x = np.arange(0, 5, 0.001)
y = f(x)
plt.plot(x, y)
plt.show()
شکل 7.06: خروجی Matplotlib که باید از نمودار y=2×2 مشاهده کنید.
برای ترسیم این خطوط مماس ، تابع خط مماس را در یک نقطه استخراج می کنیم و مماس را روی نمودار در این نقطه ترسیم می کنیم. تابع یک خط مستقیم y = mx+b است. جایی که m شیب یا approximate_derivative است که قبلا محاسبه کردیم. و x ورودی است که b یا قطعه y را برای محاسبه ما باقی می گذارد. شیب بدون تغییر باقی می ماند، اما در حال حاضر، می توانید با استفاده از رهگیری y خط را به سمت بالا یا پایین حرکت دهید. ما قبلا x و m را می شناسیم، اما b هنوز ناشناخته است. بیایید m=1 را برای هدف شکل فرض کنیم و ببینیم دقیقا به چه معناست:
شکل 7.07: سوگیری های مختلف نمودار شده که در آن شیب = 1.
Anim 7.07: https://nnfs.io/but
برای محاسبه b ، فرمول b = y – mx است:
تا کنون از دو نقطه استفاده کرده ایم – نقطه ای که می خواهیم مشتق را در آن محاسبه کنیم و نقطه “به اندازه کافی نزدیک” به آن برای محاسبه تقریب مشتق. حال ، با توجه به معادله بالا برای b ، تقریب مشتق و همان نقطه “به اندازه کافی نزدیک” ( مختصات x و y آن خاص است) ، می توانیم آنها را در معادله جایگزین کنیم و قطع y را برای خط مماس در نقطه اشتقاق بدست آوریم. با استفاده از کد:
b = y2 – approximate_derivative*x2
Putting everything together:
import matplotlib.pyplot as plt
import numpy as np
def f(x):
return 2*x**2
# np.arange (شروع، توقف، مرحله) تا خط صاف تری به ما بدهد
x = np.arange(0, 5, 0.001)
y = f(x)
plt.plot(x, y)
# نقطه و نقطه “به اندازه کافی نزدیک”
p2_delta = 0.0001
x1 = 2
x2 = x1+p2_delta
y1 = f(x1)
y2 = f(x2)
print((x1, y1), (x2, y2))
# تقریب مشتق و قطع y برای خط مماس
approximate_derivative = (y2-y1)/(x2-x1)
b = y2 – approximate_derivative*x2
# محاسبه خط مماس را در یک تابع قرار می دهیم تا بتوانیم فراخوانی کنیم
# چندین بار برای مقادیر مختلف x
# approximate_derivative و b برای تابع داده شده ثابت هستند
# بنابراین یک بار بالاتر از این تابع محاسبه می شود
def tangent_line(x):
return approximate_derivative*x + b
# ترسیم خط مماس
# 0.9 +/- برای ترسیم خط مماس روی نمودار ما
# سپس y را برای x داده شده با استفاده از تابع خط مماس محاسبه می کنیم
# Matplotlib از طریق این نکات برای ما خط می کشد
to_plot = [x1-0.9, x1, x1+0.9]
plt.plot(to_plot, [tangent_line(i) for i in to_plot])
print(‘Approximate derivative for f(x)’,
f‘where x = {x1} is {approximate_derivative}’)
plt.show()
>>>
(2, 8) (2.0001, 8.000800020000002)
Approximate derivative for f(x) where x = 2 is 8.000199999998785
شکل 7.08: مشتق تقریبی نمودار شده برای f(x) که در آن x=2
خط نارنجی خط مماس تقریبی در x=2 برای تابع f(x) = 2×2 است. چرا ما به این موضوع اهمیت می دهیم؟ به زودی متوجه خواهید شد که ما فقط به شیب این خط مماس اهمیت می دهیم، اما هم تجسم و هم درک خط مماس بسیار مهم است. ما به شیب خط مماس اهمیت می دهیم زیرا ما را در مورد تأثیری که x بر روی این تابع در یک نقطه خاص دارد ، که به آن نرخ تغییر لحظه ای می گویند ، مطلع می کند. ما از این مفهوم برای تعیین تأثیر یک وزن یا سوگیری خاص بر تابع کلی از دست دادن یک نمونه استفاده خواهیم کرد. در حال حاضر، با مقادیر مختلف برای x، می توانیم تأثیرات حاصل بر عملکرد را مشاهده کنیم. ما می توانیم کد قبلی را ادامه دهیم تا خط مماس را برای ورودی های مختلف (x) ببینیم – بخشی از کد را در یک حلقه روی مقادیر مثال x قرار می دهیم و چندین خط مماس را ترسیم می کنیم:
import matplotlib.pyplot as plt
import numpy as np
def f(x):
return 2*x**2
# np.arange (شروع، توقف، مرحله) تا منحنی صاف تری به ما بدهد
x = np.array(np.arange(0,5,0.001))
y = f(x)
plt.plot(x, y)
colors = [‘k’,’g’,’r’,’b’,’c’]
def approximate_tangent_line(x, approximate_derivative):
return (approximate_derivative*x) + b
for i in range(5):
p2_delta = 0.0001
x1 = i
x2 = x1+p2_delta
y1 = f(x1)
y2 = f(x2)
print((x1, y1), (x2, y2))
approximate_derivative = (y2-y1)/(x2-x1)
b = y2-(approximate_derivative*x2)
to_plot = [x1-0.9, x1, x1+0.9]
plt.scatter(x1, y1, c=colors[i])
plt.plot([point for point in to_plot],
[approximate_tangent_line(point, approximate_derivative)
for point in to_plot],
c=colors[i])
print(‘Approximate derivative for f(x)’,
f‘where x = {x1} is {approximate_derivative}’)
plt.show()
>>>
(0, 0) (0.0001, 2e-08)
Approximate derivative for f(x) where x = 0 is 0.00019999999999999998
(1, 2) (1.0001, 2.00040002)
Approximate derivative for f(x) where x = 1 is 4.0001999999987845
(2, 8) (2.0001, 8.000800020000002)
Approximate derivative for f(x) where x = 2 is 8.000199999998785
(3, 18) (3.0001, 18.001200020000002)
Approximate derivative for f(x) where x = 3 is 12.000199999998785
(4, 32) (4.0001, 32.00160002)
Approximate derivative for f(x) where x = 4 is 16.000200000016548
شکل 7.09: مشتق محاسبه شده در نقاط مختلف.
برای این تابع ساده، f(x) = 2×2، ما با تقریب مشتق (یعنی شیب خط مماس) مانند این، جریمه بالایی پرداخت نکردیم و مقداری دریافت کردیم که به اندازه کافی برای نیازهای ما نزدیک بود.
مشکل این است که تابع واقعی به کار گرفته شده در شبکه عصبی ما چندان ساده نیست. تابع loss شامل تمام لایه ها، وزن ها و بایاس ها است – این یک تابع کاملا عظیم است که در چندین بعد کار می کند! محاسبه مشتقات با استفاده از تمایز عددی به چندین پاس رو به جلو برای به روز رسانی یک پارامتر نیاز دارد (در فصل 10 در مورد به روز رسانی پارامتر صحبت خواهیم کرد). ما باید پاس رو به جلو را به عنوان مرجع انجام دهیم، سپس یک پارامتر را با مقدار دلتا به روز کنیم و دوباره عبور رو به جلو را از مدل خود انجام دهیم تا تغییر مقدار ضرر را ببینیم. در مرحله بعد، باید مشتق را محاسبه کنیم و تغییر پارامتری را که برای این محاسبه انجام داده ایم برگردانیم. ما باید این را برای هر وزن و تعصب و برای هر نمونه تکرار کنیم که بسیار زمان بر خواهد بود. همچنین می توانیم این روش را به عنوان جبر بی رحمانه محاسبات مشتق در نظر بگیریم. برای تکرار، همانطور که به سرعت بسیاری از اصطلاحات را پوشش دادیم، مشتق شیب خط مماس برای تابعی است که یک پارامتر واحد را به عنوان ورودی می گیرد. ما از این توانایی برای محاسبه شیب تابع ضرر در هر یک از نقاط وزن و بایاس استفاده خواهیم کرد – این ما را به تابع چند متغیره می رساند، که تابعی است که پارامترهای متعددی را می گیرد و موضوعی برای فصل بعدی است – مشتق جزئی.
مشتق تحلیلی
اکنون که ایده بهتری از مشتق داریم، چگونه مشتق عددی (که جهانی نیز نامیده می شود) را محاسبه کنیم و چرا رویکرد خوبی برای ما نیست، می توانیم به سراغ مشتق تحلیلی برویم، راه حل واقعی مشتقی که در کد خود پیاده سازی خواهیم کرد.
در ریاضیات ، دو روش کلی برای حل مسائل وجود دارد: روش های عددی و تحلیلی. روش های حل عددی شامل ارائه عددی برای یافتن راه حل است، مانند رویکرد بالا با approximate_derivative. حل عددی نیز یک تقریب است. از سوی دیگر، روش تحلیلی راه حل دقیق و بسیار سریعتر را از نظر محاسباتی ارائه می دهد. با این حال، شناسایی راه حل تحلیلی برای مشتق یک تابع معین، همانطور که به سرعت یاد خواهیم گرفت، از نظر پیچیدگی متفاوت خواهد بود، در حالی که رویکرد عددی هرگز پیچیده تر نمی شود – همیشه متد را دو بار با دو ورودی فراخوانی می کند تا مشتق تقریبی را در یک نقطه محاسبه کند. برخی از راه حل های تحلیلی کاملا واضح هستند، برخی را می توان با قوانین ساده محاسبه کرد و برخی از توابع پیچیده را می توان به قطعات ساده تر تقسیم کرد و با استفاده از به اصطلاح قانون زنجیره ای محاسبه کرد. ما می توانیم از راه حل های مشتق شده از قبل اثبات شده برای توابع خاص استفاده کنیم، و برخی دیگر – مانند تابع ضرر ما – را می توان با ترکیبی از موارد فوق حل کرد.
برای محاسبه مشتق توابع با استفاده از روش تحلیلی، می توانیم آنها را به توابع ساده و عنصری تقسیم کنیم، مشتقات آن ها را پیدا کنیم و سپس قانون زنجیره ای را اعمال کنیم که به زودی توضیح خواهیم داد، برای بدست آوردن مشتق کامل. برای شروع ساختن یک شهود، بیایید با توابع ساده و مشتقات مربوطه آنها شروع کنیم.
مشتق یک تابع ثابت ساده:
شکل 7.10: مشتق یک تابع ثابت – مراحل محاسبه.
Anim 7.10: https://nnfs.io/cow
هنگام محاسبه مشتق یک تابع ، به یاد بیاورید که مشتق را می توان به عنوان شیب تفسیر کرد. در این مثال، نتیجه این تابع یک خط افقی است زیرا مقدار خروجی برای هر x 1 است:
با نگاه کردن به آن، آشکار می شود که مشتق برابر با 0 است زیرا هیچ تغییری از یک مقدار x به هر مقدار دیگری از x وجود ندارد (یعنی هیچ شیب وجود ندارد).
تا کنون، ما مشتقات توابع را با در نظر گرفتن یک پارامتر، x در مورد ما، در هر مثال محاسبه می کنیم. این با مشتقات جزئی تغییر می کند زیرا آنها توابع را با چندگانه می گیرند و ما مشتق را با توجه به تنها یکی از آنها در یک زمان محاسبه خواهیم کرد. در حال حاضر، با مشتقات، همیشه با توجه به یک پارامتر واحد است. برای نشان دادن مشتق ، می توانیم از نماد اول استفاده کنیم ، جایی که برای تابع f(x) ، یک عدد اول (‘) مانند f‘(x) اضافه می کنیم. برای مثال ما، f(x) = 1، مشتق f'(x) = 0. نماد دیگری که می توانیم از آن استفاده کنیم نماد لایبنیتس نامیده می شود – وابستگی به نماد اول و روش های متعدد نوشتن مشتق با نماد لایبنیتس به شرح زیر است:
هر یک از این نمادها معنای یکسانی دارند – مشتق یک تابع (با توجه به x).
در مثال های زیر، ما از هر دو نماد استفاده می کنیم، زیرا گاهی اوقات استفاده از یک نماد یا نماد دیگر راحت است. همچنین می توانیم از هر دوی آنها در یک معادله واحد استفاده کنیم.
به طور خلاصه: مشتق یک تابع ثابت برابر با 0 است:
مشتق یک تابع خطی:
شکل 7.11: مشتق یک تابع خطی – مراحل محاسبه.
Anim 7.11: https://nnfs.io/tob
در این حالت ، مشتق 1 است و شهود پشت آن این است که به ازای هر تغییر x ، y به همان مقدار تغییر می کند ، بنابراین y یک برابر x تغییر می کند.
مشتق تابع خطی برابر با 1 است (اما نه در هر مورد، که در ادامه توضیح خواهیم داد):
اگر 2x را امتحان کنیم که یک تابع خطی نیز هست چه؟
شکل 7.12: مشتق یک تابع خطی دیگر – مراحل محاسبه.
Anim 7.12: https://nnfs.io/pop
هنگام محاسبه مشتق، می توانیم هر ثابتی را که تابع ضرب شده است بگیریم و آن را به خارج از مشتق منتقل کنیم – در این حالت 2 ضرب در مشتق x است. از آنجایی که قبلا مشخص کردیم که مشتق f(x) = x 1 است، اکنون آن را در 2 ضرب می کنیم تا نتیجه به ما بدهد.
مشتق یک تابع خطی برابر با شیب است ، m در این حالت m = 2:
اگر این را با تمایز عددی مرتبط کنید، کاملا حق با شماست – ما قبلا به این نتیجه رسیدیم که مشتق یک تابع خطی برابر با شیب آن است:
m، در این مورد، یک ثابت است، هیچ تفاوتی با مقدار 2 ندارد، زیرا یک پارامتر نیست – هر غیر پارامتر تابع نمی تواند مقدار خود را تغییر دهد؛ بنابراین، ما آن را ثابت می دانیم. ما به تازگی روش ساده تری برای محاسبه مشتق یک تابع خطی پیدا کرده ایم و همچنین آن را برای معادلات شیب های مختلف ، m تعمیم داده ایم. همچنین یک مشتق دقیق است، نه یک تقریب، مانند تمایز عددی.
وقتی نماها را به تابع معرفی می کنیم چه اتفاقی می افتد؟
شکل 7.13: مشتق تابع درجه دوم – مراحل محاسبه.
Anim 7.13: https://nnfs.io/rok
اول، ما قانون یک ثابت را اعمال می کنیم – می توانیم ضریب (مقداری که مقدار دیگر را ضرب می کند) را به خارج از مشتق منتقل کنیم. قانون دست زدن به نماها به شرح زیر است: توان را در این مورد a 2 بگیرید و از آن به عنوان ضریب مقدار مشتق شده استفاده کنید ، سپس 1 را از توان کم کنید ، همانطور که در اینجا مشاهده می شود:
2 – 1 = 1.
اگر f(x) = 3×2 آنگاه f'(x) = 3·2×1 یا به سادگی 6x. این بدان معناست که شیب خط مماس ، در هر نقطه ، x ، برای این تابع درجه دوم ، 6x خواهد بود. همانطور که در حل عددی تمایز تابع درجه دوم بحث شد ، مشتق یک تابع درجه دوم به x بستگی دارد و در این حالت برابر با 6x است:
یک عملگر رایج در توابع جمع است، چگونه مشتق را در این مورد محاسبه کنیم؟
شکل 7.14: مشتق تابع درجه دوم با جمع – مراحل محاسبه.
Anim 7.14: https://nnfs.io/mob
مشتق یک عملیات جمع مجموع مشتقات است، بنابراین می توانیم مشتق یک عملیات جمع پیچیده تر را به مجموع مشتقات هر عبارت از معادله تقسیم کنیم و بقیه مشتقات را با استفاده از روش هایی که قبلا می دانیم حل کنیم.
مشتق مجموع توابع برابر با مشتقات آنها است:
در این مورد، ما قانون را با استفاده از هر دو نماد نشان داده ایم.
بیایید چند مثال دیگر را امتحان کنیم:
شکل 7.15: مشتق تحلیلی مثال تابع چند بعدی – مراحل محاسبه.
Anim 7.15: https://nnfs.io/tom
مشتق ثابت 5 برابر با 0 است ، همانطور که قبلا در ابتدای این فصل بحث کردیم.
ما همچنین باید قوانین دیگری را که تاکنون آموخته ایم برای انجام این محاسبه به کار ببریم.
شکل 7.16: مشتق تحلیلی یک مثال تابع چند بعدی دیگر – محاسبه
مراحل.
Anim 7.16: https://nnfs.io/sun
این تا کنون نسبتا ساده به نظر می رسد، اما با شبکه های عصبی، ما با توابعی کار می کنیم که چندین پارامتر را به عنوان ورودی می گیرند، بنابراین ما می خواهیم مشتقات جزئی را نیز محاسبه کنیم.
خلاصه
بیایید برخی از راه حل ها و قوانینی را که در این فصل آموخته ایم خلاصه کنیم.
راه حل:
مشتق یک ثابت برابر با 0 است (m در این مورد یک ثابت است ، زیرا پارامتری نیست که ما با توجه به آن به دست می آوریم ، که در این مثال x است):
مشتق x برابر با 1 است:
مشتق یک تابع خطی برابر با شیب آن است:
قوانین:
مشتق یک مضرب ثابت تابع برابر با مضرب ثابت تابع است
مشتق:
مشتق مجموع توابع برابر با مجموع مشتقات آنها است:
همین مفهوم در مورد تفریق نیز صدق می کند:
مشتق توان:
ما در اینجا از مقدار x به جای کل تابع f(x) استفاده کردیم زیرا مشتق کل یک تابع کمی متفاوت محاسبه می شود. در فصل بعدی این مفهوم را به همراه قانون زنجیره ای توضیح خواهیم داد.
از آنجایی که قبلا یاد گرفته ایم که مشتقات چیست و چگونه آنها را به صورت تحلیلی محاسبه کنیم، که بعدا در کد پیاده سازی خواهیم کرد، می توانیم یک قدم جلوتر برویم و مشتقات جزئی را در فصل بعدی پوشش دهیم.
مواد تکمیلی: https://nnfs.io/ch7
کد فصل، منابع بیشتر و اشتباهات این فصل.