Homing So

Homing So

🎉 哈喽啊~各位
github

CS182/282A 春季 2023 1/23/23

基于标准优化的监督学习范式#

成分#

  • 训练数据 (i=1,...,n)\left( i = 1, ..., n \right)
  • XiX_i: 输入,协变量;
  • YiY_i: 输出,标签
  • 模型 fθ(),θ参数f_\theta{ \left( \cdot \right) },\theta\Leftarrow 参数

通过经验风险最小化进行训练#

θ^=argminθ1ni=1nltrain(yi,fθ(xi))\hat{ \theta } = \mathop{\arg\min}\limits_{ \theta } \frac{1}{n} \sum\limits_{i=1}^n l_{train}\left( y_i, f_\theta\left( x_i \right) \right)

  • 选择一个 θ^\hat{\theta},我们可以从数据中学习到,使某个东西最小化
  • l(y,y^) 返回一个实数 l\left( y, \hat{y} \right) \text{ 返回一个实数 }ll 是一个损失,用于比较 yy 和某个 y^\hat{y} 的预测,总是返回一个实数(训练数据之间的差异,可能是向量或数字),我们可以最小化

真实目标是对未见过的 XX 的现实世界表现#

数学代理:

  • P(X,Y)\exists{ P\left(X, Y\right) }:假设一个概率分布
  • 希望损失 l(Y,fθ(X))l\left( Y, f_\theta\left( X \right) \right)EX,YE_{X, Y}(对 XXYY 的期望)较低

复杂性#

  1. 我们无法访问 P(X,Y)P\left( X, Y \right)

我们希望在我们未见过的东西上表现良好,我们假设有一个平均值是有意义的,并且存在某种潜在分布,但我们不知道它

解决方案:

  • (Xtest,i,Ytest,i)i=1ntest\left( X_{test, i}, Y_{test, i} \right)_{ i = 1 }^{ n_{test} }:收集一组保留的数据作为测试集
  • 测试误差=1ntesti=1ntestl(ytest,i,fθ(xtest,i))\text{测试误差} = \frac{1}{n_{test}} \sum\limits_{i=1}^{n_{test}} l\left( y_{test, i}, f_{\theta}\left( x_{test, i} \right) \right)

我们收集的这个测试集在某种程度上忠实地代表了我们期望在现实世界中看到的东西,我们希望现实世界遵循概率分布的那种东西,因此我们希望平均和抽样能给我们一些对实际发生的事情的预测能力。

我不知道该怎么做,我知道怎么做,所以我就这样做

  1. 我们关心的损失 ltrue(,)l_{true}\left( \cdot, \cdot \right) 与我们的优化器不兼容

你想这样做,这需要某种方法来计算这个参数。这是某种算法,他们必须做这项工作,这个算法只有在某些事情发生时才会有效。可能你关心的损失不允许它做它需要做的事情。

你实际上关心的是某种不可微分的损失,因为它对你的问题是实际相关的。但你的最小化器将使用导数,因此你会说它无法工作。

解决方案:

  • ltrain(,)l_{train} \left( \cdot, \cdot \right):使用一个我们可以处理的替代损失。

经典示例:

  1. y{,}y \in \lbrace \text{猫}, \text{狗} \rbraceltruel_{true}:汉明损失

  2. yRy \rightarrow \mathbf{R},其中训练数据映射为:

{1+1\begin{equation} \left\{ \begin{array}{lr} 猫 \rightarrow -1 & \\ 狗 \rightarrow +1 & \end{array} \right. \end{equation}
  1. ltrainl_{train}:平方误差

当我们评估测试误差时,我们使用 ltruel_{true}

评估测试误差的目的是了解你在现实世界数据上可能表现得多好。这是对一个已经优化的特定模型的评估,没有优化会在测试误差上发生。

你应该知道的示例:

  • 二分类:逻辑损失,铰链损失
  • 多分类:交叉熵损失

附注:

1ni=1nltrue(yi,fθ^(xi))\frac{1}{n} \sum\limits_{i=1}^{n} l_{true} \left( y_{i}, f_{\hat{\theta}} \left( x_{i} \right) \right) 在训练集上评估,与 1ni=1nltrain(yi,fθ(xi))\frac{1}{n} \sum\limits_{i=1}^n l_{train} \left( y_i, f_{\theta} \left( x_{i} \right) \right) 不同

这个对象在实际工作中对每个人来说都是调试。

我们希望用这个来理解优化我们的训练损失是否在我们实际关心的事情上做得合理,并看看我们实际做得如何。因为如果有增长,我会添加更多的词。如果你告诉这个优化的内容与您正在朝着的事情之间存在严重不匹配,那么可能有些地方出错了。

1ntesti=1ntestl(ytest,i,fθ(xtest,i))\frac{1}{n_{test}} \sum\limits_{i=1}^{n_{test}} l\left( y_{test,i}, f_{\theta}\left( x_{test,i} \right) \right)

你希望这能忠实地测量事情在实践中可能如何运作,但如果你看着这个家伙说 “哦,等一下,我应该改变这个”,然后你回去说 “让我再看看这个”,那么你可能会运行一个优化循环,涉及你作为优化器,实际上你在查看这个保留的数据,而这些数据不再被保留。因为它不再被保留,你可能不信任事情在实践中会如何运作。(对过拟合现象的某种看法)

1ni=1nltrain(yi,fθ(xi))\frac{1}{n} \sum\limits_{i=1}^{n} l_{train} \left( y_{i}, f_{\theta} \left( x_{i} \right) \right) 上没有这样的担忧,因为你已经在使用这些数据来评估你做得如何,从你的优化算法的角度来看,它一直在查看它。因此,无论你选择采取其他看法,都是没有成本的。

  1. 你用替代损失运行优化器,得到 “疯狂” 的 θ^\hat{\theta} 值,你在优化器上,和 / 或你得到非常糟糕的测试表现。(对过拟合现象的另一种看法)

解决方案:

  • 在训练期间添加显式回归:θ^=argminθ(1ni=1nltrain(yi,fθ(xi)))+Rλ(θ)\hat{\theta} = \mathop{\arg\min}\limits_{\theta} \left( \frac{1}{n} \sum\limits_{i=1}^{n} l_{train} \left( y_{i}, f_{\theta} \left( x_{i} \right) \right) \right) + R_{\lambda} \left( \theta \right),例如岭回归:R(θ)=λθ2R\left( \theta \right) = \lambda\| \theta \|^2

注意:我们添加了另一个参数 λ\lambda。我们如何选择它?

原生超参数:θ^=argminθ,λ0()\hat{\theta} = \mathop{\arg\min}\limits_{\theta, \lambda^{\geq0}} \left( \frac{}{} \right)

  • 将参数分为 “正常参数 θ\theta 和超参数 λ\lambda

“超参数是一个参数,如果你让优化器只处理它,它会变得疯狂,所以你必须将其分开”

保留额外数据(验证集),用它来优化超参数
>
> > 当你使用验证集进行超参数优化时,你可能使用与寻找参数时不同的优化器。因此,通常在深度学习的背景下,这种设置总是会使用某种变体的梯度下降。但对于超参数设置,你可能会进行暴力网格搜索或与多臂赌博机相关的其他技术的搜索,或者你知道的零阶优化算法,这将帮助你做到这一点,你也可以在某些超参数搜索中使用基于梯度的方法。

所有解决方案:

  • 简化模型:“降低模型阶数”

进一步复杂性#

  • 优化器可能有自己的参数。例如,学习率

通常,优化器可能有自己的可调节参数。在实践中,作为一个尝试进行深度学习的人,你将有离散的选择来选择使用哪个优化器。

你会看到两种微妙不同的观点。

  • 最基本 / 根本的优化器方法:梯度下降

梯度下降是一种迭代优化方法,你进行改进,然后在局部进行改进。

  • 思路:逐步改变参数。

你关心的只是你的损失在你所在参数的邻域中的表现。

因此,查看损失在周围的局部邻域。

θt+1=θt+η(θLtrain,θ),Ltrain,θ=1ni=1nltrain(yi,fθ(xi))+R()\theta_{t+1} = \theta_{t} + \eta \left( - \nabla_{\theta} L_{train, \theta} \right), L_{train, \theta} = \frac{1}{n} \sum\limits_{i=1}^{n} l_{train} \left( y_{i}, f_{\theta} \left( x_{i} \right) \right) + R \left( \cdot \right)

这是一个离散时间动态系统

η "步长"/"学习率" \eta \leftarrow \text{ "步长"/"学习率" },这个 η\eta 控制这个系统的稳定性

η\eta 太大,动态变得不稳定(它会振荡)

η\eta 太小,收敛时间太长

Ltrain(θ++Δθ)Ltrain(θ+)+θLtrain"行"θ+ΔθL_{train} \left( \theta_{+} + \Delta\theta \right) \approx L_{train} \left( \theta_{+} \right) + \underbrace{\frac{\partial}{\partial\theta} L_{train}}_{\text{"行"}} \rfloor_{\theta_{+}} \Delta\theta

这个 “行” 的转置称为梯度

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。