فاز 2 · درس 1

یادگیری ماشین چیست؟ مفاهیم پایه، انواع و پیاده‌سازی از صفر

نوع
مفهومی
زمان
حدود 45 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 1 (مبانی ریاضیات)
نمایی از دو گروه از مهره‌های شطرنجی که بر اساس رنگ روی صفحه‌ای ماتیکی دسته‌بندی و به دور یک نشانگر مرکزی چیده شده‌اند
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. یادگیری از داده‌ها، نه از قوانین
  5. سه نوع اصلی یادگیری ماشین
  6. فراتر از این سه دسته
  7. دسته‌بندی در برابر رگرسیون
  8. جریان کاری یادگیری ماشین
  9. تفکیک داده‌ها به آموزش، اعتبارسنجی و آزمون
  10. بیش‌برازش در برابر کم‌برازش
  11. موازنه‌ی بایاس و واریانس
  12. قضیه‌ی «ناهار مجانی وجود ندارد»
  13. چه زمانی نباید از یادگیری ماشین استفاده کنیم؟
  14. پیاده‌سازی از صفر
  15. مرحله‌ی 1: دسته‌بند نزدیک‌ترین مرکزوار از صفر
  16. مرحله‌ی 2: آموزش روی داده‌های ساختگی
  17. مرحله‌ی 3: مقایسه با یک خط مبنا
  18. چرا این موضوع اهمیت دارد؟
  19. مرحله‌ی 4: نقاط ضعف دسته‌بند مرکزوار
  20. استفاده از ابزارهای واقعی
  21. خروجی این درس
  22. اصطلاحات کلیدی
  23. تمرین‌ها
  24. برای مطالعه‌ی بیشتر

در برنامه‌نویسی سنتی، حل هر مسئله به معنی نوشتن زنجیره‌ای بی‌پایان از دستورهای شرطی است. اگر قصد ساخت فیلتر اسپم یا سیستم تشخیص تقلب را داشته باشید، نوشتن و نگهداری دستیِ این قوانین به‌سرعت ناممکن می‌شود. یادگیری ماشین (Machine Learning) زاویه‌ی دید را تغییر می‌دهد: به‌جای کدنویسی تمام استثناها، داده‌ها را به الگوریتم می‌سپارید تا الگوها و قوانین تصمیم‌گیری را خودش استخراج کند.

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

تمرین‌های عملی این درس نیازی به سخت‌افزار خاص یا پردازش ابری ندارند و روی CPU معمولی سیستم شخصی با پایتون قابل اجرا هستند.

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

اهداف یادگیری

  • توضیح تفاوت بین یادگیری نظارت‌شده (supervised learning)، بدون نظارت (unsupervised learning) و یادگیری تقویتی (reinforcement learning)، و تشخیص این‌که کدام نوع برای یک مسئله‌ی خاص مناسب است
  • پیاده‌سازی یک دسته‌بند نزدیک‌ترین مرکزوار (nearest centroid classifier) از صفر و ارزیابی آن در برابر یک خط مبنای (baseline) تصادفی
  • تشخیص تفاوت بین وظایف دسته‌بندی (classification) و رگرسیون (regression) و انتخاب تابع زیان (loss function) مناسب برای هر کدام
  • ارزیابی این‌که آیا یک مسئله‌ی کسب‌وکاری برای یادگیری ماشین مناسب است یا بهتر است با قوانین قطعی (deterministic rules) حل شود

صورت مسئله

فرض کنید می‌خواهید یک فیلتر اسپم بسازید. رویکرد سنتی این است: می‌نشینید و صدها قانون می‌نویسید؛ «اگر ایمیل شامل عبارت "FREE MONEY" بود، آن را اسپم علامت بزن. اگر بیش از 3 علامت تعجب داشت، آن را اسپم علامت بزن.» هفته‌ها وقت صرف نوشتن قوانین می‌کنید. سپس ارسال‌کنندگان اسپم لحن و کلماتشان را تغییر می‌دهند. قوانین شما از کار می‌افتند. قوانین بیشتری می‌نویسید. این چرخه هرگز تمام نمی‌شود.

یادگیری ماشین این بازی را برعکس می‌کند. به‌جای نوشتن قوانین، هزاران ایمیل برچسب‌خورده («اسپم» یا «غیراسپم») به کامپیوتر می‌دهید و اجازه می‌دهید خودش قوانین را کشف کند. کامپیوتر الگوهایی را پیدا می‌کند که هرگز به ذهن شما خطور نمی‌کرد. وقتی ارسال‌کنندگان اسپم تاکتیک خود را تغییر می‌دهند، به‌جای بازنویسی کد، مدل را با داده‌های جدید دوباره آموزش می‌دهید.

این چرخش از «برنامه‌نویسیِ قوانین» به «یادگیری از داده‌ها»، هسته‌ی اصلی یادگیری ماشین است. همه‌ی موتورهای توصیه‌گر، دستیارهای صوتی، خودروهای خودران و مدل‌های زبانی به همین شکل کار می‌کنند.

مفاهیم پایه

یادگیری از داده‌ها، نه از قوانین

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

یادگیری ماشینبرنامه‌نویسی سنتیقوانینبرنامهدادهخروجیدادهالگوریتم یادگیریخروجی مورد انتظارمدل / قوانین

برنامه‌نویسی سنتی: شما قوانین را می‌نویسید. برنامه آن‌ها را روی داده‌ها اعمال می‌کند تا خروجی تولید شود.

یادگیری ماشین: شما داده‌ها و خروجی‌های مورد انتظار را ارائه می‌دهید. الگوریتم قوانین را کشف می‌کند.

«مدل»ی که از دلِ فرآیند آموزش بیرون می‌آید، در واقع همان قوانین است که به‌صورت عدد (وزن‌ها، پارامترها) کدگذاری شده‌اند. مدل الگوها را از مثال‌هایی که قبلاً دیده تعمیم می‌دهد تا روی داده‌هایی که تابه‌حال ندیده، پیش‌بینی انجام دهد.

سه نوع اصلی یادگیری ماشین

یادگیری ماشینیادگیری نظارت‌شدهیادگیری نظارت‌نشدهیادگیری تقویتیطبقه‌بندیرگرسیونخوشه‌بندیکاهش ابعادبهینه‌سازی خط‌مشییادگیری مقدار

یادگیری نظارت‌شده (Supervised Learning): شما جفت‌های ورودی-خروجی در اختیار دارید. مدل یاد می‌گیرد ورودی‌ها را به خروجی‌ها نگاشت کند.

  • «این 10,000 عکس با برچسب گربه یا سگ را بگیر و یاد بگیر چطور آن‌ها را از هم تشخیص دهی.»
  • «این مشخصات و قیمت‌های خانه‌ها را بگیر و یاد بگیر چطور قیمت را پیش‌بینی کنی.»

یادگیری بدون نظارت (Unsupervised Learning): فقط ورودی‌ها را دارید؛ بدون هیچ برچسبی. مدل خودش ساختار داده‌ها را پیدا می‌کند.

  • «این تاریخچه‌ی خرید 10,000 مشتری را تحلیل کن و دسته‌بندی‌های طبیعی بین آن‌ها پیدا کن.»
  • «این داده‌های 1,000 بُعدی را به 2 بُعد کاهش بده، طوری که ساختار داده‌ها حفظ شود.»

یادگیری تقویتی (Reinforcement Learning): یک ایجنت (agent) در یک محیط دست به عمل می‌زند و پاداش یا جریمه دریافت می‌کند. ایجنت یاد می‌گیرد یک استراتژی (خط‌مشی یا policy) اتخاذ کند تا مجموع پاداش را به حداکثر برساند.

  • «این بازی را انجام بده. برای برد +1 و برای باخت -1 می‌گیری. یک استراتژی برنده پیدا کن.»
  • «این بازوی روباتیک را کنترل کن. برای برداشتن جسم +1 و برای هر ثانیه‌ای که هدر می‌رود -0.01 جریمه می‌شوی.»

بیشتر چیزهایی که در عمل می‌سازید از یادگیری نظارت‌شده استفاده می‌کنند. یادگیری بدون نظارت برای پیش‌پردازش و اکتشاف داده‌ها رایج است. یادگیری تقویتی هم هوش مصنوعی بازی‌ها، روباتیک و RLHF را در مدل‌های زبانی هدایت می‌کند.

فراتر از این سه دسته

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

