شما اینجا هستید

آموزش یک ماشین دسته بندی کننده ساده

پیغام خطا

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls در book_prev() (خط 775 در /home/molavy/public_html/modules/book/book.module).

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

چطور این کار را انجام می دهیم؟

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

 

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

 

شماره نمونه

پهنا

طول

حشره

۱

۳.۰

۱.۰

کفشدوزک

۲

۱.۰

۳.۰

کرم ابریشم


ما یک نمونه حشره داریم که پهنای آن ۳.۰ و بلندی آن ۱.۰ است، و میدانیم که کشدوزک است.(مثل اینکه با بال های باز اندازه‌گیری شده).  همینطور یک نمونه حشره داریم که دراز تر است و طول آن ۳.۰ و عرض آن ۱.۰ است، که میدانیم کرم ابریشم است.
مطمئن هستیم که اندازه‌گیری ها درست انجام شده اند. ما از این مثال‌ها برای تنظیم شیب خط تابع دسته بندی خود استفاده می کنیم. نمونه‌های مورد اطمینان که برای آموزش ماشین پیش‌بینی یا ماشین دسته بندی استفاده می‌شوند را اصطلاحاً «داده های یادگیری» یا «داده‌های آموزش» یا به انگلیسی «Training Data» می نامند.
اجازه دهید این داده‌های آموزشی را روی نمودار نشان دهیم. نمایش گرافیکی داده خیلی به فهم مطلب کمک می کند. نمایش گرافیکی به ما اجازه می‌دهد وضعیت را کاملاً ببینیم و احساس کنیم. 
و خیلی بهتر از دیدن یک سری اعداد درون یک جدول است.

خوب در اینجا هم چون خط جدا کننده مستقیم است معادله خط مستقیم را می‌نویسم
y = Ax
در اینجا از عمد از نام های x به جای طول و عرض استفاده کردیم، به خاطر اینکه برخلاف حالت قبل در اینجا این خط پیش‌بینی کننده نیست. یعنی مثل حالت قبل که کیلومتر را به مایل تبدیل میکرد این خط عرض را به طول تبدیل نمی کند. در عوض، این یک خط جدا کننده است، یا به عبارتی یک دسته بندی کننده است.

 ممکن است به این نکته نیز توجه کرده باشید که معادله خط ما یعنی y = Ax ساده‌تر از معادله کامل خط مستقیم یعنی  y = Ax + B است.
ما از عمد در سناریوی حشرات باغ همه چیز را ساده تا حد امکان ساده در نظر گرفتیم. اگر مقدار B را غیر صفر در نظر بگیریم یعنی خط از مبدأ مختصات رد نمی شود. غیر صفر گرفتن این عدد در اینجا هیچ سودی به حال ما ندارد.

ما دیدیم که پارامتر A شیب خط را کنترل می کند. مقدار بیشتر A باعث افزایش شیب خط می شود.
بیاید برای شروع مقدار A را ۰.۲۵ در نظر بگیریم. معادله خط جدا کننده ما برابر 


y=0.25x 

می شود.
بیایید این خط را روی نمودار داده‌های یادگیری رسم کنیم و ببینیم چه شکلی می شود:

 

خوب، حالا با نمایش گرافیکی بدون هیچ محاسبه ریاضی میتوانیم ببینیم که خط y=0.25x یک دسته بندی کننده خوب نیست.  خط دو دسته حشره را جدا نکرده است. نمی‌توانیم بگویم «اگر حشره بالای خط بود کرم ابریشم است» چونکه کفشدوزک هم بالای خط است.

خوب پس نیاز داریم که خط را جا به جا کنیم. بیایید این بار به نمودار نگاه نکنیم و سعی کنیم با مجموعه دستور العمل هایی به کامپیوتر بگوییم این خط را پیدا کند. این مجموعه دستور العمل ها را دانشمندان کامپیوتر الگوریتم می نامند. پس بیایید الگوریتم پیدا کردن خط مناسب را بسازیم.

در ابتدا نگاهی به اولین نمونه داده آموزشی داریم: پهنا ۳.۰ و طول ۱.۰ برای کفشدوزک. اگر تابع y=Ax را روی این مثال پیاده کنیم داریم:


y = (0.25) * (3.0) = 0.75

تابع ما با پارامتر A  با عدد تصادفی 0.25 مقدار دهی شد. برای حشره ای با پهنای 3.0 طول 0.75 را پیشنهاد می دهد. میدانیم که این خیلی کوتاه است. برای اینکه در داده‌های یادگیری طول آن 1.0 آمده است.

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

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

 

