首页 > 其他分享 >梯度下降法(1)

梯度下降法(1)

时间:2023-01-28 22:00:14浏览次数:41  
标签:function 函数 gradient 梯度 下降 theta dot

1.梯度下降法基本原理

1.1 什么是梯度

梯度下降法(gradient descent)是一种常用的一阶(first-order)优化方法,是求解无约束优化问题最简单、最经典的方法之一。

梯度下降最典型的例子就是从山上往下走,每次都寻找当前位置最陡峭的方向小碎步往下走,最终就会到达山下(暂不考虑有山谷的情况)。

首先来解释什么是梯度?

这就要先讲导数和微分的区别:导数是函数在某一点处的斜率,是Δy和Δx的比值;而微分是指函数在某一点处的切线在横坐标取得增量Δx以后,纵坐标取得的增量,一般表示为dy。

梯度就是由微分结果组成的向量,令

梯度下降法(1)_损失函数

有,

梯度下降法(1)_损失函数_02

梯度下降法(1)_梯度下降法_03

  梯度下降法(1)_梯度下降法_04

那么,函数梯度下降法(1)_梯度下降法_05梯度下降法(1)_损失函数_06处的微分为

梯度下降法(1)_损失函数_07梯度下降法(1)_梯度下降法_08梯度下降法(1)_梯度下降法_09

因此,函数梯度下降法(1)_梯度下降法_05梯度下降法(1)_损失函数_06处的梯度为梯度下降法(1)_损失函数_12

梯度是一个向量,对于一元函数,梯度就是该点处的导数,表示切线的斜率。对于多元函数,梯度的方向就是函数在该点上升最快的方向。

1.2 为什么按照梯度的反方向能达到局部最低点

给出数学证明:

对于连续可微函数梯度下降法(1)_梯度下降法_13,从某个随机点出发,想找到局部最低点,可以通过构造一个序列梯度下降法(1)_损失函数_14,能够满足

梯度下降法(1)_损失函数_15

那么我们就能够不断执行该过程即可收敛到局部极小点,可参考下图。

梯度下降法(1)_损失函数_16

那么问题就是如何找到下一个点梯度下降法(1)_损失函数_17,并保证梯度下降法(1)_梯度下降法_18呢?我们以一元函数为例来说明。

对于一元函数来说,梯度下降法(1)_梯度下降法_19是会存在两个方向:要么是正方向梯度下降法(1)_损失函数_20,要么是负方向梯度下降法(1)_损失函数_21,如何选择每一步的方向,就需要用到泰勒公式,先看一下下面这个泰勒展式:

梯度下降法(1)_损失函数_22

梯度下降法(1)_梯度下降法_23

其中,梯度下降法(1)_损失函数_24表示梯度下降法(1)_梯度下降法_13梯度下降法(1)_梯度下降法_19处的导数。

若想梯度下降法(1)_损失函数_27,就需要保证梯度下降法(1)_梯度下降法_28,令

梯度下降法(1)_梯度下降法_29梯度下降法(1)_损失函数_30

步长梯度下降法(1)_损失函数_31是一个较小的正数,从而有

梯度下降法(1)_损失函数_32

因此,有

梯度下降法(1)_损失函数_33

梯度下降法(1)_梯度下降法_34

梯度下降法(1)_梯度下降法_35

每一步我们都按照梯度下降法(1)_损失函数_36更新梯度下降法(1)_梯度下降法_19,这就是梯度下降的原理。

1.3 对参数的认识

对参数梯度下降法(1)_损失函数_38解释一下,梯度下降法(1)_损失函数_38在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过梯度下降法(1)_损失函数_38来控制每一步走的距离。既要保证步子不能太小,还没下到山底太阳就下山了;也要保证步子不能跨的太大,可能会导致错过最低点。

梯度下降法(1)_损失函数_41

在梯度前加负号就是朝梯度的反方向前进,因为梯度是上升最快的方向,所以方向就是下降最快的方向。

2.梯度下降法实例

2.1 一元函数梯度下降法

设一元函数为

梯度下降法(1)_损失函数_42

函数的梯度(微分):

梯度下降法(1)_梯度下降法_43

设迭代起点为梯度下降法(1)_梯度下降法_44,步长梯度下降法(1)_梯度下降法_45,依据梯度下降法公式梯度下降法(1)_梯度下降法_46

梯度下降法(1)_梯度下降法_44

梯度下降法(1)_损失函数_48

梯度下降法(1)_梯度下降法_49

梯度下降法(1)_梯度下降法_50

梯度下降法(1)_梯度下降法_51

2.2 多元函数梯度下降法

设二元函数为

梯度下降法(1)_损失函数_52

函数的梯度

梯度下降法(1)_损失函数_53

设起点为(2,3),步长梯度下降法(1)_梯度下降法_54,根据梯度下降的公式梯度下降法(1)_梯度下降法_55,经过多次迭代后,有

梯度下降法(1)_梯度下降法_56

梯度下降法(1)_损失函数_57

梯度下降法(1)_梯度下降法_58

......

梯度下降法(1)_梯度下降法_59

梯度下降法(1)_梯度下降法_60

梯度下降法(1)_梯度下降法_61


3.损失函数

3.1 什么是损失函数

