10

函数光滑近似(3):abs函数

 2 years ago
source link: https://allenwind.github.io/blog/9959/
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

求模函数在深度学习中也是很常见,例如文本匹配中,求两个词向量的模作为特征。本文讨论abs的光滑近似。

max变换出发

注意到f(x)=|x|f(x)=|x|可以用max函数表示,而max函数可以表示为logsumexp形式,于是有参数的形式

|x|=max{−x,x}≈1αlog(e−αx+eαx)|x|=max{−x,x}≈1αlog⁡(e−αx+eαx)

取α=1α=1,有特例,

|x|≈log(e−x+ex)|x|≈log⁡(e−x+ex)

对于二元形式的max(x,y)max(x,y)​,有

max(x,y)=|x+y|+|x−y|2≈12(log(ex+y+e−x−y)+log(ex−y+e−x+y))max(x,y)=|x+y|+|x−y|2≈12(log⁡(ex+y+e−x−y)+log⁡(ex−y+e−x+y))

取y=−xy=−x,于是,

|x|=max{−x,x}≈log(2)2+12log(e2x+e−2x)|x|=max{−x,x}≈log⁡(2)2+12log⁡(e2x+e−2x)

其实就是函数光滑近似(1):max函数#构造max的光滑近似中的结果。

几何角度出发

abs 可以从几何的角度出发,看做 (x,0)(x,0)​ 到原点的距离,通过偏移 (x,μ)(x,μ)​,有

|x|≤√x2+μ2|x|≤x2+μ2

可以写成,

|x|≤√x2+μ|x|≤x2+μ

其中 μ>0μ>0​ ,这两种写法没有质的区别。我们可以让μμ​​随着远离远点儿减小,例如,

|x|≤√x2+μx2+1|x|≤x2+μx2+1

但是这种形式是不具有对称性,为此可以改为偏移指数衰减,

|x|≤√x2+μex+e−x|x|≤x2+μex+e−x

这里涉及到ex+e−xex+e−x是出于对称性考虑。

偏移平方指数衰减,

|x|≤√x2+μe−βx2|x|≤x2+μe−βx2

按照这种思路,还可以构造更多的光滑逼近。不过需要注意,上述涉及到f(x)=exf(x)=ex的构造并不对称,需要改成f(x)=ex+e−xf(x)=ex+e−x形式。而且这些构造计算梯度并不优雅。

从符号函数开刀

使用符号函数表示绝对值函数,

