رفتن به محتوا

فصل ۶: گردش‌کار جهانی یادگیری ماشین

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

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

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

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

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

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

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

بیایید شیرجه بزنیم.

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

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

  • داده‌های ورودی شما چه خواهند بود؟ چه چیزی را سعی در پیش‌بینی دارید؟ شما فقط می‌توانید یاد بگیرید چیزی را پیش‌بینی کنید اگر داده‌های آموزشی در دسترس داشته باشید: برای مثال، شما فقط می‌توانید یاد بگیرید احساسات نقدهای فیلم را طبقه‌بندی کنید اگر هم نقدهای فیلم و هم حاشیه‌نویسی‌های احساسات در دسترس باشند. به این ترتیب، در دسترس بودن داده معمولاً عامل محدودکننده در این مرحله است. در بسیاری از موارد، باید به جمع‌آوری و حاشیه‌نویسی مجموعه‌داده‌های جدید خودتان متوسل شوید (که در بخش بعدی پوشش می‌دهیم).
  • با چه نوع وظیفهٔ یادگیری ماشین روبرو هستید؟ آیا طبقه‌بندی دودویی است؟ طبقه‌بندی چندکلاسه؟ رگرسیون اسکالر؟ رگرسیون برداری؟ طبقه‌بندی چندکلاسه و چندبرچسبی؟ تقسیم‌بندی تصویر؟ رتبه‌بندی؟ چیز دیگری، مانند خوشه‌بندی، تولید یا یادگیری تقویتی؟ در برخی موارد، ممکن است یادگیری ماشین حتی بهترین راه برای درک داده‌های شما نباشد و باید از چیز دیگری مانند تحلیل آماری سادهٔ قدیمی استفاده کنید:
    • پروژهٔ موتور جستجوی عکس یک وظیفهٔ طبقه‌بندی چندکلاسه و چندبرچسبی است.
    • پروژهٔ تشخیص اسپم یک وظیفهٔ طبقه‌بندی دودویی است. اگر «محتوای توهین‌آمیز» را به‌عنوان یک کلاس جداگانه تنظیم کنید، یک وظیفهٔ طبقه‌بندی سه‌گانه است.
    • موتور توصیهٔ موسیقی معلوم می‌شود که بهتر است نه از طریق یادگیری عمیق، بلکه از طریق فاکتورسازی ماتریس (فیلتر کردن مشارکتی) مدیریت شود.
    • پروژهٔ تشخیص تقلب در کارت اعتباری یک وظیفهٔ طبقه‌بندی دودویی است.
    • پروژهٔ پیش‌بینی نرخ کلیک یک وظیفهٔ رگرسیون اسکالر است.
    • تشخیص کوکی ناهنجار یک وظیفهٔ طبقه‌بندی دودویی است، اما همچنین نیاز به یک مدل تشخیص شیء به‌عنوان مرحلهٔ اول برای برش صحیح کوکی‌ها در تصاویر خام خواهد داشت. توجه داشته باشید که مجموعهٔ تکنیک‌های یادگیری ماشین شناخته‌شده به‌عنوان «تشخیص ناهنجاری» در این تنظیم مناسب نخواهد بود!
    • پروژهٔ یافتن سایت‌های باستان‌شناسی جدید از تصاویر ماهواره‌ای یک وظیفهٔ رتبه‌بندی شباهت تصویر است: باید تصاویر جدیدی را که بیشتر شبیه سایت‌های باستان‌شناسی شناخته‌شده هستند بازیابی کنید.
  • راه‌حل‌های موجود چگونه هستند؟ شاید مشتری شما از قبل یک الگوریتم دست‌ساز دارد که فیلتر کردن اسپم یا تشخیص تقلب در کارت اعتباری را با انبوهی از دستورات if تودرتو مدیریت می‌کند. شاید یک انسان در حال حاضر فرآیند مورد نظر را به‌صورت دستی مدیریت می‌کند — نظارت بر نوار نقاله در کارخانهٔ کوکی و حذف دستی کوکی‌های بد، یا ساخت لیست‌های پخش توصیهٔ آهنگ برای ارسال به کاربرانی که از یک هنرمند خاص خوششان آمده است. باید مطمئن شوید که چه سیستم‌هایی از قبل وجود دارند و چگونه کار می‌کنند.
  • آیا محدودیت‌های خاصی وجود دارد که باید با آن‌ها سر و کار داشته باشید؟ برای مثال، ممکن است دریابید که برنامه‌ای که برای آن یک سیستم تشخیص اسپم می‌سازید کاملاً رمزنگاری سرتاسری است، بنابراین مدل تشخیص اسپم باید روی گوشی کاربر نهایی زندگی کند و باید روی یک مجموعه‌دادهٔ خارجی آموزش ببیند. شاید مدل فیلتر کردن کوکی چنان محدودیت‌های تأخیری دارد که باید روی یک دستگاه تعبیه‌شده در کارخانه اجرا شود نه روی یک سرور از راه دور. باید زمینهٔ کامل کاری که کار شما در آن جای می‌گیرد را درک کنید.

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

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

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

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

