Вот как вы могли бы реализовать логический сигмоид с численным стабильностью (как описано здесь здесь ):
def sigmoid(x):
"Numerically-stable sigmoid function."
if x >= 0:
z = exp(-x)
return 1 / (1 + z)
else:
z = exp(x)
return z / (1 + z)
Или, может быть, это более точно:
import numpy as np
def sigmoid(x):
return math.exp(-np.logaddexp(0, -x))
Внутри он реализует те же условия, что и выше, но затем использует log1p
.
В общем, многочленная логистическая сигмоида:
def nat_to_exp(q):
max_q = max(0.0, np.max(q))
rebased_q = q - max_q
return np.exp(rebased_q - np.logaddexp(-max_q, np.logaddexp.reduce(rebased_q)))