最全梯度下降算法原理讲解——机器学习(1),2024年最新腾讯C C++开发岗

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

J

θ

3

=

(

5

,

2

,

12

)

\triangledown J(\Theta ) = \left < \frac{\partial J}{\partial \theta_{1}}, \frac{\partial J}{\partial \theta_{2}},\frac{\partial J}{\partial \theta_{3}} \right > =(-5,-2,12)

▽J(Θ)=⟨∂θ1​∂J​,∂θ2​∂J​,∂θ3​∂J​⟩=(−5,−2,12)

我们可以看到,梯度就是分别对每个变量进行微分,然后用逗号分割开,梯度是用<>包括起来,说明梯度其实一个向量。

梯度是微积分中一个很重要的概念,之前提到过梯度的意义

  • 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
  • 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向

这也就说明了为什么我们需要千方百计的求取梯度!我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点!

2.3 数学解释

首先给出数学公式:

Θ

1

=

Θ

0

α

J

(

Θ

)

e

v

a

l

u

a

t

e

d

a

t

Θ

0

{\color{Red} \Theta^1} = {\color{Blue} \Theta^0} + {\color{Green} \alpha} {\color{Purple} \triangledown J(\Theta)}\rightarrow evaluated at \Theta^0

Θ1=Θ0+α▽J(Θ)→evaluatedatΘ0

此公式的意义是:J是关于Θ的一个函数,我们当前所处的位置为Θ0点,要从这个点走到J的最小值点,也就是山底。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是α,走完这个段步长,就到达了Θ1这个点!
在这里插入图片描述

2.3.1 α

α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,以保证不要步子跨的太大扯着蛋,哈哈,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山下。所以α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!

2.3.2 梯度要乘以一个负号

梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们在前文提到,梯度的方向实际就是函数在此点上升最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号;那么如果时上坡,也就是梯度上升算法,当然就不需要添加负号了。

3. 实例

我们已经基本了解了梯度下降算法的计算过程,那么我们就来看几个梯度下降算法的小实例,首先从单变量的函数开始,然后介绍多变量的函数。

3.1 单变量函数的梯度下降

我们假设有一个单变量的函数

J

(

θ

)

=

θ

2

J(\theta) = \theta^2

J(θ)=θ2

函数的微分,直接求导就可以得到

J

(

θ

)

=

2

θ

J’(\theta) = 2\theta

J′(θ)=2θ

初始化,也就是起点,起点可以随意的设置,这里设置为1

θ

0

=

1

\theta^0 = 1

θ0=1

学习率也可以随意的设置,这里设置为0.4

α

=

0.4

\alpha = 0.4

α=0.4

根据梯度下降的计算公式

Θ

1

=

Θ

0

α

J

(

Θ

)

e

v

a

l

u

a

t

e

d

a

t

Θ

0

{\color{Red} \Theta^1} = {\color{Blue} \Theta^0} + {\color{Green} \alpha} {\color{Purple} \triangledown J(\Theta)}\rightarrow evaluated at \Theta^0

Θ1=Θ0+α▽J(Θ)→evaluatedatΘ0

我们开始进行梯度下降的迭代计算过程:

θ

0

=

1

\theta^0 = 1

θ0=1

θ

1

=

θ

0

α

J

(

θ

0

)

=

1

0.4

2

=

0.2

\theta^1 = \theta^0 - \alpha*J’(\theta^0)=1 - 0.4*2 = 0.2

θ1=θ0−α∗J′(θ0)=1−0.4∗2=0.2

θ

2

=

θ

1

α

J

(

θ

1

)

=

0.2

0.4

0.4

=

0.04

\theta^2 = \theta^1 - \alpha*J’(\theta^1)= 0.2 - 0.4*0.4=0.04

θ2=θ1−α∗J′(θ1)=0.2−0.4∗0.4=0.04

θ

3

=

0.008

\theta^3 = 0.008

θ3=0.008

θ

4

=

0.0016

\theta^4 = 0.0016

θ4=0.0016

如图,经过四次的运算,也就是走了四步,基本就抵达了函数的最低点,也就是山底
在这里插入图片描述

