آموزشترنسفورمرها

درس ۴۲ از ۶۲، هوش مصنوعی، حدود ۹ دقیقه خواندن

گرم کردن نرخ یادگیری

جواب کوتاه

نرخ یادگیری یعنی اندازه‌ی هر قدمی که مدل موقع آموزش برمی‌داره. گرم کردن یعنی آموزش با یه نرخ خیلی کوچیک شروع بشه و کم‌کم بزرگ بشه. مقاله‌ی ۲۰۱۷ نرخ رو توی ۴۰۰۰ قدم اول به‌صورت خطی بالا برد، به حدود ۰٫۰۰۰۷ رسوند، و بعد آروم، به نسبت عکس ریشه‌ی شماره‌ی قدم، پایین آورد. دلیلش اینه که اول آموزش وزن‌ها تصادفی‌ان و تخمین‌های بهینه‌ساز از چند نمونه‌ی کم ساخته شدن؛ اگه همون اول قدم‌های بزرگ برداریم، آموزش ممکنه از هم بپاشه. یه پژوهش ۲۰۲۰ نشون داد این مشکل بیشتر مال ترنسفورمرهاییه که نرمال رو بعد از جمع دارن. امروز رایجه که بعد از گرم کردن، نرخ با یه منحنی نرم کسینوسی پایین بیاد.

یعنی چی

اول آروم راه برو، بعد بدو، آخر کار دوباره آروم.

کسی که تازه از خواب بیدار شده، اول تند نمی‌دوه؛ اول یه کم راه می‌ره تا بدنش گرم بشه. ترنسفورمر هم آموزش رو همین‌طوری شروع می‌کنه. با این درس، ایستگاه آموزش تموم می‌شه؛ ریزه‌کاری‌ای که شاید کوچیک به نظر بیاد، ولی توی درس نرمال‌سازی پیش یا پس دیدیم بی اون، ترنسفورمر اصلی درست آموزش نمی‌دید.

نرخ یادگیری

یادتون باشه آموزش یعنی پایین رفتن از دره‌ی خطا، قدم‌به‌قدم؛ همون گرادیان کاهشی. نرخ یادگیری اندازه‌ی هر قدمه. قدم‌های کوچیک آرومن ولی مطمئن. قدم‌های خیلی بزرگ سریع‌ترن، ولی ممکنه از کف دره رد بشن و بپرن اون طرف، و حتی آموزش رو کلا خراب کنن. پس نرخ یادگیری همیشه یه تعادله؛ و لازم نیست کل آموزش یه عدد ثابت باشه.

شکلش

مقاله‌ی ۲۰۱۷ برای نرخ یادگیری یه فرمول گذاشت که شکلش این‌طوریه. اول از نزدیک صفر شروع می‌شه و توی ۴۰۰۰ قدم اول، به‌صورت یه خط صاف، بالا می‌ره. این همون «گرم کردن»ه. روی قدم ۴۰۰۰ به اوجش می‌رسه. بعد آروم پایین میاد؛ نه یهو، بلکه به نسبت عکس ریشه‌ی شماره‌ی قدم. یعنی هر چی جلوتر می‌ریم، قدم‌ها کوچیک‌تر می‌شن، تا مدل آخر کار با دقت سر جای درست بشینه.

با عدد

با همون فرمول و بردار ۵۱۲ عددی مدل پایه، چند تا نقطه رو حساب کنیم. روی قدم ۱۰۰۰، وسط گرم کردن، نرخ می‌شه حدود ۰٫۰۰۰۱۷. روی قدم ۴۰۰۰، اوج، حدود ۰٫۰۰۰۷؛ یعنی چهار برابر. روی قدم ۱۶۰۰۰، نصف اوج، حدود ۰٫۰۰۰۳۵. و روی قدم ۱۰۰ هزارم، که آخر آموزش مدل پایه بود، حدود ۰٫۰۰۰۱۴. این عددها کوچیک به نظر میان، ولی هر قدم میلیون‌ها وزن رو با هم جابه‌جا می‌کنه.

چرا

دو دلیل. اول، اول کار وزن‌ها تصادفی‌ان و جهت‌هایی که شیب نشون می‌ده هنوز قابل اعتماد نیستن؛ یه قدم بزرگ توی جهت اشتباه، مدل رو جایی می‌بره که برگشتن ازش سخته. دوم، بهینه‌سازی که ترنسفورمرها استفاده می‌کنن، برای هر وزن یه تخمین از رفتار شیب‌ها نگه می‌داره. یه پژوهش ۲۰۱۹ نشون داد اول آموزش، این تخمین‌ها از چند نمونه‌ی کم ساخته شدن و خیلی بالا و پایین می‌رن؛ گرم کردن بهشون فرصت می‌ده جا بیفتن. یه پژوهش ۲۰۲۰ هم دید این مشکل بیشتر توی ترنسفورمرهایی هست که نرمال رو بعد از جمع دارن.

