Введение

Я изучал машинное обучение и репрезентативное обучение, которое стало «глубоким обучением», посещая курсы Йошуа Бенжио в конце 2000-х годов в Université de Montréal (UdeM). Недавно я решил освежить свои знания с помощью книги «Deep Learning», опубликованной MIT Press в 2016 году, с участием двух профессоров UdeM и блестящего аспиранта Яна Гудфеллоу, который сейчас работает в Google. Я буду называть эту книгу книгой GBC (Goodfellow, Bengio, Courville).

Книгу GBC стоит прочитать. Это определенно авторитетный справочник по глубокому обучению, но у вас не должно быть аллергии на математику.

Тем не менее, главная слабость этого шедевра - отсутствие практических упражнений по программированию, оставленных на сопутствующем веб-сайте. Но чтобы охватить все практические вопросы, книга должна была превышать 775 страниц, которые в ней уже есть. Более того, обучение с подкреплением поверхностно представлено в книге GBC, которая должна стать отдельной главой. [Примечание]

Я мечтаю о таком же контенте в виде серии блокнотов iPython со всеми упражнениями и образцами кода с использованием Keras, TensorFlow и Theano.

Итак, теперь я внесу скромный вклад в свою мечту, написав пример 6.1: изучение XOR стр. 166–171 с использованием TensorFlow. Хорошо, я знаю, что мне следовало использовать Theano, который в основном разрабатывается и поддерживается лабораторией MILA в UdeM… В следующий раз!

[Goodfellow, Bengio, Courville, 2016] Goodfellow, I., Bengio, Y., & Courville, A. (2016). Глубокое обучение. MIT Press. На сайте: http://www.deeplearningbook.org/

[Примечание] Чтобы быть полностью честным, авторы написали короткое заявление об обучении с подкреплением в главе 5, стр. 103 «Основы машинного обучения». «Такие алгоритмы выходят за рамки этой книги».

Изучение XOR - Книга GBC - Глава 6 - Пример 6.1 - стр. 166–171

Проблема XOR

Чтобы сделать идею сети прямого распространения (или многоуровневого перцептрона) более конкретной, в главе 6 (Глубокие сети прямого распространения) книга GBC предлагает небольшой пример полностью функционирующей сети прямого распространения для очень простой задачи: изучение XOR (« исключающее или ») функция. Ниже представлена ​​таблица истинности XOR:

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

Проблема с XOR в том, что его выходы не разделимы линейно. Никакая единственная прямая линия не может отделить положительные примеры от отрицательных.

Споры Мински и Паперта по поводу XOR

В то же время, вероятно, за этим точным примером из книги Джи-би-си, вероятно, стоит историческая причина. Это было у истоков разногласий Мински-Паперта по поводу XOR. Согласно легенде, исследования нейронных сетей испытали первую паузу после публикации в 1969 году книги о перцептронах Марвина Мински (который умер 24 января 2016 года) и Сеймура Паперта (умер 31 июля того же года), что могло бы поставить акцент на этом ограничении перцептрона.

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

Месть Персептрона

Нейронная сеть с одним скрытым слоем может изучить XOR

Тем не менее, теперь мы покажем, что нейронная сеть с одним скрытым слоем и алгоритмом обратного распространения может изучать XOR.

Ниже представлена ​​архитектура нашей мелкой (совсем не глубокой!) Нейронной сети с прямой связью, которая содержит 5 нейронов или единиц, распределенных на 3 слоя: входной слой, содержащий два нейрона (или единицы), единственный скрытый слой, содержащий 2 нейрона и выходной слой с 1 нейроном.

Левая часть приведенного выше рисунка показывает подробное представление нейронной сети, нейрон за нейроном, со всеми связями (кроме смещений). Эта запись может быть слишком громоздкой для больших сетей. Справа нейронная сеть представлена ​​слоями в более компактной записи с весами, представленными матрицей (W и w ).

Позади немного математики

Функция XOR - это целевая функция y = f * (x), которую мы хотим изучить. Модель предоставляет функцию y = f (x; θ), и наш алгоритм обучения обратным распространением адаптирует параметры θ , чтобы сделать f как можно более похожим на f *.

В этом простом примере нейронная сеть должна изучить только четыре точки X = {[0,0] ⫟, [0,1] ⫟, [1,0] ⫟, [1,1] ⫟} таблицы истинности XOR. Для этого мы обучим нейронную сеть по этим точкам с повторением по мере необходимости. Здесь нет больших данных! У нас есть только горстка параметров, 6 весов, 12 смещений. В любом случае, переоснащение здесь тоже не проблема!

Архитектура нейронной сети представляет собой очень простую сеть прямого распространения, состоящую из трех уровней. Первый уровень - это простой входной слой x, который подается на второй уровень, который представляет собой один единственный слой скрытых единиц h, вычисленных аффинной функцией (линейная функция, за которой следует перевод, например f (x) = 𝜃x + b, определяемый его изученными параметрами (𝜃, b ), за которым следует нелинейная функция, называемая функцией «активации». Таким образом, мы определяем h = g (x⫟ W + c), где W - веса аффинной функции, c смещения и g функция активации. Поскольку у нас есть аффинная функция от вектора x к вектору h , то необходимы полный вектор матрицы W весов и вектор c параметров смещения. Значения эти скрытые блоки являются входом для третьего уровня, который является выходным слоем сети. rk. Выходной слой - это модель линейной регрессии, примененная к h.

К каждому элементу применяется функция активации g, при этом:

Современная рекомендация для функции активации - использовать выпрямленную линейную единицу или ReLU, определяемую функцией g (z) = max {0, z} показано ниже. Как ни странно, эта функция не является ни непрерывной, ни выводимой при z = 0.

Математически полная сеть:

Функция потерь

Пришло время выбрать функцию потерь. Мы будем рассматривать эту проблему как регрессию и для простоты использовать среднеквадратичную функцию потерь ошибок (MSE).

Математически наша функция потерь MSE:

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

Реализация TensorFlow

Пришло время перейти к реализации сети XOR в TensorFlow. Меня вдохновила запись в блоге Стивена ОМАНа Решение XOR с нейронной сетью в TensorFlow и код в его репозитории на GitHub.

Ниже моего кода TensorFlow:

Игра с разными функциями потерь

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

Во-первых, наивная прямая реализация функции потерь, как показано в книге GBC.

n_instances = X.get_shape (). as_list () [0]
loss = tf.reduce_sum (tf.pow (y_estimated - Y, 2)) / n_instances

Затем классическая функция MSE, предложенная для простоты математики в книге GBC, которая использует функцию TensorFlow tf.reduce_mean, которая должна решать проблему числовой стабильности, как я где-то читал ...

потеря = tf.reduce_mean (tf.squared_difference (y_estimated, Y))

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

потеря = tf.nn.sigmoid_cross_entropy_with_logits (logits = y_estimated, labels = Y)

В случае проблемы с градиентом (взрывающийся или исчезающий градиент) мы могли бы альтернативно выполнить отсечение градиента с помощью функции TensorFlow tf.clip_by_value (t, clip_value_min, clip_value_max). Любое значение меньше clip_value_min будет установлено на clip_value_min. Любое значение больше clip_value_max будет установлено на clip_value_max.

n_instances = X.get_shape (). as_list () [0] `
loss = tf.reduce_sum (tf.pow (tf.clip_by_value (y_estimated, 1e-10, 1.0) - Y, 2)) / (n_instances )

Полный код на GitHub: https://github.com/ClaudeCoulombe/GBC_book_DeepLearningBook

Результаты