۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

یادگیری ماشین برای توسعه دهندگان جاوا: الگوریتم هایی برای یادگیری ماشین

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

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

مدل های زبان بزرگ مانند ChatGPT و Bard یادگیری ماشینی را به وضعیت یک پدیده ارتقا داده اند. استفاده از آنها برای کمک به کدنویسی باعث شده است که این ابزارها به سرعت در جعبه ابزار توسعه دهنده جای بگیرند. موارد استفاده دیگر از تولید تصویر تا تشخیص بیماری در حال بررسی هستند.

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

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

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

این مقاله در اصل توسط گرگور راث نوشته شده و در JavaWorld منتشر شده است. متیو تایسون کد و چارچوب های مورد استفاده در نمونه ها را در ژانویه ۲۰۲۴ به روز کرد.

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

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

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

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

چگونه ماشین ها یاد می گیرند

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

یادگیری تحت نظارت

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

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

پس از پایان فرآیند آموزش، داده های ورودی جدید برچسب گذاری نمی شوند. این دستگاه می‌تواند به درستی به درخواست‌های جدید پاسخ دهد، حتی برای بردارهای مشخصه نامشخص و نامشخص.

یادگیری بدون نظارت

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

این مقاله بر یادگیری ماشینی نظارت شده تمرکز دارد، که در حال حاضر رایج ترین رویکرد برای یادگیری ماشین است.

یک پروژه یادگیری ماشینی تحت نظارت

اکنون بیایید به یک مثال نگاه کنیم: یک پروژه آموزشی تحت نظارت برای یک برنامه املاک و مستغلات.

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

برای یک پروژه یادگیری ماشینی تحت نظارت، باید داده ها را به روشی معنی دار برای نتیجه مورد نظر برچسب گذاری کنید. در جدول ۱، توجه داشته باشید که هر ردیف از رکورد خانه دارای یک برچسب برای “قیمت خانه” است. با مرتبط کردن داده‌های ردیف به برچسب قیمت خانه، الگوریتم در نهایت می‌تواند قیمت بازار خانه‌ای را که در مجموعه داده‌های آن نیست، پیش‌بینی کند (توجه داشته باشید که اندازه خانه بر اساس متر مربع است و قیمت خانه بر اساس یورو است). p>

FEATURE FEATURE FEATURE LABEL
اندازه خانه تعداد اتاق عصر خانه هزینه تخمینی

۹۰ متر۲ / ۲۹۵ فوت

۲ ۲۳ سال

۲۴۹۰۰۰ €

۱۰۱ متر۲ / ۳۳۱ فوت

۳ نامعمول

۳۳۸۰۰۰ €

۱۳۳۰ متر مربع / ۴۳۶۳ فوت

۱۱ ۱۲ سال

۶,۵۰۰,۰۰۰ €

۹۰ متر۲ / ۲۹۵ فوت

۲۴۹۰۰۰ €

۱۰۱ متر۲ / ۳۳۱ فوت

۳۳۸۰۰۰ €

۱۳۳۰ متر مربع / ۴۳۶۳ فوت

۶,۵۰۰,۰۰۰ €

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

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

آموزش یک مدل یادگیری ماشینی

چالش یادگیری ماشینی تحت نظارت، یافتن تابع پیش‌بینی مناسب برای یک سوال خاص است. از نظر ریاضی، چالش یافتن تابع ورودی/خروجی است که متغیر ورودی x را می گیرد و مقدار پیش بینی y را برمی گرداند. این تابع فرضیه (hθ) خروجی فرآیند آموزش است. غالباً تابع فرضیه هدف یا تابع پیش‌بینی نیز نامیده می‌شود.

نمونه ای از تابع هدف در یادگیری ماشین.

شکل ۱. مثالی از یک تابع هدف

در بیشتر موارد، x یک نقطه چند داده را نشان می‌دهد. در مثال ما، این می‌تواند یک نقطه داده دو بعدی از یک خانه جداگانه باشد که با مقدار اندازه خانه و مقدار تعداد اتاق‌ها تعریف می‌شود. آرایه این مقادیر به عنوان بردار ویژگی نامیده می شود. با توجه به یک تابع هدف مشخص، تابع را می توان برای پیش بینی هر بردار ویژگی، x استفاده کرد. برای پیش‌بینی قیمت هر خانه، می‌توانید تابع هدف را با استفاده از بردار ویژگی {۱۰۱.۰, ۳.۰ } فراخوانی کنید، که شامل اندازه خانه و تعداد اتاق‌ها است:


// target function h (which is the output of the learn process)
Function<Double[], Double> h = ...;

// set the feature vector with house size=101 and number-of-rooms=3
Double[] x = new Double[] { 101.0, 3.0 };

// and predicted the house price (label)
double y = h.apply(x);

در فهرست ۱، مقدار متغیر آرایه x نشان دهنده بردار ویژگی خانه است. مقدار y برگردانده شده توسط تابع هدف، قیمت خانه پیش بینی شده است.

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

نمونه ای از مدل یادگیری ماشین.

شکل ۲. یک مدل یادگیری ماشینی

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

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

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

رگرسیون خطی

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

یک تابع رگرسیون خطی عمومی.

شکل ۳. یک تابع رگرسیون خطی عمومی

رگرسیون خطی نوع ساده ای از تابع یادگیری است، اما مبنای خوبی برای اشکال پیشرفته تر مانند نزول گرادیان، که در شبکه های عصبی پیشخور استفاده می شود، فراهم می کند. در تابع رگرسیون خطی، پارامترهای تتا و پارامترهای ویژگی با یک شماره اشتراک شمارش می‌شوند. شماره اشتراک موقعیت پارامترهای تتا (θ) و پارامترهای ویژگی (x) را در بردار نشان می دهد. توجه داشته باشید که ویژگی x۰ یک عبارت آفست ثابت با مقدار ۱ برای اهداف محاسباتی است. در نتیجه، شاخص یک ویژگی خاص دامنه مانند اندازه خانه با x۱ شروع می‌شود. بنابراین، اگر x۱ برای اولین مقدار بردار ویژگی House، house-size تنظیم شود، آنگاه x۲ برای مقدار بعدی، تعداد-از- تنظیم می شود. اتاق ها و غیره.

نکته

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

فهرست ۲ اجرای جاوا از این تابع رگرسیون خطی را نشان می دهد که به صورت ریاضی به صورت hθ(x) نشان داده شده است. برای سادگی، محاسبه با استفاده از نوع داده double انجام می شود. در روش apply()، انتظار می رود که اولین عنصر آرایه با مقدار ۱.۰ خارج از این تابع تنظیم شده باشد.


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) {
      // for computational reasons the first element has to be 1.0
      assert featureVector[0] == 1.0;

      // simple, sequential implementation
      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۰ باید یک مقدار ثابت ۱.۰ باشد، تابع هدف با استفاده از دو پارامتر تتا نمونه سازی می شود. پارامترهای تتا خروجی یک فرآیند یادگیری هستند. پس از ایجاد نمونه جدید، قیمت خانه به متراژ ۱۳۳۰ متر مربع به شرح زیر پیش بینی می شود:


// the theta vector used here was output of a train process
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// create the feature vector function with x0=1 (for computational reasons) and x1=house-size
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// make the prediction
double predictedPrice = targetFunction.apply(featureVector);

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

خط پیش بینی تابع هدف.

شکل ۴. خط پیش بینی تابع هدف