Python 如何计算具有温度的鲁棒softmax函数?
这是从 我想要一个与此等效的函数:Python 如何计算具有温度的鲁棒softmax函数?,python,probability,numerical-stability,Python,Probability,Numerical Stability,这是从 我想要一个与此等效的函数: def softmax(x, tau): """ Returns softmax probabilities with temperature tau Input: x -- 1-dimensional array Output: s -- 1-dimensional array """ e_x = np.exp(x / tau) return e_x / e_x.sum() 这是稳定和稳健的
def softmax(x, tau):
""" Returns softmax probabilities with temperature tau
Input: x -- 1-dimensional array
Output: s -- 1-dimensional array
"""
e_x = np.exp(x / tau)
return e_x / e_x.sum()
这是稳定和稳健的,即对于较小的tau
,或较大的x
,它不会溢出。由于这将用于计算概率,因此输出的总和应为1
换句话说,我正在传递一些值(和温度),我希望输出一个概率数组,用输入和tau“缩放”
示例:
In [3]: softmax(np.array([2,1,1,3]), 1)
Out[3]: array([ 0.22451524, 0.08259454, 0.08259454, 0.61029569])
In [5]: softmax(np.array([2,1,1,3]), 0.1)
Out[5]: array([ 4.53978685e-05, 2.06106004e-09, 2.06106004e-09, 99954598e-01])
In [7]: softmax(np.array([2,1,1,3]), 5)
Out[7]: array([ 0.25914361, 0.21216884, 0.21216884, 0.31651871])
因此,当tau趋于0时,输出中的最高概率位于最高元素的位置。随着tau的增大,概率变得越来越接近
(可选)有关链接答案的问题。在这里,Neil给出了以下备选方案:
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)))
但是,该输出的总和不是1,原因是该函数返回的分类分布只有N-1
自由参数,最后一个参数是1-sum(others)
。但在运行时,我注意到对于长度为3的向量,它返回长度为3的向量。那么,丢失的那个在哪里?我可以将其与上面的示例等效吗
为什么这个答案是稳定的?如何从softmax
的简单公式中得出这一点
可能相关的问题:
但是没有温度我已经向您解释过,我在输入和输出中省略了组件。之所以这样做,是因为softmax将分类分布的自然参数转换为期望参数。自然参数是可加的。如果你在输入中保留了额外的组件,那么你就失去了这个重要的属性。stackexchange。而且,由于您对添加温度感兴趣,您会发现在没有额外组件的情况下,这更容易实现,因为在本例中,TemeProperty是通过划分自然参数来实现的。Neil,很抱歉,我没有正确表达它。我明白你为什么要移除一个组件,但我不明白怎么做。我没有看到
q[:-1]
或任何类似的东西。如果省略了它,为什么输出的数量与输入的数量相同?组件和数组元素不一样吗?我不想首先传入它。你的q
是从哪里来的?通常,q
来自多项式逻辑回归,或者来自波尔兹曼机器中的信号