Section titled “جمع‌آوری یک مجموعه‌داده”

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

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

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

این نکته که داده مهم‌تر از الگوریتم است، معروف‌ترین بیان خود را در مقاله‌ای در سال ۲۰۰۹ توسط محققان گوگل با عنوان «اثربخشی غیرمعقول داده» یافت (عنوان نقیضه‌ای بر کتاب معروف سال ۱۹۶۰ اثربخشی غیرمعقول ریاضیات در علوم طبیعی اثر یوجین ویگنر است). این قبل از محبوبیت یادگیری عمیق بود، اما به‌طور قابل توجهی، ظهور یادگیری عمیق فقط اهمیت داده را افزایش داده است.

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

گاهی اوقات، حاشیه‌نویسی‌ها می‌توانند به‌طور خودکار بازیابی شوند — برای مثال، در مورد وظیفهٔ توصیهٔ موسیقی یا وظیفهٔ پیش‌بینی نرخ کلیک ما. اما اغلب، باید داده‌های خود را به‌صورت دستی حاشیه‌نویسی کنید. این یک فرآیند کار-intensive است.

سرمایه‌گذاری در زیرساخت حاشیه‌نویسی داده

Section titled “سرمایه‌گذاری در زیرساخت حاشیه‌نویسی داده”

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

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

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

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

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

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

از داده‌های غیرنماینده برحذر باشید

Section titled “از داده‌های غیرنماینده برحذر باشید”

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

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

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

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

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

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

  • اگر داده‌های شما شامل تصاویر یا متن زبان طبیعی است، چند نمونه (و برچسب‌های آن‌ها) را مستقیماً بررسی کنید.
  • اگر داده‌های شما شامل ویژگی‌های عددی است، ایدهٔ خوبی است که هیستوگرام مقادیر ویژگی را رسم کنید تا احساسی از محدودهٔ مقادیر گرفته‌شده و فراوانی مقادیر مختلف به دست آورید.
  • اگر داده‌های شما شامل اطلاعات مکان است، آن را روی یک نقشه رسم کنید. آیا الگوهای واضحی ظاهر می‌شوند؟
  • آیا برخی نمونه‌ها مقادیر گمشده برای برخی ویژگی‌ها دارند؟ اگر چنین است، هنگام آماده‌سازی داده‌ها باید با این موضوع برخورد کنید (در بخش بعدی نحوهٔ انجام این کار را پوشش می‌دهیم).
  • اگر وظیفهٔ شما یک مسئلهٔ طبقه‌بندی است، تعداد نمونه‌های هر کلاس در داده‌های خود را چاپ کنید. آیا کلاس‌ها تقریباً به‌طور مساوی نمایش داده می‌شوند؟ اگر نه، باید این عدم تعادل را در نظر بگیرید.
  • به دنبال نشت هدف باشید — وجود ویژگی‌هایی در داده‌های شما که اطلاعاتی دربارهٔ اهداف ارائه می‌دهند که ممکن است در تولید در دسترس نباشند. اگر مدلی روی سوابق پزشکی آموزش می‌دهید تا پیش‌بینی کنید آیا کسی در آینده برای سرطان درمان می‌شود یا نه، و سوابق شامل ویژگی «این شخص با سرطان تشخیص داده شده است» باشد، اهداف شما به‌طور مصنوعی در داده‌های شما نشت کرده‌اند. همیشه از خود بپرسید، آیا هر ویژگی در داده‌های شما چیزی است که در تولید به همان شکل در دسترس خواهد بود؟

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

