神经网络之激活函数_Sigmoid和Tanh探索

Sigmoid是神经网络常用的激活函数,相信大家在学机器学习的时候都知道Sigmoid的值域在 ( 0,1 ) 区间,模型结果y_label值是概率值,那么今天就来谈谈别的。


Tanh(双曲正切函数)
值域:( -1,1 )
公式:
tanh = \frac{e^{(x)}-e^{(-x)}}{e^{x}+e^{(-x)}}

  • 图形看上Tanh与Sigmoid差异


    1、Sigmoid函数比Tanh函数收敛饱和速度慢
    2、Sigmoid函数比Tanh函数梯度收敛更为平滑
    3、Sigmoid函数比Tanh函数值域范围更窄

  • 具体代码细节

from scipy.special import expit, logit
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt

np.set_printoptions(precision = 2)
x = np.random.uniform(-10,10,size=(10000,10))

先随机模拟1W个10维sample,

s = x.sum(axis=1)
s = np.sort(s).reshape(-1,1)

对每个样本进行 ( ∑sample1,Σsample2,Σsample3... ) 得到1W个结果,尝试用sigmoid进行压缩

# sigmoid函数
np.set_printoptions(suppress=True)
y_sigmoid = 1/(1+np.exp(-s))

再尝试用tanh进行压缩

# tanh函数
y_tanh = (1.0 - np.exp(-2 * s)) / (1.0 + np.exp(-2 * s))

可以看到所有的结果都近似与两函数值域,图形显示

这里就会看到问题,当Sigmoid和Tanh因变量过大时,所有过大的因变量落在函数饱和区间内,函数对因变量的收敛几乎不敏感,这就是为什么在做逻辑回归的时候要对数据先做 Normalize 处理的原因,机器学习教程里很少提到这个点。

我们重新对原始数据做 Normalize 处理

min_max_scaler = preprocessing.MinMaxScaler()  
y = min_max_scaler.fit_transform(s)

由于Sigmoid和Tanh函数因变量值域为(-∞,+∞),MinMaxScaler将函数因变量压缩到(0,1),所以就形成了截断一半的曲线,两个函数分别以0.5、0为起点。

再对原始数据再进行一次转换,这次StandardScaler是以0为基准通过σ计算到基准点的距离

z_score_scaler = preprocessing.StandardScaler()  
y = z_score_scaler.fit_transform(s)

最后得出结果图,如果后续还有加权计算,需注意tanh函数结果集可能小于0,会造成加权计算错误,sigmoid则不会。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容