首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >滑雪板中用于lbfgs求解器的MLPRegressor learning_rate_init

滑雪板中用于lbfgs求解器的MLPRegressor learning_rate_init
EN

Stack Overflow用户
提问于 2020-03-28 14:58:56
回答 2查看 2.4K关注 0票数 1

对于一个学校项目,我需要评估一个不同学习率的神经网络。我选择了sklearn来实现神经网络(使用MLPRegressor类)。由于训练数据非常小(20个实例、2个输入和1个输出),所以我决定使用lbfgs求解器,因为像sgdadam这样的随机求解器对这种大小的数据没有意义。

该项目要求测试不同学习率的神经网络。但是,根据文档,lbfgs解决程序是不可能的:

learning_rate_init双倍,default=0.001初始学习率使用。它在更新权重时控制步长。只有当求解者=‘sgd’或‘adam’时才使用。

有什么方法可以让我以某种方式访问lbfgs解算器的学习速度并对其进行修改,或者这个问题甚至没有意义?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-06 12:03:33

LBFGS是一种不使用学习速率的优化算法。为了你的学校项目,你应该使用sgd或adam。至于它是否更有意义,我要说的是,在20个数据点上训练一个神经网络是没有什么意义的,除了学习基础知识。

LBFGS是一种拟牛顿优化方法.它是基于这样的假设,即你寻求优化的函数可以用二阶泰勒展开来局部逼近。大致如下:

  • 从最初的猜测开始
  • 用雅可比矩阵计算最陡下降方向
  • 使用Hessian矩阵计算下降步骤并到达下一个点
  • 重复直到收敛

与牛顿法的不同之处在于拟牛顿法对Jacobian矩阵和/或Hessian矩阵采用近似。

牛顿法和拟牛顿法要求函数比梯度下降更平滑,但收敛速度更快。实际上,用Hessian矩阵计算下降步长是更有效的,因为它可以预测到局部最优的距离,因此不会在它周围振荡或收敛非常慢。另一方面,梯度下降只使用雅可比矩阵(一阶导数)计算最陡下降方向,并以学习速率作为下降步长

实际上,梯度下降用于深度学习,因为计算Hessian矩阵太昂贵。

在这里,讨论牛顿方法(或准牛顿法)的学习速度是没有意义的,它只是不适用。

票数 4
EN

Stack Overflow用户

发布于 2020-04-01 18:39:21

不是一个完整的答案,但希望是一个很好的指针。

network.MLPRegressor是在github上实现的感知器模块。

通过检查模块,我注意到与其他求解器不同,scitkit在基类本身中实现了lbfgs算法。所以你可以很容易地适应它。

它们似乎不使用任何学习速率,因此您可以修改此代码,并将损失乘以要测试的学习速率。我只是不完全确定在lbfgs的上下文中添加一个学习速率是否有意义。

我相信如果在这里使用的话损失:

代码语言:javascript
运行
复制
        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行。

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60902315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档