对于一个学校项目,我需要评估一个不同学习率的神经网络。我选择了sklearn
来实现神经网络(使用MLPRegressor
类)。由于训练数据非常小(20个实例、2个输入和1个输出),所以我决定使用lbfgs
求解器,因为像sgd
和adam
这样的随机求解器对这种大小的数据没有意义。
该项目要求测试不同学习率的神经网络。但是,根据文档,lbfgs
解决程序是不可能的:
learning_rate_init双倍,default=0.001初始学习率使用。它在更新权重时控制步长。只有当求解者=‘sgd’或‘adam’时才使用。
有什么方法可以让我以某种方式访问lbfgs
解算器的学习速度并对其进行修改,或者这个问题甚至没有意义?
发布于 2020-04-06 12:03:33
LBFGS是一种不使用学习速率的优化算法。为了你的学校项目,你应该使用sgd或adam。至于它是否更有意义,我要说的是,在20个数据点上训练一个神经网络是没有什么意义的,除了学习基础知识。
LBFGS是一种拟牛顿优化方法.它是基于这样的假设,即你寻求优化的函数可以用二阶泰勒展开来局部逼近。大致如下:
与牛顿法的不同之处在于拟牛顿法对Jacobian矩阵和/或Hessian矩阵采用近似。
牛顿法和拟牛顿法要求函数比梯度下降更平滑,但收敛速度更快。实际上,用Hessian矩阵计算下降步长是更有效的,因为它可以预测到局部最优的距离,因此不会在它周围振荡或收敛非常慢。另一方面,梯度下降只使用雅可比矩阵(一阶导数)计算最陡下降方向,并以学习速率作为下降步长。
实际上,梯度下降用于深度学习,因为计算Hessian矩阵太昂贵。
在这里,讨论牛顿方法(或准牛顿法)的学习速度是没有意义的,它只是不适用。
发布于 2020-04-01 18:39:21
不是一个完整的答案,但希望是一个很好的指针。
network.MLPRegressor是在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
},
代码位于_multilayer_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)
https://stackoverflow.com/questions/60902315
复制相似问题