در مشتقگیریِ خودکارِ رو به جلو، هر مقدار میتواند همراهِ یک tangent از میانِ عملیات عبور کند. مشتقِ خروجی از ترکیبِ همین قواعد به دست میآید؛ لازم نیست تابع را در x+h دوباره اجرا کنیم. این تمرین یک نوعِ عددِ دوگانهٔ کوچک میسازد و مرزِ آن را با مشتقِ دستی و تفاضلِ محدود روشن میکند.
هر عدد، دو جزء دارد
کلاسِ Dual دو مقدارِ value وtangent نگه میدارد. برای ورودیِ x، مقدارِ اصلی همان x است و seed تعیین میکند tangentِ آغازین چه باشد. ثابتها با tangentِ صفر وارد میشوند. اینجا فقط یک ورودیِ اسکالر و یک جهت داریم؛ بردارِ کاملِ مشتقها یا Jacobianِ عمومی ساخته نمیشود.
جمع، دو مقدار و دو tangent را جمع میکند. در ضرب، مقدارِ اصلی حاصلضربِ دو value است، ولی tangent از قاعدهٔ ضرب میآید: tangentِ اول ضربدر valueِ دوم، بهعلاوهٔ valueِ اول ضربدر tangentِ دوم. همین قاعده باید در خودِ عملگر اجرا شود؛ نوشتنِ جوابِ نهایی به جایِ عبوردادنِ جفتها کافی نیست.
تابعِ ترکیبی را واقعاً اجرا کنیم
تابعِ اصیلِ تمرین g(x)=x²×sin(x)+exp(x) است و x را۰٫۵ میگذاریم. ابتدا x×x، سپس sin(x) وexp(x)، بعد ضربِ مربع در سینوس و در پایان جمع اجرا میشوند. فایلِ JSON برای هر یک از این گامها، value وtangent را ثبت میکند.
عملگرِ sin، tangent را در cos(value) ضرب میکند. exp هم tangent را در exp(value) ضرب میکند. در مسیرِ Dual هیچ h وجود ندارد. با seedِ یک، tangentِ خروجی۲٫۳۴۷۵۴۲۴۴۹۷۷۶۹۲۴۴ است؛ این عدد از ترکیبِ واقعیِ عملگرها حاصل شده است.
seed را عوض کنیم، پرسش هم عوض میشود
همان تابع سه بار با seedهای صفر،یک ودو اجرا میشود. مقدارِ اصلیِ خروجی یکسان میماند؛ tangentِ seedِ صفر، صفر و tangentِ seedِ دو، دو برابرِ seedِ یک میشود. بنابراین tangent همیشه صرفاً یک برچسبِ ثابتِ «مشتق» نیست؛ جهت و اندازهٔ perturbationِ آغازین را حمل میکند.
این سه اجرا با مشتقِ تحلیلیِ مستقل، یعنی۲x×sin(x)+x²×cos(x)+exp(x)، با تلورانسِ ۱e−۱۲ مقایسه میشوند. این رابطه، oracleِ کنترل است؛ کلاسِ Dual برای ساختِ tangentِ خودش آن را فراخوانی نمیکند.
تفاضلِ محدود را جدا نگه داریم
در یک کنترلِ دیگر، تابعِ معمولی در x±h وh=۱e−۵ اجرا میشود. تفاضلِ مرکزی حدود۲٫۳۴۷۵۴۲۴۴۹۸۵۴۲۴۵ میدهد؛ اختلافِ مطلق با مشتقِ تحلیلی حدود۷٫۷۳e−۱۱ است و از تلورانسِ ۱e−۸ کوچکتر است. این oracle تقریبی است، نه برابریِ بیتیِ عددها.
مقدارِ h فقط در این کنترلِ جدا وجود دارد. از نزدیکبودنِ دو جواب نتیجه نمیگیریم تفاضلِ محدود و عبورِ Dual یک الگوریتماند. خطایِ گردکردنِ عملیاتِ ممیزشناور هم با استفاده از مشتقگیریِ خودکار ناپدید نمیشود.
ثابت، تکرارِ ورودی و تابعِ پشتیبانینشده
عبارتِ ۳x+۴ در x=۲، tangentِ ۳ میدهد. ضربِ تودرتوی x×x×x در۲ نیز tangentِ ۱۲ دارد؛ استفادهٔ چندباره از یک ورودی، واقعاً در محاسبه حضور دارد. این آزمونها کمک میکنند یک مسیرِ ظاهراً درست، قاعدهٔ ضرب یا ثابت را جا نیندازد.
کلاس فقط جمع،ضرب،sin وexp را پوشش میدهد. abs(Dual(۰،۱)) پشتیبانی نمیشود و خطایِ TypeError دارد؛ ادعایِ مشتقِ abs در صفر نمیکنیم. بولین، نامتناهی، حاصلِ بیرونِ کرانِ محلیِ ۱e۶ و ورودیِ exp با قدرمطلقِ بیش از۲۰ در آزمون رد شدهاند. کرانِ تمامِ مقدارهای میانی برقرار است؛ مجازبودنِ ورودی بهتنهایی موفقیتِ تمامِ مسیر را تضمین نمیکند.
مفهومِ مشتق و گرادیان پایهٔ نظری است و پسانتشار مسیرِ reverse را توضیح میدهد. اینجا موتورِ عمومیِ آموزش، شاخههای دلخواه یا Julia اجرا نشده است. ادامه در مبانی هوش مصنوعی؛ این کلاسِ آموزشی را قابلیتِ تأییدشدهٔ محصولِ اپرا معرفی نکنید.
فایل تمرین و منبع
کد مستقلِ تمرین و کنترلها؛ Python · ورودیها و تمام خروجی واقعیِ همین تمرین؛ JSON
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.