1. 尴尬的 max 函数
函数 max 很尴尬,无法优雅地用一个公式表达出来:
max(x1,x2,...,xn)=x1,x2,...,xn中最大者(1)
当然,可以递归定义为:
max(x1)=x1max(x1,x2,...,xn)=max(max(x1,x2,...,xn−1),xn)(2)
然而,这没卵用。在基于梯度的学习训练中,我们需要一个光滑的函数,当然一个光滑的解析函数更好。max 函数的最大问题在于它既不光滑,也不单调。
函数
y=max(x1,x2)(3)
当
x1<x2 时,无论
x1 如何变化,函数结果都不会变化,此时,训练算法无法计算梯度下降的方向。于是,softmax 函数应运而生。
2. softmax 函数
关于 softmax 的意图何定义,我已经在大作 "从 one-hot 到 softmax,再到交叉熵,技术一脉相承"说过了,不再赘述。这里只给出定义:
xk=∑i=1nexiexi(4)
3. 进一步探讨 softmax
为什么(4)式采用 e 做底数?事实上,可以用任何正实数代替 e,
xk=∑i=1nαxiαxi,(α>0)(5)
如果
xi 互不相等,令
α→∞,我们会得到一个极端结果,
α→+∞lim∑i=1nαxiαxi=1,(xi=max(x1,...,xn))α→+∞lim∑i=1nαxiαxi=0,(xi<max(x1,...,xn))(6)
softmax 函数实际上是一个最大值成员的甄别器,最大值成员对应的输出的结果无限接近1,其他成员的输出结果无限接近0。
4. max 真相很惊人
我定义一个新的函数,smoothmax,令
smoothmax(x1,...,xn)=∑i=1nαxi∑i=1nxiαxi(7)
事实上,有个很惊人的结论,
α→+∞limsmoothmax(x1,x2,...,xn)=max(x1,x2,...,xn)(8)
也就是说,max 是一个解析函数簇的极限值。也就是说, softmax也好,smoothmax 也好,与 max 在骨子里是一样的,都表现出对最强者的尊重。
换句话讲,对于向量
x,
smoothmax(x,e)=softmax(x)⋅x(8)
α→+∞limsmoothmax(x,α)=max(x)(9)