2

Я пишу базовую нейронную сеть в Java, и я пишу функции активации (в настоящее время я только что написал сигмовидную функцию). Я пытаюсь использовать double с (как указано в BigDecimal), надеясь, что обучение на самом деле займет разумное время. Однако я заметил, что функция не работает с большими входами. В настоящее время моя функция:Насколько точна функция активации, и насколько велики ее входы?

public static double sigmoid(double t){ 

    return (1/(1 + Math.pow(Math.E, -t))); 

} 

Эта функция возвращает довольно точные значения вплоть до когда это t = -100, но когда t >= 37 функция возвращает 1.0. В типичной нейронной сети, когда ввод нормализуется, это прекрасно? Будет ли нейрон когда-либо получать входы, суммирующие более ~ 37? Если размер суммы входов, вводимых в функцию активации, варьируется от NN до NN, каковы некоторые из факторов, влияющих на нее? Кроме того, есть ли способ сделать эту функцию более точной? Есть ли более точная и/или более эффективная альтернатива?

ответ

2

Да, в нормализованной сети двойной штраф в использовании. Но это зависит от вашего ввода, если ваш уровень ввода больше, ваша сумма ввода будет больше, конечно.

Я столкнулся с той же проблемой, используя C++, после того, как t стал большим, компилятор/rte даже не учитывает E^-t и возвращает plain 1, поскольку он только вычисляет 1/1 часть. Я попытался разделить уже нормированный вход на 1000-1000000, и он работал иногда, но иногда это не так, как я использовал рандомизированный ввод для первой эпохи, а мой входной слой был матрицей 784x784. Тем не менее, если ваш уровень ввода мал, и ваш ввод нормализуется, это поможет вам

2

Удивительный ответ заключается в том, что двойной на самом деле больше точности, чем вам нужно. This blog article by Pete Warden утверждает, что даже 8 бит являются достаточной точностью. И не только академическая идея: новые чипы Pascal от NVidia подчеркивают свою производительность с одной точностью выше всего остального, потому что это важно для обучения глубокому обучению.

Вы должны нормализовать значения входных нейронов. Если экстремальные значения все же произойдут, прекрасно установить их на -1 или +1. Фактически, this answer показывает это явно. (Другие ответы на этот вопрос также интересны - предложение просто предварительно вычислить 100 или около того значений, а не использовать Math.exp() или Math.pow() вообще!)

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