彻底学会系列:一、机器学习之梯度下降(2)

1 梯度具体是怎么下降的?

在这里插入图片描述

∂ J ( θ ) ∂ θ \frac{\partial J (\theta )}{\partial \theta} θJ(θ)(损失函数:用来衡量模型预测值与真实值之间差异的函数)

对损失函数求导,与学习率相乘,按梯度反方向与 θ n \theta^n θn相减,使 θ n \theta^n θn的值与 y y y目标值的越来越接近,从而得到最优解。最小化损失函数

以下是一些常见的损失函数:

  1. 均方误差(Mean Squared Error,MSE):MSE 是回归问题中常用的损失函数,计算预测值与真实值之间差的平方的均值。

    MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

  2. 交叉熵损失函数(Cross-Entropy Loss):交叉熵通常用于分类问题中,特别是多分类问题。对于二分类问题,交叉熵损失函数可以写为:

    Cross-Entropy Loss = − 1 n ∑ i = 1 n ( y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ) \text{Cross-Entropy Loss} = - \frac{1}{n} \sum_{i=1}^{n} \left( y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right) Cross-Entropy Loss=n1i=1n(yilog(y^i)+(1yi)log(1y^i))

    其中 ( y i ) ( y_i ) (yi)是真实类别(0 或 1), ( y ^ i ) ( \hat{y}_i) (y^i) 是模型对样本属于正类的预测概率。

  3. 对数损失函数(Log Loss):对数损失函数也用于二分类问题中,它与交叉熵损失函数类似。

    Log Loss = − 1 n ∑ i = 1 n ( y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ) \text{Log Loss} = - \frac{1}{n} \sum_{i=1}^{n} \left( y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right) Log Loss=n1i=1n(yilog(y^i)+(1yi)log(1y^i))

  4. Hinge Loss:Hinge Loss 通常用于支持向量机(SVM)中,适用于二分类问题。

    Hinge Loss = 1 n ∑ i = 1 n max ⁡ ( 0 , 1 − y i ⋅ y ^ i ) \text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i) Hinge Loss=n1i=1nmax(0,1yiy^i)

这些是常见的损失函数,但根据具体问题的特点和模型类型,也可以使用其他类型的损失函数。在梯度下降优化过程中,目标是最小化损失函数,通过调整模型参数使得损失函数的值最小化,从而得到最优的模型参数。

2 常用梯度下降法优缺点

2.1 优缺点

梯度下降优点缺点
批量梯度下降BGD能够全局性地更新模型参数,收敛稳定计算成本高,特别是在大数据集上;
每次迭代都要遍历整个数据集,更新速度较慢
随机梯度下降SGD更新速度快,对大规模数据集具有较好的适应性;
可以跳出局部最优解
更新方向不稳定,存在随机性;
可能会产生较大的参数更新波动
小批量梯度下降MBGD综合了 BGD 和 SGD 的优点,既能够全局性地更新模型参数,又能够降低计算成本,提高更新速度需要选择合适的小批量大小,不同的大小可能会影响算法的性能;需要调整学习率等超参数。

2.2 代码实现

批量梯度下降

import numpy as np

# 1、初始化x y
# 100 行  二维 1 个数
X = np.random.randn(100, 1)
# 0-10 1维2个数
w, b = np.random.randint(0, 10, size=2)
print(w, b)
# 构建截距
y = X.dot(w) + b + np.random.rand(100, 1)
print(X.shape, y.shape)

# 2、使用偏置项x_0 = 1,更新X
X = np.concatenate([X, np.full(shape=(100, 1), fill_value=1)], axis=1)
print(X.shape, y.shape)

# 3、创建超参数轮次
epochs = 10000

# 4、初始化 W0...Wn,标准正太分布创建 W
# 矩阵运算:2列2行 m*n*n*k = m*k X追加了偏置项
theta = np.random.randn(2, 1)

# 5、设置学习率
t0, t1 = 5, 1000


def learn_rate(t):
    return t0 / (t + t1)


# 6、梯度下降
for i in range(epochs):
    g = X.T.dot((X.dot(theta) - y))
    theta = theta - learn_rate(i) * g


print('真实斜率和截距是:', w, b)
print('梯度下降计算斜率和截距是:', theta)

在这里插入图片描述

小批量梯度下降