损失函数也叫代价函数(cost function),是用来衡量模型预测出来的值h(θ)与真实值y之间的差异的函数,如果有多个样本,则可以将所有代价函数的取值求均值,记做J(θ)。代价函数有下面几个性质:

  1. 对于每种算法来说,代价函数不是唯一的;
  2. 代价函数是参数θ的函数;
  3. 总的代价函数J(θ)可以用来评价模型的好坏,代价函数越小说明模型和参数越符合训练样本(x, y);
  4. J(θ)是一个标量

3.2 最常见损失函数

最常见的代价函数是均方误差函数

梯度下降法(1)_梯度下降法_62

其中,m:为训练样本个数

梯度下降法(1)_损失函数_63:函数表示估计值,表达式为梯度下降法(1)_损失函数_64

y:原训练样本中的值

我们需要做的就是找到θ的值,使得J(θ)最小。代价函数的图形跟我们上面画过的图很像,如下图所示。

梯度下降法(1)_损失函数_65

看到这个图,也就知道了我们可以用梯度下降算法来求可以使代价函数最小的θ值。

3.3 损失函数的梯度

梯度下降法(1)_梯度下降法_66

其中,

梯度下降法(1)_损失函数_67

梯度下降法(1)_损失函数_68

​这里有两个变量梯度下降法(1)_梯度下降法_69,为了方便矩阵表示,我们给梯度下降法(1)_梯度下降法_19增加一维,这一维的值都是1,并将会乘到上,则成为矩阵X即如下形式:

梯度下降法(1)_梯度下降法_71

将两个变量梯度下降法(1)_梯度下降法_69也写成矩阵形式梯度下降法(1)_梯度下降法_73

梯度下降法(1)_梯度下降法_74

相应地,矩阵有

梯度下降法(1)_损失函数_75

那么cost function的矩阵形式为:

梯度下降法(1)_损失函数_76

这样写出来后再去对应上面的公式,就很容易理解了。

4.梯度下降算法实现线性回归

下面我们来举一个用梯度下降算法来实现线性回归的例子。

有一组数据如下图所示,我们尝试用这组数据求出这些点的线性回归模型。

梯度下降法(1)_损失函数_77

4.1产生矩阵X和矩阵y

m = 18; %18个数据样本
X0 = ones(m,1);
X1 = (1:m)';
X = [X0, X1]; %矩阵X
y = [2,3,3,5,8,10,10,13,15,15,16,19,19,20,22,22,25,28]';%矩阵y
alpha = 0.01;
theta = gradient_descent(X, y, alpha, m); %更新theta,求最优权值矩阵

4.2用梯度下降法公式定义梯度函数

function [grad_res] =  gradient_function(theta, X, y, m)
diff = X * theta - y;
grad_res = X' * diff / m;
end

4.3梯度下降算法

接下来就是最重要的梯度下降算法,我们梯度下降法(1)_损失函数_78梯度下降法(1)_梯度下降法_69的初始值都为1,再进行梯度下降过程。

function [theta_res] =  gradient_descent(X, y, alpha, m)
theta = [1;1];
gradient = gradient_function(theta, X, y, m);
while sum(abs(gradient)>1e-5)>=1
theta = theta - alpha * gradient;
gradient = gradient_function(theta, X, y, m);
end
theta_res = theta;
end

通过该过程,最终求出的梯度下降法(1)_损失函数_80线性回归的曲线如下

梯度下降法(1)_损失函数_81

5.附录Source Code

5.1matlab一元函数的梯度下降程序

clc;
close all;
clear all;
%%
delta = 1/100000;
x = -1.1:delta:1.1;
y = x.^2;
dot = [1, 0.2, 0.04, 0.008];
figure;plot(x,y);
axis([-1.2, 1.2, -0.2, 1.3]);
grid on
hold on
plot(dot, dot.^2,'r');
for i=1:length(dot)
text(dot(i),dot(i)^2,['\theta_{',num2str(i),'}']);
end
title('一元函数的梯度下降过程');

梯度下降法(1)_梯度下降法_82

5.2matlab多元函数的梯度下降程序

pecision = 1/100;
[x,y] = meshgrid(-3.1:pecision:3.1);
z = x.^2 + y.^2;
figure;
mesh(x,y,z);
dot = [[2,3];[1.6,2.4];[1.28,1.92];[5.09e-10, 7.64e-10]];
hold on
scatter3(dot(:,1),dot(:,2),dot(:,1).^2+dot(:,2).^2,'r*');
for i=1:4
text(dot(i,1)+0.4,dot(i,2),dot(i,1).^2+0.2+dot(i,2).^2+0.2,['\theta_{',num2str(i),'}']);
end
title('二元函数的梯度下降过程')

梯度下降法(1)_梯度下降法_83

5.3matlab梯度下降的线性回归

m = 18;
X0 = ones(m,1);
X1 = (1:m)';
X = [X0, X1];
y = [2,3,3,5,8,10,10,13,15,15,16,19,19,20,22,22,25,28]';
alpha = 0.01;
theta = gradient_descent(X, y, alpha, m); %更新theta,求最优权值矩阵

function [grad_res] = gradient_function(theta, X, y, m)
diff = X * theta - y;
grad_res = X' * diff / m;
end

function [theta_res] = gradient_descent(X, y, alpha, m)
theta = [1;1];
gradient = gradient_function(theta, X, y, m);
while sum(abs(gradient)>1e-5)>=1
theta = theta - alpha * gradient;
gradient = gradient_function(theta, X, y, m);
end
theta_res = theta;
end

_______________END_______________


标签:function,函数,gradient,梯度,下降,theta,dot
From: https://blog.51cto.com/u_15714963/6025180

相关文章