قدم بزرگ، با یه دره

این‌که «قدم بزرگ آموزش رو خراب می‌کنه» رو می‌شه با یه مثال خیلی کوچیک دید.

فرض کنید جریمه‌ی مدل فقط یه دره‌ی ساده باشه: x به توان ۲، که کمترینش روی صفره. شیب این دره ۲ ضرب در x هست، و هر قدم آموزش می‌گه x رو به اندازه‌ی نرخ ضرب در شیب کم کن. از x برابر ۴ شروع کنیم. با نرخ ۰٫۱، x می‌شه ۳٫۲، بعد ۲٫۵۶، بعد ۲٫۰۵؛ آروم ولی مطمئن به ته دره نزدیک می‌شه. با نرخ ۱٫۱، x می‌شه منفی ۴٫۸، بعد ۵٫۷۶، بعد منفی ۶٫۹۱؛ هر بار از اون‌ور دره بیرون می‌پره و دورتر می‌ره. این دره خیلی ساده‌ست و دره‌ی واقعی یه مدل میلیون‌ها بعد داره، ولی ایده همونه: قدم بزرگ‌تر از اندازه، به جای پایین رفتن، آدم رو بیرون پرت می‌کنه. اول آموزش هنوز نمی‌دونیم دره چه شکلیه، پس با قدم کوچیک شروع می‌کنیم.

امروز

ایده‌ی گرم کردن موند، ولی شکل پایین اومدن عوض شد. مثلا یه پژوهش ۲۰۲۰ که یه مدل زبانی خیلی بزرگ ساخت، اول نرخ رو خطی بالا برد و بعد با یه منحنی نرم، که از شکل کسینوس میاد، پایین آورد. با نرمال پیش از هر بخش، گرم کردن کمتر حیاتیه، ولی هنوز خیلی‌ها برای اطمینان یه گرم کردن کوتاه می‌ذارن.

با پایتون

فرمول نرخ مقاله‌ی ۲۰۱۷ هم توی یه خط جا می‌شه.

نرخ برابر یک تقسیم بر رادیکال اندازه‌ی بردار، ضرب در کوچیک‌ترین از دو عدد: یک تقسیم بر رادیکال شماره‌ی قدم، یا شماره‌ی قدم ضرب در ۴۰۰۰ به توان منفی ۱٫۵. تا قدم ۴۰۰۰ دومی کوچیک‌تره و نرخ خطی بالا می‌ره؛ بعد اولی کوچیک‌تر می‌شه و نرخ آروم پایین میاد:

def rate(step, d=512, warmup=4000):
    return d ** -0.5 * min(step ** -0.5,
                           step * warmup ** -1.5)

for s in [100, 1000, 4000, 10000, 100000]:
    print(s, round(rate(s), 6))
# 100 1.7e-05
# 1000 0.000175
# 4000 0.000699
# 10000 0.000442
# 100000 0.00014

همون عددهایی که بالاتر گفتیم درمیاد. اگه warmup رو کوچیک‌تر کنید، اوج بلندتر و زودتر میاد؛ اگه بزرگ‌ترش کنید، گرم کردن طولانی‌تر و اوج پایین‌تر می‌شه.

چند نکته

  • نرخ یادگیری لازم نیست ثابت باشه.
  • اول کوچیک، چون اول همه‌چی نامطمئنه.
  • آخر کوچیک، تا مدل دقیق بشینه.
  • نرمال پیش از بخش، نیاز به گرم کردن رو کم می‌کنه.

با این درس ایستگاه آموزش تموم شد. حالا بریم سراغ هزینه‌ها: چرا ترنسفورمر با متن بلند این‌قدر گرون می‌شه؟ ایستگاه بعد با این درس شروع می‌شه: چرا توجه با طول متن گرون می‌شه.

جمع‌بندی. آنچه از این درس با خودتان می‌برید.

  • نرخ یادگیری: اندازه‌ی هر قدم.
  • اول کم، کم‌کم زیاد، بعد کم.
  • ۲۰۱۷: ۴۰۰۰ قدم گرم کردن.
  • دلیل: اول کار همه‌چی نامطمئنه.
  • امروز: گرم کردن، بعد کاهش نرم.

خودتون رو بسنجید

۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو می‌بینید: چند تا درست، چند تا نادرست.

خودتون رو بسنجید

۱۵ پرسش

  • هر بار پرسش‌ها و ترتیب گزینه‌ها عوض می‌شه.
  • تا آخر نمی‌گیم کدوم جواب درست بوده؛ می‌تونید برگردید و جوابتون رو عوض کنید.
  • آخرش کارنامه می‌گیرید: چند تا درست، چند تا نادرست.
  • اگه وسطش بستید، دوباره که باز کنید از همون‌جا ادامه می‌دید.

فصل‌های این درس