Проблема с арифметикой с использованием логарифмов во избежание потери числового значения (дубль 2)
Увидев вышесказанное и увидев нормализацию softmax, я пытался нормализовать вектор, избегая переполнения -
это если у меня есть массив
x[1], x[2] x[3], x[4], ... , x[n]
нормализованная форма для меня имеет сумму квадратов элементов как 1.0
и получается путем деления каждого элемента на
sqrt(x[1]*x[1]+x[2]*x[2]+...+x[n]*x[n])
теперь сумма квадратов может переполняться, даже если корень квадратный достаточно мал, чтобы поместиться в переменную с плавающей запятой, поэтому я подумал, что можно сделать что-то вроде
s=(2*log(fabs(x[1]))+2*log(fabs(x[2]))+...+2*log(fabs(x[n])))/2
и вычисление элементов как
exp(log(fabs(x[1]))-s), ..., exp(log(fabs(x[n]))-s
НО
Вышеприведенное неверно, так как log (A + B) не является log (A) + log (B) - теперь есть ли способ нормализации вектора, который лучше избегает переполнения?