Я полный новичок в ANN. После прочтения статей в Интернете я реализовал нейронную сеть FF на C ++. Среди параметров конструктора, это важные параметры:
Я хочу вывод двух десятичных чисел, которые обычно варьируются от -xx.xx до + xx.xx, но иногда могут доходить до сотен.
Я подумал, что я бы использовал один скрытый слой и использовал бы для него функцию сигмоида. Выходной слой будет линейной функцией, поэтому значение не будет ограничено до [-1, 1].
Я искал много ресурсов для начинающих в Интернете о функциях активации, но большинство просто упоминает лог-сигмоидную / гиперболическую касательную и другие нелинейные функции. Я просто совершенно запутался в использовании линейной функции.
Мои вопросы:
Должен ли я просто использовать f (x) = x в качестве моей линейной функции? Это обычно используется? Или я должен больше экспериментировать с коэффициентами с такими функциями, как f (x) = ax + b?
Когда я делаю обратное распространение, все, что я до сих пор читал, упоминает о взятии производной вашей функции активации для вычисления дельт. Если используется линейная функция, как это работает? Если я использую f (x) = x, производная должна равняться 1. Таким образом, моя реализация использует 1 для вычисления ошибок и корректировки весов, как если бы использовалась нелинейная функция активации. Я совершенно не в том направлении? Я совершенно сбит с толку, потому что ни один из ресурсов, которые я прочитал, не упоминал об этом вообще.
Спасибо!
Я думаю, что здесь полезно провести различие между функцией активации, используемой для скрытых слоев, и функцией активации, используемой для выходного слоя. Во многих моделях эти активации не одинаковы, и хотя алгоритм backprop не заботится об этом, я думаю, что это концептуально довольно важно.
Архитектура канонической нейронной сети состоит из входного «слоя», одного или нескольких скрытых слоев и выходного слоя. (Я поместил входной слой в кавычки, потому что этот слой обычно не имеет каких-либо связанных параметров; это просто способ включения входных данных в модель.) Учитывая входной вектор x
информация передается через модель, по очереди активируя каждый скрытый слой и, наконец, активируя выходной слой.
Давайте рассмотрим сеть с одним входным «слоем», одним скрытым слоем и одним выходным слоем. Информационный поток в этой модели:
x --> h(x) = s(Wx + b) --> y(x) = r(Vh(x) + c)
Здесь я представил вывод скрытого слоя как h(x)
и вывод выходного слоя как y(x)
, Каждый слой построен как взвешенная сумма его входных данных в сочетании с некоторым смещением или смещением (это аффинное преобразование: Wx + b
для скрытого слоя, и Vh + c
для выходного слоя. Кроме того, аффинное входное преобразование каждого слоя дополнительно преобразуется возможно нелинейной «функцией активации»: s(.)
для скрытого слоя, и r(.)
для выходного слоя.
Давайте предположим, что эта сеть используется для двоичной классификации. В наши дни очень распространено использование логистическая функция для обоих s
а также r
: s(z) = r(z) = (1 + e^-z)^-1
, но они используются таким образом по разным причинам:
Для скрытого слоя использование логистической функции вызывает внутреннее представление модели h(x)
быть нелинейной функцией x
, Это дает модели большую репрезентативную мощность, чем использование линейной активации s(z) = z
,
Для выходного слоя логистическая функция гарантирует, что выход y(x)
модели можно рассматривать как вероятность случайной величины Бернулли.
Теперь давайте предположим, что вы используете такую сеть для регрессии. Для задач регрессии довольно часто требуется моделировать выходы за пределами открытого интервала (0, 1). В этих случаях очень часто используют логистическую функцию в качестве активации скрытого слоя. s(z) = (1 + e^-z)^-1
но выходной слой активируется линейно r(z) = z
, так y(x) = Vh(x) + c
, Причина использования этих функций активации:
Для скрытого слоя использование нелинейной активации дает модели большую репрезентативную силу — точно так же, как модель классификатора выше.
Для выходного слоя линейная активация гарантирует, что модель может достичь любого диапазона выходных значений. По сути, результатом модели является базовое аффинное преобразование (масштабирование, вращение, перекос и / или перевод) того, что представлено скрытым слоем.
По сути, это несколько скучный способ сказать, что подход, который вы описываете, подходит для вашей проблемы — используйте нелинейную активацию для скрытого слоя и линейную для вывода.
Обратное распространение является наиболее широко используемым методом для оптимизации параметров нейронной сети. В основном backprop — градиентный спуск; чтобы использовать его, нам нужно сформулировать убыток, который является функцией параметров в нашей модели (W
, b
, V
, а также c
).
Для регрессии обычно используется потеря среднего квадрата (MSE):
L(W, b, V, c) = 1/n * sum i = 1..n (y(X[i]) - t[i])^2
Здесь я предположил, что у нас есть доступ к учебному набору данных, состоящему из n
входные X[i]
и соответствующие целевые значения t[i]
, Сетевой выход y
вычисляется как функция его входа X[i]
и результат сравнивается с t[i]
— любая разница возводится в квадрат и накапливается в общем потере.
Чтобы оптимизировать параметры модели, нам нужно взять производную потерь и установить ее равной нулю. Таким образом, получение производной от этой потери дает нам что-то вроде:
dL/dW = 1/n sum i = 1..n 2(y(X[i]) - t[i]) y'(X[i])
Здесь мы использовали цепочечное правило, чтобы расширить производную потерь, чтобы включить также производную сетевого выхода. Этот процесс расширения продолжается до конца «назад» через модель, пока расширение правила цепочки не может быть применено далее.
Однако здесь вы начинаете видеть применение производной функции вывода. Для регрессионной модели, y(x) = Vh(x) + c
, так y'(x) = Vh'(x)
, Так:
dL/dW = 1/n sum i = 1..n 2(y(X[i]) - t[i]) Vh'(X[i])
Но h(x) = s(Wx + b)
так h'(x) = xs'(Wx + b)
(помните здесь, мы берем производную по отношению к W
).
В любом случае, получение всех производных становится довольно сложным, как вы можете видеть только для двухслойной сети (или сети с одним скрытым слоем), но производные функций активации являются лишь естественным следствием применения правила цепочки. при этом дифференцируя общую потерю для модели.
f(x) = x
это очень простая функция активации, которая обычно не используется, поскольку ее нельзя использовать для моделирования сложных шаблонов, которые чаще встречаются в большинстве проблем с данными. Обычно используемыми функциями активации являются сигмоидальная, гиперболическая касательная, логистика, RBF (гауссовская) и Эллиот и другие. Для меня гиперболический тангенс работал хорошо во многих случаях, и я всегда начинаю свою первоначальную настройку модели с этого. Функция f (x) = ax + b такая же, как линейная функция с уклоном и весом. Если вы используете любую случайную функцию для активации, вы можете не получить ощутимых результатов.
Обратное распространение выполняется во время обучения (т. Е. Обновление весов вашей нейронной сети), и в случае f (x) = x оно просто обновит нейрон смещения. Есть также несколько типов алгоритма обратного распространения с «Стандартным обратным распространением», используемым более часто. Вы можете легко найти алгоритм в Google.
Определить обратимую функцию f(x)
так что -1f_inv (у). Любой выбор будет работать, так как эта функция применяется вне обученной части сети.
Это также означает, что вы не вычисляете производные ваших весов по сравнению с необработанными значениями обучения, а только по отношению к масштабированным значениям обучения. Для линейного отображения это не имеет значения (как df/dx=a
) но это может привести к незначительной разнице в результатах для нелинейных отображений. В общем, невозможно сказать, хорошо это или плохо.