یادگیری ماشین
یادگیری ماشین (ML) به صورت قابل توجهی، در زمینههای مختلفی هم در دانشگاهها و هم در صنعت مورد استفاده قرار میگیرد. (ML) به صورت قابل توجهی، در زمینههای مختلفی هم در دانشگاهها و هم در صنعت مورد استفاده قرار میگیرد. همچنین ML، روز به روز مشارکت خود را در لیست جامعی از برنامههایی مانند تصاویر، تشخیص گفتار، تشخیص الگوها، بهینه سازی، پردازش زبان طبیعی (natural language) و recommendationها و موارد دیگر افزایش دادهاست.
“نوعی برنامهنویسی کامپیوتریای که بتواند از تجربیات بیاموزد، در نهایت باید نیاز به نوشتن برنامه های با جزئیات فراوان را برطرف کند.” – آرتور ساموئل 1959.
یادگیری ماشین را به طور کل میتوان به چهار تکنیک اصلی تقسیم بندی کرد؛ این چهار تکنیک شامل regression (بازگشت)، classification (طبقهبندی) clustering (خوشهبندی) و reinforcement learning (یادگیری تقویتی) است. این تکنیک ها، به طور کل مشکلات مختلف را به دو شکل حل میکنند: یادگیری تحت نظارت (supervised) و یادگیری بدون نظارت (unsupervised). یادگیری تحت نظارت، مستلزم برچسبگذاری و آمادهسازی دادهها پیش از آموزش دادن مدل است؛ ولی یادگیری بدون نظارت، برای رسیدگی به داده های بدون برچسب یا داده هایی که ویژگیهای ناشناخته دارند، مفید است.
Libraryهای یادگیری ماشین در جاوا
در اینجا لیستی از Libraryهای معروف جاوا، برای یادگیری ماشین وجود دارد؛ ما در ادامهی این مقاله تک تک آنها را بررسی خواهیم کرد و همچنین نمونههای واقعیای را با استفاده از برخی از این چارچوبها به شما ارائه میدهیم.
Libraryهای معروف یادگیری ماشین در جاوا:
- Weka
- Apache Mahout
- Deeplearning4j
- Mallet
- Spark MLlib
- The Encog Machine Learning Framework
- MOA
در ادامه در کنار هر Library ای که در مورد آن صحبت میشود، نمادهای زیر، دسته های اصلی الگوریتمهای ارائه شده در هر چارچوب را به طور پیش فرض نشان میدهند.
-
Weka
Weka، یک کتابخانهی open source است، که توسط دانشگاه وایکاتو در کشور نیوزلند توسعه یافته است. Weka به زبان برنامهنویسی جاوا نوشته شده است و برای یادگیری ماشین چند منظوره، بسیار پرکاربرد و مشهور است.
Weka یک فرمت فایل داده، به نام ARFF، ارائه میدهد. ARFF به دو قسمت سربرگ (header) و دادههای واقعی (actual data) تقسیم میشود. سربرگ (header)، ویژگیها و انواع دادهها را شرح میدهد.
-
Apache Mahout
Apache Mahout یک Library مقیاس پذیر یادگیری ماشین را ارائه میدهد. Apache Mahout از الگوی MapReduce استفاده میکند و میتواند برای طبقهبندی (classification)، فیلترینگ مشارکتی (collaborative filtering) و خوشهبندی (clustering) استفاده شود. ماهوت همچنین Apache Hadoop را برای پردازش چندین کار موازی مورد استفاده قرار میدهد. Mahout علاوه بر طبقهبندی و خوشهبندی، الگوریتمهای پیشنهادی، مانند فیلترینگ مشارکتی، را نیز ارائه میدهد که مقیاس پذیری ساخت سریع مدل شما را تسهیل میکند.
-
Deeplearning4j
Deeplearning4j، یکی دیگر از Libraryهای جاوا است، که بر یادگیری ماشین Deep تمرکز دارد. این یکی از Libraryهای بزرگ open source برای یادگیری Deep در زبان برنامهنویسی جاوا است. Deeplearning4j همچنین در اسکالا و جاوا نیز نوشته شده است و میتواند با Hadoop و Spark ادغام شده و قابلیت پردازش بالایی را ارائه دهد. نسخهی فعلی در نسخه بتا است ولی دارای documentation عالی و نمونههای شروع سریع است.
-
Mallet
Mallet مخفف عبارت Machine Learning for Language Toolkit است. Mallet یکی از معدود ابزارهای تخصصی برای پردازش زبان طبیعی (natural language) است. این Library قابلیت مدل سازی موضوع، طبقهبندی اسناد، خوشهبندی و استخراج اطلاعات را به برنامهنویسان ارائه میدهد. با Mallet، میتوان مدلهای ML را برای پردازش اسناد متنی به کار برد.
-
Spark Mllib
Spark به علت مقیاسپذیری و تسریع عملکرد کلی پردازش حجم عظیمی از دادهها شناخته شده است. Spark MLlib همچنین دارای الگوریتمهای قدرت بالا برای اجرا بر روی spark و اتصال به workflowهای Hadoop است.
-
The Encog Machine Learning Framework
Encog یک چارچوب جاوا و C# برای یادگیری ماشین است. Encog، Libraryهایی را برای ساختSVM ، NN، شبکههای Bayesian، HMM و الگوریتمهای ژنتیک دارد. Encog به عنوان یک پروژهی تحقیقاتی آغاز شد و تقریباً تا به امروز هزار ارجاع در Google Scholar دریافت کرده است.
-
MOA
Massive Analysis Online (MOA) الگوریتمهایی را برای طبقهبندی (classification)، regression، خوشه بندی (clustering) و توصیهها (recommendations) ارائه میدهد. همچنین Libraryهایی را نیز برای تشخیص outlier و تشخیص drift فراهم میکند. این برنامه به طور کل برای real-time processing بر روی جریان دادههای تولید شده، طراحی شده است.
بررسی چند نمونه یادگیری ماشین در Library های معروف
نمونه Weka:
ما قصد داریم در ادامه از یک مجموعه داده (dataset) کوچک دیابت استفاده کنیم. برای شروع، ابتدا دادهها را با استفاده از Weka بارگذاری میکنیم:
768 instance در Dataset وجود دارد. بیایید حال ببینیم که چگونه می توان شماره attributeهایی (feature) را که 9 باشد، دریافت کرد.
قبل از ساخت هر مدلی، ابتدا باید مشخص کنیم کدام ستون، ستون هدف است و ببینیم چند class در این ستون یافت میشود:
پس از Load کردن Dataset و شناسایی attribute هدف ما، اکنون زمان ساخت مدل است. بیایید یک classifier ساده درختی J48 بسازیم.
در سه خط بالا، ما گزینه ای را برای نشان دادن یک درخت unpruned مشخص کردیم و instanceهای data را برای آموزش مدل ارائه کردیم. اگر ما ساختار درختی مدل تولید شده را پس از آموزش، پرینت کنیم، میتوانیم نحوه ای که مدل به صورت داخلی قوانین خود را میسازد دنبال کنیم:
نمونه Deeplearning4j:
این نمونه، یک مدل شبکه عصبی Convolution (CNN) برای طبقهبندی (classify کردن) Library MNIST ایجاد میکند.
مثل همیشه، ابتدا dataset را بارگذاری میکنیم و اندازهی آن را نمایش میدهیم.
حال، بیایید دوباره بررسی کنیم که آیا ما 10 label منحصر به فرد از dataset دریافت کرده ایم؟
در مرحله بعد، معماری مدل را پیکربندی میکنیم. ما از دو لایه convolution بعلاوه یک لایه flattened برای خروجی استفاده میکنیم. Deeplearning4j چندین گزینه به شما ارائه میدهد که میتوانید از آنها برای راه اندازی وزن scheme استفاده کنید.
پس از اینکه معماری را تنظیم کردیم، سپس باید mode را راه اندازی کنیم، برای این کار، dataset آموزش را تنظیم کنید، و بعد از آن آموزش مدل را فعال کنید.
در طی مرحله ی آموزش (training)، شنونده نمره (score listener)، confusion matrix دقت طبقهبندی (classification accuracy) را ارائه میدهد. بیایید accuracy را بعد از ده epoch آموزش ببینیم:
نمونهی Mallet:
همانطور که قبلاً نیز به آن اشاره شد، Mallet یک ابزار قدرتمند برای مدل سازی natural language (زبان طبیعی) است. ما در اینجا از یک نمونهی ارائه شده توسط ابزار David Blei در چهارچوب Mallet استفاده خواهیم کرد. Mallet، دارای یک Library مخصوص برای حاشیهنویسی نشانههای متنی برای طبقهبندی (classification) است. قبل از بارگذاری dataset، Mallet دارای این مفهوم از تعریف pipeline است که در آن، شما pipeline خود را تعریف کرده و سپس dataset را برای عبور دادن از آن ارائه میدهید.
خط لوله در اینجا به عنوان “ArrayList” تعریف شده است، که شامل طی کردن مراحل معمولیای است که ما همیشه قبل از ایجاد یک مدل موضوعی (topic model) انجام میدهیم. هر متن در document مراحل زیر را طی میکند:
- Lowercase کردن (نوشتن تمام حروف یک کلمه با حروف کوچک) کلمات کلیدی
- ژتون دار کردن متن (Tokenize)
- حذف stopwordها
- نشان دادن (map) ویژگی ها
پس از اینکه pipeline تعریف شد، ما instanceهایی را که یک متن original از هر document را نشان میدهد، از آن عبور میدهیم.
حال در این مرحله برای پر کردن لیست instance، باید فایل input را عبور دهیم.
از آخرین خط فرمان، میتوان متوجه شد که ما دستورالعملهایی را درباره نحوه ساختار فایل CSV ارائه کرده ایم. فایل منبع، موجود در پوشه منابع، حدود تقریباً دو هزار ردیف دارد. هر خط یک متن document اصلی را نشان میدهد و شامل سه ویژگی است که به وسیله کاما از هم جدا شده اند (نام، برچسب (label) و محتوای document). ما میتوانیم شمارهی instanceهای موجود در document ورودی را با استفاده از دستور زیر چاپ کنیم:
حال بیایید در این مرحله، موضوعات documentها را مدل کنیم. ابتدا بیایید فرض کنیم ما صد موضوع مختلف در آن دو هزار document داریم. Mallet این توانایی را به ما میدهد تا دو متغیر تعیین کنیم: وزنهای آلفا و بتا (alpha and beta weights). آلفا، غلظت توزیع موضوع-کلمه را کنترل میکند و بتا وظیفهی نشان دادن وزن پیش از کلمه را بر توزیع موضوع-کلمه دارد.
مدلی که در این نمونه انتخاب میکنیم، پیاده سازی LDA (Latent Dirichlet allocation) است. این الگوریتم، از گروهی از کلمات کلیدی مشاهده شده برای طبقهبندی documentها استفاده میکند.
یکی از ویژگیهای محبوب Mallet، قابلیتهای API است، که پردازشهای موازی شما را به راحتی طراحی میکند. در اینجا، ما میتوانیم پردازش multithread را برای هر زیر نمونه (subsample) تعریف کنیم.
حال تنها دو کار باقی مانده این است که اول شماره iteration تکرارهای آموزش مدل را مشخص کنیم و سپس آموزش را شروع کنیم.