چرا توجه با طول متن گران میشود
جواب کوتاه
توی توجه، هر کلمه با همهی کلمههای متن یه امتیاز میگیره؛ پس برای n کلمه، n ضرب در n امتیاز لازمه. یعنی اگه متن دو برابر بشه، امتیازها چهار برابر میشن؛ به این میگن هزینهی مربعی. برای هزار کلمه یه میلیون امتیاز، برای صد هزار کلمه ده میلیارد؛ اون هم برای هر سر و هر لایه. بقیهی حساب مدل، مثل پیشخور، فقط خطی با طول متن بالا میره؛ پس برای متنهای کوتاه سهم توجه کمه، ولی با بلند شدن متن از همه جلو میزنه. جدول امتیازها باید یه جایی نگه داشته بشه، پس حافظه هم مربعی بالا میره؛ برای همین مدلهای اول، مثلا یه مدل ۲۰۱۸، ورودی رو به ۵۱۲ تکه محدود میکردن. درسهای بعد این ایستگاه راههایی برای این مشکل نشون میدن.
یعنی چی
یه مهمونی که هر کس باید با همه دست بده.
ده نفر باشن، صد تا دست دادن. صد نفر باشن، ده هزار تا. توجه دقیقا همینه: توی درس امتیاز توجه دیدیم هر کلمه با همهی کلمهها، حتی خودش، یه امتیاز میگیره. این همون چیزیه که توجه رو اینقدر قوی میکنه؛ ولی هزینهش هم همینه. با این درس وارد ایستگاه هزینهها میشیم.
جدولها
جدول امتیاز یه جملهی چهارکلمهای، ۱۶ خونه داره. جملهی هشتکلمهای، ۶۴ خونه. شونزدهکلمهای، ۲۵۶. هر بار که طول دو برابر میشه، خونهها چهار برابر میشن. مقالهی ۲۰۱۷ هم توی جدول مقایسهش نوشته که هزینهی هر لایهی خودتوجهی با مربع طول متن بالا میره. برای جملههای کوتاه این اصلا مشکل نیست؛ ولی متنها همیشه کوتاه نیستن.
با عدد
حالا متنهای واقعیتر. یه متن هزارکلمهای، یه میلیون امتیاز. ده هزار کلمه، که اندازهی یه مقالهی بلنده، صد میلیون. صد هزار کلمه، که اندازهی یه کتابه، ده میلیارد. و اینها فقط برای یه سر و یه لایهست؛ مدلها دهها لایه و دهها سر دارن. یعنی طول متن ده برابر شده، ولی امتیازها صد برابر.
حافظه
فقط حساب نیست؛ جای نگهداری هم هست. اون جدول امتیاز، پیش از اینکه سافتمکس روش بیاد و در مقدارها ضرب بشه، باید یه جایی توی حافظهی کارت گرافیک نوشته بشه. پس حافظه هم مربعی بالا میره، و حافظهی کارت گرافیک محدوده. برای همین مدلهای اولیه سقف طول داشتن؛ مثلا یه مدل فقطرمزگذار ۲۰۱۸ ورودی رو به ۵۱۲ تکه محدود کرد. پژوهشهای ۲۰۲۰ و ۲۰۲۲ هم دقیقا همین مربعی بودن رو مشکل اصلی متن بلند دونستن.
جدول توی حافظه، با عدد
«حافظه مربعی بالا میره» یعنی چقدر؟ با یه حساب ساده میشه دید.
فرض کنید هر امتیاز با ۱۶ بیت، یعنی ۲ بایت، نوشته بشه. برای ۵۱۲ تکه، جدول ۵۱۲ در ۵۱۲ حدود ۲۶۲ هزار امتیاز داره، یعنی حدود نیم مگابایت. برای ۸۱۹۲ تکه، حدود ۶۷ میلیون امتیاز، یعنی ۱۳۴ مگابایت. برای ۱۰۰ هزار تکه، ده میلیارد امتیاز، یعنی ۲۰ گیگابایت؛ اون هم فقط برای یه سر توی یه لایه. توی تصویر ضلع مربعها به همون نسبت واقعیه؛ مربع ۵۱۲ تکه کنار مربع ۱۰۰ هزار تکه، یه نقطهست.
با پایتون
حالا تعداد سرها و لایهها رو هم حساب کنیم.
این تابع اندازهی همهی جدولهای امتیاز رو، اگه همه با هم نگه داشته بشن، به بایت میده. با ۸ سر و ۶ لایه، مثل رمزگذار مدل پایهی ۲۰۱۷:
def tables(n, heads=8, layers=6, nbytes=2):
return n * n * heads * layers * nbytes
for n in [512, 8192, 100000]:
print(n, tables(n) / 1e9, "GB")
# 512 0.025165824 GB
# 8192 6.442450944 GB
# 100000 960.0 GBبرای ۱۰۰ هزار تکه، ۹۶۰ گیگابایت؛ برای کارت گرافیک، حتی بزرگهاش، عدد خیلی بزرگیه. البته موقع آموزش همهی این جدولها لازم نیست همزمان نگه داشته بشن، و توجه سریع اصلا کل جدول رو نمینویسه؛ این حساب فقط نشون میده چرا روش ساده، برای متن بلند، جواب نمیده.
راهها
خبر خوب اینه که برای این مشکل کلی راه پیدا شده، و بقیهی این ایستگاه همینهاست. KV کش موقع نوشتن، حساب گذشته رو دوباره انجام نمیده. توجه سریع همون حساب دقیق رو تکهتکه انجام میده تا کل جدول توی حافظه نوشته نشه. توجه پراکنده اصلا به همه نگاه نمیکنه. و متن خیلی بلند ترفندهای دیگه رو کنار هم میذاره.
چند نکته
- هر کلمه با همه: n × n.
- ده برابر طول، صد برابر امتیاز.
- متن کوتاه: پیشخور گرونتره. متن بلند: توجه.
- حافظه هم مربعی؛ برای همین سقف طول.
اولین راه، از همه سادهتر و پرکاربردتر. درس بعد: KV کش: حساب نکردن دوبارهی گذشته.
جمعبندی. آنچه از این درس با خودتان میبرید.
- n کلمه، n × n امتیاز.
- طول دو برابر، هزینه چهار برابر.
- بقیهی مدل خطی؛ توجه مربعی.
- حافظه هم مربعی.
- راهها: درسهای بعد.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.