机器学习 | 模型优化过程概述:损失函数 & 梯度下降

本文详细介绍了模型训练中的损失函数概念,以及如何通过梯度下降法进行参数优化,包括批量梯度下降、随机梯度下降和小批量梯度下降的区别与优缺点。重点讲解了如何设置batch-size和epoch等超参数,以及训练过程中常见的问题和优化策略。
摘要由CSDN通过智能技术生成

话题引入

在开始分享损失函数和梯度下降之前,我们先来复习一下模型训练的大致过程:
    在拿到数据集后,首先将数据集划分为训练集,测试集,验证集
在这里插入图片描述

随后将训练集数据喂入模型中进行训练,这样我们就会得到
在这里插入图片描述

其中对于模型的输出值,并不是我们数据集中给出的标签值y值,而是模型的预测值,也叫 y_hat ,记作 y ^ \hat{y} y^

下面,我来讨论:到底什么是损失函数?什么又是梯度下降?

一. 模型优化过程:损失函数 和 梯度下降

首先我们来重申下,为什么进行模型训练?
我们对模型进行训练的目的,就是为了当模型拿到没有标签的数据时,可以准确的预测出我们关注问题的答案
    比如:给出房屋面积,我们希望模型可以准确的预测出房价等等(当然房价并不仅仅与面积相关啦)

当我们对训练样本进行训练后,模型会相应的输出每个样本的 y ^ \hat{y} y^值,而每个 y ^ \hat{y} y^值与标签值y值之间都可能存在一个差值

因此我们需要对模型进行优化,那么我们的问题就变成了:
    如何让 y ^ \hat{y} y^与标签值y值之间的差值最小
    也就是如何让模型的预测值更准确?

在这里插入图片描述

通过上面对于差值的描述,不难看出:训练得到的模型准确度如何,其实可以用模型的输出值与标签值之间的差值来衡量!!!
因此也就引入了损失函数,即:用来评估模型预测结果与真实值之间差异的函数,它衡量了模型在给定数据上的性能好坏

	我们通过定义损失函数,来调整模型的训练参数,从而使得模型对于数据的预测更准确,损失更小

1. 定义损失函数 J = h ( θ ) J = h(\theta ) J=h(θ)

J = h ( θ ) J = h(\theta ) J=h(θ)
    参数说明:
        自变量 θ \theta θ为训练时模型的参数
        因变量J为总损失值
    损失函数说明:
        模型的参数在变时,总损失也在变化
    非官方说明:
        损失函数最简单的理解就是,给定样本中所有损失的均值或总和


结合上面对于差值的描述,当我们想要得到效果最好的模型,就等于想要得到的模型总损失最小;那么现在的问题又转变为:如何求解损失函数最小值?

2. 求解损失最小

这里大家先思考,求解损失函数最小值,究竟是在求哪个未参数?(捋清楚呦!!!!)
A. J值
B. θ \theta θ
C. 模型训练时学到的参数

答案是B,C

损失最小解决方法1:求导

如果想要损失值最小,那么最简单的做法就是损失函数求导,即:
∂ J ∂ θ = 0 \frac{\partial J}{\partial \theta } =0 θJ=0

但是,问题是在实际的工程中,上述式子几乎都无法解出 θ \theta θ

损失最小解决方法2:梯度下降

在方程无法解出的条件下,我们就可以使用梯度下降的方法来求解
即:通过一点点更新 θ \theta θ值,最终得到的结果与上述方程的解析解结果是吻合的

不过话说回来,梯度下降是求解损失函数最常用的一种方法,而不是唯一方法

注意:使用梯度下降的前提,损失函数必须是凸函数

二. 梯度下降

1. 定义梯度

	梯度是指函数在某一点的变化率
		通过计算损失函数对于模型参数的梯度,可以确定在当前参数下损失函数最大的变化方向,从而进行参数优化的更新
		
	非官方理解版本:
		通常该点的变化率来指导参数进行更新,即每一步都沿着梯度的方向更新,使得损失函数下降最快

求梯度值更新 θ \theta θ公式:
θ i ′ = θ i − α ∂ J ∂ θ i {\theta _{i} }' =\theta _{i}-\alpha \tfrac{\partial J}{\partial \theta _{i}} θi=θiαθiJ

参数:
     α \alpha α为步长因子(超参数:训练之前需要人为确定的参数
        不同的步长因子导致梯度下降有不同效果:
             α \alpha α值太大,会导致梯度发散,不收敛
             α \alpha α值太小,会导致梯度下降效率太低

2. 梯度下降的目的

    求解损失函数最小时的参数

3. 梯度下降方式

对于模型的优化,简单来说就是将样本数据送入模型中,通过计算梯度值来不断更新模型的参数值,以达到缩小预测值与标签值之间差值的目的,使得模型预测更准确

那么,我们的问题来了:面对10W起步的工程数据量,我们如何进行梯度下降?

3.1 批量梯度下降(Batch GradientDescent,BGD)

	官方:使用所有样本的平均梯度值作为当前模型参数θ的更新
	非官方:将全部的数据放回模型中,计算梯度,进行更新

问题:
     1. 更新太慢(例子:总样本100W条数据时,每100W条更新一次模型参数)
     2. 内存装不下

3.2 随机梯度下降(Stochastic GradientDescent, SGD)

	官方:使用单个样本的梯度值作为当前模型参数θ的更新
	非官方:每次随机将一条数据送回模型中,计算梯度,进行更新

优点:
     更新速度快,收敛速度比BGD快(例子:每抽取一条数据,更新一次模型参数)
问题:
     梯度不稳定,收敛的位置会存在J(θ)函数波动的情况(例子:每次送回模型的数据在换,梯度很不稳定)

	批量梯度下降与随机梯度下降对比:
		批量梯度下降 一定能够得到一个局部最优解(在线性回归模型中一定是得到一个全局最优解)
		随机梯度下降 由于随机性的存在可能导致最终结果比BGD的差

随机梯度下降在最开始时,由于梯度方向无分歧,下降速度很快;
随机梯度下降接近最好值时,由于每次只投喂一个样本,梯度方向有分歧,梯度波动很大;

3.3 小批量梯度下降(Mini-batchGradientDescent,MBGD)

	官方:拿n个样本的平均梯度作为更新方向
	非官方:每次随机将部分条数据送回模型中,计算梯度,进行更新
		比如:每次送回32条,64条等等(超参数:需要调)

优点:
     收敛比较快,有足够内存,梯度稳定


下面我们来介绍MBGD中几个常用的超参数:

3.3.1 batch-size

batch-size为批大小;
     例子:batch-size = 10,即每次取10个样本进行训练,得到损失后,更新 θ \theta θ

3.3.2 epoch

epoch为轮次;
     例子:epoch = 1(假定训练集共有1000条数据),即每次不放回的取10个样本进行训练,直至将1000条数据取完,为1个epoch

问题:当epoch=100时,真的会训练100轮吗?

答案是不会,通常情况下训练器(比如说:pytorch,一般是别人写好的,当然自己也可以写,但是一般不这么干)会有优化
    即,当损失值降低到一定程度并保持某几个轮次(一般会提示10个轮次)不变后,训练会提前结束,也叫早退

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ToBeCertain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值