مشتق گیری اتوماتیک

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

مشتق گیری اتوماتیک
مشتق گیری اتوماتیک

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

مشتق گیری اتوماتیک
مشتق گیری اتوماتیک

توضیح مشتق‌گیری خودکار با یک تابع ساده

من خودم هنوز این موضوع را در دانشگاه یاد نگرفته‌ام، بنابراین یک ویدیو تماشا کردم و همچنان گیج بودم. اما توضیح بعدی به من کمک کرد تا کاملاً درک کنم:

مشتق‌گیری خودکار (AutoDiff) روشی برای یافتن مشتق یک تابع با استفاده از یک برنامه کامپیوتری است. در نظر بگیرید یک تابع ساده داریم:

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

مراحل در تفکیک خودکار

تجزیه تابع:

   هر عملیات در تابع را شناسایی کنید.

   تابع ما را می‌توان به مراحل ساده‌تر تقسیم کرد:

   1. a = x

   2. b = a^2

   3. c = 3a

   4. d = b + c

   . f(x) = d + 55  

مشتق‌گیری خودکار به روش پیشرو (Forward Mode AutoDiff)

Computational graph of f(x1,x2,x3)=3*(x1**2+x2*x3)
Computational graph of f(x1,x2,x3)=3*(x1**2+x2*x3)

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

تابعی که در عکس میبینید با مثال متن متفاوت است. Computational graph of f(x1,x2,x3)=3*(x1**2+x2*x3) . در طول متن با مثال تصویری جدا و کتبی سعی میکنم مفهوم مشتق گیری اتوماتیک را توضیح بدهم.

