【ML】 李宏毅机器学习一:Regression、Gradient Descent(python实现)

我的GitHub地址:https://github.com/taw19960426/DeepLearning存放与之对应的python代码

1.Regression

1.1 Introduction

  • Machine Learning: define a set of function, goodness of function, pick the best function
  • 选不同的function 其实就是选不同的model,model里面最简单的就是linear model;此外还有很多nonlinear model,如deep learning, SVM, decision tree, kNN… 以上都是supervised learning - 需要搜集很多training data
  • 回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。回归问题通常是用来预测一个值,如预测房价、未来的天气情况等等。

1.2 Step

  • Step1:
    Model: y = b + w x c p y=b+w x_{c p} y=b+wxcp
    -w和b是参数,w:权重,b:偏差
    线性模型: y = b + ∑ w i x i y=b+\sum w_{i} x_{i} y=b+wixi

  • Step2:Goodness of Function
    Goodness of Function - -损失函数L:input is a function, output is how bad it is (损失函数)。
    损失函数的第一版: L ( w , b ) = ∑ ( y ^ n − ( b + w x c p n ) ) 2 L(w, b)=\sum\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2} L(w,b)=(y^n(b+wxcpn))2

  • Step3: Best Function
    w ∗ b ∗ = arg ⁡ min ⁡ w , b L ( w , b ) = arg ⁡ min ⁡ w , b ∑ ( y ^ n − ( b + w x c p n ) ) 2 w^{*} b^{*}=\arg \min _{w, b} L(w, b)=\arg \min _{w, b} \sum\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2} wb=argw,bminL(w,b)=argw,bmin(y^n(b+wxcpn))2

1.3 Regularization (正则化)

  • y = b + ∑ w i x i y=b+\sum w_{i} x_{i} y=b+wixi

  • L = ∑ n ( y ^ n − ( b + ∑ w i x i ) ) 2 + λ ( w i ) 2 L=\sum_{n}\left(\hat{y}^{n}-\left(b+\sum w_{i} x_{i}\right)\right)^{2}+\lambda\left(w_{i}\right)^{2} L=n(y^n(b+wixi))2+λ(wi)2

  • 不但要选择一个loss小的function,还要选择一个平滑的function(正则化使函数更平滑, 因为w比较小)

  • λ \lambda λ大,找出来的function就比较smooth。反之,找出来的则不太smooth. 在由小到大变化的过程中,函数不止要考虑loss最小化还要考虑weights最小化,所以对training error最小化的考虑就会相对(于没有正则化的时候)减小,因此training error会随着增大而增大。test error则先减小再增大。

2.Gradient Descent (梯度下降法)

梯度下降法 - 只要loss func对与它的参数是可微分的就可以用,不需要一定是线性方程

2.1 总体思想

  • 选择一个初始值 w 0 w^{0} w0 ;-计算 d L d w ∣ w = w 0 \left.\frac{d L}{d w}\right|_{w=w^{0}} dwdLw=w0 , w 1 ← w 0 − η d L d w ∣ w = w 0 w 1 \leftarrow w^{0}-\left.\eta \frac{d L}{d w}\right|_{w=w^{0}} w1w0ηdwdLw=w0 η \eta η学习率 。继续此步骤,直到找到等于零的梯度。
  • 对于两个参数: w ∗ , b ∗ w^{*}, b^{*} w,b; -选择初始值: w 0 , b 0 w_{0}, b_{0} w0,b0 ;
  • 计算
    ∂ L ∂ w ∣ w = w 0 , b = b 0 , ∂ L ∂ b ∣ w = w 0 , b = b 0 \left.\frac{\partial L}{\partial w}\right|_{w=w_{0}, b=b_{0}},\left.\frac{\partial L}{\partial b}\right|_{w=w_{0}, b=b_{0}} wLw=w0,b=b0,bLw=w0,b=b0
    w 1 ← w 0 − η ∂ L ∂ w ∣ w = w 0 , b = b 0 w^{1} \leftarrow w^{0}-\left.\eta \frac{\partial L}{\partial w}\right|_{w=w^{0}, b=b^{0}} w1w0ηwLw=w0,b=b0
    b 1 ← b 0 − η ∂ L ∂ b ∣ w = w 0 , b = b 0 b^{1} \leftarrow b^{0}-\left.\eta \frac{\partial L}{\partial b}\right|_{w=w^{0}, b=b^{0}} b1b0ηbLw=w0,b=b0
    继续此步骤,直到找到等于零的坡度。
  • 以上方法得出来的结果满足:
    θ ∗ = arg ⁡ min ⁡ θ L ( θ ) \theta^{*}=\arg \min _{\theta} L(\theta) θ=argθminL(θ)