برای مسائل طبقه‌بندی متعادل، که در آن هر کلاس به‌طور یکسان محتمل است، دقت و سطح زیر منحنی (AUC) از ویژگی عملکرد گیرنده (ROC) معیارهای رایج هستند. برای مسائل نامتعادل کلاس، مسائل رتبه‌بندی یا طبقه‌بندی چندبرچسبی، می‌توانید از دقت و بازیابی یا معیاری که مثبت‌های کاذب، مثبت‌های واقعی، منفی‌های کاذب و منفی‌های واقعی را می‌شمارد استفاده کنید. و غیرمعمول نیست که مجبور شوید معیار سفارشی خود را برای اندازه‌گیری موفقیت تعریف کنید. برای درک تنوع معیارهای موفقیت یادگیری ماشین و نحوهٔ ارتباط آن‌ها با حوزه‌های مختلف مسئله، مرور مسابقات علم داده در Kaggle (https://kaggle.com) مفید است؛ این سایت طیف گسترده‌ای از مسائل و معیارهای ارزیابی را به نمایش می‌گذارد.

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

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

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

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

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

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

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

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

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

# Assuming x is a 2D data matrix of shape (samples, features)
x -= x.mean(axis=0)
x /= x.std(axis=0)

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

می‌توانستید صرفاً ویژگی را کاملاً کنار بگذارید، اما لزوماً نباید:

  • اگر ویژگی دسته‌ای است، ایمن است که یک دستهٔ جدید به معنای «مقدار گمشده است» ایجاد کنید. مدل به‌طور خودکار یاد می‌گیرد که این برای اهداف چه معنایی دارد.
  • اگر ویژگی عددی است، از وارد کردن یک مقدار دلخواه مانند ۰ اجتناب کنید زیرا ممکن است یک ناپیوستگی در فضای نهان شکل‌گرفته توسط ویژگی‌های شما ایجاد کند و تعمیم را برای مدلی که روی آن آموزش دیده دشوارتر کند. در عوض، در نظر بگیرید که مقدار گمشده را با میانگین یا میانهٔ مقدار ویژگی در مجموعه‌داده جایگزین کنید. همچنین می‌توانید یک مدل را برای پیش‌بینی مقدار ویژگی با توجه به مقادیر سایر ویژگی‌ها آموزش دهید.

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

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

Section titled “انتخاب یک پروتکل ارزیابی”

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

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

  • نگه داشتن یک مجموعهٔ اعتبارسنجی نگه‌داشته‌شده — روشی که وقتی دادهٔ زیادی دارید باید بروید.
  • انجام اعتبارسنجی متقاطع K-تایی — انتخاب درست زمانی که نمونه‌های بسیار کمی برای قابل اعتماد بودن اعتبارسنجی نگه‌داشته‌شده دارید.
  • انجام اعتبارسنجی K-تایی تکراری — برای انجام ارزیابی مدل بسیار دقیق وقتی دادهٔ کمی در دسترس است.

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

وقتی شروع به کار روی خود مدل می‌کنید، هدف اولیهٔ شما دستیابی به قدرت آماری است، همان‌طور که در فصل ۵ دیدید — یعنی توسعهٔ یک مدل کوچک که قادر به شکست یک خط پایهٔ ساده باشد.

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

  • مهندسی ویژگی — ویژگی‌های غیرآموزنده را فیلتر کنید (انتخاب ویژگی) و از دانش خود دربارهٔ مسئله برای توسعهٔ ویژگی‌های جدید که احتمالاً مفید هستند استفاده کنید.
  • انتخاب پیشینی‌های معماری درست — از چه نوع معماری مدل استفاده خواهید کرد؟ یک شبکهٔ متراکم متصل، یک ConvNet، یک شبکهٔ عصبی بازگشتی، یک Transformer؟ آیا یادگیری عمیق حتی رویکرد خوبی برای وظیفه است، یا باید از چیز دیگری استفاده کنید؟
  • انتخاب یک پیکربندی آموزش به‌اندازهٔ کافی خوب — از چه تابع زیانی باید استفاده کنید؟ چه اندازهٔ دسته و نرخ یادگیری؟

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

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

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

ممکن است این فرضیه‌ها نادرست باشند، در این صورت باید به تختهٔ طراحی بازگردید.

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

Section titled “مقیاس‌پذیری: توسعهٔ مدلی که بیش‌برازش می‌کند”

وقتی مدلی به دست آوردید که قدرت آماری دارد، سؤال این است که آیا مدل شما به‌اندازهٔ کافی قدرتمند است؟ آیا لایه‌ها و پارامترهای کافی برای مدل‌سازی مناسب مسئلهٔ پیش‌رو دارد؟ برای مثال، یک مدل رگرسیون لجستیک روی MNIST قدرت آماری دارد اما برای حل خوب مسئله کافی نخواهد بود. به یاد داشته باشید که تنش جهانی در یادگیری ماشین بین بهینه‌سازی و تعمیم است؛ مدل ایدئال مدلی است که درست در مرز بین کم‌برازش و بیش‌برازش، بین کم‌ظرفیت و پرظرفیت قرار دارد. برای فهمیدن اینکه این مرز کجاست، ابتدا باید از آن عبور کنید.

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

  • لایه‌ها اضافه کنید.
  • لایه‌ها را بزرگ‌تر کنید.
  • برای دوره‌های بیشتر آموزش دهید.

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

تنظیم و تنظیم دقیق مدل شما

Section titled “تنظیم و تنظیم دقیق مدل شما”

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

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

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

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

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

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

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

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

Section titled “توضیح کار خود به ذی‌نفعان و تعیین انتظارات”

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

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

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

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

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

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

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

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

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

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

Section titled “استقرار یک مدل به‌عنوان یک REST API”

شاید آسان‌ترین راه برای تبدیل یک مدل به یک محصول، سرویس‌دهی آن به‌صورت آنلاین از طریق یک REST API است. کتابخانه‌های متعددی برای این کار وجود دارند. Keras از دو رویکرد محبوب به‌صورت آماده پشتیبانی می‌کند — TensorFlow Serving و ONNX (مخفف Open Neural Network Exchange). هر دو کتابخانه با بلند کردن تمام وزن‌های مدل و یک گراف محاسباتی خارج از برنامهٔ پایتون کار می‌کنند، بنابراین می‌توانید آن را از محیط‌های مختلف (برای مثال، یک سرور C++) سرویس‌دهی کنید. اگر این بسیار شبیه به مکانیزم کامپایل مورد بحث در فصل ۳ به نظر می‌رسد، کاملاً درست است. TensorFlow Serving اساساً یک کتابخانه برای سرویس‌دهی گراف‌های محاسباتی tf.function با مجموعهٔ خاصی از وزن‌های ذخیره‌شده است.

Keras از طریق یک متد آسان export() موجود در تمام مدل‌های Keras دسترسی به هر دو TensorFlow Serving و ONNX را فراهم می‌کند. در اینجا یک قطعه‌کد نشان می‌دهد این چگونه برای TensorFlow Serving کار می‌کند:

# Exports the model as a TensorFlow SavedModel artifact
model.export("path/to/location", format="tf_saved_model")
# Loads the artifact in a different process, environment, or
# programming language
reloaded_artifact = tf.saved_model.load("path/to/location")
predictions = reloaded_artifact.serve(input_data)

جریان مشابهی برای ONNX وجود دارد:

model.export("path/to/location", format="onnx")
ort_session = onnxruntime.InferenceSession("path/to/location")
predictions = ort_session.run(None, input_data)

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

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

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

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

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

Section titled “استقرار یک مدل روی یک دستگاه”

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

شما باید از این تنظیم استفاده کنید وقتی

  • مدل شما محدودیت‌های تأخیر سختگیرانه دارد یا نیاز دارد در محیطی با اتصال کم اجرا شود. اگر در حال ساخت یک برنامهٔ واقعیت افزودهٔ فراگیر هستید، پرس‌وجو از یک سرور راه دور یک گزینهٔ عملی نیست.
  • مدل شما می‌تواند به‌اندازهٔ کافی کوچک شود که تحت محدودیت‌های حافظه و توان دستگاه هدف اجرا شود.
  • دستیابی به بالاترین دقت ممکن برای وظیفهٔ شما حیاتی نیست: همیشه یک مصالحه بین کارایی زمان اجرا و دقت وجود دارد، بنابراین محدودیت‌های حافظه و توان اغلب نیازمند ارسال مدلی هستید که کاملاً به‌اندازهٔ بهترین مدلی که می‌توانستید روی یک GPU بزرگ اجرا کنید خوب نیست.
  • داده‌های ورودی به‌شدت حساس هستند و بنابراین نباید روی یک سرور راه دور قابل رمزگشایی باشند.

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

برای استقرار یک مدل Keras روی یک گوشی هوشمند یا دستگاه تعبیه‌شده، می‌توانید دوباره از متد export() برای ایجاد یک ذخیرهٔ TensorFlow یا ONNX از مدل خود شامل گراف محاسباتی استفاده کنید. TensorFlow Lite (https://www.tensorflow.org/lite) یک چارچوب برای استنتاج کارآمد یادگیری عمیق روی دستگاه است که روی گوشی‌های هوشمند Android و iOS و همچنین CPUهای ARM، Raspberry Pi یا برخی میکروکنترلرها اجرا می‌شود. این چارچوب از همان فرمت مدل ذخیره‌شدهٔ TensorFlow به‌عنوان TensorFlow Serving استفاده می‌کند. زمان اجرای ONNX نیز می‌تواند روی دستگاه‌های موبایل اجرا شود.

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

Section titled “استقرار یک مدل در مرورگر”

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

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

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

البته، فقط در صورتی باید با این گزینه بروید که مدل شما به‌اندازهٔ کافی کوچک باشد که CPU، GPU یا RAM لپ‌تاپ یا گوشی هوشمند کاربر شما را اشغال نکند. علاوه بر این، از آنجا که کل مدل روی دستگاه کاربر دانلود می‌شود، باید مطمئن شوید که هیچ چیز در مورد مدل محرمانه نیست. از این واقعیت آگاه باشید که با توجه به یک مدل یادگیری عمیق آموزش‌دیده، معمولاً امکان بازیابی برخی اطلاعات دربارهٔ داده‌های آموزشی وجود دارد: بهتر است مدل آموزش‌دیدهٔ خود را عمومی نکنید اگر روی داده‌های حساس آموزش دیده است.

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

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

Section titled “بهینه‌سازی مدل استنتاج”

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

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

  • هرس وزن — هر ضریب در یک تانسور وزن به‌طور یکسان به پیش‌بینی‌ها کمک نمی‌کند. می‌توان با نگه داشتن فقط مهم‌ترین آن‌ها، تعداد پارامترهای لایه‌های مدل خود را به‌طور قابل توجهی کاهش داد. این ردپای حافظه و محاسبات مدل شما را با هزینهٔ کمی در معیارهای عملکرد کاهش می‌دهد. با تنظیم مقدار هرسی که می‌خواهید اعمال کنید، شما بر مصالحه بین اندازه و دقت کنترل دارید.
  • کوانتیزه‌سازی وزن — مدل‌های یادگیری عمیق با وزن‌های ممیز شناور تک‌دقت ( float32 ) آموزش می‌بینند. با این حال، می‌توان وزن‌ها را به اعداد صحیح علامت‌دار ۸ بیتی ( int8 ) کوانتیزه کرد تا یک مدل فقط استنتاج چهار برابر کوچک‌تر به دست آید که تقریباً نزدیک به دقت مدل اصلی باقی می‌ماند. مدل‌های Keras با یک API quantize() داخلی عرضه می‌شوند که می‌تواند در این کار کمک کند. به‌سادگی model.quantize("int8") را فراخوانی کنید تا هر وزن در مدل خود را به یک بایت منفرد فشرده کنید.

نظارت بر مدل خود در دنیای واقعی

Section titled “نظارت بر مدل خود در دنیای واقعی”

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

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

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

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

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

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

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

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

حق نشر متن اصلی: ©۲۰۲۵ Manning Publications، François Chollet و Matthew Watson. این صفحه ترجمه‌ی فارسی است؛ متن اصلی را در deeplearningwithpython.io بخوانید یا نسخه‌ی چاپی را از Manning بخرید.

مقدمه‌ای بر یادگیری عمیق، آموزش رایگان و فارسی یادگیری عمیق.