【机器学习】搜索算法(梯度,随机梯度,次梯度,小批量,坐标下降)

简介: 【机器学习】搜索算法(梯度,随机梯度,次梯度,小批量,坐标下降)

机器学习中的搜索算法


本节知识导图

4f3a83294cbf2258e4b4bc104bf833a3_07ee92cb2ea648d8ae9d609b7872d519.png


预先需要了解:

a9acdc4128fc3289cc13e31da6aaf87c_656717f2b20f431bb62e7b49d67d5337.png


  • 凸函数优化:局部最优解一定是全局最优解

凸函数:由上图来看,凸函数的几何意义在于,定义域中任意两点连线组成的线段都在这两点的函数曲线(面)上方。


c2ed8d679cdedb8674e3bc3789c41209_31a061dffa7e4781bb5e1a1e62fd0a19.png


  • 非凸函数优化:局部最优解不一定是全局最优解

梯度下降算法


算法思想


从线性回归问题了解算法思想:


image.png

3c6086e729ee433a4a31772d18bd7d6c_bb72d27038ef44359e402e2a0a9348e1.png

按照线性回归的解题思路是:

image.png

按照梯度下降的解题思路是:

image.png

总结梯度下降思路:

  1. 梯度下降算法从空间中任一给定初始点开始进行指定轮数的搜索。
  2. 在每一轮搜索中都计算目标函数在当前点的梯度,并沿着与梯度相反的方向按照一定步长移动到下一可行点

8f61e5084995d4fdc230233d34a8199d_92f577c5f64e4734b3dc4f82b3432fae.png

目标函数要求:

  1. 目标函数可微
  2. 目标函数必须是凸函数或者强凸函数

脱离线性回归问题,将梯度下降算法步骤抽象出来就是这样:

c003132abda2956275bbd37a2646c660_76c3e1f1e4c3489e8d511d08d414f347.png


随机梯度下降


按照梯度下降的解题思路是

image.png

特点:

image.png


按照随机梯度下降的解题思路是:

image.png

image.png


脱离线性回归问题,将随机梯度下降算法步骤抽象出来就是这样:

cb5ce21a6dce90dcf6b526aadab8695f_011bc60ea42144979f0925e3292d4007.png

特点:

image.png

对于随机梯度和梯度计算的梯度数据量问题:

简单来说是梯度下降每次循环计算的是这个式子的梯度

a2feed9221ed935cc6d3b5e3350e19cd_16cd073f8f86478cbc6072e6feb2dfcc.png

随机梯度下降是这个式子的梯度

5b76cbec926e08a33adc5e4fb39157cd_437b3c9f91f94f3895b5bc270bc1d181.png


例子:随机梯度下降和梯度下降的比较


例4.7 :

 用Sklearn工具库中的make_regression函数来随机生成一个线性回归问题。

 分别采用梯度下降与随机梯度下降算法求解回归问题。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_regression
class LinearRegressionSGD:
    def __init__(self):
        self.w = None
    def fit(self, X, y, eta_0=10, eta_1=50, N=1000):
        m, n = X.shape
        w = np.zeros((n, 1))
        self.w = w
        W = np.zeros((N, 2))
        for t in range(N):
            W[t][0] = w[0]
            W[t][1] = w[1]
            i = np.random.randint(m)
            x = X[i].reshape(1, -1)  # 这里使用 (1,-1) 表示将数组重塑为1行,第二维的长度自动计算得出。将结果赋值给变量 x
            e = x.dot(w) - y[i]
            gradient = 2 * e * x.T
            w = w - eta_0 * gradient / (t + eta_1)
            self.w += w
        self.w /= N
        plt.figure(0)
        plt.scatter(W[:, 0], W[:, 1], s=15)
        plt.plot(W[:, 0], W[:, 1])
    def predict(self, X):
        return X.dot(self.w)
class LinearRegression:
    def __init__(self):
        self.w = None
    def fit(self, X, y, eta, N=1000):
        m, n = X.shape
        w = np.zeros((n, 1))
        W = np.zeros((N, 2))
        for t in range(N):
            W[t][0] = w[0]
            W[t][1] = w[1]
            e = X.dot(w) - y
            g = 2 * X.T.dot(e) / m
            w = w - eta * g
        self.w = w
        plt.scatter(W[:, 0], W[:, 1], s=15)
        plt.plot(W[:, 0], W[:, 1])
    def predict(self, X):
        return X.dot(self.w)
X, y = make_regression(n_samples=100, n_features=2, noise=0.1, bias=0, random_state=0)
y = y.reshape(-1, 1)
model = LinearRegression()
model.fit(X, y, eta=0.01, N=1000)
print(model.w)
model = LinearRegressionSGD()
model.fit(X, y, eta_0=10, eta_1=50, N=1000)
print(model.w)
plt.show()

f84314fcdae7ed2ef7838daab1dcd47a_04087b24b1c947d28f5df7513875e44a.png

b41616596e631bd43849d2e4a9a595a0_3a3edfef46304cbfb3005d9e7bca79dc.png


次梯度下降算法


  • 当目标函数不可微的时候,需要将梯度的概念推广到次梯度

