Сегодня седьмой день моего ноябрьского испытания обновлений.
Backpropagation backpropagation — быстрый алгоритм вычисления градиента функции стоимости
Используйте матрицы для быстрого вычисления выходных данных
Чтобы объяснить проблему, сначала дайте четкое определение весов в нейронной сети, как показано на следующем рисунке:
такое же определениево-первыхпервоеСмещение нейронов:
Исходя из вышеприведенного определения, мы можем получитьпервоезначение активации нейрона(это значение изначение активации слояСвязанный):
всерединавыражатьколичество всех нейронов в слое для каждого слояопределить весовую матрицу,Элементы вслой довеса соединений слоев, поэтомуможно понимать каксредний слойнейроны кслойВеса соединений каждого нейрона.
Приведенную выше формулу можно упростить до:
в вычисленияхнужно вычислить промежуточный,будетназываетсяслой нейроноввзвешенный ввод, поэтому приведенную выше формулу можно упростить до.
Два предположения о функции стоимости
Целью алгоритма обратного распространения является вычисление функции стоимостиоколо двух параметровичастная производная от. будетОпределяется как квадратичная функция стоимости:
представляет собой общее количество обучающих выборок,Указывает, что все образцы были пройдены,входКогда соответствующий ожидаемый целевой результат,представляет количество сетевых слоев,это когда входВектор значения активации, выдаваемый сетью.
Чтобы применить алгоритм обратного распространения, функция стоимости должна бытьСделайте два предположения:
- Функция стоимости может быть записана в видефункция стоимости насреднее значение, где стоимость каждой независимой выборки.
- Функция стоимости может быть записана как выходная функция нейронной сети:, при этом предположенииДалее можно записать так:
Общие сведения о продукте Адамара/продукте Шура:
представляет поэлементный продукт,,Следующее:
Дифференциация, градиент и градиентный спуск
четыре основные формулы
Ядром алгоритма обратного распространения является вычисление частных производных, с целью введения сначала промежуточной величины, представляющий первыйслойОшибка на нейронах:
Эта формула основана на эвристическом знании того, чтоявляется мерой нейронной ошибки.
Обратное распространение основано на четырех основных формулах, которые позволяют нам вычислить ошибку и градиент функции стоимости.
Формула 1
ошибка выходного слояФормула:
формулавыразить ценуС первымслойзначение активации нейронного выходаскорость изменения,представляет функцию активациисуществуетскорость изменения при . Для квадратичной функции стоимости,.
Для удобства расчета формулу (1) перепишем в матричной форме:
Принимая во внимание частную производную квадратичной функции стоимости, получаем:
Формула 2
Используйте ошибку следующего слоядля представления ошибки текущего слоя:
Формула (2) дает метод получения ошибки текущего слоя из ошибки следующего слоя, который является методом обратного распространения.обеспечить регрессСмысл , то есть его можно рассматривать как перемещение ошибки в обратном направлении по сети, а ошибку любого слоя можно вычислить, комбинируя формулу (1) и формулу (2).
Формула 3
Функция стоимости и скорость изменения, связанные с любым смещением в сети:
Уравнение (3) доказывает ошибкуи значения частных производныхточно так же.
Формула 4
Функция стоимости и скорость изменения, связанные с любым весом:
Уравнение (4) дает частную производную, который можно упростить до:
представляет весЗначение активации ввода по ссылке ,представляет весОшибка вывода по ссылке показана на следующем рисунке:
Характерный порядок сигмовидной функцииИзменение будет очень небольшим вблизи 0 или 1, что также замедлит обучение веса, для такой ситуации, уже называемой выходным нейроном.насыщенность, а затем обучение веса будет прекращено (или обучение будет очень медленным).Из приведенной выше формулы видно, что скорость обучения иСвязанный.
Доказательство четырех формул
жизненный опыт
Формула многомерного цепного правила исчисления:
Уравнение 1 Доказательство
вспомнить ошибку выводаОпределение:
Основываясь на вышеуказанных базовых знаниях, уравнение 1 можно переписать как:
представляет все нейроны в выходном слое, первыйнейронныйзависеть только отввод веса, когда, то естьВремяНе существует, основываясь на предыдущей теории, приведенную выше формулу можно преобразовать в:
на основеПравая часть приведенной выше формулы может быть записана как, поэтому уравнение 1 может быть получено:
Уравнение 2 Доказательство
Продолжайте расширять ошибку:
По-прежнему используя цепное правило, основная идея уравнения 2 состоит в том, чтобы использовать следующий уровень ошибки для представления текущей ошибки, поэтому мы должны найти способ ввести,и, по-видимому, чтобы найти способ ввестив формулу ошибки:
Зависит отможно определить как:
рассчитатьполучить:
Процесс вычисления можно доказать с помощью математической индукции следующим образом:
когдаВремя:
когдаВремя:
когдаВремя:
Доказательство завершено
Комбинируя приведенные выше формулы, можно получить формулу 2:
Доказательство уравнения 3
Уравнение 4 Доказательство
Процесс алгоритма обратного распространения
- input x: установите значение активации для входного слоя
- Прямое распространение: для запуска со второго слояВычислить медиануи
- ошибка выходного слоя: вычислить ошибку последнего слоя (выходного слоя).
- Обратное распространение ошибок: основано наОбратить ошибку предыдущего слоя (), рассчитать
- Выход: вычислить градиент функции стоимости, т.е.,.
На основе алгоритма обратного распространения применяется метод градиентного спуска для обновления процесса параметров:
Реализация алгоритма
# 反向传播算法
# 返回一个元祖,nabla_b, nabla_w表示损失函数C_x的梯度
def backprop(self,x,y):
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w = [np.zeros(w.shape) for w in self.weights]
# feedforward 前向传播
#设置输入层激活值activation=a^1
#activations 用来存储每层的激活值
activation = x
activations = [x]
# zs用来存储每一层的中间值z
zs = [] #
for b, w in list(zip(self.biases, self.weights)):
# 中间值z的计算
z = np.dot(w, activation) + b
zs.append(z)
# 基于z计算激活值
activation = sigmoid(z)
activations.append(activation)
# backward pass 反向传播
# cost_derivative 计算网络输出值和期望输出的差值 即nabla C
# sigmoid_prime返回sigmoid函数的导数
# 计算误差delta
delta = self.cost_derivative(activations[-1], y) * sigmoid_prime(zs[-1])
# 计算参数b和w的梯度
nabla_b[-1] = delta
nabla_w[-1] = np.dot(delta, activations[-2].transpose())
# 从后往前(反向)逆推前面层的误差delta
for l in range(2, self.num_layers):
# 反向因此此处是-l
z = zs[-l]
sp = sigmoid_prime(z)
delta = np.dot(self.weights[-l + 1].transpose(), delta) * sp
# 存储对应层的nabla b和 nabla w
nabla_b[-l] = delta
nabla_w[-l] = np.dot(delta, activations[-l - 1].transpose())
return nabla_b, nabla_w