oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第1张图片

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

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第2张图片

Tanh(双曲正切函数)

值域:( -1,1 )

公式:

718520613781df233a1c584f8813e785.png

图形看上Tanh与Sigmoid差异

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第3张图片

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

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第4张图片

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

s = x.sum(axis=1)
s = np.sort(s).reshape(-1,1)
# sigmoid函数
np.set_printoptions(suppress=True)
y_sigmoid = 1/(1+np.exp(-s))

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第5张图片

再尝试用tanh进行压缩

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

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第6张图片

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

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第7张图片

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

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

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

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第8张图片

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

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第9张图片

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

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

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第10张图片

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

oracle max函数速度慢_神经网络之激活函数_Sigmoid和Tanh探索_第11张图片

你可能感兴趣的:(oracle,max函数速度慢,reshape函数,sigmoid函数)