В этой статье я расскажу о шагах, связанных с решением задачи бинарной классификации с использованием глубокой нейронной сети, имеющей 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)) 

Прямое распространение

  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.

Обратное распространение

  1. Для слоя 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. Формулировки мои, как и любые ошибки.

Спасибо, что прочитали. Приветствуются любые комментарии, вопросы и предложения.