Python sklearn中lbfgs解算器的MLPrePressor learning_rate_init
对于学校项目,我需要评估具有不同学习率的神经网络。我选择了Python sklearn中lbfgs解算器的MLPrePressor learning_rate_init,python,scikit-learn,neural-network,Python,Scikit Learn,Neural Network,对于学校项目,我需要评估具有不同学习率的神经网络。我选择了sklearn来实现神经网络(使用mlprepressor类)。由于训练数据非常小(20个实例,每个实例2个输入和1个输出),我决定使用lbfgs解算器,因为像sgd和adam这样的随机解算器对于这种大小的数据没有意义 该项目要求以不同的学习率测试神经网络。但是,根据以下文档,使用lbfgs解算器是不可能的: 学习率\u初始值双倍,默认值=0.001 使用的初始学习速率。它控制更新权重时的步长。仅当解算器='sgd'或'adam'时使用
sklearn
来实现神经网络(使用mlprepressor
类)。由于训练数据非常小(20个实例,每个实例2个输入和1个输出),我决定使用lbfgs
解算器,因为像sgd
和adam
这样的随机解算器对于这种大小的数据没有意义
该项目要求以不同的学习率测试神经网络。但是,根据以下文档,使用lbfgs
解算器是不可能的:
学习率\u初始值双倍,默认值=0.001
使用的初始学习速率。它控制更新权重时的步长。仅当解算器='sgd'或'adam'时使用
有没有一种方法可以让我以某种方式访问
lbfgs
解算器的学习率并对其进行修改,或者这个问题根本没有意义?不是一个完整的答案,但希望是一个好的指针
该模块在github上实现
通过检查模块,我注意到与其他解算器不同,scitkit在基类本身中实现了lbfgs算法。所以你可以很容易地适应它
他们似乎不使用任何学习率,因此您可以修改此代码,并将损失乘以您想要测试的学习率。我只是不完全确定在lbfgs环境下增加学习率是否有意义
我相信如果在这里使用,损失是:
opt_res = scipy.optimize.minimize(
self._loss_grad_lbfgs, packed_coef_inter,
method="L-BFGS-B", jac=True,
options={
"maxfun": self.max_fun,
"maxiter": self.max_iter,
"iprint": iprint,
"gtol": self.tol
},
代码位于_多层_perceptron.py模块的第430行
def _fit_lbfgs(self, X, y, activations, deltas, coef_grads,
intercept_grads, layer_units):
# Store meta information for the parameters
self._coef_indptr = []
self._intercept_indptr = []
start = 0
# Save sizes and indices of coefficients for faster unpacking
for i in range(self.n_layers_ - 1):
n_fan_in, n_fan_out = layer_units[i], layer_units[i + 1]
end = start + (n_fan_in * n_fan_out)
self._coef_indptr.append((start, end, (n_fan_in, n_fan_out)))
start = end
# Save sizes and indices of intercepts for faster unpacking
for i in range(self.n_layers_ - 1):
end = start + layer_units[i + 1]
self._intercept_indptr.append((start, end))
start = end
# Run LBFGS
packed_coef_inter = _pack(self.coefs_,
self.intercepts_)
if self.verbose is True or self.verbose >= 1:
iprint = 1
else:
iprint = -1
opt_res = scipy.optimize.minimize(
self._loss_grad_lbfgs, packed_coef_inter,
method="L-BFGS-B", jac=True,
options={
"maxfun": self.max_fun,
"maxiter": self.max_iter,
"iprint": iprint,
"gtol": self.tol
},
args=(X, y, activations, deltas, coef_grads, intercept_grads))
self.n_iter_ = _check_optimize_result("lbfgs", opt_res, self.max_iter)
self.loss_ = opt_res.fun
self._unpack(opt_res.x)
LBFGS是一种优化算法,它不使用学习率。在学校项目中,你应该使用sgd或adam。关于它是否更有意义,我想说的是,在20个数据点上训练一个神经网络,除了学习基础知识之外,没有什么意义 LBFGS是一种拟牛顿优化方法。它基于这样一个假设,即您寻求优化的函数可以通过二阶泰勒展开局部近似。大致如下:
- 从最初的猜测开始
- 使用雅可比矩阵计算最陡下降方向
- 使用Hessian矩阵计算下降步长,并到达下一点
- 重复,直到收敛
在这里,谈论牛顿方法(或准牛顿方法)的学习率是没有意义的,它只是不适用。如果只是为了学校项目,就选择随机梯度下降,为什么要使用lbfgs?对于20个训练数据条目,随机似乎是一个糟糕的选择。如果没有其他选择,我会这么做,但这似乎有点违背了练习的目的。如果可能的话,我肯定会用这20个例子来增加数据。@alan.elkin你介意详细说明吗?@gphilip,你的人际网络将倾向于记住你的训练例子,可能无法推广到新的看不见的例子。我不知道您的培训示例是什么,但如果您能以某种方式从真实示例中创建新的合成示例(并且不丢失您试图从输入中提取的内容的核心),它可能会帮助您的网络更好地概括。搜索“数据增强”以获取更多细节。在使用LGBFS时,谈论学习率是没有意义的,因为下降步长是由算法本身计算的。调整它将打破算法收敛的理论保证,并使其效率低下。谢谢!这就把它清理干净了,大部分都在我头上。