Рабочие определения функции ReLU и ее производной:
ReLU(x)={0,x,if x<0,otherwise.
ddxReLU(x)={0,1,if x<0,otherwise.
Производная - это функция единичного шага . Это игнорирует проблему при x=0 , где градиент не является строго определенным, но это не является практической проблемой для нейронных сетей. В приведенной выше формуле производная на 0 равна 1, но вы можете также рассматривать ее как 0 или 0,5 без реального влияния на производительность нейронной сети.
Упрощенная сеть
С этими определениями, давайте посмотрим на ваши примеры сетей.
Вы выполняете регрессию с функцией затрат C=12(y−y^)2. Вы определилиRкак выход искусственного нейрона, но вы не определили входное значение. Я добавлю это для полноты - назовите егоz, добавьте индексирование по слоям, и я предпочитаю строчные для векторов и строчные для матриц, так чтоr(1)вывод первого слоя,z(1) для его вход иW(0) для весасоединяющего нейрон на его входx(в большой сети, которые могут подключаться к более глубокомуrзначение вместо). Я также скорректировал номер индекса для весовой матрицы - почему это станет понятнее для большой сети. NB. На данный момент я игнорирую наличие большего количества нейронов в каждом слое.
Глядя на вашу простую 1 слой, 1 нейронную сеть, уравнения прямой связи:
z(1)=W(0)x
y^=r(1)=ReLU(z(1))
Производная функции стоимости по примерной оценке:
∂C∂y^=∂C∂r(1)=∂∂r(1)12(y−r(1))2=12∂∂r(1)(y2−2yr(1)+(r(1))2)=r(1)−y
Использование правила цепочки для обратного распространения до значения перед преобразованием ( z ):
∂C∂z(1)=∂C∂r(1)∂r(1)∂z(1)=(r(1)−y)Step(z(1))=(ReLU(z(1))−y)Step(z(1))
Это ∂C∂z(1) является промежуточным этапом и критической частью backprop, связывающих шаги вместе. Производные часто пропускают эту часть, потому что умные комбинации функции стоимости и выходного слоя означают, что это упрощено. Здесь это не так.
Чтобы получить градиент по отношению к весу W(0) , это еще одна итерация правила цепочки:
∂C∂W(0)=∂C∂z(1)∂z(1)∂W(0)=(ReLU(z(1))−y)Step(z(1))x=(ReLU(W(0)x)−y)Step(W(0)x)x
, , , потому что z(1)=W(0)x следовательно,∂Z( 1 )∂W( 0 )= х
Это полное решение для вашей простейшей сети.
Однако в многоуровневой сети вам также необходимо перенести ту же логику на следующий уровень. Кроме того, у вас обычно есть более одного нейрона в слое.
Более общая сеть ReLU
Если мы добавим более общие термины, то мы можем работать с двумя произвольными слоями. Назовите их Layer ( к ) проиндексированными по я , а Layer ( к + 1 ) проиндексирован по J . Веса теперь представляют собой матрицу. Итак, наши уравнения прямой связи выглядят так:
Z( к + 1 )J= ∑∀ яW( к )я жр( к )я
р( к + 1 )J= R e L U( з( к + 1 )J)
ро у т р у тJро у т р у тJ- уJ, Однако проигнорируйте это сейчас и посмотрите на общий способ обратного распространения, предполагая, что мы уже нашли∂С∂р( к + 1 )J - just note that this is ultimately where we get the output cost function gradients from. Then there are 3 equations we can write out following the chain rule:
First we need to get to the neuron input before applying ReLU:
- ∂C∂z(k+1)j=∂C∂r(k+1)j∂r(k+1)j∂z(k+1)j=∂C∂r(k+1)jStep(z(k+1)j)
We also need to propagate the gradient to previous layers, which involves summing up all connected influences to each neuron:
- ∂C∂r(k)i=∑∀j∂C∂z(k+1)j∂z(k+1)j∂r(k)i=∑∀j∂C∂z(k+1)jW(k)ij
And we need to connect this to the weights matrix in order to make adjustments later:
- ∂C∂W(k)ij=∂C∂z(k+1)j∂z(k+1)j∂W(k)ij=∂C∂z(k+1)jr(k)i
You can resolve these further (by substituting in previous values), or combine them (often steps 1 and 2 are combined to relate pre-transform gradients layer by layer). However the above is the most general form. You can also substitute the Step(z(k+1)j) in equation 1 for whatever the derivative function is of your current activation function - this is the only place where it affects the calculations.
Back to your questions:
If this derivation is correct, how does this prevent vanishing?
Your derivation was not correct. However, that does not completely address your concerns.
The difference between using sigmoid versus ReLU is just in the step function compared to e.g. sigmoid's y(1−y), наносится один раз на слой. Как видно из приведенных выше общих послойных уравнений, градиент передаточной функции появляется только в одном месте. Лучшая производная сигмоида добавляет коэффициент 0,25 (когдах = 0 , у= 0,5), и это становится еще хуже, и быстро насыщается до почти нулевой производной от х = 0, Градиент ReLU равен либо 0, либо 1, а в исправной сети достаточно 1, чтобы иметь меньшие потери градиента во время обратного распространения. Это не гарантируется, но эксперименты показывают, что ReLU имеет хорошую производительность в глубоких сетях.
Если есть тысячи слоев, будет много умножения из-за весов, то не приведет ли это к исчезновению или взрыву градиента?
Да, это тоже может оказать влияние. Это может быть проблемой независимо от выбора передаточной функции. В некоторых комбинациях ReLU может также помочь контролировать взрывающиеся градиенты, потому что он не насыщает (так что большие весовые нормы, как правило, являются плохими прямыми решениями, и оптимизатор вряд ли будет двигаться к ним). Однако это не гарантируется.