谷歌大脑的-Swish-激活函数与-ReLU-激活函数对比

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


最近谷歌大脑公布了一个新的激活函数,叫做 Swish 激活函数。这个函数非常的有趣,很多人都把它应用到一些小的神经网络和大的神经网络中去测试它的性能。所以,我也打算去 kaggle 上面测试一些这个函数的性能如何。

Swish 激活函数的数学公式非常的简单,即 f(x) = x * sigmoid(x) 。根据谷歌大脑的论文,该激活函数的性能比 ReLU 激活函数的性能要好很多。

谷歌大脑的-Swish-激活函数与-ReLU-激活函数对比_第1张图片

我利用 Keras 实现的 ReLU 模型,在 kaggle 上面获得的分数是 0.99457。我保持所有的模型参数不变,只是把原来模型中的 ReLU 激活函数修改为 Swish 激活函数,该模型的正确率就可以达到 0.99671 。

编写 Swish 激活函数

在 keras 中还没有实现 Swith 激活函数。所以我们第一步就是需要去实现这个激活函数。下面的 3 行代码就可以实现这个功能:

from keras import backend as K
from keras.layers import Activationfrom 
keras.utils.generic_utils import get_custom_objects
def swish(x):
    return (K.sigmoid(x) * x)
get_custom_objects().update({'swish': Activation(swish )})

现在我们只需要将 Swish 激活函数添加到模型就行了。

model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = ‘Same’, 
 activation =’swish’, input_shape = (28,28,1)))

但我们的最后一层还是采用原来的 sigmoid 激活函数。

精度比较

在正确率方面,我发现 Swish 激活函数的性能比 ReLU 激活函数好一点,在 kaggle 上面的排名大约可以排到 90 名。

谷歌大脑的-Swish-激活函数与-ReLU-激活函数对比_第2张图片

时间比较

在我的 Geforce 940mx 上面,ReLU 激活函数比 Swish 激活函数快 10 秒左右。我知道可能 Swish 激活函数在计算 sigmoid 函数的时候比 ReLU 多浪费了 10 秒。

谷歌大脑的-Swish-激活函数与-ReLU-激活函数对比_第3张图片

总结

在 kaggle 上面提交之后,我们的正确率只是多了 0.002 左右,排名大约在 90 名。但是我们每运行一个 epoch ,在 GPU 上面需要多花费 20% - 30% 的时间。刚刚我们使用的是最原始的 Swish 版本,还有另外一个版本,即 Swish_beta (f(x) = 2x*sigmoid(beta*x)) 。我希望这个激活函数比最原始的激活函数可以更加的高效。

参考资料

kaggle 代码,请点击这里。
GitHub 代码,请点击这里。
Swish 原始论文,请点击这里。

如果你发现了任何的问题,或者有什么好的想法,请与我联系。


来源:Medium

你可能感兴趣的:(人工智能)