یادگیری ماشین به زبان ساده: عملی‌ترین راهنمای دنیا!

هیچ کس نمی‌تواند آینده دنیای فناوری را با قاطعیت پیش‌بینی کند؛ اما شکی نیست که جبهه نوآوری در سال‌های آینده چهار فرمانده اصلی در خط مقدم خود خواهد داشت: رایانش ابری، اینترنت اشیا، علم داده و از همه مهم‌تر یادگیری ماشین!

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

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

بیایید از قدم اول شروع کنیم! اصلا تعریف یادگیری ماشین چیست؟

یادگیری ماشین چیست؟

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

بگذارید مثال بزنم. یکی از این الگوریتم‌های عمومی، الگوریتم طبقه بندی (Classification) است که داده‌ها را در گروه‌های مختلف قرار می‌دهد. با همین یک الگوریتم یکسان، هم می‌شود اعداد را در دست خط انسان تشخیص داد (طبقه بندی حروف و اعداد در دسته‌های جدا) و هم ایمیل‌ها را به دو دسته اسپم و غیر اسپم تقسیم کرد. حتی یک خط کد را هم لازم نیست تغییر بدهیم! الگوریتم یکسان است، اما مجموعه داده‌های آموزشی (Training Data Set) داده شده به آن متفاوت هستند و بنابراین منطق دسته‌بندی‌های نهایی در دو مورد هم با هم متفاوت خواهد بود.

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

انواع یادگیری ماشین

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

یادگیری نظارت شده

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

برای اینکه به کارآموزها کمک کنید و کمی هم از بار وظایف خودتان بکاهید، یک تصمیم هیجان‌انگیز می‌گیرید: می‌خواهید برنامه‌ای بنویسید که بر اساس اندازه، محله و دیگر مشخصات خانه‌های مشابهی که قبلاً فروخته شده‌اند، قیمت یک خانه جدید را تخمین بزند.

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

این همان «داده‌های آموزشی» یا Training Data ماست.
این همان «داده‌های آموزشی» یا Training Data ماست.

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

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

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

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

اوه اوه‌! مثل اینکه یک دانش آموز شیطون عملگرهای حسابی بین اعداد رو از پاسخنامه معلم پاک کرده!
اوه اوه‌! مثل اینکه یک دانش آموز شیطون عملگرهای حسابی بین اعداد رو از پاسخنامه معلم پاک کرده!

طبیعتاً برای حل چنین مسئله‌ای، باید یک عملی روی اعدادی که در سمت چپ هستند انجام بدهیم تا به عددی که در سمت راست است برسیم.

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

یادگیری نظارت نشده

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

یادگیری نظارت‌نشده مثل این است که رئیس‌تان یک ورق کاغذ با یک سری عدد رندوم رویش به شما بدهد و بگوید که «من هیچ ایده‌ای ندارم این عددا یعنی چی، ولی خدارو چه دیدی شاید تو تونستی یه طبقه‌بندی‌ای، الگویی چیزی پیدا کنی! موفق باشی!»

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

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


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

اینا که گفتی خیلی جالبه، اما میشه واقعاً به توانایی تخمین زدن قیمت خونه گفت «یادگیری»؟

در جوابتان باید باید بگویم که مغز انسان با هر وضعیتی که مواجه شود، می‌تواند بدون نیاز به گرفتن دستورالعمل صریح از یک نفر دیگر، نحوه مواجهه با آن شرایط را یاد بگیرد. مثلاً اگر مدت زیادی در کار فروش خانه باشید، دیگر شهودی می‌توانید بگویید که چه قیمتی برای یک خانه مناسب است، بهترین راه برای بازاریابی و فروش آن چیست، و چه نوع مشتری‌ای به آن علاقمند خواهد بود. هدف هوش مصنوعی قوی (Strong AI) هم این است که کامپیوتر هم بتواند چنین مهارتی را یاد بگیرد.

