Добро пожаловать на Курс по самоуправляемым автомобилям, часть 9. Этот курс в блоге познакомит нас с миром беспилотных автомобилей, с тем, как работают беспилотные автомобили, плюсы и минусы вождения автомобилей, что такое беспилотные автомобили компании

Что мы узнали???

В части 1 этого раздела мы реализовали концепции графов, прямого распространения, обучения и потерь и линейного преобразования в нашем скрипте мини-потока.

Что будет

В этой лаборатории вы продолжите создавать Miniflow, который является нашей собственной версией TensorFlow!

  • Сигмовидная функция
  • Расходы
  • Градиентный спуск
  • Обратное распространение
  • Стохастический градиентный спуск

Сигмовидная функция

Нейронные сети используют чередующиеся преобразования и функции активации для лучшей категоризации выходных данных. Сигмовидная функция является одной из наиболее распространенных функций активации.

Линейные преобразования отлично подходят для простого сдвига значений, но нейронные сети часто требуют более тонких преобразований. Например, один из оригинальных проектов искусственного нейрона, персептрон, демонстрирует поведение бинарного вывода. Перцептроны сравнивают взвешенный вход с порогом. Когда взвешенный ввод превышает пороговое значение, персептрон активируется и выводит 1, в противном случае он выводит 0.

Вы можете смоделировать поведение персептрона как ступенчатую функцию:

Активация, идея поведения двоичного вывода, обычно имеет смысл для задач классификации. Например, если вы просите сеть предположить, является ли рукописное изображение цифрой «9», вы фактически запрашиваете двоичный вывод — да, это цифра «9» или нет, это не "9". Ступенчатая функция – это самая совершенная форма двоичного вывода, и это здорово, но ступенчатые функции не являются непрерывными и недифференцируемыми, что очень плохо. Дифференциация — это то, что делает возможным градиентный спуск.

Сигмовидная функция, уравнение (3) выше, заменяет пороговое значение красивой S-образной кривой (также показанной выше), которая имитирует активационное поведение персептрона, будучи дифференцируемой. В качестве бонуса сигмовидная функция имеет очень простую производную, которую можно вычислить из самой сигмовидной функции, как показано в уравнении (4) ниже.

Обратите внимание, что сигмовидная функция имеет только один параметр. Помните, что сигмоид — это функция активации (нелинейность), то есть она принимает один вход и выполняет над ним математическую операцию.

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

Теперь, когда я дал вам уравнение для сигмовидной функции, я хочу, чтобы вы добавили его в библиотеку Miniflow. Для этого вам нужно использовать np.exp(documentation), чтобы сделать вашу жизнь намного проще.

Вы будете использовать Sigmoid в сочетании с Linear. Вот как это должно выглядеть:

class Sigmoid(Node):
    def __init__(self, node):
        Node.__init__(self, [node])
    def _sigmoid(self, x):
        """
        This method is separate from `forward` because it
        will be used with `backward` as well.
        `x`: A numpy array-like object.
        """
        return 1. / (1. + np.exp(-x)) # the `.` ensures that `1` is a float
    def forward(self):
        input_value = self.inbound_nodes[0].value
        self.value = self._sigmoid(input_value)

Может показаться странным, что _sigmoid был отдельным методом. Как видно из производной сигмовидной функции, уравнение (4), сигмоидальная функция на самом деле является частью своей собственной производной. Разделение _sigmoid означает, что вам не придется реализовывать его дважды для прямого и обратного распространения.

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

Стоимость

Существует множество методов определения точности нейронной сети, и все они основаны на способности сети выдавать значения, максимально приближенные к известным правильным значениям. Люди используют разные названия для этого показателя точности, часто называя его потери или затраты. Чаще всего я буду использовать термин затраты.

Далее вы рассчитаете стоимость, используя среднеквадратичную ошибку (MSE). Это выглядит так:

Полная версия статьи доступна здесь