2.2 线性回归-梯度下降公式摘要:

L ( w , b ) = ∑ n = 1 10 ( y ^ n − ( b + w x c p n ) ) 2 ∂ L ∂ w = ∑ n = 1 10 2 ( y ^ n − ( b + w x c p n ) ) ( − x c p n ) ∂ L ∂ b = ∑ n = 1 10 2 ( y ^ n − ( b + w x c p n ) ) ( − 1 ) \begin{array}{l}{L(w, b)=\sum_{n=1}^{10}\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2}} \\\\ {\frac{\partial L}{\partial w}=\sum_{n=1}^{10} 2\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)\left(-x_{c p}^{n}\right)} \\ \\{\frac{\partial L}{\partial b}=\sum_{n=1}^{10} 2\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)(-1)}\end{array} L(w,b)=n=110(y^n(b+wxcpn))2wL=n=1102(y^n(b+wxcpn))(xcpn)bL=n=1102(y^n(b+wxcpn))(1)

2.3 设置learning rate:

  • 假设 θ \theta θ有两个变量 θ 1 , θ 2 \theta_{1}, \theta_{2} θ1,θ2 , 则:
    θ 0 = [ θ 1 0 θ 2 0 ] , θ 1 = θ 0 − η ∇ L ( θ 0 ) \theta^{0}=\left[\begin{array}{l}{\theta_{1}^{0}} \\ {\theta_{2}^{0}}\end{array}\right], \quad \theta^{1}=\theta^{0}-\eta \nabla L\left(\theta^{0}\right) θ0=[θ10θ20],θ1=θ0ηL(θ0)
    [ θ 1 1 θ 2 1 ] = [ θ 1 0 θ 2 0 ] − η [ ∂ L ( θ 1 0 ) / ∂ θ 1 ∂ L ( θ 2 0 ) / ∂ θ 2 ] \left[\begin{array}{c}{\theta_{1}^{1}} \\ {\theta_{2}^{1}}\end{array}\right]=\left[\begin{array}{c}{\theta_{1}^{0}} \\ {\theta_{2}^{0}}\end{array}\right]-\eta\left[\begin{array}{c}{\partial L\left(\theta_{1}^{0}\right) / \partial \theta_{1}} \\ {\partial L\left(\theta_{2}^{0}\right) / \partial \theta_{2}}\end{array}\right] [θ11θ21]=[θ10θ20]η[L(θ10)/θ1L(θ20)/θ2]
    这里:
    ∇ L ( θ ) = [ ∂ L ( θ 1 ) / ∂ θ 1 ∂ L ( θ 2 ) / ∂ θ 2 ] \nabla L(\theta)=\left[\begin{array}{l}{\partial L\left(\theta_{1}\right) / \partial \theta_{1}} \\ {\partial L\left(\theta_{2}\right) / \partial \theta_{2}}\end{array}\right] L(θ)=[L(θ1)/θ1L(θ2)/θ2]

  • 可以绘制loss vs. No. of parameters updates(同一个循环的参数迭代次数)的曲线,观察变化趋势;

  • 每隔几个时期将学习率降低一些因子,例如: η t = η / t + 1 \eta^{t}=\eta / \sqrt{t+1} ηt=η/t+1

  • 为不同的参数提供不同的学习率-Adagrad-将每个参数的学习率除以其先前导数的均方根
    w 1 ← w 0 − η 0 σ 0 g 0     σ 0 = ( g 0 ) 2 w 2 ← w 1 − η 1 σ 1 g 1     σ 1 = 1 2 [ ( g 0 ) 2 + ( g 1 ) 2 ] w 3 ← w 2 − η 2 σ 2 g 2     σ 2 = 1 3 [ ( g 0 ) 2 + ( g 1 ) 2 + ( g 2 ) 2 ] w t + 1 ← w t − η t σ t g t     σ t = 1 t + 1 ∑ i = 0 t ( g i ) 2 \begin{aligned} w^{1} \leftarrow w^{0}-\frac{\eta^{0}}{\sigma^{0}} g^{0} &   \sigma^{0}=\sqrt{\left(g^{0}\right)^{2}} \\ w^{2} \leftarrow w^{1}-\frac{\eta^{1}}{\sigma^{1}} g^{1} &   \sigma^{1}=\sqrt{\frac{1}{2}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}\right]} \\ w^{3} \leftarrow w^{2}-\frac{\eta^{2}}{\sigma^{2}} g^{2} &   \sigma^{2}=\sqrt{\frac{1}{3}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}+\left(g^{2}\right)^{2}\right]} \\ & \quad \quad \quad \quad \quad \\ w^{t+1} \leftarrow w^{t}-\frac{\eta^{t}}{\sigma^{t}} g^{t} &   \sigma^{t}=\sqrt{\frac{1}{t+1} \sum_{i=0}^{t}\left(g^{i}\right)^{2}} \end{aligned} w1w0σ0η0g0w2w1σ1η1g1w3w2σ2η2g2wt+1wtσtηtgt  σ0=(g0)2   σ1=21[(g0)2+(g1)2]   σ2=31[(g0)2+(g1)2+(g2)2]   σt=t+11i=0t(gi)2
    η t / σ t \eta^{t} / \sigma^{t} ηt/σt可以消除…然后涉及以下形式:
    w t + 1 ← w t − η ∑ i = 0 t ( g i ) 2 g t w^{t+1} \leftarrow w^{t}-\frac{\eta}{\sqrt{\sum_{i=0}^{t}\left(g^{i}\right)^{2}}} g^{t} wt+1wti=0t(gi)2 ηgt
    g t = ∂ L ( θ t ) ∂ w g^{t}=\frac{\partial L\left(\theta^{t}\right)}{\partial w} gt=wL(θt)为当下的梯度值(偏微分) - 造成反差效果

