2016-06-01 3 views
0

У меня есть небольшой вопрос.Обработка большого числа в нейронной сети

Что бы лучший способ обучить нейронную сеть с большими числами (> 1), например:

input[][] {{10,100,1000}}; 
desiredOutput {{5000}}; 

(на самом деле не имеет никакого смысла за этим, как раз, например)

Поскольку нормальный нейроны могут выводить только -1 в 1, сеть не сможет выводить 5000. Было бы целесообразно разделить ее в начале и снова умножить на конец?

input[][] {{10,100,1000}}; --> {{0.001,0.01,0.1}}; (divide by 10'000) 
desiredOutput {{0.5}}; --> {{5000}}; (multiply by 10'000) 

Есть ли лучший или более обычный способ?

+0

Я бы не разделил число, потому что вычисления с номерами 'float' медленнее, чем с' int'. –

+0

@KevinWallis вы можете вводить только дубли в любом случае, и у меня достаточно времени: P –

+0

, если вы хотите, чтобы более читаемый алгоритм, чем нормализация всех чисел, имел смысл. иначе я буду жить с «большими цифрами», –

ответ

0

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

Это, вероятно, не то, что вы хотите, потому что для большинства приложений относительные изменения важны. Если вы измените ввод от 1 до 2 (100%), вы, вероятно, ожидаете большего эффекта на выходе, чем при изменении 1000 на 1001 (0,1%), хотя абсолютные различия совпадают.

Этого можно избежать с помощью логарифмического масштабирования.

Пример: Для того, чтобы преобразовать диапазон от 1 до 10000 в диапазоне от 0 до 1, можно использовать следующую формулу:

transformedInput = (Math.log10(input) - 1.0)/4.0 

Для преобразования выходного сигнала обратно на исходный диапазон, использование экспоненцирование:

output = Math.pow(10.0, 4.0 * output + 1.0); 
0

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

0

То, о чем вы спрашиваете, называется normalization и да, данные должны быть нормализованы до диапазона [0; 1] или [-1; 1] перед вводом его в сеть.

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

Выходные значения могут иметь совсем другое значение, означающее входы, и, как правило, нет никаких причин масштабировать его так же, как входы. См. Также Why do we have to normalize the input for an artificial neural network?

Смежные вопросы