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

درس ۳۲ از ۶۲، هوش مصنوعی، حدود ۱۰ دقیقه خواندن

پارامترهای ترنسفورمر را بشماریم

جواب کوتاه

پارامترها عددهای یادگرفته‌ی مدلن، و بیشترشون توی ماتریس‌ها نشستن. یه ماتریس با a ردیف و b ستون، a ضرب در b عدد داره. اگه اندازه‌ی بردار رو d بگیریم، توجه چهار ماتریس d در d داره (پرسش، کلید، مقدار و خروجی)، یعنی ۴ ضرب در d²، و پیش‌خور با لایه‌ی میانی چهار برابر، ۸ ضرب در d². پس هر بلوک تقریبا ۱۲ ضرب در d² پارامتر داره. بعد جدول کلمه‌ها هم هست: تعداد توکن‌ها ضرب در d. با همین حساب، مدل پایه‌ی ۲۰۱۷ حدود ۶۳ میلیون درمیاد (گزارش‌شده ۶۵ میلیون) و یه مدل ۲۰۲۰ با ۹۶ بلوک و بردار ۱۲۲۸۸ عددی حدود ۱۷۵ میلیارد.

یعنی چی

۱۷۵ میلیارد پارامتر؟ بیاید خودمون بشمریم؛ فقط ضرب لازم داره.

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

یه ماتریس

همه‌چی از اینجا شروع می‌شه. یه ماتریس یه جدول از عدده؛ اگه ۵۱۲ ردیف و ۵۱۲ ستون داشته باشه، ۵۱۲ ضرب در ۵۱۲ عدد داره، یعنی ۲۶۲ هزار و ۱۴۴ تا. هر کدوم از این خونه‌ها یه پارامتره. پس برای شمردن پارامترهای ترنسفورمر، فقط باید بدونیم چند تا ماتریس داره و هر کدوم چه اندازه‌ایه. یه سری عدد کوچیک دیگه هم هست، مثل بایاس‌ها و عددهای نرمال‌سازی، ولی اون‌قدر کمن که توی حساب سرانگشتی به چشم نمیان.

توجه

اندازه‌ی بردار رو d می‌گیریم؛ توی مدل پایه‌ی ۲۰۱۷، d می‌شه ۵۱۲. توی توجه چندسری چهار تا ماتریس d در d هست: یکی برای ساختن پرسش، یکی کلید، یکی مقدار، و یکی هم برای اون ضرب آخر که خروجی سرها رو ترکیب می‌کرد. یادتون باشه ماتریس‌های همه‌ی سرها روی هم همین چهار تا رو می‌سازن. پس توجه ۴ ضرب در d² پارامتر داره؛ برای ۵۱۲، حدود یه میلیون.

یه بلوک

حالا پیش‌خور. لایه‌ی اولش d رو به ۴d باز می‌کنه، یعنی d ضرب در ۴d عدد؛ لایه‌ی دومش دوباره همین‌قدر. روی هم ۸ ضرب در d². پس یه بلوک می‌شه ۴ تا از توجه و ۸ تا از پیش‌خور، روی هم ۱۲ ضرب در d². این فرمول سرانگشتی رو یه پژوهش ۲۰۲۰ هم استفاده کرده. برای d برابر ۵۱۲، می‌شه حدود ۳٫۱ میلیون پارامتر. بلوک رمزگشا یه توجه بیشتر داره، پس حدود ۴٫۲ میلیون.

جدول کلمه‌ها

یه تیکه‌ی بزرگ دیگه هم بیرون بلوک‌هاست: جدولی که هر توکن رو به بردار تبدیل می‌کنه، همون امبدینگ. اندازه‌ش می‌شه تعداد توکن‌ها ضرب در d. مقاله‌ی ۲۰۱۷ حدود ۳۷ هزار توکن داشت، پس ۳۷ هزار ضرب در ۵۱۲، حدود ۱۹ میلیون. اون مقاله این جدول رو بین ورودی‌ها و لایه‌ی آخر مشترک گذاشت، پس فقط یه بار حساب می‌شه.

کل مدل

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

هر توکن چقدر کار داره

تعداد پارامترها یه چیز دیگه رو هم می‌گه: مدل برای هر توکن چقدر حساب می‌کنه.

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

با پایتون

کل این حساب‌ها توی چند خط پایتون جا می‌شه. این بار جدول کلمه‌ها رو کنار می‌ذاریم و فقط بلوک‌ها رو می‌شمریم.

مقاله‌ی همون مدل ۱۷۵ میلیاردی نوشته روی ۳۰۰ میلیارد توکن آموزش دیده. با ۶ ضرب در پارامترها ضرب در توکن‌ها، کل کار آموزشش رو تخمین می‌زنیم:

def params(blocks, d):
    return 12 * blocks * d * d

n = params(96, 12288)
print(n)
# 173946175488

print(f"{2 * n:.3g}")
# 3.48e+11  per token, reading

print(f"{6 * n * 300e9:.3g}")
# 3.13e+23  the whole training

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

چند نکته

  • هر بلوک حدود ۱۲ × d². دو سومش پیش‌خور.
  • d دو برابر بشه، هر بلوک چهار برابر می‌شه.
  • جدول کلمه‌ها: توکن‌ها × d.
  • تعداد پارامتر به طول جمله بستگی نداره.

با این درس، ساختمون یه بلوک کامل شد. حالا وقتشه ببینیم این بلوک‌ها رو به چند شکل کنار هم می‌چینن. ایستگاه بعد با این درس شروع می‌شه: رمزگذار و رمزگشا: ترنسفورمر اصلی.

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

  • ماتریس a در b: a × b عدد.
  • توجه: ۴ × d².
  • پیش‌خور: ۸ × d².
  • هر بلوک: حدود ۱۲ × d².
  • به‌علاوه‌ی جدول کلمه‌ها.

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

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

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

۱۵ پرسش

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

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

درس بعد