【问题标题】:Scikit-learn MLPRegressor - How to get results independent from random seed?Scikit-learn MLPRegressor - 如何获得独立于随机种子的结果?
【发布时间】:2018-10-16 00:11:27
【问题描述】:

我尝试通过使用 MLP 来学习一些正弦函数。不幸的是,结果很大程度上取决于随机种子。 如何调整 MLPRegressor,以减少结果对随机种子的依赖?

代码:

import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.neural_network import MLPRegressor

LOOK_BACK = 10

x = np.linspace(-10,10,1000)
y = np.sin(x)

dataX,dataY = [],[]
for i in range(len(y)-LOOK_BACK-1):
        dataX.append(y[i:(i+LOOK_BACK)])
        dataY.append(y[i+LOOK_BACK])
x_train = np.array(dataX)
y_train = np.array(dataY)


for i in range(10):
        print "np.random.seed(%d)"%(i)
        np.random.seed(i)
        model = MLPRegressor(activation='tanh',solver='adam')
        model.fit(x_train,y_train)
        train_predict = model.predict(x_train)
        print 'MSE train:', mean_squared_error(train_predict,y_train)

输出:

np.random.seed(0)
MSE train: 0.00167560534562
np.random.seed(1)
MSE train: 0.0050531872206
np.random.seed(2)
MSE train: 0.00279393534973
np.random.seed(3)
MSE train: 0.00224293537385
np.random.seed(4)
MSE train: 0.00154350859516
np.random.seed(5)
MSE train: 0.00383997358155
np.random.seed(6)
MSE train: 0.0265389606087
np.random.seed(7)
MSE train: 0.00195637404624
np.random.seed(8)
MSE train: 0.000590823529864
np.random.seed(9)
MSE train: 0.00393172460516

种子 6,9 和 8 产生不同阶的 MSE。我怎样才能防止这种情况发生?

【问题讨论】:

  • 试试这个:MLPRegressor(activation='tanh',solver='adam', random_state=0)
  • @MaxU 这个好像和设置np.random.seed(0)一样。但是 MLPRegressor 仍然过多地依赖于随机状态。
  • 当然可以——它使用随机值进行初始化(权重)。你的目标是什么?如果您想要可预测且稳定的结果,请使用random_state
  • @MaxU 我的目标是拥有一个独立于大多数随机初始化的 MLP。我认为 MSE 应该更多地依赖于迭代或其他超参数,而不是随机状态。这是错的吗?
  • 不幸的是,反向传播算法容易受到局部最小值的影响,并且依赖于良好的初始化。有两种解决方法:(1)用不同的初始权重训练同一个网络多次,保留在测试集上表现最好的网络(2)对于较小的网络,您可以使用粒子群优化来优化权重。 PSO 提供了一个接近全局的最优解,对目标函数的性质不太敏感,并且在良好的初始解上不太可靠。

标签: scikit-learn neural-network


【解决方案1】:

多层的Perceptron以及其他神经网络架构遭受其对应损耗函数具有许多本地Optima的事实。因此,所有梯度算法都严重依赖于选择的初始化。而不是将此视为不希望的,您可以将初始化(通过randure_state确定)视为为您提供灵活性的额外的覆盖率。

只是为了记录,你的MSE的差异并不是那么大,如果你的目标是完全过度装备,那么将正则化参数alpha更改为零(默认值是alpha = 0.0001)

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 2014-09-10
    • 2018-03-12
    • 2015-05-16
    • 2017-04-06
    • 2016-07-17
    • 2018-03-18
    • 2016-04-09
    相关资源
    最近更新 更多