ماتریسها و مشتق: حل مسأله
عمدهی کارکرد مشتقگیری، یافتن نقاط اکسترموم است؛ اما نحوهی استفاده از مشتق برای رسیدن به اکسترموم میتواند یا از طریق روشهای iterative بهینهسازی باشد یا حل فرمال معادلات. برای اینکه از هر کدام از این موارد یک مثال دیده باشیم، اول مقدار ماتریس correlation را از روی تعدادی نمونه از یک توزیع گوسی تخمین میزنیم و بعدش گرادیان یک MLP را نسبت به وزنهایش محاسبه میکنیم.
تخمین ماتریس correlation
فرمول توزیع گوسی چند متغیره چیزی است که در زیر آمده:
خب حالا اگر نمونههای تا از این توزیع داشته باشیم، چه مقادیری از و احتمال رخداد این نمونهها را بیشینه میکنند؟
با فرض اینکه نمونهها از هم مستقل باشند، احتمال رخداد همهشان میشود:
وقتی میشود با لگاریتم احتمال همان کاری را کرد که با احتمال میشود کرد، چرا سراغش نرویم. مخصوصاً برای توزیع گوسی که تابع نمایی نقش اساسی در آن دارد. خب، با جایگذاری رابطهی توزیع احتمال در فرمول لگاریتمها داریم:
باز هم سادهترش کنیم میشود:
برای این سادهسازی، من اول عبارت دترمینان را که ربطی به اندیس جمع نداشت از جمع خارج کردم که طبیعتاً ضرب در تعداد دفعات جمع خوردن میشود (یعنی ). بعدش را از لگاریتم خارج کردم که بصورت ضرب ظاهر شود. در مرحلهی بعد، را با استفاده از رابطهی ساده کردم. در نهایت هم ضریب را از درون جمع به بیرون انتقال دادم که به دلیل خاصیت پخشی ضرب امکانپذیر است (توجه کردهاید که تعداد نمونهها و تعداد عناصر هر نمونه است؟)
حالا کافیست دو تا مشتق بگیریم و برابر صفر قرار دهیم. یکی نسبت به (یک بردار) و دیگری نسبت به (یک ماتریس). اول با بردار شروع میکنیم:
به همین سرعت محاسبه شد! میدانید چرا به و همزادش محل ندادم؟ چون طبق فرمول، این ماتریسها معکوسپذیرند و فقط در یک حالت حاصل ضرب آنها در یک بردار برابر صفر میشود و آن وقتی است که خود آن بردار صفر باشد؛ یعنی . اما مشتق دوم که جذابتر هم هست:
از طول و درازای فرمول بالا نترسید، در دلش چیزی نیست. کافیست از رابطهی زیر برای سادهسازی استفاده کنیم:
و یا معادلش:
با جایگذاری به نتیجهی زیر میرسیم:
یا به عبارتی:
باز هم همان رابطهی . در پست اول که گفتم، این رابطه در مشتقگیری خیلی کاربرد دارد:
اورکا، اورکا:
باز هم ! اگر یک عدد اسکالر، یک بردار سطری () و یک بردار ستونی باشد، چه رابطهای حاصل میشود؟
زیبا نیست؟ با این حساب:
در اینجا باید بپرسید که چرا ؟ جوابش این است که وقتی باشد، ترانهادهاش برابر خودش میشود.
مشتق نسبت به وزنهای MLP
لایههای یک شبکهی MLP را میتوان بصورت زیر نشان داد:
بسته به این که MLP مورد نظر ما چند لایه باشد، وقتی میخواهیم آموزشش بدهیم، خروجی لایهی م را با نتایج دلخواه مقایسه میکنیم و خطا را محاسبه میکنیم. فرض کنیم که معیار خطای کمترین متوسط مربعات را در نظر داشته باشیم:
از ماشینآلاتی که برای مشتقگیری ساختیم برای محاسبهی استفاده میکنیم. محاسبهی مشتق نسبت به بایاسها هم کاملاً مشابه است:
حالا کافیست هر جزء را محاسبه کنیم.
یافتن اینکه اینها را چطور با استفاده از مطالبی که در سه پُست گذشته ارائه کردم محاسبه کردهام به خود شما واگذار میکنم که بیابید (این خودش تمرین خوبی است.) اما مباحث از اینجا به بعد شیرینتر میشود. برای اینکه بتوانم ادامه بدهم باید یک رابطهی جدید را معرفی کنم.
علامت نمایشگر ضرب هادامارد یا عنصربهعنصر است. از طرفی وقتی یک بردار است، هم رویش اعمال شود، باز هم خروجی یک بردار است، پس میشود کل مشتق بالا را اینگونه نوشت:
بد نیست ببینیم، آن در وسط در واقع چه بلایی سر مقدار خطا () میآورد. از خود خطا شروع میکنیم:
انگار هر عنصر از خطا، با مقدار مشتق تابع به ازای همان عنصر وزندهی میشود و بعدش بردار به دست آمده از سمت چپ در ماتریس وزن لایهی قبلی ضرب میشود. این همان پس انتشار خطاست. هر عنصری از خطا، با وزن مربوطه، به یکی از گرههای لایهی زیرین مرتبط میشود. همین عملیات را میشود ادامه داد:
باز هم مقدار خطای لایهی بالا با مشتق در لایهی زیرین وزندهی شده و به لایهی پایینتر منتشر میشود. اگر با همین فرمان پیش برویم به خطای لایهی مورد نظر یعنی میرسیم:
تمرین خوبی است که ببینید چرا رابطهی بالا برقرار است. بررسی اینکه چه فرمی دارد در این مورد نقطهی شروع است. بگذریم.
در نهایت این مقدار مشتق چه کاربردی دارد؟ از آن در بهینهسازی و رفتن به سمت مقدار آموزش دیدهی وزنها استفاده میکنیم. در روشهای بهینهسازی مبتنی بر گرادیان، همیشه مقدار گرادیان خطا نسبت به پارامترها با نسبتی منفی جمع میشود. این اساس همهی روشهای بهینهسازی مبتنی بر گرادیان است. اما در اینجا گرادیان نسبت به ابعادی مشابه با ندارد؛ چگونه باید این دو را جمع بزنیم؟
اگر از ابتدا سراغ تنسورها رفته بودیم، این مشکل پیش نمیآمد. مقدار مشتق هم ابعادی برابر با خود میداشت (صد البته چون یک عدد اسکالر است.) حالا هم اتفاق خاصی نیفتاده. یادتان هست که برای تعریف اینگونه مشتقگیری که در این چهار پُست با هم مرورش کردیم، از ابتدا قرار گذاشتیم که هر ماتریس را با یک زوج مرتب نمایش بدهیم. الآن هم که مشتق را داریم، ابعاد ماتریسهای را هم که داریم. کافیست مشتق محاسبه شده را با ابعاد ماتریس اولیه باز نمایی کنیم. تعداد عناصر مشتق طبق تعریف یکی است.
نکتهی جالب ماجرا اینجاست که تا الآن که این پست را مینویسم، بدون استثنا، باز مرتبسازی مشتق برای من برابر با نگاه کردن به درون عملگر بوده است. همین مثال MLP را نگاه کنید:
مقدار ابعادی دقیقاً برابر ماتریس اولیه دارد!
نتایج اخلاقی
در نهایت این نتایج را به عنوان خلاصه تقدیم میکنم:
۱-برای گرفتن مشتق نسبت به ماتریس نیازی به محاسبات تنسوری نیست ۲-مشتقگرفتن برای ورزش ذهنی خوب است ۳-اصولاً اکثر اوقات نیاز نیست خودتان مشتق نسبت به ماتریس بگیرید!