سلام من امید عرب هستم ، لیسانس مهندسی کامپیوتر از دانشگاه صنعتی اصفهان در گرایش هوش مصنوعی ، علاقه مند به ماشین لرنینگ و بلاکچین.
شروع یک مسئله ماشین لرنینگ با داده های کم قسمت ۲
سلام !
قبل از هرچیز اول یه سر به قسمت قبلی بزن و بعد بیا برای ادامه کار .
خب همونطور که در قسمت قبلی آموزش گفتیم حالا قرار هست در ادامه ی راه حل های حل یک مسئله ماشین لرنینگ با داده کم ، به را حل ۵ ام بپردازیم :
۵) راه cross validation :
اگه تا اینجای بحث رو به خوبی متوجه شده باشید ، میدونید که وقتی مسئله دچار overfitting هست چنانچه دیتاست های متفاوتی رو برای train کردن به اون بدیم ، روی نتایج test تاثیر خیلی زیادی میذاره؛ علت هم واضحه! وقتی overfitting داریم یعنی مدل ما بیش از حد با داده های Train منطبق میشه.پس وقتی داده ترین متفاوتی و جدیدی بدیم ، این داده های جدید هم مجدد به نحو دیگری overfit میشه.
اما به طور ایده آل نباید این اتفاق بیافته . یعنی این که مدل ما باید به نحوی باشه که نویز رو بتونه فیلتر کنه و اجازه تغییر آنچنانی رو نده.
در حالت کلی اگر ما داده های train رو مثلا ۹۰ درصد و داده های تست رو ۱۰ درصد در نظر بگیریم و عملیات یادگیری ماشین رو انجام بدیم ممکن هست داده های بدرد بخور از دست برود ، چرا که توزیع داده های مهم در در بخش train یا در test بیافتد. بنابراین ، از کراس ولیدیشن برای تقسیم بندی دیتا ها به چند دسته ( fold ) استفاده میکنیم .
یکی از حالت های عمل کراس ولیدیشن ، تبدیل دیتا ها مثلا به ۳ فولد ( هر فولد ۳۳.۳۳ درصد ) و انجام iteration ( تکرار ) مثلا ۳ بار برای یادگیری است که هر بار فولد مجزا و متفاوتی رو برای تست انتخاب میکنه .
حالا این همه چیز که گفتیم چه ربطی به مسائل با داده کم داشت ؟
اگر در مسائل با داده کم بیایم و فولد های خودمون رو برای تست اینطور تقسیم کنیم که فقط یک داده برای تست و مابقی train باشد و این عملیات را k بار انجام دهیم ، به این کار کراس ولیدیشن از نوع n-fold میگن .( همچنین leave-one-out یا loocv ) هم گفته میشود.
با انجام این کار میتونیم در مسائل با داده کم ، Train بهتری داشته باشیم و با میانگین گیری نتایج iteration ها، داده های تست رو با دقت بیشتری تشخیص بدیم .
۶) راه transfer learning
شاید مهم ترین و متداول ترین راه حل مسائل با داده ی کم ، همین روش باشد. یک نکته بگم که این مبحث به طرز قابل توجهی مشابه با مبحث few shot learning - zero shot learning -one shot learning - meta learning مشابه هست و اصلا میشه گفت همگی یک هدف دارن : آموزش مسئله با داده های اندک.
مثلا در تعریف meta learning میگن : از زیر شاخه های یادگیری ماشین است که هدف آن طراحی مدلی است که به سرعت و با تعداد کمی نمونه های آموزشی، مهارت های جدید را یاد بگیرد و با محیط های جدید تطبیق یابد.در این روش یادگیری برای یادگیری انجام میشود ! یعنی مدل یادمیگیرد که چگونه وزن های خود را بروز کند تا بتواند نتایج بهتری روی دقت ها بدست اورد.
یا در تعریف transfer learning : آموزش شبکه عصبی بر روی مجموعه داده های بزرگ ممکن است هفته ها طول بکشد. خوشبختانه، این زمان را می توان به لطف مدل های از پیش آموزش دیده کوتاه کرد - به عبارت دیگر، استفاده از یادگیری انتقالی.
در تعریف few-shot-learning : آموزش شبکه عصبی عموما روی تصاویری که داده های سمپل آن بسیار اندک و در حد چند سمپل میباشد. . ( برای هر label تنها چند سمپل )
در تعریف one-shot-learning : آموزش شبکه عصبی عموما روی تصاویری که داده های سمپل آن تنها یک تصویر در هر کلاس را شامل شود . ( برای هر label تنها یک سمپل )
در تعریف zero-shot-learning : آموزش شبکه عصبی عموما روی تصاویری که هیچ داده ی سمپل ای وجود نداشته باشد. ( برای هر label هیچ سمپل ! )
البته بین مفاهیمی که گفته شد تفاوت های ریز بسیار زیادی هست که با سرچ کردن میتونید پی ببرید،ولی در حد چند خط که یک دید کلی ( نه دقیق ! )داشته باشید ، کافیه.
خُب ، تا اینجا نیاز بود این مفاهیم رو درک کنیم ، حالا بریم سر اصل مطلب : چطور از Transfer learning یا مفاهیم مشابه دیگه ای که گفتیم در حل مسائل با داده اندک استفاده کنیم ؟
اون چیزی رو که در این مجال بشه از این موضوع ارائه کرد صرفا یکسری توضیحات و مفاهیم هست ، ریز جزئیات ،کد زدن عملی و ... نیازمند مباحث جداگانه ای هست که میتونین با سرچ کردن پیدا کنین یا اگر شرایط فراهم بود در ادامه همین مباحث در مورد اون صحبت خواهیم کرد.
در فرآیند یادگیری مدل ها به روش معمولی ( تصویر بالایی) ، ما یک سری داده داریم، به مدل میدیم و مدل فیچر های اون رو استخراج میکنه ، نهایتا از یک classifier برای assign کردن لیبل خاص به دیتا استفاده میکنیم .
اما در مسائل transfer learning ( تصویر پایینی ) ما یک سری داده داریم، به مدل میدیم اما مدل از فیچر های مسئله ی train شده ی دیگری از قبل ،برای این مسئله استفاده کرده و توی اون قسمت NEW TASK از یک classifier به صورتی که تغییرات اندکی روی وزن ها با استفاده از دیتای جدید بده استفاده میکنیم . (چقدر استفاده!)
توضیح خلاصه دیگر در مورد روش حل مسئله ی few/one shot learning آنکه ، ما ابتدا یک مسئله ی حل شده قبلی داریم، داده ها (siamese network) را به دو دسته ی positive و negative تقسیم میکنیم.
بخش positive مربوط به جفت دیتا هایی است که لیبل مشابه دارند و negative مربوط به جفت دیتاهایی که لیبل مشابه ندارند.مسئله را train میکنیم.
حال که مسئله ما train شد یک support set تعریف شده داریم که یک شات در هر کدام هست .( همان دیتایی مسئله اصلی که قرار هست یادگیری روی اون انجام بشه ) قبل از هرکاری باید با استفاده از یک CNN فیچر های تصاویر را بدست بیاوریم .
نکته و سختی کار اینجاست که support set نباید شامل کلاس های training set باشد یعنی صرفا از آن ترین ست برای آموزش دیدن یک ماشین استفاده کرده ایم و حالا مسئله را به صورت انتقالی برای support set خود حل میکنیم.
در مورد مسئله ی zero shot learning هم که اصلا support Set ما خالی هست و صرفا باید از فیچر های مسئله ی از قبل حل شده استفاده کنیم .
خلاصه قسمت دوم :
در این قسمت از موضوع cross validation شروع کردیم و توضیح دادیم که ارتباط اون با مسائل less/few data چی هست ( leave-one-out) بعد از اون به مبحث فوق العاده مهم transfer learning و تکنینک ها و مفاهیم مشابه اون ( meta learning - few/one/zero-shot-learning ) به طور خیلی خلاصه پرداختیم .
- در قسمت بعدی : به موضوع راه حل های augmentation و generate data ( expand data set ) میپردازیم.
نکته : برای جمع آوری این مطلب ، از نتایج تجربی نویسنده و همچنین سایت https://neptune.ai و بخشی از آموزش آقای milad farzalizadeh استفاده شده است.هدف این آموزش ، دید کلی نسبت به موضوع مسائل با دیتای اندک است و به جزئیات پیاده سازی و ... در آموزش های دیگری خواهیم پرداخت )
مطلبی دیگر از این انتشارات
شروع یک مسئله ماشین لرنینگ با داده های کم قسمت ۱
مطلبی دیگر از این انتشارات
زبان برنامه نویسی پایتون چیست؟
مطلبی دیگر از این انتشارات
شروع یک مسئله ماشین لرنینگ با داده های کم قسمت ۶