Реализация (в Керасе) нескольких идей, представленных в статье Джеффри Хинтона, Ориола Виньялса и Джеффа Дина Извлечение знаний в нейронной сети.

Бабочки начинают с гусеницы, которая является их личиночной формой. Они извлекают необходимую энергию и питательные вещества из окружающей среды до получения взрослой формы, которая оптимизирована для самых разных требований. То же самое и с нейронными сетями. Цели, которые нейронная сеть выполняет во время обучения и развертывания, совершенно разные. Но мы все время используем одну и ту же сеть. Так не должно быть. Вдохновленные этой идеей и некоторыми предыдущими исследованиями, проведенными Каруаной и др., Джеффри Хинтон, Ориол Виньялс и Джефф Дин отправились в путешествие, чтобы раскрыть темные знания, присутствующие в нейронной сети.

Что такое темное знание?

Рассмотрим простую задачу многоклассовой классификации. У нас есть набор изображений, и мы хотим классифицировать их по одному из четырех классов cow, dog, cat и car. У нейронной сети, которую мы обучаем для решения этой задачи, очевидно, будет последний слой softmax.

Допустим, изображение, которое мы пытаемся классифицировать, имеет dog. Так что настоящие ярлыки будут

Скажем, вероятности, вычисленные для этого изображения нормальной функцией softmax, равны

Мы видим, что вероятностями для cow и car можно пренебречь. Но что, если мы смягчим эти вероятности. Для этого мы можем изменить функцию softmax, чтобы она выглядела так.

softmax = exp (zᵢ / T) / Σ exp (z / T), где T - температура, а z - логиты.

Когда T = 1, это обычная функция softmax. Чем выше значение T, тем ниже вероятности. С новой функцией softmax наш вывод изменится на

Новые вероятности, вычисленные с помощью модифицированной функции softmax, раскрывают гораздо больше информации, чем обычные вероятности. Глядя на новый результат, мы можем сказать, что изображение собаки очень мало может быть ошибочно принято за cow. Но эта ошибка на порядок более вероятна, чем ошибка неправильной классификации изображения как car.

Относительные вероятности неверных результатов многое говорят нам о том, как модель имеет тенденцию к обобщениям. - https://arxiv.org/pdf/1503.02531.pdf

Это темное знание! Смягченные вероятности раскрывают это темное (скрытое) знание, усвоенное моделью. Извлечение и использование этого темного знания также известно как дистилляция. Мы еще раз вернемся к этой концепции в следующем разделе на реальном примере.

Как использовать Темное знание?

Мы можем обучить большую модель реальным целям. После обучения этой большой модели мы сможем извлечь темные знания, скрытые в этой сети. Затем мы можем обучить гораздо меньшую сеть темным знаниям. Это идея высокого уровня. Попробуем разобраться в этом подробнее, написав код.

Запуск кода

Вы можете запустить приведенный ниже код в своем браузере через этот блокнот Colab.

Обновление (сентябрь 2019 г.). Несколько читателей сообщили, что результаты, показанные в этой записной книжке Colab, больше не воспроизводятся. Я перепроверил и подтвердил, что то, что они говорят, действительно правда. Я предполагаю, что с тех пор, как я написал эту записную книжку, библиотеки в Colab были обновлены, и результаты больше не воспроизводятся. Я постараюсь исправить это, когда у меня будет время. А пока, если кто-то знает, что это за исправление, напишите мне, и я обновлю его.

Обновление 2 (май 2020 г.): указанное выше обновление больше не действует. Благодаря Panagiotis Chalimourdas из сообщества Distill Slack проблема решена, и результаты снова воспроизводятся!

Настройка

Мы будем использовать Tensorflow + Keras. Если вы запускаете код на Colab, дополнительных настроек не требуется. Однако, если вы запускаете его на своем локальном компьютере, установите версию 1.12.0 Tensorflow, выполнив команду pip install tensorflow==1.12.0.

Идея

Мы будем реализовывать идею, представленную в статье Джеффри Хинтона, Ориола Виньялса и Джеффа Дина Выделение знаний в нейронной сети.

Мы не будем точно следовать архитектурным деталям, представленным в документе. Я пытался повторить результаты, опубликованные в статье, но безуспешно. Однако идея дистилляции многообещающая, и я получил хорошие результаты с другим набором архитектуры. Итак, приступим.

Мы будем описывать идею ниже по мере продвижения. Но прежде всего давайте начнем с очень простой задачи классификации на несколько классов.

Набор данных

Мы будем использовать набор данных MNIST. Он поставляется со встроенным Keras, что упрощает дело. Давайте создадим функцию для его загрузки. Мы также нормализуем набор данных и будем горячо кодировать метки.

Исходная модель

Затем давайте создадим простую CNN с двумя слоями свертки размером 32 и 64, за которыми следует слой максимального пула. Для этого мы воспользуемся функциональным API Keras.

Вот краткое изложение модели.

Обратите внимание, как мы определили последние два уровня в приведенном выше коде. Последний плотный слой с именем logits не имеет функции активации. Мы отдельно определили уровень активации с именем softmax. Мы могли бы просто сделать это за один шаг.