خوب بیایید y را برابر 1.1 بگیریم وقتی x برابر 3.0 است. خوب این یک کم بالای آن می شود. میتوانیم 1.2 یا 1.3 هم بگیریم . اما عدد هایی مثل 10 یا 100 را در نمی گیریم. چون به این شکل خط آنقدر بالا می‌رود که کرم‌های شب تاب نیز زیر خط می افتند. آنوقت خط ما دیگر یک جدا کننده نیست.
خوب پس هدف برابر y=1.1 شد و خطا را اینطوری محاسبه می‌کنیم
خطا = مقدار هدف – مقدار واقعی خروجی
پس می‌شود


E = 1.1 - 0.75 = 0.35


بیایید همین جا دست نگه داریم و به خودمان یادآوری کنیم که خطا چه بود. یک نمودار برای نمایش این دو بکشیم که به صورت بصری دیدگاهی به ما بدهد.


حالا چطور از  E استفاده کنیم که با آن وضعیت پارامتر A را بهتر کنیم؟ این یک سؤال اساسی است.
بیایید یک مرحله عقب تر برگردیم و دوباره فکر کنیم. ما می‌خواهیم از خطایی که در y به دست آمده استفاده کنیم. مقدار خطا را E نام گذاری کردیم، که نشان دهنده میزان تغییرات مورد نیاز در پارامتر y است.  برای اینکه این کار را انجام دهیم اول باید رابطه بین این دو را بدانیم.پس سؤال این است که پارامتر A چطور با E ارتباط دارد؟  اگر این را بدانیم، ما می‌فهمیم که چطور یکی را برای تأثیر روی دیگری تغییر دهیم.

بیایید با همین تابع خطی دسته بندی کننده خودمان شروع کنیم


y=Ax

 

ما می‌دانیم که مقدار اولیه‌ای که برای A حدس زدیم خروجی اشتباهی برای y می دهد. و می‌دانیم که این خروجی بهتر است با داده‌های آموزشی یکسان باشد. بیایید مقدار مورد انتظار صحیح را به نام مقدار هدف (target value) بنامیم و آن را با حرف t نمایش دهیم. برای اینکه به مقدار هدف برسیم به این شکل عمل می‌کردیم که مقدار A را کم کم تنظیم می کردیم. ریاضی دادان از نماد دلتا (به این شکلΔ است) برای نشان دادن «مقدار کم تغییر» استفاده می کنند. پس بیایید این را این شکلی بنویسیم:


t = (A + ΔA)x


باز هم آن را به صورت تصویری نمایش می‌دهیم تا به فهم مطلب کمک کند.  شما می‌توانید شیب جدید  (A+ ΔA) را در آن ببینید.


به یاد بیاورید که خطای E با محاسبه اختلاف بین مقدار مورد انتظار و مقدار محاسبه شده‌ای بود که بر اساس حدس اولیه برای A بدست آمد.  در حقیقت E را میتوانیم t-y نوشت.که y مقدار محاسبه شده کنونی و t مقدار مورد انتظار است.
بیایید آن را یک بار به صورت کامل بنویسیم تا موضوع واضح تر شود


t - y = (A + ΔA)x – Ax

:
خوب بهتر است با کمی جایگذاری ساده ترش کنیم


E = t - y = Ax + (ΔA)x - Ax
E = (ΔA)x

این یک نکته کلیدی است.خطای E در حقیقت به میزان تغییرات A وابسته است. یک راه ساده است. به هر حال این رابطه ساده کار ما را خیلی راحت‌تر می‌کند.


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

ما میخواهیم بدانیم چطور پارامتر A را تنظیم کنیم تا خروجی بهتری بدهد. این کار را با تغییر شیب خط انجام می دهیم. اینکه چقدر و چطور شیب خط را تغییر دهیم را میزان خطای E به ما می دهد. برای انجام این معادله آخر را جوری تغییر میدهیم که میزان تغییرات A یا به عبارتی ΔA را بدست آید.


ΔA = E / x


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

میزان خطا 0.35 و مقدار x برابر 3.0 بود. با قرار دادن این مقادیر در معادله ΔA = E / x
خروجی برابر  


0.35/3.0=0.1167


می شود.این به معنای آن است که مقدار بروز شده جدید برای A به توجه به (A + ΔA) می‌شود


0.25+0.1167=0.3667


