یک الگوریتم یادگیری ماشینی راه اندازی کنید و اولین تابع پیش بینی خود را با استفاده از جاوا توسعه دهید. ماشینهای خودران، سیستمهای تشخیص چهره و دستیارهای صوتی همگی با استفاده از فناوریها و چارچوبهای یادگیری ماشین توسعه داده شدهاند. و این تنها موج اول است. طی 10 سال آینده، نسل جدیدی از محصولات دنیای ما را متحول خواهند کرد و رویکردهای جدیدی را برای توسعه برنامهها، محصولات و برنامههای کاربردی ایجاد خواهند کرد.
به عنوان یک برنامه نویس جاوا، اکنون که شرکت های فناوری شروع به سرمایه گذاری هنگفت در یادگیری ماشین کرده اند، می خواهید این موج را به دست آورید. آنچه امروز یاد می گیرید می توانید برای پنج سال آینده استفاده کنید. اما از کجا شروع کنیم؟ هدف این مقاله پاسخ به این سوال است. با پیروی از راهنمای کوتاه ما برای پیاده سازی و تهیه الگوریتم یادگیری ماشین، اولین تصور را از اصول یادگیری ماشین خواهید داشت. پس از آشنایی با ساختار یک الگوریتم یادگیری و ویژگیهایی که میتوانید برای آموزش، ارزیابی آن و انتخاب تابعی که بهترین دقت پیشبینی را ارائه میکند، استفاده کنید، درک درستی از نحوه استفاده از چارچوب JVM (Weka) به دست خواهید آورد. راه حل های یادگیری ماشین بسازید این مقاله بر روی یادگیری ماشینی نظارت شده تمرکز دارد زیرا این اصلی ترین اصل است که در توسعه برنامه های هوشمند استفاده می شود.
یادگیری ماشینی و هوش مصنوعی
یادگیری ماشینی از حوزه هوش مصنوعی تکامل یافته است که هدف آن ایجاد ماشین هایی است که می توانند هوش انسانی را تقلید کنند. اگرچه اصطلاح «یادگیری ماشینی» در علم کامپیوتر سرچشمه گرفته است، اما هوش مصنوعی رشته جدیدی از علم نیست.
تست تورینگ که توسط ریاضیدان آلن تورینگ در اوایل پنجاه قرن بیستم ایجاد شد، یکی از اولین تست هایی است که برای تعیین اینکه آیا یک ماشین محاسباتی دارای هوش واقعی است یا خیر طراحی شده است. بر اساس تست تورینگ، یک کامپیوتر وجود هوش انسان را با جعل هویت شخصی بدون اینکه او متوجه شود که با دستگاه صحبت می کند، اثبات می کند.
امروزه بسیاری از رویکردهای رایج یادگیری ماشینی مبتنی بر ایده هایی هستند که ده ها سال قدمت دارند. اما دهه گذشته در محاسبات (و پلتفرم های محاسباتی توزیع شده) قدرت کافی برای اعمال الگوریتم های یادگیری ماشین به ارمغان آورده است. بسیاری از آنها به مقدار زیادی از ضرب ماتریس و سایر محاسبات ریاضی نیاز دارند. بیست سال پیش، فناوریهای محاسباتی که امکان انجام چنین محاسباتی را فراهم میکرد، به سادگی وجود نداشتند، اما اکنون به واقعیت تبدیل شدهاند. الگوریتمهای یادگیری ماشین به برنامهها اجازه میدهند تا فرآیند بهبود کیفیت را انجام دهند و قابلیتهای خود را بدون دخالت انسان گسترش دهند. برنامه ای که با استفاده از یادگیری ماشینی توسعه یافته است قادر است به طور مستقل کد خود را به روز کند یا گسترش دهد.
یادگیری تحت نظارت در مقابل یادگیری بدون نظارت
یادگیری تحت نظارت و بدون نظارت دو روش محبوب برای یادگیری ماشین هستند. هر دو گزینه برای ایجاد روابط و یادگیری به ماشین نیاز دارند تا حجم عظیمی از رکوردهای داده را تغذیه کنند. چنین داده های جمع آوری شده معمولاً
"بردار ویژگی" نامیده می شود . به عنوان مثال، ما یک ساختمان مسکونی خاص داریم. در این حالت، بردار ویژگی ممکن است دارای ویژگی هایی مانند: مساحت کل خانه، تعداد اتاق ها، سال ساخت خانه و غیره باشد.
در یادگیری نظارت شده ، یک الگوریتم یادگیری ماشین برای پاسخ به سوالات مربوط به بردارهای ویژگی آموزش داده می شود. برای آموزش الگوریتم، مجموعه ای از بردارهای ویژگی و برچسب های مرتبط به آن داده می شود. برچسب مرتبط توسط یک شخص (معلم) ارائه می شود و حاوی "پاسخ" صحیح به سؤال پرسیده شده است. الگوریتم یادگیری بردارهای ویژگی و برچسب های صحیح را برای یافتن ساختار داخلی و روابط بین آنها تجزیه و تحلیل می کند. به این ترتیب دستگاه یاد می گیرد که به سوالات پاسخ صحیح دهد. به عنوان مثال، میتوانیم یک برنامه هوشمند خاص را برای تجارت املاک در نظر بگیریم. می توان آن را با استفاده از بردار ویژگی شامل اندازه، تعداد اتاق ها و سال ساخته شده برای مجموعه ای از خانه ها آموزش داد. فرد باید بر اساس این عوامل به هر خانه برچسبی با قیمت صحیح خانه اختصاص دهد. با تجزیه و تحلیل این داده ها، یک اپلیکیشن هوشمند باید خود را آموزش دهد تا به این سوال پاسخ دهد که "چقدر می توانم برای این خانه پول بگیرم؟"
پس از تکمیل فرآیند آماده سازی، داده های ورودی جدید دیگر علامت گذاری نمی شوند. ماشین باید بتواند به سؤالات به درستی پاسخ دهد، حتی برای بردارهای مشخصه ناشناخته و بدون برچسب. در یادگیری بدون نظارت، الگوریتم برای پیشبینی پاسخها بدون برچسبگذاری انسانی (یا حتی بدون پرسیدن سؤال) طراحی شده است. به جای تعیین یک برچسب یا نتیجه، الگوریتم های یادگیری بدون نظارت از مجموعه داده های بزرگ و قدرت محاسباتی برای کشف روابط ناشناخته قبلی استفاده می کنند. به عنوان مثال، در بازاریابی محصول مصرفی، یادگیری بدون نظارت می تواند برای شناسایی روابط پنهان یا گروه بندی مشتریان استفاده شود که در نهایت می تواند به بهبود برنامه بازاریابی یا ایجاد برنامه جدید کمک کند. در این مقاله، ما بر یادگیری ماشین نظارت شده تمرکز خواهیم کرد. در حال حاضر این متداول ترین روش مورد استفاده است.
یادگیری ماشینی تحت نظارت
تمام یادگیری ماشین بر اساس داده ها است. برای یک پروژه یادگیری ماشینی تحت نظارت، باید داده ها را با نشانگرها به گونه ای علامت گذاری کنید که پاسخ های معناداری به سؤال مطرح شده ارائه دهد. در زیر، در جدول 1، هر رکورد اطلاعات خانه برچسب "قیمت خانه" است. با شناسایی رابطه بین دادههای رکورد و قیمت یک خانه، الگوریتم در نهایت باید بتواند قیمت بازار خانههایی را که در لیست داده شده قرار ندارند پیشبینی کند. (لطفا توجه داشته باشید مساحت خانه بر حسب متر مربع و قیمت خانه به یورو می باشد).
جدول 1. فهرست خانه ها
|
امضا کردن |
امضا کردن |
امضا کردن |
برچسب |
منطقه خانه |
تعداد اتاق ها |
سن خانه |
قیمت مسکن مورد انتظار |
90 متر مربع / 295 فوت |
2 اتاق |
23 ساله |
249000 یورو |
101 متر مربع / 331 فوت |
3 اتاق |
n/a |
338000 یورو |
1330 متر مربع / 4363 فوت |
11 اتاق |
12 سال |
6,500,000 € |
در مراحل اولیه، احتمالاً داده ها را به صورت دستی برچسب گذاری می کنید، اما در نهایت به برنامه خود یاد می دهید که این کار را به تنهایی انجام دهد. احتمالاً قبلاً دیده اید که این روش با کلاینت های ایمیل کار می کند، جایی که برای انتقال ایمیل به پوشه Spam، به سؤال "آیا این ایمیل اسپم است؟" وقتی پاسخ می دهید، برنامه را آموزش می دهید تا ایمیل هایی را که نمی خواهید ببینید، تشخیص دهد. فیلتر هرزنامه برنامه برای علامتگذاری پیامهایی از یک منبع یا حاوی محتوای یکسان و مدیریت آنها بر اساس قوانین مناسب آموزش داده شده است. مجموعه داده های برچسب دار فقط برای اهداف آماده سازی و آزمایشی مورد نیاز است. پس از اتمام این مرحله، الگوریتم یادگیری ماشین روی داده های بدون برچسب کار می کند. برای مثال، میتوانید یک الگوریتم پیشبینی رکورد جدید و بدون برچسب دادههای مربوط به یک خانه را به یک الگوریتم پیشبینی کنید، و باید بهطور خودکار قیمت مورد انتظار خانه را بر اساس «دانش» بهدستآمده از دادههای آمادهسازی پیشبینی کند.
چگونه یک ماشین پیش بینی را یاد می گیرد
چالش یادگیری ماشینی تحت نظارت، یافتن تابع پیشبینی مناسب برای یک سوال معین است. از نظر ریاضی، مشکل یافتن تابعی است که یک متغیر را به عنوان ورودی دریافت کند
х
و مقدار پیش بینی شده را برگرداند
у
. این تابع فرضیه ها
(hθ)
نتیجه یک فرآیند آماده سازی است. اغلب تابع فرضیه را تابع هدف یا تابع پیش بینی نیز می نامند.
y = h θ (x)
در بیشتر موارد،
х
آرایه داده است. در مثال ما، این یک آرایه دو بعدی از عناصر است که یک خانه را تعریف می کند، متشکل از تعداد اتاق ها و مساحت خانه. آرایه ای از چنین مقادیری یک بردار ویژگی است. با تعیین یک تابع هدف خاص، می توانیم از آن برای پیش بینی هر بردار ویژگی استفاده کنیم
х
. برای پیش بینی قیمت یک خانه، باید تابع هدف را با استفاده از بردار ویژگی
{101.0, 3.0}
متشکل از مساحت خانه و تعداد اتاق ها فراخوانی کنید:
Function<Double[], Double> h = ...;
Double[] x = new Double[] { 101.0, 3.0 };
double y = h.apply(x);
در کد منبع از مثال-1، مقادیر موجود در آرایه،
х
بردار ویژگی های خانه را نشان می دهد. مقدار
у
برگردانده شده توسط تابع هدف، قیمت پیش بینی شده خانه است. هدف یادگیری ماشینی تعیین تابع هدف است که با توجه به پارامترهای ورودی ناشناخته، تا حد امکان دقیق عمل کند. در یادگیری ماشین، تابع هدف
(hθ)
گاهی مدل نامیده می شود. این مدل نتیجه یک فرآیند یادگیری است.
بر اساس نمونههای آموزشی برچسبگذاری شده، الگوریتم یادگیری به دنبال ساختارها یا الگوها در دادههای آموزشی است. بنابراین او مدلی می سازد که به طور کلی برای داده ها خوب است. به عنوان یک قاعده، فرآیند یادگیری ماهیت اکتشافی دارد. در بیشتر موارد، این فرآیند بارها با استفاده از انواع مختلف الگوریتمها و پیکربندیهای یادگیری تکرار میشود. در نتیجه همه مدلها بر اساس معیارهای عملکرد ارزیابی میشوند که از بین آنها بهترین مدل انتخاب میشود. و این مدل برای محاسبه مقادیر تخمینی برای داده های بدون برچسب آتی استفاده می شود.
رگرسیون خطی
برای آموزش «فکر کردن» به ماشین، ابتدا باید الگوریتم یادگیری مورد استفاده خود را انتخاب کنید. به عنوان مثال، رگرسیون خطی. این یکی از ساده ترین و محبوب ترین الگوریتم های یادگیری ماشینی تحت نظارت است. الگوریتم فرض می کند که رابطه بین ویژگی های ورودی و نشانگرهای نتیجه خطی است. تابع رگرسیون خطی کلی زیر مقدار پیش بینی شده را با جمع تمام عناصر بردار ویژگی ضرب در پارامتر
θ
(تتا) برمی گرداند . این پارامتر در طول فرآیند آموزش برای تطبیق یا "تنظیم" تابع رگرسیون بر اساس داده های آموزشی استفاده می شود.
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
در یک تابع رگرسیون خطی، پارامتر تتا و پارامترهای ویژگی با زیرنویس شماره گذاری می شوند. زیرنویس موقعیت پارامتر
(θ)
و پارامتر ویژگی را
(х)
در بردار تعیین می کند. توجه داشته باشید که ویژگی x
0 یک عبارت تغییر ثابت است و
1
برای اهداف محاسباتی قابل توجه است. در نتیجه، شاخص پارامترهای مهم مانند مساحت خانه با x
1 شروع می شود . بنابراین، اگر به x
1 اولین مقدار بردار ویژگی (مساحت خانه) اختصاص داده شود، آنگاه x
2 مقدار بعدی (تعداد اتاق) و غیره را خواهد گرفت. مثال-2 اجرای تابع رگرسیون خطی در جاوا را نشان می دهد که از نظر ریاضی با h
θ (x) نشان داده می شود. برای سادگی، محاسبات با استفاده از
double
. در متد
apply()
پیش بینی شده است که عنصر اول آرایه برابر با 1.0 باشد و خارج از این تابع تنظیم شود.
مثال 2: رگرسیون خطی در جاوا
public class LinearRegressionFunction implements Function<Double[], Double> {
private final double[] thetaVector;
LinearRegressionFunction(double[] thetaVector) {
this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
}
public Double apply(Double[] featureVector) {
assert featureVector[0] == 1.0;
double prediction = 0;
for (int j = 0; j < thetaVector.length; j++) {
prediction += thetaVector[j] * featureVector[j];
}
return prediction;
}
public double[] getThetas() {
return Arrays.copyOf(thetaVector, thetaVector.length);
}
}
برای ایجاد یک نمونه جدید
LinearRegressionFunction
، باید پارامتر را مشخص کنید
θ
. این پارامتر یا بردار برای تطبیق تابع رگرسیون خطی کلی با داده های آموزشی زیربنایی استفاده می شود. پارامتر
θ
مورد استفاده در برنامه در طول فرآیند آموزش بر اساس مثال های آموزشی تنظیم می شود. کیفیت تابع هدف آموزش دیده به کیفیت داده های آماده شده برای آموزش بستگی دارد. در مثال زیر از
LinearRegressionFunction
پیش بینی قیمت بر اساس اندازه خانه برای نشان دادن استفاده می کنیم. با توجه به اینکه x
0 باید یک ثابت با مقدار 1.0 باشد، تابع هدف با استفاده از دو پارامتر مقداردهی اولیه می شود
θ
، جایی که آنها نتیجه فرآیند یادگیری هستند. پس از ایجاد یک نمونه جدید، قیمت یک خانه با متراژ 1330 متر مربع مطابق شکل زیر پیش بینی می شود:
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);
Double[] featureVector = new Double[] { 1.0, 1330.0 };
double predictedPrice = targetFunction.apply(featureVector);
در شکل زیر نمودار تابع هدف پیش بینی (خط آبی) را مشاهده می کنید. با محاسبه تابع هدف برای تمام مقادیر مساحت خانه به دست می آید. نمودار همچنین شامل جفت قیمت-منطقه مورد استفاده برای آموزش است.
در حال حاضر نمودار پیش بینی بسیار خوب به نظر می رسد. مختصات نمودار (موقعیت و شیب) توسط بردار تعیین می شود
θ { 1.004579, 5.286822 }
. اما چگونه می توانید تعیین کنید که کدام
θ
بردار برای برنامه شما مناسب تر است؟ آیا اگر پارامتر اول یا شاید دوم را تغییر دهید، عملکرد بهتر می شود؟ برای تعیین بهترین بردار تتا، به یک تابع مفید نیاز دارید که ارزیابی کند تابع هدف چقدر کار را خوب انجام می دهد.
به ادامه ترجمه از انگلیسی. نویسنده: گرگور راث، معمار نرم افزار، JavaWorld.
GO TO FULL VERSION