با x و مشتق آن شروع کنید، که 1 است (زیرا مشتق x نسبت به x برابر با 1 است.

   x = x, dx/dx = 1

   تفکیک گام‌به‌گام:

   1. a = x, da/dx = 1

   2. b = a^2, db/dx = 2a * da/dx = 2a

   3. c = 3a, dc/dx = 3 * da/dx = 3

   4. d = b + c, dd/dx = db/dx + dc/dx = 2a + 3

   5. f(x) = d + 5, df/dx = dd/dx = 2a + 3

  
و a را دوباره به عنوان x جایگزین کنید:

   df/dx = 2x + 3

پس, تفکیک خودکار تابع را به قسمت‌های کوچکتر تقسیم می‌کند.

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

برای تابع ما f(x) = x^2 + 3x + 5، AutoDiff به ما کمک می‌کند تا دریابیم که مشتق آن 2x + 3 است.

این فرآیند دقیق و کارآمد است و برای کامپیوتر‌ها برای مدیریت توابع پیچیده عالی است!

تفکیک خودکار حالت عقب( روش معکوس)

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

مثال تابع:

در نظر بگیرید یک تابع برداری ساده داریم

تفکیک خودکار حالت عقب( روش معکوس)
تفکیک خودکار حالت عقب( روش معکوس)

مراحل تفکیک خودکار روش معکوس

تجزیه تابع:

هر عملیات در تابع را شناسایی کرده و به صورت متغیرهای میانی نمایش دهید.

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

a1 = x1^2

a2 = x2

y1 = a1 + a2

b1 = x1

b2 = x2^2

y2 = b1 + b2

 مرحله جلو:

متغیرهای میانی و خروجی‌های نهایی را محاسبه کنید.

برای x = [x1, x2]^T:

a1 = x1^2

a2 = x2

y1 = a1 + a2

b1 = x1

b2 = x2^2

y2 = b1 + b2

مرحله عقب:

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

مشتقات خروجی نسبت به خود را به عنوان 1 مقداردهی اولیه کنید:

 

dy1/dy1 = 1, dy2/dy2 = 1

مشتقات متغیرهای میانی را محاسبه کنید:

dy1/da1 = 1, dy1/da2 = 1

dy2/db1 = 1, dy2/db2 = 1

با استفاده از قانون زنجیره، مشتقات را به ورودی‌ها x بازگردانید:

da1/dx1 = 2x1, da2/dx2 = 1

db1/dx1 = 1, db2/dx2 = 2x2

dy1/dx1 = dy1/da1 * da1/dx1 + dy1/da2 * da2/dx2 = 1 * 2x1 + 1 * 0 = 2x1

dy1/dx2 = dy1/da1 * da1/dx1 + dy1/da2 * da2/dx2 = 0 * 2x1 + 1 * 1 = 1

dy2/dx1 = dy2/db1 * db1/dx1 + dy2/db2 * db2/dx2 = 1 * 1 + 0 * 0 = 1

dy2/dx2 = dy2/db1 * db1/dx1 + dy2/db2 * db2/dx2 = 0 * 0 + 1 * 2x2 = 2x2

 بیاید با یک مثال دیگر به صورت تصویری هم این مراحل رو ببینیم

تفکیک خودکار حالت عقب( روش معکوس)
تفکیک خودکار حالت عقب( روش معکوس) 1

تفکیک خودکار حالت عقب( روش معکوس)
تفکیک خودکار حالت عقب( روش معکوس) 2
تفکیک خودکار حالت عقب( روش معکوس)
تفکیک خودکار حالت عقب( روش معکوس) 3

خلاصه

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

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

برای تابع برداری ما، مشتقات به صورت زیر محاسبه می‌شوند:

مشتق تابع برداری
مشتق تابع برداری

جداسازی محاسبات در دیفرانسیل خودکار :( Detaching Computation Automatic Differentiation)

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

توضیح ساده

۱. مثال تابع:

فرض کنید تابعی به صورت f(x) = (x^2 + y^2) دارید و می‌خواهید مشتق آن را نسبت به x محاسبه کنید، اما نه نسبت به y.

۲. جداسازی:

وقتی شما یک متغیر را "جدا" می‌کنید، به کامپیوتر می‌گویید که آن را هنگام محاسبه گرادیان‌ها در نظر نگیرد.

در مثال ما، اگر y جدا شود، محاسبه گرادیان نحوه تغییرات y را نادیده می‌گیرد.

۳. چرا از جداسازی استفاده می‌کنیم:

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

ساده‌سازی محاسبات: این کار می‌تواند محاسبات را ساده‌تر و سریع‌تر کند.

۴. مثال در عمل:

اگر y در تابع f(x) = (x^2 + y^2) جدا شود:

گرادیان نسبت به x به طور عادی محاسبه می‌شود: df/dx = 2x.

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

ترکیب گرادیان‌ها و کنترل جریان در پایتون

گرادیان‌ها به ما کمک می‌کنند تا درک کنیم تغییر در ورودی‌ها چگونه بر خروجی‌ها تأثیر می‌گذارد و در یادگیری ماشین برای بهینه‌سازی توابع کلیدی هستند. کنترل جریان در پایتون از دستوراتی مانند if، for، و while برای هدایت ترتیب عملیات در کد استفاده می‌کند.

import torch

def example_function(x):

    y = 0

    for i in range(5):

        if i % 2 == 0:

            y += x ** 2

        else:

            y += x

    return y

x = torch.tensor(2.0, requires_grad=True)

y = example_function(x)

y.backward()

print(x.grad) 

#این دستور گرادیان y نسبت به x را چاپ می‌کند

توضیحات

تعریف تابع:

تابع example_function(x) پنج بار حلقه می‌زند.

برای i زوج x^2 و برای i فرد x به y اضافه می‌شود.

محاسبه گرادیان:

x یک تانسور است که گرادیان‌ها را پیگیری می‌کند (requires_grad=True).

y = example_function(x) مقدار y را محاسبه می‌کند.

y.backward() گرادیان y نسبت به x را محاسبه می‌کند.

print(x.grad) گرادیان را نشان می‌دهد.

نکات کلیدی:

کنترل جریان (for و if) تغییر می‌دهد که چگونه x در محاسبات استفاده می‌شود.

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

گرادیان (Gradient)

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

گرادیان
گرادیان
گرادیان
گرادیان

تصویر نشان می‌دهد که گرادیان چگونه از مشتقات جزئی تشکیل می‌شود و با استفاده از یک مثال ساده، نحوه محاسبه گرادیان یک تابع دو متغیره f(x,y)را توضیح می‌دهد. این گرادیان نشان‌دهنده جهت و میزان بیشترین افزایش تابع در فضای چندمتغیره است.

 نتیجه‌گیری

مشتق‌گیری اتوماتیک (AutoDiff) روشی قدرتمند و دقیق برای محاسبه مشتقات توابع با استفاده از برنامه‌های کامپیوتری است. این روش با تحلیل مستقیم کدهای تابع، مشتقات را به صورت مرحله‌به‌مرحله محاسبه می‌کند و از دقت بالا و کارایی بیشتری نسبت به روش‌های عددی و نمادین برخوردار است. استفاده از مشتق‌گیری اتوماتیک در یادگیری ماشین، بهینه‌سازی و مدل‌سازی ریاضی و فیزیکی بسیار مفید است و به ما کمک می‌کند تا مسائل پیچیده را به سادگی و دقت بالا حل کنیم.

پی‌نوشت

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

برای اطلاعات یبشتر پیشنهاد میکنم این مقاله کوتاه را مطالعه بکنید https://medium.com/@rhome/automatic-differentiation-26d5a993692b 

راه‌های ارتباط:

ایمیل:     bita.nf@gmail.com

لینکدین : www.linkedin.com/in/bita-farahmand-58363a232

توییتر:      BitaBloom@

مرکز داده‌ها (ویترین)

مرکز داده‌ها

با کاوش در مجموعه‌ای گسترده از داده‌ها، پروژه‌ها و تحقیقات خود را ارتقاء دهید.

پلتفرم بینایی ماشین بینااکسپرتز

ورود به برنامه ثبت نام در برنامه