Алгоритмы обучения нейронной сети

машинное обучение

Эта статья является основной записью «Wu Enda Machine Learning».

Обучение нейронных сетей

Представление модели

a_{1}^{(2)} = g(\Theta_{10}^{(1)}x_{0} + \Theta_{11}^{(1)}x_{1}+ \Theta_{12}^{(1)}x_{2}+\Theta_{13}^{(1)}x_{3})
a_{2}^{(2)} = g(\Theta_{20}^{(1)}x_{0} + \Theta_{21}^{(1)}x_{1}+ \Theta_{22}^{(1)}x_{2}+\Theta_{23}^{(1)}x_{3})
a_{3}^{(2)} = g(\Theta_{30}^{(1)}x_{0} + \Theta_{31}^{(1)}x_{1}+ \Theta_{32}^{(1)}x_{2}+\Theta_{33}^{(1)}x_{3})
h_{\Theta}(x)= a_{1}^{(3)} = g(\Theta_{10}^{(2)}a_{0}^{(2)} + \Theta_{11}^{(2)}a_{1}^{(2)}+ \Theta_{12}^{(2)}a_{2}^{(2)}+\Theta_{13}^{(2)}a_{3}^{(2)})

в приведенном выше выраженииa_{i}^{(j)}представительjПервыйiблок активации,\Theta(j)представительjслой доj+1Матрица весов слоев.

Мы также можем использовать вектор для представления вышеуказанной модели:

x =\begin{bmatrix}     x0 \\     x1 \\     x3\\     x4 \end{bmatrix}
z^{(2)} = \begin{bmatrix}     z_{1}^{(2)} \\     z_{2}^{(2)} \\     z_{3}^{(2)} \\ \end{bmatrix}
z^{(2)} = \Theta^{(1)}x
Add \quad a_{0}^{(2)} = 1
z^{(3)} = \Theta^{(2)}a^{(2)}
h_{\Theta}(x) = a^{(3)} = g(z^{(3)})
z_{1}^{(2)} = \Theta_{10}^{(1)}x_{0} + \Theta_{11}^{(1)}x_{1}+ \Theta_{12}^{(1)}x_{2}+\Theta_{13}^{(1)}x_{3}

функция стоимости

J(\Theta) = - \frac{1}{m} \sum_{i=1}^m  \sum_{k=1}^K \left[y^{(i)}_k \log ((h_\Theta (x^{(i)}))_k) + (1 - y^{(i)}_k)\log (1 - (h_\Theta(x^{(i)}))_k)\right] + \frac{\lambda}{2m}\sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_{l+1}} ( \Theta_{j,i}^{(l)})^2

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

Член регуляризации — это просто сумма матриц каждого слоя после исключения каждого слоя. Самый внутренний цикл проходит по всем строкам (определяется количеством единиц активации в слое +1), а цикл повторяется по всем столбцам, определяемым количеством ячеек активации в этом слое (слое). То есть: расстояние от истинного значения представляет собой сумму выходных данных каждой выборки-каждого класса, а член смещения для регуляризации параметров обрабатывает сумму квадратов всех параметров.

Алгоритм обратного распространения

Алгоритм обратного распространения используется для расчета\frac{\partial}{\partial\Theta_{ij}^{(l)}}J_{(\Theta)}, его правило расчета, возьмем в качестве примера четырехслойную нейронную сеть:

вK = 4,S_{L}=4, L=4

использовать\deltaдля представления ошибки, то:\delta^(4) = a^{(4)}-y:

\delta^{(l)} =\begin{cases}     a^{(l)} - y  & l = L \\     (\Theta^{(l)}\delta^{(l+1)})^T .*g'(z^{(l)}) &  {l=2,3,...,L-1} \end{cases}
g'(z^{(l)}) = a^{(l)} .* (1-a^{(l)})

наконец-то:

\frac{\partial}{\partial\Theta_{ij}^{(l)}}J_{(\Theta)}= a_j^{(l)}\delta_i^{(l+1)}

lУказывает, какой слой вычисляется в данный момент.

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

iПредставляет нижний индекс единицы ошибки в следующем слое, который является нижним индексом единицы ошибки в следующем слое, на который влияет строка в матрице весов.

  • Конкретные шаги алгоритма обратного распространения

использовать\Delta_{ij}^{(l)}для представления матрицы ошибок, ее смыслпервоеlпервоеiблок активации подлежитjОшибка, вызванная влиянием параметра

Предполагая тренировочный набор(x^{(1)}, y^{(1)}),...,(x^{(m)},y^{(m)}), процесс обучения нейронной сети с использованием обратного распространения ошибки выглядит следующим образом:

  1. for \quad all \quad l,i,j, инициализировать весовой градиент\Delta^{(l)} :
\Delta^{(l)} = 0
  1. for \quad i=1  \quad to  \quad m:
\begin{aligned}     & 令 a^{(1)} = x^{i} \\     & 执行前向传播算法,计算各层的激活向量:a^{(l)} \\     & 通过标签向量 y^{(i)},计算输出层的误差向量:\delta^{(L)} = a^{(L)} - y^{(i)} \\     & 反向依次计算其他层误差向量:\delta^{(L-1)},\delta^{(L-2)},...,\delta^{(2)} \\     &求 \Delta_{ij}^{(l)} = a_j^{(l)}\delta_i^{(l+1)},即:\Delta^{(l)} = \delta^{(l+1)}(a^{(l)})^T\\ \end{aligned}
  1. Найдите приращение обновления весов каждого слояD^{(l)}, веса смещения соединения не нормированы:
D^{(l)}_{i,j} = \begin{cases} \dfrac{1}{m}(\Delta^{(l)}_{i,j} + \lambda\Theta^{(l)}_{i,j}), \quad {if j \neq 0} \\ \frac{1}{m}\Delta_{ij}^{(l)}, \quad {if \quad j=0} \end{cases}
  1. Обновите весовую матрицу каждого слоя\Theta(l)\alphaскорость обучения:
\Theta^{(l)} = \Theta^{(l)} + \alpha D^{(l)}

Общие шаги алгоритмов нейронной сети

Структура сети: Первое, что нужно сделать, это выбрать структуру сети, т. е. сколько слоев выбрать и сколько единиц в каждом слое.

Количество единиц в первом слое — это количество функций в нашем обучающем наборе.

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

Если количество скрытых слоев больше 1, убедитесь, что количество единиц в каждом скрытом слое одинаково.Обычно, чем больше количество единиц скрытого слоя, тем лучше.

Что нам действительно нужно решить, так это количество скрытых слоев и количество единиц в каждом промежуточном слое.

Обучите нейронную сеть:

  1. Случайная инициализация параметров
  2. Используя метод прямого распространения для расчета всех
  3. Напишите код, вычисляющий функцию стоимости
  4. Вычислите все частные производные, используя обратное распространение
  5. Проверьте эти частные производные с помощью численных тестов.
  6. Используйте алгоритм оптимизации, чтобы минимизировать функцию стоимости