Классификация рукописных рисунков. Доклад в Яндексе |
||
|
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ Атаки на ИИ Внедрение ИИИИ теория Компьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Промпты. Генеративные запросы Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2019-02-18 10:33 работа головного мозга, реализация нейронной сети, распознавание образов Несколько месяцев назад наши коллеги из Google провели на Kaggle конкурс по созданию классификатора изображений, полученных в нашумевшей игре «Quick, Draw!». Команда, в которой участвовал разработчик Яндекса Роман Власов, заняла в конкурсе четвертое место. На январской тренировке по машинному обучению Роман поделился идеями своей команды, финальной реализацией классификатора и интересными практиками соперников.
![]() ![]() ![]() Этот сервис собрал довольно большое количество пользователей, и все картинки, которые пользователи рисовали, логировались. ![]() ![]() ![]() Другие участники команды, например Иван Сосин, пробовали немного другие подходы к рисованию. Одним каналом он просто рисовал серую картинку, другим каналом — рисовал каждый штрих градиентом от начала до конца, с 32 до 255, а третим каналом рисовал градиент по всем штрихам от 32 до 255. Еще из интересного — Алекс Паринов закидывал информацию в сеть по countrycode. ![]() ![]() ![]() ![]() ![]() ![]() Эту технику, кстати, использовал Алекс Паринов. Он начинал с батча, равного 408, и когда сеть у него приходила на какое-то плато, он просто увеличивал batch size в два раза, и т. д. На самом деле, я не помню, до какого значения у него batch size доходил, но что интересно, были команды на Kaggle, которые использовали эту же технику, у них batch size был порядка 10000. Кстати, современные фреймворки для deep learning, такие как PyTorch, например, позволяют вам это очень просто делать. Вы генерируете свой батч и подаете его в сеть не как он есть, целиком, а делите его на чанки, чтобы у вас это влезало в вашу видеокарту, считаете градиенты, и после того, как для всего батча посчитали градиент делаете обновление весов. Кстати, в этом соревновании еще заходили большие batch sizes, потому что данные были довольно шумными, и большой batch size помогал вам более точно аппроксимировать градиент. Также использовался псевдолейблинг, его по большей части использовал Роман Соловьев. Он в батч семплил где-то половину данных из теста, и на таких батчах обучал сетку. Размер картинок играл значение, но факт в том, что у вас данных много, нужно долго обучать, и если у вас размер картинки будет довольно большим, то вы будете обучать очень долго. Но это приносило в качество вашего финального классификатора не так много, так что стоило использовать некий trade-off. И пробовали только картинки не очень большого размера. Как это все обучалось? Сначала брались картинки маленького размера, на них прогонялось несколько эпох, это довольно быстро занимало по времени. Потом давались картинки большого размера, сеть обучалась, потом еще больше, еще больше, чтобы не обучать это с нуля и не тратить очень много времени. Про оптимайзеры. Мы использовали SGD и Adam. Таким способом можно было получить single модель, которая давала скор 0,941-0,946 на паблик лидерборде, что довольно неплохо. Если вы заансамблируете модели неким образом, то вы получите где-то 0,951. Если применить еще одну технику, то финальный скор вы получите на паблик борде 0,954, как получили мы. Но об этом чуть позже. Дальше я расскажу, как мы асамблировали модели, и как такого финального скора удалось добиться. Дальше хотел бы рассказать про Cosing Annealing with Warm Restarts или Stochastic Gradient Descent with Warm Restarts. Грубо говоря, в принципе, оптимайзер вы можете засунуть любой, но суть в следующем: если вы просто будете обучать одну сеть и постепенно она будет сходиться к какому-то минимуму, то все окей, у вас получится одна сеть, она делает определенные ошибки, но вы можете ее обучать немного по-другому. Вы будете задавать какой-то начальный learning rate, и постепенно его понижать по данной формуле. Вы его занижаете, у вас сеть приходит к какому-то минимуму, дальше вы сохраняете веса, и снова ставите learning rate, который был в начале обучения, тем самым из этого минимума выходите куда-то наверх, и опять занижаете ваш learning rate. Тем самым вы можете посетить сразу несколько минимумов, в которых loss у вас будет плюс-минус одинаковым. Но факт в том, что сети с данными весами будут давать разные ошибки на вашей дате. Усреднив их, вы получите некую аппроксимацию, и ваш скор будет выше. ![]() Получились такие значения. Это нам помогало не делать пробинг-лидерборда, а валидироваться локально и подбирать коэффициенты для наших ансамблей. С ансамблем вы могли получить такой скор. Что бы еще сделать? Предположим, вы воспользовались информацией, что классы в тесте у вас сбалансированы. Балансировки были разные. Пример одной из них — балансировка от ребят, которые заняли первое место. Что делали мы? У нас балансировка была довольно простая, ее предложил Евгений Бабахнин. Мы сначала сортировали наши предсказания по топ-1 и из них выбирали кандидатов — таким образом, чтобы количество классов не превышало 330. Но для некоторых классов у вас получается так, что предиктов меньше, чем 330. Окей, давайте еще отсортируем по топ-2 и топ-3, и так же выберем кандидатов. Чем наша балансировка отличалась от балансировки первого места? Они использовали итеративный подход, брали самый популярный класс и уменьшали вероятности для этого класса на какое-то маленькое число — до тех пор, пока этот класс не становился не самым популярным. Брали следующий самый популярный класс. Так дальше и понижали, пока количество всех классов не становилось равным. Все использовали плюс-минус один подход для обучения сетей, но не все использовали балансировку. Используя балансировку, вы могли зайти в голд, а если бы повезло, то и в мани. Как предпроцессить дату? Все предпроцессили дату плюс-минус одинаково — делалая handcrafted-фичи, пытались закодировать тайминги разным цветом штрихов и т. д. Как раз про это говорил Алексей Ноздрин-Плотницкий, который занял 8 место. ![]() Телеграм: t.me/ainewsline Источник: habr.com Комментарии: |
|