import numpy as np

# 1、创建数据集X,y
X = np.random.rand(100, 3)
w = np.random.randint(1, 10, size=(3, 1))
b = np.random.randint(1, 10, size=1)
y = X.dot(w) + b + np.random.randn(100, 1)

# 2、使用偏置项x_0 = 1,更新X
X = np.c_[X, np.ones((100, 1))]

# 3、创建超参数轮次、样本数量
epochs = 10000
n = 100

# 4、定义一个函数来调整学习率
t0, t1 = 5, 500


def learning_rate_schedule(t):
    return t0 / (t + t1)


# 5、初始化 W0...Wn,标准正太分布创建W
theta = np.random.randn(4, 1)


# 6、多次for循环实现梯度下降,最终结果收敛
def take_data():
    index = np.arange(100)
    # 重新洗牌
    np.random.shuffle(index)
    X_ = X[index]
    y_ = y[index]
    # 一次取一批数据10个样本
    X_batch = X_[0: 10]
    y_batch = y_[0: 10]
    return X_batch, y_batch


for epoch in range(epochs):
    X_i, y_i = take_data()
    theta = theta - learning_rate_schedule(epoch) * (X_i.T.dot(X_i.dot(theta) - y_i))

print('真实斜率和截距是:', w, b)
print('梯度下降计算斜率和截距是:', theta)

在这里插入图片描述

随机梯度下降

import numpy as np

# 1、创建数据集X,y
X = 2 * np.random.rand(100, 1)
w, b = np.random.randint(1, 10, size=2)
y = X.dot(w) + b + np.random.randn(100, 1)

# 2、使用偏置项x_0 = 1,更新X
X = np.c_[X, np.ones((100, 1))]

# 3、创建超参数轮次、样本数量
epochs = 100

# 4、定义一个函数来调整学习率
t0, t1 = 5, 500


def learning_rate_schedule(t):
    return t0 / (t + t1)


# 5、初始化 W0...Wn,标准正太分布创建W
theta = np.random.randn(2, 1)
# 6、多次for循环实现梯度下降,最终结果收敛
for epoch in range(epochs):
    X_i = X[np.random.randint(0, 100, size=1)]
    y_i = y[np.random.randint(0, 100, size=1)]
    theta = theta - learning_rate_schedule(epoch) * (X_i.T.dot(X_i.dot(theta) - y_i))


print('真实斜率和截距是:', w, b)
print('梯度下降计算斜率和截距是:', theta)

在这里插入图片描述

3 梯度下降存在的一些问题

虽然梯度下降是一种常用且有效的优化算法,但在实际应用中也存在一些问题和挑战。以下是机器学习中梯度下降存在的一些常见问题:

  1. 局部最优解: 梯度下降可能会陷入局部最优解中而无法找到全局最优解。特别是在非凸优化问题中,存在多个局部最优解,而梯度下降算法容易受初始参数值的影响而收敛到局部最优解。
    在这里插入图片描述

  2. 学习率选择: 学习率是梯度下降中的关键超参数,选择不当可能导致算法无法收敛或收敛速度过慢。学习率过大会导致震荡或发散,学习率过小会导致收敛速度缓慢。
    在这里插入图片描述

  3. 鞍点问题: 在高维空间中,梯度下降可能会受到鞍点的影响而陷入停滞状态。鞍点是目标函数在某些方向上是局部最小值,而在其他方向上是局部最大值的点,梯度为零,使得梯度下降无法继续进行。
    在这里插入图片描述

  4. 过拟合: 当模型复杂度过高或训练数据过少时,梯度下降可能会导致模型过拟合,即在训练集上表现良好,但在测试集上表现较差。
    在这里插入图片描述

  5. 欠拟合:模型在训练数据上无法捕捉到数据的真实规律,表现为模型过于简单,无法很好地拟合数据的特征和复杂性。
    在这里插入图片描述
    泛化能力强的:
    在这里插入图片描述

  6. 高维问题: 在高维空间中,梯度下降算法可能面临维度灾难(curse of dimensionality)的挑战,即随着特征空间维度的增加,优化问题变得更加复杂,梯度下降算法的效率会大大降低。

在这里插入图片描述

4 梯度下降常用优化

要提高机器学习中梯度下降算法的性能和效率,可以采取以下几种方法:

  1. 随机梯度下降(SGD)的变体: 随机梯度下降算法的变体,如Mini-batch SGD、Momentum SGD、Adaptive Moment Estimation (Adam)等,可以结合随机性和自适应性,提高算法的效率和性能。
    在这里插入图片描述

  2. 参数初始化策略: 使用合适的参数初始化策略,如Xavier初始化、He初始化等,可以加速模型的收敛速度,减少训练时间。

  3. 在这里插入图片描述

  4. 正则化技术: 使用正则化技术,如L1正则化、L2正则化等,可以防止过拟合,提高模型的泛化能力,进而提高算法的性能。
    在这里插入图片描述在这里插入图片描述

  5. 批归一化: 在深度神经网络中使用批归一化技术,可以加速收敛速度,提高模型的稳定性和泛化能力,进而提高算法的性能。
    在这里插入图片描述6. 学习率衰减: 在训练过程中逐渐减小学习率,可以帮助模型更好地收敛到最优解,防止学习率过大导致的参数更新波动或震荡现象。

t0, t1 = 5, 1000


def learn_rate(t):
    return t0 / (t + t1)
  1. 集成学习方法: 使用集成学习方法,如Bagging、Boosting等,可以结合多个模型的预测结果,降低模型的方差,提高模型的性能和鲁棒性。
# 导入必要的库
from sklearn.ensemble import BaggingClassifier, GradientBoostingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 生成样本数据
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)

# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Bagging集成学习
bagging_clf = BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=10, random_state=42)
bagging_clf.fit(X_train, y_train)
bagging_pred = bagging_clf.predict(X_test)
bagging_accuracy = accuracy_score(y_test, bagging_pred)
print("Bagging集成学习准确率:", bagging_accuracy)

# Boosting集成学习
boosting_clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, random_state=42)
boosting_clf.fit(X_train, y_train)
boosting_pred = boosting_clf.predict(X_test)
boosting_accuracy = accuracy_score(y_test, boosting_pred)
print("Boosting集成学习准确率:", boosting_accuracy)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/470989.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建基于 Snowflake 的 CI/CD 最佳实践!

