Реализация активации Softmax - PullRequest
1 голос
/ 21 января 2020

В настоящее время я работаю над собственной реализацией нейронной сети в Java. Я уже реализовал некоторые общие функции активации, такие как Sigmoid или ReLU, но я не знаю, как реализовать Softmax.

Я хочу иметь метод, подобный

private double softmax(double input) {
    double output = ???;
    return output;
}

Любые идеи, как реализацию можно посмотреть? Мне также нужно иметь производную от softmax для моего алгоритма обучения.

1 Ответ

2 голосов
/ 05 февраля 2020

Softmax не получает ни одного входного значения. Он принимает в качестве входных данных вектор всех значений текущего NN-слоя (под «значениями» я подразумеваю выходные данные предыдущей точки, произведенной матрицей ядра и добавленной к смещениям), и выдает распределение вероятностей , все значения которого попадают в диапазон [0, 1].

Итак, если ваш NN-слой, например, имеет 5 единиц / нейронов, функция softmax принимает в качестве входных значений 5 и нормализует их в распределение вероятностей, которое все 5 выходные значения находятся в диапазоне [0, 1], используя следующую формулу:

enter image description here

где в нашем примере: K = 5 и Z 1, Z 2 , ..., Z 5 - входной вектор.

Вот пример Java кода, реализующего softmax:

private double softmax(double input, double[] neuronValues) {
    double total = Arrays.stream(neuronValues).map(Math::exp).sum();
    return Math.exp(input) / total;
}
...