数据科学、数据分析、人工智能必备知识汇总-----深度学习-----持续更新:https://blog.csdn.net/grd_java/article/details/143924745 |
---|
b站:https://www.bilibili.com/video/BV1eP411w7Re |
---|
梯度下降法是机器学习和深度学习一个参数更新的算法;是极其核心的一个算法。我们的深度学习模型拥有大量的模型参数,需要通过梯度下降法来对模型参数进行更新,使得我们模型有像人一样思考的能力,从数据中不断学习到知识
而线性回归模型,是一个样例式的算法,学习线性回归模型整理的一个套路,对后面学习深度学习起到一个参考作用
一、线性回归模型定义和穷举法
线性回归模型定义 |
---|
- 假设给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , 其中 x i = ( x i 1 ; x i 2 ; . . . ; x i d ) , y i ∈ R D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\},其中x_i = (x_{i1};x_{i2};...;x_{id}),y_i∈R D={(x1,y1),(x2,y2),...,(xm,ym)},其中xi=(xi1;xi2;...;xid),yi∈R,线性回归就是试图学的一个线性模型尽可能的准确的预测实际输出值
- x代表特征,y就是数据里面的标签
- 特征将指向标签。例如一个人的标签是年入百万,而他的特征是某学历、某经验、某…
- 通俗的讲就是求属性和结果之间的线性关系。线性回归模型的函数表达式可以为:
f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w n x n + b f(x)=w_1x_1+w_2x_2+...+w_nx_n+b f(x)=w1x1+w2x2+...+wnxn+b
x是特征,w是权重,b是偏置(平衡最后输出的值)。而值就是通过我们模型的学习,或者我们自己计算的方式方法,将w和b计算出来。所以
模型好不好,最终还是取决于w和b
也可以用向量的形式来表达: f ( x ) = w T x + b f(x)=w^Tx+b f(x)=wTx+b
- 就是将第一个公式简化了而已。理解这个需要线性代数矩阵的知识,w是向量 ( w 1 , w 2 , . . . , w n ) (w_1,w_2,...,w_n) (w1,w2,...,wn), w T 就是 w 的转置,也就是行向量变列向量 w^T就是w的转置,也就是行向量变列向量 wT就是w的转置,也就是行向量变列向量
- 与向量 x = ( x 1 , x 2 , . . . , x n ) x=(x_1,x_2,...,x_n) x=(x1,x2,...,xn)相乘。就正好是 w 1 x 1 + w 2 x 2 + . . . + w n x n w_1x_1+w_2x_2+...+w_nx_n w1x1+w2x2+...+wnxn
- 最后加上偏置 b b b即可
- 从上面的式子可以得出线性回归模型就是要求得一组最优的 w i w_i wi和 b b b来确定线性模型,使这个模型无限逼近现有的数据 x i x_i xi和结果 f ( x i ) f(x_i) f(xi)之间的关系
用案例简单解释一下上面公式 |
---|
现有一组数据,是小明每天学习的时间和最后考试的分数的数据(下表中的前三组数据)。假设小明每天学习4个小时最后考试会得多少分。
每日学习时间 | 考试得分 |
---|---|
1 | 2 |
2 | 4 |
3 | 6 |
4 | ? |
- 每日学习时间就是特征
- 考试得分就是y(就是f(x))
- 现在就需要一个这样模型 f ( x ) = w T x + b f(x) = w^Tx+b f(x)=wTx+b,假设我们w和b很好的话,我们就可以通过这个模型推测出每天学习4小时最终得分多少
- 所以核心就是将w和b找到,如何找到这个w和b就是求解线性回归模型的过程
- 无论是线性回归还是神经网络,都有这样一组参数
- 当然神经网络的参数更复杂,可能有成千上万个,但是最后的过程就是求解w和b,使得w和b更符合我们的场景
- 在这样的场景下,利用我们的模型达到想要的结果,例如预测每天学习4小时,考试得分是多少
- 再看上面的图表,我们会发现已有数据能很轻松绘制一条斜线,但是实际模型中,往往数据比较分散
- 所以我们要找到一条直线,重合的点最多,且与非重合点误差(距离)尽可能小
- 所以我们需要一个对比函数,来判断非重合点到我们找到的直线的误差最小(损失最小)
- 如果找到(W,b)让我们的损失参数最小,说明(W,b)是最成功的
误差(损失)函数 |
---|
- 设定线性回归模型
- 利用上述单特征线性模型来解决这个问题,首先这个数据输入就一个(小明的学习时间)。输出是考试得分。因此该模型可以确定为: f ( x ) = w x + b f(x) = wx+b f(x)=wx+b
- 但是为了方便后面的理解和计算,将模型化简为只用一个w来表达输入和输出之间的关系(这样做很不严谨,仅为了方便后面的计算和理解,日后我们会通过程序计算)
f ( x ) = w x f(x)=wx f(x)=wx
- 设定误差函数
- 现有一个公式计算输出和真实值间的误差: l o s s = ( f ( x ) − y ) 2 = ( w x − y ) 2 loss = (f(x)-y)^2=(wx-y)^2 loss=(f(x)−y)2=(wx−y)2
- 当然数据是有很多的,要计算所有数据真实值和输出之间的误差和,并计算出平均值,这个函数为均方误差函数,也是线性回归模型的损失函数。
J ( x ) = 1 2 m ∑ i = 1 m ( f ( x i ) − y i ) 2 J(x)=\dfrac{1}{2m}\sum_{i=1}^m(f(x_i)-y_i)^2 J(x)=2m1∑i=1m(f(xi)−yi)2
这个公式也很好理解,就是f(x)和真实值y的误差,将所有误差加起来,得到J(x)越小,说明我们找到的(W,b)为越优。而前面的 1 2 \dfrac{1}{2} 21是方便我们求导的。前面的 1 m \dfrac{1}{m} m1是最后求个平均值用的
穷举法找到w |
---|
- 还是小明考试的例子,可以使用穷举法,这是最笨的方法。反正就是猜,例如1-100之间,我们就1,2,3,…这样开始穷举
- 同样我们也需要loss值= ( f ( x ) − y ) 2 = ( w x − y ) 2 (f(x)-y)^2=(wx-y)^2 (f(x)−y)2=(wx−y)2
- 此时我们可以开始穷举,w=0时,可见x=1,2,3时,误差为4,16,36.最后平均一下偏差为18.7
- 依次类推,w=1时,最后偏差为4.7
- 当w=2时,最后偏差为0
- 最后我们发现w=2的时候,偏差最小为0.所以我们把w=2代入到 f ( x ) = w x = 2 x f(x)=wx=2x f(x)=wx=2x
当x=4时,f(x)=8.所以当小明学习4小时,考试成交预测为8
上面的例子好像让人觉得穷举法还不错,但是实际情况是,往往w有多个(假设10个,w1,w2,…,w10),还有一个偏置b。这种体量进行穷举,不知道得穷举到什么时候了。
二、最小二乘法
1. 求偏导
前面讲了如何用穷举法找w,依然使用上面的例子,我们为了方便省略偏置b
损失值: l o s s = ( f ( x ) − y ) 2 = ( w x − y ) 2 loss=(f(x)-y)^2=(wx-y)^2 loss=(f(x)−y)2=(wx−y)2其中f(x)是我们省略了偏置b的线性模型,y是真实值
- 其实细看这个公式就会发现 ( w x − y ) 2 (wx-y)^2 (wx−y)2是一个二次函数,也就是说它的图像是向上或向下的抛物线:
- 而这样的函数,是有一个w是它的极值点的(下图是数学中的求法,其中驻点是导数为0的点)
所以这样就很清晰了,只需要Loss函数对w求导,
找到导数为0的点,就是极值点
。
接下来介绍最小二乘法 ∂ L o s s ∂ w = 0 \dfrac{\partial Loss}{\partial w}=0 ∂w∂Loss=0(其中 ∂ \partial ∂是求偏导的意思,所以这个公式含义是对Loss中的w求偏导)
d y d x \dfrac{dy}{dx} dxdy是对x求全导数的,如果我们对多元函数求导,里面的x直接求导,而y,z,…都认为是关于x的函数,也要求导
∂ f ∂ x \dfrac{\partial f}{\partial x} ∂x∂f是对x求偏导数,对于多元函数求导,里面x直接求导,而其他的y,z,…都认为是常数。
求解Loss最小值:
∂ L o s s ∂ w = ∂ ( w x − y ) 2 ∂ w \dfrac{\partial Loss}{\partial w}=\dfrac{\partial (wx-y)^2}{\partial w} ∂w∂Loss=∂w∂(wx−y)2
= 复合函数求导,设 u = ( w x − y ) , ∂ u 2 = u 2 ( w x − y ) ∂ ( w x − y ) ∂ w \xlongequal{复合函数求导,设u = (wx-y),\partial u^2=u} 2(wx-y)\dfrac{\partial (wx-y)}{\partial w} 复合函数求导,设u=(wx−y),∂u2=u2(wx−y)∂w∂(wx−y)
= ( w x − y ) 对 w 求导,为 w 2 ( w x − y ) x \xlongequal{(wx-y)对w求导,为w}2(wx-y)x (wx−y)对w求导,为w2(wx−y)x
令导数为0,也就是 2 ( w x − y ) x = 0 2(wx-y)x=0 2(wx−y)x=0,求得: w = y x ( x 不为 0 ) w=\dfrac{y}{x}(x不为0) w=xy(x不为0)
依次代入
- x = 1 , y = 2 时, w = 2 x=1,y=2时,w=2 x=1,y=2时,w=2
- x = 2 , y = 4 时, w = 2 x=2,y=4时,w=2 x=2,y=4时,w=2
- x = 3 , y = 6 时, w = 2 x=3,y=6时,w=2 x=3,y=6时,w=2
最后一共得到3个w的取值,都是2,我们取其平均值 2 + 2 + 2 3 = 2 \dfrac{2+2+2}{3}=2 32+2+2=2
因此,我们找到了这个w,为2
而为什么我们用的是求偏导的符号呢?因为实际情况下,w不止一个,有w1,w2,…等等,所以是一个多元函数求偏导的问题。 ∂ L o s s ∂ w 1 = 0 , ∂ L o s s ∂ w 2 = 0 , . . . . \dfrac{\partial Loss}{\partial w_1}=0,\dfrac{\partial Loss}{\partial w_2}=0,.... ∂w1∂Loss=0,∂w2∂Loss=0,....
2. 向量形式,矩阵求导
线性回归模型的向量表达式为: f ( x ) = w T x + b f(x)=w^Tx+b f(x)=wTx+b
x 是特征, w 是权重, b 是偏置 x是特征,w是权重,b是偏置 x是特征,w是权重,b是偏置
数据特征矩阵x为: X = [ x 11 x 12 … x 1 d 1 x 21 x 22 … x 2 d 1 ⋮ ⋮ ⋱ ⋮ ⋮ x m 1 x m 2 … x m d 1 ] X=\begin{bmatrix} x_{11} & x_{12} &\dots &x_{1d} &1\\ x_{21} & x_{22} &\dots &x_{2d} &1\\ \vdots & \vdots &\ddots &\vdots &\vdots\\ x_{m1} & x_{m2} &\dots &x_{md} &1\\ \end{bmatrix} X= x11x21⋮xm1x12x22⋮xm2……⋱…x1dx2d⋮xmd11⋮1
为了方便理解原理的同时也方便计算,将参数b纳入矩阵w中
w= [ w 1 w 2 w 3 ⋮ w m b ] \begin{bmatrix} w_1\\ w_2\\ w_3\\ \vdots\\ w_m\\ b \end{bmatrix} w1w2w3⋮wmb
最终得到线性回归模型的向量表达式为: f ( X ) = X w f(X)=Xw f(X)=Xw
回顾我们loss公式:只有一组数据时为 l o s s = ( f ( x ) − y ) 2 = ( w x − y ) 2 loss=(f(x)-y)^2=(wx-y)^2 loss=(f(x)−y)2=(wx−y)2,多组数据时为 J ( w ) = 1 2 m ∑ i = 1 m ( f ( x i ) − y i ) 2 J(w)=\dfrac{1}{2m}\sum_{i=1}^m(f(x_i)-y_i)^2 J(w)=2m1∑i=1m(f(xi)−yi)2
但现在我们x和w是矩阵,利用最小二乘法对这个矩阵求最优w矩阵参数,步骤如下:
{ J ( w ) = 1 2 ( f ( x ) − Y ) 2 = 1 2 ( X w − Y ) 2 = 1 2 ( X w − Y ) T ( X w − Y ) = 1 2 ( w T X T − Y T ) ( X w − Y ) = 1 2 ( w T X T X w − Y T X w − w T X T Y + Y T Y ) \begin{cases} J(w)=\dfrac{1}{2}(f(x)-Y)^2\\\\ =\dfrac{1}{2}(Xw-Y)^2\\\\ =\dfrac{1}{2}(Xw-Y)^T(Xw-Y)\\\\ =\dfrac{1}{2}(w^TX^T-Y^T)(Xw-Y)\\\\ =\dfrac{1}{2}(w^T X^T Xw-Y^T Xw - w^TX^TY + Y^TY) \end{cases} ⎩ ⎨ ⎧J(w)=21(f(x)−Y)2=21(Xw−Y)2=21(Xw−Y)T(Xw−Y)=21(wTXT−YT)(Xw−Y)=21(wTXTXw−YTXw−wTXTY+YTY)
理解上面的知识,你需要知道如下公式(不包含最基础的):
- 对于两个向量 a ⇀ = ( a 1 , a 2 , … , a n ) 和 b ⇀ = ( b 1 , b 2 , … , b n ) \overrightharpoon{a}=(a_1,a_2,\dots,a_n)和\overrightharpoon{b}=(b_1,b_2,\dots,b_n) a=(a1,a2,…,an)和b=(b1,b2,…,bn)(可见这两个都是行向量),它们的内积 a ⇀ ⋅ b ⇀ = a ⇀ T ⋅ b ⇀ = ∑ i = 1 n a i b i \overrightharpoon{a}\cdot\overrightharpoon{b}=\overrightharpoon{a}^T\cdot\overrightharpoon{b}=\sum_{i=1}^na_ib_i a⋅b=aT⋅b=∑i=1naibi
- 设 ( X w − Y ) (Xw-Y) (Xw−Y)是一个行向量,则 ( X w − Y ) 2 = ∥ ( X w − Y ) ∥ 2 = ( X w − Y ) T ( X w − Y ) (Xw-Y)^2=\begin{Vmatrix*}[r] (Xw-Y) \end{Vmatrix*}^2=(Xw-Y)^T(Xw-Y) (Xw−Y)2= (Xw−Y) 2=(Xw−Y)T(Xw−Y)
剩下的步骤就和前面的求偏导一样了,找到J(w)对w求偏导为0的点即可。这里就涉及到超纲知识了(超出本科生学习范围)
- ∂ A B ∂ B = A T \dfrac{\partial AB}{\partial B} = A^T ∂B∂AB=AT:对两个相乘向量形式的其中一个向量求偏导(偏导对象非转置),为非偏导对象的转置
- ∂ A T B A = B \dfrac{\partial A^TB}{A}=B A∂ATB=B:对两个相乘向量形式的其中一个向量求偏导,如果形式中偏导对象是转置形式给出的,结果是非偏导对象(不是转置)
- ∂ X T A X ∂ X = 2 A X \dfrac{\partial X^T A X}{\partial X}=2AX ∂X∂XTAX=2AX:
接下来依据上面的公式求 ∂ J ( w ) ∂ w = 0 即可 \dfrac{\partial J(w)}{\partial w}=0即可 ∂w∂J(w)=0即可
{ ∂ J ( w ) ∂ w = 1 2 ( ∂ w T X T X w ∂ w − ∂ Y T X w ∂ w − ∂ w T X T Y ∂ w + ∂ Y T Y ∂ w ) = 1 2 ( 2 X T X w − ( Y T X ) T − X T Y + 0 ) = 1 2 ( 2 X T X w − 2 ( X T Y ) ) = X T X w − X T Y 令 ∂ J ( w ) ∂ w = 0 ,解得: X T X w − X T Y = 0 X T X w = X T Y w = ( X T X ) − 1 X T Y \begin{cases} \dfrac{\partial J(w)}{\partial w} = \dfrac{1}{2}(\dfrac{\partial w^T X^T Xw}{\partial w}-\dfrac{\partial Y^T Xw}{\partial w} - \dfrac{\partial w^TX^TY}{\partial w} + \dfrac{\partial Y^TY}{\partial w})\\\\ = \dfrac{1}{2}(2X^T X w-(Y^T X)^T - X^T Y + 0)\\\\ = \dfrac{1}{2}(2X^T X w-2(X^T Y))\\\\ = X^T X w - X^T Y\\\\ 令\dfrac{\partial J(w)}{\partial w} =0,解得:X^T X w - X^T Y=0\\\\ X^T X w =X^T Y\\\\ w =(X^T X)^{-1}X^T Y \end{cases} ⎩ ⎨ ⎧∂w∂J(w)=21(∂w∂wTXTXw−∂w∂YTXw−∂w∂wTXTY+∂w∂YTY)=21(2XTXw−(YTX)T−XTY+0)=21(2XTXw−2(XTY))=XTXw−XTY令∂w∂J(w)=0,解得:XTXw−XTY=0XTXw=XTYw=(XTX)−1XTY
w = ( X T X ) − 1 X T Y w =(X^T X)^{-1}X^T Y w=(XTX)−1XTY,看起来我们可以通过这种方法求得w。但是线性代数有一个概念,并非所有矩阵都可逆,也就是 ( X T X ) − 1 (X^T X)^{-1} (XTX)−1并不是总是成立的,也就是说他可能是无解的。
那一旦无解,w不就求不出来了吗?w求不出来,也就是说最小二乘法无法帮助我们找到一个w,使loss最小。只有在有解的时候才行。说白了就是
最小二乘法并不通用
此时应该怎么办呢?这时就要介绍我们的
梯度下降法
。
三、梯度下降法
必须掌握的方法,不单单是线性回归会用,后面的逻辑回归,深度学习都需要使用梯度下降法
我们的神经网络有一个反向传播算法,就是需要梯度下降法来进行神经网络参数更新,让神经网络学习到数据中的东西,使其具有泛化能力
- 通过上图就可以想象梯度下降的原理
- 假设我们在山上,四周环境我们看不清任何东西,只能通过身体去感知
- 所以我们朝自身四周摸索,感知山体的坡度,如果某个方向的坡度是向下的,并且也是最陡峭的,那就是我们要走到的下一个位置
- 一步又一步,依次类推,直到我们到达山底
和穷举法有什么区别?梯度下降是有方向的,穷举法可能会向上走。
因此也引出了梯度下降法的核心,
方向和步幅
,步子不能太大,可能直接就越过了最低点,导致无法找到最低点。
梯度下降法参数更新公式 |
---|
w n e w = w l a s t − a ∂ J ( w ) ∂ w w_{new} = w_{last}-a\dfrac{\partial J(w)}{\partial w} wnew=wlast−a∂w∂J(w)
w l a s t 是上一次更新结果 w_{last}是上一次更新结果 wlast是上一次更新结果,所以初始的时候我们要人为设定一个w作为更新的起始依据
- 为什么叫梯度呢?其实梯度就是我们的导数
- 但是我们求导的方向是从左向右的斜率,而上图中,我们的梯度是从右向左的斜率
- 因此公式中有一个负号,让我们导数的方向反过来
- 而公式中的
a就是步幅
的意思- 所以这个公式并不复杂,就是不断更新梯度,直到梯度开始变大,或者为0,就找到了最小点
- 如果有多个参数就把上面公式中的w换一下即可,例如有参数 w a , w b w_a,w_b wa,wb,就将参数依次代入上面公式中w的位置
- 包括偏置b也可以,因为J(b)中本来就应该是包含b的,只不过我们为了讲解方便将其化简了而已
一个小案例 |
---|
- 现有损失函数 J ( w ) = 4 w 2 J(w)=4w^2 J(w)=4w2
- 首先需要随机初始化w,假设w=4,同时设定学习率为0.1。
w 0 = 4 , a = 0.1 , w_0=4,a=0.1, w0=4,a=0.1,损失函数导数为: ∂ J ( w ) ∂ w = 8 w \dfrac{\partial J(w)}{\partial w}=8w ∂w∂J(w)=8w
- 第一次w更新过程:
{ w 1 = w 0 − 0.1 × ∂ J ( w ) ∂ w = 4 − 0.1 × 8 × 4 = 0.8 \begin{cases} w_1=w_0 - 0.1 × \dfrac{\partial J(w)}{\partial w}\\\\ =4-0.1 × 8 × 4 = 0.8 \end{cases} ⎩ ⎨ ⎧w1=w0−0.1×∂w∂J(w)=4−0.1×8×4=0.8- 接下来的更新过程
{ w 2 = 0.8 − 0.1 × 8 × 0.8 = 0.16 w 3 = 0.16 − 0.1 × 8 × 0.16 = 0.032 w 4 = 0.032 − 0.1 × 8 × 0.032 = 0.0064 \begin{cases} w_2 = 0.8 - 0.1 × 8 × 0.8 = 0.16\\\\ w_3 = 0.16 - 0.1 × 8 × 0.16 = 0.032\\\\ w_4 = 0.032 - 0.1 × 8 × 0.032 = 0.0064\\\\ \end{cases} ⎩ ⎨ ⎧w2=0.8−0.1×8×0.8=0.16w3=0.16−0.1×8×0.16=0.032w4=0.032−0.1×8×0.032=0.0064- 以上就是我们的计算过程
我们也说过步长a不能设置太大或太小,太大的话会错过最小值导致永远找不到,而太小会过于浪费算力资源。例如a = 0.5
{ w 0 = 4 w 1 = 4 − 0.5 × 8 × 4 = − 12 w 2 = − 12 − 0.5 × 8 × − 12 = 32 w 3 = 32 − 0.5 × 8 × 32 = 96 \begin{cases} w_0 = 4\\\\ w_1 = 4 - 0.5 × 8 × 4 = -12\\\\ w_2 = -12 - 0.5 × 8 × -12 = 32\\\\ w_3 = 32 - 0.5 × 8 × 32 = 96\\\\ \end{cases} ⎩ ⎨ ⎧w0=4w1=4−0.5×8×4=−12w2=−12−0.5×8×−12=32w3=32−0.5×8×32=96
再次拿出小明考试的例子 |
---|
- 这里每次计算的梯度,是所有的数据的对应的梯度的平均值
∂ J ( w ) ∂ w = 1 m ∂ ∑ i = 1 m ( f ( x i ) − y i ) 2 ∂ w \dfrac{\partial J(w)}{\partial w}=\dfrac{1}{m}\dfrac{\partial \sum_{i=1}^m (f(x_i)-y_i)^2}{\partial w} ∂w∂J(w)=m1∂w∂∑i=1m(f(xi)−yi)2
- 假设初始w=4,设定学习率(步幅)为0.01
{ w 0 = 4 w 1 = 4 − 0.01 × 1 m ∂ J ( w ) ∂ w = 3.813 w 2 = 3.644 w 3 = 3.490 ⋮ w 99 = 2.000111 \begin{cases} w_0 = 4\\\\ w_1 = 4 - 0.01 × \dfrac{1}{m} \dfrac{\partial J(w)}{\partial w} =3.813\\\\ w_2 = 3.644\\\\ w_3 = 3.490\\ \vdots \\ w_{99} = 2.000111 \end{cases} ⎩ ⎨ ⎧w0=4w1=4−0.01×m1∂w∂J(w)=3.813w2=3.644w3=3.490⋮w99=2.000111
多参数求解 |
---|
还是一样的,对每个参数求偏导即可,其它参数看作常数
四、代码实现
完整代码放在了文章末尾
因为线性回归比较简单,用的也不多,所以还是用小明的例子简单实现一下得了。重要的是了解整个实现逻辑和步骤
- 准备数据,没有数据支撑,再好的模型算法也训练不出来
- 建模型: f ( x ) = w x + b f(x) = wx+b f(x)=wx+b,为了方便省略b
- 定义损失函数: J ( x ) = 1 2 m ∑ i = 1 m ( f ( x i ) − y i ) 2 J(x)=\dfrac{1}{2m}\sum_{i=1}^m(f(x_i)-y_i)^2 J(x)=2m1∑i=1m(f(xi)−yi)2,因为计算机帮我们求导,所以代码中省略了前面的 1 2 \dfrac{1}{2} 21,因为它是为了我们手算方便求导的
代码中的costValue
+=
,就是上面公式中的 ∑ i = 1 m \sum_{i=1}^m ∑i=1m,一定不
要写成costValue=
- 梯度求导:因为是多组数据,记住累加和求平均值 ∂ J ( w ) ∂ w = 1 m ∂ ∑ i = 1 m ( f ( x i ) − y i ) 2 ∂ w \dfrac{\partial J(w)}{\partial w}=\dfrac{1}{m}\dfrac{\partial \sum_{i=1}^m (f(x_i)-y_i)^2}{\partial w} ∂w∂J(w)=m1∂w∂∑i=1m(f(xi)−yi)2
单个求导: ∂ L o s s ∂ w = ∂ ( w x − y ) 2 ∂ w = 2 ( w x − y ) x \dfrac{\partial Loss}{\partial w}=\dfrac{\partial (wx-y)^2}{\partial w}=2(wx-y)x ∂w∂Loss=∂w∂(wx−y)2=2(wx−y)x
- 利用梯度更新参数: w n e w = w l a s t − a ∂ J ( w ) ∂ w w_{new} = w_{last}-a\dfrac{\partial J(w)}{\partial w} wnew=wlast−a∂w∂J(w)
- 设置训练轮次开始训练
- 最终通过训练,获得到的更新完成的参数,利用它进行推理预测
可见只训练100次时,精度已经解决了正确答案,那么1000次呢?但也要注意过拟合的问题
# _*_ coding : utf-8 _*_
# @Time : 2024/11/23 星期六 11:56
# @Author : Taylor Sinclair(殷志鹏)
# @File : xiaoming
# @Project : deepLearning
# @Description : 一个预测小明学习时长,最终考试得多少分的例子
'''导包(start)'''
'''导包(end)'''
''' 1. 定义数据集(start)'''
# 数据特征
x_data = [1,2,3]
# 数据标签(就是答案)
y_data = [2,4,6]
# 初始化参数w(权重),梯度下降,必须指定最初的w,注意w是不断变化的
w = 4
''' 1. 定义数据集(end)'''
''' 2. 建模型(start)'''
# 定义线性回归模型, 就是wx+b,但是为了简单,我们省略了b,注意w是不断变化的
def linearRegression(x,w):
return x * w
''' 2. 建模型(end)'''
''' 3. 损失函数(start)'''
# 定义损失函数,获取多组数据最终的损失值,注意w是不断变化的
def cost(x_data,y_data,w):
costValue = 0 # 损失初始值为0
for x,y in zip(x_data,y_data): # 依次取出x和y
linearRegressionFun = linearRegression(x,w) # 获取线性回归模型,也就是我们的f(x)
# 单个损失值:loss = (f(x)-y)^2 = (wx-y)^2。但是多组数据要算累加
costValue += (linearRegressionFun - y) ** 2 # 因为是计算机帮我们求导,所以前面不定义1/2,也就是省略前面那个二分之一
# 记住,我们不是只有一组数据,我们是有m组数据的,所以loss是m组数据求和,最后要除以m求平均值
return costValue / len(x_data)
''' 3. 损失函数(end)'''
''' 4. 梯度求导(start)'''
# 对loss函数求导,就是梯度,注意w是不断变化的
def gradient(x_data,y_data,w):
grad = 0 # 初始为0
for x,y in zip(x_data,y_data):
grad += 2 * x * (x * w - y) # 对每组数据的loss求导,累加
return grad / len(x_data) # 累加后,返回平均值
''' 4. 梯度求导(end)'''
''' 5. 利用梯度更新参数(start)'''
# w权重,注意w是不断变化的,times训练次数,a是步幅
def gradientUpdate(x_data,y_data,w,times=100,a=0.01):
for epoch in range(times):# 训练times次
costValue = cost(x_data,y_data,w) # 获取w更新后的,新的loss值
gradientValue = gradient(x_data,y_data,w) #获取w更新后的,新的梯度
w = w - a * gradientValue # 更新w
print('训练轮次:',epoch,",w=",w,",loss:",costValue,",grad:",gradientValue)
return w
''' 5. 利用梯度更新参数(end)'''
if __name__ == '__main__':
''' 6. 设置训练轮次开始训练(start)'''
w = gradientUpdate(x_data,y_data,w,times=1000,a=0.01)
''' 6. 设置训练轮次开始训练(end)'''
''' 7. 最终通过训练,获得到的更新完成的参数,利用它进行推理预测(start)'''
x = 4
print("小明每日学习",x,"小时:","预测考试成绩为:",linearRegression(x,w))
''' 7. 最终通过训练,获得到的更新完成的参数,利用它进行推理预测(end)'''