پست وبلاگ

یادگیری عمیق یا Deep learning چیست؟ بخش اول

یادگیری عمیق یا Deep learning چیست؟ بخش اول

بسم الله الرحمن الرحیم

سلام به همگی , امروز میخوام درمورد یادگیری عمیق صحبت کنم و توضیحاتی در مورد اینکه چی هست  و چه پیشنیازهایی داره توضیح بدم. این پست رو در چند بخش بروز میکنم و اینم بگم که در اینجا در مورد پیش نیازهای سخت افزاری و درسی توضیح نمیدم اینارو در یه پست دیگه بهش میپردازیم انشاالله .(پستی که در مورد منابع و… میخوام توضیح بدم پیش نیازهای درسی رو اونجا میگم). در مورد پیش نیازهای سخت افزاری هم یعنی اینکه چه کارت گرافیکی لازم داریم با چه مشخصاتی تو یه پست جداگانه سعی میکنم توضیح بدم. در مورد ابزارها هم تو یه پست جداگانه توضیح میدم چون هرکدوم از اینها کلی مطلب هست که باید گفته بشه و بهتره تو پست های جداگانه بهش پرداخته بشه.تو متن زیر یکسری ارجاعات به بعد هست که نمیشه اینجا توضیح داد وگرنه بحث خراب میشه از طرفی اینو باید میگفتم تا یه ایده سطح بالا بدست بیاد بعدا انشاالله تو پست های دیگه بیشتر وارد جزییات میشیم.

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

اگه مطالب این پست رو نخوندید بخونید بعد بیایید اینو بخونید

مفاهیم اصلی

یادگیری ماشین یا Machine Leaning

یادگیری ماشین یکی از مفاهیم اصلی هست که باید بلد باشیم بطور خلاصه تو یادگیری ماشین, ما یکسری داده داریم(دیتاست) و بعد با استفاده از یک مدل میایم و مدلمون رو با استفاده از این داده ها (دیتاست) آموزش میدیم یا اصطلاحا train میکنیم.بعد از اینکه مدلمون رو آموزش دادیم از اون برای پیش بینی بر روی داده های جدید استفاده میکنیم . یکم سخت شد؟ بزارید واضحتر توضیح بدم . تو ماشین لرنینگ سعی ما اینه که به ماشین (کامپیوتر) آموزش بدیم تا یه کار خاصی رو انجام بده .مثل اینکه به یه بچه داریم یه چیزی رو یاد میدیم.  مثلا ما میاییم تعداد خیلی زیادی عکس گربه و تعداد خیلی زیادی عکس غیر گربه (هرچیزی میتونه باشه مثل عکس دیوار عکس خرس عکس آدم و…) رو جمع میکنیم بعد یه مدل طراحی میکنیم (فرض کنید طراحی کردیم این الان مهم نیست) . حالا میایم به کامپیوتر یکی یکی عکسارو نشون میدیم میگم این عکس گربه اس این یکی عکس گربه نیست و این کارو انقدر انجام میدیم تا تمام تصاویر تموم بشن. و این عمل رو چند بار تکرار میکنیم . نهایتا بعد از اینکار کامپیوتر یاد میگیره که گربه چی هست و اگر عکس جدیدی از گربه که تا بحال بهش نشون نداده باشیم رو بهش نشون بدیم اون باید بتونه تشخیص بده و بگه آیا این عکس یه گربه هست یا نه . این یه مثال خیلی ساده بود انشاالله در بخش منابع یا بعداز اینکه یکسری اطلاعات اولیه در مورد دیپ لرنینگ دادم منابع و نحوه خوندن و پیشرفتن تو این موضوع رو هم میگم .(البته منابع الان نسبت به موقعی که من شروع کردم الحمدالله بیشتر شده و من اونها رو هم مینویسم تا جایی که پیدا کردم اما مسیری که خودم رفتم رو توضیح میدم چون قدم به قدمش تست شده هست.و پیش نیازها رعایت شده) به هر حال برگردیم سر موضوع اصلی.

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

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

خب فهمیدیم که فرآیند یادگیری یه فرایند رفت و برگشتی! هست! حالا اگه ما بیاییم برای اینکه نتیجه یه پیش بینی که غلط بوده رو درست کنیم یه پارامتر (یا حتی یکسری از پارامترها) رو تغییر بدیم ممکنه سیستم نتیجه یه پیش بینی که قبلا درست پیش بینی کرده بود رو اینبار با این تغییر اشتباه پیش بینی کنه! برای همین معمولا یک مدل رو برای تعداد زیادی تکرار میکنیم تا به کارایی خوبی برسیم. این فرآیند پیش بینی و تنظیم سیستم انقدر تکرار میشه تا دیگه مدل رو نشه بهتر از این کرد.