ولی الگوریتم‌های یادگیری ماشین هنوز این‌قدرها هم قوی نیستند و فقط زمانی درست کار می‌کنند که مسئله مورد نظر خیلی محدود و مشخص باشد. شاید در حالت فعلی، بهتر باشد به جای «یادگیری» بگوییم «پیدا کردن معادله‌ای برای حل یک مسئله خاص براساس تعدادی داده نمونه». اما خب، «پیدا کردن معادله‌ای برای حل یک مسئله خاص براساس تعدادی داده نمونه توسط ماشین» خیلی اسم جذابی نیست‌! برای همین همان «یادگیری ماشین» را به کار می‌بریم.

البته اگر دارید ۵۰ سال بعد از الان این مطلب را می‌خوانید و الگوریتم‌ هوش مصنوعی قوی دیگر کشف شده است، احتمالاً دارید فکر می‌کنید که این مقاله عجب چیز عتیقه و چرت و پرتی است‌! انسان آینده عزیز، اگر اینطور است لطفاً این مقاله را ول کنید و با خیال راحت بروید به روبات خدمتکارتان بگویید یک ساندویچ خوشمزه برایتان حاضر کند!

حالا بیاید برنامه‌ای که در موردش حرف زدیم را بنویسیم!

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

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

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0  
  
  # In my area, the average house costs $200 per sqft
  price_per_sqft = 200  
  
  if neighborhood == &quothipsterton&quot:
    # but some areas cost a bit more
    price_per_sqft = 400  
    
  elif neighborhood == &quotskid row&quot:
    # and some areas cost less
    price_per_sqft = 100  
    
 # start with a base price estimate based on how big the place is
  price = price_per_sqft * sqft  
  
  # now adjust our estimate based on the number of bedrooms
  if num_of_bedrooms == 0:
     # Studio apartments are cheap
     price = price — 20000
 else:
    # places with more bedrooms are usually
    # more valuable
    price = price + (num_of_bedrooms * 1000) 
    
 return price

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

بهتر نبود می‌گذاشتیم کامپیوتر خودش تابع مناسب را برای این کار پیدا کند؟ تا وقتی که تابع دارد جواب درست را به ما می‌دهد، اصلاً چه اهمیتی دارد که دقیقاً چطوری کار می‌کند؟

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
    price = <computer, plz do some math for me>  
    
    return price

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

این کار تابع اولیه‌مان (با همه آن if و elseهایش!) را به یک کد خیلی ساده تبدیل می‌کند:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
 price = 0 
 
 # a little pinch of this
 price += num_of_bedrooms * .841231951398213 
 
 # and a big pinch of that
 price += sqft * 1231.1231231 
 
 # maybe a handful of this
 price += neighborhood * 2.3242341421 
 
 # and finally, just a little extra salt for good measure
 price += 201.23432095 
 
 return price

به این ضریب‌ها توجه کنید. این عددهای جادویی، وزن‌‌های ما (Weights) هستند. اگر بتوانیم وزن ایده‌آلی را پیدا کنیم که برای همه خانه‌ها جواب بدهد، آنوقت تابع ما می‌تواند قیمت خانه‌ها را پیش‌بینی کند‌!

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

گام اول – همه وزن‌ها را برابر 1.0 قرار می‌دهیم.

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0  
  
  # a little pinch of this
  price += num_of_bedrooms * 1.0  
  
  # and a big pinch of that
  price += sqft * 1.0  
  
  # maybe a handful of this
  price += neighborhood * 1.0  
  
  # and finally, just a little extra salt for good measure
  price += 1.0  
  
  return price

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

با تابعتان قیمت همه خانه‌ها را تخمین بزنید.
با تابعتان قیمت همه خانه‌ها را تخمین بزنید.


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