حالا که اینطور شد، مقدار محاسبه شده برای y با مقدار جدید A می‌شود 1.1 که همانطور که انتظار داشتیم همان مقدار هدف مورد نظر است.


پُف. بالاخره انجامش دادیم! مهمترین کاری که انجام دادیم این است که حالا یک روش داریم که با آن پارامتر A را بر اساس مقدار خطای کنونی اصلاح کنیم.

خوب بیایید کار را به یک سرانجامی برسانیم.

تمام این کارها روی یکی از داده‌های آموزشی بود. میخواهیم از داده آموزشی بعدی نیز یاد بگیریم.
در نمونه داده آموزشی بعدی داریم x=1.0 و y=3.0 .


ببینیم چه می‌شود وقتی ما x = 1.0 را در یک تایع خطی قرار می‌دهیم که A آن با مقدار  0.3667 بروز شده است. مقدار y برابر با 0.3667 * 1.0 = 0.3667 . خوب این اصلاً به مثال داده آموزشی ما که در آن y برابر 3.0 بود نزدیک نیست.

بر اساس منطق قبلی که نمی خواستیم خط دسته بندی ما روی داده آموزشی قرار بگیرد و می‌خواستیم بالا یا زیر آن باشد، مقدار مورد نظر را برابر 2.9 قرار می دهیم. به این روش نمونه آزمایشی ما که همان کرم ابریشم است بالای خط قرار می‌گیرد  نه روی آن. میزان خطای E هم می شود.


2.9–0.3667=2.533


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


بیایید مقدار A را دوباره بروز کنیم. مقدار تغییرات A یا همان  ΔA بر اساس معادله E/x بدست می‌آید. که می‌شود


2.5333/1.0=2.5333


این به معنای آن است که A جدید می‌شود 


0.3667+2.5333=2.9


یعنی برای x=1.0 تابع به ما 2.9 را به عنوان پاسخ می دهد، که برابر با مقدار مورد نظر بود.


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


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

خوب. همان چیزی را گرفتیم که خواسته بودیم. خط بر اساس مقدار مورد نظر برای y بروز شد. 

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

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

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

 


خوب حالا بیایید با این نگاه دوباره معادله ای بنویسیم که تعدیل را هم در نظر گرفته باشیم


ΔA = L (E / x )


نرخ تعدیل( moderating factor) اغلب با نام نرخ یادگیری (Learning Rate) شناخته می شود. برای همین هم آن را با حرف L نشان دادیم. بیایید مقدار L را برای شروع برابر 0.5 بگیریم. معنی آن این می‌شود که ما شیب خط را با نصف حالتی که بدون تعدیل بروز می کردیم، بروز می کنیم.

از اول عملیات ها را انجام می‌دهیم مقدار اولیه A برابر 0.25 است. مقدار آموزشی اول به ما مقدار


y=0.25*3.0=0.75


می دهد. مقدار مورد نظر 1.1 مقدار خطای 0.35 را می دهد.  میزان تغییرات بر اساس معادله جدید:


ΔA = L (E / x) = 0.5 * 0.35 / 3.0 = 0.0583


می شود. مقدار بروز رسانی  A می شود:


0.25+0.0583=0.3083


این A جدید که بر اثر آموزش با ردیف اول داده‌های آموزش به وجود آمد را به عنوان مقدار اولیه برای داده آموزش در ردیف دو در نظر می گیریم. در ردیف دو x=3.0 و نتیجه می‌شود


y = 0.3083 * 3.0 = 0.9250


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

با داده آموزشی دوم ادامه می دهیم. جایی که x برابر 1.0 است. با استفاده از A=0.3083 ما داریم 


y = 0.3083 * 1.0 = 0.3083


مقدار مورد نظر 0.9 بود بنابراین مقدار خطا می‌شود


0.9-0.3083=0.5917


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


خیلی خوب شد. حتی با همین دو تا نمونه یادگیری و استفاده بروز رسانی های مناسب با استفاده از نرخ یادگیری تعدیل شده،  ما خیلی سریع به یک خط تقسیم کننده خوب رسیدیم.
در اینجا معادله خط y=Ax  و مقدار A برابر 0.6042  است.

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


نکات کلیدی:
ما میتوانیم از عملیات های اصلی ریاضی برای فهم ارتباط بین خطای خروجی یک  دسته بندی کننده خطی و پارامتر شیب خط قابل تنظیم استفاده کنیم.

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

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

 

دیدگاه جدیدی بگذارید