机器学习之梯度下降法

机械学习

目录

梯度下降法

参考链接

基本概念

梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解无约束最优化问题最常用的方式,它是一种迭代方式,每一步主要的操作是求解目的函数的梯度向量,将当前位置的负梯度偏向作为搜索偏向(由于在该偏向上目的函数下降最快,这也是最速下降法名称的由来)。

梯度下降,实在就是一个公式:

公式推导

![img](file:///E:\qq聊天记录\1713176942\Image\C2C\2D65DC80FB67F846BD86FE94D6FF8215.jpg)

基本梯度下降步骤

步骤:

η为学习率,ε为收敛条件。梯度下降法属于机械学习,本质为:不停迭代判断是否知足条件,会用到循环语句。

st=>start: 首先设定一个较小的正数m,n;
op=>operation: 求当前位置处的各个偏导数;
修改当前函数的参数值;
cond=>condition: 参数转变量小于n
sub1=>subroutine: 回退迭代
io=>inputoutput: 求得极小值
e=>end: 竣事框
st->op->cond
cond(yes)->io->e
cond(no)->sub1(right)->op

批量梯度下降(BGD)

Batch gradient descent::批量梯度下降算法(BGD),其需要盘算整个训练集的梯度,即:

机器学习之梯度下降法

其中η为学习率,用来控制更新的“力度”/”步长”。

  • 优点:

对于凸目的函数,可以保证全局最优; 对于非凸目的函数,可以保证一个局部最优。

  • 瑕玷:

速率慢; 数据量大时不可行; 无法在线优化(即无法处置动态发生的新样本)。

代码实现

人脸识别学习笔记一:入门篇

#引库
#引入matplotlib库,用于绘图
import matplotlib.pyplot as plt
from math import pow
#图片嵌入jupyter
#matplotlib inline

#为了便于取用数据,我们将数据分为x,y,在直角坐标系中(x,y)是点
x = [1,2,3,4,5,6]
y = [13,14,20,21,25,30]
print("打印初始数据图...")
plt.scatter(x,y)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

#超参数设定
alpha = 0.01#学习率/步长
theta0 = 0#θ0
theta1 = 0#θ1
epsilon = 0.001#误差
m = len(x)

count = 0
loss = []

for time in range(1000):
    count += 1
    #求偏导theta0和theta1的效果
    temp0 = 0#J(θ)对θ0求导的效果
    temp1 = 0#J(θ)对θ1求导的效果
    diss = 0
    for i in range(m):
        temp0 += (theta0+theta1*x[i]-y[i])/m
        temp1 += ((theta0+theta1*x[i]-y[i])/m)*x[i]

    #更新theta0和theta1
    for i in range(m):
        theta0 = theta0 - alpha*((theta0+theta1*x[i]-y[i])/m) 
        theta1 = theta1 - alpha*((theta0+theta1*x[i]-y[i])/m)*x[i]

    #求损失函数J(θ)
    for i in range(m):
        diss = diss + 0.5*(1/m)*pow((theta0+theta1*x[i]-y[i]),2)
    loss.append(diss)

    #看是否知足条件
    '''
    if diss<=epsilon:
        break
    else:
        continue
    '''
print("最终的效果为:")
print("此次迭代次数为:{}次,最终theta0的效果为:{},最终theta1的效果为:{}".format(count,theta0,theta1))
print("展望的最终回归函数为:y={}+{}x\n".format(theta0,theta1))
print("迭代图像绘制...")
plt.scatter(range(count),loss)
plt.show()

运行效果

随机梯度下降(SGD)

Stochastic gradient descent:随机梯度下降算法(SGD),仅盘算某个样本的梯度,即针对某一个训练样本 xi及其label yi更新参数:

机器学习之梯度下降法

逐步减小学习率,SGD显示得同BGD很相似,最后都可以有不错的收敛。

  • 优点:

更新频次快,优化速率更快; 可以在线优化(可以无法处置动态发生的新样本);一定的随机性导致有几率跳出局部最优(随机性来自于用一个样本的梯度去取代整体样本的梯度)。

  • 瑕玷:

随机性可能导致收敛复杂化,纵然到达最优点仍然会举行过分优化,因此SGD得优化历程相比BGD充满动荡。

代码实现

#引库
#引入matplotlib库,用于绘图
import matplotlib.pyplot as plt
from math import pow
import numpy as np
#图片嵌入jupyter
#matplotlib inline

#为了便于取用数据,我们将数据分为x,y,在直角坐标系中(x,y)是点
x = [1,2,3,4,5,6]
y = [13,14,20,21,25,30]
print("打印初始数据图...")
plt.scatter(x,y)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

#超参数设定
alpha = 0.01#学习率/步长
theta0 = 0#θ0
theta1 = 0#θ1
epsilon = 0.001#误差
m = len(x)

count = 0
loss = []

for time in range(1000):
    count += 1
    diss = 0
    #求偏导theta0和theta1的效果
    temp0 = 0#J(θ)对θ0求导的效果
    temp1 = 0#J(θ)对θ1求导的效果
    for i in range(m):
        temp0 += (theta0+theta1*x[i]-y[i])/m
        temp1 += ((theta0+theta1*x[i]-y[i])/m)*x[i]

    #更新theta0和theta1
    for i in range(m):
        theta0 = theta0 - alpha*((theta0+theta1*x[i]-y[i])/m) 
        theta1 = theta1 - alpha*((theta0+theta1*x[i]-y[i])/m)*x[i]

    #求损失函数J(θ)
    rand_i = np.random.randint(0,m)
    diss += 0.5*(1/m)*pow((theta0+theta1*x[rand_i]-y[rand_i]),2)
    loss.append(diss)

    #看是否知足条件
    '''
    if diss<=epsilon:
        break
    else:
        continue
    '''
print("最终的效果为:")
print("此次迭代次数为:{}次,最终theta0的效果为:{},最终theta1的效果为:{}".format(count,theta0,theta1))
print("展望的最终回归函数为:y={}+{}x\n".format(theta0,theta1))
print("迭代图像绘制...")
plt.scatter(range(count),loss)
plt.show()

运行效果

小批量梯度下降(MBGD)

Mini-batch gradient descent:小批量梯度下降算法(MBGD),盘算包罗n个样本的mini-batch的梯度

机器学习之梯度下降法

MBGD是训练神经网络最常用的优化方式。

  • 优点:

参数更新时的动荡变小,收敛历程更稳固,降低收敛难度;可以行使现有的线性代数库高效的盘算多个样本的梯度。

代码实现

#引库
#引入matplotlib库,用于绘图
import matplotlib.pyplot as plt
from math import pow
import numpy as np
#图片嵌入jupyter
#matplotlib inline

#为了便于取用数据,我们将数据分为x,y,在直角坐标系中(x,y)是点
x = [1,2,3,4,5,6]
y = [13,14,20,21,25,30]
print("打印初始数据图...")
plt.scatter(x,y)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

#超参数设定
alpha = 0.01#学习率/步长
theta0 = 0#θ0
theta1 = 0#θ1
epsilon = 0.001#误差
diss = 0#损失函数
m = len(x)

count = 0
loss = []

for time in range(1000):
    count += 1
    diss = 0
    #求偏导theta0和theta1的效果
    temp0 = 0#J(θ)对θ0求导的效果
    temp1 = 0#J(θ)对θ1求导的效果
    for i in range(m):
        temp0 += (theta0+theta1*x[i]-y[i])/m
        temp1 += ((theta0+theta1*x[i]-y[i])/m)*x[i]

    #更新theta0和theta1
    for i in range(m):
        theta0 = theta0 - alpha*((theta0+theta1*x[i]-y[i])/m) 
        theta1 = theta1 - alpha*((theta0+theta1*x[i]-y[i])/m)*x[i]

    #求损失函数J(θ)
    result = []
    for i in range(3):
        rand_i = np.random.randint(0,m)
        result.append(rand_i)
    for j in result:
        diss += 0.5*(1/m)*pow((theta0+theta1*x[j]-y[j]),2)
    loss.append(diss)

    #看是否知足条件
    '''
    if diss<=epsilon:
        break
    else:
        continue
    '''
print("最终的效果为:")
print("此次迭代次数为:{}次,最终theta0的效果为:{},最终theta1的效果为:{}".format(count,theta0,theta1))
print("展望的最终回归函数为:y={}+{}x\n".format(theta0,theta1))
print("迭代图像绘制...")
plt.scatter(range(count),loss)
plt.show()

运行效果

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/22023.html