حالا مجموع مربع خطاها به دست آمده را بر ۵۰۰ تقسیم می‌کنیم تا ببینیم بطور میانگین، با قیمت واقعی هر خانه چقدر اختلاف داریم. این مقدار میانگین خطاها، هزینه (Cost) تابع ماست.

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

گام سوم - حالا گام دوم را با تک تک ترکیب‌های ممکن برای وزن‌ها تکرار می‌کنیم. هروقت هزینه به کمترین حد ممکن خود رسید، مسئله حل شده است!

حالا وقت سورپرایزه!

فکر نمی‌کردید یادگیری ماشین انقدر راحت باشد، مگر نه؟ ما یک مقدار داده جمع کردیم، آنها را به خورد سه الگوریتم عمومی ساده دادیم، و توانستیم به تابعی برسیم که قیمت همه خانه‌های محله را محاسبه می‌کند. آژانس‌های املاک برید کنار، ما داریم میایم!

ولی این کل قضیه نیست! بیایید با چند حقیقت شگفت‌انگیز، پاک هوش از سرتان ببرم!

  • در چهل سال گذشته، تحقیقات در شاخه‌های مختلف (مثلاً زبان‌شناسی یا ترجمه) نشان داده‌اند که اگر یک گروه از افراد سعی کنند خودشان قوانین محاسبه تابع را پیدا کنند و یک کامپیوتر هم با الگوریتم‌های عمومی یادگیری این کار را بکند، نتیجه کار کامپیوتر همیشه بهتر است! این رویکرد «احمقانه»‌ای که گفتیم، کل پرستیژ یک عده آدم متخصص و ماهر را با خاک یکسان می‌کند!
  • تابعی که با هم نوشتیم واقعاً احمقانه بود! این تابع هیچ ایده‌ای ندارد که «مساحت» و «اتاق» اصلاً چه هستند! کل چیزی که می‌داند این است که برای رسیدن به جواب صحیح، باید این عددها را در اندازه‌های مختلف با هم قاطی کند.
  • من و شما هیچ ایده‌ای نداریم که چرا یک سری وزن‌ بخصوص جواب صحیح را به ما می‌دهد و بقیه وزن‌ها، نه. در واقع، تابعی ساخته‌ایم که می‌توانیم اثبات کنیم که درست کار می‌کند، اما هیچ ایده‌ای در مورد اینکه خود تابع چیست نداریم!
  • یک لحظه تصور کنید که به جای مساحت و تعداد اتاق‌ها، ورودی تابعمان یک آرایه‌ از اعداد بود. فرض کنید هرکدام از عددها، بیانگر میزان روشنایی (Brightness) تنها یک پیکسل از عکسی بود که دوربینی نصب شده بالای ماشینتان گرفته است. حالا تصور کنید که خروجی تابع به جای «قیمت»، «زاویه چرخش فرمان خودرو» باشد. دیدید چه شد؟ حالا شما یک تابع دارید که می‌تواند ماشینتان را خود به خود هدایت کند‌!

آدم باورش نمی‌شود! مگر نه؟

انقدرام راحت نیستا! اون قضیه امتحان کردن همه ترکیب‌های ممکن وزن‌هارو چی میگی؟

بله، درست می‌گویید. واضح است که نمی‌توانیم به امید پیدا کردن بهترین ترکیب، همه ترکیب‌های ممکن را یکی یکی امتحان کنیم. این کار تا ابد قرار است طول بکشد؛ چون اعداد هیچ‌وقت تمام نمی‌شوند.

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

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

 این همان تابع هزینه ماست.
این همان تابع هزینه ماست.


حالا بیایید همین معادله را با نمادهای ریاضی یادگیری ماشین بازنویسی کنیم (می‌توانید فعلا این نمادها را نادیده بگیرید!).