یادگیری نیمه‌نظارت‌شده (Semi-supervised learning) از حجم کمی داده‌ی برچسب‌دار و حجم زیادی داده‌ی بدون برچسب استفاده می‌کند. مثلاً ممکن است 100 تصویر پزشکی برچسب‌دار و 100,000 تصویر بدون برچسب داشته باشید. روش‌های رایج این حوزه عبارتند از:

  • انتشار برچسب (Label propagation): گرافی بسازید که نقاط داده‌ی مشابه را به هم وصل کند. سپس برچسب‌ها از گره‌های برچسب‌دار از طریق گراف به همسایه‌های بدون برچسب منتقل می‌شوند.
  • برچسب‌گذاری کاذب (Pseudo-labeling): مدلی را روی داده‌های برچسب‌دار آموزش دهید، از آن برای پیش‌بینی برچسب داده‌های بدون برچسب استفاده کنید، و بعد مدل را با کل داده‌ها مجدداً آموزش دهید. مدل مجموعه‌ی آموزشی خودش را گسترش می‌دهد (bootstrap می‌کند).
  • تنظیم پایایی (Consistency regularization): مدل باید برای یک ورودی مشخص و نسخه‌ای که اندکی تغییر یافته (آشفته شده)، پیش‌بینی یکسانی ارائه دهد. این رویکرد حتی بدون برچسب هم کار می‌کند.

یادگیری خودنظارت‌شده (Self-supervised learning) سیگنال نظارتی را مستقیماً از دلِ خود داده‌ها می‌سازد؛ یعنی اصلاً نیازی به برچسب‌گذاری انسانی نیست. مدل از ساختار درونی داده‌ها، یک مسئله‌ی پیش‌بینی برای خودش تعریف می‌کند.

  • مدل‌سازی زبانی ماسک‌شده (Masked language modeling در BERT): 15% از کلمات یک جمله را مخفی کنید و مدل را طوری آموزش دهید که کلمات جاافتاده را حدس بزند. «برچسب‌ها» از همان متن اصلی می‌آیند.
  • یادگیری مقابله‌ای (Contrastive learning در SimCLR): یک تصویر را بردارید و دو نسخه‌ی دست‌کاری‌شده (augmented) از آن بسازید. مدل را طوری آموزش دهید که بفهمد این دو از یک تصویر آمده‌اند، در عین حال آن‌ها را از نسخه‌های تغییریافته‌ی تصاویر دیگر متمایز کند.
  • پیش‌بینی توکن بعدی (Next-token prediction در GPT): کلمه‌ی بعدی را با توجه به تمام کلمات قبلی پیش‌بینی کنید. با این روش، هر سند متنی به یک نمونه‌ی آموزشی تبدیل می‌شود.

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

دسته‌بندی در برابر رگرسیون

این دو، وظایف اصلی در یادگیری نظارت‌شده هستند.

جنبه دسته‌بندی رگرسیون
خروجی دسته‌های گسسته اعداد پیوسته
مثال «آیا این ایمیل اسپم است؟» «قیمت این خانه چقدر خواهد بود؟»
فضای خروجی {گربه، سگ، پرنده} هر عدد حقیقی
تابع زیان آنتروپی متقاطع، دقت (accuracy) میانگین مربعات خطا (MSE)، میانگین قدر مطلق خطا (MAE)
تصمیم‌گیری مرزهای بین کلاس‌ها منحنی‌ای که بر داده‌ها منطبق می‌شود

دسته‌بندی به سوال «کدام دسته؟» پاسخ می‌دهد. رگرسیون به سوال «چه مقدار؟».

برخی مسائل را می‌توان به هر دو شکل صورت‌بندی کرد. پیش‌بینی این‌که قیمت یک سهم بالا می‌رود یا پایین، دسته‌بندی است؛ اما پیش‌بینی قیمت دقیق آن، رگرسیون محسوب می‌شود.

جریان کاری یادگیری ماشین

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

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

جمع‌آوری داده‌ها (Collect Data): گردآوری داده‌های خام. داده‌ی بیشتر تقریباً همیشه بهتر است، اما کیفیت از کمیت اهمیت بیشتری دارد.

پاک‌سازی و اکتشاف (Clean & Explore): مدیریت مقادیر گم‌شده، حذف موارد تکراری، مصورسازی توزیع‌ها و شناسایی ناهنجاری‌ها. این مرحله اغلب 60 تا 80 درصد از زمان کل پروژه را می‌گیرد.

مهندسی ویژگی (Feature Engineering): تبدیل داده‌های خام به ویژگی‌هایی که مدل بتواند از آن‌ها استفاده کند. تبدیل تاریخ به روزِ هفته، نرمال‌سازی ستون‌های عددی و کدگذاری متغیرهای دسته‌ای (categorical). ویژگی‌های خوب اهمیتی بسیار بیشتر از الگوریتم‌های پیچیده دارند.

