《Python大规模机器学习》 —2.3.4定义SGD学习参数
2.3.4定义SGD学习参数
若要在Scikit-learn中定义SGD参数,无论是分类问题还是回归问题(对SGDClassfier和SGDRegressor都有效),当不能同时评估所有数据时,我们必须清楚如何处理正确学习所需的某些重要参数。
第一个参数n_iter定义了数据迭代次数,初始值设置为5,并根据经验对其调整。对于学习器来说,给定其他默认参数的情况下可看到大约10^6个示例,因此,将其设置为n_iter=np.ceil(10**6/n)不失为一个好方法,其中n为实例数目。值得注意的是,n_iter只对内存中的数据集起作用,所以只有进行拟合操作时才起作用,但不适合partial_fit。实际上,partial_fit会迭代相同数据,就像在你的程序中重新传输数据一样,正确的重新传输流的迭代次数需要通过在学习过程本身中进行测试才能得到,并受数据类型的影响。下一章将讨论超参数优化和正确的传递次数。
小批量学习时,很有必要在每次传递完所有数据后重新调整数据。
如果要打乱数据就会用到shuffle参数。它用于内存小批量处理,不适于非核心数据排序。它也用于partial_fit,但效果不明显。如前所述,在以块形式传递的数据时,常把其设置为True,这样能打乱非核心数据。
warm_start是拟合时用到的另一个参数,因为它会记住以前的拟合系数(不管学习率是否已被动态修改)。如果使用partial_fit,该算法将记住以前的学习系数和学习率表的状态。
average参数表示一个计算技巧,某些情况下,开始用旧系数平均新系数会使收敛速度更快。可以将其设置为True或某个整数值,以指明将从哪个实例开始平均。
最后是learning_rate及其相关参数eta0和power_t。learning_rate参数表示每个被观察实例对优化过程的影响程度。当从理论角度解释SGD时,就是恒定速率学习,可以通过设置learning_rate='constant'来复制它。
另外还有其他选项让η(Scikit-learn中称为学习率,在时间t定义)逐渐减少。在分类中,所提出的解决方法为learning_rate='optimal',具体计算如下式所示:
这里,t为时间步长,由实例数量乘以迭代数,t0是启发式选择值,需要根据Léon Bottou的研究成果进行选择,他对SGD Scikit-learn实现有很大影响(http://leon.bottou. org/projects/sgd)。这种学习策略的明显优势在于学习随着更多实例出现而减少,从而避免由于给出异常值使优化发生突然扰动。显然,这个策略也是现成可用的,也意味着可以直接使用。
在回归中,下面的公式给出了建议的学习退化,它与learning_rate='invscaling'对应:
这里eta0和power_t为通过优化搜索来优化的超参数(其初始值设置为0和0.5)。值得注意的是,如果使用invscaling学习率,SGD将以低于最优学习率的更低学习率开始,其学习适应能力更强,学习率下降更慢。
- 点赞
- 收藏
- 关注作者
评论(0)