学过机器学习的都知道,激活函数很重要,没有它们就只有线性神经网路(效果堪忧)。并且它们还决定了训练的精准度和速度。这主要是应为在做backpropagation的时候,决定一个神经网络中的hidden layer里的一个神经元的weight和bias改怎么调需要激活函数的导数。
现在市面上主要的激活函数大概是这些:
1. Sigmoid
2. Tanh
3. ReLU
4. Leaky ReLU
5. ELU
6. SELU
7. SiLU
8. swish
9. mish
1. Sigmoid:
2. Tanh.
3. ReLU
有点不好搞,因为大部分的函数是这样的:
这虽然是个函数,但是我想自己想办法解决。
我们可以看到当x<=0的时候,x和|x|会相互抵消,所以会变成0。但是当x>0的时候,x和|x|会得到2x,所以要÷2。
4. Leaky ReLU
Leaky ReLU比ReLU更好,应为它可以解决ReLU的一个问题:神经元死亡问题(可以上网查,我在这里就不细讲了)。
现在,我需要用另一种方式。
首先,我需要找到一个公式,当x<0的时候,函数输出0,否则输出1。
OK,我也是直接找到这个公式好吧。
这个公式来源于之前的公式:。
ReLU的公式在x<=0的时候,输出0,但是当x>0的时候输出x。
而我们这个公式把输出除以x,所以就能得到1。
Leaky ReLU的大部分函数是这样的,alpha的值一般在0.01。
而我自己的函数是这样的。
这个函数是一个从两个函数的出来的:
而这两个函数又可以被分解为:
会在x<0的情况下输出0,在x>=0的时候输出1。
所以大家理解一会就会懂了。
5. ELU
开始有一点复杂了。
一般alpha=1。
我们能推算出ELU的公式:
简化一下
我来解释一下:
设
首先,我们想要在x>0的时候用y=x这个方程, 并且,在x<=0的时候用,所以,我们要把D(x)乘以x,然后把它加到D(-x)乘以。比如说,如果x>0,D(x)就会输出1,而D(-x)会输出零。所以整个算式就变成:
所以x>0的时候就会得到x。
但是如果x<=0,就会变成:
所以就会得到。
6. SELU
SELU和ELU差不多。
其实就是ELU前面乘了一个数,并且alpha被设为了一个特定的数。这两个数使用证明得出来的。
7. SiLU
SiLU的公式很简单:
熟悉激活函数的肯定一眼就能看出来SiLU就是x*sigmoid(x)。
8. swish
谷歌搞出来的。
公式为:
相信很多人一眼就看出来swish就是。
9. mish
SiLU的姐妹函数。
公式为:
最后,所有的公式都放到这个链接里面了。
致谢: