Шаг 68.
Основы создания нейросети на Python. Несколько интересных проектов. Проникнем в мозг нейронной сети. Обратные запросы

    На этом шаге мы рассмотрим организацию таких запросов.

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




Предыдущий шаг Содержание Следующий шаг