Нейронная сеть активация / выход - PullRequest
3 голосов
/ 09 января 2012

Вот мой код (для нейрона в сети MLP):

double summation = 0;
for (int i = 0; i < weights.length; i++) {
    summation += inputs[i] * weights[i];
}

double normalized = Math.tanh(summation);
if (normalized > 0.9 || normalized < -0.9) {
    activated = 1;
} else {
    activated = 0;
}

Я думаю, что это неправильно. Выходной сигнал должен быть нормированным значением или всегда ограничен 0 или 1?

Ответы [ 3 ]

2 голосов
/ 09 января 2012

Распространенной функцией активации является сигмоид.Это хорошо, потому что это может раздавить значения нейронов между двумя границами.Итак, суммируйте все значения, затем примените вашу функцию активации

Вот выдержка из моей сигмоидальной функции из моего кода:

/**
 * シグモイド関数: Sigmoid function
 */
private double sigmoid(double x) {
    return (1.0 / (1 + Math.exp(-x)));
}

Также ознакомьтесь с моими примерами нейронных сетей на Github (Кодв Java, C ++ версии также доступны) https://github.com/kennycason/neuralnetwork/ https://github.com/kennycason/ml

1 голос
/ 09 января 2012

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

0 голосов
/ 09 января 2012

Не существует «правильной» функции активации для нейрона.То, что вы хотите, это какая-то функция, которая зажата между двумя значениями и монотонно увеличивается.Функция гиперболического тангенса (ваша «нормализованная» функция) будет делать это очень хорошо, без выходов, бегущих от -1 до 1, так как входы бегут от -inf до + inf.

Существует множество общих активацийфункции, хотя.Функция Signum (выходной отрицательный, если входное значение меньше нуля, в противном случае выходной) также действует.Другой - это логистическая кривая, о которой упоминает Кенни Кейсон, но учтите, что на самом деле вы можете заменить -x в функции Кенни на -kx, где k - некоторая константа.Таким образом, вы можете создать семейство сигмовидных кривых с более плотной или более слабой переходной областью около нуля.

Ни один из них не является более «правильным», чем другой.(Если вы не делаете обратное распространение, в этом случае функция signum не дифференцируема и не будет работать для вас.)

Тем не менее, я не понимаю, каково ваше утверждение "если"делает.Похоже, вы создаете функцию, которая переходит от единицы, к нулю и обратно к единице, когда входные данные перемещаются от -inf к + inf.Это совсем не то, что вы хотите.(Если бы вы переходили от отрицательного к нулю к положительному, это было бы хорошо.)

...