Activation Function:
线性转非线性
- sigmoid: sigmoid = 1 / (1 + e^(-x))
- 缺点:
- 容易出现梯度消失 gradient vanishing
- 缺点:
-
-
- 函数输出并不是zero-centered
- 幂运算相对来讲比较耗时
-
- tanh函数:
tanh x = ( e^x - e^(-x) ) / (e^x + e^(-x))
解决了zero-centered 问题,gradient vanishing和耗时问题依然存在
- RELU:线性整流函数 RELU = max(0, x )
- 优点
- 解决了gradient vanishing问题 (在正区间)
- 优点
-
-
- 计算速度非常快,只需要判断输入是否大于0
- 收敛速度远快于sigmoid和tanh
-
- GELU:基于RELU的一种改进和平滑 GAUSSIAN ERROR LINEAR UNITS
- 原始论文介绍:https://arxiv.org/abs/1606.08415
- 计算:
def gelu(input_tensor):
cdf = 0.5 * (1.0 + tf.erf(input_tensor / tf.sqrt(2.0)))
return input_tensor * cdf
激活函数的作用:给网络模型加入非线性因子,这个非线性因子的实际操作就是在wx+b这样的线下变化后面加入一个非线性变化的函数fun。
Gelu的操作方式:Gelu怎么完成非线性变换的呢?引入这样的变化函数:
公式中x是自己,P(X<=x)决定x中有多少信息保留 ,并且由于P是服从高斯分布的,也就满足了非线性的特征,并且更加符合数据的分布预期。
相比Relu:Relu将小于0的数据映射到0,将大于0的给与 等于 映射操作,虽然性能比sigmoid好,但是缺乏数据的统计特性,而Gelu则在relu的基础上加入了统计的特性。论文中提到在好几个深度学习任务中都优于Relu的效果。