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

随后将训练集数据喂入模型中进行训练,这样我们就会得到

其中对于模型的输出值,并不是我们数据集中给出的标签值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−α∂θi∂J
参数:
α
\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个轮次)不变后,训练会提前结束,也叫早退
本文详细介绍了模型训练中的损失函数概念,以及如何通过梯度下降法进行参数优化,包括批量梯度下降、随机梯度下降和小批量梯度下降的区别与优缺点。重点讲解了如何设置batch-size和epoch等超参数,以及训练过程中常见的问题和优化策略。

311

被折叠的 条评论
为什么被折叠?



