简介
最近我发现几乎在每一个 neural network architecture 中,它们 fc 层后面都会跟着一个 ReLU 层,但是我一直不知道为什么要加一个 ReLU。只记得 CS231n 里面说过 in practice,每个 fc 层后面都会加一个 ReLU 层,今天我就抽空好好地研究了一下其中的原理。
整个文章分两部分: 1. 为什么要使用 activation function? 2. 为什么要使用 ReLU?
为什么要使用 activation function?
想要说明这一点,可以通过比较含有 activation function 的架构和不含有 activation function 的架构来搞明白。
不含有 activation function 的架构
假设我们有一个网络的架构是这样子的:
1 | input --> fc1 --> fc2 --> output |
假设输入是一个参数 x
,通过 fc1
我们学习到的多项式是 \(y=2x+1\),通过fc2
,我们学习到的多项式是 \(y=3x+4\)。但是将这两个式子合并,我们很容易得到 \(y=3(2x+1)+4=6x+7\)。而这个式子,通过一层网络就能学习到。而我们却用了两层,这两层相当于一个大的层。这是使用 activation function 的原因之一,如果不使用,所有连在一起的 fc 可能会变成同一层。
第二点从现实角度出发,我们试图使用一个多项式来代表某项事物运行的规律。而现实生活中的事务不可能都符合线性的规律,所以我们要在多项式中加入一些非线性的元素(nonlinearity),activation function 都是非线性的。
含有 activation function 的架构
假设我们有一个网络的架构是这样子的:
1 | input --> fc1 --> activation function --> fc2 --> output |
假设我们选择的 activation function 是 Sigmoid function。在实践中很尴尬的一点就是他的导数大部分的时候都小于1,再应用了链式法则以后,梯度会越来越小越来越小,最后几乎没有了。所以部分函数并不适合作为 activation function。我们希望的是一个不会使得梯度消失的激活函数,所以大家就都开始使用 ReLU,从他的定义能够看出,他对于梯度几乎没有影响:f(x)=max(0,x)
。
总结
借用cs231n里面说过的一句话,在每一个 fc 后面都加一个 ReLU 吧!