Коротко о Deep Learning
Это перепост серии постов из моего телеграм-канала, потому что там они уже потерялись и на них сложно давать ссылки.
Давайте про нейросети короче. Рассказ будет с целью скорее заинтересовать, надеюсь, никто не надеется научиться чему-то через телеграм? Так что гуманитарии можете не пугаться — никакого матана, только кулстори.

У меня неистово бомбит от того, как объясняют диплернинг в популярных источниках. Такое ощущение, что они там все сговорились говорить об этом настолько сложно, чтобы никто нихрена не понял и зарплаты датасаентистов так и оставались топовыми в США.

Нет, настоящий датасаенс действительно заумная и сложная наука, в которую могут тыщ пять выпускников Стенфорда и МФТИ в мире. Но тут как и в любой области: перебрать двигатель современного автомобиля могут единичные механики, но это не отменяет, что ездить на машине может почти каждый.

На дворе ТУ-КЕЙ-17-й, щас не нужно знать как с помощью ложки и зажигалки сделать градиентный бустинг, чтобы распознавать котиков на фотографии. Появилась гора готовых моделей на гитхабе, разработанных этими самыми датасаентистами, их можно просто взять и решать свои задачи.

Даже не надо бежать на авито за подержанным GeForce 1080 Ti, видеокарта вашего макбука научится котикам за ночь.

Об этих вещах будем говорить.

Прикрепляю в чат лик Андрея Себранта, заряженный на нейросети, машинлёрнинг и быструю сходимость градиентов.

Меня всегда смущал баззворд «Deep Learning». Чем это отличается от нейросетей, которые известны чуть ли не с середины прошлого века? Оказалось, что практически ничем.

Просто пару лет назад нашлись отчаянные исследователи, которые подумали накупить побольше игровых видеокарт и (пройдя фаллаут на максималках) сделать такие огромные нейросети, о которых раньше даже по пьяни подумать боялись.

Бум производительности видеокарт был лишь одной из причин. С каждой новой связью в сети, её сложность возрастала на порядки. На обучение классическими методами ушла бы целая вечность. Ребятам пришлось постараться и подвезти новых математических методов под это дело, но главным прорывом стало понимание того, что оказывается можно обучать сеть не только на входных данных, но и на результате работы самих этих сетей.

Но суть от этого не изменилась. Те же нейроны (по сути маленькие функции), те же связи между ними с весами (которые и надо обучать), подаём данные на вход, суммируем всё красиво внутри, смотрим на выход.

Нейросети вообще стали эпик лайфхаком для тех, кто не хочет погружаться в машинлернинг и помнить где какой метод регрессии подойдет. Сделал сеть, скормил данные и желаемые результаты, она как-то там внутри на них обучилась, а ты сиди тока жифорсы ей подноси.

Конечно это займет чуть больше времени, но это же роботы вкалывают, их не жалко. А результат так же можно сложить хоть циферками в текстовый файлик и загрузить даже в телефон. Теперь даже клавиатура на айфоне использует нейросеть, чтобы подсказывать слова.

С приходом диплернинга суть вообще не изменилась. Поменялось лишь отношение — теперь мы можем обучаться на том, чему обучилась предыдущая сеть или её слой. Именно это и означает слово «глубокие» в названии.

Вот об этом и поговорим дальше. А если вы ничего не знаете про нейросети, но заинтересовались — у меня для вас отличное видео от Вячеслава Ковалевского и Глеба Бочкарева, где всё это объясняется на простых жизненных примерах и без матана. Побольше бы таких:

Вот, предположим, вам захотелось как в сериале Silicon Valley сделать приложение, определяющее хот-дог это или не хот-дог. Или банально искать котиков на картинках. Как?

Первое, что приходит в голову — взять 1000 фотографий котиков и попытаться как-то описать его глупой машине. Вот глазки, вот ушки, вот урчальник — это котик. Только назовём это как-нибудь типа «handcrafting признаков». Чтобы все знали, что мы тут не глупостями занимаемся, а датасаенсом.

И на самом деле да, так раньше и делали.

Одна проблема: качество откровенно позорное. Котики уши прижал, голову наклонил и всё — уже не котик. Как в том же Silicon Valley, когда выяснилось, что приложение определяет пенисы лучше, чем хот-доги.

Нужен другой подход. Наши handcrafted-признаки мы всё равно описывали на понятном машине языке. Мол, вот тут две линии треугольничком — наверное ухо. Два кружочка — наверное глаза. То есть любые признаки были наборами контрастных границ на изображении.

