![](https://img.haomeiwen.com/i4193879/4b877154cce524de.jpg)
Sigmoid是神经网络常用的激活函数,相信大家在学机器学习的时候都知道Sigmoid的值域在 ( 0,1 ) 区间,模型结果y_label值是概率值,那么今天就来谈谈别的。
![](https://img.haomeiwen.com/i4193879/b3ed6f1c85cecdea.png)
Tanh(双曲正切函数)
值域:( -1,1 )
公式:
-
图形看上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,
![](https://img.haomeiwen.com/i4193879/62212712599c40d6.png)
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))
![](https://img.haomeiwen.com/i4193879/3c5f2b2d6ab54207.png)
再尝试用tanh进行压缩
# tanh函数
y_tanh = (1.0 - np.exp(-2 * s)) / (1.0 + np.exp(-2 * s))
![](https://img.haomeiwen.com/i4193879/555fbcaabcf716d8.png)
可以看到所有的结果都近似与两函数值域,图形显示
![](https://img.haomeiwen.com/i4193879/59ea85a9f68cfb48.png)
这里就会看到问题,当Sigmoid和Tanh因变量过大时,所有过大的因变量落在函数饱和区间内,函数对因变量的收敛几乎不敏感,这就是为什么在做逻辑回归的时候要对数据先做 Normalize 处理的原因,机器学习教程里很少提到这个点。
我们重新对原始数据做 Normalize 处理
min_max_scaler = preprocessing.MinMaxScaler()
y = min_max_scaler.fit_transform(s)
![](https://img.haomeiwen.com/i4193879/c34dbd50b5227bcf.png)
由于Sigmoid和Tanh函数因变量值域为(-∞,+∞),MinMaxScaler将函数因变量压缩到(0,1),所以就形成了截断一半的曲线,两个函数分别以0.5、0为起点。
![](https://img.haomeiwen.com/i4193879/4f6d08f44eeead85.png)
再对原始数据再进行一次转换,这次StandardScaler是以0为基准通过σ计算到基准点的距离
z_score_scaler = preprocessing.StandardScaler()
y = z_score_scaler.fit_transform(s)
![](https://img.haomeiwen.com/i4193879/b77635fb38892768.png)
最后得出结果图,如果后续还有加权计算,需注意tanh函数结果集可能小于0,会造成加权计算错误,sigmoid则不会。
![](https://img.haomeiwen.com/i4193879/552491cd3b15e438.png)
网友评论