4

这是另一个问题/答案的分支

我想要一个与此等效的功能:

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

4

0 回答 0