Как предотвратить переполнение в моей реализации C# SoftMax?C#

Место общения программистов C#
Ответить
Anonymous
 Как предотвратить переполнение в моей реализации C# SoftMax?

Сообщение Anonymous »

Чтобы лучше понять машинное обучение с точки зрения «основных принципов», я реализую свои собственные функции, связанные с машинным обучением. В настоящее время я пытаюсь реализовать SoftMax:

Код: Выделить всё

IEnumerable SoftMax(IEnumerable vector)
{
var exps = vector.Select(v => Math.Exp(v));
var sumExps = exps.Sum();
return exps.Select(exp => exp / sumExps);
}
Если я правильно понимаю SoftMax, если я суммирую результаты этой функции, т. е. SoftMax(vector).Sum(), результат всегда должен быть 1 >.
Однако почти во всех случаях возвращается значение, которое немного больше или немного меньше 1. Обычно это что-то вроде 1.0568102998178908 или 0.9758570985704772.
Я слышал, что это не редкость (по сути, это проблема переполнения), и ее можно исправить вычитанием самый большой элемент входных данных значения, передаваемого в Math.Exp(). Итак, я придумал эту реализацию на основе предложений:

Код: Выделить всё

IEnumerable SoftMax(IEnumerable vector)
{
var maxVal = vector.Max();
var exps = vector.Select(v => Math.Exp(v - maxVal));
var sumExps = exps.Sum();
return exps.Select(exp => exp / sumExps);
}
При тестировании своей реализации я передаю случайный набор двойников следующим образом:

Код: Выделить всё

IEnumerable vector = Enumerable.Range(0, 100).Select(n => new Random().NextDouble());
var softMaxVec = SoftMax(vector);
Console.WriteLine(softMaxVec.Sum());
Но моя улучшенная реализация по-прежнему вызывает ту же проблему. Что я делаю неправильно? Или я что-то не понимаю в том, как должен работать SoftMax?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ementation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»