Тогда зачем огород городить, берем эти самые границы. Делим всё изображение на блоки, например, 8x8 пикселей и в каждом из них находим какая линия наиболее контрастна. Какие захотим — горизонтальная [-], вертикальная [|], диагональная [/], да хоть крестовая [x].

Получаем того же самого котика, разложенного на отрезки, на которых теперь можно и городить обучение. Берем эти линии для тысячи котиков и обучаем сеть искать среди них характерные сочетания (треугольные ушки, например). А между этими сочетаниями искать еще сочетания. Так еще и еще раз.

Но как определить «правильные» сочетания? Да никак, тут-то вкалывают роботы. Нейросеть сама делает миллионы предположений, ошибается, корректируется, а на выходе получает то, что надо — характерные признаки котиков. Только намного более точные.

Если визуализировать каждый такой «слой» получится что-то типа этой картинки. На каждом этапе признаки становятся нагляднее и характернее:

И вот эти самые поиски линий называются «свёртками», а сама такая архитектура является важнейшей в Deep Learning’е и называется Свёрточные Нейросети или Convolutional Neural Networks.

В моём описании опущены некоторые детали типа понижения размерности на каждом шаге, чтобы избавиться от шумов и поворотов, и последнего шага — где собственно на наборе таких сверток и нейросеть начинает понимать котик это или хот-дог.

Иначе бы тут получилась целая глава. Кому интересно поподробнее и наглядно, как обычно прикладываю рекомендуемое видео от Дмитрия Коробченко из NVIDIA. Ссылка на конкретный таймстамп, если не пробросится — примерно с 17:48:

Кстати на сайте TensorFlow есть удобная песочница по нейросетям. Можно прямо в браузере понатынькать себе слоев и нейронов и наблюдать за поведением всей сети. http://playground.tensorflow.org
Пожалуй самым известным практическим применением сверточных нейросетей (CNN) стал в прошлом году стартап Prisma. Всё началось в 2015 году с исследования Leon A. Gatys, в котором был описан теоретический подход. Исторически важный оригинал документа: https://arxiv.org/pdf/1508.06576v1.pdf

Идея была в том, что нейросеть, обученная на распознавание стиля, внутри себя начинает иметь представление о характерных стилистических особенностях изображения. Например распознавалка котиков догадывается о характерной форме морды и ушей.

Нам лишь нужно «оторвать» от такой сети последний слой (который и определяет котика), как-то скормить ей другую картинку и наложить результаты на оригинал. То есть не распознать, а сгенерировать максимально похожее с точки зрения нейросети изображение. Таким образом задача переноса стиля сводится к простой математической задаче оптимизации.

Принесу вам годнейший лонгрид на простом английском, где реализация такого подхода рассказывается прям по шагам и для самых маленьких: https://harishnarayanan.org/writing/artistic-style-transfer/
Кстати для съемок той серии сериала Silicon Valley, в HBO реально написали приложение, определяющее хот-дог на фото или нет. Восхищен таким вниманием к деталям. После выхода серии они выложили его в AppStore, можете найти.

А вчера появился перевод статьи как они его делали. Всё как я рассказывал выше: те же Keras, TensorFlow и сверточная сеточка. Обученную сеть загрузили на телефон и запилили к ней интерфейс на React Native.

Нейросети сейчас это вот так вот просто, никакого рокетсаенса.

Скоро надеюсь дописать свой большой пост на похожую тему, вчера опять не успел закончить. А пока почитайте опыт от HBO: https://habrahabr.ru/post/331740/
Ну и два моих поста по итогам:

Комментарии
1
Максим ⸬ 03 октября 2017, 15:37 ⸬ Moscow, RU ⸬ Apple лог
#
Первый видосик в статье отъехал
0
vas3k ⸬ 03 октября 2017, 16:35 ⸬ Vilnius, LT ⸬ Apple лог
#
Максим, спасибо, пофиксил
0
buriy ⸬ 19 октября 2017, 09:54 ⸬ RU ⸬ Linux лог
#
Не, фигово объяснил.
>Ребятам пришлось постараться и подвезти новых математических методов под это дело,
Каких это ещё методов?
>но главным прорывом стало понимание того, что оказывается можно обучать сеть не только на входных данных, но и на результате работы самих этих сетей.
Вот это вообще что за бред?
Если бы на результате работы сетей можно было бы сети обучать и получать более хорошие результаты, то нахер что-то ещё делать вообще?
Да и вообще, как это?
(не заполняйте это поле)

Еще? Тогда вот
me@vas3k.ru :: telegram :: twitter :: instagram :: facebook :: github