机器学习6-梯度下降法

embedded/2024/11/29 14:46:21/

梯度下降法

目的

梯度下降法(Gradient Descent)是一个算法,但不是像多元线性回归那样是一个具体做回归任务的算法,而是一个非常通用的优化算法来帮助一些机器学习算法求解出最优解的,所谓的通用就是很多机器学习算法都是用它,甚至深度学习也是用它来求解最优解。所有优化算法的目的都是期望以最快的速度把模型参数θ求解出来,梯度下降法就是一种经典常用的优化算法。

梯度下降法的思想

在这里插入图片描述
梯度下降法的基本思想可以类比为一个下山的过程,如下图所示函数看似为一片山林,红色的是山林的高点,蓝色的为山林的低点,蓝色的颜色越深,地理位置越低,则图中有一个低点,一个最低点。

梯度下降法的公式

在这里插入图片描述
其中Wj 是W向量中的一个元素, η为学习率。学习率一般是整数,学习率一般都是正数,那么在山左侧梯度是负的,那么这个负号就会把 W 往大了调,如果在山右侧梯度就是正的,那么负号就会把 W 往小了调。每次 Wj 调整的幅度就是η*gradient,就是横轴上移动的距离。

学习率设置技巧


在这里插入图片描述
根据我们上面讲的梯度下降法公式,我们知道η是学习率,设置大的学习率 Wj 每次调
整的幅度就大,设置小的学习率 Wj 每次调整的幅度就小,然而如果步子迈的太大也会有问
题其实,俗话说步子大了容易扯着蛋,可能一下子迈到山另一头去了,然后一步又迈回来了,
使得来来回回震荡。步子太小呢就一步步往前挪,也会使得整体迭代次数增加。

梯度下降法的流程

1 .初始化参数Wj,
2. 求梯度函数
3. 判断是否收敛,如果收敛跳出迭代,否则继续循环。
在这里插入图片描述

三种常用的梯度下降法

基于线性回归的损失函数求导得到导函数
在这里插入图片描述
然后将导数应用在如下的梯度下降公式中
在这里插入图片描述
假设所有样本数为N.该梯度计算基于线性回归损失函数得到。
m=N 全量梯度下降;
m=1 随机梯度下降;
1<m<N 批量梯度下降。

