مشکل RNN: فراموشی و کندی
جواب کوتاه
شبکهی بازگشتی دو مشکل بزرگ داشت. اول فراموشی: موقع آموزش، سیگنال اشتباه باید از قدم آخر تا قدم اول برگرده و توی هر قدم در یه عدد ضرب میشه؛ اگه اون عدد کمتر از یک باشه، مثلا ۰٫۸، بعد از ۵۰ قدم تقریبا صفر میشه و شبکه ربطهای دور رو یاد نمیگیره، که بهش محو شدن گرادیان میگن؛ اگه بیشتر از یک باشه، مثلا ۱٫۲، منفجر میشه، که راهحلش بریدن گرادیان به یه سقفه. دوم کندی: هر قدم منتظر قدم قبلیه، پس کار یه جمله رو نمیشه موازی کرد. و یه مشکل کوچیکتر هم داره: کل گذشته باید توی یه یادداشت با اندازهی ثابت جا بشه.
یعنی چی
مثل بازی تلفنبازی: تا نفر پنجاهم، چیزی از جملهی اول نمیمونه.
توی درس شبکهی عصبی بازگشتی دیدیم یه یادداشت کوچیک قدمبهقدم دستبهدست میشه، و آخر درس دو تا مرز داشتیم. حالا اینها رو از نزدیک ببینیم. فرض کنید پنجاه نفر توی یه صف وایسادن و یه جمله رو در گوش نفر بعدی میگن. دو تا مشکل پیش میاد: تا آخر صف جمله عوض یا گم میشه، و کل کار هم طول میکشه چون هر نفر باید صبر کنه نفر قبلی حرفش تموم بشه.
برگشت در زمان
فراموشی بیشتر موقع آموزش خودش رو نشون میده. شبکه یه حدس میزنه و اشتباهش رو اندازه میگیره؛ بعد، مثل همون پسانتشار خطا، سیگنال اشتباه باید به عقب برگرده تا هر وزن بفهمه چقدر باید عوض بشه. توی شبکهی بازگشتی، «عقب» یعنی قدمهای قبلی زمان.
توی هر قدم برگشت، سیگنال در یه عدد ضرب میشه، و چون همهی قدمها یه جعبه با همون وزنهان، این عدد تقریبا هر بار یکیه. پس ضرب پشت ضرب داریم. اگه اون عدد کمتر از یک باشه، دایرهها هر قدم کوچیکتر میشن؛ اگه بیشتر از یک، هر قدم بزرگتر. ویکیپدیا همین «ضربهای تکراری» رو دلیل اصلی هر دو مشکل میدونه.
محو شدن
یه مثال ساختگی: هر قدم ضرب در ۰٫۸. بعد از ۱۰ قدم، سیگنال میشه حدود ۰٫۱۱ اندازهی اولش؛ بعد از ۲۰ قدم حدود ۰٫۰۱۲؛ و بعد از ۵۰ قدم حدود ۰٫۰۰۰۰۱، یعنی تقریبا هیچ. پس کلمهای که ۵۰ قدم قبل اومده، تقریبا هیچ سیگنالی برای یاد گرفتن نمیگیره. اسمش محو شدن گرادیانه و سال ۱۹۹۱ دلیلش پیدا شد. نتیجهش همون فراموشیه: شبکه ربط «بچهها» و «رفتن» رو، وقتی بینشون فاصله زیاده، یاد نمیگیره.
چرا کمتر از یک
چرا اون عدد ضرب معمولا کمتر از یکه؟ یه دلیلش توی همون تابعیه که عددها رو فشرده نگه میداره.
شبکهی بازگشتی معمولا بعد از هر قدم عدد رو از یه تابع فعالسازی فشردهکننده رد میکنه، که عددهای خیلی بزرگ و خیلی کوچیک رو بین منفی یک و یک نگه میداره. ویکیپدیا میگه شیب این تابع همیشه بین صفر و یکه؛ و درست همین شیبه که موقع برگشت در سیگنال ضرب میشه. وسط منحنی، نزدیک صفر، شیب یکه؛ ولی هر چی دورتر، شیب به صفر نزدیکتر، مثلا روی عدد ۲ حدود ۰٫۰۷. پس هر قدمی که عدد از وسط دور بیفته، سیگنال برگشت یه ضرب کوچیککننده میخوره، و پنجاه قدم از این ضربها، همون محو شدنه.
منفجر شدن و بریدن
حالا برعکس: هر قدم ضرب در ۱٫۲. بعد از ۱۰ قدم حدود ۶٫۲ برابر، بعد از ۲۰ قدم حدود ۳۸ برابر، و بعد از ۵۰ قدم حدود ۹۱۰۰ برابر. سیگنالی به این بزرگی وزنها رو یهو خیلی زیاد جابهجا میکنه و آموزش بههم میریزه. یه پژوهش ۲۰۱۳ این دو تا، محو و انفجار، رو دو مشکل شناختهشدهی آموزش این شبکهها خوند و برای انفجار یه راه ساده داد: بریدن. یعنی اگه اندازهی سیگنال از یه سقف بیشتر شد، کوچیکش کن تا همون سقف. جهتش عوض نمیشه، فقط اندازهش. برای محو هم یه راه پیشنهاد کرد، ولی راهحل بزرگتر برای محو، درس بعده.
کندی
مشکل دوم ربطی به آموزش نداره؛ ذات خود شبکهست. قدم دهم تا قدم نهم تموم نشه، نمیتونه شروع کنه، چون حافظهی قدم نهم رو لازم داره. پس یه جملهی ۵۰ کلمهای یعنی ۵۰ قدم پشت سر هم، حتی اگه هزار تا هستهی بیکار داشته باشید. مقالهی ۲۰۱۷ دقیقا همین رو گفت: این ذات ترتیبی، موازی کردن رو توی یه نمونه ناممکن میکنه، و توی دنبالههای بلند مهمتر هم میشه. ترنسفورمر همه رو با هم حساب میکنه.
شروع درست
یه راه سادهی دیگه هم برای کم کردن محو شدن پیدا شد، که حتی به LSTM هم نیاز نداشت.
یه پژوهش ۲۰۱۵ گفت بهجای اینکه وزنهای حافظه رو تصادفی شروع کنیم، با یه جدول خاص شروع کنیم که فقط روی قطرش یک داره و بقیهش صفره؛ یعنی «حافظه رو همونطور که هست رد کن». و بهجای تابع فشردهکننده، یه تابع سادهتر گذاشتن که عددهای مثبت رو دستنخورده رد میکنه. اینطوری اولش ضرب سیگنال تقریبا یکه: نه کوچیک میشه، نه منفجر. نتیجه روی چهار آزمون، از دو مسئلهی ساختگی با ربطهای خیلی دور تا یه کار بزرگ مدل زبانی و تشخیص گفتار، همپای LSTM بود. درسش اینه که گاهی یه شروع درست بهاندازهی یه معماری تازه کمک میکنه؛ هر چند بعدا ترنسفورمر کل این مسیر رو کنار گذاشت.
یه یادداشت کوچیک
یه مشکل سوم هم هست. هر چی جمله بلندتر بشه، یادداشت همون اندازه میمونه؛ یعنی کل گذشته باید توی یه بردار با اندازهی ثابت جا بشه. یه پژوهش ترجمهی ۲۰۱۴ دقیقا همین کار رو میکرد: کل جملهی ورودی رو توی یه بردار اندازهثابت خلاصه میکرد. مثل اینکه بخواید خلاصهی یه کتاب رو روی یه کاغذ یادداشت کوچیک بنویسید. درس گلوگاه همین رو کامل باز میکنه.
چند نکته
- ضرب پشت ضرب، ریشهی فراموشیه.
- کمتر از یک محو میکنه، بیشتر از یک منفجر.
- انفجار رو با بریدن به سقف کنترل میکنن.
- یکییکی بودن، یعنی کندی. هر چی هسته داشته باشید.
درس بعد راهحل معروف محو شدن رو نشون میده، یه حافظه با دریچه: LSTM و GRU.
جمعبندی. آنچه از این درس با خودتان میبرید.
- فراموشی: ضرب پشت ضرب.
- کمتر از یک: محو؛ بیشتر از یک: انفجار.
- انفجار رو با بریدن کنترل میکنن.
- کندی: هر قدم منتظر قبلی.
- کل گذشته توی یه یادداشت کوچیک.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.