2

函数光滑近似(4):Heaviside step函数及其应用

 2 years ago
source link: https://allenwind.github.io/blog/15887/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

其实Heaviside step函数在本博客在介绍了很多次,不过比较松散,这篇把它系统梳理一下。

函数光滑近似在本博客已经有很多相关内容,这里整理一下:

通过这些文章,我们意识到,深度学习中,似乎处处都是某几个基本函数的光滑逼近的踪影。这几个基本函数是什么?不熟悉的读者可以带着这个问题去读以上文章。

作为本系列的前三篇有:

本篇延续前三篇的内容,讲Heaviside step函数的光滑逼近。下面的推导需要使用到这三篇文章里面的相关结论。其实Heaviside step函数在本博客在介绍了很多次,不过比较松散,本篇详细讲述。

Heaviside step函数

Heaviside step函数,也称为unit step函数,它的定义有很多,比如作为分段函数,

H(x)={1,x>00,x≤0

这样的分段式在机器学习或深度学习中有重要意义,对于x∈R,把它压缩到0,1取值上,使其完成类别判别输出。例如,如果logit取值为负半轴,则把类别判别为负类(0),如果取值为正半轴,则把类别判别为正类(+1)。有例如,门控机制,判断当前信息是否保留还是过滤掉。H(x)正满足需求,但是要考虑两点:

  • H(x)​非光滑,对于机器学习或深度学习模型训练来说难求梯度
  • 很多情况下,希望模型输出类别概率p∈[0,1]​,而不是类别判别0,1​

此外,Heaviside step函数的好的光滑逼近Hs(x)应该满足关于点(0,12)中心对称,即Hs(x)=1−Hs(−x),于是Hs(0)=12。这种对称性对概率建模有意义,即如P(x+|θ)=1−P(x−|θ)。不过,如果是为设计relu(x)的光滑逼近而逼近H(x)可以不用考虑这一点,如Mish激活函数的设计思路一文中的思路。

因此,寻找Heaviside step函数的光滑近似(本文使用Hs(x)表示)相当有意义。另外,根据以上分段式,有

relu(x)=x×H(x)relu(x)=∫x−∞H(x)dx

也就是说,如果找到Heaviside step函数的光滑近似,也就找到激活函数relu(x)的光滑近似。由于激活函数是神经网络的重中之重,因此除了光滑近似外,常常还要考虑三点:

  • 非线性,这是必须的,否则神经网络就是一个线性函数
  • 负半轴非单调性,以便增加非线性
  • 在x较小时,应该满足f(x)≈x,以便保证输出的统计不变性

像GELU激活函数也是从这里思路来的,可参看过去的文章GELU由来:从狄拉克函数到GELU激活函数

Heaviside step函数还有作为max(0,x)​的导数的定义,

H(x)=ddxmax{0,x},x≠0

Heaviside step函数还有一种关于狄拉克函数(dirac function)的定义,

H(x)=∫x−∞δ(s)ds

其中狄拉克函数为,

δ(x)={+∞x=00x≠0

狄拉克函数满足,

∫∞−∞δ(x)dx=1

因此Heaviside step函数的光滑近似的构造思路有三个:

  • 寻找Heaviside step函数分段形式的封闭形式,如果该封闭形式具有非光滑的元素,则对该元素光滑处理
  • 寻找max0,x​的光滑逼近,其导数光滑逼近Heaviside step函数
  • 寻找狄拉克函数δ(x)的光滑逼,近其积分光滑逼近Heaviside step函数

从封闭形式出发

寻找H(x)​的封闭形式就需要发挥个人的数学直觉,在我看来,最容易构造的就是基于f(x)=|x|,因为改变符号容易自消除,进而得到负半轴的表示,

H(x)=x+|x|2|x|,x≠0

为使其在x=0处有定义,可以添加一个因子以及对称处理技巧,考虑到(这是函数光滑近似(3):abs函数中的结论),

|x|=max{−x,x}≈1αlog(e−αx+eαx) H(x)≈αx+log(e−αx+eαx)2log(e−αx+eαx)=12+αx2log(e−αx+eαx)=Hs(x)

注意到这里包括函数,

sech(x)=2ex+e−x

图像对比(这里取α=2),

α​​取的值越大,逼近效果越好。该近似Hs(x)是关于(0,12)中心对称的,因为Hs(x)=1−Hs(−x)​,对于Hs(0)=12。

一个构造上的反例,考虑函数光滑近似(1):maximum函数中的结论,

max(x1,x2,…,xn)≈n∑i=1xieαxin∑i=1eαxi,α>0

取x1=−x,x2=x,有

|x|=max{−x,x}≈x(eαx−e−αx)eαx+e−αx=xtanh(αx)

这个结论不能代入到H(x)=x+|x|2|x|构造Hs(x),因为前者在x=0无定义,而xtanh(αx)在x=0时取值也为0​。但是如果|x|分别使用不同的近似来替代,能够解决这个问题,如

Hs(x)=αx×1+tanh(αx)2ln(eαx+e−αx)

考虑符号函数的定义,

sign(x)={−1if x<0,0if x=0,1if x>0.

如果规定H(0)=12​​,那么有H(x)=12[1+sign(x)]​​​。​注意到,

sign(x)=x|x|≈x1+|x|

去掉绝对符号,

sign(x)=x|x|≈x(1+x2)12 H(x)=12[1+sign(x)]≈12[1+x(1+x2)12]

考虑添加一个缩放因子,

Hs(x)=12[1+αx(1+α2x2)12]

图像对比(这里取α=1),

该近似Hs(x)是关于(0,12)中心对称的,因为Hs(x)=1−Hs(−x),对于Hs(0)=12。

从光滑逼近max函数的角度

H(x)=ddxmax{0,x},x≠0

函数光滑近似(1):maximum函数我们知道,

max(x1,…,xn)≈1αln(n∑i=1eαxi),α>0

取α=1,x1=x,x2=0,有特例,

max{0,x}=ln(1+ex)

代入到Heaviside step函数的定义中,有

H(x)=ddxmax{0,x}≈ddxln(1+ex)=ex1+ex=11+e−x=σ(x)=Hs(x)

这个过程也可以参数化,结果是H(x)≈σ(αx)​​。这也是Sigmoid函数导出的另外一个角度中的结论。

类似的思路,考虑函数光滑近似(1):maximum函数中的结论,

max(x1,x2,…,xn)≈n∑i=1xieαxin∑i=1eαxi,α>0

取x1=0,x2=x,α=1​有特例,

max(0,x)≈xex1+ex=xσ(x)

代入到Heaviside step函数的定义中,有

H(x)=ddxmax{0,x}≈ddxxσ(x)=1+e−x+xe−x(1+e−x)2=Hs(x)

以上推导取α为一般形式得到Hs(x)的带参数形式,

Hs(x)=1+e−αx+xe−αx(1+e−αx)2

图像对比(这里取α=3​),

该近似Hs(x)是关于(0,12)中心对称的,因为Hs(x)=1−Hs(−x),对于Hs(0)=12。

从光滑逼近狄拉克函数的角度

Heaviside step函数还有一种关于狄拉克函数(dirac function)的定义,

H(x)=∫x−∞δ(s)ds

其中狄拉克函数为,

δ(x)={+∞x=00x≠0

要求狄拉克函数满足,

∫∞−∞δ(x)dx=1

这个函数看起来及其诡异难理解,这怎么能行?我们可以从极限的思路来理解它,假设有分段函数,

τ(x)={12l,−l≤x≤l0,x<−l,x>l liml→0∫+∞−∞τ(x)dx=1

于是δ(x)的分段式成立。狄拉克函数的逼近形式具有两个特点:

  • 关于y​​轴对称的偶函数,函数图形是“钟形”曲线
  • 在R上的积分为1

这两点最容易让人想到的是概率密度函数,因为它的积分一定为一。同时满足以上两点的概率密度函数容易让人想到标准正态分布与柯西分布,不过后者有一个“怪异”的性质,均值和方差不存在。

正态分布概率密度函数逼近,

δσ(x)≈1√πσ2e−(x/σ)2

σ不同取值下的可视化,

limσ→01√πσ2e−(x/σ)2=δ(x) ε=limσ→0|∫∞−∞δ(x)f(x)dx−∫∞−∞1√πσ2e−(x/σ)2f(x)dx|=limσ→0|∫∞−∞1√πσ2e−(x/σ)2f(0)dx−∫∞−∞1√πσ2e−(x/σ)2f(x)dx|=limσ→0|∫∞−∞1√πσ2e−(x/σ)2[f(0)−f(x)]dx|≤limσ→0max|f′(x)|∫∞−∞1√πσ2e−(x/σ)2|x|dx=limσ→0σ√πmax|f′(x)|=0

如果对δ(x)求积分,得到阶跃(Heaviside step)函数,

H(x)=∫x−∞δ(x)dx≈∫x−∞1√πσ2e−(x/σ)2dx=Φσ(x)=12[1+erf(xσ√2)]

这里σ控制1√πσ2e−(x/σ)2逼近δ(x)的程度,也就是相当于控制12[1+erf(xσ√2)]逼近H(x)的程度,,σ越小,逼近程度越好。

于是有近似,

Hs(x)=12[1+erf(xσ√2)]

图像对比(这里取α=0.5​),

该近似Hs(x)是关于(0,12)中心对称的,因为Hs(x)=1−Hs(−x),对于Hs(0)=12。

类似地,柯西分布(Cauchy distribution)也可以作为狄拉克函数的光滑逼近,

δγ(x)=1πγ[1+(xγ)2] limγ→0δγ(x)=δ(x) Hs(x)=∫x−∞δγ(x)dx=12+1πarctan(xγ) limγ→0Hs(x)=H(x)

图像对比,

该近似Hs(x)是关于(0,12)中心对称的,因为Hs(x)=1−Hs(−x),对于Hs(0)=12​。其实我们还可以从几何直观上获得该光滑逼近。还有一个不那么容易想到的函数满足Heaviside step函数的光滑逼近,

Hs(x)=arctan(x)∈[−π2,π2]

根据特征变换,

x′=a+x−min(x)max(x)−min(x)×(b−a)

变换到[0,1]区间上,有

Hs(x)=12+arctan(x)π

狄拉克函数的光滑逼近的构造还有很多,如

δε(x)=ε|x|ε−1,ε→0

从概率论角度看,0中心对称,取值范围在(−∞,+∞)​上且离对称轴越近越集中的随机变量的累积分布函数F(x)都可以用于逼近H(x)​​,这个直觉上很好理解。比如以上提及的正态分布与柯西分布满足条件。

如果我们去掉条件:Heaviside step函数的光滑逼近Hs(x)满足关于点(0,12)中心对称,也就是去掉概率对称性P(x+|θ)=1−P(x−|θ)条件,那么Heaviside step函数的光滑逼近就相当于寻找取值区间为[0,1]的“S”型函数。

有广义的Sigmoid函数,

σα=1(1+e−x)α

α取不同值时的“S”曲线差别,

这里这里取α=1就得经典的σ(x)激活函数,可参看过去的文章Sigmoid函数导出的另外一个角度

类似该思路,对tanh(x)负半轴置0也获得类似逼近,

H(x)≈{tanh(x),ifx≥00,ifx<0=tanh(max{0,x})≈tanh(ln(1+ex))=Hs(x)

α取不同值时的“S”曲线差别,

注意到这里Hs(0)=0.6,不再是(0,12)​中心对称。事实上,该逼近与Mish激活函数相关,可见过去文章Mish激活函数的设计思路

类似地,还有,

σ(x,α,β)=α+exβ+ex,β>α

总之,去掉关于点(0,12)中心对称的约束后,都可以天马行空设计。

既然Heaviside step函数的光滑逼近就相当于寻找取值区间为[0,1]的“S”型函数,那么该“S”型函数的微分曲线应该是“钟型”曲线,如正态分布。那么找到具体的“钟型”曲线,然后积分就是“S”型函数,通过区间处理获得Hs(x)。假设“S”型函数的曲线可以抽象地如下表达,

F(x;α,β,μ)

其中x∈(−∞,+∞);α是尺度参数,可以理解成是关于x的缩放因子,直观来看,像正态分布中的σ控制分散程度;β是形状参数,控制S的形状;μ是位置参数,控制F(0;α,β,μ)的中心,直观上可以理解成正态分布中的μ,这里一般取μ=0​​。这里我们给出一个具体例子,广义正态分布的累积分布函数,

F(x;α,β,μ)=12+sign(x−μ)12Γ(1/β)γ(1/β,|x−μα|β) γ(1/β,|x−μα|β)

是不完全伽马函数(lower incomplete gamma function),它定义为,

γ(s,x)=∫x0ts−1e−tdt

与之对应的就是upper incomplete gamma function,

Γ(s,x)=∫∞xts−1e−tdt

它们的和就是普通的Γ(x),

γ(s,x)+Γ(s,x)=Γ(s)=∫∞0ts−1e−tdt

Python实现的难点就是这个函数,Numpy下并没有自带lower incomplete gamma function,实现需要变通一下,具体如下,

from scipy.special import gammainc
from scipy.special import gamma
from scipy.special import exp1

def linc_gamma(x, s):
"""lower incomplete gamma function"""
if s == 0:
return exp1(x)
else:
return gamma(s) * gammainc(s, x)

我们来编程可视化一下,

通过这张图体会一下形状参数β、尺度参数α是如何控制“S”型函数曲线的形状。

整体可视化:

以上光滑逼近及其可视化:https://github.com/allenwind/smooth-approximation-function

可能会根据情况持续更新~

以上我们从三个角度出发构造H(x)的光滑逼近,并得到一些优良的Hs(x)。最后总结一下H(x)​​的光滑逼近。

Hs(x)=12[1+αxlog(e−αx+eαx)] Hs(x)=12[1+αx(1+α2x2)12] Hs(x)=1+e−αx+xe−αx(1+e−αx)2 Hs(x)=12[1+erf(xσ√2)] Hs(x)=12+1πarctan(xγ) Hs(x)=1(1+e−x)α Hs(x)=tanh(ln(1+ex))

于是,根据

relu(x)=x×H(x)relu(x)=∫x−∞H(x)dx

可以构造更多relu(x)激活函数的光滑逼近。例如,

relu(x)≈x2[1+αxlog(e−αx+eαx)]

本篇是函数光滑逼近的第四篇,以上的内容也讲了这些函数光滑逼近与激活函数、深度学习甚至与某些具体的深度学习Layer的关系,如果再往下写,应该是写δ(x)​函数的光滑逼近及其应用。待续~

转载请包括本文地址:https://allenwind.github.io/blog/15887
更多文章请参考:https://allenwind.github.io/blog/archives/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK