调整渐变下降的学习率
在大多数监督性机器学习问题中,我们需要定义一个模型并基于训练数据集预估其参数。计算这些参数的广泛且容易使用的一个技术是通过梯度下降来最小化模型的误差。梯度下降通过在每个步骤最小化成本函数来在许多迭代中估计模型的权重。
梯度下降算法
以下是算法:
Repeat until convergence {
Wj = Wj - λ θF(Wj)/θWj
}
其中Wj是我们的一个参数(或者一个带有参数的向量),F是我们的代价函数(估计我们模型的误差),θF(Wj)/θWj是它对Wj的一阶导数,λ是学习率。
如果我们的F是单调的,那么这个方法将在多次迭代之后给出我们对使成本函数最小化的Wj权重的估计。注意,如果导数不是单调的,我们可能被困在本地的最小值。在这种情况下,一个简单的方法来检测这是通过重复不同的初始Wj值的过程,并比较新的估计参数的成本函数的值。
梯度下降并不总是计算权重的最佳方法,但它是一种相对快速简单的方法。如果您想了解更多关于梯度下降的信息,请查看吴恩达的斯坦福大学机器学习课程的笔记。
调整学习率
为了使梯度下降起作用,我们必须将λ(学习率)设置为适当的值。这个参数决定了我们朝着最佳权重移动的速度有多快。如果λ非常大,我们将跳过最优解。如果它太小,我们将需要大量的迭代来收敛到最佳值。所以使用合适的λ是至关重要的。
根据不同的数据集大小调整学习率的值
根据将要选择的成本函数F,我们可能会遇到不同的问题。当选择平方和误差作为我们的成本函数时,随着训练集的增大,θF(Wj)/θWj的值越来越大。因此λ必须适应明显较小的值。
解决这个问题的一种方法是用1 / N来划分λ,其中N是训练数据的大小。所以算法的更新步骤可以改写为:
Wj = Wj - (λ/N)*θF(Wj)/θWj
你可以从Wilson等人的论文“ 梯度下降学习的批量训练的一般低效率 ”中获得更多信息。
最后,解决这个问题的另一种方法是选择一个不受我们使用的训练样本数量影响的成本函数,如均方误差。
在每次迭代中调整学习率
另一个好的方法是在每次迭代中调整λ的值。这背后的想法是,离最佳值越远,向最佳值移动的速度越快,因此λ的值应该更大。越接近解决方案,其值越小。不幸的是,由于你不知道实际的最佳值,你也不知道你在每一步中离他们有多近。
为了解决这个问题,可以通过在每次迭代结束时使用模型的估计参数来检查误差函数的值。如果自上次迭代以来错误率降低了,可以尝试将学习率提高5%。如果错误率实际上增加了(意味着跳过了最佳点),你应该将Wj的值重置为先前迭代的值,并将学习率降低50%。这种技术被称为Bold Driver。
额外提示:标准化您的输入向量
在许多机器学习的问题中,对输入向量进行归一化是相当普遍的做法。在一些技术中,归一化是必需的因为它们在内部使用距离或特征方差,因此没有归一化结果将受到具有最大方差或尺度的特征的严重影响。标准化您的输入也可以帮助您的数值优化方法(如渐变下降)更快更准确地收敛。
即使有多种方法来标准化变量,[0,1]标准化(也称为最小 - 最大)和z-score标准化是其中使用最广泛的两种。下面是你如何计算他们两个:
XminmaxNorm = (X - min(X))/(max(X)-min(X));
XzscoreNorm = (X - mean(X))/std(X);
希望这对你有用!
你喜欢这篇文章吗?请花一点时间在Twitter上分享。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring Boot Actuators
- 用图机器学习探索 A 股个股相关性变化
- Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法
- MySQL 技术篇-mysql数据库的安装、配置与使用实例演示
- JavaScript 技术篇-js代码获取当前操作系统信息、浏览器版本信息实例演示,windows NT版本对照表
- Oracle 数据库impdp导入数据库版本和dmp数据库文件版本不匹配问题解决方法,ORA-39142版本号不兼容、ORA-39000转储文件说明错误解决方法
- 实践总结:基于Kbone使用React同构开发小程序
- BAT 批处理命令 - 实现输出当前文件夹下的所有文件夹名的功能实例演示
- Python+Selenium 自动化-指定chrome驱动运行selenium实例演示,运行指定位置下的浏览器驱动
- Linux 命令查找指定文件夹下符合查询条件的文件和文件夹实例演示
- 用Python实现一个最新QQ办公版(TIM)的登录界面
- Oracle 数据库直接执行本地sql文件、sql脚本实例演示
- Oracle 数据库利用回收站恢复删除的表实例演示
- Linux 命令利用scp实现从服务器共享地址上传下载文件、文件夹实例演示,scp命令的参数详解
- Oracle 数据库利用sql语句判断某个表是否是临时表实例演示,达梦数据库查询出所有临时表