الگوریتم Forward-Forward

امیرمحمد پیران
همین چندماه اخیر بود که آقای جافری هینتون(Geoffrey Hinton) ملقب به پدرخوانده ی دنیای هوش مصنوعی، مقاله ای جنجالی با عنوان Forward-Forward Algorithm منتشر کرد. ایشون توی این مقاله از روش جدیدی برای آموزش و train کردن شبکه های عصبی نام برده بود که جایگزین روش قبلی یعنی Back Propagation می شد. جالبه بدونید که خالق این الگوریتم Back Propagation هم همین آقای جافری هینتونه! البته نکته ای که باید قبل از شروع ذکر کنم اینه که، Forward-Forward که اخیرا معرفی شده، هنوز جایگزین کاملی برای Back Propagation نیست و بیشتر در حد ایده اس و طبق گفته های آقای هینتون، نیاز به بررسی و آزمایش های بیشتر داره.

خب از توضیح Back Propagation شروع کنیم و علت اینکه آقای هینتون اون رو کافی ندونسته و به دنبال کشف روش های جدید شتافته. دو مرحله ی اساسی در تمرین و تربیت(!) یک شبکه عصبی وجود داره و اون ها به ترتیب Forward Propagation و Back Propagation هستند. در مرحله ی Forward، دیتا به خورد شبکه ی عصبی داده شده و با توجه به وزن های(Weights) بین نورون ها، نورون ها مقدار مشخصی از فعالیت(Activation) رو به خودشون میگیرن. توی این مرحله در واقع داده ها یا خواص یادگرفته شده(Features) به سمت جلو حرکت می کنن تا از ابتدای شبکه عصبی به پایانش برسن.

اما این مرحله برای یادگیری شبکه عصبی کافی نیست. بلکه باید با توجه به پیش بینی های شبکه عصبی، بتونیم اون رو دائما اصلاح کنیم و مرحله ی Back Propagation این کار رو برای ما انجام میده. توی این مرحله، از انتهای شبکه عصبی به سمت ابتدا شروع به حرکت می کنیم و میزان خطا ها (Losses) رو برای هر لایه به دست میاریم و با توجه به اون، روی وزن ها اصلاح انجام میدیم. این اصلاح به شبکه عصبی کمک میکنه که اگه دفعه ی بعدی دیتای مشابه دیتای الانش دید، احتمالا بتونه به درستی بهش پاسخ بده. این مرحله براساس مشتق های ریاضیاتی کار میکنه (Derivative Based) و با توجه به میزان مشتق، میتونیم سهم هر پارامتر وزن رو توی خطای کنونی به دست بیاریم و بعدش اصلاحش کنیم.

و اما مشکلات Back Propagation. علی رغم اینکه این الگوریتم فوق العاده پرکاربرده و کلید اساسی ورود به دنیای شبکه های عصبیه، متاسفانه مشکلاتی هم داره. یکی از مهم ترین مشکلاتش، زمان بر بودنشه و اینکه ناچاریم برای train کردن شبکه عصبی، عملیات رو متوقف کنیم تا یه سری محاسبات حاوی مشتق انجام بشن و وزن ها آپدیت بشن و بعدش بتونیم دوباره ورودی بگیریم. این اتفاق توی شبکه های عصبی بدن ما مثل مغز رخ نمیده. بلکه ما از ابتدای زندگیمون دائما در حال دریافت اطلاعات از محیطمون بودیم و هیچوقت متوقف نشدیم که وزن هامون رو اصلاح کنیم! البته طبق گفته های آقای هینتون، ما تنها Back Propagation بر اساس مشتق رو نداریم توی بدنمون (هیچ سندی مبنی بر وجودش وجود نداره) ولی نورون هایی توی مغز هستند که حالت حلقوی دارن و دیتا میتونه توی اونها حرکت رو به عقب داشته باشه. کورتکس بینایی مغز برای مثال این مطلب رو تایید می کنه.

پس دوتا از مشکلات Back Propagation شد عدم توانایی کار با دیتای جاری(Streaming Data) و عدم تشابه با کارکرد مغز. مشکل دیگه این الگوریتم اینه که نیاز به درک کاملی از ساختار شبکه عصبی داره تا بتونه مشتق ها رو محاسبه کنه و شبکه رو اصلاح کنه. این به این معناست که نمیتونه با شبکه عصبی ای که نامشخصه (Black Box هست) و فقط میتونه Forward Propagation داشته باشه و خروجی بده، کار بکنه. مشکل بعدیش هم با شبکه های متناوب (Recurrent Neural Networks aka RNN) هست که برای استفاده از عنصر زمان توی شبکه های عصبی ساخته شدن.

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

