Примечания к изучению нейронной сети 5 - метод выбора гиперпараметров

алгоритм Нейронные сети

Это мой 10-й день ноябрьского испытания обновлений.

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

Гипотетический обучающий набор входных данных для упрощения задачиxxразмерn=1000n=1000, где половина входных значений нейронаxjx_jравен 0, а другая половина равна 1. Взвешенные входные данные для нейроновz=jwjxj+bz=\sum_jw_jx_j+b, 500 из которых были устранены, осталось 500wwиbb. Значения этих 501 элементов подчиняются распределению Гаусса со средним значением 0 и стандартным отклонением 1, поэтомуzzЗначение будет представлять собой среднее значение 0 и стандартное отклонение50122.4\sqrt{501}\approx 22.4Распределение Гаусса показано на следующем рисунке:

image.png

Как можно видетьzzможет быть намного больше или меньше 1, что влияет нао(z)\sigma(z)Значение близко к 1 или 0, то есть скрытые нейроны будут близки к насыщению, а скорость обучения будет снижаться, когда скрытые нейроны будут близки к насыщению, что также является причиной низкой скорости обучения.

Итак, для лучшей инициализацииwwзначение, если предположитьninn_{in}входных нейронов, используя среднее значение 0 и стандартное отклонение1nin\frac{1}{\sqrt{n_{in}}}Распределение Гаусса для инициализации весов. В том же случае, что и в приведенном выше примере,zzРаспределение становится средним значением 0 со стандартным отклонением3/2\sqrt{3/2}Гауссово распределение , как показано на следующем рисунке:

image.png

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

Упражнение:Предположим, естьninn_{in}входных нейронов, используя среднее значение 0 и стандартное отклонение1nin\frac{1}{\sqrt{n_{in}}}Распределение Гаусса инициализирует веса, а распределение Гаусса инициализирует смещение со средним значением 0 и стандартным отклонением 1. Предположим, набор входных данных для обученияxxразмерnin=1000n_{in}=1000, где половина входных значений нейронаxjx_jравен 0, а другая половина равна 1. проверятьz=jwjxj+bz=\sum_jw_jx_j+bСтандартное отклонение3/2\sqrt{3/2}.

Подсказка: (а) дисперсия суммы независимых случайных величин равна сумме дисперсий каждой независимой случайной величины (б) дисперсия равна квадрату стандартного отклонения.

Исходя из вышеперечисленных условий, видно, чтоzzДисперсия:

(1nin)2×500+12×1=12+1=32(\frac{1}{\sqrt{n_{in}}})^2\times 500+1^2\times1=\frac{1}{2}+1=\frac{3}{2}

следовательноzzСтандартное отклонение32\sqrt{\frac{3}{2}}.

Реализация кода и сравнение

оригинальныйwwинициализация:

# 之前使用过比较简单的初始化方法用来比较两种初始化方法的区别
    def large_weight_initializer(self):
        self.biases = [np.random.randn(y, 1) for y in self.sizes[1:]]
        self.weights = [np.random.randn(y, x)
                        for x, y in list(zip(self.sizes[:-1], self.sizes[1:]))]

новыйwwМетод инициализации:

# 使用均值为0标准差为1的高斯分布来初始化偏差
# 使用均值为0标准差为sqrt(n)的高斯分布来初始化权重,n为输入神经元的数量
    def default_weight_initializer(self):
        self.biases = [np.random.randn(y, 1) for y in self.sizes[1:]]
        self.weights = [np.random.randn(y, x) / np.sqrt(x)
                        for x, y in list(zip(self.sizes[:-1], self.sizes[1:]))]

Сравнительные результаты:image.png

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

Как выбрать HyperParameters для нейронной сети

для скорости обучениян\etaи параметры нормализацииλ\lambdaНа практике очень сложно подобрать подходящее значение. В основном подбор гиперпараметров здесь основан на эвристических представлениях, и универсального правильного способа выбора не существует:

широкая стратегия

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

н\etaРегулировка скорости обучения

Проверьте влияние трех разных значений скорости обучения на обучение:image.png

можно увидеть, когдан=2.5\eta=2.5Когда колебания очень очевидны.Чтобы понять это явление, вернемся к принципу стохастического градиентного спуска:image.png

etaetaВеличина влияет на размер шага спуска,н\etaЕсли оно слишком большое, это может привести к тому, что алгоритм пересечет дно впадины и вызовет повторяющиеся колебания, когда оно будет близко к минимальному значению, поэтомуetaetaследует выбирать малым. (Но слишком маленький повлияет на скорость обучения)

Скорость обучения обычно устанавливается постоянной, но переменная скорость обучения может быть более эффективной. На ранней стадии обучения используйте большую скорость обучения, чтобы ускорить изменение весов, а затем уменьшите скорость обучения позже, чтобы можно было выполнять более сложные настройки. Как установить скорость обучения на основе этой идеи? Естественно думать о:

  • держать сначалан\etaявляется константой до тех пор, пока точность проверки не начнет ухудшаться
  • уменьшить на определенный процентн\eta, например 10 или 2, повторить несколько раз, покан\etaниже начального значения11000\frac{1}{1000}Завершить обучение

epoch использует раннюю остановку для определения количества эпох

Как упоминалось в разделе о переоснащении здесь, прекращайте обучение, когда точность проверочного набора больше не улучшается.

λ\lambdaВыбор параметров нормализации

λ\lambdaСначала значение может быть неопределенным (т.λ=0\lambda=0),Ждатьн\etaПосле подтверждения попробуйте изменитьλ\lambdaзначение .

Выбор размера mini_batch

Как установить размер мини-пакета данных? Чтобы упростить задачу, мы можем сначала предположить, что данные мини-пакета размера 1 изучены, а изменение веса:

ww'=wнCxw\rightarrow w'=w-\eta\nabla C_x

По сравнению со скоростью изменения веса для мини-партии размером 100:ww'=wн1100Cxw\rightarrow w'=w-\eta\frac{1}{100}\nabla C_x, веса мини-партии размера 1 изменяются в 100 раз быстрее. Но проблема в том, что небольшой пакет данных размером 1 обновляется очень часто (то есть для вычисления градиента необходимо использовать цикл), а небольшой пакет данных размером 100 может использовать матричную технологию для расчета градиента. для повышения скорости расчета.

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