راه‌های خفن و جدید برای یادگیری شبکه‌های عصبی با مدل انرژی‌محور (همون مدلای الهام‌گرفته از مغز!)

امروز میخوام یه موضوع باحال و خفن رو باهاتون به اشتراک بذارم: چطوری میشه شبکه‌های عصبی عمیق (Deep Neural Networks) رو با یه رویکرد به اسم مدل‌های انرژی‌محور یا Energy-Based Models (یعنی مدل‌هایی که بر اساس کم‌کردن مقدار یه نوع انرژی خاص کار می‌کنن) آموزش داد، اونم با روش‌هایی که خیلی به مغز خودمون نزدیک‌تر هستن.

خیلی وقتا دانشمندها و مهندس‌ها سعی می‌کنن شبکه‌های عصبی مصنوعی رو شبیه مغز انسان درست کنن. اما یه مشکل مهم هست: اگه بخوایم برگردیم سراغ روش معروف backpropagation (که بهش بک‌پراپ هم میگن و تقریبا توی همه شبکه‌های عصبی برای یادگیری استفاده میشه)، می‌بینیم این روش اصلا خیلی بیولوژیکال یا مغز-طور نیست! یعنی مغز آدما واقعا به این شکل یاد نمی‌گیره و برای مغز خیلی نامعقوله.

ولی جاتون خالی یه سری مدل جدید اومدن به اسم Energy-Based Models (مدل‌های مبتنی بر انرژی) که برعکس بک‌پراپ، ایده‌شون اینه که سیستم طی یادگیری مقدار یه انرژی رو کم و کمتر کنه تا به جواب درست برسه. تو این مدل‌ها، یکی از ایده‌های اصلی به اسم Predictive Coding یا همون “رمزگذاری پیش‌بینی” هم هست. اگر بخوام ساده توضیح بدم، Predictive Coding یعنی هر لایه توی شبکه سعی می‌کنه پیش‌بینی کنه ورودی بعدی چی میشه، و اگه اشتباه کرد، همون مقدار خطا رو کم‌کم اصلاح می‌کنه. دقیقاً مثل خود مغز ما که مدام پیش‌بینی می‌کنه و با توجه به خطاهاش خودش رو به‌روز می‌کنه.

اما حالا مشکل اینجاست که وقتی شبکه‌ها خیلی عمیق میشن (تعداد لایه‌ها زیاد میشه)، همین مدل Predictive Coding یه سری دردسر جدی پیدا می‌کنه:

  • گاهی خطا یا اصطلاحاً گرادیان‌ها زیادی بزرگ میشه (بهش میگن Gradient Explosion یا انفجار گرادیان، یعنی اعداد گرادیان انقدر بزرگ میشن که شبکه از کار می‌افته!)
  • یا برعکس، خطاها خیلی ریز و کوچیک میشن (بهش میگن Gradient Vanishing یا ناپدید شدن گرادیان، یعنی شبکه اصلا درست یاد نمی‌گیره)

برای حل این مشکلات، یه راه‌حل باحال پیشنهاد دادن: از Bidirectional Energy استفاده کن! این یعنی انرژی شبکه فقط از یه طرف کم نشه، بلکه هم از ورودی به خروجی، هم از خروجی به ورودی انرژی رو تنظیم کنیم. این کار کمک میکنه خطاها متعادل باقی بمونن و همون Gradient Explosion کمتر رخ بده.

حالا واسه اون مشکل vanishing هم یه ترفند دیگه هست: Skip Connection (اتصالات پرشی). اینا مثل راه‌های میان‌بری‌ان که اجازه میدن اطلاعات راحت‌تر و مستقیم‌تر بین لایه‌های مختلف شبکه جا‌به‌جا بشن و دیگه اونقدر ضعیف و از بین رفته نشن.

یه نکته جذاب دیگه هم یاد گرفتن: نرخ یادگیری تطبیقی (Layer-Adaptive Learning Rate یا LALR). یعنی هر لایه خودش نرخ یادگیریش رو بسته به شرایط تنظیم کنه تا سریع‌تر و بهتر یاد بگیره.

حالا بزن بریم سر نتیجه‌ها! با این روش‌ها تونستن دقت‌های خیلی باحالی بگیرن:

  • روی دیتاست MNIST (همون دیتاست معروف ارقام دست‌نویس)، دقت ۹۹.۲۲٪ گرفتن!
  • روی CIFAR-10 (مجموعه تصاویر با ۱۰ کلاس مختلف)، دقت ۹۳.۷۸٪
  • روی CIFAR-100، دقت ۸۳.۹۶٪
  • و روی Tiny ImageNet هم دقت ۷۳.۳۵٪

این دقت‌ها تقریباً هم‌سطح بهترین شبکه‌هایی هست که با همون ساختار، ولی با بک‌پراپ آموزش داده شدن. یعنی روششون واقعاً جواب داده!

در آخر هم یه چارچوب (Framework) آماده کردن بر اساس Jax (Jax یه کتابخونه باحال و سریع برای یادگیری ماشین توی پایتونه) تا آموزش این مدل‌های مبتنی بر انرژی هم خیلی سریع‌تر انجام بشه. حتی زمان آموزش رو نصف کردن! یعنی آموزش با Jax نسبت به PyTorch (یه فریمورک معروف دیگه) دو برابر زودتر تموم میشه.

خلاصه اگه علاقه‌مند به هوش مصنوعی الهام‌گرفته از مغز هستی یا دنبال روش‌های پیشرفته و واقعاً نو برای یادگیری ماشین می‌گردی، این مدل‌های Energy-Based و ایده‌هاشون حسابی می‌تونن به کارت بیان!

منبع: +