Перевод | Линь Чунсюань
Редактор | Донна
На этой неделе мы подготовили для вас руководство по нейронным сетям, написанное специалистом по данным Беном Горманом. Это руководство содержит его конкретные идеи обучения, в том числе возникающие трудности и множество подробных решений.
Статья не короткая, но читать стоит глубоко, пожалуйста, соберите!
Искусственные нейронные сети сейчас очень популярны. Как и все популярное, искусственные нейронные сети вызвали изрядную долю скептицизма. Это показуха или действительно новая технология, которая может принести пользу огромному количеству людей?
Чтобы вы начали работать с нейронными сетями, я поделюсь с вами своим процессом обучения с точки зрения профессионального специалиста по данным, который мало в этом разбирается, надеюсь, он будет вам полезен.
Следует отметить, что примеры, рассмотренные в этой статье,Rязыкнаписанный код.
Начнем с мотивационного вопроса. Вот коллекция изображений в градациях серого, где каждая сетка пикселей 2x2 имеет значение пикселя от 0 (белый) до 255 (черный). Наша цель — построить модель, которая распознает изображения с рисунком «лестница».
Здесь мы заинтересованы в изучении того, как найти модель, которая может разумно соответствовать данным.
Метод 1: предварительная обработка
Для каждого изображения мы помечаем пиксели X1, X2, X3, X4 и генерируем входной вектор X=[X1 X2 X3 X4] в качестве входного значения нашей модели. Мы хотим, чтобы наша модель могла предсказывать либо «Истинно» (изображение имеет шаблон лестницы), либо «Ложь» (изображение не имеет шаблона лестницы).
Метод 2: однослойный персептрон (нулевая итерация модели)
Однослойный персептрон — это простая модель, которую мы можем построить. Когда персептрон использует линейно взвешенную комбинацию входных данных, можно получить прогнозируемое значение. Персептрон оценивается как «Истина», если прогнозируемое значение превышает выбранный порог, и «Ложь» в противном случае. В частности,
Мы можем переформулировать его следующим образом:
здесьпредставляет прогнозируемое значение.
Графически мы можем представить персептрон как узел, идущий от входа к выходу.
Например, предположим, что персептрон построен следующим образом:
Здесь вы можете увидеть, как персептрон работает на наших обучающих изображениях.
Это разумный результат, безусловно, лучше, чем случайное угадывание. Все режимы лестницы имеют пиксели с темными тенями внизу, что позволяет использовать более высокие положительные коэффициенты для X3 и X4. Тем не менее, есть некоторые вопиющие проблемы с этой моделью.
Модель выводит действительное число, значения которого связаны с естественными понятиями (большие значения подразумевают большую вероятность того, что изображение ведет себя как ступенчатый паттерн), но нет никаких оснований интерпретировать эти значения как вероятности, особенно когда Их диапазон значений находится за пределами [0,1].
Модель не может зафиксировать нелинейные отношения между переменными.
Чтобы понять эту проблему, рассмотрим следующую гипотетическую ситуацию:
Случай А:Начните с изображения, x = [100, 0, 0, 125], увеличивая от 0 до 60.
Случай Б:Начиная с последнего изображения, x = [100, 0, 60, 125], увеличиваясь с 60 до 120.
Интуитивно, по сравнению со случаем B, случай AДолжен быть больший прирост. Однако, поскольку наша модель персептрона представляет собой просто линейное уравнение, для обоих случаев X3 увеличивается на 60, аТолько увеличился на 0,12.
В то же время с нашим линейным персептроном будет больше проблем, но давайте сначала обратимся к этим двум.
Вопрос 1: Однослойный персептрон с сигмоидой в качестве функции активации (итерация модели 1 раз):
Мы можем решить проблемы 1 и 2 выше, обернув наш персептрон сигмоидальной функцией (и затем выбрав разные значения веса). Напомним, что сигмовидная функция представляет собой S-образную кривую, ограниченную по вертикали от 0 до 1, поэтому ее часто используют для моделирования вероятности бинарных событий.
Следуя этой мысли, мы обновим нашу модель изображением и уравнением ниже.
Это логистическая регрессия. Однако также хорошо интерпретировать эту модель как линейный персептрон с сигмоидой в качестве функции активации, поскольку это дает нам большую пространственную дегенерализацию. Кроме того, поскольку мы будеминтерпретируются как значения вероятности, поэтому мы должны соответствующим образом обновить наши правила принятия решений.
Вопрос 2. Предположим, мы предлагаем следующую подогнанную модель:
Сравните предыдущие разделы, чтобы увидеть, как эта модель работает на том же изображении.
Решение:
Случай А:Начните с изображения, x = [100, 0, 0, 125], увеличивая от 0 до 60.
Случай Б:Начиная с последнего изображения, x = [100, 0, 60, 125], увеличиваясь с 60 до 120.
Обратите внимание, что сувеличивается, как сигмовидная функция вызывает феномен «запуска» (быстрый рост) случая A, но замедляется по мере того, как z продолжает увеличиваться. Это согласуется с нашей интуицией, согласно которой случай A должен отражать большее увеличение, чем случай B, для вероятности лестницы.
К сожалению, с этой моделью все еще есть проблемы:
имеет монотонную связь с каждой переменной. Что, если мы хотим идентифицировать небольшие теневые шаги?
Модель не учитывает взаимодействие переменных. Предполагая, что нижняя часть изображения черная, а верхний левый пиксель белый, затемнение верхнего правого пикселя увеличивает вероятность появления ступенек. Если верхний левый пиксель черный, затемнение верхнего правого пикселя снижает вероятность появления ступенек. Другими словами, в зависимости от значений других переменных увеличение X3, вероятно, должно увеличиваться или уменьшаться.значение . Наша модель в настоящее время не может достичь этого.
Вопрос 3: Однослойный персептрон с сигмоидой в качестве функции активации (модель повторяется 2 раза):
Мы можем решить обе вышеупомянутые проблемы, добавив дополнительный слой в нашу модель персептрона. Мы создадим ряд базовых моделей на основе приведенной выше модели, а затем передадим выходные данные каждой базовой модели в качестве входных данных другому персептрону. Эта модель на самом деле является «ванильной» нейронной сетью. Давайте посмотрим, как это работает, на нескольких примерах.
Пример 1: Идентификация шаблонов лестниц
Создайте модель, которая срабатывает при распознавании шаблона левой лестницы,
Создайте модель, которая срабатывает при распознавании правильного шаблона лестницы,
Увеличьте оценку каждой базовой модели, чтобы окончательная сигмовидная функция была толькоисрабатывают только тогда, когда они очень большие.
или
Постройте модель, которая срабатывает только тогда, когда дно темное,
Создайте модель, которая срабатывает только тогда, когда левый верхний пиксель темный, а правый верхний пиксель светлый.
Создайте модель, которая срабатывает только тогда, когда левый верхний пиксель светлый, а правый верхний пиксель темный.
Увеличьте базовую модель так, чтобы окончательная сигмовидная функция была толькоиочень большие илиисрабатывают, когда оба очень большие (обратите внимание, чтоине может иметь больших значений одновременно).
Пример 2: Идентификация лестницы с небольшими тенями
Создайте модель, которая срабатывает только тогда, когда дно является тенью, тенью x1 и белым x2, тенью x2 и белым x1,,и
Создайте модель, которая срабатывает только тогда, когда дно темное, темное x1 и белое x2, темное x2 и белое x1,,и
Модели собраны таким образом, что «темные» идентификаторы могут быть существенно удалены из «теневых» идентификаторов перед сжатием с помощью сигмовидной функции.
Примечания к терминологии
Однослойный персептрон имеет один выходной слой. Поэтому только что построенную модель будем называть двухслойным персептроном, поскольку один выходной слой модели является входом для другого выходного слоя. Однако мы можем называть эти модели нейронными сетями, и в этом отношении сеть имеет три слоя — входной слой, скрытый слой и выходной слой.
Альтернативные функции активации
В нашем случае мы использовали сигмоид в качестве функции активации. Однако мы можем использовать и другие функции активации. Гиперболическая касательная функция, модифицированный линейный элемент являются обычным выбором. Функция активации должна быть нелинейной, иначе нейронная сеть будет эквивалентна однослойному персептрону.
Многообъектная классификация
Используя несколько узлов в конечном выходном слое, мы можем легко расширить нашу модель до модели с несколькими классами. Идея, используемая здесь, заключается в том, что каждый выход соответствует одному из классов C, которые мы хотим предсказать, мы можем использовать функцию Softmax дляВектор в пространстве соответствуетДругой вектор в , такой, что элементы вектора в сумме равны 1, а не отображаются через сигмовидную функциюОдин выходной элемент пространства и сжать его между [0,1] для вывода. Другими словами, мы можем спроектировать сеть так, чтобы ее выходной вектор имел вид:.
Использование нейронных сетей с более чем двумя слоями, т.е. глубокое обучение
Вам может быть интересно, можем ли мы расширить нашу ванильную нейронную сеть, чтобы ее выходной слой передавался в четвертый слой (и, следовательно, в пятый, шестой и т. д.)?
Да, это то, что обычно называют «глубоким обучением». На практике это очень эффективно. Но стоит отметить, что любой скрытый слой может быть смоделирован одной сетью скрытых слоев. На самом деле, согласно теореме универсального приближения, любую непрерывную функцию можно аппроксимировать с помощью нейронной сети с одним скрытым слоем.
Причина, по которой архитектуры глубоких нейронных сетей часто выбирают структуру с одним скрытым слоем, заключается в том, что они имеют тенденцию быстрее сходиться в процессе подбора и достигать конечного результата.
Подгонка модели к помеченным обучающим образцам (обратное распространение)
До сих пор на этапе подбора мы обсуждали, как нейронные сети могут работать эффективно, но мы не обсуждали, как подогнать нейронную сеть к размеченным обучающим образцам.
Эквивалентный вопрос: учитывая несколько размеченных обучающих выборок, как нам выбрать наилучшие веса для сети?
Градиентный спуск является распространенным ответом на это (хотя это можно сделать с оценкой максимального правдоподобия).
Продолжая наш пример задачи, процесс градиентного спуска будет выглядеть так:
Начните с некоторых помеченных данных обучения
Выберите дифференцируемую функцию потерь и минимизируйте,
Выберите структуру сети. В частности, необходимо определить количество слоев сети и количество узлов в каждом слое.
Произвольно инициализируйте веса сети
Запустите сеть на обучающих данных, чтобы сгенерировать прогнозы для каждой выборки. По функции потерьдля измерения общего значения ошибки (это так называемый процесс прямого распространения).
Определите, насколько изменится текущее значение потерь, когда каждый вес изменится на небольшую величину. Другими словами, вычислите значение градиента L для каждого веса в сети (это так называемый процесс обратного распространения).
Сделайте небольшой шаг в направлении отрицательного градиента. Например,,, то небольшое уменьшениеЭто приведет к небольшому снижению токовых потерь. Итак, мы обновляем(Здесь 0,001 — предопределенный размер шага).
Этот процесс повторяется фиксированное количество раз (начиная с шага 5), пока функция потерь не сойдется.
Это самые основные идеи. На практике это сталкивается с рядом трудностей:
Задача 1: вычислительная сложность
В процессе подбора нам нужно вычислить значение градиента L для каждого веса. Это сложная проблема, потому что L зависит от каждого узла выходного слоя, а каждый узел зависит от каждого узла предыдущего слоя и так далее. Это означает вычислениеэто кошмар с цепным правилом (помните, что многие нейронные сети на самом деле имеют десятки слоев и тысячи узлов).
Я собрал четыре совета, как справиться с этим кошмаром.
Ключом к решению этой проблемы является понимание того, что при применении цепного правилаПроизводные значения для того же промежуточного слоя будут использоваться повторно.
Если вы будете внимательно следить за этим, вы сможете избежать повторного вычисления одного и того же объекта тысячи раз.
Другой прием заключается в использовании специальных функций активации, производные которых могут быть записаны как функции их значений. Например,=производная от . Это удобно, потому что при прямом распространении, когда мы вычисляем каждую обучающую выборку, мы должны вычислить поэлементно для некоторого вектора x.
Во время обратного распространения мы можем повторно использовать эти значения при вычислении градиента L по отношению к весам, экономя время и использование памяти.
Третий прием — разделить обучающие данные на «мини-партии» и обновлять веса для каждой партии один за другим. Например, если обучающие данные разделены на {пакет1, пакет2, пакет3}, обучающие данные сначала делятся на
Используйте пакет 1 для обновления значений веса
Используйте пакет2 для обновления значений веса
Используйте пакет3 для обновления значений веса
Здесь градиент L будет вычисляться повторно после каждого обновления.
Последний совет, на который следует обратить внимание, заключается в использовании графического процессора вместо ЦП, поскольку графические процессоры лучше подходят для параллельного выполнения больших объемов вычислений.
Задача 2: градиентный спуск может не найти точку абсолютного минимума
Это не просто проблема нейронной сети, потому что это также проблема градиентного спуска. Во время градиентного спуска веса могут застрять в локальных минимумах. Вес также может превышать минимальное значение.
Уловка, чтобы справиться с этим, состоит в том, чтобы приспособиться к различным размерам шага.
Еще один прием — увеличить количество узлов или слоев в сети (остерегайтесь переобучения).
Кроме того, могут сработать некоторые эвристические приемы, такие как использование импульса.
Задача 3: Как обобщить?
Как мы можем написать общую программу для нейронной сети с любым количеством узлов и слоев?
Ответ: вам не нужно этого делать, вы используете Tensorflow. Но если вы действительно хотите это сделать, самое сложное — вычислить градиент функции потерь.
Хитрость в том, чтобы понять, что вы можете представить градиент как рекурсивную функцию. 5-слойная нейронная сеть — это просто 4-слойная нейронная сеть с некоторыми персептронами, а 4-слойная нейронная сеть — это просто 3-слойная нейронная сеть с некоторыми персептронами. и так далее. Формально это называется автоматическим дифференцированием.
Автор: Бен Горман
Оригинальная ссылка:
http://blog.kaggle.com/2017/11/27/introduction-to-neural-networks/