在深度学习中,我们会使用很多不可导函数,比如 max,argmin,所以有一个很有意思的问题就是如何构造一个可导函数是的该函数逼近上述的不可导函数。当然该问题已经被大牛讨论很多次了 12
Max
我们想要寻找到一个平滑的二元函数 f(x,y) ,它的效果近似于 max(x,y) ,足以用来代替最大值函数?在设计这样的函数时,下面这些条件需要尽可能满足:
- 函数简洁而美观
- 可以调整函数的 “ 平滑度 ”
- 可以很方便地扩展到多个变量
比如
ln(exp(x)+exp(y))
函数通过 exp 对数值进行放大,然后通过 ln 恢复原本的数值量级。同时还可以添加系数控制平滑程度。
kln(exp(k⋅x)+exp(k⋅y))
k 越大整个函数将越逼近最大值函数, k 越小函数也就变得越平滑。
有了这个函数后,很多本身不可导的函数立即有了可导的近似函数。例如,绝对值函数 abs(x) 其实可以写作 max(x,−x) ,因此可以用可导函数 ln(exp(x)+exp(−x)) 近似代替
推广到 n 维
max(x1,x2,…,xn)=K→+∞limK1log(i=1∑neKxi)
所以选定固定的 K 我们有近似
max(x1,x2,…,xn)≈K1log(i=1∑neKxi)
当然我们可以直接把 K 融合进神经网络里
max(x1,x2,…,xn)≈log(i=1∑nexi)≜logsumexp(x1,x2,…,xn)
Softmax
softmax 是 onehot(argmax(x)) 的光滑近似,即先求出最大值的 index,然后对 index 进行 onehot 编码
argmax([0.1,0.2,0.4,0.3])→[0,0,1,0]
onehot(argmax(x))≈(∑i=1nexiex1,∑i=1nexiex2,…,∑i=1nexiexn)≜softmax(x1,x2,…,xn)
Argmax
argmax 可以作为一个index序列乘以 onehot 编码所以:
sum(序向量 [1,2,…,n][1,2,3,4,5]⊗onehot (argmax(x))[0,0,0,1,0])
argmax(x)≈i=1∑ni×softmax(x)i