preds = layers.Dense(10, activation=’softmax’, name=’Softmax’)(x)

Но есть причина делать это в два этапа вместо одного. Мы обсудим это через некоторое время.

Давайте обучим эту модель 15 эпохам с размером пакета 512.

Когда я тренировал это на своем Блокноте Colab, потеря тренировки составляла0.0232, а точность тренировки была 0.9928.

Теперь, когда модель обучена, давайте посмотрим, как она работает на тестовом наборе.

(Выполнив приведенный выше код, мы получим следующий результат.)

Здорово! Мы получили точность 0,9918. Это означает, что мы неправильно классифицируем 82 изображения.

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

Softmax и температура

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

Прежде всего, давайте определим модифицированную функцию softmax.

Входы в слой softmax называются логитами. Возьмем эти логиты из модели. Помните, что в приведенном выше коде мы определили последний слой softmax в два шага вместо одного. Мы разделили слой logits и слой softmax. Если бы мы сделали это за один шаг, у нас не было бы возможности получить logits.

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

Давайте передадим эти логиты нашей недавно определенной функции softmax. Для начала оставим temperature=1. Это даст нам фактические (не смягченные) вероятности.

Давайте посмотрим на реальную вероятность появления первого изображения. Перед этим построим изображение, чтобы самому увидеть, какая рукописная цифра на нем присутствует.

OK! Итак, первое изображение - это номер 5! А что предсказывала наша модель?

Прохладный! Итак, наша модель предсказала это правильно. Но неверные вероятности - это очень и очень маленькие числа.

А теперь давайте смягчим вероятности, увеличив температуру softmax до 4, и посмотрим, как они выглядят.

Глядя на смягченные вероятности, становится ясно, что это изображение 5 больше всего похоже на 3, а второе - на 9. Меньше всего он похож на 4. Как люди, мы можем получить эти знания, просто посмотрев на изображение.

Проделаем то же самое для другого изображения. Возьмем 17-е изображение из обучающей выборки.

Смягченные вероятности ясно показывают, что это изображение 2 больше всего похоже на 7, а второе - на 3. Наименее запоминается с 6.

Передача темных знаний

Теперь мы можем использовать это темное знание для обучения модели гораздо меньшего размера.

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

Мы создадим модель с двумя полностью связанными слоями по 128 единиц в каждом.

Давайте обучим эту модель 50 эпохам с размером пакета 512.

Точность этой модели по тестовым данным составляет 0.9785, что означает, что она неправильно классифицирует 215 изображений. Также обратите внимание, что модель сильно переобучена и уже насыщена.

Затем давайте обучим модель с точно такой же архитектурой на смягченных вероятностях. Маленькая модель также должна быть обучена с тем же значением температуры. Поэтому сначала нам нужно изменить модель. Давайте добавим температурный слой перед слоем softmax в маленькой модели.

Теперь давайте обучим эту модифицированную модель для 100 эпох с размером пакета 512. Давайте также увеличим скорость обучения до 0.03.

Обратите внимание, что вместо передачи y_train мы передаем softened_train_prob для обучения. Для оценки мы по-прежнему используем настоящие метки y_test.

В идеале для обучения меньшей модели мы должны использовать протяженный передаточный набор. Мы также должны взять средневзвешенное значение потерь мягких и фактических целей для функции потерь. При прогнозировании следует сбросить температуру до 1. Но пока мы пропустим эти шаги.

Точность тестирования этой модели составляет 0.9818, что является значительным улучшением по сравнению с 0.9785.

Резюме

  • У CNN, которую мы обучили, было 1 199 882 параметра. Меньшая полностью подключенная модель имеет 118 282 параметра. Полностью подключенная модель на 90% меньше, чем CNN!
  • В то время как CNN имеет точность 0.9918, точность меньшей модели составляет 0.9818. Это означает, что мы уменьшили размер нашей модели на 90%, изменив точность на 1%.

Давайте сравним две меньшие модели.

  • Первая меньшая модель быстро переобучается, даже если она обучается со скоростью обучения 0.001. С другой стороны, переоснащение во второй модели намного меньше даже после 100 эпох. И это несмотря на то, что вторая модель обучается с гораздо более высокой скоростью обучения 0.03.
  • Убыток во второй модели все еще снижается. Таким образом, есть возможности для дальнейшего повышения точности за счет настройки гиперпараметров.
  • Совершенно очевидно, что тренировка по мягким целям также действует как регуляризатор.

Вывод

Этот тип перегонки широко известен как архитектура студента-учителя. В нашем случае CNN - это модель учителя, а меньшая - модель ученика.

Еще раз, вы можете запустить код, представленный в этом посте, в своем браузере через этот блокнот Colab.

То, что мы обсудили в этом блоге, - это лишь верхушка айсберга. Я не включил много других вещей, которые обсуждаются в статье. Я очень рекомендую вам пойти и почитать газету. Он доступен по адресу https://arxiv.org/pdf/1503.02531.pdf. Джеффри Хинтон также выступил с докладом на эту тему. Он доступен на YouTube. Слайды доклада доступны здесь.