При построении глубокой сети с очень большим количеством слоёв появляются неприятные эффекты — вымывание градиента и его взрыв (vanishing/exploding gradients).
Для того, чтобы понять, откуда берутся эти эффекты, поглядим на сеть с большим количеством слоёв:
Для простоты на схеме показано по два нейрона на каждом слое, но это лишь для упрощения восприятия, на самом деле их может быть много, а самих слоёв — больше сотни.
У каждого слоя этой сети есть своя матрица весов: \(w^{[1]}\), \(w^{[2]}\), \(w^{[3]}\) и так далее, вплоть до \(w^{[l]}\).
Для упрощения будем считать, что активационная функция линейна:
\[g(z) = z\]а вектор bias равен нулю:
\[\textbf{b}=0\]В этом случае предсказание \(\hat{y}\) будет представлять собой произведение матриц весов всех слоёв и \(x\):
\[\hat{y} = w^{[l]}w^{[l-1]}w^{[l-2]}\cdot\ldots\cdot w^{[3]}w^{[2]}w^{[1]}\]Почему так? Поглядим внимательно на произведение двух последних элементов \(w^{[1]}\) и \(x\). Так как мы условились ранее, что bias равен нулю, то это будет не что иное как \(z^{[1]}\):
\[z^{[1]} = w^{[1]}x\]\(a^{[1]}\) — это нелинейность, применённая к \(z^{[1]}\), но, так как мы договорились, что нелинейность у нас линейная, \(a^{[1]}\) будет равно \(z^{[1]}\):
\[a^{[1]} = g(z^{[1]})= z^{[1]}\]Логично, что произведение последних трёх элементов будет представлять собой \(a^{[2]}\):
\[a^{[2]} = g(z^{[2]}) = g(w^{[2]}a^{[1]}) = g(w^{[2]}w^{[1]}x)\]\(a^{[3]}\), в свою очередь, будет представлять собой произведение последних четырёх элементов:
\[a^{[3]} = g(w^{[3]}w^{[2]}w^{[1]}x)\]и так далее, вплоть до последней матрицы \(w^{[l]}\). Общее произведение всех матриц и \(x\) в итоге дают предсказание \(\hat{y}\).
Теперь представим, что значения элементов всех матриц весов \(w^{[l]}\) чуть больше, чем у единичной матрицы:
\[ \begin{bmatrix} 1.5 & 0 \\ 0 & 1.5 \end{bmatrix} \]Так как размерность последней матрицы \(w^{[l]}\) может отличаться от остальных, \(\hat{y}\) можно представить как произведение \(w^{[l]}\) на матрицу в степени \((l-1)\), умноженную на \(x\):
\[\hat{y} = w^{[l]} \begin{bmatrix} 1.5 & 0 \\ 0 & 1.5 \end{bmatrix}^{(l-1)}x\]По сути, значение \(\hat{y}\) будет равно 1.5 в степени \((l-1)\), умноженное на \(x\):
\[\hat{y} = 1.5^{(l-1)}x\]Если сеть глубока, то значение \(l\) будет большим и, соответственно, значение \(\hat{y}\) будет очень большим.
А теперь представим, что значения в матрицах весов стали немного меньше нуля, например, 0.5:
\[\hat{y} = w^{[l]} \begin{bmatrix} 0.5 & 0 \\ 0 & 0.5 \end{bmatrix}^{(l-1)}x\]в этом случае значение \(\hat{y}\) будет очень маленьким.
Если значения матрицы весов чуть больше, чем единичная матрица, то для очень глубокой сети следует ожидать градиентный взрыв. Если значения чуть меньше, чем единичная матрица, то произойдёт вымывание градиента.