شبکه های تولیدی خصمانه (Generative Adversary Networks) شبکه هایی هستن که براساس نظریه بازی ها ساخته شدن و از دو بخش اساسی تشکیل میشن. یه شبکه تولید کننده(Generator) نام داره و سعی میکنه دیتاهایی مشابه دیتاهایی که ورودی میگیره تولید بکنه. این شبکه وظیفه داره که شبکه دیگه یعنی شبکه تمایزدهنده(Discriminator) رو قانع کنه که دیتایی که تولید کرده، دیتای واقعیه و به هیچ وجه خودش اینو تولید نکرده! شبکه تمایزدهنده هم وظیفه داره تا دائما بتونه با دروغ های تولید کننده مقابله کنه و دیتاهای اون رو جعلی (Fake) بنامه. این دو شبکه باعث تقویت همدیگه میشن و فرایند یادگیری تا جایی ادامه پیدا میکنه که شبکه تولید کننده بتونه اونقدر خوب و حرفه ای دیتایی رو تولید کنه که شبکه ی تمایزدهنده فک کنه دیتای واقعیه. در نهایت بعد از این کار، ما یه شبکه عصبی تولید کننده داریم که میتونه دیتای مشابه دیتاست رو به طرز فوق العاده ای تولید کنه.

خب برگردیم به الگوریتم.  این الگوریتم از دو مرحله ی Forward Pass استفاده میکنه که اندکی با هم تفاوت دارن. مرحله ی Forward اولی، عبور مثبت(Positive Pass) نام داره و طی اون، دیتای واقعی(بهتون توضیح میدم چیه) به شبکه داده میشه و انتظار میره که نورون های شبکه، فعالیتشون بالا بره. Forward دومی هم عبور منفی(Negative Pass) نام داره و طی اون دیتای غیرواقعی یا جعلی رو به شبکه پاس میدیم و انتظار داریم که فعالیت نورون ها بیاد پایین. درواقع انتظار داریم که شبکه بتونه دیتای واقعی رو از دیتای جعلی تشخیص بده و با تغییر فعالیت های نورون های خودش، این رو به گوش ما برسونه. میتونیم همینطور بگیم که شبکه ما یک شبکه تمایزدهنده است.

حالا دیتای واقعی و جعلی چیه. ما ناچاریم تا یه مرحله به اصلاح دیتا اختصاص بدیم و طی اون، برچسب(Label) هر دیتا رو بهش بچسبونیم و بعد پاسش بدیم به شبکه عصبی. حالا اگه برچسب دیتا، برچسب درست باشه(مثلا تصویر عدد 5 رو داشته باشیم و برچسب اون تصویر هم عدد 5 رو نشون بده) این یه دیتای واقعیه و اگه برچسب غلط باشه(مثلا برای تصویر عدد 5، برچسب 2 خورده باشه) این یه دیتای جعلیه. البته هنوز تعریف دقیق از دیتای جعلی وجود نداره و این تنها یه مثالشه. ما همچنین میتونیم از دیتای تولید شده یه شبکه GAN به عنوان دیتای جعلی استفاده کنیم. شبکه عصبی دائما داره سعی میکنه که تشخیص درستی بین این دوتا دیتا قائل بشه.

اما نکته ای که باقی موند، اصلاح وزن ها توی این الگوریتمه. همونطوری که Back Propagation وظیفه اصلاح و بهبود وزن های شبکه عصبی رو به عهده داشت، این جا هم باید فرایندی برای اصلاح داشته باشیم. اصلاح وزن ها توی این الگوریتم، طی هر دو مرحله ی Forward صورت میگیره و بعد از انتساب فعالیت ها، تابعی از میزان مطلوبیت(Goodness) محاسبه میشه و برحسب اون، وزن ها آپدیت میشن. یعنی برای مثال، دیتای واقعی وارد شبکه عصبی میشه و انتظار میره که فعالیت ها بالا برن. اما فعالیت ها پایین موندن. پس وزن های اون لایه رو طوری اصلاح میکنیم که فعالیت های اون لایه با همون دیتا بالابره. همین کار رو برای تمامی لایه ها و همچنین برای دیتای غیرواقعی انجام میدیم.

به عنوان نکته آخر هم می پردازیم به معایب این روش که یکیش، همین تعمیم پذیر نبودنه(Generalizable) هنوز خیلی از دسته مسائل هستن که حالت خاص قرار میگیرن و Forward-Forward هنوز پیاده سازی درستی ازشون نداره. عیب بعدیش هم، اورفیت شدن(Overfit) هست که آقای هینتون سعی کرد توی مقاله بعدی خودش این مشکل رو حل کنه. تا حد زیادی هم بهتر شد.

خب امیدوارم از خوندن این مطلب لذت برده باشین!