3.2 多变量函数的梯度下降

我们假设有一个目标函数

J

(

Θ

)

=

θ

1

2

θ

2

2

J(\Theta) = \theta_{1}^2 + \theta_{2}^2

J(Θ)=θ12​+θ22​

现在要通过梯度下降法计算这个函数的最小值。我们通过观察就能发现最小值其实就是 (0,0)点。但是接下来,我们会从梯度下降算法开始一步步计算到这个最小值!
我们假设初始的起点为:

Θ

0

=

(

1

,

3

)

\Theta^0 = (1, 3)

Θ0=(1,3)

初始的学习率为:

α

=

0.1

\alpha = 0.1

α=0.1

函数的梯度为:

J

(

Θ

)

=

<

2

θ

1

,

2

θ

2

\triangledown J(\Theta ) = \left < 2\theta_{1},2\theta_{2} \right >

▽J(Θ)=⟨2θ1​,2θ2​⟩

进行多次迭代:

Θ

0

=

(

1

,

3

)

\Theta^0 = (1, 3)

Θ0=(1,3)

Θ

1

=

Θ

0

α

J

(

Θ

)

=

(

1

,

3

)

0.1

(

2

,

6

)

=

(

0.8

,

2.4

)

\Theta^1 = \Theta^0 - \alpha\triangledown J(\Theta ) = (1,3) - 0.1*(2, 6)=(0.8, 2.4)

Θ1=Θ0−α▽J(Θ)=(1,3)−0.1∗(2,6)=(0.8,2.4)

Θ

2

=

(

0.8

,

2.4

)

0.1

(

1.6

,

4.8

)

=

(

0.64

,

1.92

)

\Theta^2 = (0.8, 2.4) - 0.1*(1.6, 4.8)=(0.64, 1.92)

Θ2=(0.8,2.4)−0.1∗(1.6,4.8)=(0.64,1.92)

Θ

3

=

(

0.5124

,

1.536

)

\Theta^3 =(0.5124, 1.536)

Θ3=(0.5124,1.536)

Θ

4

=

(

0.4096

,

1.228800000000001

)

\Theta^4 =(0.4096, 1.228800000000001)

Θ4=(0.4096,1.228800000000001)

\vdots

Θ

10

=

(

0.1073741824000003

,

0.32212254720000005

)

\Theta^{10} =(0.1073741824000003, 0.32212254720000005)

Θ10=(0.1073741824000003,0.32212254720000005)

\vdots

Θ

50

=

(

1.141798154164342

e

05

,

3.42539442494306

e

05

)

\Theta^{50} =(1.141798154164342e^{-05}, 3.42539442494306e^{-05})

Θ50=(1.141798154164342e−05,3.42539442494306e−05)

\vdots

Θ

100

=

(

1.6296287810675902

e

10

,

4.8888886343202771

e

10

)

\Theta^{100} =(1.6296287810675902e^{-10}, 4.8888886343202771e^{-10})

Θ100=(1.6296287810675902e−10,4.8888886343202771e−10)

我们发现,已经基本靠近函数的最小值点
在这里插入图片描述

4. 代码实现
4. 1 场景分析

下面我们将用python实现一个简单的梯度下降算法。场景是一个简单的线性回归的例子:假设现在我们有一系列的点,如下图所示:
在这里插入图片描述
我们将用梯度下降法来拟合出这条直线!

首先,我们需要定义一个代价函数,在此我们选用均方误差代价函数(也称平方误差代价函数)

J

(

Θ

)

=

1

2

m

i

=

1

m

(

h

θ

(

x

(

i

)

)

y

(

i

)

)

2

J(\Theta) = \frac{1}{2m}\sum_{i=1}{m}(h_{\theta}(x{(i)})-y{(i)})2

J(Θ)=2m1​∑i=1m​(hθ​(x(i))−y(i))2

此公式中

  • m是数据集中数据点的个数,也就是样本数
  • ½是一个常量,这样是为了在求梯度的时候,二次方乘下来的2就和这里的½抵消了,自然就没有多余的常数系数,方便后续的计算,同时对结果不会有影响
  • y 是数据集中每个点的真实y坐标的值,也就是类标签
  • h 是我们的预测函数(假设函数),根据每一个输入x,根据Θ 计算得到预测的y值,即