次梯度(subgradient)是凸优化中的一个概念。在凸优化中,次梯度是对于非光滑凸函数的梯度的一种泛化。对于一个非光滑且凸的函数f(x),如果 x 是f(x) 的极小值点,那么就必须满足0∈∂f(x)。其中∂f(x) 为f(x) 在点 x 处的次梯度集合,它可以被定义为一个包含所有可能的子梯度的集合。

 对于一个可微的函数,其梯度就是唯一的,但是对于一个非光滑的凸函数,其梯度并不唯一,因为它在某些点上可能是不可导的。在这种情况下,次梯度的概念就派上用场了。次梯度可以被看作是梯度的一个推广,它允许我们在非光滑凸函数上进行优化。


次梯度的概念


次梯度定义:

image.png


定理:

image.png


f385a9fc57fbc7b69049b1525990b29c_1f8ae6cd55a84896add455cf68f8b743.png

b2b110ecc76624f0618ed387ebb22ba1_04dbe96b44d448628d3497eebe516d3e.png


举例: Lasso回归优化算法


定义(Lasso回归):

image.png

那么,从目标函数可以看出:

4c6ace93b8eb9404fe83e8969d97c5c5_b8eebf9f090e4e11bb87c8f35e826c2b.png

次梯度下降算法是适合于求解Lasso回归的优化算法

28dd8c678d2e3ea53ea307e78aa85268_7ff07ca9aa414557b21b8aeca363da07.png


8dcc4a0ea59ba3411a355001c8e05d15_940cc6c3e261490a919b4cb40b4cfa6c.png

# Lasso回归优化算法
import numpy as np
 class Lasso:
  def __init__(self, Lambda=1): #L1正则化系数λ
    self.Lambda = Lambda
  def fit(self, X, y, eta=0.1, N=1000):
    m,n = X.shape
    w = np.zeros((n,1))
    self.w = w
    for t in range(N):
      e = X.dot(w) - y
      v = 2 * X.T.dot(e) / m + self.Lambda * np.sign(w) # λ|w|的次梯度
      w = w - eta * v
      self.w += w
    self.w /= N #w取平均值
  def predict(self, X):
    return X.dot(self.w)


小梯度下降算法


 小批量梯度下降(Mini-batch Gradient Descent)是介于批量梯度下降和随机梯度下降之间的一种优化算法。它的思想是将训练数据划分成若干个小的批次,每个批次包含m个样本,然后对每个批次进行梯度下降更新参数。相比于批量梯度下降,小批量梯度下降可以减少计算量,加速收敛,并且相对于随机梯度下降,可以更好地利用GPU的并行计算能力。

 因此,小批量梯度下降是两者之间的一种平衡方案,具有较快的收敛速度和更好的收敛性能。


抽象出来,解题过程:

31d8f75ff2ab9a6ff3d6f17191183dca_26607c63ce6248d48e643a983dd2f40a.png


### 示例:线性回归的小批量梯度下降算法

import numpy as np
 class LinearRegression:
  def fit(self, X, y, eta_0=10, eta_1=50, N=3000, B=10):
    m, n = X.shape
    w = np.zeros((n,1))
    self.w = w
    for t in range(N):
      batch = np.random.randint(low=0, high=m, size=B)
      X_batch = X[batch].reshape(B,-1)
      y_batch = y[batch].reshape(B,-1)
      e = X_batch.dot(w) - y_batch
      g = 2 * X_batch.T.dot(e) / B
      w = w - eta_0 * g / (t + eta_1)
      self.w += w
    self.w /= N
def predict(self, X):
  return X.dot(self.w


坐标下降算法


坐标下降算法优于梯度下降算法的两个场合:


梯度不存在或梯度函数较为复杂难以计算;

需要求解带约束的优化问题


坐标下降算法的搜索过程:


每一步选取一个要调整的坐标分量,且固定参数的其它各分量的值。然着

沿着选取分量的坐标轴方向移动,到达该方向上目标函数值最小的那个点。

如此循环,使用不同的坐标方向,直至沿任何一个坐标移动都无法降低目标函数值为止。


一般情况:

image.png

抽象出来,解题过程:

74cbf79fcdcb4b64cceb67f3b62fe1e2_75c462a8279743e28aa730a668591e4e.png



例题:考察二元函数


9e6476e13841b1dbc554c87e6d6b6e7c_dfb57c6610db4b3f9add016e28ea9709.png

53ed92ee18fb4e7c659e068b74295ff5_c56330555e194fd9897ad198f7f90ef5.png


相关文章
|
12天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
44 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
20天前
|
算法 搜索推荐 数据库
二分搜索:高效的查找算法
【10月更文挑战第29天】通过对二分搜索的深入研究和应用,我们可以不断挖掘其潜力,为各种复杂问题提供高效的解决方案。相信在未来的科技发展中,二分搜索将继续发挥着重要的作用,为我们的生活和工作带来更多的便利和创新。
32 1
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
24天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
1月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
60 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
1月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
1月前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
22天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
|
1月前
|
算法 决策智能
基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数
该程序基于禁忌搜索算法求解车辆路径问题(VRP),使用MATLAB2022a版本实现,并带有GUI界面。用户可通过界面设置参数并查看结果。禁忌搜索算法通过迭代改进当前解,并利用记忆机制避免陷入局部最优。程序包含初始化、定义邻域结构、设置禁忌列表等步骤,最终输出最优路径和相关数据图表。
下一篇
无影云桌面