Gradient Descent(机器学习之梯度下降法)
目录
- Tip 1: Tuning your learning rates
- Learning Rate
- Adaptive Learning Rate (适应性学习率)
- AdaGrad算法
- AdaGrad
- Contradiction
- How surprise it is?
- Tip 2:Stochastic Gradient Descent(随机梯度下降法)
- Tip 3:Feature Scaling(特征缩放)
- how to do?
- Theory(数学原理)
- Question
- Formal Derivation
- Taylor Series
- Back to Formal Derivation
- More Limitation of Gradient Descent
Tip 1: Tuning your learning rates
Learning Rate
如果learning rate 比较大,即如绿色曲线,在左侧曲线就会直接跳过谷底,反映到Loss曲线上就会呈现,开始下降速度快,但很快就会卡住,不在下降。
如果learning rate 超级大,即如黄线,会直接飞出去了。
要调整到Just make 时才能刚刚好。
所以右侧的Loss图一定要画出 。
Adaptive Learning Rate (适应性学习率)
靠近目标是要减小 learning rate ,让它收敛在最低点
但仅仅有公式不可以,最好Giving different parameters (参数)different learning rates
AdaGrad算法
AdaGrad
对于每一个参数都用相同的学习率进行更新。
但是在实际应用中,各个参数的重要性肯定是不一样的,所以我们对于不同的参数要动态的采取不同的学习率,让目标函数更快的收敛。
σt\sigma_tσt: root mean square of the previous derivatives of parameter w,即参数w之前的导数的均方根。
即parameter dependent,每一个参数的learning rate都不一样
Contradiction
gtg_tgt表明导数越大,参数越大
∑y=0x(gi)2\sum^{x }_{y =0}{(g_i)^2}∑y=0x(gi)2在分母上,表明导数越大参数越小
这是矛盾的。
How surprise it is?
直观解释
所以通过∑y=0x(gi)2\sum^{x }_{y =0}{(g_i)^2}∑y=0x(gi)2知道过去的gradient有多大,再相除,知道反差有多大。
更正式的解释
gradient值越大,离底部距离越大
但我们同时考虑多个参数时,以上论述就不一定成立了。
(注意:图中w1,w2没有标注错误)
二次微分2a在一次微分的分母上
分母上当然可以直接算二次微分,但是在很复杂的情况下,算二次微分花费的大量时间是不能承受的,所以Adagrad在没有增加任何额外运算的前提下,去估计二次微分的值。
Tip 2:Stochastic Gradient Descent(随机梯度下降法)
初始的式子其实是合理的,因为损失是整体训练的总和,但SGD想法不同,每次只拿一个xnx_nxn出来,只算对一个example的loss即可。
(注意:只是将最外侧的求和去掉)
这样做的好处是:
原来的Gradient Descent,看完所有example才update一次参数,这是稳定的,如左侧小图,其实就是按照Gradient建议的方向来走。
但是如果用SGD,每看到一个example就update一次。如果只对于一次example,步伐可能是小的而且是散乱的,与大趋势不见得是一致的,但是因为可以看很多个example,所以Gradient Descent走一步,SGD可能已走了20步,所以SGD反而比较快。
Tip 3:Feature Scaling(特征缩放)
本来在左图x2x_2x2的范围远比x1x_1x1大,那我们就把其缩小,变成右图的样子,即使不同的特征具有相同的缩放比例。
那么为什么这么做呢?
对于Feature Scaling前的左侧小图,可以看到,w1w_1w1变动对于y的影响很小,但w2w_2w2变动对于y会造成较大影响。
所以坐标轴上,w1w_1w1方向比较平缓,w2w_2w2方向上比较陡峭。
对于Feature Scaling后的右侧小图,在坐标轴上w1w_1w1和w2w_2w2影响力差不多。
对于未Feature Scaling的两个方向差很多,同一组learning rate 很难搞定,但是有Scaling变成正圆形会很容易,可以直接指向圆心走。
how to do?
Theory(数学原理)
Question
Formal Derivation
我们很难在所有范围内找到最小点,但给定一个点,我们很容易找到附近值最小的点,然后依次更新。
Taylor Series
sinxsinxsinx和一次的直线是很不吻合的,但在π/4\pi/4π/4处趋势很像,而展开式高次影响很小,所以就只可以考虑sinxsinxsinx展开式中一次的部分。
Back to Formal Derivation
在红圈范围内用泰勒级数对Loss函数做简化
泰勒展开在越小的范围内越精确,对应就是红色的圈圈要越小,而η\etaη(Learning rate)与其半径成正比。故理论上,只有Learning rate无穷小,才能保证Loss越来越小,但实际上只要够小就可以了。
以上只考虑了泰勒展开的一次式,但考虑二次式,也是可以的,但这样的方法不见得更普及,因为要运算二次微分,会多很多运算,但这些运算在做Deep Learning时是无法承受的。
More Limitation of Gradient Descent
(1)会卡在Local minima,在Local minima参数的更新会停止。
(2)除此之外,在saddle point(鞍点)也会出现这样的问题.
但以上微分值为0的地方可能只是幻想,真正的问题在于,对于某一点,微分值很小,可能小于10-6,这已经很小了,你有可能就停下来了(因为很少真的算出微分为0),但是很小不见得接近Local minima,可能只是在一个plateau(高原)上,离Local minima其实很远。
Gradient Descent(机器学习之梯度下降法)相关推荐
- 机器学习之梯度下降法(GD)、随机梯度下降法(SGD)和随机平均梯度下降法(SAGD)
目录 基本原理 梯度下降法(Gradient Descent) 随机梯度下降法(Stochastic Gradient Descent,SGD)
- [机器学习-2]梯度下降法及实现(python)
[机器学习-2]梯度下降法及实现(python) 样例(Example) 利普西斯连续(L-continuity) 利普西斯光滑(L-smoothness) 凸集(Convex Set) 凸函数(Co ...
- 机器学习之梯度下降法(GD)和坐标轴下降法(CD)
梯度下降法 梯度下降法(Gradient Descent, GD)常用于求解无约束情况下凸函数(Convex Function)的极小值,是一种迭代类型的算法,因为凸函数只有一个极值点,故求解出来的极 ...
- python机器学习:梯度下降法
---<从机器学习到深度学习>刘长龙 用梯度下降法求解因变量最低点步骤: 任取一点为起始点 查看在当前点向哪个方向移动能得到最小的z值,并向该方向移动 重复该步骤,直到无法找到更小的z值, ...
- 梯度下降算法c语言实现,机器学习中梯度下降法原理及用其解决线性回归问题的C语言实现...
本文讲梯度下降(Gradient Descent)前先看看利用梯度下降法进行监督学习(例如分类.回归等)的一般步骤: 1, 定义损失函数(Loss Function) 2, 信息流forward pr ...
- Python机器学习:梯度下降法004实现线性回归中的梯度下降法
直接上代码 import numpy as np import matplotlib.pyplot as plt 生成模拟数据 np.random.seed(666) x = 2 * np.rando ...
- Python机器学习:梯度下降法002模拟实现梯度下降法
模拟实现梯度下降法 import numpy as np import matplotlib.pyplot as plt 生成数据 plot_x = np.linspace(-1,6,141) pri ...
- 【机器学习】机器学习之梯度下降法简单应用(Python)
本文主要是用Python简单程序应用梯度下降法解决一个实际问题,帮助理解机器学习在预测方面的功能作用. 一.通过一个人的身高体重性别预测他的腰围 数据训练集(可以通过调查获得,这里只列4个,还可以更多 ...
- 机器学习_梯度下降法(BGD、SGD、MBGD)
除了最小二乘法求解损失函数之外,梯度下降法是另一种求解损失函数的方法. 梯度下降的直观理解,先用一个例子说明: 假设找凸函数y=x**2的最小值,通过迭代的方式,假设x=2时,y=4,x=0.8时,y ...
最新文章
- 京东典型广告推广源码示例一
- 2、redis.conf基本配置项说明
- angular $observe() 和$watch的区别
- python3 判断字符串 是否为字母 数字 浮点数 整数
- java list 数据不重复,Java中List集合去除重复数据的方法
- 使用SELECT 和OPEN CURSOR 读取big table的性能比较
- python oracle连接池_【Python + Oracle】Python Oracle连接池—改进版
- MySQL 的索引是什么?怎么优化?
- Android Studio、 补充知识以及主要组件
- C语言/C++程序员大神打造纯C的电子时钟(加图形库+源码)
- RocketMQ报错:MQClientException:no route info of this topic的解决
- intellij HTTP状态 404 - 未找到_IntelliJ静态分析竟有代码检测优化,删除冗余等功能...
- 华为面试题目:一头牛重800kg,一座桥承重700kg,牛如何过河?天秀回答秒通过...
- 十、网络编程(高琪java300集+java从入门到精通笔记)
- justinmind夜话:数据母板系列视频教程之原型设计二十一条军规
- CentOS虚拟机根分区磁盘扩容操作
- 2022年认证杯SPSSPRO杯数学建模C题(第一阶段)污水流行病学原理在新冠疫情防控方面的作用求解全过程文档及程序
- scanf(“%*[\n]%[^\n]“,s)是什么意思?
- CSS Div 实现舞台灯光效果
- 请出中本聪,迎接新世界(1-5)
热门文章
- sqlite字段类型说明
- error C2065: 'IDD_***' : undeclared identifier
- 技巧:让Eclipse或Flex Builder 支持自动换行。(转)
- Codeforces 319C DP 斜率优化
- 【BIEE】12_查看BIEE的物理SQL
- 函数和常用模块【day06】:模块特殊变量(十四)
- String类的流程控制
- Oracle数据库安装时 environment variable path 大于 1023
- 前台页面优化全攻略(二)
- [HTML5_资源]给网页设计师的30个HTML5学习资源