مهندسی ویژگی یا همون Feature Engineering

مهندسی ویژگی یا همون فیچر اینجیرینگ! یعنی استخراج الگوهای مناسب از داده ها که به مدلهای یادگیری ماشین کمک میکنه تا راحت تر بین دسته ها یا کلاسهای مختلف موجود در داده ها تمایز قائل بشن. یعنی چی ؟ یعنی اینکه شما سعی کنید تو داده هایی که دارید یک سری الگوی مشترک پیدا کنید و بعد از همون الگوها برای دسته بندی و یا انجام کار خاصی روی اون داده ها استفاده کنید. بعنوان مثال فرض کنید شما تعداد پیکسلهای سبز و آبی رو بعنوان یک نشونه برای تشخیص اینکه یک حیوان آبزی یا زمینی در تصویر وجود داره یا نه درنظر بگیرید.این ویژگی برای این دلیل برای یه مدل یادگیری ماشین مفیده چرا که تعداد دسته ها( معمولا میگیم کلاسها)ییکه باید برای یه دسته بندی خوب در نظر گرفته بشه رو کاهش میده. البته چندان ویژگی خوبی هم نیست! فرض کنید تو اسمون آبی شما بخوایید از یه پرنده عکس بگیرید! اونوقت با توجه به این الگو سیستم بشما میگه این یه موجود آبزی جدید!! هست! که ما البته میدونیم نیست!! و یا برعکس بریم ته رودخونه یه عکس از یه وزغ یا حتی ماهی بگیریم که کنار یکسری جلبک!! نشسته! خب باز سیستم میگه شما الان داری به یه موجود زمینی (منظورم غیرآبزیه!) نگاه میکنید!!. همین یه مثال نشون میده که مهندسی ویژگی چندان کار ساده ای نیست. و اگه بیشتر تحقیق کنید میبینید که بَـــلــــه! مهندسی ویژگی مثل  هنریه برای خودش! و کار خیلی سختی هم هست .

مهندسی ویژگی مهمترین مهارتی هست که شما برای بدست آوردن نتایج خوب در کارهای مربوط به پیش بینی و… تو حوزه یادگیری ماشین لازم دارید.متاسفانه همونطور که بصورت خیلی ابتدایی بالا دیدیم یادگیری و تسلط پیدا کردن تو این حوزه خیلی سخته چون دیتاست های مختلف و داده های مختلف هرکدوم روشهای خاصی برای مهندسی ویژگی دارن و فقط یکسری قواعد کلی برای این کار وجود داره  که همونطور که گفتم بیشتر یک هنره که طی کار و تجربه زیاد یک نفر بدست میاره.ویژگی هایی که برای یه دیتاست قابل استفاده است برای دیتاستهای دیگه قابل استفاده نیست مثلا فرض کنید ما برای دیتاست حیوانات دریایی مهندسی ویژگی رو انجام دادیم و دیتاست دیتاست بعدی فقط دارای عکس حیونات غیرآبی باشه.! البته من خودم حوزه کاریم ماشین لرنینگ نبوده من مهندسی نرم افزار خوندم و اخیرا به این حوزه کشیده شدم و صحبتهایی که میکنم بیشتر از منابع و چیزهایی هست که دیدم و خودم تا بحال بصورت دستی (به غیر از یکی دو کورس کامیپوتر ویژن که تو دانشگاه داشتم چیزی طراحی نکردم اونم در حد ۴ ۵ تا فیلتر گابور و سوبل که اونم طراحی ما نبوده صرفا استفاده کردیم مثل کلاس اولیا!) کاری نکردم. شما هم قرار نیست کاری بکنید چون قراره این کار طاقت فرسا رو بدیم کامپیوتر برای ما انجام بده و بخوبی هم از پس این کار بر میاد(حالا خودتون میبنید).

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

یادگیری ویژگی یا Feature Learning

الگوریتم های یادگیری ویژگی برای پیدا کردن و استخراج خودکار الگوهای مشترک استفاده میشن تا از ویژگیهای استخراج شده در فراینده های دسته بندی (کِلَسیفیکیشن!) و رگرسیون (رگرشن!) استفاده بشه.یادگیری ویژگی یا همون feature learning رو میشه بعنوان همون مهندسی ویژگی ای دید که بصورت خودکار داره توسط یه الگوریتم انجام میشه.

تو یادگیری عمیق,  ما روشهای مختلفی داریم یکی از اون روش ها استفاده از شبکه های عصبی کانولوشنی هست که الان بهش میگن همون شبکه کانولوشن بعدا به تفصیل در مورد این شبکه و لایه هاش و… توضیح میدم انشاالله اما فعلا همینقدر بدونید که اساس این شبکه , لایه کانولوشنی اون هست (برای همین بهش میگم شبکه کانولوشنی!) .لایه های کانولوشنی یا اصطلاحا convolutional layers تو پیدا کردن ویژگی های موجود در تصاویر خیلی خوب عمل میکنن و اگه تعدادی از این لایه ها رو پشت سر هم قرار بدیم بطور حیرت آوری یه سلسله مراتب از ویژگی های غیر خطی رو یاد میگیرند. یعنی در لایه های ابتدایی مثلا گوشه ها و خطها و لبه ها یادگرفته میشن و بعد از اون به ترتیب ویژگی های سطح بالاتر یادگرفته میشن مثلا اگر تصویر ورودی ما تصویر یک صورت باشه ویژگی هایی مثل بینی, چشمها, گونه ها و صورت در لایه های بعدی (بالاتر) یاد گرفته میشن.در آخر هم لایه های نهایی از این ویژگی های تولید شده برای دسته بندی (کلسیفیکیشن) و یا رگرسیون (رگرشن) استفاده میکنند.(بعدا بصورت کامل در مورد این نوع از شبکه و زیر و بم و همه داستانهاش صحبت میکنیم)

سلسله مراتب ویژگی ها
سلسله مراتب ویژگی ها

همونطور که در تصویر بالا میبنید ویژگی های سلسله مراتبی یادگرفته شده از یه الگوریتم یادگیری عمیق بخوبی مشخص هست. هر کدوم از این ویژگیها رو میشه بعنوان یه فیلتر در نظر گرفت که تصویر ورودی رو برای اون ویژگی (مثلا بینی) فیلتر میکنه.اگه یه ویژگی پیدا بشه, واحد یا واحدهای مسئول (منظور واحدهای پردازشی هست (مثل نورون!ها در شبکه عصبی) بعدا تو توضیحات شبکه کانولوشنی کامل متوجه میشید) فعال سازی های بزرگی رو تولید میکنن که مراحل دسته بندی بعدی میتونن این فعالسازی ها رو دریافت کنن و بعد از اون بعنوان یه نشونه خوب از حضور یک کلاس استفاده کنن.(کلا کار دسته بندی کننده یا همون کلاسیفایر ها اینه. شاید این بخش برای کسایی که شبکه عصبی نخوندن یا سرسری خوندن مبهم باشه نگران نباشید وقتی به بخش شبکه های عصبی و کانولوشن رسیدم همه اینارو متوجه میشید)

 یادگیری عمیق یا همون Deep learning

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

این نحوه کار که ما در یادگیری عمیق میبینیم در اصل ایده گرفته شده از مغز انسان و نحوه کار visual cortext در مغز انسان هست. در مغز انسان هم نورون های مربوط به سلسله مراتب اولیه در ویژوال کورتکس مغز اطلاعاتی که دریافت میکنن حساس به لبه ها و توده ها هستن و بعد خروجی اونها در یک سلسله مراتب بعدی ادامه پیدا میکنه تا اینکه نورونهای به ساختار های پیچیده تری مثل صورتها حساسیت نشون بدن.

ذکر این نکته هم لازمه که یادگیری ویژگی سلسله مراتبی قبل از بوجود اومدن رشته یادگیری عمیق وجود داشته اما معماری های موجود در زمان قدیم از مشکلات عمده ای مثل محو شدن گرادیانت (تو بخش شبکه عصبی توضیح میدیم) رنج میبردن. محوشدگی گرادیانت در اصل به مشکلی گفته میشه که در اون گرادیانت ها انقدر کوچیک میشن که دیگه نمیتونن یک سیگنال یادگیری رو برای لایه های خیلی عمیق ایجاد کنند و بنابراین این معماری ها در مقایسه با الگوریتم های یادگیری کم عمق مثل (support vector machine ها) خیلی بد عمل میکردن.