تقسیم داده‌ها (Split Data): تفکیک داده‌ها به مجموعه‌های آموزش (train)، اعتبارسنجی (validation) و آزمون (test). مدل روی داده‌های آموزش یاد می‌گیرد، شما ابرپارامترها را روی داده‌های اعتبارسنجی تنظیم می‌کنید و عملکرد نهایی را روی داده‌های آزمون گزارش می‌دهید.

آموزش مدل (Train Model): خوراندن داده‌های آموزش به الگوریتم. الگوریتم پارامترهای داخلی‌اش را طوری تنظیم می‌کند که تابع زیان به حداقل برسد.

ارزیابی (Evaluate): سنجش عملکرد روی داده‌های اعتبارسنجی و آزمون. اگر عملکرد قابل قبول نبود، به مراحل قبل برگردید و ویژگی‌ها، الگوریتم‌ها یا ابرپارامترهای متفاوتی را امتحان کنید.

استقرار (Deploy): قرار دادن مدل در محیط عملیاتی (production) تا روی داده‌های جدید پیش‌بینی انجام دهد.

پایش (Monitor): رصد عملکرد مدل در طول زمان. توزیع داده‌ها در گذر زمان تغییر می‌کند (انحراف داده یا data drift) و کارایی مدل افت می‌کند. وقتی عملکرد کاهش یافت، مدل را بازآموزی کنید.

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

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

مجموعه داده کامل (100%)آموزش مدلتنظیم ابرپارامترهاارزیابی نهاییمجموعه آموزش (70%)مجموعه اعتبارسنجی (15%)مجموعه آزمون (15%)مدل
بخش هدف زمان استفاده اندازه‌ی معمول
آموزش (Training) مدل از این داده‌ها یاد می‌گیرد حین آموزش 60 تا 80%
اعتبارسنجی (Validation) تنظیم ابرپارامترها و مقایسه‌ی مدل‌ها بعد از هر بار اجرای آموزش 10 تا 20%
آزمون (Test) تخمین نهایی و بی‌طرفانه از عملکرد فقط یک‌بار، در پایان کار 10 تا 20%

مجموعه‌ی آزمون خط قرمز است؛ دقیقاً یک‌بار باید سراغ آن بروید. اگر مدام مدل خود را بر اساس عملکرد روی مجموعه‌ی آزمون دست‌کاری کنید، عملاً دارید مدل را روی داده‌های آزمون آموزش می‌دهید و اعدادی که گزارش می‌کنید بی‌معنی خواهند بود.

برای مجموعه‌داده‌های کوچک، از اعتبارسنجی متقاطع k-بخشی (k-fold cross-validation) استفاده کنید: داده‌ها را به kk بخش تقسیم کنید، روی k−1k-1 بخش آموزش دهید، روی بخش باقی‌مانده اعتبارسنجی کنید، جای بخش‌ها را تغییر دهید و در نهایت میانگین نتایج را بگیرید.

بیش‌برازش در برابر کم‌برازش

بیش‌برازشبرازش مناسبکم‌برازشافزایش پیچیدگیپیچیدگی بیش از حدمدل بسیار سادهسوگیری بالااز دست دادن الگوهاپیچیدگی مناسبمتعادلتعمیم‌پذیری خوبمدل بسیار پیچیدهواریانس بالاحفظ کردن نویز

کم‌برازش (Underfitting): مدل ساده‌تر از آن است که بتواند الگوهای موجود در داده‌ها را ثبت کند. مثل خط مستقیمی که می‌خواهد روی یک رابطه‌ی منحنی منطبق شود. در این حالت، هم خطای آموزش بالا است و هم خطای آزمون.

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

برازش مناسب (Good fit): مدل الگوهای واقعی را بدون حفظ کردن نویزها یاد می‌گیرد. خطای آموزش و خطای آزمون هر دو در سطحی منطقی و پایین قرار دارند.

نشانه‌های بیش‌برازش:

  • دقت آموزش بسیار بالاتر از دقت اعتبارسنجی است
  • مدل روی داده‌های آموزش عالی عمل می‌کند اما روی داده‌های جدید عملکرد ضعیفی دارد
  • افزودن داده‌های آموزشی بیشتر، عملکرد مدل را بهتر می‌کند (مدل در حال حفظ کردن بوده، نه یادگیری)

