Мы реализуем вспомогательные функции для обратного распространения и рассчитаем градиент функции потерь по параметрам.

Функция стоимости:

Итак, к этому моменту мы инициализировали наши глубинные параметры и написали модуль прямого распространения. Теперь мы реализуем функцию стоимости и модуль обратного распространения. Как и раньше, нам нужно вычислить стоимость, потому что мы хотим проверить, обучается ли наша модель.
Чтобы вычислить кросс-энтропийную стоимость J, мы будем использовать формулу, которую мы уже видели ранее:

Код для нашей функции calculate_cost:

Аргументы:

AL — вектор вероятности, соответствующий вашим предсказаниям меток, форма (1, количество примеров).
Y — истинный вектор «меток» (например: содержащий 0, если собака, 1, если кошка), форма (1, количество примеров).

Возврат:

cost — кросс-энтропийная стоимость.

Это всего лишь одна строка кода, поэтому мы не будем ее тестировать, так как она тестировалась в моих предыдущих уроках.

Функция обратного распространения:

Как и в случае с прямым распространением, мы реализуем вспомогательные функции для обратного распространения. Мы знаем, что распространение используется для вычисления градиента функции потерь для параметров. Нам нужно написать прямое и обратное распространение для модели LINEAR-›RELU-›LINEAR-›SIGMOID. Это будет выглядеть так:

Подобно прямому распространению, мы собираемся построить обратное распространение в три этапа:

  • ЛИНЕЙНЫЙ назад;
  • LINEAR -> ACTIVATION назад, где ACTIVATION вычисляет производную ReLU или сигмовидную активацию;
  • [LINEAR -> RELU] × (L-1) -> LINEAR -> SIGMOID назад (вся модель)

Линейное обратное:

Для слоя l линейная часть равна:

Я полагаю, мы уже вычислили производную:

Три выхода (dW[l], db[l], dA[l]) будут вычислены с использованием входа dZ[l]. Вот формулы, которые нам нужны из нашей серии руководств по двухслойным нейронным сетям:

Код для нашей функции linear_backward:

Аргументы:

dZ — Градиент стоимости относительно линейного выхода (текущего слоя l);
cache — кортеж значений (A_prev, W, b), поступающих из прямого распространения в текущем слое.

Возврат:

dA_prev — Градиент стоимости относительно активации (предыдущего слоя l-1), такой же формы, как у A_prev;
dW — Градиент стоимости до W (текущий слой l), той же формы, что и W;< br /> db — Градиент стоимости до b (текущий слой l), той же формы, что и b.

Функция обратной линейной активации:

Далее мы создадим функцию, которая объединяет две вспомогательные функции: linear_backward и шаг назад для активации linear_activation_backward.

Для реализации linear_activation_backward мы напишем две обратные функции:

  • sigmoid_backward: обратное распространение для единицы SIGMOID:
  • relu_backward: обратное распространение для блока RELU:

Если g(.) является функцией активации, sigmoid_backward и relu_backward вычисляют:

Код для нашей функции linear_activation_backward:

Аргументы:

dA — градиент после активации для текущего слоя l;
cache — набор значений (linear_cache, активация_кэш), которые мы сохраняем для эффективного вычисления обратного распространения;
активация — активация, которая будет использоваться в этом слое, хранится как текстовая строка: «sigmoid» или «relu».

Возврат:

dA_prev — Градиент стоимости до активации (предыдущего слоя l-1), такой же формы, как у A_prev;
dW — Градиент стоимости до W (текущий слой l), такой же формы, как у W;< br /> db — Градиент стоимости до b (текущий слой l), той же формы, что и b.

Полный код руководства:

Вывод:

Это руководство заняло некоторое время. Я завершу нашу обратную функцию в следующем уроке. В следующем уроке мы напишем наш обратный окончательный модуль и функцию для обновления наших параметров. После этого мы, наконец, обучим нашу модель.

Первоначально опубликовано на https://pylessons.com/Deep-neural-networks-part3

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.