|x|=xsign(x)|x|=xsign⁡(x) sign(x)=⎧⎨⎩−1if x<0,0if x=0,1if x>0.sign⁡(x)={−1if x<0,0if x=0,1if x>0.

因此,当x≠0x≠0​时,有

sign(x)=x|x|=|x|xsign⁡(x)=x|x|=|x|x

只要逼近符号函数 sign(x)sign⁡(x) 就能解决绝对值函数f(x)=|x|f(x)=|x|的光滑逼近问题,也就是找“softsign”函数。逼近符号函数有两种方法:

这两种思路本质上是寻找类似logistics函数来逼近符号函数 sign(x)sign⁡(x) ,我们先说数值逼近。

根据sign(x)=x|x|sign⁡(x)=x|x|最容易构造满足x=0x=0的情况为,

sign(x)=x|x|≈x√x2+ε2sign⁡(x)=x|x|≈xx2+ε2

这里ε→0ε→0​。因此有,

|x|=xsign(x)=x2√x2+ε2|x|=xsign⁡(x)=x2x2+ε2

类似的思路还有很多。注意到|x|=max(x,−x)|x|=max(x,−x)​函数可以表示为logsumexp形式,因此有,

|x|=xsign(x)=x×x|x|=x2max(x,−x)≈αx2log(e−αx+eαx)|x|=xsign⁡(x)=x×x|x|=x2max(x,−x)≈αx2log⁡(e−αx+eαx)

我们注意到σ(x)σ(x)​的形状和符合函数很像(纯几何直觉),只不过其区间在(0,1)(0,1)​​,通过变换,使其区间落到(−1,1)(−1,1)​,即

sign(x)≈tanh(μx)=2σ(2μx)−1sign⁡(x)≈tanh⁡(μx)=2σ(2μx)−1

这里引入参数μμ控制xx的饱和区间。于是有,

|x|=xtanh(μx)=x(2σ(2μx)−1)|x|=xtanh⁡(μx)=x(2σ(2μx)−1)

类似的思路还有,

|x|≈x(2(1+e−x)α−1)|x|≈x(2(1+e−x)α−1)

其中α>0α>0​。

Heaviside step函数也能构造,

|x|=xsign(x)≈x×(2H(x)−1)≈x×tanh(kx)=x×(21+e−2kx−1)|x|=xsign⁡(x)≈x×(2H(x)−1)≈x×tanh⁡(kx)=x×(21+e−2kx−1)

这里k→∞k→∞,kk取值越大逼近效果越好。

此外,考虑到softsign(x)=x1+|x|softsign⁡(x)=x1+|x|​,有

|x|=xsign(x)≈x21+|x||x|=xsign⁡(x)≈x21+|x|

于是有连分数,

|x|=xsign(x)≈x21+x21+x21+x21+x21+x21+…|x|=xsign⁡(x)≈x21+x21+x21+x21+x21+x21+…

可以改写成迭代形式,

xi+1=x21+xixi+1=x21+xi

这个形式还可以进一步推广,

f(x)=x(1+|x|k)1/kf(x)=x(1+|x|k)1/k

于是有连分数,

|x|=x(1+x(1+x(1+x(1+x(1+x(1+x(1+x(1+|x|k)1/kk)1/kk)1/kk)1/kk)1/kk)1/kk)1/kk)1/k|x|=x(1+x(1+x(1+x(1+x(1+x(1+x(1+x(1+|x|k)1/kk)1/kk)1/kk)1/kk)1/kk)1/kk)1/kk)1/k

好啦,感觉思路越来越怪异了。我们跳出来吧。

符号函数概率化逼近

还可以从概率的角度构造这个偏移量,假设这个偏移服从正态分布

erf(x)=1√π∫x−xe−t2dt=2√π∫x0e−t2dterf⁡(x)=1π∫−xxe−t2dt=2π∫0xe−t2dt

是一个像logistics函数图像一样的函数,易证erf(x√2)∈(−1,1)erf⁡(x2)∈(−1,1)​​,函数图像如下,

值得注意,标准正态分布的累积分布函数可以用erf(x)erf⁡(x)表示,

Φ(x)=1√2π∫x−∞e−t22dt=12(1+erf(x√2))Φ(x)=12π∫−∞xe−t22dt=12(1+erf⁡(x2)) |x|≈xerf(x√2)|x|≈xerf⁡(x2)

可视化对比abs函数的差异,

可以看到逼近效果很好,那么接下来的思路就是使用简单的函数近似erf(x√2)erf⁡(x2)​​​​。那么怎么推呢,这里我们直接借鉴论文Gaussian Error Linear Units (GELUs)中的结论,注意到论文中有结论,

GELU(x)=xΦ(x)=x2(1+erf(x√2))≈x2(1+tanh[√2π(x+0.044715x3)])GELU⁡(x)=xΦ(x)=x2(1+erf⁡(x2))≈x2(1+tanh⁡[2π(x+0.044715x3)]) erf(x√2)≈tanh[√2π(x+0.044715x3)]erf⁡(x2)≈tanh⁡[2π(x+0.044715x3)] |x|=xsign(x)≈xerf(x√2)≈xtanh[√2π(x+0.044715x3)]|x|=xsign⁡(x)≈xerf⁡(x2)≈xtanh⁡[2π(x+0.044715x3)]

以上推导用到正态分布的累积分布函数Φσ(x)Φσ(x)与误差函数erf(x)erf⁡(x)的关系,

Φσ(x)=∫x−∞1|σ|√πe−(x/σ)2dx=∫0−∞1|σ|√πe−(x/σ)2dx+∫x01|σ|√πe−(x/σ)2dx=12+12erf(xσ√2)Φσ(x)=∫−∞x1|σ|πe−(x/σ)2dx=∫−∞01|σ|πe−(x/σ)2dx+∫0x1|σ|πe−(x/σ)2dx=12+12erf⁡(xσ2)

以上分析了很多关于abs函数的光滑化方法,那么如何度量这些光滑后的逼近函数对abs的精确度呢?可以考虑积分形式的全局误差。这里f(x)=|x|f(x)=|x|,g(x)g(x)是前者的光滑版本,那么逼近误差有,

∫[f(x)−g(x,θ)]2dx∫[f(x)−g(x,θ)]2dx

平方误差可以改为绝对值误差,

∫|f(x)−g(x,θ)|dx∫|f(x)−g(x,θ)|dx

如果光滑函数带有参数,即g(x,θ)g(x,θ),那么有

minθ∫[f(x)−g(x,θ)]2dxminθ∫[f(x)−g(x,θ)]2dx

但是求积分本身是很困难的事情,尤其是上述涉及到复杂的函数。因此,绕过求积分,转化成求最值的优化方法更好,

minθmaxx|f(x)−g(x,θ)|minθmaxx|f(x)−g(x,θ)|

该优化的意思在|f(x)−g(x,θ)||f(x)−g(x,θ)|关于xx最大的情况下,寻找让其最小的θθ​。

实现(补充)

以上关于abs函数光滑逼近的实现对比,

这是后期补充的,具体实现见:https://github.com/allenwind/smooth-approximation-function

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

以上我们提出了很多abs函数光滑化方法,包括几何角度、对符号函数逼近以及逼近erf(x√2)erf⁡(x2)。

[1] https://en.wikipedia.org/wiki/Sign_function

[2] https://en.wikipedia.org/wiki/Sigmoid_function

[3] https://en.wikipedia.org/wiki/Heaviside_step_function

[4] https://en.wikipedia.org/wiki/Error_function

[5] https://arxiv.org/pdf/1606.08415.pdf

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK