机器学习面经 - 优化函数

简介

在机器学习和深度学习中,激活函数、损失函数和优化函数是三个重要的概念,也是在面试中很容易考察你在项目中这些函数选择的时候常问的一些问题。它们在神经网络和其他学习算法中发挥关键作用。优化函数(Optimization Function)是用来更新神经网络的权重和偏置,以最小化损失函数的值。在训练过程中,优化函数根据当前的权重和偏置,以及损失函数的梯度信息,来更新模型的参数,使得损失函数逐渐减小,模型逐渐收敛到更好的状态。常见的优化函数包括梯度下降(Gradient Descent)、随机梯度下降(Stochastic Gradient Descent,SGD)、Adam 等。
下面是一些常见的面试题归纳:

Q:优化函数的作用?

答:优失函数是用来度量模型预测值和真实值间的偏差,偏差越小,模型越好,所以我们需要最小化损失函数。如何求最小值呢?高中知识告诉我们,对于凸函数可以直接求导可以找到最值,但是神经网络的损失函数往往是非凸函数,我们并不能直接求导。所以优化函数就可以帮助我们解决这个问题,优化函数就是用来最小化我们的损失函数的。

Q:讲讲梯度下降法?

答:梯度下降法是原始的优化方法,它的主要目的是通过迭代找到目标函数(也就是损失函数)的最小值。在梯度下降算法中,每次都会遍历整个训练集,然后会对每个参数求偏导,取最大的点,根据负梯度方向是使函数值下降最快的方向,这个是可以通过泰勒展开求的的,在迭代的每一步根据负梯度的方向更新参数w的值,从而求得最小的损失函数J(w)。当J(w)是凸函数的时候,用梯度下降的方法当然可以取得的最小值是全局最优解。但神经网络的损失函数往往是非凸函数,所以梯度下降法往往找到的是局部最优解。

形象化举例,假如最开始,我们在一座大山上的某处位置,因为到处都是陌生的,不知道下山的路,所以只能摸索着根据直觉,走一步算一步,在此过程中,每走到一个位置的时候,都会求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。不断循环求梯度,就这样一步步地走下去,一直走到我们觉得已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山势低处。由此,从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部的最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。

Q:梯度下降算法一般是如何调优的?

答:实际使用梯度下降法时,各项参数指标不能一步就达到理想状态,对梯度下降法调优主要体现在以下几个方面:

(1)算法迭代步长,也就是学习率α选择。在算法参数初始化时,有时根据经验将步长初始化为0.1。实际取值取决于数据样本。可以从大到小,多取一些值,分别运行算法看迭代效果,如果损失函数在变小,则取值有效。如果取值无效,说明要增大步长。但步长太大,有时会导致迭代速度过快,错过最优解。步长太小,迭代速度慢,算法运行时间长。

(2)参数的初始值选择。初始值不同,获得的最小值也有可能不同,梯度下降有可能得到的是局部最小值。如果损失函数是凸函数,则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,选择损失函数最小的初值。

(3)标准化处理。由于样本不同,特征取值范围也不同,导致迭代速度慢。为了减少特征取值的影响,可对特征数据标准化,使新期望为0,新方差为1,可节省算法运行时间。

Q:梯度下降法找到的一定是下降最快的方向么?

答:梯度下降法找的的不一定是下降最快的方向。梯度下降法的目标是最小化损失函数,它通过计算损失函数关于参数的梯度(方向导数)来确定参数更新的方向。在梯度下降法中,参数会沿着梯度的反方向进行更新,以使损失函数尽可能减小。梯度向量指向的方向是当前位置损失函数变化最快的方向,但并不保证是全局最快的下降方向。这是因为梯度下降法是一种局部搜索算法,它只考虑了当前位置的局部信息,而不会全局搜索整个参数空间。一般我们认为牛顿法是下降最快的方向。

Q:为什么牛顿法可以认为是下降最快的方向,它和梯度下降的区别是什么?

答:牛顿方向是一种优化方向,考虑了海森矩阵(Hessian Matrix),在某些情况下可以被认为是梯度下降最快的方向。梯度下降法使用损失函数关于参数的梯度来更新参数,使损失函数逐渐减小。而牛顿法是一种更高阶的优化算法,除了使用梯度,还考虑了损失函数关于参数的二阶导数,即海森矩阵。海森矩阵可以提供更多关于函数曲率的信息,使得牛顿法能够更精确地确定优化方向。在二次凸优化问题中,牛顿法可以一步到位地找到全局最优解,因为对于凸函数,局部最小值和全局最小值是相同的。在这种情况下,牛顿法可以认为是梯度下降最快的方向。
然而,在非凸优化问题中,牛顿法的性能可能会受到影响。因为海森矩阵可能包含负特征值,导致在某些方向上函数值并不是下降的,而是上升的,从而使得牛顿法无法保证每次迭代都能得到下降的方向。此外,计算和存储海森矩阵在高维问题中可能会非常昂贵,因此牛顿法并不总是最优选择。
由于牛顿法和梯度下降法各自有优缺点,通常会采用改进的算法来结合二者的优势。例如,拟牛顿法(如BFGS、L-BFGS)是一类常用的优化算法,它使用梯度信息来近似海森矩阵,从而在非凸问题中取得较好的表现,同时避免了直接计算海森矩阵的高代价。这些算法通常被认为是较为高效和稳定的优化方法。

介绍一下随机梯度下降、批次梯度下降、随机梯度下降区别?

答:梯度下降法我们在前面其实已经介绍过了,这里就不做过多的赘述了。
批次梯度下降它的训练方式跟梯度下降法没什么区别,只是为了解决梯度下降法中每次需要遍历整个训练集的数据的耗时问题,批次梯度下降法在计算梯度时,不用遍历整个训练集,而是针对一个批次的数据。
随机梯度下降(SGD)其实是相对批次梯度下降法的一个特例,因为我们知道梯度下降法每一次都是用整个训练集进行训练,训练速度慢。而SGD随机梯度下降法每次从训练集中随机抽取一个数据来计算梯度。因此,其速度较快,但是其每次的优化方向不一定是全局最优的。所以每一次迭代的梯度受抽样的影响比较大,也就是说梯度含有比较大的噪声,不能很好的反映真实梯度,并且SGD有较高的方差,其波动较大。而且SGD无法避免陷入局部最小点。因为每一次迭代的梯度受抽样的影响比较大,学习率需要逐渐减少,否则模型很难收敛。在实际操作中,一般采用线性衰减:
ηk = (1-a)η0 + aητ
a = k/τ

η0是初始学习率,ητ是最后一次迭代的学习率,τ代表自然迭代次数,ητ设为η0的1%。k我们一般设为100的倍数。

Q:SGD优缺点?

答:优点:不用每次遍历整个训练集数据,而是每次随机选择一个点,所以收敛速度快。缺点:缺点也是比较明显,首先是训练不稳定,每一次下降的方向不是最优点,选择适当的学习率可能很困难,太小的学习率会导致收敛性缓慢,而学习速度太大可能会妨碍收敛,并导致损失函数在最小点波动。同样的,梯度下降法也无法逃脱鞍点。

介绍一下Momentum随机梯度下降法?

答:Momentum借用了物理中的动量概念,即前一次的梯度也会参与运算。在这里,引入了指数加权平均数来计算t时刻的动量,它的公式就是:
在这里插入图片描述

介绍一下 Adam 算法

答:Adam(Adaptive Moment Estimation)是一种优化算法,用于训练机器学习模型,特别是在深度学习中广泛应用。它结合了动量(Momentum)和自适应学习率的概念,旨在在训练过程中自适应地调整学习率,并加速模型参数的收敛。
Adam算法的核心思想是维护两个变量:一阶矩估计(对应梯度的均值)和二阶矩估计(对应梯度的方差)。这两个变量分别用来调整参数更新的幅度和方向。相比于传统的随机梯度下降和动量算法,Adam算法能够根据每个参数的历史梯度信息,自适应地调整学习率,使得参数更新更为平稳且具有适应性。
Adam算法的参数更新公式如下:
在这里插入图片描述
Adam算法的优点包括:
自适应学习率:根据梯度历史自适应地调整学习率,适应不同参数的变化情况。
高效稳定:相对于一些传统的优化算法,Adam通常能够更快地收敛,而且在参数更新时更为平稳。
默认参数:Adam算法的默认参数通常在很多任务上表现良好,无需经过过多的参数调整。

Q:在优化器中有哪些重要的参数,参数更新的步骤一般是什么?

