О:

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

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

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

О нейронных сетях:

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

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

Как работают нейронные сети:

Давайте начнем с очень простого примера контролируемой нейронной сети, что означает, что у нас есть правильный ответ с данными обучения. Мы хотим, чтобы нейронная сеть угадывала цвета яблока (i₀), оранжевого (i₁), черники (i₂) и банана ( i₃) без предварительного знания правильных ответов. Цель этого упражнения - заставить нейронную сеть сделать предположение, сравнить предположение с реальным ответом и внести соответствующие коррективы. Цвета вывода: o₀: синий, o₁: желтый, o₂: оранжевый и o₃: красный. Правильное предположение для яблока будет иметь выход o₃, равный 1, когда вход i₀ равен 1.

Чтобы нейронная сеть имела некую взаимосвязь между входами и выходами, мы собираемся присвоить вес (wᵢₒ), чтобы представить силу линий между входами (i) и выходами (o) следующим образом. Мы суммируем веса и входные данные как промежуточный результат как z.

Чтобы сделать выходное значение удобным для работы, будет использоваться функция активации, хотя для этого слишком упрощенного примера в этом нет необходимости. Однако для понимания применим его к нашей нейронной сети. Функция активации аккуратно преобразует весь возможный диапазон отрицательных значений в положительные в диапазон от 0 до 1 (для сигмоида) и от -1 до 1 (для функции tanh). Мы будем обозначать функцию активации просто как A (z). Две из наиболее часто используемых функций активации - это сигмоидальная функция и функция tanh, которая отличается диапазоном вывода от 0 до 1 и от -1 до 1 и тем, насколько быстро она сходится к своим минимальным и максимальным значениям. Сигмовидная кишка имеет гораздо более мягкую конвергенцию, в то время как tanh сходится быстрее.

Следовательно, вывод будет просто o = A (z). В этом примере мы будем использовать функцию Sigmoid, которая будет означать, что наш вывод будет выглядеть примерно так.

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

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

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

Как только у нас будет производная, мы обновим существующие веса, добавив производную функции стоимости по отношению к весу, умноженному на скорость обучения. Для этого очень простого примера скорость обучения будет равна 1. Однако для более сложных примеров с большими наборами обучающих данных более предпочтительно меньшее число, такое как 0,01 или 0,001.

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

Для получения дополнительной информации о машинном обучении и нейронных сетях, пожалуйста, отличный ресурс - это серия лекций Эндрю Нг, доступная на Youtube или Coursera.

О скорости затухания обучения и градиентном спуске

Скорость распада - это скорость, с которой скорость обучения уменьшается экспоненциально. То есть по мере того, как мы запускаем нейронную сеть все дольше и дольше, скорость обучения будет снижаться на постоянное значение (например, 0,99) для каждой выборки. Скорость затухания (d) должна быть установлена ​​так, чтобы для (n) объемов обучающих данных желаемая начальная и последняя скорость обучения (l) для наших обучающих данных была следующей. Со скоростью спада, когда мы приближаемся к минимальному значению функции стоимости, изменения, которые мы вносим в веса, будут уменьшаться и позволят нам постепенно достичь минимума. Этот итерационный процесс называется градиентным спуском.

О свертке и объединении

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

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

Ниже мы видим, как оранжевые значения умножаются, а полученные значения

Фильтры свертки могут быть настроены с использованием контролируемого подхода или получены математически аналогично определению градиентного спуска весов.

Эта серия:

В этой серии мы будем обучать нейронную сеть решать классический пример распознавания рукописных цифр на черно-белом изображении 28x28 пикселей. Эти данные предоставлены MINST. Мы будем использовать 784 пикселя в качестве входных нейронов и создадим 10 выходных данных, соответствующих цифрам от 0 до 9. Правильным предположением будет вывод наивысшего значения.

Эти данные доступны в формате CSV здесь в формате:
Правильный ответ, Пиксель (1,1), Пиксель (1,2),…, Пиксель (1,28), Пиксель (2,1). ,…, Пиксель (28,28)

Параметры нашей нейронной сети, которые мы будем варьировать, следующие:

  • Скорость обучения и скорость уменьшения скорости обучения
  • Функция активации, используемая для каждого нейрона
  • Используемая функция затрат / убытков
  • Количество используемых скрытых слоев
  • Количество нейронов на скрытый слой

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