如何计算具有温度的鲁棒softmax函数?

2024-09-30 14:31:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这是another quesion/answer的分支

我想要一个与此等价的函数:

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“缩放”。在

示例:

^{pr2}$

所以当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但没有温度


Tags: 函数答案returndefnp温度概率array