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

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

机器学习中的搜索算法


本节知识导图

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


相关文章
|
5天前
|
算法
【算法】二分算法——搜索插入位置
【算法】二分算法——搜索插入位置
|
2天前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】机器学习的基本概念、算法的工作原理、实际应用案例
机器学习是人工智能的一个分支,它使计算机能够在没有明确编程的情况下从数据中学习并改进其性能。机器学习的目标是让计算机自动学习模式和规律,从而能够对未知数据做出预测或决策。
7 2
|
10天前
|
机器学习/深度学习 算法 文件存储
【博士每天一篇文献-算法】 PNN网络启发的神经网络结构搜索算法Progressive neural architecture search
本文提出了一种名为渐进式神经架构搜索(Progressive Neural Architecture Search, PNAS)的方法,它使用顺序模型优化策略和替代模型来逐步搜索并优化卷积神经网络结构,从而提高了搜索效率并减少了训练成本。
20 9
|
5天前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
12天前
|
机器学习/深度学习 人工智能 算法
【数据挖掘】2022年2023届秋招奇虎360机器学习算法工程师 笔试题
本文提供了奇虎360公司2022年秋招机器学习算法工程师岗位的笔试题内容,包括选择题和编程题,涉及概率统计、数据结构、机器学习、计算机组成原理等多个领域。
39 5
|
9天前
|
机器学习/深度学习 数据采集 人工智能
理解并应用机器学习算法:从技术基础到实践应用
【8月更文挑战第10天】机器学习算法的应用已经深入到我们生活的方方面面,理解和掌握机器学习算法对于数据科学家、工程师乃至普通从业者来说都至关重要。通过本文的介绍,希望大家能够对机器学习有一个基本的认识,并学会如何将其应用于实际问题中。当然,机器学习是一个不断发展和演变的领域,只有不断学习和实践,才能跟上时代的步伐。
|
12天前
|
机器学习/深度学习 自然语言处理 算法
利用机器学习算法进行自动化测试
利用机器学习算法进行自动化测试
|
13天前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
67 2
|
5天前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介
|
12天前
|
机器学习/深度学习 数据采集 数据可视化
基于机器学习的一线城市租房价格预测分析与实现,实现三种算法预测
本文通过数据采集、处理、特征选择和机器学习建模,对一线城市租房价格进行预测分析,比较了随机森林、一元线性回归和多元线性回归模型,并发现随机森林模型在预测租房价格方面表现最佳,为租房市场参与者提供决策支持。

热门文章

最新文章