我目前正在尝试实现一种机器学习算法,该算法涉及 MATLAB 中的逻辑损失函数。不幸的是,由于数值溢出,我遇到了一些麻烦。
一般来说,对于给定的输入s
,逻辑函数的值是:
log(1 + exp(s))
逻辑损失函数的斜率为:
exp(s)./(1 + exp(s)) = 1./(1 + exp(-s))
在我的算法中, 的值s = X*beta
。这X
是一个矩阵,其中包含每个数据点的N
数据点和P
特征(即size(X)=[N,P]
),并且beta
是P
每个特征的系数向量,使得size(beta)=[P 1]
。
我对计算给定值的 Logistic 函数的平均值和梯度特别感兴趣beta
。
Logistic 函数 wrt 的平均值beta
为:
L = 1/N * sum(log(1+exp(X*beta)),1)
Logistic 函数 wrt 的斜率平均值b
为:
dL = 1/N * sum((exp(X*beta)./(1+exp(X*beta))' X, 1)'
注意size(dL) = [P 1].
我的问题是这些表达式不断产生数字溢出。问题实际上来自这样一个事实,即exp(s)=Inf
何时s>1000
何exp(s)=0
地s<-1000.
我正在寻找一种s
可以在浮点运算中取任何值的解决方案。理想情况下,我也非常感谢一个允许我以矢量化/有效方式评估值和梯度的解决方案。