راه‌های رفع بیش‌برازش:

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

راه‌های رفع کم‌برازش:

  • استفاده از مدلی با پیچیدگی بیشتر
  • افزودن ویژگی‌های بیشتر
  • کاهش منظم‌سازی
  • آموزش در زمان طولانی‌تر

موازنه‌ی بایاس و واریانس

این چارچوب ریاضیِ پشت مفاهیم بیش‌برازش و کم‌برازش است.

بایاس (Bias): خطای ناشی از فرضیات نادرست در مدل. اگر رابطه‌ی واقعی غیرخطی باشد، یک مدل خطی بایاس بالایی دارد. بایاس بالا به کم‌برازش منجر می‌شود.

واریانس (Variance): خطای ناشی از حساسیت مدل به نوسانات کوچک در داده‌های آموزش. مدلی با واریانس بالا، در صورت آموزش روی زیرمجموعه‌های متفاوتی از داده‌ها، پیش‌بینی‌های کاملاً متفاوتی ارائه می‌دهد. واریانس بالا به بیش‌برازش ختم می‌شود.

پیچیدگی مدل بایاس واریانس نتیجه
خیلی کم (مدل خطی برای داده‌های منحنی) بالا پایین کم‌برازش
مناسب متوسط متوسط تعمیم‌پذیری خوب
خیلی زیاد (چندجمله‌ای درجه 20 برای 10 نقطه) پایین بالا بیش‌برازش

Total error=Bias2+Variance+Irreducible noise\text{Total error} = \text{Bias}^2 + \text{Variance} + \text{Irreducible noise}

نمی‌توانید نویز کاهش‌ناپذیر (irreducible noise) را کم کنید (چون تصادفی‌بودنِ ذاتیِ خودِ داده‌ها است). هدف این است که به نقطه‌ی بهینه‌ای برسید که در آن bias2+variance\text{bias}^2 + \text{variance} به حداقل برسد.

قضیه‌ی «ناهار مجانی وجود ندارد»

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

در عمل، انتخاب الگوریتم به عوامل زیر بستگی دارد:

  • حجم داده‌ای که در اختیار دارید
  • تعداد ویژگی‌ها
  • خطی یا غیرخطی بودن روابط
  • نیاز به تفسیرپذیری مدل
  • میزان توان محاسباتیِ در دسترس

چه زمانی نباید از یادگیری ماشین استفاده کنیم؟

یادگیری ماشین ابزار قدرتمندی است اما همیشه انتخاب درستی نیست. قبل از این‌که سراغ ساخت مدل بروید، از خودتان بپرسید آیا واقعاً به آن نیاز دارید؟

در این شرایط از یادگیری ماشین استفاده نکنید:

  • قوانین ساده و کاملاً مشخص هستند. مواردی مثل محاسبه‌ی مالیات، الگوریتم‌های مرتب‌سازی و تبدیل واحدها. اگر می‌توانید منطق کار را با چند دستور if بنویسید، استفاده از مدل فقط پیچیدگیِ بدون فایده ایجاد می‌کند.
  • هیچ داده‌ای ندارید یا حجم داده‌ها بسیار کم است. یادگیری ماشین برای یاد گرفتن نیاز به مثال دارد. با 10 نقطه‌ی داده نمی‌توانید چیز معناداری آموزش دهید؛ اول داده‌ها را جمع‌آوری کنید.
  • هزینه‌ی اشتباه فاجعه‌بار است و به درستیِ تضمین‌شده نیاز دارید. مثل محاسبه‌ی دوز دارو، کنترل راکتور هسته‌ای یا اعتبارسنجی رمزنگاری. مدل‌های یادگیری ماشین احتمالات را بررسی می‌کنند و گاهی اوقات اشتباه خواهند کرد. اگر «گاهی اشتباه کردن» غیرقابل قبول است، از روش‌های قطعی استفاده کنید.
  • یک جدول تطبیقی (lookup table) یا روش هیوریستیک مسئله را حل می‌کند. اگر یک آستانه‌ی ساده یا یک جدول به 99% از نیازها پاسخ می‌دهد، افزودن یادگیری ماشین فقط هزینه‌ی نگهداری را بالا می‌برد و بهبود چشم‌گیری ایجاد نمی‌کند.
  • نمی‌توانید تصمیم مدل را توضیح دهید، در حالی که شفافیت اجباری است. در حوزه‌های تحت نظارت قانونی (مثل وام‌دهی، بیمه و سیستم قضایی)، گاهی لازم است تک‌تک تصمیم‌ها کاملاً قابل توضیح باشند. برخی از مدل‌های یادگیری ماشین تفسیرپذیر هستند (مثل رگرسیون خطی یا درخت‌های تصمیم کوچک)، اما بیشتر آن‌ها جعبه‌سیاه به شمار می‌روند.
  • مسئله سریع‌تر از سرعت بازآموزی شما تغییر می‌کند. اگر قوانین هر روز تغییر کنند و بازآموزی مدل یک هفته طول بکشد، مدل شما همیشه از واقعیت عقب خواهد ماند.

از این نمودار درختی برای تصمیم‌گیری استفاده کنید:

خیربلهبله، و ساده هستندخیر، یا خیلی پیچیده‌اندخیر، درستی تضمین‌شده لازماستبلهبله، به طور دقیقخیر، یا تا حدیبلهمقداری برچسببدون برچسبآیا داده دارید؟ابتدا داده جمع‌آوری کنید یا از قوانیناستفاده کنیدآیا می‌توانید قوانین را صریحاً بنویسید؟از قوانین استفاده کنید. از یادگیری ماشینصرف‌نظر کنید.آیا هزینه خطا قابل قبول است؟از روش‌های قطعی استفاده کنیدآیا به توضیح‌پذیری نیاز دارید؟فقط از مدل‌های تفسیرپذیر استفاده کنیداز یادگیری ماشین استفاده کنیدآیا داده‌های برچسب‌دار کافی دارید؟یادگیری نظارت‌شدهیادگیری نیمه‌نظارت‌شدهنظارت‌نشده یا خودنظارت‌شده
یادگیری از داده‌هابدون نوشتن دستی قوانین
LEARNING FROM DATANobody wrote an if-statement here. The classifier summarizes each labelled cluster by its centroid, and the decision boundary falls out of the geometry: the perpendicular bisector between the two centroids. Feed it different data and a different boundary emerges. That inversion, rules derived from examples rather than typed by hand, is what makes it machine learning.مرکز کلاس Aمرکز کلاس Bمرز آموخته‌شده: نزدیک‌ترین مرکز برنده است
اینجا هیچ‌کس دستور if ننوشته است. طبقه‌بند هر خوشه‌ی برچسب‌دار را با مرکز (centroid) آن خلاصه می‌کند، و مرز تصمیم‌گیری از دل هندسه بیرون می‌آید: عمودمنصفِ بین دو مرکز. داده‌های متفاوتی به آن بدهید تا مرز متفاوتی شکل بگیرد. همین وارونگی — یعنی استخراج قوانین از نمونه‌ها به‌جای کدنویسی دستی آن‌ها — ماهیت یادگیری ماشین است.

پیاده‌سازی از صفر

کد موجود در code/ml_intro.py یک دسته‌بند نزدیک‌ترین مرکزوار را از صفر پیاده‌سازی می‌کند که ساده‌ترین الگوریتم یادگیری ماشین ممکن است. این کد ایده‌ی اصلی را نشان می‌دهد: از داده‌ها یاد بگیر، سپس روی داده‌های جدید پیش‌بینی کن.

مرحله‌ی 1: دسته‌بند نزدیک‌ترین مرکزوار از صفر

دسته‌بند نزدیک‌ترین مرکزوار، مرکز (میانگین) هر کلاس را در داده‌های آموزشی محاسبه می‌کند. برای پیش‌بینی، هر نقطه‌ی جدید را به کلاسی اختصاص می‌دهد که مرکزش به آن نزدیک‌تر است.

class NearestCentroid:
    def fit(self, X, y):
        self.classes = np.unique(y)
        self.centroids = np.array([
            X[y == c].mean(axis=0) for c in self.classes
        ])

    def predict(self, X):
        distances = np.array([
            np.sqrt(((X - c) ** 2).sum(axis=1))
            for c in self.centroids
        ])
        return self.classes[distances.argmin(axis=0)]

کل الگوریتم همین است. متد Fit دو میانگین را حساب می‌کند؛ متد Predict فاصله‌ها را می‌سنجد. خبری از گرادیان کاهشی (gradient descent)، تکرار (iteration) یا ابرپارامترها نیست.

مرحله‌ی 2: آموزش روی داده‌های ساختگی

