В предыдущем упражнении вы видели, что простого добавления скрытых слоев в нашу сеть недостаточно для отображения нелинейностей. Линейные операции, выполняемые над линейными операциями, по-прежнему линейны.
Как настроить нейронную сеть для изучения нелинейных связей между значениями? Нам нужен какой-то способ вставки нелинейных математических операций в модель.
Если это кажется вам несколько знакомым, то это потому, что ранее в этом курсе мы фактически применяли нелинейные математические операции к выходным данным линейной модели. В модуле «Логистическая регрессия» мы адаптировали модель линейной регрессии для вывода непрерывного значения от 0 до 1 (представляющего вероятность), передавая выходные данные модели через сигмовидную функцию .
Мы можем применить тот же принцип к нашей нейронной сети. Давайте вернемся к нашей модели из упражнения 2 ранее, но на этот раз, прежде чем выводить значение каждого узла, мы сначала применим сигмовидную функцию:
Попробуйте выполнить вычисления каждого узла, щелкнув >| кнопку (справа от кнопки воспроизведения). Просмотрите математические операции, выполняемые для расчета значения каждого узла, на панели «Вычисления» под графиком. Обратите внимание, что выходные данные каждого узла теперь представляют собой сигмовидное преобразование линейной комбинации узлов предыдущего слоя, а все выходные значения сжимаются между 0 и 1.
Здесь сигмоида служит функцией активации нейронной сети — нелинейным преобразованием выходного значения нейрона перед тем, как значение будет передано в качестве входных данных для вычислений следующего слоя нейронной сети.
Теперь, когда мы добавили функцию активации, добавление слоев имеет больший эффект. Наложение нелинейностей на нелинейности позволяет нам моделировать очень сложные отношения между входными данными и прогнозируемыми выходными данными. Короче говоря, каждый уровень эффективно изучает более сложную функцию более высокого уровня на основе необработанных входных данных. Если вы хотите лучше понять, как это работает, прочтите превосходную публикацию в блоге Криса Олаха .
Общие функции активации
В качестве функций активации обычно используются три математические функции: сигмовидная, tanh и ReLU.
Сигмовидная функция (обсуждаемая выше) выполняет следующее преобразование входных данных $x$, создавая выходное значение от 0 до 1:
\[F(x)=\frac{1} {1+e^{-x}}\]
Вот график этой функции:
![Рисунок 4. График сигмовидной функции: s-образная кривая, которая асимптотически приближается к оси x, когда x приближается к отрицательной бесконечности, и к 1, когда x приближается к бесконечности.](https://developers.google.cn/static/machine-learning/crash-course/neural-networks/images/sigmoid.png?authuser=3&hl=ru)
Функция tanh (сокращение от «гиперболический тангенс») преобразует входные данные $x$ для получения выходного значения от –1 до 1:
\[F(x)=tanh(x)\]
Вот график этой функции:
![Рисунок 5. График функции tanh: немного более крутая s-образная кривая, чем сигмовидная функция, которая асимптотически приближается к –1, когда x приближается к отрицательной бесконечности, и к 1, когда x приближается к бесконечности.](https://developers.google.cn/static/machine-learning/crash-course/neural-networks/images/tanh.png?authuser=3&hl=ru)
Функция активации выпрямленной линейной единицы (или ReLU , для краткости) преобразует выходные данные, используя следующий алгоритм:
- Если входное значение $x$ меньше 0, верните 0.
- Если входное значение $x$ больше или равно 0, верните входное значение.
ReLU можно представить математически с помощью функции max():
Вот график этой функции:
![Рисунок 6. График функции ReLU: горизонтальная линия вдоль оси X от отрицательной бесконечности до 0, которая становится диагональной линией, идущей вверх и вправо с наклоном 1 (y=x) от 0 до бесконечности.](https://developers.google.cn/static/machine-learning/crash-course/neural-networks/images/relu.png?authuser=3&hl=ru)
ReLU часто работает немного лучше в качестве функции активации, чем плавная функция, такая как сигмовидная или tanh, поскольку она менее подвержена проблеме исчезающего градиента во время обучения нейронной сети . ReLU также значительно проще вычислять, чем эти функции.
Другие функции активации
На практике любая математическая функция может служить функцией активации. Предположим, что \(\sigma\) представляет нашу функцию активации. Стоимость узла в сети определяется по следующей формуле:
Keras обеспечивает готовую поддержку многих функций активации . Тем не менее, мы по-прежнему рекомендуем начать с ReLU.
Краткое содержание
В следующем видео представлен обзор всего, что вы узнали о том, как устроены нейронные сети:
Теперь в нашей модели есть все стандартные компоненты того, что люди обычно имеют в виду, когда говорят о нейронной сети:
- Набор узлов, аналогичных нейронам, организованных слоями.
- Набор весов, представляющий связи между каждым слоем нейронной сети и слоем, находящимся под ним. Слой ниже может быть другим слоем нейронной сети или слоем другого типа.
- Набор смещений, по одному на каждый узел.
- Функция активации, которая преобразует выходные данные каждого узла слоя. Разные слои могут иметь разные функции активации.
Предостережение: нейронные сети не всегда лучше, чем скрещивание признаков, но нейронные сети предлагают гибкую альтернативу, которая хорошо работает во многих случаях.