تتا (θ) نشانگر وزن‌های فعلی ماست. (J (θ یعنی هزینه وزن‌های فعلی.
تتا (θ) نشانگر وزن‌های فعلی ماست. (J (θ یعنی هزینه وزن‌های فعلی.


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

نمودار تابع هزینه‌‌مان شبیه کاسه است. محور عمودی هزینه را نشان می‌دهد.
نمودار تابع هزینه‌‌مان شبیه کاسه است. محور عمودی هزینه را نشان می‌دهد.


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

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

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

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

این خلاصه‌ای بود از یکی از روش‌های پیدا کردن بهترین مقادیر ممکن برای وزن‌ها. به این روش گرادیان کاهشی دسته‌ای (Batch Gradient Descent) می‌گویند.

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

همه چیزهایی که نگفتم

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

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

اما این روش فقط برای مسائل ساده جواب می‌دهد، نه الزاماً همه مسئله‌ها. می‌پرسید چرا؟ یکی از دلایلش این است که قیمت خانه‌ها همیشه مثل دانه‌های انار با نظم و ترتیب روی یک خط پیوسته نمی‌نشینند.

خوشبختانه راه‌‌‌حل‌های خیلی زیادی برای حل این مسئله داریم. الگوریتم‌های یادگیری ماشین فراوانی هستند که با آنها می‌شود روی داده‌های غیرخطی (مثلا شبکه‌های عصبی، یا SVM با تابع کرنلی) کار کرد. حتی راه‌هایی هم هست که بتوانیم با آنها خط‌های پیچیده‌تر را هم در رگرسیون خطی برازش (Fit) کنیم. در همه این روش‌ها، هدف نهایی همچنان همان پیدا کردن بهترین وزن‌های ممکن است.

یک مسئله دیگر که برایتان نگفتم، مشکل بیش‌برازش (Overfitting) است. خیلی راحت ممکن است شما یک سری وزن بدست بیاورید که قیمت خانه‌های موجود در دیتاست‌تان را کاملاً درست پیش‌بینی کنند، اما از پس تخمین برای خانه‌هایی که اطلاعاتشان در دیتاست نیست، برنیایند. البته این مسئله هم بی‌راه‌حل نیست؛ مثلا منظم‌سازی (Regularization) و اعتبارسنجی متقابل (Cross-Validation) از جمله راهکارهای بیش‌برازش هستند. یادگیری نحوه حل این مشکل، یکی از اصلی‌ترین مراحل برای استفاده موفق از یادگیری ماشین است.

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

طلسم یادگیری ماشین

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

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

فقط روابطی را می‌توانید مدلسازی کنید که واقعا وجود داشته باشند.
فقط روابطی را می‌توانید مدلسازی کنید که واقعا وجود داشته باشند.


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

چطور در مورد یادگیری ماشین بیشتر یاد بگیریم؟

به نظر من، بزرگترین مشکل در راه یادگیری ماشین این است که بیشتر پژوهش‌های علمی و تحقیقات تبلیغاتی از آن استفاده می‌کنند. برای همین منابع موجود در مورد آن هم بیشتر تخصصی است و برای کسانی که دوست دارند بدون کار تخصصی فقط کلیت قضیه را بفهمند، مطالب چندانی نوشته نشده است. اما خب، اوضاع هر روز دارد بهتر می‌شود. مثلاً اندرو نگ (Andrew Ng) یک دوره بی‌نظیر و رایگان در کورسرا دارد که هرکسی با مدرک مرتبط به کامپیوتر و یک ذره دانش ریاضی می‌تواند از آن استفاده ببرد. همچنین اگر فریم‌ورک SciKit-Learn برای پایتون را دانلود کنید، صدها الگوریتم یادگیری ماشین خواهید داشت که می‌توانید همه‌شان را یکی یکی آزمایش کنید.

این مطلب با همکاری مریم مقدس برهان و بر اساس متن زیر ترجمه شده است:

"Machine Learning is Fun!" by Adam Geitgey @ Medium


مطلب‌های دیگر کوئرامگ در زمینه یادگیری ماشین: