جریان کار جهانی یادگیری ماشین

  • این فصل شامل موارد زیر است:
  • گام‌های لازم برای چارچوب‌بندی یک مسئله یادگیری ماشین
  • گام‌های لازم برای توسعه یک مدل عملیاتی
  • گام‌های لازم برای استقرار مدل در محیط تولید و نگهداری آن

مقدمه

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

تصور کنید که شرکت مشاوره یادگیری ماشین خود را راه‌اندازی کرده‌اید. شرکت را ثبت می‌کنید، یک وب‌سایت فانتزی راه‌اندازی می‌کنید، به شبکه خود اطلاع می‌دهید. پروژه‌ها سرازیر می‌شوند:

  • یک موتور جستجوی عکس شخصی‌سازی شده برای یک شبکه اجتماعی اشتراک‌گذاری عکس—کلمه “عروسی” را تایپ کنید و تمام عکس‌هایی را که در عروسی‌ها گرفته‌اید، بدون نیاز به هیچ‌گونه برچسب‌گذاری دستی، بازیابی کنید.
  • پرچم‌گذاری محتوای متنی هرزنامه(spam) و توهین‌آمیز در میان پست‌های یک اپلیکیشن چت نوپا.
  • ساخت یک سیستم توصیه‌گر موسیقی برای کاربران یک رادیو آنلاین.
  • تشخیص تقلب کارت اعتباری برای یک وب‌سایت تجارت الکترونیک.
  •  پیش‌بینی نرخ کلیک بر روی تبلیغات نمایشی برای تصمیم‌گیری اینکه کدام تبلیغ در زمان مشخص به کاربر مشخصی نمایش داده شود.
  •   علامت گذاری کوکی‌های غیرعادی روی تسمه نقاله خط تولید کلوچه.
  •   استفاده از تصاویر ماهواره‌ای برای پیش‌بینی مکان سایت‌های باستان‌شناسی هنوز ناشناخته هستند.

——————————————————————

توجه به اخلاق

شما ممکن است گاهی با پروژه‌هایی مواجه شوید که از نظر اخلاقی مشکوک هستند، مانند “ساخت هوش مصنوعی که میزان قابل اعتماد بودن فردی را از روی عکس چهره‌اش رتبه‌بندی یا ارزیابی کند.” اول از همه، اعتبار چنین پروژه‌ای زیر سوال است: مشخص نیست چرا قابل اعتماد بودن باید در چهره کسی منعکس شود. دوم اینکه، چنین وظیفه‌ای راه را به روی انواع مشکلات اخلاقی باز می‌کند.

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

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

—————————————————————————————

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

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

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

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

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

۳. استقرار مدل — کار خود را به ذی‌نفعان (stakeholders) ارائه دهید، مدل را به یک وب سرور، یک برنامه موبایل، یک صفحه وب، یا یک دستگاه تعبیه‌شده (embedded device) ارسال کنید، عملکرد مدل را در محیط واقعی پایش کنید، و شروع به جمع‌آوری داده‌هایی کنید که برای ساخت مدل نسل بعدی به آنها نیاز خواهید داشت.

بیایید وارد جزئیات شویم.

تعریف وظیفه

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

چارچوب‌بندی مسئله (Frame the Problem)

چارچوب‌بندی یک مسئله یادگیری ماشین معمولاً شامل بحث‌های مفصل زیادی با ذی‌نفعان (stakeholders) است. در اینجا سؤالاتی مطرح می‌شوند که باید در صدر ذهنتان باشند:

  • داده‌های ورودی شما چه خواهند بود؟ چه چیزی را می‌خواهید پیش‌بینی کنید؟ شما تنها زمانی می‌توانید چیزی را پیش‌بینی کنید که داده‌های آموزشی در دسترس داشته باشید: برای مثال، تنها زمانی می‌توانید احساس یک نقد فیلم را طبقه‌بندی کنید که هم نقد فیلم و هم حاشیه‌نویسی احساسی مربوط به آن در دسترس باشند. به همین دلیل، در دسترس بودن داده‌ها معمولاً عامل محدودکننده در این مرحله است. در بسیاری از موارد، باید خودتان به جمع‌آوری و حاشیه‌نویسی مجموعه‌داده‌های جدید متوسل شوید (که در بخش بعدی به آن خواهیم پرداخت).
  • با چه نوع وظیفه یادگیری ماشینی روبرو هستید؟ آیا طبقه‌بندی دودویی است؟ طبقه‌بندی چندکلاسه؟ رگرسیون اسکالر؟ رگرسیون برداری؟ طبقه‌بندی چندکلاسه و چندبرچسبی؟ تقسیم‌بندی تصویر (Image segmentation)؟ رتبه‌بندی (Ranking)؟ یا چیز دیگری، مانند خوشه‌بندی، تولید (generation) یا یادگیری تقویتی؟ در برخی موارد، ممکن است یادگیری ماشین حتی بهترین راه برای درک داده‌ها نباشد و باید از چیز دیگری مانند تحلیل آماری قدیمی و ساده استفاده کنید.
  • پروژه موتور جستجوی عکس یک وظیفه طبقه‌بندی چندکلاسه و چندبرچسبی است.
  • پروژه تشخیص هرزنامه یک وظیفه طبقه‌بندی دودویی است. اگر “محتوای توهین‌آمیز” را به عنوان یک کلاس جداگانه تعریف کنید، یک وظیفه طبقه‌بندی سه حالته است.
  • موتور توصیه‌گر موسیقی به نظر می‌رسد که نه از طریق یادگیری عمیق، بلکه از طریق تجزیه ماتریس (matrix factorization) (فیلترینگ مشارکتی) بهتر مدیریت می‌شود.
  • پروژه تشخیص تقلب کارت اعتباری یک وظیفه طبقه‌بندی دودویی است.
  • پروژه پیش‌بینی نرخ کلیک یک وظیفه رگرسیون اسکالر است.
  • تشخیص کلوچه‌های (کوکی‌های) غیرعادی یک وظیفه طبقه‌بندی دودویی است، اما به عنوان مرحله اول به یک مدل تشخیص شیء (object detection model) نیز نیاز دارد تا کلوچه‌ها را در تصاویر خام به درستی برش دهد. توجه داشته باشید که مجموعه تکنیک‌های یادگیری ماشین شناخته شده به عنوان “تشخیص ناهنجاری” در این محیط مناسب نخواهد بود!
  • پروژه یافتن سایت‌های باستان‌شناسی جدید از تصاویر ماهواره‌ای یک وظیفه رتبه‌بندی شباهت تصویر است: شما باید تصاویر جدیدی را بازیابی کنید که بیشترین شباهت را به سایت‌های باستان‌شناسی شناخته شده دارند.
  • راه‌حل‌های موجود چگونه‌اند؟ شاید مشتری شما از قبل یک الگوریتم دست‌ساز داشته باشد که فیلترینگ هرزنامه یا تشخیص تقلب کارت اعتباری را با تعداد زیادی دستور if تو در تو مدیریت می‌کند. شاید یک انسان در حال حاضر مسئول مدیریت دستی فرآیند مورد نظر باشد—نظارت بر نوار نقاله در کارخانه کلوچه و حذف دستی کلوچه‌های بد، یا ساختن لیست‌های پخش توصیه‌های آهنگ برای ارسال به کاربرانی که یک هنرمند خاص را دوست داشتند. باید مطمئن شوید که سیستم‌های موجود و نحوه کار آن‌ها را درک می‌کنید.
  • آیا محدودیت‌های خاصی وجود دارد که باید با آن‌ها کنار بیایید؟ برای مثال، ممکن است متوجه شوید که برنامه‌ای که برای آن یک سیستم تشخیص هرزنامه می‌سازید، به شدت رمزگذاری شده سرتاسری است، بنابراین مدل تشخیص هرزنامه باید روی تلفن کاربر نهایی قرار گیرد و روی یک مجموعه داده خارجی آموزش داده شود. شاید مدل فیلتر کلوچه دارای محدودیت‌های تأخیر (latency) باشد که نیاز به اجرای آن بر روی یک دستگاه تعبیه‌شده (embedded device) در کارخانه دارد تا یک سرور از راه دور. باید تمام زمینه‌ای که کار شما در آن قرار می‌گیرد را درک کنید.

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

  •   شما فرض می‌کنید که هدف‌های شما می‌توانند با توجه به ورودی‌های شما پیش‌بینی شوند.
  •   شما فرض می‌کنید که داده‌های موجود (یا داده‌هایی که به زودی جمع‌آوری خواهید کرد) به اندازه کافی آموزنده هستند تا رابطه بین ورودی‌ها و هدف‌ها را یاد بگیرند.

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

جمع‌آوری یک مجموعه داده

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

  •   پروژه موتور جستجوی عکس مستلزم آن است که ابتدا مجموعه‌ای از برچسب‌هایی را که می‌خواهید طبقه‌بندی کنید، انتخاب کنید—مثلاً ۱۰,۰۰۰ دسته رایج تصویر. سپس باید صدها هزار تصویر آپلودشده توسط کاربران قبلی خود را به صورت دستی با برچسب‌هایی از این مجموعه برچسب‌گذاری کنید.
  •   برای پروژه تشخیص هرزنامه برنامه چت، از آنجا که چت‌های کاربران به صورت سرتاسری رمزگذاری شده‌اند، نمی‌توانید از محتویات آن‌ها برای آموزش مدل استفاده کنید. باید به یک مجموعه داده جداگانه شامل ده‌ها هزار پست رسانه اجتماعی فیلترنشده دسترسی پیدا کنید و آن‌ها را به صورت دستی به عنوان هرزنامه، توهین‌آمیز یا قابل قبول برچسب‌گذاری کنید.
  •   برای موتور توصیه‌گر موسیقی، می‌توانید صرفاً از “لایک” کاربران خود استفاده کنید. نیازی به جمع‌آوری داده جدید نیست. به همین ترتیب برای پروژه پیش‌بینی نرخ کلیک: شما سابقه گسترده‌ای از نرخ کلیک برای تبلیغات گذشته خود دارید که به سال‌ها قبل بازمی‌گردد.
  •   برای مدل علات گذاری کوکی، نیاز خواهید داشت که دوربین‌هایی را بالای تسمه های نقاله نصب کنید تا ده‌ها هزار تصویر جمع‌آوری شود، و سپس کسی باید این تصاویر را به صورت دستی برچسب‌گذاری کند. افرادی که در حال حاضر می‌دانند چگونه این کار را انجام دهند در کارخانه کلوچه کار می‌کنند، اما این کار خیلی دشوار به نظر نمی‌رسد. باید بتوانید افراد را برای انجام آن آموزش دهید.
  •   پروژه تصاویر ماهواره‌ای نیازمند تیمی از باستان‌شناسان خواهد بود تا یک پایگاه داده از سایت‌های مورد علاقه موجود جمع‌آوری کنند، و برای هر سایت باید تصاویر ماهواره‌ای موجود که در شرایط آب و هوایی مختلف گرفته شده‌اند را پیدا کنید. برای به دست آوردن یک مدل خوب، به هزاران سایت مختلف نیاز خواهید داشت.

در فصل ۵ آموختید که توانایی یک مدل برای تعمیم (generalization) تقریباً به طور کامل از ویژگی‌های داده‌هایی که بر روی آن‌ها آموزش دیده است—تعداد نقاط داده‌ای که دارید، قابلیت اطمینان برچسب‌های شما، کیفیت ویژگی‌های شما—ناشی می‌شود. یک مجموعه داده خوب دارایی است که ارزش مراقبت و سرمایه‌گذاری را دارد. اگر ۵۰ ساعت زمان اضافی برای یک پروژه به دست آورید، به احتمال زیاد موثرترین راه برای تخصیص آن، جمع‌آوری داده‌های بیشتر است تا جستجو برای بهبودهای افزایشی مدل.

نکته‌ای که “داده‌ها بیش از الگوریتم‌ها اهمیت دارند” به مشهورترین شکل در مقاله سال ۲۰۰۹ محققان گوگل با عنوان “اثربخشی نامعقول داده” (The Unreasonable Effectiveness of Data) بیان شد (این عنوان برگرفته از مقاله معروف سال ۱۹۶۰ با عنوان “اثربخشی نامعقول ریاضیات در علوم طبیعی” توسط یوجین ویگنر است). این قبل از محبوبیت یادگیری عمیق بود، اما به طرز شگفت‌آوری، ظهور یادگیری عمیق تنها اهمیت داده‌ها را بیشتر کرده است.

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

سرمایه‌گذاری در زیرساخت حاشیه‌نویسی داده (Data Annotation Infrastructure)

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

  •   آیا باید خودتان داده‌ها را حاشیه‌نویسی کنید؟
  •   آیا باید از پلتفرم‌های برون‌سپاری جمعی (crowdsourcing) مانند Mechanical Turk برای جمع‌آوری برچسب‌ها استفاده کنید؟
  •   آیا باید از خدمات یک شرکت تخصصی برچسب‌گذاری داده استفاده کنید؟

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

برای انتخاب بهترین گزینه، محدودیت‌هایی را که با آن‌ها کار می‌کنید در نظر بگیرید:

  •  آیا برچسب‌گذاران داده نیاز به متخصصان موضوع (subject matter experts) دارند، یا هر کسی می‌تواند داده‌ها را حاشیه‌نویسی کند؟ برچسب‌های یک مسئله طبقه‌بندی تصویر گربه در مقابل سگ را هر کسی می‌تواند انتخاب کند، اما برچسب‌های یک وظیفه طبقه‌بندی نژاد سگ به دانش تخصصی نیاز دارند. در همین حال، حاشیه‌نویسی اسکن‌های CT از شکستگی استخوان تقریباً به مدرک پزشکی نیاز دارد.
  •   اگر حاشیه‌نویسی داده نیاز به دانش تخصصی دارد، آیا می‌توانید افراد را برای انجام آن آموزش دهید؟ اگر نه، چگونه می‌توانید به کارشناسان مربوطه دسترسی پیدا کنید؟
  •   آیا خود شما نحوه کارشناسان در ارائه حاشیه‌نویسی‌ها را درک می‌کنید؟ اگر درک نمی‌کنید، باید مجموعه داده خود را به عنوان یک جعبه سیاه (black box) در نظر بگیرید و قادر به انجام مهندسی ویژگی (feature engineering) دستی نخواهید بود—این حیاتی نیست، اما می‌تواند محدودکننده باشد.

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

مراقب داده های غیرمفید باشید

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

فرض کنید در حال توسعه اپلیکیشنی هستید که کاربران می‌توانند از یک بشقاب غذا عکس بگیرند تا نام غذا را پیدا کنند. شما مدلی را با استفاده از عکس‌های یک شبکه اجتماعی اشتراک‌گذاری عکس که در بین علاقه‌مندان به غذا (foodies) محبوب است، آموزش می‌دهید. در زمان استقرار (deployment)، بازخورد کاربران عصبانی شروع به سرازیر شدن می‌کند: برنامه شما در ۸ مورد از ۱۰ مورد، پاسخ اشتباه می‌دهد. چه اتفاقی افتاده است؟ دقت شما در مجموعه آزمایش بالای ۹۰٪ بود! یک نگاه سریع به داده‌های آپلودشده توسط کاربران نشان می‌دهد که آپلودهای عکس با موبایل از غذاهای تصادفی از رستوران‌های تصادفی که با گوشی‌های هوشمند تصادفی گرفته شده‌اند، اصلاً شبیه عکس‌های با کیفیت حرفه‌ای، با نور خوب و اشتهاآوری که مدل را با آن‌ها آموزش دادید، نیستند: داده‌های آموزشی شما نماینده داده‌های تولیدی نبودند. این یک گناه کبیره است—به جهنم یادگیری ماشین خوش آمدید.

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

پدیده مرتبطی که باید از آن آگاه باشید، انحراف مفهوم (concept drift) است. شما تقریباً در تمام مسائل دنیای واقعی، به ویژه آن‌هایی که با داده‌های تولیدشده توسط کاربر سروکار دارند، با انحراف مفهوم روبرو خواهید شد. انحراف مفهوم زمانی رخ می‌دهد که ویژگی‌های داده‌های تولیدی در طول زمان تغییر می‌کنند و باعث کاهش تدریجی دقت مدل می‌شوند. یک موتور توصیه‌گر موسیقی که در سال ۲۰۱۳ آموزش دیده است، ممکن است امروز خیلی مؤثر نباشد. به همین ترتیب، مجموعه داده IMDB که با آن کار کردید در سال ۲۰۱۱ جمع‌آوری شده بود، و مدلی که بر روی آن آموزش دیده بود، احتمالاً در مورد نقدهای سال ۲۰۲۰ به خوبی نقدهای سال ۲۰۱۲ عمل نخواهد کرد، زیرا واژگان، عبارات، و ژانرهای فیلم در طول زمان تکامل می‌یابند. انحراف مفهوم به ویژه در زمینه‌های خصمانه مانند تشخیص تقلب کارت اعتباری، که الگوهای تقلب تقریباً هر روز تغییر می‌کنند، شدید است. مقابله با انحراف مفهوم سریع نیازمند جمع‌آوری مداوم داده، حاشیه‌نویسی، و بازآموزی مدل است.

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

——————————————————————————————

مسئله نمونه‌گیری جهت دار (Sampling Bias)

یکی از موارد به‌ویژه موذیانه و رایج داده‌های غیرنماینده، سوگیری نمونه‌گیری (sampling bias) است. نمونه‌گیری جهت دار زمانی رخ می‌دهد که فرآیند جمع‌آوری داده‌های شما با آنچه سعی در پیش‌بینی آن دارید، تعامل داشته باشد و منجر به اندازه‌گیری‌های سوگیرانه شود. یک مثال تاریخی مشهور در انتخابات ریاست‌جمهوری سال ۱۹۴۸ آمریکا اتفاق افتاد. در شب انتخابات، روزنامه شیکاگو تریبون تیتر “دیویی ترومن را شکست داد” را چاپ کرد. صبح روز بعد، ترومن به عنوان برنده اعلام شد. سردبیر تریبون به نتایج یک نظرسنجی تلفنی اعتماد کرده بود — اما کاربران تلفن در سال ۱۹۴۸ یک نمونه تصادفی و نماینده از جمعیت رأی‌دهنده نبودند. آنها به احتمال زیاد ثروتمندتر، محافظه‌کارتر و متمایل به رأی دادن به دیویی، نامزد جمهوری‌خواه، بودند.

——————————————————————————————                                                                                                

درک داده‌های  خود

برخورد با یک مجموعه داده به عنوان یک جعبه سیاه (black box) کار بسیار نادرستی است. قبل از شروع آموزش مدل‌ها، باید داده‌های خود را بررسی و بصری‌سازی (explore and visualize) کنید تا بینش‌هایی در مورد آنچه که آن را پیش‌بینی‌کننده می‌سازد، به دست آورید. این کار به مهندسی ویژگی (feature engineering) کمک می‌کند و مسائل احتمالی را غربال می‌کند.

  • اگر داده‌های شما شامل تصاویر یا متن زبان طبیعی است، نگاهی مستقیم به چند نمونه (و برچسب‌های آن‌ها) بیندازید.
  • اگر داده‌های شما شامل ویژگی‌های عددی است، ایده خوبی است که هیستوگرام مقادیر ویژگی‌ها را رسم کنید تا دامنه‌ی مقادیر گرفته‌شده و فراوانی مقادیر مختلف را درک کنید.
  • اگر داده‌های شما شامل اطلاعات مکانی است، آن را روی نقشه رسم کنید. آیا الگوهای واضحی ظاهر می‌شوند؟
  • آیا برخی از نمونه‌ها مقادیر از دست رفته (missing values) برای برخی ویژگی‌ها دارند؟ اگر چنین است، باید هنگام آماده‌سازی داده‌ها با این مشکل کنار بیایید (نحوه انجام این کار را در بخش بعدی پوشش خواهیم داد).
  • اگر وظیفه شما یک مسئله طبقه‌بندی است، تعداد نمونه‌های هر کلاس را در داده‌های خود چاپ کنید. آیا کلاس‌ها تقریباً به طور مساوی نمایش داده شده‌اند؟ اگر نه، باید این عدم توازن (imbalance) را در نظر بگیرید.
  • نشت (فاش شدن)هدف (target leaking) را بررسی کنید: وجود ویژگی‌هایی در داده‌های شما که اطلاعاتی در مورد هدف‌ها ارائه می‌دهند و ممکن است در محیط تولید در دسترس نباشند. اگر مدلی را بر روی سوابق پزشکی آموزش می‌دهید تا پیش‌بینی کنید آیا فردی در آینده برای سرطان درمان خواهد شد یا خیر، و سوابق شامل ویژگی “این فرد به سرطان تشخیص داده شده است” باشد، آنگاه هدف‌های شما به طور مصنوعی به داده‌هایتان نشت می‌کنند. همیشه از خود بپرسید، آیا هر ویژگی در داده‌های شما چیزی است که در همان شکل در محیط تولید نیز در دسترس خواهد بود؟

انتخاب یک معیار موفقیت

برای کنترل چیزی، باید بتوانید آن را مشاهده کنید. برای دستیابی به موفقیت در یک پروژه، ابتدا باید آنچه را که “موفقیت” می‌نامید تعریف کنید. دقت (Accuracy)؟ صحت و بازیابی (Precision and recall)؟ نرخ حفظ مشتری (Customer retention rate)؟ معیار موفقیت شما تمام انتخاب‌های فنی شما را در طول پروژه هدایت خواهد کرد. این معیار باید مستقیماً با اهداف سطح بالاتر شما، مانند موفقیت کسب‌وکار مشتری‌تان، همسو باشد.

برای مسائل طبقه‌بندی متوازن (balanced classification problems)، که در آن هر کلاس به طور مساوی محتمل است، دقت (accuracy) و مساحت زیر منحنی مشخصه عملکرد گیرنده (ROC AUC)، معیارهای رایجی هستند. برای مسائل عدم توازن کلاس (class-imbalanced problems)، مسائل رتبه‌بندی، یا طبقه‌بندی چندبرچسبی، می‌توانید از صحت و بازیابی و همچنین یک شکل وزن‌دار از دقت یا ROC AUC استفاده کنید. و غیرعادی نیست که مجبور شوید معیار سفارشی خود را برای اندازه‌گیری موفقیت تعریف کنید. برای درک تنوع معیارهای موفقیت یادگیری ماشین و نحوه ارتباط آنها با دامنه‌های مسئله مختلف، مرور رقابت‌های علم داده در Kaggle (https://kaggle.com) مفید است؛ آن‌ها طیف گسترده‌ای از مسائل و معیارهای ارزیابی را به نمایش می‌گذارند.

توسعه مدل

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

آماده‌سازی داده‌ها

همانطور که قبلاً آموخته‌اید، مدل‌های یادگیری عمیق معمولاً داده‌های خام را مستقیماً دریافت نمی‌کنند. پیش‌پردازش داده (Data preprocessing) با هدف مناسب‌تر کردن داده‌های خام موجود برای شبکه‌های عصبی انجام می‌شود. این شامل برداری‌سازی (vectorization)، نرمال‌سازی (normalization)، یا مدیریت مقادیر از دست رفته (handling missing values) است. بسیاری از تکنیک‌های پیش‌پردازش مختص دامنه هستند (برای مثال، مختص داده‌های متنی یا داده‌های تصویری)؛ ما آنها را در فصل‌های بعدی، همانطور که در مثال‌های عملی با آنها روبرو می‌شویم، پوشش خواهیم داد. فعلاً، مبانی‌ای را که در تمام دامنه‌های داده مشترک هستند، مرور خواهیم کرد.

بردار ‌سازی (Vectorization)

همه ورودی‌ها و هدف‌ها در یک شبکه عصبی معمولاً باید تنسورهایی از داده‌های ممیز شناور (یا، در موارد خاص، تنسورهایی از اعداد صحیح یا رشته‌ها) باشند. هر نوع داده‌ای که نیاز به پردازش آن دارید — صدا، تصاویر، متن — باید ابتدا به تنسور تبدیل شود، گامی که برداری‌سازی داده (data vectorization) نامیده می‌شود. برای مثال، در دو مثال قبلی طبقه‌بندی متن در فصل ۴، ما با متنی شروع کردیم که به صورت لیست‌هایی از اعداد صحیح (نشان‌دهنده دنباله‌ای از کلمات) نمایش داده می‌شد، و از کدگذاری یک-داغ (one-hot encoding) برای تبدیل آن‌ها به تنسوری از داده‌های float32 استفاده کردیم. در مثال‌های طبقه‌بندی ارقام و پیش‌بینی قیمت خانه، داده‌ها به صورت برداری‌شده بودند، بنابراین توانستیم این مرحله را نادیده بگیریم.

نرمال‌سازی مقدار (Value Normalization)

در مثال طبقه‌بندی ارقام MNIST از فصل ۲، ما با داده‌های تصویری شروع کردیم که به صورت اعداد صحیح در محدوده ۰ تا ۲۵۵ کدگذاری شده بودند و مقادیر مقیاس خاکستری را نشان می‌دادند. قبل از اینکه این داده‌ها را به شبکه خود وارد کنیم، باید آن‌ها را به float32 تبدیل کرده و بر ۲۵۵ تقسیم می‌کردیم تا به مقادیر ممیز شناور در محدوده ۰ تا ۱ برسیم. به طور مشابه، هنگام پیش‌بینی قیمت خانه، با ویژگی‌هایی شروع کردیم که دامنه‌های متنوعی داشتند—برخی ویژگی‌ها مقادیر ممیز شناور کوچکی داشتند و برخی دیگر مقادیر صحیح نسبتاً بزرگی داشتند. قبل از اینکه این داده‌ها را به شبکه خود وارد کنیم، باید هر ویژگی را به طور مستقل نرمال‌سازی می‌کردیم تا دارای انحراف معیار ۱ و میانگین ۰ باشد.

به طور کلی، وارد کردن داده‌هایی به یک شبکه عصبی که مقادیر نسبتاً بزرگی (برای مثال، اعداد صحیح چندرقمی، که بسیار بزرگ‌تر از مقادیر اولیه وزن‌های یک شبکه هستند) یا داده‌های ناهمگون (برای مثال، داده‌هایی که یک ویژگی در محدوده ۰ تا ۱ و دیگری در محدوده ۱۰۰ تا ۲۰۰ است) را می‌پذیرند، ایمن نیست. انجام این کار می‌تواند باعث به‌روزرسانی‌های گرادیان بزرگی شود که از همگرایی شبکه جلوگیری می‌کند. برای آسان‌تر کردن یادگیری برای شبکه شما، داده‌های شما باید ویژگی‌های زیر را داشته باشند:

  • مقادیر کوچک داشته باشند — معمولاً، بیشتر مقادیر باید در محدوده ۰ تا ۱ باشند.
  • همگون باشند — همه ویژگی‌ها باید مقادیری در تقریباً یک محدوده مشابه داشته باشند.

علاوه بر این، روش نرمال‌سازی دقیق‌تر زیر رایج است و می‌تواند کمک کند، اگرچه همیشه ضروری نیست (برای مثال، ما این کار را در مثال طبقه‌بندی ارقام انجام ندادیم):

  • هر ویژگی را به طور مستقل نرمال‌سازی کنید تا میانگین آن ۰ باشد.
  • هر ویژگی را به طور مستقل نرمال‌سازی کنید تا انحراف معیار آن ۱ باشد.

این کار با آرایه‌های NumPy آسان است:

mean = train_data.mean(axis=0)

train_data -= mean

std = train_data.std(axis=0)

train_data /= std

test_data -= mean

test_data /= std

با فرض اینکه x یک ماتریس داده دوبعدی با شکل (تعداد نمونه‌ها، تعداد ویژگی‌ها) باشد

مدیریت مقادیر از دست رفته

ممکنه گاهی اوقات توی داده‌هاتون مقادیر از دست رفته‌ای داشته باشید. مثلاً، در مثال قیمت خونه، اولین ویژگی (ستون با شاخص ۰ در داده‌ها) نرخ جرم و جنایت سرانه بود. اگه این ویژگی برای همه نمونه‌ها موجود نبود چی؟ اون وقت توی داده‌های آموزشی یا تستتون مقادیر از دست رفته داشتید.

میشه اون ویژگی رو کلاً نادیده گرفت، اما لزوماً نیازی به این کار نیست.

  • اگه ویژگی دسته‌ای (categorical) هست، بهتره یک دسته جدید ایجاد کنید که به معنای “مقدار از دست رفته است” باشه. مدل به صورت خودکار یاد می‌گیره که این مسئله چه تأثیری روی هدف‌ها داره.
  • اگه ویژگی عددی (numerical) هست، از وارد کردن یک مقدار تصادفی مثل “۰” خودداری کنید. چون ممکنه یک ناپیوستگی توی فضای نهفته‌ای که ویژگی‌هاتون ایجاد می‌کنن به وجود بیاره و تعمیم‌پذیری مدل آموزش‌دیده رو سخت‌تر کنه. در عوض، بهتره مقدار از دست رفته رو با میانگین یا میانه اون ویژگی در مجموعه داده جایگزین کنید. حتی میشه یه مدل رو آموزش داد تا مقدار اون ویژگی رو با توجه به مقادیر بقیه ویژگی‌ها پیش‌بینی کنه.

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

انتخاب پروتکل ارزیابی

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

در فصل ۵، ما سه پروتکل ارزیابی رایج را بررسی کردیم:

  • حفظ یک مجموعه اعتبارسنجی هولدآوت (Holdout validation set) — این روش زمانی مناسب است که داده‌های زیادی دارید.
  • انجام اعتبارسنجی متقاطع K-fold — این انتخاب زمانی درست است که نمونه‌های بسیار کمی برای قابل اعتماد بودن اعتبارسنجی هولدآوت دارید.
  • انجام اعتبارسنجی K-fold تکراری — این روش برای انجام ارزیابی مدل با دقت بالا زمانی که داده کمی در دسترس است، به کار می‌رود.

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

شکست دادن یک خط پایه (Beat a Baseline)یا غلبه بر یک مبنا

هنگامی که شروع به کار روی خود مدل می‌کنید، هدف اولیه شما دستیابی به قدرت آماری (statistical power) است، همانطور که در فصل ۵ دیدید: یعنی توسعه یک مدل کوچک که قادر به شکست دادن یک خط پایه ساده باشد.

در این مرحله، سه مورد مهمی که باید روی آن‌ها تمرکز کنید:

  • مهندسی ویژگی (Feature Engineering) — ویژگی‌های غیرآموزنده را فیلتر کنید (انتخاب ویژگی) و از دانش خود درباره مسئله برای توسعه ویژگی‌های جدید که احتمالاً مفید هستند، استفاده کنید.
  • انتخاب پیش‌فرض‌های معماری صحیح (Selecting the correct architecture priors) — از چه نوع معماری مدلی استفاده خواهید کرد؟ یک شبکه کاملاً متصل، یک شبکه کانولوشنی (convnet)، یک شبکه عصبی بازگشتی (recurrent neural network)، یک ترنسفورمر (Transformer)؟ آیا یادگیری عمیق اصلاً رویکرد خوبی برای این وظیفه است، یا باید از چیز دیگری استفاده کنید؟
  • انتخاب یک پیکربندی آموزشی به اندازه کافی خوب (Selecting a good-enough training configuration) — از چه تابع زیانی باید استفاده کنید؟ چه اندازه دسته‌ای (batch size) و نرخ یادگیری (learning rate)؟

————————————————————————————

انتخاب تابع زیان مناسب

اغلب اوقات، بهینه‌سازی مستقیم برای معیاری که موفقیت در یک مسئله را اندازه‌گیری می‌کند، امکان‌پذیر نیست. گاهی اوقات راه آسانی برای تبدیل یک معیار به یک تابع زیان وجود ندارد؛ توابع زیان، در هر صورت، باید با توجه به تنها یک مینی-بچ (mini-batch) از داده‌ها (در حالت ایده‌آل، یک تابع زیان باید برای تنها یک نقطه داده قابل محاسبه باشد) قابل محاسبه باشند و باید مشتق‌پذیر (differentiable) باشند (در غیر این صورت، نمی‌توانید از پس‌انتشار (backpropagation) برای آموزش شبکه خود استفاده کنید). برای مثال، معیار طبقه‌بندی پرکاربرد ROC AUC را نمی‌توان مستقیماً بهینه کرد. از این رو، در وظایف طبقه‌بندی، معمولاً برای یک معیار جایگزین (proxy metric) برای ROC AUC، مانند cross-entropy، بهینه‌سازی می‌شود. به طور کلی، می‌توانید امیدوار باشید که هرچه cross-entropy کمتر شود، ROC AUC بالاتر خواهد بود.

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

انتخاب فعال‌سازی لایه آخر و تابع زیان مناسب برای مدل شما

نوع مسئله  (Problem type)تابع فعال‌سازی لایه آخر  (Last-layer activation)تابع خطا  (Loss function)
طبقه‌بندی دودویی (Binary classification)sigmoidbinary_crossentropy
طبقه‌بندی چندکلاسه، تک‌برچسبی (Multiclass, single-label classification)softmaxcategorical_crossentropy
طبقه‌بندی چندکلاسه، چندبرچسبی (Multiclass, multilabel classification)sigmoidbinary_crossentropy

—————————————————————————————

برای اکثر مسائل، قالب‌های از پیش موجودی وجود دارد که می‌توانید از آن‌ها شروع کنید. شما اولین نفری نیستید که سعی می‌کنید یک تشخیص‌دهنده هرزنامه، یک موتور توصیه‌گر موسیقی یا یک طبقه‌بند تصویر بسازید. مطمئن شوید که پیشینه تحقیق (prior art) را بررسی می‌کنید تا تکنیک‌های مهندسی ویژگی و معماری‌های مدل را که به احتمال زیاد در وظیفه شما خوب عمل می‌کنند، شناسایی کنید. توجه داشته باشید که همیشه نمی‌توان به قدرت آماری (statistical power) دست یافت. اگر پس از تلاش با چندین معماری معقول، نمی‌توانید یک خط پایه ساده را شکست دهید، ممکن است پاسخ به سوالی که می‌پرسید در داده‌های ورودی وجود نداشته باشد. به خاطر داشته باشید که شما دو فرضیه را مطرح می‌کنید:

  • شما فرض می‌کنید که خروجی‌های شما می‌توانند با توجه به ورودی‌های شما پیش‌بینی شوند.
  • شما فرض می‌کنید که داده‌های موجود به اندازه کافی آموزنده هستند تا رابطه بین ورودی‌ها و خروجی‌ها را یاد بگیرند.

ممکن است این فرضیات نادرست باشند، در این صورت باید به نقطه شروع برگردید.

مقیاس‌بندی به بالا: توسعه مدلی که بیش‌برازش می‌کند

هنگامی که مدلی با قدرت آماری (statistical power) به دست آورده‌اید، سوال این است که آیا مدل شما به اندازه کافی قدرتمند است؟ آیا لایه‌ها و پارامترهای کافی برای مدل‌سازی صحیح مسئله مورد نظر را دارد؟ برای مثال، یک مدل رگرسیون لجستیک در MNIST قدرت آماری دارد، اما برای حل خوب مسئله کافی نخواهد بود. به یاد داشته باشید که کشمکش جهانی در یادگیری ماشین بین بهینه‌سازی و تعمیم است. مدل ایده‌آل مدلی است که دقیقاً در مرز بین کم‌برازش (underfitting) و بیش‌برازش (overfitting)، بین ظرفیت ناکافی و ظرفیت بیش از حد قرار دارد. برای اینکه بفهمید این مرز کجاست، ابتدا باید از آن عبور کنید.

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

۱. لایه‌ها را اضافه کنید.

۲. لایه‌ها را بزرگ‌تر کنید.

۳. برای دوره‌های (epochs) بیشتری آموزش دهید.

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

منظم‌سازی و تنظیم مدل

هنگامی که به قدرت آماری (statistical power) دست یافتید و قادر به بیش‌برازش (overfit) هستید، می‌دانید که در مسیر درستی قرار دارید. در این مرحله، هدف شما به حداکثر رساندن عملکرد تعمیم (generalization performance) می‌شود.

این مرحله بیشترین زمان را خواهد برد: شما بارها مدل خود را تغییر می‌دهید، آن را آموزش می‌دهید، روی داده‌های اعتبارسنجی خود (در این مرحله نه داده‌های آزمایش) ارزیابی می‌کنید، دوباره آن را تغییر می‌دهید و تکرار می‌کنید تا زمانی که مدل به بهترین شکل ممکن برسد. در اینجا کارهایی که باید امتحان کنید:

  • معماری‌های مختلف را امتحان کنید؛ لایه‌ها را اضافه یا حذف کنید.
  • دراپ‌اوت (dropout) اضافه کنید.
  • اگر مدل شما کوچک است، منظم‌سازی L1 یا L2 اضافه کنید.
  • فراپارامترهای (hyperparameters) مختلف (مانند تعداد واحدها در هر لایه یا نرخ یادگیری بهینه‌ساز) را امتحان کنید تا پیکربندی بهینه را بیابید.
  • به صورت اختیاری، روی سازماندهی داده (data curation) یا مهندسی ویژگی (feature engineering) تکرار کنید: داده‌های بیشتری جمع‌آوری و حاشیه‌نویسی کنید، ویژگی‌های بهتر توسعه دهید، یا ویژگی‌هایی که مفید به نظر نمی‌رسند را حذف کنید.

می‌توان بخش بزرگی از این کار را با استفاده از نرم‌افزار تنظیم خودکار فراپارامترها، مانند KerasTuner، خودکار کرد. این موضوع را در فصل ۱۳ پوشش خواهیم داد.

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

هنگامی که یک پیکربندی مدل رضایت‌بخش را توسعه دادید، می‌توانید مدل نهایی تولید خود را بر روی تمام داده‌های موجود (آموزش و اعتبارسنجی) آموزش دهید و برای آخرین بار آن را روی مجموعه آزمایش ارزیابی کنید. اگر مشخص شود که عملکرد روی مجموعه آزمایش به طور قابل توجهی بدتر از عملکرد اندازه‌گیری شده در داده‌های اعتبارسنجی است، این ممکن است به این معنی باشد که یا رویه اعتبارسنجی شما در نهایت قابل اعتماد نبوده است، یا اینکه در حین تنظیم پارامترهای مدل شروع به بیش‌برازش روی داده‌های اعتبارسنجی کرده‌اید. در این صورت، ممکن است بخواهید به یک پروتکل ارزیابی قابل اعتمادتر (مانند اعتبارسنجی K-fold تکراری) روی آورید.

استقرار مدل (Deploy the Model)

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

توضیح کار به ذی‌نفعان و تعیین انتظارات

موفقیت و اعتماد مشتری در گرو برآورده کردن یا فراتر رفتن مداوم از انتظارات مردم است. سیستمی که شما ارائه می‌دهید تنها نیمی از این تصویر است؛ نیمه دیگر، تعیین انتظارات مناسب قبل از راه‌اندازی است.

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

آن‌ها همچنین ممکن است انتظار عملکرد در سطح انسان را داشته باشند، به خصوص برای فرآیندهایی که قبلاً توسط انسان‌ها انجام می‌شدند. بیشتر مدل‌های یادگیری ماشین، به دلیل اینکه (به طور ناقص) برای تقریب برچسب‌های تولید شده توسط انسان آموزش دیده‌اند، هرگز به آن سطح نمی‌رسند. شما باید انتظارات عملکرد مدل را به وضوح منتقل کنید. از استفاده از عبارات انتزاعی مانند “مدل دارای ۹۸٪ دقت است” (که بیشتر مردم به طور ذهنی آن را ۱۰۰٪ گرد می‌کنند) خودداری کنید و ترجیح دهید، برای مثال، در مورد نرخ‌های مثبت کاذب و منفی کاذب صحبت کنید. می‌توانید بگویید، “با این تنظیمات، مدل تشخیص تقلب نرخ منفی کاذب ۵٪ و نرخ مثبت کاذب ۲.۵٪ خواهد داشت. هر روز، به طور متوسط ۲۰۰ تراکنش معتبر به عنوان تقلبی پرچم‌گذاری شده و برای بررسی دستی ارسال می‌شوند، و به طور متوسط ۱۴ تراکنش تقلبی از دست می‌روند. به طور متوسط ۲۶۶ تراکنش تقلبی به درستی شناسایی می‌شوند.” عملکرد مدل را به وضوح با اهداف کسب‌وکار مرتبط کنید.

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

ارسال یک مدل استنباطی

یک پروژه یادگیری ماشین زمانی به پایان نمی‌رسد که شما به یک نوت‌بوک Colab می‌رسید که می‌تواند یک مدل آموزش‌دیده را ذخیره کند. شما به ندرت دقیقاً همان شیء مدل پایتون را که در طول آموزش دستکاری کردید، به تولید می‌رسانید.

اول، ممکن است بخواهید مدل خود را به چیزی غیر از پایتون صادر کنید:

  • محیط تولید شما ممکن است اصلاً از پایتون پشتیبانی نکند — برای مثال، اگر یک برنامه موبایل یا یک سیستم تعبیه‌شده باشد.
  • اگر بقیه برنامه به زبان پایتون نباشد (می‌تواند به JavaScript، ++ C ، و غیره باشد)، استفاده از پایتون برای سرویس‌دهی یک مدل ممکن است سربار قابل توجهی را به همراه داشته باشد.

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

بیایید نگاهی سریع به گزینه‌های مختلف استقرار مدل که در دسترس دارید، بیندازیم.

استقرار مدل به عنوان یک REST API

این شاید رایج‌ترین راه برای تبدیل یک مدل به یک محصول باشد: TensorFlow را روی یک سرور یا نمونه ابری نصب کنید و پیش‌بینی‌های مدل را از طریق یک REST API پرس‌وجو کنید. می‌توانید اپلیکیشن سرویس‌دهی خود را با استفاده از Flask (یا هر کتابخانه توسعه وب پایتون دیگر) بسازید، یا از کتابخانه خود TensorFlow برای ارسال مدل‌ها به عنوان API، به نام TensorFlow Serving (www.tensorflow.org/tfx/guide/serving)، استفاده کنید. با TensorFlow Serving، می‌توانید یک مدل Keras را در چند دقیقه مستقر کنید.

شما باید از این پیکربندی استقرار در موارد زیر استفاده کنید:

  • کاربردی که پیش‌بینی مدل را مصرف خواهد کرد، دسترسی قابل اعتمادی به اینترنت خواهد داشت (بدیهی است). برای مثال، اگر کاربرد شما یک برنامه موبایل است، سرویس‌دهی پیش‌بینی‌ها از یک API راه دور به این معنی است که برنامه در حالت پرواز یا در محیطی با اتصال کم قابل استفاده نخواهد بود.
  • کاربرد الزامات تأخیر (latency) سخت‌گیرانه‌ای ندارد: رفت و برگشت درخواست، استنباط و پاسخ معمولاً حدود 500 میلی‌ثانیه طول می‌کشد.
  • داده‌های ورودی ارسال شده برای استنباط بسیار حساس نیستند: داده‌ها باید به صورت رمزگشایی نشده روی سرور در دسترس باشند، زیرا مدل باید آن‌ها را ببیند (اما توجه داشته باشید که باید از رمزگذاری SSL برای درخواست و پاسخ HTTP استفاده کنید).

برای مثال، پروژه موتور جستجوی تصویر، سیستم توصیه‌گر موسیقی، پروژه تشخیص تقلب کارت اعتباری و پروژه تصاویر ماهواره‌ای، همگی برای سرویس‌دهی از طریق REST API مناسب هستند.

یک سوال مهم هنگام استقرار مدل به عنوان یک REST API این است که آیا می‌خواهید کد را خودتان میزبانی کنید یا می‌خواهید از یک سرویس ابری شخص ثالث کاملاً مدیریت‌شده استفاده کنید. برای مثال، Cloud AI Platform، محصول گوگل، به شما امکان می‌دهد مدل TensorFlow خود را به سادگی در Google Cloud Storage (GCS) آپلود کنید و یک نقطه پایانی API برای پرس‌وجو از آن به شما می‌دهد. این سرویس به جزئیات عملی بسیاری مانند دسته‌بندی پیش‌بینی‌ها، توازن بار و مقیاس‌بندی رسیدگی می‌کند.

استقرار مدل روی یک دستگاه

گاهی اوقات، ممکن است نیاز داشته باشید مدل شما روی همان دستگاهی که برنامه استفاده‌کننده از آن را اجرا می‌کند، قرار گیرد—شاید یک گوشی هوشمند، یک CPU ARM تعبیه‌شده روی یک ربات، یا یک میکروکنترلر روی یک دستگاه کوچک. ممکن است دوربینی را دیده باشید که قادر به تشخیص خودکار افراد و چهره‌ها در صحنه‌هایی است که شما به سمت آن گرفته‌اید: این احتمالاً یک مدل یادگیری عمیق کوچک بود که مستقیماً روی دوربین اجرا می‌شد.

شما باید از این پیکربندی در موارد زیر استفاده کنید:

  • مدل شما دارای محدودیت‌های تأخیر سخت‌گیرانه است یا نیاز به اجرا در محیطی با اتصال کم دارد. اگر در حال ساخت یک برنامه واقعیت افزوده فراگیر هستید، پرس‌وجو از یک سرور راه دور گزینه مناسبی نیست.
  • مدل شما می‌تواند به اندازه کافی کوچک شود تا تحت محدودیت‌های حافظه و توان دستگاه هدف اجرا شود. می‌توانید از TensorFlow Model Optimization Toolkit برای کمک به این کار استفاده کنید (www.tensorflow.org/model_optimization).
  • دستیابی به بالاترین دقت ممکن برای وظیفه شما حیاتی نیست. همیشه یک موازنه بین کارایی زمان اجرا و دقت وجود دارد، بنابراین محدودیت‌های حافظه و توان اغلب شما را ملزم می‌کند مدلی را ارسال کنید که به خوبی بهترین مدلی نیست که می‌توانید روی یک GPU بزرگ اجرا کنید.
  • داده‌های ورودی به شدت حساس هستند و بنابراین نباید در یک سرور راه دور رمزگشایی شوند.

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

برای استقرار یک مدل Keras روی گوشی هوشمند یا دستگاه تعبیه‌شده، راه‌حل اصلی شما TensorFlow Lite (www.tensorflow.org/lite) است. این یک چارچوب برای استنباط یادگیری عمیق کارآمد روی دستگاه است که روی گوشی‌های هوشمند Android و iOS، و همچنین کامپیوترهای مبتنی بر ARM64، Raspberry Pi، یا برخی میکروکنترلرها اجرا می‌شود. این شامل یک مبدل است که می‌تواند به سادگی مدل Keras شما را به فرمت TensorFlow Lite تبدیل کند.

استقرار مدل در مرورگر

یادگیری عمیق اغلب در برنامه‌های جاوا اسکریپت مبتنی بر مرورگر یا دسکتاپ استفاده می‌شود. در حالی که معمولاً امکان‌پذیر است که برنامه یک مدل راه دور را از طریق REST API پرس‌وجو کند، مزایای کلیدی در اجرای مستقیم مدل در مرورگر، روی کامپیوتر کاربر (با استفاده از منابع GPU در صورت در دسترس بودن) وجود دارد.

از این تنظیمات در موارد زیر استفاده کنید:

  • می‌خواهید محاسبات را به کاربر نهایی منتقل کنید، که می‌تواند هزینه‌های سرور را به طرز چشمگیری کاهش دهد.
  • داده‌های ورودی باید روی کامپیوتر یا گوشی کاربر نهایی بمانند. برای مثال، در پروژه تشخیص هرزنامه ما، نسخه وب و نسخه دسکتاپ برنامه چت (که به عنوان یک برنامه کراس‌پلتفرم نوشته شده در جاوا اسکریپت پیاده‌سازی شده است) باید از یک مدل اجرا شده محلی استفاده کنند.
  • برنامه شما دارای محدودیت‌های تأخیر سخت‌گیرانه است. در حالی که مدلی که روی لپ‌تاپ یا گوشی هوشمند کاربر نهایی اجرا می‌شود احتمالاً کندتر از مدلی است که روی یک GPU بزرگ در سرور شما اجرا می‌شود، اما شما ۱۰۰ میلی‌ثانیه اضافی رفت و برگشت شبکه را ندارید.
  • نیاز دارید برنامه شما پس از دانلود و کش شدن مدل، بدون اتصال کار کند.

شما فقط در صورتی باید این گزینه را انتخاب کنید که مدل شما به اندازه کافی کوچک باشد که CPU، GPU یا RAM لپ‌تاپ یا گوشی هوشمند کاربر شما را اشغال نکند. علاوه بر این، از آنجایی که کل مدل روی دستگاه کاربر دانلود می‌شود، باید مطمئن شوید که هیچ چیز در مورد مدل نیازی به محرمانه ماندن ندارد. توجه داشته باشید که با توجه به یک مدل یادگیری عمیق آموزش‌دیده، معمولاً امکان بازیابی برخی اطلاعات در مورد داده‌های آموزشی وجود دارد: بهتر است مدل آموزش‌دیده خود را در صورتی که روی داده‌های حساس آموزش دیده است، عمومی نکنید. برای استقرار یک مدل در جاوا اسکریپت، اکوسیستم TensorFlow شامل TensorFlow.js (www.tensorflow.org/js) است، یک کتابخانه جاوا اسکریپت برای یادگیری عمیق که تقریباً تمام API Keras (که در ابتدا با نام کاری WebKeras توسعه یافته بود) و همچنین بسیاری از APIهای TensorFlow سطح پایین‌تر را پیاده‌سازی می‌کند. می‌توانید به راحتی یک مدل Keras ذخیره شده را به TensorFlow.js وارد کنید تا آن را به عنوان بخشی از برنامه جاوا اسکریپت مبتنی بر مرورگر یا برنامه دسکتاپ Electron خود پرس‌وجو کنید.

بهینه‌سازی مدل استنباطی

بهینه‌سازی مدل شما برای استنباط، به ویژه هنگام استقرار در محیطی با محدودیت‌های سخت‌گیرانه در توان و حافظه موجود (گوشی‌های هوشمند و دستگاه‌های تعبیه‌شده) یا برای کاربردهایی با الزامات تأخیر پایین، اهمیت ویژه‌ای دارد. شما همیشه باید به دنبال بهینه‌سازی مدل خود قبل از وارد کردن آن به TensorFlow.js یا صادر کردن آن به TensorFlow Lite باشید.

دو تکنیک بهینه‌سازی محبوب وجود دارد که می‌توانید اعمال کنید:

  • هرس وزن (Weight pruning) — هر ضریب در یک تنسور وزن به یک اندازه در پیش‌بینی‌ها نقش ندارد. می‌توان با نگه‌داشتن تنها مهم‌ترین ضرایب، تعداد پارامترها را در لایه‌های مدل شما به طور قابل توجهی کاهش داد. این کار حافظه و ردپای محاسباتی مدل شما را کاهش می‌دهد، با هزینه کوچکی در معیارهای عملکرد. با تصمیم‌گیری در مورد میزان هرسی که می‌خواهید اعمال کنید، شما کنترل موازنه بین اندازه و دقت را در دست دارید.
  • کوانتیزاسیون وزن (Weight quantization) — مدل‌های یادگیری عمیق با وزن‌های ممیز شناور تک‌دقت (float32) آموزش داده می‌شوند. با این حال، می‌توان وزن‌ها را به اعداد صحیح ۸ بیتی علامت‌دار (int8) کوانتیزه کرد تا یک مدل فقط برای استنباط به دست آید که یک چهارم اندازه اصلی است اما دقت نزدیک به مدل اصلی را حفظ می‌کند.

اکوسیستم TensorFlow شامل یک کیت ابزار هرس وزن و کوانتیزاسیون (www.tensorflow.org/model_optimization) است که به طور عمیقی با API Keras یکپارچه شده است.

پایش یا نظارت مدل شما در محیط واقعی

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

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

  • آیا مشارکت کاربر در رادیو آنلاین شما پس از استقرار سیستم توصیه‌گر موسیقی جدید افزایش یافته یا کاهش یافته است؟ آیا میانگین نرخ کلیک بر روی تبلیغات پس از تغییر به مدل جدید پیش‌بینی نرخ کلیک افزایش یافته است؟ استفاده از تست A/B تصادفی را برای جدا کردن تأثیر خود مدل از سایر تغییرات در نظر بگیرید: زیرمجموعه‌ای از موارد باید از طریق مدل جدید پردازش شوند، در حالی که زیرمجموعه کنترلی دیگر باید به روند قدیمی ادامه دهد. هنگامی که تعداد کافی از موارد پردازش شدند، تفاوت در نتایج بین این دو احتمالاً به مدل قابل انتساب است.
  • در صورت امکان، یک بازبینی دستی منظم از پیش‌بینی‌های مدل بر روی داده‌های تولیدی انجام دهید. به طور کلی امکان‌پذیر است که از همان زیرساخت برای حاشیه‌نویسی داده‌ها استفاده کنید: بخشی از داده‌های تولیدی را برای حاشیه‌نویسی دستی ارسال کنید و پیش‌بینی‌های مدل را با حاشیه‌نویسی‌های جدید مقایسه کنید. برای مثال، باید حتماً این کار را برای موتور جستجوی تصویر و سیستم پرچم‌گذاری کوکی‌های معیوب انجام دهید.
  • هنگامی که بازبینی‌های دستی غیرممکن است، روش‌های ارزیابی جایگزین مانند نظرسنجی از کاربران را در نظر بگیرید (برای مثال، در مورد سیستم پرچم‌گذاری هرزنامه و محتوای توهین‌آمیز).

نگهداری مدل شما

در نهایت، هیچ مدلی برای همیشه دوام نمی‌آورد. شما قبلاً در مورد انحراف مفهوم (concept drift) آموخته‌اید: با گذشت زمان، ویژگی‌های داده‌های تولیدی شما تغییر می‌کند و به تدریج عملکرد و ارتباط مدل شما را کاهش می‌دهد. طول عمر سیستم توصیه‌گر موسیقی شما بر حسب هفته‌ها شمرده می‌شود. برای سیستم‌های تشخیص تقلب کارت اعتباری، این زمان روزها خواهد بود. در بهترین حالت برای موتور جستجوی تصویر، چند سال.

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

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

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

خلاصه

  • هنگامی که یک پروژه جدید یادگیری ماشین را به عهده می‌گیرید، ابتدا مسئله موجود را تعریف کنید:
  • زمینه گسترده‌تر آنچه را که قصد انجام آن را دارید درک کنید — هدف نهایی چیست و محدودیت‌ها کدامند؟
  • یک مجموعه داده جمع‌آوری و حاشیه‌نویسی کنید؛ اطمینان حاصل کنید که داده‌های خود را عمیقاً درک می‌کنید.
  • نحوه اندازه‌گیری موفقیت برای مسئله خود را انتخاب کنید — چه معیارهایی را در داده‌های اعتبارسنجی خود پایش خواهید کرد؟
  • هنگامی که مسئله را درک کردید و یک مجموعه داده مناسب دارید، یک مدل توسعه دهید:
  • داده‌های خود را آماده کنید.
  • پروتکل ارزیابی خود را انتخاب کنید: اعتبارسنجی هولدآوت؟ اعتبارسنجی K-fold؟ از کدام بخش از داده‌ها باید برای اعتبارسنجی استفاده کنید؟
  • به قدرت آماری دست یابید: یک خط پایه ساده را شکست دهید.
  • مقیاس را بالا ببرید: مدلی را توسعه دهید که بتواند بیش‌برازش کند.
  • مدل خود را منظم‌سازی (regularize) کنید و فراپارامترهای آن را بر اساس عملکرد روی داده‌های اعتبارسنجی تنظیم کنید. بسیاری از تحقیقات یادگیری ماشین تمایل دارند فقط روی این مرحله تمرکز کنند، اما تصویر بزرگ را در ذهن داشته باشید.
  • هنگامی که مدل شما آماده است و عملکرد خوبی روی داده‌های آزمایش نشان می‌دهد، زمان استقرار (deployment) است:
  • ابتدا، مطمئن شوید که انتظارات مناسبی را با ذی‌نفعان تعیین می‌کنید.
  • یک مدل نهایی را برای استنباط (inference) بهینه‌سازی کنید و مدل را به محیط استقرار انتخابی خود ارسال کنید – سرور وب، موبایل، مرورگر، دستگاه تعبیه‌شده و غیره.
  • عملکرد مدل خود را در محیط تولید پایش کنید و به جمع‌آوری داده ادامه دهید تا بتوانید نسل بعدی مدل را توسعه دهید.

نویسنده

دکتر محمدرضا عاطفی

عضو هیئت علمی دانشگاه
رئیس هیئت مدیره گروه ناب
هم بنیان گذار شرکت دانش بنیان
مشاور شرکت ها و سازمان های بزرگ کشور

حوزه های فعالیت

مقالات مرتبط

نظرات و انتقادات

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

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