یادگیری دستهای (Batch Learning)
در یادگیری دستهای، سامانه نمیتواند بهصورت افزایشی یاد بگیرد و باید با تمام دادههای موجود آموزش داده شود. این کار معمولاً زمان و منابع محاسباتی زیادی میطلبد، بنابراین غالباً بهصورت برونخط انجام میشود. ابتدا سامانه آموزش میبیند، سپس وارد محیط عملیاتی میشود و دیگر در زمان اجرا چیزی یاد نمیگیرد؛ فقط آنچه را آموخته است بهکار میبندد. این وضعیت «یادگیری برونخط» نام دارد.
متأسفانه عملکرد یک مدل معمولاً بهمرور زمان آرامآرام افت میکند، صرفاً به این دلیل که جهان تغییر میکند اما مدل ثابت میماند. این پدیده را اغلب «فرسودگی مدل» یا «رانش داده (Data Drift)» مینامند. راهحل، آموزش دوبارهٔ منظم مدل با دادههای بهروز است. فاصلهٔ زمانی لازم میان آموزشهای دوباره به کاربرد بستگی دارد: اگر مدل تصاویر گربه و سگ را طبقهبندی کند، افت عملکرد احتمالاً بسیار کند است؛ اما اگر با سامانهای سریعالتغییر مانند پیشبینی بازار مالی سروکار داشته باشد، عملکرد ممکن است خیلی سریع افت کند.
اگر بخواهید یک سامانهٔ دستهای با دادهٔ جدید، مثلاً نوع تازهای از هرزنامه، آشنا شود، باید نسخهٔ جدید سامانه را از ابتدا با کل مجموعهداده آموزش دهید؛ نه فقط با دادههای جدید، بلکه با دادههای قدیمی و جدید با هم. سپس مدل قدیمی را با نسخهٔ تازه جایگزین میکنید. خوشبختانه کل فرایند آموزش، ارزیابی و استقرار یک سامانهٔ یادگیری ماشین را میتوان نسبتاً ساده خودکار کرد. بنابراین حتی سامانهٔ دستهای نیز میتواند با تغییر سازگار شود: داده را بهروزرسانی کنید و هر زمان لازم بود، نسخهٔ جدید سامانه را از ابتدا آموزش دهید.
این راهحل ساده است و اغلب خوب کار میکند، اما آموزش با کل داده ممکن است ساعتها زمان ببرد؛ در نتیجه معمولاً تنها هر ۲۴ ساعت یا حتی هفتهای یکبار سامانهٔ جدید آموزش میدهید. اگر سامانه باید با دادهای که بسیار سریع تغییر میکند سازگار شود، مانند پیشبینی قیمت سهام، به راهحلی واکنشپذیرتر نیاز دارید.
همچنین آموزش با کل مجموعهداده منابع محاسباتی زیادی میخواهد: پردازنده، حافظه، فضای دیسک، ورودی/خروجی دیسک، ورودی/خروجی شبکه و موارد دیگر. اگر دادهٔ فراوان داشته باشید و سامانه را طوری خودکار کنید که هر روز از صفر آموزش ببیند، هزینه میتواند بسیار زیاد شود. اگر حجم داده عظیم باشد، ممکن است استفاده از الگوریتم یادگیری دستهای اساساً ناممکن شود.
در نهایت، اگر سامانه باید خودمختار یاد بگیرد و منابع محدودی دارد، مانند برنامهٔ تلفن هوشمند یا مریخنورد، حمل حجم زیادی دادهٔ آموزشی و مصرف منابع فراوان برای ساعتها آموزش روزانه مانعی جدی است. در همهٔ این شرایط، گزینهٔ بهتر استفاده از الگوریتمهایی است که میتوانند بهصورت افزایشی یاد بگیرند.
یادگیری برخط (Online Learning)
در یادگیری برخط، سامانه بهصورت افزایشی آموزش میبیند؛ نمونههای داده بهترتیب و بهصورت منفرد یا در گروههای کوچک موسوم به «مینیدسته (Mini-Batch)» به آن داده میشوند. هر گام یادگیری سریع و کمهزینه است، بنابراین سامانه میتواند همزمان با رسیدن دادهٔ جدید، آن را یاد بگیرد.
شکل ۱-۱۴. در یادگیری برخط، مدل آموزش میبیند و در محیط عملیاتی قرار میگیرد، سپس با ورود دادهٔ تازه به یادگیری ادامه میدهد.
یادگیری برخط برای سامانههایی که باید بسیار سریع با تغییر سازگار شوند مفید است؛ برای نمونه کشف الگوهای جدید در بازار سهام. همچنین وقتی منابع محاسباتی محدود است، مثلاً مدل روی دستگاه همراه آموزش میبیند، گزینهٔ خوبی محسوب میشود.
الگوریتمهای یادگیری برخط همچنین میتوانند مدلها را روی مجموعهدادههای بسیار بزرگی آموزش دهند که در حافظهٔ اصلی یک رایانه جا نمیشوند؛ این روش «یادگیری خارج از حافظه (Out-of-Core Learning)» نام دارد. الگوریتم بخشی از داده را بارگذاری میکند، یک مرحلهٔ آموزش را روی آن انجام میدهد و این فرایند را تا پردازش همهٔ داده تکرار میکند.
شکل ۱-۱۵. استفاده از یادگیری برخط برای مدیریت مجموعهدادههای بسیار بزرگ
یکی از پارامترهای مهم سامانههای یادگیری برخط، سرعت سازگاری آنها با دادهٔ در حال تغییر است که «نرخ یادگیری (Learning Rate)» نام دارد. اگر نرخ یادگیری را زیاد تنظیم کنید، سامانه بهسرعت با دادهٔ جدید سازگار میشود، اما دادهٔ قدیمی را نیز سریع فراموش میکند؛ و نمیخواهید فیلتر هرزنامه فقط آخرین نوع هرزنامهای را که دیده تشخیص دهد. برعکس، نرخ یادگیری پایین به سامانه اینرسی بیشتری میدهد؛ آهستهتر یاد میگیرد، اما نسبت به نویز دادهٔ جدید یا دنبالههایی از نقاط غیرنماینده و پرت حساسیت کمتری خواهد داشت.
چالش بزرگ یادگیری برخط این است که اگر دادهٔ بد به سامانه داده شود، عملکرد آن ممکن است بهسرعت کاهش یابد؛ شدت این افت به کیفیت داده و نرخ یادگیری بستگی دارد. اگر سامانه زنده باشد، کاربران آن را حس خواهند کرد. دادهٔ بد میتواند از یک اشکال نرمافزاری یا حسگر خراب ربات بیاید، یا کسی عمداً سامانه را دستکاری کند، مثلاً موتور جستوجو را با هرزنامه پر کند تا رتبهٔ خود را بالا ببرد. برای کاهش این خطر باید سامانه را از نزدیک پایش کنید و در صورت مشاهدهٔ افت عملکرد، فوراً یادگیری را متوقف کنید و شاید به وضعیت قبلی سالم بازگردید. بهتر است دادهٔ ورودی نیز پایش شود و در برابر دادهٔ غیرعادی واکنش نشان دهید؛ برای نمونه با الگوریتم تشخیص ناهنجاری.
یادگیری نمونهمحور در برابر یادگیری مدلمحور
راه دیگری برای دستهبندی سامانههای یادگیری ماشین، شیوهٔ «تعمیم» آنهاست. بیشتر وظایف یادگیری ماشین دربارهٔ پیشبینیاند؛ یعنی سامانه پس از دیدن تعدادی نمونهٔ آموزشی باید بتواند برای نمونههایی که هرگز ندیده است نیز پیشبینی خوبی انجام دهد. عملکرد خوب روی دادهٔ آموزشی مفید است، اما کافی نیست؛ هدف واقعی عملکرد خوب روی نمونههای جدید است.
دو رویکرد اصلی برای تعمیم وجود دارد: یادگیری نمونهمحور و یادگیری مدلمحور.
یادگیری نمونهمحور (Instance-Based Learning)
شاید سادهترین شکل یادگیری، حفظکردن باشد. اگر فیلتر هرزنامهای را اینگونه بسازید، فقط رایانامههایی را هرزنامه علامت میزند که دقیقاً با پیامهایی یکسان باشند که کاربران قبلاً هرزنامه اعلام کردهاند؛ راهحل خیلی بدی نیست، اما قطعاً بهترین راه نیست.
بهجای تشخیص فقط پیامهای کاملاً یکسان، میتوان فیلتر را طوری برنامهریزی کرد که رایانامههای بسیار مشابه با هرزنامههای شناختهشده را نیز علامت بزند. برای این کار به معیاری از «شباهت» میان دو پیام نیاز دارید. یک معیار بسیار ابتدایی میتواند شمارش تعداد واژههای مشترک دو پیام باشد. سامانه رایانامهای را هرزنامه میداند اگر واژههای مشترک زیادی با یک پیام هرزنامهٔ شناختهشده داشته باشد.
این «یادگیری نمونهمحور» است: سامانه نمونهها را به خاطر میسپارد و سپس با استفاده از یک معیار شباهت، نمونهٔ جدید را با نمونههای آموختهشده یا بخشی از آنها مقایسه و تعمیم میدهد. در شکل زیر، نمونهٔ جدید بهعنوان مثلث طبقهبندی میشود، زیرا بیشتر نمونههای مشابه آن به کلاس مثلث تعلق دارند.
شکل ۱-۱۶. یادگیری نمونهمحور
یادگیری مدلمحور و یک جریان کاری معمول یادگیری ماشین
راه دیگر تعمیم از مجموعهای از مثالها این است که مدلی از آن مثالها بسازیم و سپس از مدل برای پیشبینی استفاده کنیم. این روش «یادگیری مدلمحور» نام دارد.
شکل ۱-۱۷. یادگیری مدلمحور
برای مثال فرض کنید میخواهید بدانید آیا پول مردم را خوشحال میکند یا نه. دادهٔ «شاخص زندگی بهتر» را از OECD و آمار سرانهٔ تولید ناخالص داخلی (GDP) را از World Bank دریافت میکنید، جدولها را با هم ترکیب و براساس GDP سرانه مرتب میکنید. بخشی از نتیجه چنین است:
جدول ۱-۱. آیا پول مردم را خوشحالتر میکند؟
| کشور | GDP سرانه، دلار آمریکا | رضایت از زندگی |
| ترکیه | 28,384 | 5.5 |
| مجارستان | 31,008 | 5.6 |
| فرانسه | 42,026 | 6.5 |
| ایالات متحده | 60,236 | 6.9 |
| نیوزیلند | 42,404 | 7.3 |
| استرالیا | 48,698 | 7.3 |
| دانمارک | 55,938 | 7.6 |
اگر دادهٔ این کشورها را رسم کنید، روندی دیده میشود. با اینکه داده نویزی و تا حدی تصادفی است، رضایت از زندگی با افزایش GDP سرانه تقریباً بهصورت خطی بیشتر میشود. بنابراین تصمیم میگیرید رضایت از زندگی را تابعی خطی از GDP سرانه مدل کنید. این مرحله «انتخاب مدل» نام دارد: یک مدل خطی با تنها یک ویژگی، GDP سرانه، انتخاب کردهاید.
شکل ۱-۱۸. آیا در این داده روندی میبینید؟
معادلهٔ ۱-۱. یک مدل خطی ساده
life_satisfaction = θ0 + θ1 × GDP_per_capita
این مدل دو پارامتر دارد: θ0 و θ1.۴ با تغییر این پارامترها میتوان هر تابع خطیای را نمایش داد.
شکل ۱-۱۹. چند مدل خطی ممکن
پیش از استفاده از مدل باید مقادیر پارامترهای θ0 و θ1 را تعیین کنید. چگونه میتوان فهمید کدام مقادیر بهترین عملکرد را میدهند؟ باید یک معیار عملکرد تعریف کنید. میتوانید تابع مطلوبیت یا تابع برازندگی تعریف کنید که میزان خوببودن مدل را اندازه بگیرد، یا تابع هزینهای که بدبودن آن را اندازهگیری کند. در مسائل رگرسیون خطی، معمولاً تابع هزینه فاصلهٔ میان پیشبینیهای مدل خطی و نمونههای آموزشی را میسنجد؛ هدف کمینهکردن این فاصله است.
اینجاست که الگوریتم رگرسیون خطی وارد عمل میشود: نمونههای آموزشی را به آن میدهید و الگوریتم پارامترهایی را پیدا میکند که مدل خطی را به بهترین شکل با داده برازش میدهند. این فرایند «آموزش مدل» نام دارد. در مثال کتاب، الگوریتم مقادیر بهینهٔ θ0 = 3.75 و θ1 = 6.78 × 10⁻5 را پیدا میکند.
شکل ۱-۲۰. مدل خطی که بهترین برازش را با دادهٔ آموزشی دارد
اکنون مدل برای پیشبینی آماده است. فرض کنید میخواهید میزان رضایت از زندگی در قبرس را بدانید و دادهٔ OECD پاسخ را ندارد. GDP سرانهٔ قبرس را پیدا میکنید: ۳۷٬۶۵۵ دلار. با قراردادن آن در مدل، رضایت از زندگی حدود 3.75 + 37,655 × 6.78 × 10⁻5 = 6.30 پیشبینی میشود.
مثال ۱-۱ کد Python را نشان میدهد که داده را بارگذاری میکند، ورودیهای X را از برچسبهای y جدا میکند، برای نمایش داده یک نمودار پراکندگی میسازد، سپس مدل خطی را آموزش میدهد و یک پیشبینی انجام میدهد.۵
مثال ۱-۱. آموزش و اجرای مدل خطی با Scikit-Learn
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
# Download and prepare the data
data_root = "https://github.com/ageron/data/raw/main/"
lifesat = pd.read_csv(data_root + "lifesat/lifesat.csv")
X = lifesat[["GDP per capita (USD)"]].values
y = lifesat[["Life satisfaction"]].values
# Visualize the data
lifesat.plot(kind='scatter', grid=True,
x="GDP per capita (USD)", y="Life satisfaction")
plt.axis([23_500, 62_500, 4, 9])
plt.show()
# Select a linear model
model = LinearRegression()
# Train the model
model.fit(X, y)
# Make a prediction for Cyprus
X_new = [[37_655.2]] # Cyprus' GDP per capita in 2020
print(model.predict(X_new)) # output: [[6.30165767]]
جایگزینکردن مدل رگرسیون خطی با رگرسیون k نزدیکترین همسایه در کد قبلی به همین سادگی است که این دو خط:
from sklearn.linear_model import LinearRegression
model = LinearRegression()
با این دو خط جایگزین شوند:
from sklearn.neighbors import KNeighborsRegressor
model = KNeighborsRegressor(n_neighbors=3)
اگر همهچیز درست پیش برود، مدل پیشبینیهای خوبی خواهد داشت. اگر نه، شاید لازم باشد ویژگیهای بیشتری مانند نرخ اشتغال، سلامت یا آلودگی هوا بهکار ببرید، دادهٔ آموزشی بیشتر یا باکیفیتتری تهیه کنید، یا مدل قدرتمندتری مانند رگرسیون چندجملهای انتخاب کنید.
در خلاصهٔ این جریان کاری:
- داده را مطالعه کردید.
- یک مدل انتخاب کردید.
- مدل را روی دادهٔ آموزشی آموزش دادید؛ یعنی الگوریتم یادگیری مقادیر پارامترهای مدل را جستوجو کرد که تابع هزینه را کمینه کنند.
- در نهایت مدل را برای پیشبینی نمونههای جدید بهکار بردید؛ این مرحله «استنتاج (Inference)» نام دارد، با این امید که مدل بهخوبی تعمیم دهد.
یک پروژهٔ معمول یادگیری ماشین تقریباً چنین شکلی دارد. در فصل ۲ این فرایند را از ابتدا تا انتها در یک پروژه تجربه خواهید کرد.
تا اینجا مسیر زیادی طی کردهایم: اکنون میدانید یادگیری ماشین واقعاً دربارهٔ چیست، چرا مفید است، چند دستهٔ رایج سامانههای آن کداماند و جریان کاری یک پروژهٔ معمول چگونه است. حال باید ببینیم چه چیزهایی ممکن است در فرایند یادگیری خراب شود و مانع پیشبینی دقیق گردد.