答:下面列举了一些常见的优化器参数:

  1. 学习率(Learning Rate):学习率是控制参数更新步长的参数。它决定了在每次迭代中参数更新的幅度。学习率较大可能导致优化算法发散,学习率较小可能导致优化速度过慢。需要根据具体问题进行调整。
  2. 动量(Momentum):动量是一种在梯度方向上增加惯性的技术,可以加速优化过程。动量参数决定了过去梯度在当前梯度中所占的比例,范围通常为0到1之间。
  3. 梯度衰减率(Decay Rate):梯度衰减率是一种减小学习率的技术。它使得学习率随着时间逐渐减小,有助于在训练的后期更加稳定地逼近最优解。
  4. β1和β2(Beta1 and Beta2):对于一些优化算法,如Adam优化器,β1和β2是用于计算梯度一阶和二阶矩估计的指数衰减率。它们通常取值为0到1之间。
  5. Epsilon:epsilon是一个很小的数值,用于防止分母为零的情况,以增加算法的数值稳定性。

优化器的参数更新步骤通常如下:

  1. 初始化参数:将模型的参数初始化为一些随机值。
  2. 在每次迭代中,计算损失函数关于参数的梯度(或者一阶矩估计和二阶矩估计)。
  3. 根据优化算法的具体规则和参数,利用梯度或者其他估计信息来更新参数。
  4. 重复上述步骤,直到满足停止条件(如达到最大迭代次数或损失函数收敛)。

Q:SGD和Adam谁收敛的比较快?谁能达到全局最优解?

答:SGD算法没有动量的概念,SGD和Adam相比,缺点是下降速度慢,对学习率要求严格。而Adam引入了一阶动量和二阶动量,下降速度比SGD快,Adam可以自适应学习率,所以初始学习率可以很大。SGD相比Adam,更容易达到全局最优解。主要是后期Adam的学习率太低,影响了有效的收敛。我们可以前期使用Adam,后期使用SGD进一步调优。

Q:Adam中使用的一阶矩和二阶矩的原理是什么?

答:Adam算法使用一阶矩(梯度的一阶矩估计)和二阶矩(梯度平方的二阶矩估计)。这两个矩估计分别用来对梯度进行平滑处理和缩放梯度步长,从而实现自适应学习率。 具体来说,Adam算法维护了两个变量m和v,它们分别是梯度的一阶矩估计和二阶矩估计。

一阶矩估计(m):m是梯度的一阶矩估计,通过指数移动平均来计算。在每次迭代中,m会根据当前梯度和上一次的估计值进行更新,其计算公式为: m = β1 * m + (1 - β1) * g 其中,g表示当前的梯度,β1是控制一阶矩估计的指数衰减率(通常取值为0.9),越靠近1,过去梯度对估计的贡献越大。

二阶矩估计(v):v是梯度平方的二阶矩估计,也是通过指数移动平均来计算。在每次迭代中,v会根据当前梯度的平方和上一次的估计值进行更新,其计算公式为: v = β2 * v + (1 - β2) * g^2 其中,g表示当前的梯度,β2是控制二阶矩估计的指数衰减率(通常取值为0.999),越靠近1,过去梯度平方对估计的贡献越大。

偏差修正:由于m和v在初始阶段可能接近0,会导致偏差,因此Adam算法使用了偏差修正来纠正这个问题。在进行参数更新之前,需要对m和v进行修正: m_hat = m / (1 - β1^t) v_hat = v / (1 - β2^t) 其中,t表示当前迭代的步数。

最终,Adam算法通过以上估计得到的m_hat和v_hat来更新参数,其参数更新步骤为:
参数 = 参数 - 学习率 * m_hat / (sqrt(v_hat) + ε)
其中,学习率控制了每次迭代参数更新的步长,ε是一个很小的数值,用于数值稳定性。

Q:优化的时候batch如何选择?

答:Batch选择时尽量采用2的幂次,如8、16、32等在合理范围内,增大Batch_size的好处:1.提高了内存利用率以及大矩阵乘法的并行化效率。2.减少了跑完一次epoch(全数据集)所需要的迭代次数,加快了对于相同数据量的处理速度。 盲目增大Batch_size的坏处:1.提高了内存利用率,但是内存容量可能不足。2.跑完一次epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加,从而对参数的修正也就显得更加缓慢。3.Batch_size增大到一定程度,其确定的下降方向已经基本不再变化。 Batch_size过小的影响:1.训练时不稳定,可能不收敛。2.精度可能更高。

Q:你在优化算法的策略上,为什么先用Adam算法,后用SGD算法?

答:Adam 的收敛速度比SGD要快,但最终收敛的结果并没有SGD好。主要是后期Adam的学习率太低,影响了有效的收敛。所以我们可以前期用Adam,享受Adam快速收敛的优势;后期切换到SGD,慢慢寻找最优解。

持续更新中

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

azierrrrrr

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

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

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

打赏作者

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

抵扣说明:

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

余额充值