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

Прогнозирование временного ряда.

Сначала мы обучаем глубокую нейронную сеть на данных временного ряда. Данные состоят из обменных курсов DLS / EUR примерно год назад. К сожалению, я не могу опубликовать набор данных, но эту концепцию можно распространить на другие временные ряды и нейронную сеть.

После загрузки данных мы предварительно обрабатываем данные, применяя статистическую нормализацию с помощью scikit -learn с помощью:

После нормализации данных мы используем скользящее окно для создания двух наборов данных. Первый состоит из фрагмента из n последовательных значений, которые и будут обучающими данными. Второй набор данных состоит из значения n + 1 из временного ряда, которое будет целью нейронной сети.

Зная, что у нас есть данные, подготовленные для обучения, мы обучаем пятиуровневую нейронную сеть с текущей архитектурой:

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

Мы можем получить доступ к весу каждого слоя с помощью:

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

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

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

Обрезка сети

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

Алгоритм моделирования отжига - это метаэвристический алгоритм, который можно описать в три основных шага. Сначала создается случайное начальное состояние, и мы вычисляем энергию системы или производительности, затем для k шагов мы выбираем соседа рядом с текущим состоянием и вычисляем энергию в новом состоянии. Наконец, мы выбираем состояние в качестве допустимого решения, если вероятность, оцененная в текущем состоянии, предыдущем состоянии и текущей температуре (k / k-шагов), больше, чем случайно сгенерированный порог между 0 и 1. По мере того, как алгоритм проходит через в пространстве решений вероятность принятия плохого решения уменьшается, это уменьшение аналогично управляемому охлаждению, используемому в металлургических процессах.

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

Применяя имитацию отжига к списку весов, мы можем обрезать около 5% весов в сети с небольшим снижением производительности сети.

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