参考:https://blog.csdn.net/tyhj_sf/article/details/79932893
参考:https://zhuanlan.zhihu.com/p/25631496
参考:https://zhuanlan.zhihu.com/p/73214810
为什么用激活函数?
神经网络的每一层由一个线性函数和非线性函数构成,这样可以提升每一层的拟合能力,激活函数就是充当非线性层。
选择激活函数需要考虑什么因素?
激活函数输入输出的映射是如何的 将什么区间映射到什么区间,比如sigmoid函数将正负无穷空间映射到0-1空间,而tanh函数将其映射到-1和1之内,relu函数映射到0到正无穷。
激活函数的导数有什么特性 因为激活函数的导数会引出一个梯度消失和梯度爆炸的问题。
梯度消失和梯度爆炸
神经网络参数更新规则中,要通过链式法则计算导数:
可以看出导数的计算包含了每一层的线性函数的W和非线性函数(激活函数)导数,当激活函数的导数一直处于一个小于1接近与0的值的时候,这个导数计算出来就非常接近与0,就导致参数更新缓慢甚至不更新。反之,如果每一层计算导数过大,就会导致神经网络参数更新幅度多大,网络训练不稳定。
部分激活函数介绍
sigmoid函数
tanh函数
relu函数
个人总结实践
对于使用激活函数,首先考虑自己的场景,要考虑自己的输入输出映射区间,同时考虑构建起来的网络参数的梯度情况。
一下是对于同一个问题三种激活函数训练出来的损失函数曲线:
sigmoid函数:
tanh函数
relu函数:
leaky_relu函数:
关于批量归一化
从前面的激活函数可以看出,sigmoid函数和tanh函数对输入的响应区间都比较狭窄,批量归一化的操作就是将数据映射到均值为0的附近的区域,利用了正太分布的一点知识。批量归一化的好处就是将数据映射到响应区间了,但是坏处就是可能改变了数据原始样貌。
可以看出激活函数对神经网络拟合能力的影响还是巨大的,但是稳定的激活函数不一定预测效果就好,比如relu不如tanh稳定,但是预测效果更好