网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Θ
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+Θ1x1(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
(
i
)
)
=
Θ
0
Θ
1
x
(
i
)
h_{\Theta}(x^{(i)}) = \Theta_{0} + \Theta_{1}x^{(i)}
hΘ(x(i))=Θ0+Θ1x(i)
我们有两个变量,为了对这个公式进行矩阵化,我们可以给每一个点x增加一维,这一维的值固定为1,这一维将会乘到Θ0上。这样就方便我们统一矩阵化的计算
(
x
1
(
i
)
,
y
(
i
)
)
→
(
x
0
(
i
)
,
x
1
(
i
)
,
y
(
i
)
)
w
i
t
h
x
0
(
i
)
=
1
∀
i
(x_{1}{(i)},y{(i)})\rightarrow (x_{0}{(i)},x_{1}{(i)},y^{(i)}) with x_{0}^{(i)} = 1 \forall _{i}
(x1(i),y(i))→(x0(i),x1(i),y(i))withx0(i)=1∀i
然后我们将代价函数和梯度转化为矩阵向量相乘的形式
J
(
Θ
)
=
1
2
m
(
X
Θ
−
y
⃗
)
T
(
X
Θ
−
y
⃗
)
J(\Theta) = \frac{1}{2m}(X\Theta - \vec{y})^{T}(X\Theta - \vec{y})
J(Θ)=2m1(XΘ−y
)T(XΘ−y
)
▽
J
(
Θ
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
是非常方便的,同时代码也会变得非常的简洁。
为了转换为矩阵的计算,我们观察到预测函数的形式
h
Θ
(
x
(
i
)
)
=
Θ
0
Θ
1
x
(
i
)
h_{\Theta}(x^{(i)}) = \Theta_{0} + \Theta_{1}x^{(i)}
hΘ(x(i))=Θ0+Θ1x(i)
我们有两个变量,为了对这个公式进行矩阵化,我们可以给每一个点x增加一维,这一维的值固定为1,这一维将会乘到Θ0上。这样就方便我们统一矩阵化的计算
(
x
1
(
i
)
,
y
(
i
)
)
→
(
x
0
(
i
)
,
x
1
(
i
)
,
y
(
i
)
)
w
i
t
h
x
0
(
i
)
=
1
∀
i
(x_{1}{(i)},y{(i)})\rightarrow (x_{0}{(i)},x_{1}{(i)},y^{(i)}) with x_{0}^{(i)} = 1 \forall _{i}
(x1(i),y(i))→(x0(i),x1(i),y(i))withx0(i)=1∀i
然后我们将代价函数和梯度转化为矩阵向量相乘的形式
J
(
Θ
)
=
1
2
m
(
X
Θ
−
y
⃗
)
T
(
X
Θ
−
y
⃗
)
J(\Theta) = \frac{1}{2m}(X\Theta - \vec{y})^{T}(X\Theta - \vec{y})
J(Θ)=2m1(XΘ−y
)T(XΘ−y
)
▽
J
(
Θ
[外链图片转存中…(img-Y1nAJPTC-1715616562762)]
[外链图片转存中…(img-ALCk009U-1715616562762)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新