یادگیری آخر هفته

درس ۳

عددهایی به اسم پارامتر

از روی کرایه‌ی چند سفر قبلی، کرایه‌ی سفر بعدی را حدس می‌زنید؛ یادگیری ماشین هم همین کار را می‌کند.

شش سفر با یک تاکسی، مسافت هر سفر و کرایه‌اش به هزار تومان:

سفر هفتم ۷ کیلومتر است. پیش از خواندن ادامه، کرایه‌اش را حدس بزنید. این عددها را خودم ساخته‌ام و گرد کرده‌ام تا حسابشان با کاغذ راحت باشد؛ کرایه‌ی واقعی شهر شما فرق دارد.

کرایه با دو عدد حساب می‌شود

فرض کنید کرایه فقط به مسافت بستگی دارد و هر کیلومتر به یک اندازه به آن اضافه می‌کند. آن وقت دو عدد کافی است: کرایه‌ی پایه، که بابت خود سوار شدن می‌دهید، و نرخ هر کیلومتر. کرایه‌ی هر سفر از جمع کرایه‌ی پایه و حاصل‌ضرب نرخ در مسافت به دست می‌آید. به چنین فرمولی مدل (model) می‌گویند و به عددهای قابل تنظیمش پارامتر (parameter).

یادگیری یعنی پیدا کردن پارامترها از روی مثال‌ها

کسی کرایه‌ی پایه و نرخ این تاکسی را به شما نگفته است. فقط شش مثال دارید که جوابشان معلوم است. در یادگیری ماشین (machine learning)، پارامترها طوری انتخاب می‌شوند که خروجی فرمول تا جای ممکن به همین جواب‌ها نزدیک شود. به این کار آموزش (training) می‌گویند.

یک حدس را امتحان کنید: کرایه‌ی پایه ۲۰ و نرخ ۱۰. این فرمول برای سفر ۱۰ کیلومتری ۱۲۰ می‌دهد که ۹ هزار تومان از کرایه‌ی واقعی بیشتر است؛ برای سفر ۲ کیلومتری هم ۷ هزار تومان کمتر می‌دهد. حالا کرایه‌ی پایه ۳۰ و نرخ ۸ را امتحان کنید. این بار خطای هیچ سفری از ۲ هزار تومان بیشتر نیست. کرایه‌ی سفر هفتم هم ۸۶ می‌شود: ۳۰ به‌اضافه‌ی ۸ ضرب در ۷.

کامپیوتر همین کار را حساب‌شده‌تر انجام می‌دهد. خطای هر سفر را به توان دو می‌رساند، همه را جمع می‌کند و پارامترهایی را پیدا می‌کند که این جمع را به کمترین مقدار برسانند. برای این شش سفر، این جمع با حدس اول ۲۰۴ است و با ۳۰ و ۸ فقط ۱۲. هیچ جفت عدد دیگری جمع کمتری نمی‌دهد.

دو عدد را خودتان تنظیم کنید

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

۲۰
۱۰

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

جی‌پی‌تی ۳ همین کار را با ۱۷۵ میلیارد پارامتر می‌کند

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

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

تعداد پارامترهای مدل‌هایی که امروز پشت چت‌جی‌پی‌تی کار می‌کنند اعلام نشده است. اوپن‌ای‌آی در گزارش جی‌پی‌تی ۴ نوشت که اندازه‌ی مدل را نمی‌گوید.

چت‌بات هنگام گفت‌وگو با شما یاد نمی‌گیرد

خیلی‌ها فکر می‌کنند چت‌بات از هر گفت‌وگو چیز تازه‌ای یاد می‌گیرد. ولی پارامترها در آموزش تنظیم می‌شوند و بعد ثابت می‌مانند. وقتی کرایه‌ی سفر هفتم را با ۳۰ و ۸ حساب کردید، این دو عدد عوض نشدند. مدل هم وقتی جوابتان را می‌دهد، پارامترهایش را به کار می‌برد، ولی عوضشان نمی‌کند. آنچه در یک گفت‌وگو یادش می‌ماند، متنی است که در پنجره‌ی زمینه‌اش جا شده، همان پنجره‌ای که در درس قبل آمد.

اگر شرکتی گفت‌وگوها را برای آموزش نسخه‌ی بعدی به کار ببرد، آن آموزش جداگانه‌ای است که مدل تازه‌ای می‌سازد.

ده دقیقه با قلم و کاغذ

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

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

اگر پایتون (Python) روی کامپیوترتان هست، این برنامه‌ی کوتاه بدون اینترنت و بدون نصب چیز دیگری همان خط را پیدا می‌کند. به این روش کمترین مربعات (least squares) می‌گویند:

km = [2, 3, 5, 6, 8, 10]
fare = [47, 53, 69, 80, 92, 111]
n = len(km)
mk, mf = sum(km) / n, sum(fare) / n
rate = sum((k - mk) * (f - mf) for k, f in zip(km, fare)) / sum((k - mk) ** 2 for k in km)
base = mf - rate * mk
print(round(base, 2), round(rate, 2))
print(round(base + rate * 7, 2))

برنامه اول ۳۰ و ۸ و بعد ۸۶ را چاپ می‌کند. این برنامه فقط مسافت را می‌بیند، نه ترافیک را.

واژه‌نامه‌ی این درس

«یادگیری آخر هفته» خواهر فارسی خبرنامه‌ی انگلیسی‌ام Weekend Learning است که درباره‌ی ارزیابی مدل‌هاست و در هفته‌هایی می‌آید که این یکی نمی‌آید.

درس بعد: از هر هزار صفحه‌ای که کامن‌کرال (Common Crawl) در یکی از جمع‌آوری‌های اخیرش برداشته، حدود ۷ صفحه فارسی است. کامن‌کرال یکی از بزرگ‌ترین مجموعه‌های عمومی صفحه‌های وب است و بیشترِ متن آموزشی جی‌پی‌تی ۳ هم از آن آمده بود. درس بعد درباره‌ی این است که این کمبود با فارسی نوشتن مدل‌ها چه می‌کند.

این درس را اجرا کنید و با خود ببرید

دفترچه‌ی ژوپیتر (Jupyter notebook) این درس جز خود پایتون (Python) به چیز دیگری نیاز ندارد و بدون اینترنت اجرا می‌شود: خطای هر حدس را حساب می‌کند، دو عدد را یک بار با امتحان کردن و یک بار با کمترین مربعات پیدا می‌کند و کرایه‌ی سفر هفتم را پیش‌بینی می‌کند. فایل دفترچه را دانلود کنید یا آن را در گیت‌هاب ببینید.

کل درس، با همین صفحه و ابزارها و داده‌هایش، در یک فایل زیپ هم هست. فایل زیپ درس (حدود ۷۱ کیلوبایت) را دانلود و از حالت فشرده خارج کنید، بعد فایل index.html را در مرورگر باز کنید.

درس‌های تازه هر دو هفته یک بار، جمعه‌ها، در خبرنامه‌ی یادگیری آخر هفته در لینکدین می‌آیند.