h

Θ

(

x

(

i

)

)

=

Θ

0

Θ

1

x

1

(

i

)

h_{\Theta}(x^{(i)}) = \Theta_{0} + \Theta_{1}x_{1}^{(i)}

hΘ​(x(i))=Θ0​+Θ1​x1(i)​

我们可以根据代价函数看到,代价函数中的变量有两个,所以是一个多变量的梯度下降问题,求解出代价函数的梯度,也就是分别对两个变量进行微分

J

(

Θ

)

=

<

δ

J

δ

Θ

0

,

δ

J

δ

Θ

1

\triangledown J(\Theta ) = \left < \frac{\delta J}{\delta \Theta_{0}}, \frac{\delta J}{\delta \Theta_{1}} \right >

▽J(Θ)=⟨δΘ0​δJ​,δΘ1​δJ​⟩

δ

J

δ

Θ

0

=

1

m

i

=

1

m

(

h

Θ

(

x

(

i

)

)

y

(

i

)

)

\frac{\delta J}{\delta \Theta_{0}} = \frac{1}{m}\sum_{i=1}{m}(h_{\Theta}(x{(i)})-y^{(i)})

δΘ0​δJ​=m1​∑i=1m​(hΘ​(x(i))−y(i))

δ

J

δ

Θ

1

=

1

m

i

=

1

m

(

h

Θ

(

x

(

i

)

)

y

(

i

)

)

x

1

(

i

)

\frac{\delta J}{\delta \Theta_{1}} = \frac{1}{m}\sum_{i=1}{m}(h_{\Theta}(x{(i)})-y{(i)})x_{1}{(i)}

δΘ1​δJ​=m1​∑i=1m​(hΘ​(x(i))−y(i))x1(i)​

明确了代价函数和梯度,以及预测的函数形式。我们就可以开始编写代码了。但在这之前,需要说明一点,就是为了方便代码的编写,我们会将所有的公式都转换为矩阵的形式,python中计算矩阵是非常方便的,同时代码也会变得非常的简洁。
为了转换为矩阵的计算,我们观察到预测函数的形式

h

Θ

(

x

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

<

δ

J

δ

Θ

0

,

δ

J

δ

Θ

1

\triangledown J(\Theta ) = \left < \frac{\delta J}{\delta \Theta_{0}}, \frac{\delta J}{\delta \Theta_{1}} \right >

▽J(Θ)=⟨δΘ0​δJ​,δΘ1​δJ​⟩

δ

J

δ

Θ

0

=

1

m

i

=

1

m

(

h

Θ

(

x

(

i

)

)

y

(

i

)

)

\frac{\delta J}{\delta \Theta_{0}} = \frac{1}{m}\sum_{i=1}{m}(h_{\Theta}(x{(i)})-y^{(i)})

δΘ0​δJ​=m1​∑i=1m​(hΘ​(x(i))−y(i))

δ

J

δ

Θ

1

=

1

m

i

=

1

m

(

h

Θ

(

x

(

i

)

)

y

(

i

)

)

x

1

(

i

)

\frac{\delta J}{\delta \Theta_{1}} = \frac{1}{m}\sum_{i=1}{m}(h_{\Theta}(x{(i)})-y{(i)})x_{1}{(i)}

δΘ1​δJ​=m1​∑i=1m​(hΘ​(x(i))−y(i))x1(i)​

明确了代价函数和梯度,以及预测的函数形式。我们就可以开始编写代码了。但在这之前,需要说明一点,就是为了方便代码的编写,我们会将所有的公式都转换为矩阵的形式,python中计算矩阵是非常方便的,同时代码也会变得非常的简洁。
为了转换为矩阵的计算,我们观察到预测函数的形式

h

Θ

(

x

[外链图片转存中…(img-PxtXpgDL-1715828443093)]
[外链图片转存中…(img-XKMh8P5x-1715828443093)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值