梯度下降(Gradient Descent),一句代码,一个式子
一直以来,总是觉得国外的PhD们的教育以及课程的安排很好很强大,虽然是说很累作业多工作量大,但是功率大了,效果好点儿,浪费的时间也少,年轻人哪有怕苦怕累的。比比身边好多每天睡超过12小时的研究生们,不知道是谁更幸福一点儿。
我也经常拿我所在的大学的研究生博士跟自己所了解的美国那边的phd比比,说实话感觉总是有点硬性的差距在里面。我所处在大学的研究生教育,就拿安排的课程来说,觉得真是有用的不多,虽然也有一些好课,但是鉴于教学质量的问题,往往又起不到好的效果,最重要的是,这里的学生真是太轻松安逸了,不会有有用的作业,也不会有作业让你熬夜计算或者coding,也不会有作业让你在图书馆过夜,图书馆,哎,也是在按时上下班。
国外大牛的课程设计的也不错,拿美女教授Kristen Grauman举个例子,你可以去看看她得研究生以及本科的课程,看着都羡慕啊,是吧。Andrew Ng的课也不用说了,还有很多很多自身修养不错的老师的课设计的都不错。及时你对这个方向开始不是很懂,那么这一门课下来,读了这么多论文以及写了这么多作业和coding,加上一门课所辐射的一个领域,相信应该会学到很多东西,况且老师教学又那么认真,及时你懒,那么也会逼着你去学到了。
课程设计真是一种艺术,也是一种优化。学到的不仅仅是理论,也是一种理解和实现理论的方法以及过程的体验。
--------------------------------
我经常会有一种感觉,就是感觉在自己实现一些算法的时候总是觉得不顺利或者甚至不想去实现,一方面开源的工具很多,另一方面懒吧。
其实每个初学算法的人都应该去亲自体验一下才好,我觉得这个过程当中最重要的就是建立起书面论文理论到具体coding实现的一个映射,理论-实现,这个映射相信是很多人的瓶颈,要努力克服这个。
就拿梯度下降(Gradient Descent)这个小算法来举个例子吧,算法简单,对吧?但是忽然让你马上实现一下,能够5分钟迅速搞定么?3分钟??允许用matlab的话,方便点儿是吧。
------------------------------------------------
即使以前看过梯度下降算法,但是真的要去用去实现的时候,还真是得重新再看看。针对具体问题吧,先选择个问题,回归问题。再找点儿数据,索性就把libsvm包里的例子数据heart_scale.mat拿来吧,可以自己去下载。虽然是分类的,但是也可以看做回归呗,有些原理也相似。数据中heart_scale_inst包括270个13维的样本,label全部是+-1,这里看做回归吧。
假设要学习这么一个函数:
那么损失函数可以定义成:
其中X看以看成一行一行的样本向量,那么Θ就是一列一列的了。别搞混了。这其实就是比较常用的square loss,for least squares regression or classification。那么我们的目标很简单,就是求损失的最小值的时候的解:
像这种优化问题有很多方法,那咱们先直接求导吧,对于求导过程,好多还是不理解,可以用这种方法:
首先定义损失变量:
那么损失函数就可以表示成:
一步一步的求导:
再求:
那么把分步骤合起来就是:
导数为0,那么有:
整理一下:
用矩阵符号将上面的细节运算抽象一下:
让导数为0,那么求得的解为:
但是我们知道求矩阵(XTX)的逆复杂度有点儿高,O(n3),如果n很大,那么也受不了。
可以用最小二乘或者梯度下降来求解,这里我们看看梯度下降的实现,梯度下降的思想不难,只要确定好梯度以及梯度的方向就ok,因为是梯度的反方向去下降,所以在对参数更新的时候要注意:
其中γ就是下降的速度了,这个很敏感的,一般是一个小的数值,可以从0.01开始尝试,越大下降越快,收敛越快。当然下降的速率可以改成自适用的,就是根据梯度的强弱适当调整步伐,这样效果还好一点儿。
上图就是迭代目标函数值的情况,迭代终止的条件有很多种,这里取得:
代码也很简单,如果用matlab的话,矩阵计算就容易很多:
clc;
clear
% load data
heart_scale = load('heart_scale');
X = heart_scale.heart_scale_inst;
Y = heart_scale.heart_scale_label;epsilon = 0.0003;
gamma= 0.0001;w_old=zeros(size(X,2),1);
k=1;
figure(1);
while 1
minJ_w(k) = 1/2 * (norm(X*w_old - Y))^2;
w_new = w_old - gamma*(X'*X*w_old - X'*Y);
fprintf('The %dth iteration, minJ_w = %f, \n',k,minJ_w(k));if norm(w_new-w_old) < epsilon
W_best = w_new;
break;
end
w_old = w_new;
k=k+1;
endplot(minJ_w);
运行的结果:
The 1th iteration, minJ_w = 135.000000,
The 2th iteration, minJ_w = 128.785026,
The 3th iteration, minJ_w = 123.210569,
The 4th iteration, minJ_w = 118.202908,
The 5th iteration, minJ_w = 113.697504,
The 6th iteration, minJ_w = 109.637791,
The 7th iteration, minJ_w = 105.974133,
The 8th iteration, minJ_w = 102.662919,
The 9th iteration, minJ_w = 99.665786,
The 10th iteration, minJ_w = 96.948948,
The 11th iteration, minJ_w = 94.482602,
The 12th iteration, minJ_w = 92.240436,
The 13th iteration, minJ_w = 90.199178,
The 14th iteration, minJ_w = 88.338227,
The 15th iteration, minJ_w = 86.639312,
....................
from: http://www.zhizhihu.com/html/y2011/3632.html
梯度下降(Gradient Descent),一句代码,一个式子相关推荐
- 机器学习(1)之梯度下降(gradient descent)
机器学习(1)之梯度下降(gradient descent) 题记:最近零碎的时间都在学习Andrew Ng的machine learning,因此就有了这些笔记. 梯度下降是线性回归的一种(Line ...
- Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降
Lesson 4.3 梯度下降(Gradient Descent)基本原理与手动实现 在上一小节中,我们已经成功的构建了逻辑回归的损失函数,但由于逻辑回归模型本身的特殊性,我们在构造损失函数时无法采用 ...
- 【李宏毅机器学习】04:梯度下降Gradient Descent
李宏毅机器学习04:梯度下降Gradient Descent 文章目录 李宏毅机器学习04:梯度下降Gradient Descent 一.梯度下降方法 二.梯度下降的改进方法 Tip 1: Tunin ...
- 机器学习代码实战——梯度下降(gradient descent)
文章目录 1.实验目的 2.梯度下降 2.1.借助sklearn库 2.2.手写梯度下降函数 1.实验目的 本实验将使用两种方法实现梯度下降算法并可打印出参数,可视化梯度下降过程.第一种方法是借助sk ...
- 梯度下降 gradient descent
文章目录 导数 偏导数 方向导数 梯度 代价函数的梯度 梯度下降的详细算法 先决条件 算法过程 代价损失中 θ 偏导数公式推导 批量梯度下降(Batch Gradient Descent,BGD) 随 ...
- 机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
前言: 上次写过一篇关于贝叶斯概率论的数学,最近时间比较紧,coding的任务比较重,不过还是抽空看了一些机器学习的书和视频,其中很推荐两个:一个是stanford的machine learning公 ...
- excel计算二元线性回归_用人话讲明白梯度下降Gradient Descent(以求解多元线性回归参数为例)...
文章目录 1.梯度 2.多元线性回归参数求解 3.梯度下降 4.梯度下降法求解多元线性回归 梯度下降算法在机器学习中出现频率特别高,是非常常用的优化算法. 本文借多元线性回归,用人话解释清楚梯度下降的 ...
- 梯度下降 Gradient Descent 详解、梯度消失和爆炸
1.什么是梯度 在微积分中,对多元函数的参数求∂偏导,把求得的各个参数的偏导数以向量形式写出来即为梯度. 例如对于函数f(x,y),分别对x,y求偏导,求得的梯度向量就是 (∂f/∂x, ∂f/∂y) ...
- 随机梯度下降法_动量梯度下降法(gradient descent with momentum)
简介 动量梯度下降法是对梯度下降法的改良版本,通常来说优化效果好于梯度下降法.对梯度下降法不熟悉的可以参考梯度下降法,理解梯度下降法是理解动量梯度下降法的前提,除此之外要搞懂动量梯度下降法需要知道原始 ...
最新文章
- ARKIT/ARCore对比分析(一)
- PHP输出表格的方法
- 关于Matconvnet中Conv-ReLU-Pool-NormBatch的总结与思考
- mac os 安装 thrift
- 【啊哈!算法】之二、插入排序
- winsock使用java编写_利用Socket进行Java网络编程(一)
- Java - Thinking in Java 第2章 一切都是对象
- iDRAC RAC0218 最大回话数
- (转)TortoiseGit(乌龟git)保存用户名密码的方法
- linux下解压缩rar格式的文件压缩包
- Vivaldi 更新至 1.9,新的搜索引擎及各种功能修复
- html 两个表合并,SQL中将两个表合并成一个新表
- UiPath安装pdf
- uview实现点击预览图片效果
- iptables中DNAT、SNAT和MASQUERADE
- Docker配置阿里云镜像加速
- Spring框架 编程式事务 事务的传播行为(一)
- html小游戏——看你有多色
- Day4—自制操作系统
- 什么是高铁运营监测(转载)
热门文章
- 百度语音识别技术负责人李先刚:如何利用Deep CNN大幅提升识别准确率?
- 著名投资人Chris Dixon:计算的下一波浪潮是什么?
- linux https重定向,Linux | Apache环境下强制http跳转至https的配置总结
- Apache Kafka-CMAK(kafka manager)安装部署使用
- MySQL - 分页查询优化的两个案例解析
- Oracle优化09-绑定变量
- xamarin.android蓝牙,在Android上连接Xamarin的配对蓝牙设备
- 在dw怎么关联css文件,重新设置Adobe Dreamweaver的文件关联解决办法
- linux之用 grep -r 关键字
- python语言:装饰器原理