Мы реализуем вспомогательные функции для обратного распространения и рассчитаем градиент функции потерь по параметрам.
Функция стоимости:
Итак, к этому моменту мы инициализировали наши глубинные параметры и написали модуль прямого распространения. Теперь мы реализуем функцию стоимости и модуль обратного распространения. Как и раньше, нам нужно вычислить стоимость, потому что мы хотим проверить, обучается ли наша модель.
Чтобы вычислить кросс-энтропийную стоимость 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. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.