В этой статье я расскажу о шагах, связанных с решением задачи бинарной классификации с использованием глубокой нейронной сети, имеющей L слоев. Если вы новичок в нейронных сетях, я бы посоветовал сначала прочитать эту статью, где я обсуждал нейронную сеть с одним нейроном.
Входные данные X имеют размер (n𝕩, m), где n𝕩 — количество признаков, а m — количество выборок. Выход Y имеет размер (1, m).
Количество нейронов в слое l обозначается как n⁽ˡ⁾.
Мы будем использовать функцию активации «relu» от слоев 1 до L-1 и «сигмоид» для слоя L. Мы инициализируем A⁽⁰⁾ = X и весовые матрицы W и перехватываем b для каждого слоя l, от 1 до L , следующее :
W⁽ˡ⁾ = np.random.randn(n⁽ˡ⁾, n⁽ˡ⁻¹⁾) * 0.01
Функция ‘np.random.randn’ генерирует случайный нормально распределенный массив указанного размера, и мы умножаем его на 0,01, чтобы наши начальные веса были небольшими, что в противном случае может привести к проблеме исчезающих градиентов.
b⁽ˡ⁾ = np.zeros((n⁽ˡ⁾,1))
Прямое распространение
- Рассчитайте Z для каждого слоя l от слоя 1 до слоя L-1:
(Возьмите A⁽⁰⁾ = X)
Z⁽ˡ⁾ = W⁽ˡ⁾A⁽ˡ⁻¹⁾ + b⁽ˡ⁾
2 . Сохраните A⁽ˡ⁻¹⁾, W⁽ˡ⁾, b⁽ˡ⁾, Z⁽ˡ⁾ в списке и продолжайте добавлять для каждого слоя.
3. Рассчитайте A⁽ˡ⁾
A⁽ˡ⁾ = relu(Z⁽ˡ⁾)
Для слоя L
A⁽ᴸ⁾ = sigmoid(Z⁽ᴸ⁾)
4. Рассчитайте стоимость, используя:
cost, J = -(Y(log(A⁽ᴸ⁾)ᵀ + (1-Y)(log(1-A⁽ᴸ⁾))ᵀ)/m
где Aᵀ обозначает транспонирование матрицы A.
Обратное распространение
- Для слоя L:
dZ⁽ᴸ⁾ = A⁽ᴸ⁾ - Y
обратитесь к этой статье за подробностями приведенного выше уравнения.
и получение значений A⁽ˡ⁻¹⁾, W⁽ˡ⁾, b⁽ˡ⁾ из кэша, созданного при прямом распространении:
dW⁽ᴸ⁾ = (dZ⁽ᴸ⁾(A⁽ˡ⁻¹⁾)ᵀ)/m db⁽ᴸ⁾ = dZ⁽ᴸ⁾/m dA⁽ᴸ⁻¹⁾ = (W⁽ᴸ⁾)ᵀdZ⁽ᴸ⁾
2. Для всех остальных слоев до l=1
dZ⁽ˡ⁾ = dA⁽ˡ⁾ * relu'(Z⁽ˡ⁾)
где ‘*’ обозначает поэлементное умножение двух матриц, а ‘relu’(Z⁽ˡ⁾)’ обозначает дифференцирование функции активации relu относительно Z⁽ˡ⁾.
и
dW⁽ˡ⁾ = dZ⁽ˡ⁾(A⁽ˡ⁻¹⁾)ᵀ/m db⁽ˡ⁾ = dZ⁽ˡ⁾/m dA⁽ˡ⁻¹⁾ = (W⁽ˡ⁾)ᵀdZ⁽ˡ⁾
и сохраните градиенты dW и db в списке
3. Используйте градиенты, сохраненные выше, чтобы обновить параметры W и b для каждого слоя.
W⁽ˡ⁾ = W⁽ˡ⁾ - 𝝰dW⁽ˡ⁾ b⁽ˡ⁾ = b⁽ˡ⁾ - 𝝰db⁽ˡ⁾
где 𝝰 – скорость обучения.
Повторите все шаги для n итераций, пока потери не сойдутся, чтобы найти оптимальное значение для W и b.
В случае регуляризации L2 функция стоимости принимает вид:
где l обозначает слои, k и j обозначают количество нейронов в каждом слое, а 𝝺 — параметр регуляризации.
Также соответственно изменяются градиенты dW⁽ˡ⁾
dW⁽ˡ⁾ = dZ⁽ˡ⁾(A⁽ˡ⁻¹⁾)ᵀ/m + (𝝺/m)W⁽ˡ⁾
Для любых ошибок, возникающих в коде, одна вещь, которая очень помогает в устранении неполадок, — это проверка размеров матриц на каждом шаге. Подробнее см. здесь:
Все материалы здесь получены из DeepLearning.AI. Формулировки мои, как и любые ошибки.
Спасибо, что прочитали. Приветствуются любые комментарии, вопросы и предложения.