На этом шаге мы рассмотрим организацию таких запросов.
Обычно мы задаем тренированной сети вопрос, и она выдает нам ответ. В нашем примере вопросом является изображение рукописной цифры. Ответом является маркер, представляющий число из диапазона значений от 0 до 9.
А что, если развернуть этот процесс наоборот? Что, если мы подадим маркер на выходные узлы и проследим за распространением сигнала по уже натренированной сети в обратном направлении, пока не получим на входных узлах исходное изображение? Следующая диаграмма иллюстрирует процесс распространения обычного запроса и описанный только что процесс распространения обратного запроса.
Мы уже знаем, как распространять сигналы по сети, сглаживая их весовыми коэффициентами и рекомбинируя на узлах, прежде чем применять к ним функцию активации. Весь этот механизм работает также для сигналов, распространяющихся в обратном направлении, за исключением того, что в этом случае используется обратная функция активации. Если у = f (х) - функция активации для прямых сигналов, то ее обратная функция - x = g(y). Для логистической функции нахождение обратной функции сводится к простой алгебре:
у = 1 / (1 + е-х) 1 + е-х = 1 / у е-х = (1 / у) - 1 = (1 - у) / у -x = ln((1 - у) / у) х = ln(у / (1 - у))
Эта функция называется logit(), и библиотека Python scipy.special предоставляет ее как scipy.special.logit(), точно так же, как и логистическую функцию scipy.special.expit().
Прежде чем использовать обратную функцию активации logit(), мы должны убедиться в допустимости сигналов. Что это означает? Вы помните, что сигмоида принимает любое значение и возвращает значение из диапазона от 0 до 1, исключая граничные значения. Обратная функция должна принимать значения из того же самого диапазона - от 0 до 1, исключая сами значения 0 и 1, - и возвращать значение, которое может быть любым положительным или отрицательным числом. Для этого мы просто берем все значения в слое, к которым собираемся применить функцию logit(), и приводим их к допустимому диапазону. В качестве такового был выбран диапазон чисел от 0,01 до 0,99.
На следующем шаге мы протестируем нашу сеть с использованием маркера "0".