Snowflake 提供了可扩展的计算和存储资源,和基于 SQL 的界面 Snowsight,方便用户进行数据操作和分析。然而,如果用户想将自己的 CI/CD 流程与 Snowflake 集成时,会发现一些不便之处(尤其相比其 SnowSight 优秀的查询能…

三段提交的理解

三阶段提交是在二阶段提交上的改进版本,3PC 最关键要解决的就是协调者和参与者同时挂掉的问题,所以3PC把2PC的准备阶段再次一分为二,这样三阶段提交。 处理流程如下 : 阶段一 协调者向所有参与者发出包含事务内容的 canCommit …

无人机助力违法毒品种植智能监测预警,基于轻量级YOLOv5n开发构建无人机航拍场景下的农村田园场景下非法种植罂粟花检测预警识别系统

打击毒品人人有责,毒品带来的危害是人尽皆知的,我们不仅自身要严厉拒绝接触任何形式的毒品,更要言传身教告诫他人不要与任何形式的任何渠道的毒品有关联,但是在实际生活中,在一些偏远的乡村、田园、山丘、村落等地方&a…

Markdown 最全语法指南 —— 看这一篇就够了

目录 一. 前言 二. Markdown 标题语法 三. Markdown 段落语法 四. Markdown 换行语法 五. Markdown 强调语法 六. Markdown 引用语法 七. Markdown 列表语法 八. Markdown 代码语法 九. Markdown 分隔线语法 十. Markdown 链接语法 十一. Markdown 图片语法 十二. Markdown 转义…

【技术栈】Redis 企业级解决方案

​ SueWakeup 个人主页:SueWakeup ​​​​​​​ 系列专栏:学习技术栈 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 个性签名&…

php 对接Pangle海外广告平台收益接口Reporting API

今天对接的是Pangle广告reporting api接口,拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Pangle后台就能看到文档地址以及参数: 文档地址:https://www.pangleglobal.com/zh/integration/reporting-api-v2 在这里插入图片…

[SWPU2019]Web4

[SWPU2019]Web4 PDO注入(堆叠注入) 首先发现一个登录框,但是不能注册进行抓包,发现json数据格式,猜测可能是sql注入或者xxe漏洞 输入 ’ 报错,但是输入"或者‘ “ 不报错->猜测为堆叠注入[[mysql…

6.shell中的计算

目录 概述实践shell结果 结束 概述 shell中计算 实践 shell #!/bin/bash # 计算 expr、let 都只能用于整形计算a3 bexpr $a 3 echo "b$b" cexpr $b / 3 echo "c$c"# let 命令 表达式 let "a10" echo "a10$a" let "a/10&quo…

拓展商城系统的未来:微服务维度的创新之路

随着电子商务的快速发展,传统的单体式商城系统在应对日益复杂的业务需求和用户体验方面逐渐显露出局限性。而基于微服务架构的商城系统,通过多维度的拆分和组合,正在为商城行业带来全新的创新和发展机遇。本文将深入探讨微服务维度下的商城系…

查找众数及中位数 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 众数是指一组数据中出现次数量多的那个数,众数可以是多个。 中位数只是指把一组数据从小到大排列,最中间的那个数,如果这组数…

罗德与施瓦茨 FSU8频谱分析仪

181/2461/8938产品概述: Rohde & Schwarz FSU8是一款高性能频谱分析仪,在相位噪声、动态范围和测量精度方面具有出色的性能,可应对航空航天和国防领域的任何射频分析挑战,也可用于高达8 GHz的一般微波应用。 为了处理产品开…

端口如何映射到外网?

在现代信息化社会中,远程访问已经成为人们工作和生活中不可或缺的一部分。复杂的网络环境和网络限制可能会给远程连接带来不便。在这种情况下,端口映射到外网的技术应运而生。本文将介绍端口映射到外网的概念、应用场景以及一种优秀的解决方案——【天联…

五、C#归并排序算法

简介 归并排序是一种常见的排序算法,它采用分治法的思想,在排序过程中不断将待排序序列分割成更小的子序列,直到每个子序列中只剩下一个元素,然后将这些子序列两两合并排序,最终得到一个有序的序列。 归并排序实现原…

vue+elementui中table实现单选行功能

el-table插件可以选择行,但是只能多选,而项目中有单选的需求。 效果如下图所示,点击行或者点击复选框都可以选中行(高亮,复选框选中),并且每次只选中当前行,之前选中的行清空。点击标…

Spring-Mybatis字段映射

MybatisComfig.xml文件设置 <settings><setting name"mapUnderscoreToCamelCase" value"true"/> </settings> 完成全局配置将数据库下划线映射为驼峰式命名

螺栓的规格型号及表示方法——SunTorque智能扭矩系统

螺栓作为一种重要的紧固件&#xff0c;广泛应用于各种机械、设备和建筑结构中。了解和掌握螺栓的规格型号及表示方法对于正确选择和使用螺栓具有重要意义。本文SunTorque智能扭矩系统将详细介绍螺栓的规格型号及表示方法&#xff0c;帮助读者更好地理解和应用相关知识。 螺栓是…

两个免费的wordpress主模板

wordpress免费网站主题 蓝色高端大气上档次的wordpress免费网站主题&#xff0c;首页大图wordpress模板。 https://www.wpniu.com/themes/31.html WP免费模板 用粉色高端大气上档次的WP免费模板&#xff0c;建个网站也不错的。 https://www.wpniu.com/themes/16.html

海外版大宗商品现货交易系统开发/现货新篇

全球视野&#xff0c;现货新篇——揭秘海外版大宗商品现货交易系统的创新之旅 在全球化的大潮中&#xff0c;大宗商品现货交易早已成为各国经济发展的重要支柱。随着技术的日新月异&#xff0c;传统的交易方式已难以满足市场的多元化需求。而在这个背景下&#xff0c;我们隆重…

稀碎从零算法笔记Day22-LeetCode:

题型&#xff1a;链表 链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;Leet 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 …

如何在Linux系统中确定CPU架构

在Linux环境中&#xff0c;了解系统所采用的CPU架构对于安装兼容软件、配置系统性能优化等方面至关重要。本文将介绍三种简单有效的方法来查询Linux系统的CPU架构。 方法1&#xff1a;使用lscpu命令 运行如下命令&#xff0c;可以快速获取CPU架构信息&#xff1a; lscpu | g…