یک مجموعه‌داده‌ی دسته‌بندی دوبُعدی با دو کلاس می‌سازیم که هم‌پوشانی کمی با هم دارند. دسته‌بند مرکزوار یک مرز تصمیم خطی بین مراکز کلاس‌ها ترسیم می‌کند.

rng = np.random.RandomState(42)
X_class0 = rng.randn(100, 2) + np.array([1.0, 1.0])
X_class1 = rng.randn(100, 2) + np.array([-1.0, -1.0])
X = np.vstack([X_class0, X_class1])
y = np.array([0] * 100 + [1] * 100)

مرحله‌ی 3: مقایسه با یک خط مبنا

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

baseline_preds = rng.choice([0, 1], size=len(y_test))
baseline_acc = np.mean(baseline_preds == y_test)

دسته‌بند مرکزوار باید روی این مجموعه‌داده‌ی تمیز، به دقتی حدود بالای 90% برسد؛ در حالی که خط مبنای تصادفی دقتی در حدود 50% به دست می‌آورد.

چرا این موضوع اهمیت دارد؟

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

  1. یادگیریِ یک نمایش (بازنمایی) از داده‌های آموزش (مراکز یا مرکزوارها)
  2. پیش‌بینی روی داده‌های جدید با استفاده از آن بازنمایی (نزدیک‌ترین فاصله)
  3. ارزیابی در مقایسه با یک خط مبنا (حدس تصادفی)

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

مرحله‌ی 4: نقاط ضعف دسته‌بند مرکزوار

دسته‌بند نزدیک‌ترین مرکزوار فرض می‌کند هر کلاس یک توده‌ی منفرد تشکیل می‌دهد. این مدل مرزهای تصمیم‌گیری خطی رسم می‌کند و در شرایط زیر با شکست روبه‌رو می‌شود:

  • کلاس‌ها شامل چندین خوشه باشند (مثلاً رقم «1» را می‌توان به چندین شکل مختلف نوشت)
  • مرز تصمیم‌گیری غیرخطی باشد (مثلاً یک کلاس دور کلاس دیگر پیچیده باشد)
  • ویژگی‌ها مقیاس‌های بسیار متفاوتی داشته باشند (فاصله تحت‌الشعاع ویژگی‌ای قرار می‌گیرد که بزرگ‌ترین مقیاس را دارد)

همین محدودیت‌ها انگیزه‌ی شکل‌گیری تمام الگوریتم‌های بعدی هستند که یاد خواهید گرفت. الگوریتم k-نزدیک‌ترین همسایه از پسِ چندخوشه‌ای بودن برمی‌آید. درخت‌های تصمیم مرزهای غیرخطی را مدیریت می‌کنند. مقیاس‌بندی ویژگی‌ها مشکل تفاوت مقیاس را برطرف می‌کند. هر درس بر پایه‌ی حل محدودیت‌های درس قبلی بنا شده است.

استفاده از ابزارهای واقعی

کتابخانه‌ی sklearn ابزار NearestCentroid و توابعی برای تولید داده‌های ساختگی ارائه می‌دهد:

