ReLU可能是学习深度学习的人第一个接触到的激活函数。它是一个形式非常简单的分段函数: $$ f(x) = \left\{ \begin{aligned} &0, x\leq 0 \\
&x,x>0 \end{aligned} \right. $$ 显然,ReLU不为0的部分的导数也是个分段函数: $$ f(x) = \left\{ \begin{aligned} &0, x<0 \\ &1,x>0 \end{aligned} \right. $$ 它的导数在大于0时为1,足够简单;在小于0时为0,可以增加参数的稀疏性,提高运算速度。这种优秀的特性使ReLU在深度学习中的被广泛地用作激活函数。在深度学习的基石之一反向传播算法中,对每个神经元进行求导是必不可少的步骤,但是只要有高中数学知识的人就可以看出来,大名鼎鼎的ReLU函数在 \(x=0\) 处是不可导的!

诚然,在工程实践中,一般直接取\(f’(0)=0\),但是我们不仅要知其然还要知其所以然,取为0在数学上说的通吗?首先说答案:说的通。要解释这个问题,就要谈到凸分析中的一个概念:次导数。对于可导凸函数(注意凸分析中的凸函数和高数中学的凸函数有些微的区别,不知道的小可爱可以查一下),有这样一个不等式: $$ f(x) \geq f(x_0) + \nabla f(x_0) (x-x_0) $$ 画个图就很好理解了:

convex_ineq
观察右侧其实可以发现,右侧就是\(f(x)\)在\(x_0\)处的一阶泰勒展开(不考虑余项的话)。将这个不等式推广到不可导凸函数,就得到了次导数的概念:对于定义域上的任意\(x\),如果\(g\)满足: $$ f(x) \geq f(x_0) + g (x-x_0) $$ 那么就称\(g\)为\(f(x)\)的次导数。和前一个式子对比可以明白,在可导的点上,次导数就是导数。如果从极限的角度来定义次导数,次导数是一个数集,该数集的上下限为其导函数在该点处的左极限和右极限,即\(\{g|g \in [a,b]\}\),其中(假设左极限小于右极限)

$$ a = \lim_{x \rightarrow x_0^-} f’(x) $$

$$ b = \lim_{x \rightarrow x_0^+} f’(x) $$

将这一概念推广到多元函数,\(g\)就称为次梯度。为了更好的理解次梯度的概念,我们可以构想如下这样一个图景。对于可微凸函数,一点处的梯度可以理解为一个支撑超平面,这个超平面与函数相切于该点;而对于不可微凸函数,在不可微点处就找不到这样一个切面。为了将这个不完美补全,数学家提出,一点处的梯度不一定非得是一个,可以有很多个嘛(好吧这句话其实是我脑补的)!既然找不到切面,那我们就找一簇超平面,只要这些超平面和函数只相交于该点且不会“穿过”函数就可以了,这一簇超平面就作为函数在这一点的梯度,不过为了和原本的梯度概念不混淆,就叫它次梯度吧!怎么找这一簇超平面呢?从函数的外侧(把凸函数想象成一个碗的话,那外侧就是碗的外面啦)用一个超平面去接近该点,要求二者只相交于该点,然后转动这个平面,只要这个平面不穿到“碗”里面,就可以归入簇中。

搞懂了次导数的概念,那就来算一算ReLU的次导数是多少吧。用上面的极限定义可以知道ReLU的次导数是\([0,1]\),也就是取0到1的任何数都可以,当然取0也可以。结案!

最后推荐一下参考资料里写的这门课程,想深入学习一下凸优化理论的可以去看一看,b站就有视频课程。我当时凸优化考试就是靠着它才最后考过的(所以平时要认真听课啊╮( ̄▽ ̄)╭)。

参考资料

Prof. S. Boyd, EE392o, Stanford University