梯度下降入门

本文参考深入浅出--梯度下降法及其实现,对后面将公式转化为矩阵的形式加了些解释,便于大家理解。

梯度下降是用来求函数最小值点的一种方法,所谓梯度在一元函数中是指某一点的斜率,在多元函数中可表示为一个向量,可由偏导求得,此向量的指向是函数值上升最快的方向。公式表示为:
\[ \nabla J(\Theta) = \langle \frac{\overrightarrow{\partial J}}{\partial \theta_1}, \frac{\overrightarrow{\partial J}}{\partial \theta_2}, \frac{\overrightarrow{\partial J}}{\partial \theta_3} \rangle \]

比如

\[
\begin{aligned}
J(\theta) &= \theta^2 \qquad \nabla J(\theta) = J'(\theta) = 2\theta\\
J(\theta) &= 2\theta_1+3\theta_2 \quad \nabla J(\theta) = \langle 2,3 \rangle
\end{aligned}
\]

由于梯度是函数值上升最快的方向,那么我们一直沿着梯度的反方向走,就能找到函数的局部最低点。
因此有梯度下降的递推公式:
\[ \Theta^1 = \Theta^0 - \alpha \nabla J(\Theta^0) \]
其中\(\alpha\)称为学习率,直观得讲就是每次沿着梯度反方向移动的距离,学习率过高可能会越过最低点,学习率过低又会使得学习速度偏慢。
为了更好的理解上面的公式
我们举例:
\[
\quad J(\theta) = \theta^2 \Longrightarrow \nabla J(\theta) = J'(\theta) = 2\theta
\]
则梯度下降的迭代过程有:
\[
\begin{aligned}
\theta^0 &= 1 \\theta^1 &= \theta^0 - \alpha \times J'(\theta^0) \\
&= 1-0.1 \times 2 \ &= 0.2 \\theta^2 &= \theta^1 - \alpha \times J'(\theta^1)\ &= 0.04\\theta^3 &= 0.008\\theta^4 &= 0.0016\\end{aligned}
\]
我们知道$J(\theta) = \theta^2 \(的极小值点在\)(0,0)\(处,而迭代四次后的结果\)(0.0016,0.00000256)$已相当接近。

再举一个二元函数的例子:
\[J(\Theta) = \theta_1^2 + \theta_2^2 \Longrightarrow \nabla J(\Theta) = \langle 2\theta_1 + 2\theta_2 \rangle\]
令\(\alpha = 0.1\), 以初始点\((1,3)\)用梯度下降法求函数最低点
\[
\begin{aligned}
\Theta^0 &= (1,3) \\Theta^1 &= \Theta^0 - \alpha \nabla J(\Theta^0)\ &= (1,3) - 0.1(2,6)\ &= (0.8,2.4)\\Theta^2 &= (0.8,2.4) - 0.1(1.6,4.8)\ &= (0.64,1.92) \\Theta^3 &= (0.512,1.536) \\end{aligned}
\]

值得注意的是,迭代的效率除了和步长(学习率)\(\alpha\)有关外,还与初始值的选取有关。

梯度下降做散点拟合

利用梯度下降法拟合出一条直线使得平均方差最小。
假设拟合后的直线为:
\[h_\Theta(x) = \theta_0 + \theta_1 \times x \]
其中\(\Theta = (\theta_0, \theta_1)\)
把平均方差作为代价函数
\[J(\Theta) = \frac{1}{2m}\sum_{i=1}^m \left\lbrace h_\Theta(x_i) - y_i \right\rbrace ^2\]

\[
\begin{aligned}
&\nabla J(\Theta) = \langle \frac{\delta J}{\delta \theta_0}, \frac{\delta J}{\delta\theta_1} \rangle \&\frac{\delta J}{\delta \theta_0} = \frac{1}{m} \sum_{i=1}^m \left\lbrace h_\Theta(x_i) - y_i \right\rbrace\&\frac{\delta J}{\delta \theta_1} = \frac{1}{m} \sum_{i=1}^m \left\lbrace h_\Theta(x_i) - y_i \right\rbrace x_i\\end{aligned}
\]

为了便于利用python的矩阵运算,我们可以将公式稍微变形
\[
\begin{aligned}
h_\Theta(x_i) &= \theta_0 \times 1 + \theta_1 \times x_i \ &=
\begin{bmatrix}
1 & x_0\ 1 & x_1\ \vdots & \vdots\ 1 & x_{19}\ \end{bmatrix}
\times
\begin{bmatrix}
\theta_0\ \theta_1
\end{bmatrix}
\end{aligned}
\]

\(i\)的范围是\([1,20]\),因此最后得到
\[
h_\Theta(x_i)=
\begin{bmatrix}
h_0\h_1\\vdots\h_{19}
\end{bmatrix}
\]

\[
误差diff =
\begin{bmatrix}
h_0\h_1\\vdots\h_{19}
\end{bmatrix}-
\begin{bmatrix}
y_0\y_1\\vdots\y_{19}
\end{bmatrix}
\]

\[
方差和
\sum_{i=1}^m \left\lbrace h_\Theta(x_i) - y_i \right\rbrace ^2=diff^T \times diff
\]

将公式变为矩阵向量相乘的形式后你应当更容易理解下面的python代码

import numpy as np

# Size of the points dataset.
m = 20

# Points x-coordinate and dummy value (x0, x1).
X0 = np.ones((m, 1))
X1 = np.arange(1, m+1).reshape(m, 1)
X = np.hstack((X0, X1))

# Points y-coordinate
y = np.array([
    3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
    11, 13, 13, 16, 17, 18, 17, 19, 21
]).reshape(m, 1)

# The Learning Rate alpha.
alpha = 0.01

def error_function(theta, X, y):
    '''Error function J definition.'''
    diff = np.dot(X, theta) - y
    return (1./(2*m)) * np.dot(np.transpose(diff), diff)

def gradient_function(theta, X, y):
    '''Gradient of the function J definition.'''
    diff = np.dot(X, theta) - y
    return (1./m) * np.dot(np.transpose(X), diff)

def gradient_descent(X, y, alpha):
    '''Perform gradient descent.'''
    theta = np.array([1, 1]).reshape(2, 1)
    gradient = gradient_function(theta, X, y)
    while not np.all(np.absolute(gradient) <= 1e-5):
        theta = theta - alpha * gradient
        gradient = gradient_function(theta, X, y)
    return theta

optimal = gradient_descent(X, y, alpha)
print('optimal:', optimal)
print('error function:', error_function(optimal, X, y)[0,0])

原文地址:https://www.cnblogs.com/lepeCoder/p/10989348.html

时间: 2024-08-29 21:45:43

梯度下降入门的相关文章

机器学习入门:线性回归及梯度下降

机器学习入门:线性回归及梯度下降 本文会讲到: (1)线性回归的定义 (2)单变量线性回归 (3)cost function:评价线性回归是否拟合训练集的方法 (4)梯度下降:解决线性回归的方法之一 (5)feature scaling:加快梯度下降执行速度的方法 (6)多变量线性回归   Linear Regression 注意一句话:多变量线性回归之前必须要Feature Scaling! 方法:线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个

深度学习中梯度下降知识准备

考虑一个代价函数C , 它根据参数向量 计算出当前迭代模型的代价,记作C(). 机器学习中,我们的任务就是得到代价的最小值,在机器学习中代价函数通常是损失函数的均值,或者是它的数学期望.见下图: 这个叫做泛化损失,在监督学过程中,我们知道z=(x,y)  ,并且 f(x) 是对y的预测. 什么是这里的梯度呢? 当 是标量的时候,代价函数的梯度可表示如下: 当 很小的时候,它就是的另外一种表达,而我们就是让小于零,且越小越好. 当时一个向量的时候,代价函数的 梯度也是一个向量,每个都是一个i,这里

机器学习算法(优化)之一:梯度下降算法、随机梯度下降(应用于线性回归、Logistic回归等等)

本文介绍了机器学习中基本的优化算法-梯度下降算法和随机梯度下降算法,以及实际应用到线性回归.Logistic回归.矩阵分解推荐算法等ML中. 梯度下降算法基本公式 常见的符号说明和损失函数 X :所有样本的特征向量组成的矩阵 x(i) 是第i个样本包含的所有特征组成的向量x(i)=(x(i)1,x(i)2...,x(i)n) y(i) 第i个样本的label,每个样本只有一个label,y(i)是标量(一个数值) hθ(x(i)) :拟合函数,机器学习中可以用多种类型的拟合函数 θ 是函数变量,

神经网络基础-梯度下降和BP算法

https://blog.csdn.net/weixin_38206214/article/details/81143894 在深度学习的路上,从头开始了解一下各项技术.本人是DL小白,连续记录我自己看的一些东西,大家可以互相交流.本文参考:本文参考吴恩达老师的Coursera深度学习课程,很棒的课,推荐 本文默认你已经大致了解深度学习的简单概念,如果需要更简单的例子,可以参考吴恩达老师的入门课程:http://study.163.com/courses-search?keyword=%E5%9

2.监督学习应用.梯度下降

// 搜索算法 --- 挨个尝试 1. 梯度下降 批梯度下降, 随机梯度下降 2. 矩阵求导方法

【转】梯度下降

回归与梯度下降: 回归在数学上来说是给定一个点集,能够用一条曲线去拟合之,如果这个曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归,回归还有很多的变种,如locally weighted回归,logistic回归,等等,这个将在后面去讲. 用一个很简单的例子来说明回归,这个例子来自很多的地方,也在很多的open source的软件中看到,比如说weka.大概就是,做一个房屋价值的评估系统,一个房屋的价值来自很多地方,比如说面积.房间的数量(几室几厅).地段.朝向等等,

深度解读最流行的优化算法:梯度下降

深度解读最流行的优化算法:梯度下降 By 机器之心2016年11月21日 15:08 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战.(本文的中文版 PDF 下载地址) 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent)

七月算法--12月机器学习在线班-第六次课笔记—梯度下降和拟牛顿

七月算法--12月机器学习在线班-第六次课笔记—梯度下降和拟牛顿 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

Matlab梯度下降解决评分矩阵分解

for iter = 1:num_iters %梯度下降 用户向量 for i = 1:m %返回有0有1 是逻辑值 ratedIndex1 = R_training(i,:)~=0 ; %U(i,:) * V' 第i个用户分别对每个电影的评分 %sumVec1 第i个用户分别对每个电影的评分 减去真实值 sumVec1 = ratedIndex1 .* (U(i,:) * V' - R_training(i,:)); product1 = sumVec1 * V; derivative1 =