在最优化问题中,求一个函数的最大值或最小值,最直接的方法是求导,然后比较各阶极值的大小。然而,我们所要优化的函数往往不一定可导,比如函数中含有最大值函数max(x,y)的。这时候就得求助于其他思路了。有一个很巧妙的思路是,将这些不可导函数用一个可导的函数来近似它,从而我们用求极值的方法来求出它近似的最优值。本文的任务,就是探究一个简单而有用的函数,它能够作为最大值函数的近似,并且具有多阶导数。下面是笔者给出的一个推导过程。

在数学分析中,笔者已经学习过一个关于最大值函数的公式,即当x0,y0时,我们有
max(x,y)=12(|x+y|+|xy|)


那么,为了寻求一个最大值的函数,我们首先可以考虑寻找一个能够近似表示绝对值|x|的函数,这样我们就把问题从二维降低到一维了。那么,哪个函数可以使用呢?

直接观察挺难发现哪个函数可以使用的,我们将问题逐步向简单推进。我们对f(x)=|x|求导,除了x=0这一点外,其他都可以顺利求导
f(x)={1,x>01,x<0


这是一个简单的分段函数,在物理中,这类函数十分常见,跟它最接近的,应该是单位阶跃函数θ(x)
θ(x)={1,x>00,x<0

那么
f(x)=2θ(x)1

下面只需要寻求θ(x)的近似函数,物理学家已经提供现成的函数给我们了,一个比较简单的形式是[来源:维基百科]
θ(x)=limk+11+ekx

那么我们就可以取11+ekx作为近似函数了,代入(4)式得到2ekx1+ekx1,积分得到
f(x)=2kln(1+ekx)x=1k[ln(1+ekx)+ln(1+ekx)]=1kln(2+ekx+ekx)

不难发现,(6)式中的对数部分,在k足够大的时候,常数2的影响微乎其微,把它去掉之后,我们有一个比较简单的绝对值函数:
|x|=limk+1kln(ekx+ekx)

结合(7)式和(1)式,我们就得到
max(x,y)=limk+12k{ln[ek(x+y)+ek(x+y)]+ln[ek(xy)+ek(xy)]}

(8)式还可以再化简,我们得到
max(x,y)=limk+12kln(e2kx+e2kx+e2ky+e2ky)

并且由于(1)式是在x0,y0时成立的,所以(9)式中的e2kxe2ky均变得不重要了,我们也把它们去掉,进一步得到
max(x,y)=limk+12kln(e2kx+e2ky)

或者写成
max(x,y)=limk+1kln(ekx+eky)

(11)式正是我们希望得到的理想的最大值函数。虽然我们的推导基于x0,y0,但是不难发现,对于x,y中出现负数时,上述公式仍然成立!它甚至还可以推广到多个变量的最大值函数:
max(x,y,z,)=limk+1kln(ekx+eky+ekz+)

关于(11)式更多的展示,请阅读Matrix67的《如何构造一个平滑的最大值函数》:
http://www.matrix67.com/blog/archives/2830

观察(11)式的结构可以看出,这实际上是做了这样的一个事情:找一个在整个实数域上都单调递增的函数,而且增长速度要快于线性增长,然后求和,最后取逆函数。因此,不难构造出类似的函数:我们选y=x2k+1,那么得到
max(x,y)=limk+2k+1x2k+1+y2k+1


当然,(13)的精度(或者说收敛速度)远没有(11)那么好,要提高精度也不难,比如
max(x,y)=limk+1klnln(eekx+eeky)

综合精度和简洁两方面考虑,估计最优的选择就是(11)了。

转载到请包括本文地址:https://kexue.fm/archives/3290

更详细的转载事宜请参考:《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (May. 02, 2015). 《寻求一个光滑的最大值函数 》[Blog post]. Retrieved from https://kexue.fm/archives/3290

@online{kexuefm-3290,
        title={寻求一个光滑的最大值函数},
        author={苏剑林},
        year={2015},
        month={May},
        url={\url{https://kexue.fm/archives/3290}},
}