梯度下降法挑战

  1. 选择一个合理的学习速率很难。如果学习速率过小,则会导致收敛速度很慢。如果学习速率过大,那么其会阻碍收敛,即在极值点附近会振荡。
  2. 学习速率调整(又称学习速率调度,Learning rate schedules 试图在每次更新过程中,改变学习速率,如退火。一般使用某种事先设定的策略或者在每次迭代中衰减一个较小的阈值。无论哪种调整方法,都需要事先进行固定设置,这边便无法自适应每次学习的数据集特点。
  3. 模型所有的参数每次更新都是使用相同的学习速率。如果数据特征是稀疏的或者每个特征有着不同的取值统计特征与空间,那么便不能在每次更新中每个参数使用相同的学习速率,那些很少出现的特征应该使用一个相对较大的学习速率。
  4. 对于非凸目标函数,容易陷入那些次优的局部极值点中,如在神经网路中。那么如何避免呢。Dauphin 指出更严重的问题不是局部极值点,而是鞍点(一段导数接近0)
    在这里插入图片描述

批次和轮次

轮次:epoch,轮次顾名思义是把我们已有的训练集数据学习多少轮。
批次:batch,批次这里指的的我们已有的训练集数据比较多的时候,一轮要学习太多数据,那就把一轮次要学习的数据分成多个批次,一批一批数据的学习。

归一化

目的

在这里插入图片描述
对于y=
X1对应年龄,X2对应工资,其维度单位不一样会导致训练时间参数变化,θ2的变化会小一些。
归一化的一个目的是使得最终梯度下降的时候可以不同维度θ参数可以在接近的调整幅度上。

归一化的方式

最大最小值归一化

在这里插入图片描述
最大最小值归一化,把所有值缩放到0到1之间,但是容易受到极大值的影响。

标准归一化

在这里插入图片描述
标准归一化是除以的是标准差,而标准差的计算
会考虑到所有样本数据,所以受到离群值的影响会小一些,这就是除以方差的好处!但是如
果是使用标准归一化不一定会把数据缩放到 0 到 1 之间了

正则化

提到正则化一定要先讲下拟合问题

过拟合欠拟合

(1) under fit:还没有拟合到位,训练集和测试集的准确率都还没有到达最高。学的还不
到位。
(2) over fit:拟合过度,训练集的准确率升高的同时,测试集的准确率反而降低。学的过
度了,做过的卷子都能再次答对,考试碰到新的没见过的题就考不好。
(3) just right:过拟合前训练集和测试集准确率都达到最高时刻。学习并不需要花费很多
时间,理解的很好,考试的时候可以很好的把知识举一反三。真正工作中我们是奔着过
拟合的状态去调的,但是最后要的模型肯定是没有过拟合的。
正则化就是防止过拟合,增加模型的鲁棒性 robust,鲁棒是 Robust 的音译,也就是强壮的意思。就像计算机软件在面临攻击、网络过载等情况下能够不死机不崩溃,这就是该软件的鲁棒性。鲁棒性调优就是让模型拥有更好的鲁棒性,也就是让模型的泛化能力和推广能力更加的强大。
所以正则化(鲁棒性调优)的本质就是牺牲模型在训练集上的正确率来提高推广能力, W 在数值上越小越好,这样能抵抗数值的扰动。在数值上越小越好,这样能抵抗数值的扰动。同时为了保证模型的正确率 W 又不能极小。
故而人们将原来的损失函数加上一个惩罚项,这里面损失函数就是原来固有的损失函数,比如回归的话通常MSE,分类的话通常是 cross entropy 交叉熵,然后在加上一部分惩罚项来使得计算出来的模型 W 相对小一些来带来泛化能力。

常见的惩罚项

在这里插入图片描述
其实 L1 和 L2 正则的公式数学里面的意义就是范数,代表空间中向量到原点的距离。当我们把多元线性回归损失函数加上 L2 正则的时候,就诞生了 Ridge 岭回归。当我们把多元线性回归损失函数加上 L1 正则的时候,就孕育出来Lasso 回归。
在这里插入图片描述
当我们看到上图时,其实里面学问很大,通常我们会说 L1 正则会使得计算出来的模型有的 W 趋近于 0,有的 W 相对较大,而 L2 会使得 W 参数整体变小,这是为什么呢?这得从梯度下降更新得角度去考虑如果损失函数加上正则项,那么导函数就等于多了正则项的导函数,即原来比如 MSE的导函数和 L1、L2 的导函数,那么梯度 gradient 就是这两部分组成,每次减小的幅度就是学习率η×(MSE 的导+L1/L2 的导),说白了就是比不加惩罚项要多更新一部分,这部分就
使得 W 奔着原点 0 去。
在这里插入图片描述
上式中λ是正则项系数,λ越大,说明我们算法工程师越看重模型的泛化能力,经验值是设置 0.4,也可以看成是保障正确率的 base loss 的权值是 1,保障泛化能力的正则项权值是 0.4。既然现在要去最小化的整体损失函数变成了两部分加和,那么θ就既得满足原有的损失函数比如 MSE,同时还得满足 L1 或者 L2 这部分,从图上来说就是θ得在紫色的损失函数等高线上同时又得在红色的 L1 或 L2 的等高线上,说白了就是要出现在交点上面。
因为更高维度空间的图形很难去绘制和观看,所以这里选择两个特征维度对应w1 和w2 两个参数的图来解释。
以下公式就是 L1 或者 L2 的导函数,也就是每次梯度下降会多走的幅度,我们可以看到如果是 L1 每次会多走η*1 的幅度,我们知道η学习率一开始设置一个常数那么每次多走的幅度对应不同的维度来说是一样的一个常数,学习率是 0.5 的话,比如w1 多走 0.5,w2也是多走 0.5。反观 L2 每次多走的幅度是之前的 2 倍的wi
在这里插入图片描述


http://www.ppmy.cn/embedded/141494.html

相关文章

如何做好一份技术文档?

技术文档的创作与优化 一、技术文档的规划布局&#xff08;一&#xff09;明确文档目的与受众确定目的分析受众 &#xff08;二&#xff09;构建章节框架概述章节基础技术概念章节系统架构章节功能实现章节测试与验证章节结论与展望章节 二、技术文档的语言表达&#xff08;一&…

初级数据结构——二叉搜索树题库(c++)

目录 前言[1.——108. 将有序数组转换为二叉搜索树](https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/)[2.——LCR 052. 递增顺序搜索树](https://leetcode.cn/problems/NYBBNL/)[3.——897. 递增顺序搜索树](https://leetcode.cn/problems/increasi…

c/c++ 用easyx图形库写一个射击游戏

#include <graphics.h> #include <conio.h> #include <stdlib.h> #include <time.h>// 定义游戏窗口的大小 #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600// 定义玩家和目标的尺寸 #define PLAYER_SIZE 50 #define TARGET_SIZE 20// 玩家的结构…

【qiankun】主应用css隔离、js隔离、日常通信机制

qiankun是一个微前端框架&#xff0c;它提供了多种机制来确保主应用与子应用之间的独立性&#xff0c;包括CSS隔离、JS隔离以及日常通信等。以下是对这些机制的详细解释&#xff1a; 一、CSS隔离 qiankun通过以下方式实现CSS隔离&#xff1a; 自动添加命名空间&#xff1a; …

Exchange 2016(ESEUTIL命令的应用)

使用eseutil命令进行修复 执行ESEUTIL /MH <数据库绝对路径>&#xff0c;查看state是 dirtyshutdown还是cleanshutdown. 1.如果是clean shutdown状态可以执行软修复 注意&#xff1a;软恢复过程的一个基本假设是故障未移动、删除或破坏任何数据库文件或日志文件&#xf…

【八股文】小米

文章目录 一、vector 和 list 的区别&#xff1f;二、include 双引号和尖括号的区别&#xff1f;三、set 的底层数据结构&#xff1f;四、set 和 multiset 的区别&#xff1f;五、map 和 unordered_map 的区别&#xff1f;六、虚函数和纯虚函数的区别&#xff1f;七、extern C …

【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

深入理解Go语言中的`sync.Pool`与常规内存分配

在Go语言的并发编程中&#xff0c;内存管理是一个不可忽视的话题。sync.Pool作为Go标准库中的一个特殊工具&#xff0c;提供了一种对象池化机制&#xff0c;以优化内存分配和垃圾回收&#xff08;GC&#xff09;。本文将深入探讨sync.Pool与常规内存分配的主要区别&#xff0c;…