from sklearn.neighbors import NearestCentroid
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(
    n_samples=500, n_features=2, n_redundant=0,
    n_clusters_per_class=1, random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

clf = NearestCentroid()
clf.fit(X_train, y_train)
print(f"Accuracy: {clf.score(X_test, y_test):.3f}")

خروجی این درس

این درس فایل outputs/prompt-ml-problem-framer.md را تولید می‌کند؛ پرامپتی که مسائل مبهم کسب‌وکاری را به وظایف مشخصِ یادگیری ماشین تبدیل می‌کند. شرح مسئله را به آن بدهید (مثلاً «می‌خواهیم نرخ ریزش مشتری را کاهش دهیم» یا «میزان تقاضای فصل بعد را پیش‌بینی کنیم»)؛ این پرامپت نوع یادگیری را مشخص می‌کند، هدف پیش‌بینی را تعریف می‌نماید، ویژگی‌های بالقوه را فهرست می‌کند، معیار موفقیت را انتخاب می‌کند، یک خط مبنا می‌سازد و خطراتی مثل نشت داده (Data Leakage) یا عدم تعادل کلاس‌ها را گوشزد می‌کند. در ابتدای هر پروژه‌ی یادگیری ماشین از این پرامپت استفاده کنید تا وقتتان را صرف ساخت چیزهای اشتباه نکنید.

اصطلاحات کلیدی

اصطلاح آنچه افراد می‌گویند معنای واقعی آن
مدل «هوش مصنوعی» یک تابع ریاضی با پارامترهای قابل یادگیری که ورودی‌ها را به خروجی‌ها نگاشت می‌کند
آموزش «یاد دادن به هوش مصنوعی» اجرای یک الگوریتم بهینه‌سازی برای تنظیم پارامترهای مدل، به‌طوری که پیش‌بینی‌ها با خروجی‌های واقعی هماهنگ شوند
ویژگی «یک ستون ورودی» یک ویژگیِ قابل اندازه‌گیری از داده که مدل برای پیش‌بینی از آن استفاده می‌کند
برچسب «جواب» خروجی مشخص برای یک نمونه‌ی آموزشی که برای محاسبه‌ی سیگنال خطا استفاده می‌شود
ابرپارامتر «تنظیماتی که دست‌کاری می‌کنید» پارامتری که قبل از شروع آموزش تعیین می‌شود و فرآیند یادگیری را کنترل می‌کند (مثل نرخ یادگیری، تعداد لایه‌ها)
تابع زیان (loss) «میزان اشتباه مدل» تابعی که فاصله‌ی بین خروجی‌های پیش‌بینی‌شده و واقعی را می‌سنجد و آموزش به دنبال کمینه‌کردن آن است
بیش‌برازش «آزمون را حفظ کرده» مدل به‌جای یادگیری الگوهای عمومی، نویزهای خاصِ داده‌های آموزشی را حفظ کرده و روی داده‌های جدید شکست می‌خورد
کم‌برازش «هیچ‌چیز یاد نگرفته» مدل بیش از حد ساده است و نمی‌تواند الگوهای واقعیِ موجود در داده‌ها را ثبت کند
تعمیم‌پذیری «روی داده‌های جدید کار می‌کند» توانایی مدل در ارائه‌ی پیش‌بینی‌های دقیق روی داده‌هایی که ندیده و آموزش روی آن‌ها انجام نشده است
اعتبارسنجی متقاطع «تست کردن روی بخش‌های مختلف» تقسیم مکرر داده‌ها به بخش‌های آموزش و آزمون و میانگین‌گیری از نتایج برای رسیدن به تخمینی مطمئن‌تر از عملکرد
منظم‌سازی «کوچک نگه داشتن وزن‌ها» افزودن یک جمله‌ی جریمه به تابع زیان که مانع از پیچیدگیِ بیش از حدِ مدل می‌شود
انحراف داده «دنیا تغییر کرد» تغییر توزیع آماری داده‌های ورودی در طول زمان که باعث افت عملکرد مدل می‌شود

تمرین‌ها

  1. یک مجموعه‌داده (مثلاً Iris یا Titanic) بردارید. آن را با نسبت 70/15/15 به بخش‌های آموزش، اعتبارسنجی و آزمون تقسیم کنید. توضیح دهید چرا نباید ابرپارامترها را روی مجموعه‌ی آزمون تنظیم کنید.
  2. سه مسئله‌ی دنیای واقعی را نام ببرید. برای هر کدام مشخص کنید که آیا مسئله از نوع دسته‌بندی، رگرسیون یا خوشه‌بندی است، و این‌که به یادگیری نظارت‌شده مربوط می‌شود یا بدون نظارت.
  3. مدلی روی داده‌های آموزش به دقت 99% و روی داده‌های آزمون به دقت 60% می‌رسد. علت این مشکل را تشخیص دهید و سه روشی را که برای حل آن امتحان می‌کنید، بنویسید.

برای مطالعه‌ی بیشتر

سؤالات متداول

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

در دسته‌بندی (Classification) هدف پیش‌بینی برچسب‌های گسسته است (مانند تشخیص اسپم)، اما در رگرسیون (Regression) مقدار خروجی یک عدد پیوسته است (مانند پیش‌بینی قیمت خانه).

چرا ارزیابی مدل روی داده‌های آزمون (Test Set) نباید تکرار شود؟

مجموعه آزمون باید بازتاب عملکرد مدل روی داده‌های دیده‌نشده باشد؛ تنظیم مداوم مدل بر اساس نتایج آزمون باعث بیش‌برازش روی این مجموعه و بی‌اعتبار شدن نتایج نهایی می‌شود.

چه زمان‌هایی نباید سراغ یادگیری ماشین برویم؟

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

ما رو توی گوگل بیشتر ببین

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