3 python代码实现

我的GitHub地址:https://github.com/taw19960426/DeepLearning

3.1 GradientDescent01.py

import numpy as np
import matplotlib.pyplot as plt  # plt

#相当于x^n和y^n所对应的cp值
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633, 619, 393, 428, 27, 193, 66, 226, 1591]

#准备三维函数及待投影平面的网格坐标
x = np.arange(-200, -100, 1)  # bias
y = np.arange(-5, 5, 0.1)  # weight
Z = np.zeros((len(x), len(y)))
X, Y = np.meshgrid(x, y)
#[X,Y] = meshgrid(x,y) 将向量x和y定义的区域转换成矩阵X和Y,
# 其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制
for i in range(len(x)):
    for j in range(len(y)):
        b = x[i]
        w = y[j]
        Z[j][i] = 0
        for n in range(len(x_data)):
            Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2
        Z[j][i] = Z[j][i] / len(x_data)

# yadata = b + w*xdata
b = -120  # intial b
w = -4  # intial w
lr = 0.0000001  # 学习率
iteration = 100000#迭代次数

#存储绘图的初始值
b_history = [b]
w_history = [w]

# iterations
for i in range(iteration):

    b_grad = 0.0
    w_grad = 0.0
    #L(w,b)对b,w分别求导
    for n in range(len(x_data)):
        b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0
        w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]

    #更新参数相当于第一代版本的W^(t+1)=W^t-(lr)^t*g^t
    b = b - lr * b_grad
    w = w - lr * w_grad

    # 存储绘图参数
    b_history.append(b)
    w_history.append(w)

# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
''' contourf() 函数为等高线图填充颜色.
x:指定 X 轴数据。
y:指定 Y 轴数据。
z:指定 X、Y 坐标对应点的高度数据。
colors:指定不同高度的等高线的颜色。
alpha:指定等高线的透明度。
cmap:指定等高线的颜色映射,即自动使用不同的颜色来区分不同的高度区域。
linewidths:指定等高线的宽度。
linestyles:指定等高线的样式'''
plt.plot([-188.4], [2.67], 'x', ms=6, markeredgewidth=3, color='orange')
# ms和marker分别代表指定点的长度和宽度。
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()

结果显示:
【ML】 李宏毅机器学习一:Regression、Gradient Descent(python实现)_第1张图片

3.2 GradientDescent02.py

对 b 和 w 给予克制化的Learning Rate:

学习率 lr 改为 1,lr_b = 0 / lr_w = 0 ;
对b、w定制化的学习率lr,采用Adagard

b = b - lr / np.sqrt(lr_b) * b_grad ; w = w - lr / np.sqrt(lr_w) * w_grad

import numpy as np
import matplotlib.pyplot as plt  # plt

#相当于x^n和y^n所对应的cp值
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633, 619, 393, 428, 27, 193, 66, 226, 1591]

#准备三维函数及待投影平面的网格坐标
x = np.arange(-200, -100, 1)  # bias
y = np.arange(-5, 5, 0.1)  # weight
Z = np.zeros((len(x), len(y)))
X, Y = np.meshgrid(x, y)
#[X,Y] = meshgrid(x,y) 将向量x和y定义的区域转换成矩阵X和Y,
# 其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制
for i in range(len(x)):
    for j in range(len(y)):
        b = x[i]
        w = y[j]
        Z[j][i] = 0
        for n in range(len(x_data)):
            Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2
        Z[j][i] = Z[j][i] / len(x_data)

# yadata = b + w*xdata
b = -120  # intial b
w = -4  # intial w
lr = 1  # 学习率
iteration = 100000#迭代次数

#存储绘图的初始值
b_history = [b]
w_history = [w]

#对w,b分别定义学习率,初始化
lr_b=0
lr_w=0

# iterations
for i in range(iteration):

    b_grad = 0.0
    w_grad = 0.0
    #L(w,b)对b,w分别求导
    for n in range(len(x_data)):
        b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0
        w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]

    ''' 
    #更新参数相当于第一代版本的W^(t+1)=W^t-(lr)^t*g^t
    b = b - lr * b_grad
    w = w - lr * w_grad'''
    # 对w,b分别赋予不同的学习率lr
    # 更新参数相当于第二代版本,加入反差效果,反映二次微分
    lr_b=lr_b+b_grad**2
    lr_w=lr_w+w_grad**2

    #对b、w定制化的学习率lr,采用Adagard
    b=b-lr/np.sqrt(lr_b)*b_grad
    w=w-lr/np.sqrt(lr_w)*w_grad

    # 存储绘图参数
    b_history.append(b)
    w_history.append(w)

# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
''' contourf() 函数为等高线图填充颜色.
x:指定 X 轴数据。
y:指定 Y 轴数据。
z:指定 X、Y 坐标对应点的高度数据。
colors:指定不同高度的等高线的颜色。
alpha:指定等高线的透明度。
cmap:指定等高线的颜色映射,即自动使用不同的颜色来区分不同的高度区域。
linewidths:指定等高线的宽度。
linestyles:指定等高线的样式'''
plt.plot([-188.4], [2.67], 'x', ms=6, markeredgewidth=3, color='orange')
# ms和marker分别代表指定点的长度和宽度。
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()

结果显示:
【ML】 李宏毅机器学习一:Regression、Gradient Descent(python实现)_第2张图片

参考文章:

  1. https://blog.csdn.net/xzy_thu/article/details/67640512
  2. https://blog.csdn.net/u013541048/article/details/81335256
  3. https://blog.csdn.net/wills798/article/details/80401771
  4. https://www.jianshu.com/p/994dec1bb90c

你可能感兴趣的:(python,深度学习,机器学习,Gradient,Descent,梯度下降,李宏毅机器学习)