谷歌大脑的 Swish 激活函数与 ReLU 激活函数对比
作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai
简书地址:http://www.jianshu.com/p/95e3...
最近谷歌大脑公布了一个新的激活函数,叫做 Swish 激活函数。这个函数非常的有趣,很多人都把它应用到一些小的神经网络和大的神经网络中去测试它的性能。所以,我也打算去 kaggle 上面测试一些这个函数的性能如何。
Swish 激活函数的数学公式非常的简单,即 f(x) = x * sigmoid(x) 。根据谷歌大脑的论文,该激活函数的性能比 ReLU 激活函数的性能要好很多。
我利用 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 名。
时间比较
在我的 Geforce 940mx 上面,ReLU 激活函数比 Swish 激活函数快 10 秒左右。我知道可能 Swish 激活函数在计算 sigmoid 函数的时候比 ReLU 多浪费了 10 秒。
总结
在 kaggle 上面提交之后,我们的正确率只是多了 0.002 左右,排名大约在 90 名。但是我们每运行一个 epoch ,在 GPU 上面需要多花费 20% - 30% 的时间。刚刚我们使用的是最原始的 Swish 版本,还有另外一个版本,即 Swish_beta (f(x) = 2xsigmoid(betax)) 。我希望这个激活函数比最原始的激活函数可以更加的高效。
参考资料
kaggle 代码,请点击这里。
GitHub 代码,请点击这里。
Swish 原始论文,请点击这里。
如果你发现了任何的问题,或者有什么好的想法,请与我联系。
作者:chen_h
微信号 & QQ:862251340
简书地址:http://www.jianshu.com/p/95e3...
CoderPai 是一个专注于算法实战的平台,从基础的算法到人工智能算法都有设计。如果你对算法实战感兴趣,请快快关注我们吧。加入AI实战微信群,AI实战QQ群,ACM算法微信群,ACM算法QQ群。长按或者扫描如下二维码,关注 “CoderPai” 微信号(coderpai)