Насколько точной должна быть функция активации и насколько большими будут ее входные данные?

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

public static double sigmoid(double t){

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

}

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


person Dylan Siegler    schedule 25.09.2016    source источник


Ответы (2)


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

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

person WizsTheWizard    schedule 27.09.2016

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

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

person Darren Cook    schedule 26.09.2016