عبارت دیپ لرنینگ یا همون یادگیری عمیق از وقتی که روشها و استراتژی های جدیدی برای برطرف کردن مشکلات قبلی ارائه شد , سر زبونا افتاد و بطور خاص زمانی که توسط الکس کریژوسکی و جفری هینتون (جف هینتون) تو سال ۲۰۱۲ تونستن با یه شبکه کانولوشنی عمیق رقابت ImageNet رو با موفقیت خیلی خوبی برنده بشن و به مقام اول برسن سرعت گرفت. تقریبا بعد از موفقیت اونها بود که یکدفعه همه متوجه عملی بودن یادگیری عمیق شدن (قبل از اون خالق شبکه های کانولوشنی Yan leCunn تو دهه ۹۰ یه شبکه کانلووشنی ساخته بود که اراقام دست نویس رو تشخیص میداد اندازه تصاویر خیلی کوچیک بود ( ۲۸ در ۲۸ بود بنظرم) و کسی برای کارهای بزرگ و واقعی ازش استفاده نیمکرد چون سخت افزارهای اون موقع انقدر قوی نبودن . تو سال ۲۰۱۲ کریژوسکی با استفاده از GPU ها (دوتا کارت گرافیک GTX580 3Gig ) تونست یه شبکه ۸ لایه ای رو آموزش بده و باعث ایجاد موج جدیدی در این حوزه بشه . (اینم بگم که در مقایسه با دیتاست MNIST که  تصاویر اندازه اشون ۲۸ در۲۸ بود و سیاه و سفید. و تعداد تصاویر کلا ۶۰ هزارتا بود. دیتاست ایمیجنت ۲۰۱۲ بیش از ۱ میلیون و نیم تصاویر رنگی با اندازه ۲۲۷ در ۲۲۷ پیکسل داره که حجم این دیتاست چیزی برابر با ۱۵۰ تا ۲۰۰ گیگابایت میشه!! ورژن ۲۰۱۵ این دیتاست بیش از ۱ ترابایت حجم داره!- پس کاملا مشخصه که چرا یکدفعه از این سال دیپ لرنینگ بشدت محبوب و معروف شد!)بعدا تو یه پست جداگانه بصورت خاص به دلایل رونق دوباره گرفتن این مبحث بعد از یه بازه زمانی نسبتا زیاد میپردازیم انشاالله).

البته قبل از الکس کریژوسکی و جف هینتنون (ایشون خالق RBM ها هم هستن! یکی از دانشمندان معروف دنیا تو حوزه دیپ لرنینگ هستن ایشون) البته در اوائل سال ۲۰۱۰ نشون داده شده بود که استفاده از GPU ها و توابع فعال سازی جدید به غیر از تابع سیگموید میتونه باعث بهتر شدن جریان گرادیانت بشه و اینطور برای آموزش معماری های عمیق بدون مشکلات جدی راه باز شده بود. الکس کریژوسکی (Alex krizhevsky) و جف هینتون (Jeff hinton) هم بعنوان مثال از تابع relu بجای سگموید استفاده کرده بودن . (نگران نباشید در این باره هم توضیح میدیم اینا همه مربوط به شبکه های عصبی و کانولوشنی هست که با خوندن اینا همه چیز میاد دستتون).

تا اینجا ما هر مثالی زدیم در مورد عکس بود و تصاویر . در اصل شبکه های کانولوشنی که یکی از روش های دیپ لرننیگ هستن برای کار با تصاویر ایجاد شده بودن ولی تو حوزه دیپ لرنینگ ما تو زمینه ها پردازش صدا و جریان هم کار میکنیم . به عبارت بهتر الان با استفاده از دیپ لرنینگ فعالیت شناسی هم انجام شده یعنی شما یک فیلمی که تو اینستاگرام یا فیس بوک آپلود میکنید براحتی مشخص میکنن که چه فعالیتی در حال انجام شدن هست. مثلا دارید فوتبال بازی میکنید یا دوچرخه سواری و… این کار از طریق نوع های خاصی از شبکه های عصبی بنام long short term memory recurrrent neural network انجام میشه.

بطور خلاصه باید بگم که تو یادگیری عمیق ما در اینو نوع شبکه ها میایم وابستگی های زمانی رو هم دخالت میدیم . تو شبکه های عصبی recurrent neural network ها دقیقا همینطور هستن . اگه شبکه عصبی خونده باشید مدونید که تو این نوع شبکه ها ورودی شبکه از ورودی قبلی تاثیر میپذیره و اینطور تقریبا یک حافظه تو شبکه عصبی ایجاد شده .پس یادگیری عمیق صرفا در یادگیری ویژگی های سلسله مراتبی غیرخطی عمیق خلاصه نمیشه! بلکه از اون میشه در یادگیری وابستگی های زمانی غیرخطی طولانی در داده های ترتیبی هم استفاده کرد. (نمونه هایی که در مورد تشخیص فعالیت در حال انجام گفتم با استفاده از این نوع شبکه ها بدست اومدن) اکثر الگوریتمهای دیگه ای که روی داده های ترتیبی کار میکنن حافظه ای برای ۱۰ گام زمانی اخیر دارن در حالی که شبکه LSTM (که در سال ۱۹۹۷ توسط Sepp Horchreiter و Jurgen Schmidhuber معرفی شد) به یه شبکه این اجازه رو میده که بتونه فعالیتی رو از صدها گام زمانی قبلتر انتخاب کنه تا با استفاده از اون بتونه پیش بینی دقیقی داشته باشه. شبکه های LSTM طی ده پانزده سال اخیر بهش توجه نشده بود تا اینکه بعد از سال ۲۰۱۳ یکدفعه سر زبونها افتاد! این شبکه به همراه شبکه های کانولوشنی دوتا از نمونه های بسیار موفق تو حوزه دیپ لرنینگ هستن. من خودم تو این حوزه اصلا کار نکردم (LSTM) اما تو زمینه شبکه های کانولوشنی چرا. منابع در این زمینه هم قرار میگیره ولی شاید به خوبی شبکه های کانلووشنی نباشه اما مطمئنا بکار کسی که میخواد کار کنه میاد (مفاهیم اکثرا یکی هستن به جز یکسری تفاوتهای جزئی).

سید حسین حسن پور متی کلایی ۲۱ اسفند ۱۳۹۴

سید حسین حسن پور متی کلایی

درباره ی سید حسین حسن پور متی کلایی

موسس و مدیر سایت. اطلاعات در مورد فعالیت های کاری و تحصیلی : linkedIn . برای ارتباط از بخش تماس با ما یا در باره من استفاده کنید.

مقالات مرتبط

48 دیدگاه در “یادگیری عمیق یا Deep learning چیست؟ بخش اول

    1. سلام.
      خواهش میکنم . انشاالله سعی میکنم بیشتر مطلب بزارم . متاسفانه طی یکی دو هفته اخیر بصور خاص خیلی سرم شلوغ بود. انشاالله سعی میکنم در اسرع وقت مطالب بیشتری بذارم و بیشتر توضیح بدم. در این بین اگر سوالی دارید میتونید بپرسید.
      در پناه حق موفق و سربلند باشید

  1. سلام، بسیار شروع خوبی هست من هم دارم رو این مبحث کار می کنم و این ترم یک درس مرتبت با این موضوع دارم.
    دیپ لرنینگ مثل یک عصای جادویی می مونه، تا اونجایی که اطلاع دارم تقریبا مسئله تشخیص تصویر صورت با ۹۹٫۹۶ درصد دقت حل شد.
    – Image recognition: 3.57 error rate, (ResNet, top-5 test, by MS Research Asia, Dec. 2015)
    – Face recognition: 99.96% accuracy (FaceNet, on LFW dataset, by Google, 2015)
    پست ها تون رو دنبال میکنم، با آرزوی موفقیت شما گام بسیار بزرگی و موثری رو برداشتید، واستون آرزوی موفقیت می کنم.

    1. سلام خیلی ممنونم و متعاقبا منم همین آرزو رو برای شما دارم. در مورد فعالیتهای صورت گرفته هم درسته فعالیتهای خوبی صورت گرفته ولی هنوز مونده . ResNet‌ مایکروسافت نرخ خطای ۵ انتخاب اولش ۳٫۵۷ هست و هنوز نرخ خطای اصلی جای کار داره .از طرفی من اعتقاد راسخ دارم طی دو سه سال آینده ما میریم بطرف کاهش تعداد لایه ها. مثلا resnet‌با اینکه تونسته با ۱۵۰ لایه! تو ایمیج نت به نرخ خطای ۳٫۵ برای ۵ انتخاب اولش برسه همین معماری تو دیتاست CIFAR10 نتونسته state of the art‌رو کنار بزنه و یه شبکه بسیار بسیار کوچیکتر نتایج بهتری گرفته . (البته اینا قابل قیاس نیستن از لحاظ حجم و اندازه و … ) ولی یه نیم نگاه به معماری های دو سه سال اخیر اینو دقیقا نشون میده . مثلا VGGNet‌با اون همه پارامتر رو در مقابل GoogLeNet‌ شما در نظر بگیرید. یا مثلا مدل بایدو که قبل از مایکروسافت state of the art این حوزه بود (نرخ خطای ۵ و خورده ای درصد تقریبا) از یه سوپر کامیپوتر و الگوریتمهای اختصاصی موازی سازی استفاده کرده بود. بعد دیدیم که گوگل چطور با batch normalization‌یی که چند ماه بعدش داد نرخ خطا رو خیلی کاهش داد و بعدش هم تیم مایکروسافت با استفاده از همین batch normalization‌و افزایش تعداد لایه ها شدن state of the art .
      مطمپنم از این به بعد ما میریم سراغ دقت بالاتر با سربار کمتر خصوصا که الگوریتم ها و روشهای مقابله با اورفیتینگ خیلی خوبی هم طی این چند سال بوجود اومده .
      در پناه حق موفق و سربلند باشید

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

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

  3. سلام
    خیلی ممنون بابت مطالب فوق العادتون. خیلی وقت بود می خواست دیپ لرنینگ رو یاد بگیرم ولی انقدر مطالب پرت و پلا بودن که خیلی سخت بود.
    یه سوال هم داشتم از خدمتتون. از شبکه های کانولشون و به طور کلی دیپ لرنینگ میشه برای کلاسیفکیشن مثلا خرابی های قطعه استفاده کرد. مثلا قطعه وضعیت بحرانی ( کلاس ۱) و .. وضعیت معمولی ( کلاس n) رو داره؟
    برای مپ کردن خروجی های پیوسته هم راه حلی وجود داره؟
    سپاس فراوان

  4. سلام سپاسگذارم
    منظورم این بود که خروجی به صورت پیوسته باشه یعنی مثل رگرسیون. خروجی شبکه کانولوشن عمر باقی مانده که یک متغییر پیوسته به جای کلاس ها که گسسته ان رو دراختیارمون بذاره؟

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

    ممنون می شم واقعن پاسخ بفرمایید

    1. سلام .
      من در مورد سوال اولتون نظری ندارم چون کار نکردم تو این زمینه. فکر میکنم تو گروه اگه سوال کنید نتیجه خیلی بهتری بگیرید (اگرم اونجا نگرفتید از Quora و StackOverflow بپرسید که نتیجه بگیرید)
      در مورد سوال دومتون در مورد برتری دیپ لرنینگ نسبت به شیوه های سابق , همه اش بر میگرده به اون مهندسی ویژگی که دیگه توسط ما انجام نمیشه و بصورت خودکار صورت میگیره .همین نکته اس که اونو خیلی خاص و کاربردی کرده .

  6. سلام و وقت بخیر

    اول بی نهایت از کار زیباتون تشکر می کنم و براتون آرزوی موفقیت می کنم
    بعد ی سوال داشتم از خدمتتون:
    توی مطالبتون از حافظه ایجاد شده در شبکه های عصبی صحبت کردین “…مدونید که تو این نوع شبکه ها ورودی شبکه از ورودی قبلی تاثیر میپذیره و اینطور تقریبا یک حافظه تو شبکه عصبی ایجاد شده…” و گفتین که LSTM میتونه تا صدها گام قبلتر رو هم داشته باشه و ببینه و دقیق تر تصمیم بگیره
    میشه اینو بیشتر توضیح بدید؟ این میزان حافظه به چه اندازه هست؟

    1. سلام
      خواهش میکنم خدا رو شکر که مفید بود
      این بحث تو کتاب شبکه های عصبی مارتین هاگان خیلی ساده و قشنگ توضیح داده شده فک کنم فصل ۲ همون اولاش باشه. لینک کتابم تو بخش منابع یادگیری هست. اونو بخونید اگه باز مشکل داشتید بفرمایید که اگر تونستم توضیح بهتری بدم خدمتتون.
      در مورد سوالتون دومتون متوجه نشدم . من هنوز فرصت نکردم برم سراغ LSTM ها البته و یه سری اطلاعات اولیه و ابتدایی دارم. اگه سوال تو این زمینه دارین پیشنهاد میکنم تو گروه بپرسید تا دوستانی که کار کردن جواب بدن
      من هر وقت رفتم سراغ این مبحث زیر و بمش رو مثل شبکه های کانولوشن تو سایت میزارم انشاالله.

  7. سلام من در مورد deeplearning میخوام روی speech recognition یا تصویر کار کنم برا تزم. امکانش هست از شما کمک بخوام؟ مقالاتی رو خوندم. مثلا با deep belief network روی صدا کار کردن. اینکه کدوک الگوریتمو از یادگیری عمیق انتخاب کنم اصلا توی متلب چطور بنویسم؟ خیلی گیجم کرده. خواهشا کمک بفرمایید

    1. سلام .
      بله مشکلی نیست.
      DBN ها الان تقریبا دیگه استفاده نمیشن. بجای اونها شبکه های کانولوشن و LSTM ها خیلی خوب دارن کار میکنن . هم تو حوزه تصویر و هم صدا.
      مطالب سایت رو مطالعه کردید یا نه ؟ اگر نه پیشنهاد میکنم این مطالب رو شروع کنیدو یک دور بخونید
      اگر زبان مشکلی ندارید ویدئو آموزش دانشگاه استنفورد رو حتما ببینید که خیلی خوبه.
      بعدش پایه کار میاد دستتون .
      برای کار تو این حوزه متلب خوب نیست. هرچند برای CNN تولباکس matconvnet خیلی خوبه. اما جاهای دیگه و معماری های دیگه متلب خیلی کاستی داره.
      پیشنهاد میکنم برای شروع به Caffe,Torch,Deeplearning4J,Tensorflow یه نگاهی بندازید. و ببینید از کدوم بیشتر خوشتون میاد.
      من میگم اگر با cnn میخوایید کار کنید برای شروع caffe خوبه. بعدش میتونید برید سراغ گزینه های دیگه اگر نیاز بود.

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

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

  9. سلام دکتر.ممنون از بابت مطالب فوق العادتون
    به نظر شما کسی با شرایط من که یاد SVM رو یه کم بلده چقدر طول میکشه یادگیری عمیق رو بتونه با متلب یا CAFFE بتونه پیاده سازی کنه؟
    پروژم هم تشخیص است.

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

  10. سلام ممنون از سایت خوبتون یه سوال داشتم
    آیا deep learning با شبکه عصبی ارتباط صددرصد داره؟ من میخوام تو زمینه Time series analysis using deep learnin در داده کاوی کار کنم و میخوام بپرسم آیا درگیر مسائل شبکه عصبی میشو یا نه؟ ممنون میشوم اگر پاسخ بدهید

  11. سلام و خسته نباشید . خیلی ممنون بخاطر سایت خوبتون. من دانشجوی ارشد رشته برق گرایش مخابرات سیستم هستم. ب من پیشنهاد شده ک برا پروژه ارشدم روی شبکه عصبی عمیق کار کنم.قبلا در دوران کارشناسی تجربه کوچیک در کار تو حوزه شبکه عصبی رو داشتم. از اونجایی ک شبکه عصبی بیشتر کامپیوتری و هوش مصنوعیه، میخاستم بدونم ک تو مخابرات سیستم کاربرد محسوسی داره؟ و اگر وارد این حوزه بشم از رشته خودم دور نمیشم؟؟ خیلی ممنون میشم اگه راهنماییم کنید

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

  12. سلام و ادب
    الان متلب ۲۰۱۶ رو نصب کردم و وقتی به تولباکسCNN مراجعه میکنم میبینک یه سری توضیحات داره و حتی یک مثال درست و حسابی نداره.یعنی اینقدر متلب توی این حوزه ضعیفه؟
    ممنون

  13. ببخشید برای اینکه استاد راهنمام رو بتونم قانع کنم که بنونم با پایتون کار کنم(چون در پروپوزالم با متلب قید شده) تولباکس رو نشونش بدم بگم مثال نداره درسته؟
    یعنی حرفام درسته یا cnn متلب مثال داره من پیدا نمیکنم؟
    ممنون

    1. مثال که هست اما نه واقعا به اندازه پایتون .
      علاوه بر اون تو متلب تنها چیزی که بدرد میخوره و من اطلاع دارم MatConvNet هست که ازش استفاده میشه .
      پیشنهاد میکنم طرف متلب نرید چون پایتون مطالب خیلی خیلی بیشتری داره و آموزش و راهنمایی و مستندات براش خیلی زیاده
      برای اینکه استادتون رو قانع کنید میتونید از همه فریم ورکهای مطرح این حوزه مثال بیارید که جز Caffe که یه رپر اونم خیلی خیلی محدود داره نسبه به رپر پایتون و مثالها و مستنداتش و matconvnet فریم ورک دیگه ای با متلب کار نمیکنه یا حتی رپر براش ارائه نداده تا جایی که من میدونم و یادمه.
      Tensorflow, torch, caffe و حتی cntk و خیلی های دیگه انتخاب اولشون یا پایتون هست یا یه رپر پایتون هم ارائه کردن و میتونید خیلی راحت به سایتهاشو مراجعه کنید و مستندادشون رو ببینید . من Theano و بلاکس و کراس و… pylearn2 و… که کلا پایتون بیس هستن رو هم نام نبردم!
      کلا انتخاب پایتون خیلی عاقلانه تره در حال حاضر و دستتون رو باز میزاره خیلی زیاد و از خیلی نمونه ها میتونید استفاده کنید.
      به متلب هم میشه گفت نزدیکه و از لحاظ سینتکس هم خیلی راحته

  14. سلام و خسته نباشید
    من قسمت ابزار و نصب caffe رو خوندم ولی ابهام دارم
    اول میخوام caffe رو برای نتلب و بعدش برای پایتون نصب کنم
    در لینک زیر یه سری فایل هست ولی نمیدونم دقیقا کدوم برای متلب و کدوم برای پایتون است؟
    https://github.com/Microsoft/caffe/tree/master
    ممنون

    1. سلام
      شیوه نصب که خیلی سر راسته!
      شما ویژوال استودیو ۲۰۱۳ رو باید نصب کنید، و بعد از پوشه ویندوز فایل Caffe.sln رو اجرا کنید برای کامپایل
      شما وقتی کامپایل رو استارت بزنید خودش کتابخونه های مورد نیازش رو که حدود ۱ گیگ هست دانلود میکنه .
      شما فقط باید یه فایل CommonSettings.props.example رو به CommonSettings.props تغییر نام بدید و بعد اونو از داخل ویژوال استودیو یا یه فایل ادیتور مثل Notepad++ باز کنید (نوت پد خوب نشون نمیده ) . بعد گزینه های کامپایل رپر برای متلب و پایتون مشخص هست که باید False رو به True تنظیم کنید و عمل کامپایل رو شروع کنید.
      (دقت کنید کامپایل رو حالت Debug نباشه . روی Release کامپایل رو انجام بدید )
      بعد که کامپایل با موفقیت انجام شد.
      بر محتوای پوشیه pycaffe رو از پوشه Build\x64\Relase کپی کنید به پوشه Lib\site-packages اناکوندا و بعد هم در برنامه های پایتونتون براحتی ایمپورت کنید. (در ویندوز اناکوندا ۲ پشتیبانی میشه نه ۳ تا جایی که یادم میاد )
      برای متلب هم بر اساس اطلاعاتی که داده شده تو همون صفحه عمل کنید.
      قبل از همه اینها هم کودا ۷٫۵ و cudnn 4 نیاز دارید . (اگه از آخرین بیلد Caffe استفاده میکنید که البته دیگه برنچ مایکروسافت نیست باید cudnn5 رو بگیرید )
      اگر هم مشکلی هست لطفا تو سایت پرسش و پاسخ سوالات رو بپرسید

  15. سلام وقتتون بخیر
    بابت مطالب ارزشمندی که در سایتتون به اشتراک گذاشتین واقعا سپاسگزارم و خدا قوت
    من مطالب ابتدای آشنایی با یادگیری عمیق رو از سایتتون مطالعه کردم و علاقه مندم برای پروژه ی ارشدم تو این زمینه کار کنم میخواستم بپرسم چقدر ارتباط بین این فیلد و رشته من که مهندسی پزشکیه وجود داره؟؟؟ ممنونم اگه راهنماییم کنید.

  16. سلام ممنونم بابت مطالب خوب سایتتون
    من میخوام واسه پایان نامه ارشدم رو این موضوع کار کنم میشه راهنماییم بفرمایید

    Deep Learning of Transferable Representation for Scalable Domain Adaptation

    1. سلام
      شما بنظرم مقالات Knowledge distillation و Fitnet و همینطور Progressive Neural Networks رو بخونید.
      یکسری دیگه هم بود الان حضور ذهن ندارم اما بخش دوم خصوصا اخرای بخش دوم اینجا رو بخونید و رجوع کنید به مقالاتی که اونجا در موردش صحبت شده : https://arxiv.org/abs/1608.06037

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

    1. سلام
      مطالبی که گفته شدن یک منبع ندارن اینا ماحصل چیزهایی هست که من اون زمان خونده بودم . و چیزایی هم که خوندم خیلی زیاده
      کنفرانسهای خیلی زیاد +‌مقالات مختلف .
      اینطور نبوده که یک یا چند مقاله خاص باشه من بیام اینجا بگم این بخش از اینجا گرفته شده و الخ .
      شما بخش پیشینه تحقیق رو حتما بخونید اطلاعات خوب با رفرنسهاش بدست میارید . بخش منابع یادگیری هم بشما کمک میکنه تو این زمینه
      بطور کلی چیزایی که اینجا اومده جزو مبانی اولیه اس که میتونید تو مقالات یان لیکان و مقاله الکس نت Vggnet‌و امثالهم نمونه هایی رو ببینید
      یکسری دیگه هم مربوط به کنفرانس هایی سال ۲۰۱۴ و ۲۰۱۵ تو اکسفورد و چند جا دیگه بوده که الان حضور ذهن ندارم .
      کلا پیدا کردن صحت و سقم این چیزا خیلی راحته بنظرم کتاب ایان گودفیلون از انتشارات MIT‌که تو بخش منابع یادگیری هست ممکنه براتون جذاب باشه. (البته سطحش متوسط به بالا هست)

  18. سلام
    در قسمت توضیحاتتون ه شبکه های lstm اشاره کردین من میخوام در مورد این شبکه بیشتر بدونم شما میتونین کمکم کنین ممنونم

    1. در بخش پرسش و پاسخ سوالهایی کردن و پاسخ ها و همچنین لینک آموزشها داده شده اونها رو حتما ببینید
      خود من هنوز بصورت عملی با lstm کار نکردم و آقای فیاض از من خیلی بهتر هستن که میتونید از ایشون و همچنین بقیه دوستان بیشتر کمک بگیرید.

  19. سلام
    باید بگم بسیار بسیار عالی بود.تشکر میکنم بابت وقتی که گذاشتین.
    یه سوال داشتم شما در مورد کاربرد یادگیری عمیق در طبقه بندی تصاویر اطلاعات دارین؟؟

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *