Теперь мы научимся обучать нейронную сеть. Мы также изучим алгоритм обратного распространения и обратный проход в Python Deep Learning.
Мы должны найти оптимальные значения весов нейронной сети, чтобы получить желаемый результат. Для обучения нейронной сети мы используем метод итеративного градиентного спуска. Начнем сначала со случайной инициализации весов. После случайной инициализации мы делаем прогнозы для некоторого подмножества данных с помощью процесса прямого распространения, вычисляем соответствующую функцию стоимости C и обновляем каждый вес w на величину, пропорциональную dC / dw, т. Е. Производной от функций стоимости по вес. Константа пропорциональности известна как скорость обучения.
Градиенты могут быть эффективно рассчитаны с использованием алгоритма обратного распространения. Ключевое наблюдение обратного распространения или обратной поддержки состоит в том, что из-за цепного правила дифференцировки градиент у каждого нейрона в нейронной сети может быть рассчитан с использованием градиента у нейронов, к которым он имеет исходящие ребра. Следовательно, мы рассчитываем градиенты в обратном направлении, то есть сначала вычисляем градиенты выходного слоя, затем самый верхний скрытый слой, затем предшествующий скрытый слой и т. Д., Заканчивающиеся на входном слое.
Алгоритм обратного распространения реализуется в основном с использованием идеи вычислительного графа, где каждый нейрон расширяется до множества узлов в вычислительном графе и выполняет простую математическую операцию, такую как сложение, умножение. Вычислительный граф не имеет весов на ребрах; все веса присваиваются узлам, поэтому веса становятся их собственными узлами. Затем алгоритм обратного распространения запускается на вычислительном графе. Как только вычисление завершено, для обновления требуются только градиенты весовых узлов. Остальные градиенты могут быть отброшены.
Метод оптимизации градиентного спуска
Одна из часто используемых функций оптимизации, которая корректирует веса в соответствии с вызванной ими ошибкой, называется «градиентным спуском».
Градиент — это другое название уклона, а уклон на графике xy показывает, как две переменные связаны друг с другом: подъем по трассе, изменение расстояния по изменению во времени и т. Д. В этом случае наклон соотношение между ошибкой сети и одним весом; то есть, как ошибка изменяется при изменении веса.
Точнее сказать, мы хотим выяснить, какой вес дает наименьшую ошибку. Мы хотим найти вес, который правильно представляет сигналы, содержащиеся во входных данных, и переводит их в правильную классификацию.
По мере того как нейронная сеть учится, она медленно корректирует многие веса, чтобы они могли правильно отображать значение сигнала. Соотношение между Сетевой ошибкой и каждым из этих весовых коэффициентов является производной, dE / dw, которая вычисляет степень, в которой небольшое изменение веса вызывает небольшое изменение ошибки.
Каждый вес является лишь одним фактором в глубокой сети, которая включает в себя множество преобразований; Сигнал веса проходит через активации и суммируется по нескольким слоям, поэтому мы используем цепное правило исчисления для обратной работы по активациям и выходам сети. Это приводит нас к рассматриваемому весу и его связи с общей ошибкой.
Данные две переменные, ошибка и вес, опосредованы третьей переменной, активацией , через которую передается вес. Мы можем рассчитать, как изменение веса влияет на изменение ошибки, сначала рассчитав, как изменение активации влияет на изменение ошибки, и как изменение веса влияет на изменение активации.
Основная идея глубокого обучения — это не более чем: корректировка весов модели в ответ на ошибку, которую она производит, до тех пор, пока вы больше не сможете уменьшить ошибку.
Глубокая сеть обучается медленно, если значение градиента мало, и быстро, если значение велико. Любые неточности в обучении приводят к неточным результатам. Процесс обучения сетей от выхода до входа называется обратным распространением или обратным ходом. Мы знаем, что прямое распространение начинается с ввода и работает вперед. Back prop выполняет обратный / обратный расчет градиента справа налево.
Каждый раз, когда мы вычисляем градиент, мы используем все предыдущие градиенты до этой точки.
Давайте начнем с узла в выходном слое. Край использует градиент в этом узле. Когда мы возвращаемся в скрытые слои, это становится все более сложным. Произведение двух чисел от 0 до 1 дает вам меньшее число. Значение градиента продолжает уменьшаться, и в результате обратная тренировка занимает много времени, и точность снижается.
Проблемы в алгоритмах глубокого обучения
Существуют определенные проблемы как для мелких нейронных сетей, так и для глубоких нейронных сетей, такие как переоснащение и время вычислений. На DNN влияет переоснащение, потому что используются дополнительные уровни абстракции, которые позволяют им моделировать редкие зависимости в обучающих данных.
Методы регуляризации, такие как выбывание, ранняя остановка, увеличение данных, трансферное обучение, применяются во время тренировок для борьбы с переоснащением. Выпадающая регуляризация случайно пропускает юниты из скрытых слоев во время обучения, что помогает избежать редких зависимостей. DNN учитывают несколько параметров обучения, таких как размер, то есть количество слоев и количество единиц на слой, скорость обучения и начальные веса. Поиск оптимальных параметров не всегда практичен из-за высокой стоимости времени и вычислительных ресурсов. Несколько хаков, таких как пакетная обработка, могут ускорить вычисления. Большая вычислительная мощность графических процессоров значительно помогла процессу обучения, поскольку требуемые матричные и векторные вычисления хорошо выполняются на графических процессорах.
Выбывать
Dropout — популярный метод регуляризации для нейронных сетей. Глубокие нейронные сети особенно подвержены переобучению.
Давайте теперь посмотрим, что такое отсев и как он работает.
По словам Джеффри Хинтона, одного из пионеров Deep Learning: «Если у вас есть глубокая нейронная сеть и она не переоснащается, вам, вероятно, следует использовать более крупную и использовать dropout».
Удаление — это метод, при котором во время каждой итерации градиентного спуска мы отбрасываем набор случайно выбранных узлов. Это означает, что мы игнорируем некоторые узлы случайным образом, как будто они не существуют.
Каждый нейрон хранится с вероятностью q и случайно падает с вероятностью 1-q. Значение q может быть различным для каждого слоя в нейронной сети. Значение 0,5 для скрытых слоев и 0 для входного слоя хорошо подходит для широкого круга задач.
Во время оценки и прогноза отсев не используется. Выход каждого нейрона умножается на q, так что вход на следующий слой имеет то же ожидаемое значение.
Идея Dropout заключается в следующем: в нейронной сети без регуляризации отсева нейроны развивают взаимозависимость друг с другом, что приводит к переоснащению.
Хитрость реализации
Выпадение реализовано в библиотеках, таких как TensorFlow и Pytorch, сохраняя выходные данные случайно выбранных нейронов равными 0. То есть, хотя нейрон существует, его выходные данные перезаписываются как 0.
Ранняя остановка
Мы обучаем нейронные сети, используя итерационный алгоритм, называемый градиентным спуском.
Идея ранней остановки интуитивна; мы прекращаем обучение, когда ошибка начинает увеличиваться. Здесь под ошибкой мы подразумеваем ошибку, измеренную в проверочных данных, которая является частью обучающих данных, используемых для настройки гиперпараметров. В этом случае гиперпараметр является критерием остановки.
Увеличение данных
Процесс, в котором мы увеличиваем количество имеющихся у нас данных или увеличиваем их, используя существующие данные и применяя к ним некоторые преобразования. Точные используемые преобразования зависят от задачи, которую мы намерены достичь. Более того, преобразования, которые помогают нейронной сети, зависят от ее архитектуры.
Например, во многих задачах компьютерного зрения, таких как классификация объектов, эффективный метод увеличения данных — это добавление новых точек данных, которые являются обрезанными или переведенными версиями исходных данных.
Когда компьютер принимает изображение в качестве входных данных, он принимает массив значений пикселей. Допустим, что все изображение смещено влево на 15 пикселей. Мы применяем много разных сдвигов в разных направлениях, в результате чего расширенный набор данных во много раз превосходит исходный набор данных.
Передача обучения
Процесс взятия предварительно обученной модели и «точной настройки» модели с нашим собственным набором данных называется трансферным обучением. Есть несколько способов сделать это. Несколько способов описаны ниже —
-
Мы обучаем предварительно обученную модель на большом наборе данных. Затем мы удаляем последний слой сети и заменяем его новым слоем со случайными весами.
-
Затем мы замораживаем веса всех других слоев и обучаем сеть в обычном режиме. Здесь замораживание слоев не меняет вес во время градиентного спуска или оптимизации.
Мы обучаем предварительно обученную модель на большом наборе данных. Затем мы удаляем последний слой сети и заменяем его новым слоем со случайными весами.
Затем мы замораживаем веса всех других слоев и обучаем сеть в обычном режиме. Здесь замораживание слоев не меняет вес во время градиентного спуска или оптимизации.
Концепция этого заключается в том, что предварительно обученная модель будет действовать как экстрактор признаков, и только последний уровень будет обучен текущей задаче.