Друзья!
Мы поздравляем всех наших подписчиков с днем знаний и желаем, чтобы знаний было больше, их приобретение – интересным, а сами знания – более полезными.
Чтобы воплотить эти пожелания в жизнь, мы предлагаем вашему вниманию видеозапись курса «Однодневное погружение в нейронные сети», который мы провели летом в рамках закрытой школы DevCon. Этот курс позволит за несколько часов погрузиться в тему нейронных сетей и «с нуля» научиться использовать их для распознавания изображений, синтеза речи и других интересных задач. Для успешного освоения курса будут полезны умение программировать на Python и базовые знания математики. Материалы курса и заготовки для практических заданий доступны на GitHub.
Предуведомление: Данные видео представляют собой запись интенсива, рассчитанного в основном на аудиторию, присутствующую в зале. Поэтому видео несколько менее динамичные, чем в онлайн-курсах, и более длинные, не нарезанные на тематические фрагменты. Тем не менее, многие зрители сочли их для себя весьма полезными, поэтому мы и решили поделиться с широкой аудиторией. Надеюсь, возможность узнать что-то новое вызывает у вас такую же неподдельную радость, как у моей дочери на фотографии.
Что потребуется
Представленные материалы состоят из двух основных частей: видеороликов (запись интенсива) и лекций (с примерами) и заданий в Azure Notebooks. Поэтому мы рекомендуем вам открыть видео в одном окне, а лекции или задания — в другом, чтобы параллельно самостоятельно проверять все демонстрируемые примеры.
Azure Notebooks — это технология, основанная на Jupyter, позволяющая вам комбинировать в едином документе естественно-языковый текст и код на каком-либо языке программирования. Для работы с Azure Notebooks понадобится Microsoft Account – если у вас его нет, создайте себе новый почтовый ящик на Outlook.com.
Завершающий пример с обучением нейросети на распознавание кошек или собак лучше выполнять на виртуальной машине с GPU, иначе будет слишком долго. Такую машину можно создать в облаке Microsoft Azure, если у вас есть подписка (только имейте в виду, что с бесплатной подпиской Azure Trial не всегда удаётся создать машину с GPU).
Начало работы
Очень важно в процессе просмотра видео параллельно пробовать примеры, а после просмотра курса — придумать себе какую-нибудь задачу для закрепления знаний. Поскольку материалы не являются онлайн-курсом (у нас пока не дошли руки), то мы не можем проверить вашу работу или ваши знания. Но очень рекомендуем не смотреть видео «просто так», поскольку это может оказаться впустую потраченным временем. Запустить и попробовать примеры очень просто!
Для начала работы зайдите в библиотеку материалов курса на Azure Notebooks и нажмите кнопочку Clone (клонировать). Таким образом вы получите свою копию всех материалов, и сможете на лету вносить изменения в код и смотреть, что получается. Откройте библиотеку в отдельном окне, и приступайте к просмотру видео.
Видео
Часть I
[0:00] Введение в искусственный интеллект в целом, когнитивные сервисы, Bot Framework, Azure Machine Learning. Это не имеет прямого отношения к нейросетям, но полезно для общего развития.
[0:27] Введение в Azure Notebooks и базовые возможности Python, которые нам будут важны.
[0:48] Однослойный персептрон и реализация простейшей нейросети «вручную».
[1:10] Реализация простейшей нейросети на Microsoft Cognitive Toolkit (CNTK). Алгоритм обратного распространения ошибки.
[1:48] Лабораторная работа: классификация ирисов.
[2:27] Лабораторная работа: распознавание рукописных цифр.
Тем, кому не терпится сразу перейти к делу — рекомендую смотреть с 1:10, где мы начинаем использовать Cognitive Toolkit для реализации простой задачи классификации. Основная идея состоит в следующем: нейросеть, которая схематически изображена на рисунке ниже, может математически представляться как произведение матрицы весов W на входные значения x, с учетом сдвига b: y = Wx+b.
Нейросетевые фреймворки типа CNTK позволяют нам задать конфигурацию сети в виде «графа вычислений», по сути дела написав эту формулу:
features = input_variable(input_dim, np.float32)
label = input_variable(output_dim, np.float32)
W = parameter(shape=(input_dim, output_dim))
b = parameter(shape=(output_dim))
z = times(features,W)+b
После этого фрейморк позволяет нам применять один из алгоритмов обучения, подстраивая веса матрицы W, чтобы нейросеть начинала всё лучше работать на обучающей выборке. При этом по заданной формуле фреймворк берет на себя все сложности по вычислению производных, необходимых для работы метода обратного распространения ошибки.
Аналогичным образом мы можем задавать конфигурации и более сложных сетей, например, для двухслойной сети со скрытым слоем:
hidden_dim = 5
W1 = parameter(shape=(input_dim, hidden_dim),init=cntk.uniform(1))
b1 = parameter(shape=(hidden_dim),init=cntk.uniform(1))
y = cntk.sigmoid(times(features,W1)+b1)
W2 = parameter(shape=(hidden_dim, output_dim),init=cntk.uniform(1))
b2 = parameter(shape=(output_dim),init=cntk.uniform(1))
z = times(y,W2)+b2
Используя более высокоуровневой синтаксис, тоже самое может быть записано более компактно в виде композиции слоёв:
z = Sequential([
Dense(hidden_dim,init=glorot_uniform(),activation=sigmoid),
Dense(output_dim,init=glorot_uniform(),activation=None)
])(features)
В этой части также обсуждаются важные вопросы о переобучении сетей, и как подобрать «ёмкость» сети в зависимости от количества обучающих данных таким образом, чтобы избежать переобучения.
Часть II
[0:00] Распознавание рукописных цифр.
[0:04] Свёрточные нейронные сети для распознавания изображений.
[0:49] Лабораторная работа: повышение точности распознавания с помощью свёрточной сети.
[1:07] Тонкости обучения: batch normalization, dropout и т.д. Сложные архитектуры сетей для решения специфических задач. Автоэнкодеры. Применение нейросетей в реальных проектах.
Основная идея этой части состоит в том, чтобы рассказать, как из базовых блоков (нейронные слои, функции активации и т.д.) можно собирать более сложные архитектуры нейросетей для решения конкретных задач, на примере анализа изображений. Инструментарии (такие как Cognitive Toolkit/CNTK, Tensorflow, Caffe и др.) предоставляют основные функциональные блоки, которые затем можно комбинировать между собой.
Например, в свёрточных нейронных сетях (Convolutional Neural Network, CNN), применяемых для анализа изображений, используется пробегающее по изображению окно небольшого размера (3x3 или 5x5), которое как бы подается на вход небольшой нейросети, выделяющей из фрагмента изображения важные признаки. Из этих признаков получается «изображение» следующего слоя, который обрабатывается аналогичным образом — при этом этот слой отвечает за признаки более высокого уровня. Комбинируя таким образом множество (десятки и сотни) слоёв, мы получаем сети, способные распознавать объекты на изображении с точностью, не сильно уступающей человеческой. Вот, например, как многослойная свёрточная сеть видит цифру 5:
Во второй половине видео Андрей Устюжанин, руководитель проекта Яндекс-CERN и лаборатории Lambda НИУ ВШЭ, рассказывает о некоторых приёмах построения более сложных конфигураций нейросетей для специфических задач, а также об оптимизационных приёмах в обучении глубоких сетей, без которых невозможно существенное увеличение количества слоёв и параметров.
Часть III
[0:00] Рекуррентные нейронные сети.
[1:09] Обучение нейронных сетей в облаке Microsoft Azure через Azure Batch.
[1:36] Распознавание изображений «кошки против собак» и ответы на вопросы.
Самое главное в этом разделе — рекуррентные нейросети, о которых рассказывает Михаил Бурцев, руководитель лаборатории глубокого обучения МФТИ. Это такая архитектура сети, при которой выход сети подаётся ей же на вход. Это позволяет анализировать последовательности переменной длины — например, за один проход обрабатывается одна буква текста или одно слово предложения, при этом «смысл» сохраняется в передаваемом рекуррентно «состоянии». На основе такого подхода работают системы машинного перевода, генераторы текстов, системы прогнозирования временных рядов и т.д.
Вот, например, какие тексты генерирует нейросеть из рассматриваемого нами примера после 3 минут обучения на текстах англоязычной википедии:
used to the allow do one nine two city feature of demaware boake associet ofte
rinoming have of the landization to stares as decudith vellant turking or a to t
jectional ray storemy to one or countries a russiarnawe it and sentio edaph lawe
t of while artell out prodication american scot their and statesly processed for
zer to a revereing time in the music follows two two one kelanish liter
Вместо заключения
Надеюсь, мы вдохновили вас на изучение нейронных сетей! После просмотра курса самое время придумать себе какую-нибудь задачку или проект: например, сделать генератор стихов или псевдо-научных статей, или анализировать, на каких фотографиях люди присутствуют с закрытыми глазами. Главное — попытаться применить знания на практике!
Вы можете обучать простые сети прямо в Azure Notebooks, использовать Data Science Virtual Machine в облаке Azure, или установить CNTK на свой компьютер. Более подробная информация про CNTK есть на сайте http://cntk.ai, включая обучающие примеры моделей.
Желаю всем читателям тёплой осени и буду рад ответить на все ваши вопросы в комментариях!
Автор: shwars