我想要一个与此等效的功能:
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 变大,概率变得越来越接近。
(可选)有关链接答案的问题。在那里,尼尔给出了以下选择:
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
这个?
可能相关的问题: General softmax but without temperature