![]() |
![]() |
![]() |
|||||
![]() |
Разработка чат-бота с заданной личностью. Лекция в Яндексе |
||||||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2018-09-10 19:45 Важная особенность задач по машинному обучению заключается в том, что одинаково хороший результат достижим разными методами. Это и придаёт азарт ML-конкурсам: даже обладая другими компетенциями, чем у заведомо сильного соперника, вы всё равно можете выиграть. Команды Tensorborne и Neurobotics имели практически равные шансы на победу в хакатоне DeepHack и в итоге заняли первые два места. На тренировке Яндекса представители обеих команд выступили с одним объёмным докладом. В расшифровке вас ждут детальные разборы решений и советы начинающим конкурсантам.
И конечно, берите отпуск на хакатон. Когда вы участвуете в недельном хакатоне и одновременно еще и работаете, это плохо. Вы приходите в 7 вечера, немножко поработавший, садитесь и компилите Docker с TensorFlow, Keras, чтобы все это запустилось на каких-то удаленных серверах, к которым у вас даже доступа нет. Где-то в два ночи вы ловите катарсис, и у вас это работает — без Docker, без всего, потому что вы поняли, что можно и так. Виталий Давыдов: — Всем привет! У нас должно было быть два доклада, но мы решили их объединить в один большой, потому что рассказываем про первое и второе место в соревновании DeepHack. Мы представляем две команды. Наша команда Tensorborne заняла 2 место, а команда Григория Neurobotics — первое. ![]() ![]() Evaluation, по которому они пытались это делать, проходил в три этапа. Первый этап — автоматические метрики, далее — оценка на AWS Mechanical Turk, и дальше живой чат с волонтерами. Так как ConvAI спонсируется Facebook, он активно продвигает свою библиотеку для создания диалоговых систем ParlAI. Она довольно сложная, но думаю, все участники использовали эту библиотеку. Мы довольно долго с ней разбирались, она не совместима с Python 3.6, например, и с ней есть ряд проблем. ![]() ![]() Про квалификационный раунд уже сказал. Финал был очный. Он проходил в течение семи дней работы в МФТИ, был предоставлен какой-то кластер, место, мы там сидели и работали. Evaluation был по факту каждый день, и финальный score, оценка бота в конце, высчитывался таким образом. Соревнование начиналось в понедельник, первый сабмит был во вторник, и evaluation происходил на следующий день. Решение, которое вы отправили во вторник, эвальюировалось в среду с весом 1,5. То, что вы отправили в среду, — с весом 1,4 и т. д. ![]() ![]() Григорий Рашков: — Я бы хотел рассказать про наш опыт участия в соревновании, нашу стратегию и наше решение. ![]() ![]() Как и во всех фильмах ужасов, наша команда в самом начале решила разделиться. Первая группа занималась нашим основным решением на базе Wasserstein GAN, вторая группа занималась ботом, админкой бота на базе бэйзлайна. Потому что нам уже в первый и второй день нужно было что-то отправить. ![]() Ссылка со слайда Коротко про бэйзлайн: Seq2Seq плюс attention, который немного адаптирован под данную конкретную задачу. Как именно? На вход подаются фразу, embedding берется из GloVe, но дальше считается представление каждой фразы как взвешенные embedding. Веса выбираются исходя из обратной частоты слова. Чем более редко встречающееся слово попадается, тем больший вес оно вносит. ![]() Ссылка со слайда Это нужно для отражения уникальности данных характеристик. Это все собиралось в сет, матрицу, на основе этого сета и скрытого состояния строилась маска, потом эта маска накладывалась на сет, получался контекст, и дальше уже он соединялся, через нелинейность подавался на вход декодеров. ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Ссылка со слайда Возникает интересный локальный минимум у бота: он очень хорошо реагирует на любые оскорбления, он с ними соглашается, и чтобы это пофиксить, мы решили воспользоваться имеющимся Kaggle конкурсом на toxic comments analyzer, написали классификатор очень простенький, тоже с RNN вниманием. В том датасете были следующие классы, перекрывающиеся: оскорбления, угрозы… Мы под это решили не учить отдельно модельку, которая будет говорить, потому что такая проблема встречалась, но она была не очень частой. Поэтому мы просто написали какую-то затычку, которую отвечал бот, и все были довольны. ![]() ![]() ![]() ![]() Дальше мы написали решение обратной задачи, вторую модель, которая по диалогу выбирала нужный профиль. Мы планировали ее использовать изначально для обучения, чтобы считать от нее loss-функцию и дальше распространять в сетку. Но это могло ухудшить саму болталку, поэтому решили так не ставить. Также мы думали использовать эту штуку для поведения бота, но оттестировать все не успевали, и решили от этой штуки отказаться. Кроме того мы решили ставить смайлы, исходя из эмоциональной окраски фразы, написали модель, но не нашли подходящего датасета, а те, которые использовали, немножко не про то. ![]() Сергей Колесников: — Меня зовут Сергей Колесников, я буду представлять решение Tensorborne. ![]() ![]() Изначально нас собралось пятеро, все хорошие академичные выпускники или около того Физтеха, поэтому в понедельник мы пришли и накидали много предложений, идей, что можно попробовать, какие deep learning модельки попробовать. Мы, правда, не экспериментировали с GAN, потому что уже экспериментировали с ними для текстов и это не работает, поэтому взяли что-то более простое, к тому же были очень похожие конкурсы и у нас были pretrain модельки. Во вторник мы даже смогли запустить что-то на deep learning, ML был везде, где можно, мы запускали замечательные докеры с поддержкой GPU и прочего для Tensorflow и Keras, нам отдельную медаль надо дать за это, ввиду того, что это не так тривиально, как хотелось бы. По результатам вторника — они были многообещающими, и мы решили немножко улучшить наш ML небольшими эвристиками и прочим, и провалились на седьмое место. Но благодаря нашим товарищам по команде, кто-то нашел ElasticSearch, и попробовали. Был очень неловкий момент, когда ElasticSearch заработал отлично, а DL-модельки и ML, и прочее было немножко не столь робастным. Конец конкурса близился. И как было замечено предыдущим докладчиком, мы решили погрести в ту сторону, что работает. Взяли ElasticSearch, небольшие эвристики и подумали, что good enough, и правда good enough ввиду того, что второе место мы заняли. ![]() Другое решение было рождено за дня два хакатона по вечерам. Есть замечательный парень Джереми Ховард, он пропагандирует DL и ML для всех, у него есть замечательные два курса, которые вводят вас в курс этого дела и прочего, и под этот курс он написал свою либу FastAI. Все это работает на PyTorch, и во многом даже переписывает PyTorch, это один из минусов этой либы. Но из плюсов, Джереми к НЛП имеет мало отношения, в этом году в марте с еще одним студентом выпустили статью, где они обучили LSTM по всем лучшим практикам в замечательном FastAI, с многими трюками, которые он пропагандирует в своем курсе, и получили SOTA практически для всего. Так как я являюсь небольшим евангелистом PyTorch, я все-таки смог выкорчевать данную модельку из FastAI, запихнуть, уже можно сказать, в свой фреймворк для PyTorch, и даже обучить все это дело под эту задачу. В основном у нас был некий диалоговый контекст, по сути, это даже если у нас было несколько предложений, вы просто конкатинируете это в одно здоровенное предложение. А дальше у нас был answer, некоторое предложение. Все это можно подать в тот самый кодировщик из FastAI, называется Universal Language Model — а дальше сложно — Encoder. После этого мы получаем контекст, который, положим, состоит из 1 до Т таймстепов, как мы любим в seq2seq. Дальше получается после энкодера вырождается Т таких последовательностей. Энкодер энкодит каждое предложение и переводит каждое слово в некий вектор, и дальше используется специальный пулинг, который был предложен в FastAI — Concat poolling. В чем суть? Мы берем последнее представление предложения как в обычных seq2seq, которые даже без attention. Дальше берем maxpool и minpool от всех последовательностей этих векторов, и получаем новый вектор размерностью в три раза больше, который и энкодит все наше предложение. На самом деле, даже если забыть про этот хакатон, этот замечательный пулинг работает просто на ура, и даже в картиночных конкурсах, если у вас объединен maxpool и minpool, работает просто отлично. После этого мы заэнкодили контекст, и наш возможный ответ — в некоторое представление H, Hc и Ha. Эти вектора передаются на дополнительные линейные модели, обычные типичные feedforward сеточки, и получаются некоторые эмбединги. После того, как мы получили некоторые эмбединги, мы можем учить, по сути, любой metric learning. В нашем случае мы использовали самый простой способ — CosineEmbedding Loss, он доступен в PyTorch. По окончании этого конкурса я проводил еще небольшие эксперименты и выяснил, что loss можно использовать чуть другой и будет даже еще лучше. Если кому интересно, это contrastive loss, он вне этой презентации, мы его так и не успели использовать. У нас остается два вектора, они нормализуются и дальше считается просто косинусное расстояние. Это наше DL-решение. ElasticSearch, эвристики и прочее. ![]() Однако хотелось чего-то большего. У нас были хорошие показатели по диалоговому скору, однако по скору Persona все было не так гладко, ввиду того, что в нашей обучающей выборке, по сути, не было тех персон, на которых проводился evaluation. Пришло время замечательных heuristic solutions. Первое, что мы придумали, это задавать вопросы, чтобы наш бот не был пассивным и спрашивал у людей, что вы любите. Разводил вас на диалог. Тогда люди больше отвечали, по сути, выполняли больше работы, нам надо было думать меньше, просто иногда хорошо отвечать, но это вроде мы умели. И это замечательно работало. Дальше мы придумали небольшую совершенную эвристику — диалоги по некоторому сценарию. На самом деле мы придумали только один сценарий, потому что реально писать эвристики для диалогов — это очень много иф-элсов, а никто не хотел писать иф-элсы, мы же академики, в конце концов. Также у нас был небольшой dirty hack. Когда пришел последний день, мы решили поставить все на кон и использовать то, что разрешалось рассказывать о своей персоне меньше пентаграмм. Поэтому нашу персону можно было легко понять. Опять же — пришлось использовать много эвристик, чтобы не говорить об этом в лоб. ![]() ![]() ![]() Во-вторых, надо потюнить все наши DL-решения. Согласитесь: когда у вас четыре дня на то, чтобы вывести это в продакшен, вам немного не до того, чтобы подбирать гиперпараметры и прочее. Вы просто берете то, что работает, и, перекрестив, отправляете это в путь. И я не знаю, почему мы не взяли бэйзлайн. Это историческая несправедливость, поскольку мы прошли на этот конкурс благодаря бэйзлайну. Никто из нас не знает, почему мы не попробовали его дальше. Просто мы такие — да у нас pre-trained-модельки (неразборчиво — прим. ред.), используем. Много вопросов. Конечно, в наших proposals лично я говорил, что я сделаю RL bandits и заэнсамблю за два дня. Под это лучше не коммититься, не выйдет. Все это можно улучшить — бот и правда будет намного лучше. И возможно, надо было улучшить эвристики. Кажется, что правильно добавленные эвристики, даже с теми же замечательными смайлами и прочим, и возможно, правильные реакции на всякие toxic-комменты дают еще один небольшой буст. Это кажется логичным. На хакатон вы должны идти с одной целью — взять и победить. В реальности в нашей команде также был Денис Антюхов, и мы участвовали с ним в DeepHacks еще года два назад. Мы знаем NLP, и на этот DeepHack мы пришли с мыслью, цитирую, «опустить лидерборд». Не опустили, к сожалению. Но цель кажется очень логичной. Если вы хотите участвовать в конкурсах, хакатонах, кегглах, в чем угодно, то вы должны идти с целью не просто поучаствовать, а победить и порвать всех. Правильная команда — это и вправду самый лучший залог успеха. Наша команда из пяти человек была самой distributed-командой из всех на этом хакатоне ввиду того, что мы так никогда и не встретились. Сегодня первый раз, и мне наконец передали футболку с DeepHack. Но между тем мы все-таки получили неплохой результат. Берите хорошую команду. Сильная команда, если вы знаете друг друга, может дать огромный буст, поскольку вы не потратите дня два на то, чтобы начать понимать друг друга. Начинайте с бэйзлайнов! Серьезно. Даже не надо использовать свои pre-trained-модельки. Начать с бэйзлайнов, возможно, лучше. И конечно, берите отпуск на хакатон. Когда вы участвуете в недельном хакатоне и одновременно еще и работаете, это плохо. Вы приходите в 7 вечера, немножко поработавший, садитесь и компилите Docker с TensorFlow, Keras, чтобы все это запустилось на каких-то удаленных серверах, к которым у вас даже доступа нет. Где-то в два ночи вы ловите катарсис, и у вас это работает — без Docker, без всего, потому что вы поняли, что можно и так. Кажется, что если вы участвуете в большом конкурсе, то все-таки выделите под него чуть больше времени, чем сколько можно не спать в неделю, и участвуйте. Идите и выигрывайте. Спасибо! Источник: habr.com ![]() Комментарии: |
||||||