چند ماه پیش، همکاران ما از گوگل
- سلام به همه! نام من روما ولاسوف است، امروز در مورد Quick, Draw به شما خواهم گفت! چالش تشخیص Doodle.
پنج نفر در تیم ما حضور داشتند. من درست قبل از مهلت ادغام پیوستم. ما بدشانسی آوردیم، کمی تکان خوردیم، اما از موقعیت پولی تکان خوردیم و آنها از جایگاه طلا تکان خوردند. و مقام چهارم پرافتخار را کسب کردیم.
(در طول مسابقه، تیم ها خود را در یک رتبه بندی مشاهده کردند که بر اساس نتایج نشان داده شده در یک بخش از مجموعه داده های پیشنهادی شکل گرفت. رتبه بندی نهایی نیز به نوبه خود در قسمت دیگری از مجموعه داده ها شکل گرفت. این کار به این ترتیب انجام می شود. که شرکت کنندگان در مسابقه الگوریتم های خود را با داده های خاص تنظیم نمی کنند. بنابراین، در فینال ها، هنگام جابجایی بین رتبه ها، موقعیت ها کمی تکان می خورد (از انگلیسی shake up - to mix): در سایر داده ها، ممکن است نتیجه حاصل شود. برای متفاوت بودن تیم رومن اول شد در بین سه تیم برتر. در این مورد، سه رتبه اول پول، منطقه رتبه بندی پولی است، زیرا فقط به سه رتبه اول جایزه نقدی تعلق گرفت. پس از تغییر، تیم قبلاً در مقام چهارم. به همین ترتیب، تیم دیگر پیروزی، موقعیت طلا را از دست داد. - اد.)
این رقابت همچنین از این نظر قابل توجه بود که اوگنی باباخنین استاد بزرگ دریافت کرد، ایوان سوسین استاد شد، رومن سولوویف استاد بزرگ ماند، الکس پرینوف استاد شد، من متخصص شدم و اکنون استاد هستم.
این Quick, Draw چیست؟ این یک سرویس از گوگل است. هدف گوگل محبوبیت هوش مصنوعی بود و با این سرویس می خواست نحوه عملکرد شبکه های عصبی را نشان دهد. شما به آنجا می روید، روی Let's draw کلیک کنید، و صفحه جدیدی ظاهر می شود که در آن به شما گفته می شود: یک زیگزاگ بکشید، شما 20 ثانیه فرصت دارید تا این کار را انجام دهید. شما سعی می کنید در 20 ثانیه یک زیگزاگ بکشید، مثلاً اینجا. اگر موفق شوید، شبکه می گوید زیگزاگ است و شما ادامه می دهید. تنها شش عکس از این دست وجود دارد.
اگر شبکه Google نتوانست آنچه را که کشیدهاید تشخیص دهد، یک ضربدر روی کار قرار میگیرد. بعداً به شما خواهم گفت که آیا در آینده یک نقاشی توسط شبکه تشخیص داده می شود یا خیر.
این سرویس تعداد نسبتاً زیادی از کاربران را جمع آوری کرد و تمام تصاویری که کاربران ترسیم کردند ثبت شد.
ما موفق به جمع آوری تقریبا 50 میلیون تصویر شدیم. از این به بعد تاریخ قطار و آزمون مسابقه ما مشخص شد. به هر حال، مقدار داده ها در آزمون و تعداد کلاس ها به دلایلی با پررنگ مشخص شده اند. کمی بعد در مورد آنها به شما خواهم گفت.
فرمت داده ها به صورت زیر بود. اینها فقط تصاویر RGB نیستند، بلکه، به طور کلی، گزارشی از تمام کارهایی که کاربر انجام داده است. کلمه هدف ما است، کد کشور جایی است که نویسنده ابله اهل آن است، مهر زمانی زمان است. برچسب شناسایی فقط نشان می دهد که آیا شبکه تصویر را از Google تشخیص داده است یا خیر. و رسم خود یک دنباله است، تقریبی از منحنی که کاربر با نقاط ترسیم می کند. و زمان بندی ها این زمان از شروع کشیدن تصویر است.
داده ها در دو قالب ارائه شد. این اولین فرمت است و دومی ساده شده است. آنها زمان بندی را از آنجا قطع کردند و این مجموعه از نقاط را با مجموعه ای از نقاط کوچکتر تقریب زدند. برای این کار استفاده کردند
داده ها به شرح زیر توزیع شد. همه چیز یکنواخت است، اما برخی موارد پرت نیز وجود دارد. وقتی مشکل را حل کردیم، به آن نگاه نکردیم. نکته اصلی این است که هیچ کلاسی وجود نداشت که واقعاً کم باشد، ما مجبور نبودیم نمونهگرهای وزنی و نمونهبرداری بیش از حد داده را انجام دهیم.
تصاویر چه شکلی بودند؟ این کلاس "هواپیما" و نمونه هایی از آن با برچسب های شناخته شده و ناشناخته است. نسبت آنها حدود 1 به 9 بود. همانطور که می بینید، داده ها بسیار نویز هستند. من حدس می زنم این یک هواپیما است. اگر به شناسایی ناشناخته نگاه کنید، در بیشتر موارد فقط نویز است. حتی یک نفر سعی کرد «هواپیما» بنویسد، اما ظاهراً به زبان فرانسوی.
اکثر شرکتکنندگان به سادگی شبکههایی را گرفتند، دادهها را از این توالی خطوط بهعنوان تصاویر RGB ترسیم کردند و آنها را به شبکه پرتاب کردند. من تقریباً به همین ترتیب کشیدم: یک پالت رنگ گرفتم، اولین خط را با یک رنگ، که در ابتدای این پالت بود، آخرین خط را با دیگری که در انتهای پالت بود، کشیدم و بین آنها من با استفاده از این پالت همه جا را درون یابی کردم. به هر حال، این نتیجه بهتری نسبت به اینکه در همان اسلاید اول ترسیم کنید - فقط به رنگ مشکی بود.
سایر اعضای تیم، مانند ایوان سوسین، رویکردهای متفاوتی را برای طراحی امتحان کردند. با یک کانال او به سادگی یک تصویر خاکستری ترسیم کرد، با کانال دیگر او هر ضربه را با یک گرادیان از ابتدا تا انتها، از 32 تا 255 ترسیم کرد، و با کانال سوم، یک گرادیان روی تمام ضربه ها از 32 تا 255 کشید.
نکته جالب دیگر این است که الکس پرینوف اطلاعات را با استفاده از کد کشور در شبکه آپلود می کند.
معیار مورد استفاده در رقابت میانگین میانگین دقت است. ماهیت این معیار برای رقابت چیست؟ شما می توانید سه پیش بینی بدهید و اگر در این سه پیش فرض درستی وجود نداشته باشد، 0 می گیرید. اگر یک پیش بینی درست باشد، ترتیب آن در نظر گرفته می شود. و نتیجه هدف به ترتیب 1 تقسیم بر ترتیب پیش بینی شما محاسبه می شود. به عنوان مثال شما سه پیش بینی کردید که درست اولی است، سپس 1 را بر 1 تقسیم می کنید و 1 می گیرید. اگر پیش بینی درست باشد و ترتیب آن 2 باشد، 1 را بر 2 تقسیم کنید، 0,5 به دست می آید. خوب و غیره
با پیش پردازش داده ها - نحوه ترسیم تصاویر و غیره - کمی تصمیم گرفته ایم. از چه معماری هایی استفاده کردیم؟ ما سعی کردیم از معماری های چرب مانند PNASNet، SENet و معماری های کلاسیک مانند SE-Res-NeXt استفاده کنیم، آنها به طور فزاینده ای وارد رقابت های جدید می شوند. ResNet و DenseNet نیز وجود داشتند.
چگونه این را آموزش دادیم؟ تمام مدل هایی که ما گرفتیم در ایمیج نت از قبل آموزش دیده بودند. اگرچه داده های زیادی وجود دارد، 50 میلیون تصویر، اما با این حال، اگر یک شبکه از قبل آموزش دیده روی ایمیج نت بگیرید، نتایج بهتری نسبت به زمانی که آن را به سادگی از ابتدا آموزش داده باشید، نشان می دهد.
از چه تکنیک های آموزشی استفاده کردیم؟ این Cosing Annealing with Warm Restarts است که کمی بعد در مورد آن صحبت خواهم کرد. این تکنیکی است که من تقریباً در تمام مسابقات اخیرم از آن استفاده می کنم و با استفاده از آنها می توانم به خوبی شبکه ها را تمرین کنم تا به حداقل خوبی برسم.
بعدی کاهش نرخ یادگیری در Plateau. آموزش شبکه را شروع میکنید، نرخ یادگیری مشخصی را تعیین میکنید، به آموزش آن ادامه میدهید و ضرر شما به تدریج به مقدار مشخصی همگرا میشود. شما این را بررسی کنید، مثلاً برای ده دوره ضرر اصلاً تغییر نکرده است. میزان یادگیری خود را مقداری کاهش می دهید و به یادگیری ادامه می دهید. دوباره کمی کاهش می یابد، در حداقل مقداری همگرا می شود، و شما دوباره نرخ یادگیری را کاهش می دهید، و به همین ترتیب، تا زمانی که شبکه شما در نهایت همگرا شود.
بعد یک تکنیک جالب است: سرعت یادگیری را کاهش ندهید، اندازه دسته را افزایش دهید. مقاله ای با همین نام وجود دارد. هنگامی که یک شبکه را آموزش می دهید، نیازی به کاهش نرخ یادگیری ندارید، می توانید به سادگی اندازه دسته را افزایش دهید.
به هر حال، این تکنیک توسط الکس پرینوف استفاده شد. او با دسته ای برابر با 408 شروع کرد و وقتی شبکه اش به فلات رسید، به سادگی اندازه دسته را دو برابر کرد و غیره.
در واقع، من به یاد ندارم که اندازه دسته ای او به چه ارزشی رسیده است، اما جالب اینجاست که تیم هایی در Kaggle وجود داشتند که از همین تکنیک استفاده می کردند، اندازه دسته آنها حدود 10000 بود. اتفاقاً چارچوب های مدرن برای یادگیری عمیق، مانند برای مثال PyTorch به شما این امکان را می دهد که خیلی راحت این کار را انجام دهید. شما دسته خود را تولید میکنید و آن را به طور کامل به شبکه ارسال میکنید، اما آن را به تکههایی تقسیم میکنید تا در کارت ویدیوی شما قرار گیرد، گرادیانها را محاسبه میکنید و پس از اینکه گرادیان را برای کل دسته محاسبه کردید، بهروزرسانی کنید. وزنه ها
به هر حال، اندازه دسته های بزرگ هنوز در این رقابت گنجانده شده است، زیرا داده ها کاملاً نویز بودند و اندازه دسته بزرگ به شما کمک می کند تا گرادیان را با دقت بیشتری تقریب کنید.
همچنین از برچسب گذاری کاذب استفاده می شد که بیشتر توسط رومن سولوویف استفاده می شد. او حدود نیمی از داده های آزمایش را به صورت دسته ای نمونه برداری کرد و شبکه را روی چنین دسته هایی آموزش داد.
اندازه تصاویر مهم است، اما واقعیت این است که شما داده های زیادی دارید، باید برای مدت طولانی تمرین کنید، و اگر اندازه عکس شما بسیار بزرگ است، برای مدت طولانی تمرین خواهید کرد. اما این چیز زیادی به کیفیت طبقه بندی کننده نهایی شما اضافه نکرد، بنابراین ارزش استفاده از نوعی مبادله را داشت. و ما فقط تصاویری را امتحان کردیم که اندازه آنها خیلی بزرگ نبود.
چگونه همه چیز یاد گرفت؟ ابتدا عکس هایی با اندازه کوچک گرفته شد، چندین دوره روی آنها اجرا شد، این کار زمان زیادی را می گرفت. سپس تصاویر در اندازه بزرگ داده شد، شبکه آموزش داده شد، سپس حتی بیشتر، حتی بیشتر، تا از ابتدا آن را آموزش ندهند و زمان زیادی را هدر ندهیم.
درباره بهینه سازها ما از SGD و Adam استفاده کردیم. به این ترتیب می توان یک مدل واحد را بدست آورد که سرعت 0,941-0,946 را در لیدربورد عمومی ارائه می دهد که بسیار خوب است.
اگر مدل ها را به نحوی ترکیب کنید، به چیزی در حدود 0,951 خواهید رسید. اگر از یک تکنیک بیشتر استفاده کنید، امتیاز نهایی 0,954 را در تابلوی عمومی دریافت خواهید کرد، درست مثل ما. اما در ادامه بیشتر در مورد آن. در ادامه به شما خواهم گفت که چگونه مدل ها را مونتاژ کردیم و چگونه توانستیم به چنین سرعت نهایی دست پیدا کنیم.
در ادامه می خواهم در مورد Cosing Annealing با راه اندازی مجدد گرم یا نزول گرادیان تصادفی با راه اندازی مجدد گرم صحبت کنم. به طور کلی، در اصل، شما می توانید از هر بهینه سازی استفاده کنید، اما نکته اینجاست: اگر فقط یک شبکه را آموزش دهید و به تدریج به مقداری حداقل همگرا شود، همه چیز درست است، یک شبکه دریافت خواهید کرد، اشتباهات خاصی انجام می دهد، اما شما می تواند آن را کمی متفاوت تربیت کند. مقداری از میزان یادگیری اولیه را تنظیم می کنید و به تدریج طبق این فرمول آن را کاهش می دهید. شما آن را پایین می آورید، شبکه شما به حداقل می رسد، سپس وزنه ها را ذخیره می کنید، و دوباره نرخ یادگیری را که در ابتدای تمرین بود تنظیم می کنید، در نتیجه از این حداقل مقداری بالاتر می روید و دوباره میزان یادگیری خود را کاهش می دهید.
بنابراین، شما می توانید چندین حداقل را به طور همزمان مشاهده کنید، که در آنها ضرر شما، به علاوه یا منفی، یکسان خواهد بود. اما واقعیت این است که شبکه هایی با این وزن ها در تاریخ شما خطاهای مختلفی می دهند. با میانگین گیری آنها نوعی تقریب به دست می آورید و سرعت شما بیشتر می شود.
درباره نحوه مونتاژ مدل هایمان. در ابتدای ارائه گفتم به میزان داده های تست و تعداد کلاس ها توجه کنید. اگر 1 را به تعداد هدف های مجموعه تست اضافه کنید و بر تعداد کلاس ها تقسیم کنید، عدد 330 به دست می آید و این در انجمن نوشته شده بود - که کلاس های تست متعادل هستند. این می تواند مورد استفاده قرار گیرد.
بر این اساس، رومن سولوویف معیاری را ارائه کرد، ما آن را Proxy Score نامیدیم که به خوبی با جدول امتیازات همبستگی داشت. نکته این است: شما یک پیش بینی انجام می دهید، 1 پیش بینی برتر خود را انتخاب می کنید و تعداد اشیاء را برای هر کلاس می شمارید. سپس از هر مقدار 330 کم کنید و مقادیر مطلق حاصل را جمع کنید.
مقادیر زیر بدست آمد. این به ما کمک کرد تا تابلوی امتیازدهی کاوشگر ایجاد نکنیم، بلکه به اعتبار محلی و انتخاب ضرایب برای گروههایمان کمک کنیم.
با یک گروه می توانید چنین سرعتی را بدست آورید. چه کار دیگری می توانستم انجام دهم؟ فرض کنید از اطلاعاتی استفاده کرده اید که کلاس ها در آزمون شما متعادل هستند.
تعادل متفاوت بود.
چه کار کردیم؟ تعادل ما بسیار ساده بود، آن را اوگنی باباخنین پیشنهاد کرد. ما ابتدا پیشبینیهای خود را بر اساس 1 نفر برتر مرتب کردیم و نامزدها را از بین آنها انتخاب کردیم - به طوری که تعداد کلاسها از 330 تجاوز نکند. اما برای برخی از کلاسها کمتر از 330 پیشبینیکننده به پایان میرسد. بسیار خوب، اجازه دهید بر اساس 2 و 3 برتر نیز مرتبسازی کنیم. و نامزدها را نیز انتخاب خواهیم کرد.
تعادل ما با تعادل اول چه فرقی داشت؟ آنها از یک رویکرد تکراری استفاده کردند و محبوب ترین کلاس را انتخاب کردند و احتمالات آن کلاس را با تعداد کمی کاهش دادند تا زمانی که آن کلاس دیگر محبوب ترین کلاس نباشد. ما در کلاس محبوب بعدی شرکت کردیم. بنابراین به پایین آوردن آنها ادامه دادند تا اینکه تعداد تمام طبقات برابر شد.
همه از رویکرد مثبت یا منفی یک برای شبکه های قطار استفاده کردند، اما همه از تعادل استفاده نکردند. با استفاده از تعادل، می توانید به طلا بروید، و اگر خوش شانس بودید، پس از آن به پول.
چگونه یک تاریخ را از قبل پردازش کنیم؟ همه تاریخ را، به علاوه یا منفی، به همین ترتیب از قبل پردازش کردند - ساخت ویژگی های دست ساز، تلاش برای رمزگذاری زمان بندی با رنگ های ضربه ای مختلف، و غیره.
او این کار را متفاوت انجام داد. او گفت که همه این ویژگی های دست ساز شما کار نمی کند، شما نیازی به انجام آن ندارید، شبکه شما باید همه اینها را خودش یاد بگیرد. و در عوض، ماژولهای یادگیری را ارائه کرد که دادههای شما را از قبل پردازش میکردند. او داده های اصلی را بدون پیش پردازش - مختصات نقطه و زمان بندی - به آنها پرتاب کرد.
سپس تفاوت را بر اساس مختصات گرفت و همه را بر اساس زمان بندی میانگین گرفت. و او با یک ماتریس نسبتا طولانی آمد. او چندین بار کانولوشن 1 بعدی را روی آن اعمال کرد تا ماتریسی به اندازه 64xn به دست آورد که n تعداد کل نقاط است و 64 برای تغذیه ماتریس حاصل به لایه هر شبکه کانولوشنی ساخته می شود که تعداد کانال ها را می پذیرد. - 64. او یک ماتریس 64xn به دست آورد، سپس از آن باید یک تانسور با اندازه ای ایجاد کرد تا تعداد کانال ها برابر با 64 باشد. او تمام نقاط X، Y را در محدوده 0 تا 32 نرمال کرد تا یک عدد ایجاد شود. تانسور در اندازه 32x32. نمیدانم چرا او 32x32 میخواست، اینطوری اتفاق افتاد. و در این مختصات قطعه ای از این ماتریس را به اندازه 64xn قرار داد. بنابراین به یک تانسور 32x32x64 رسید که می توانید آن را در شبکه عصبی کانولوشن خود قرار دهید. این تمام چیزی است که می خواستم بگویم.
منبع: www.habr.com