12 Dec

让炼丹更科学一些(二):将结论推广到无界域

两年前,笔者打算开一个“科学炼丹”专题,本想着系统整理一下优化器的经典理论结果,但写了第一篇《让炼丹更科学一些(一):SGD的平均损失收敛》后,就一直搁置至今。主要原因在于,笔者总觉得这些经典优化结论所依赖的条件过于苛刻,跟实际应用相去甚远,尤其是进入LLM时代后,这些结论的参考价值似乎更加有限,所以就没什么动力继续写下去。

然而,近期在思考Scaling Law的相关问题时,笔者发现这些结论结果并非想象中那么“没用”,它可以为一些经验结果提供有益的理论洞见。因此,本文将重启该系列,继续推进这个专题文章的撰写,“偿还”之前欠下的“债务”。

结论回顾

记号方面我们沿用第一篇文章的,所以不再重复记号的介绍。第一篇文章的主要结论是:在适当的假设之下,SGD成立
\begin{equation}\frac{1}{T}\sum_{t=1}^T L(\boldsymbol{x}_t,\boldsymbol{\theta}_t) - \frac{1}{T}\sum_{t=1}^T L(\boldsymbol{x}_t,\boldsymbol{\theta}^*)\leq \frac{R^2}{2T\eta_T} + \frac{G^2}{2T}\sum_{t=1}^T\eta_t\label{leq:avg-1}\end{equation}

点击阅读全文...

1 Aug

流形上的最速下降:1. SGD + 超球面

类似“梯度的反方向是下降最快的方向”的描述,经常用于介绍梯度下降(SGD)的原理。然而,这句话是有条件的,比如“方向”在数学上是单位向量,它依赖于“范数(模长)”的定义,不同范数的结论也不同,Muon实际上就是给矩阵参数换了个谱范数,从而得到了新的下降方向。又比如,当我们从无约束优化转移到约束优化时,下降最快的方向也未必是梯度的反方向。

为此,在这篇文章中,我们将新开一个系列,以“约束”为主线,重新审视“最速下降”这一命题,探查不同条件下的“下降最快的方向”指向何方。

优化原理

作为第一篇文章,我们先从SGD出发,理解“梯度的反方向是下降最快的方向”这句话背后的数学意义,然后应用于超球面上的优化。不过在此之前,笔者还想带大家重温一下《Muon续集:为什么我们选择尝试Muon?》所提的关于优化器的“最小作用量原理(Least Action Principle)”。

点击阅读全文...

30 Apr

一道概率不等式:盯着它到显然成立为止!

前两天,QQ群里有群友抛出了一道不等式求证:

一道概率相关的不等式,出自《There is no fast single hashing algorithm》

一道概率相关的不等式,出自《There is no fast single hashing algorithm》

简短的题目,加上“easily”的提示,让人觉得这似乎是显然成立的结果,然而提问者却表示尝试了很久仍未果。那么实际情况如何呢?是否真的是显然成立呢?

初步尝试

题目等价于证
\begin{equation}\sum_{i=0}^j p^i \leq \sum_{i=0}^j \left(\log\frac{1}{1-p}\right)^i/i!,\qquad p\in[0, 1)\label{eq:q}\end{equation}

点击阅读全文...

29 May

Transformer升级之路:18、RoPE的底数选择原则

我们知道,在RoPE中频率的计算公式为$\theta_i = b^{-2i/d}$,底数$b$默认值为10000。目前Long Context的主流做法之一是,先在$b=10000$上用短文本预训练,然后调大$b$并在长文本微调,其出发点是《Transformer升级之路:10、RoPE是一种β进制编码》里介绍的NTK-RoPE,它本身有较好长度外推性,换用更大的$b$再微调相比不加改动的微调,起始损失更小,收敛也更快。该过程给人的感觉是:调大$b$完全是因为“先短后长”的训练策略,如果一直都用长文本训练似乎就没必要调大$b$了?

上周的论文《Base of RoPE Bounds Context Length》试图回答这个问题,它基于一个期望性质研究了$b$的下界,由此指出更大的训练长度本身就应该选择更大的底数,与训练策略无关。整个分析思路颇有启发性,接下来我们一起来品鉴一番。

点击阅读全文...

9 Jan

局部余弦相似度大,全局余弦相似度一定也大吗?

在分析模型的参数时,有些情况下我们会将模型的所有参数当成一个整体的向量,有些情况下我们则会将不同的参数拆开来看。比如,一个7B大小的LLAMA模型所拥有的70亿参数量,有时候我们会将它当成“一个70亿维的向量”,有时候我们会按照模型的实现方式将它看成“数百个不同维度的向量”,最极端的情况下,我们也会将它看成是“七十亿个1维向量”。既然有不同的看待方式,那么当我们要算一些统计指标时,也就会有不同的计算方式,即局部计算和全局计算,这引出了局部计算的指标与全局计算的指标有何关联的问题。

本文我们关心两个向量的余弦相似度。如果两个大向量的维度被拆成了若干组,同一组对应的子向量余弦相似度都很大,那么两个大向量的余弦相似度是否一定就大呢?答案是否定的。特别地,这还跟著名的“辛普森悖论”有关。

问题背景

这个问题源于笔者对优化器的参数增量导致的损失函数变化量的分析。具体来说,假设优化器的更新规则是:
\begin{equation}\boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_t - \eta_t \boldsymbol{u}_t\end{equation}

点击阅读全文...

19 Dec

让炼丹更科学一些(一):SGD的平均损失收敛

很多时候我们将深度学习模型的训练过程戏称为“炼丹”,因为整个过程跟古代的炼丹术一样,看上去有一定的科学依据,但整体却给人一种“玄之又玄”的感觉。尽管本站之前也关注过一些优化器相关的工作,甚至也写过《从动力学角度看优化算法》系列,但都是比较表面的介绍,并没有涉及到更深入的理论。为了让以后的炼丹更科学一些,笔者决定去补习一些优化相关的理论结果,争取让炼丹之路多点理论支撑。

在本文中,我们将学习随机梯度下降(SGD)的一个非常基础的收敛结论。虽然现在看来,该结论显得很粗糙且不实用,但它是优化器收敛性证明的一次非常重要的尝试,特别是它考虑了我们实际使用的是随机梯度下降(SGD)而不是全量梯度下降(GD)这一特性,使得结论更加具有参考意义。

问题设置

设损失函数是$L(\boldsymbol{x},\boldsymbol{\theta})$,其实$\boldsymbol{x}$是训练集,而$\boldsymbol{\theta}\in\mathbb{R}^N$是训练参数。受限于算力,我们通常只能执行随机梯度下降(SGD),即每步只能采样一个训练子集来计算损失函数并更新参数,假设采样是独立同分布的,第$t$步采样到的子集为$\boldsymbol{x}_t$,那么我们可以合理地认为实际优化的最终目标是
\begin{equation}L(\boldsymbol{\theta}) = \lim_{T\to\infty}\frac{1}{T}\sum_{t=1}^T L(\boldsymbol{x}_t,\boldsymbol{\theta})\label{eq:loss}\end{equation}

点击阅读全文...

10 May

logsumexp运算的几个不等式

$\text{logsumexp}$是机器学习经常遇到的运算,尤其是交叉熵的相关实现和推导中都会经常出现,同时它还是$\max$的光滑近似(参考《寻求一个光滑的最大值函数》)。设$x=(x_1,x_2,\cdots,x_n)$,$\text{logsumexp}$定义为
\begin{equation}\text{logsumexp}(x)=\log\sum_{i=1}^n e^{x_i}\end{equation}
本文来介绍$\text{logsumexp}$的几个在理论推导中可能用得到的不等式。

基本界

记$x_{\max} = \max(x_1,x_2,\cdots,x_n)$,那么显然有
\begin{equation}e^{x_{\max}} < \sum_{i=1}^n e^{x_i} \leq \sum_{i=1}^n e^{x_{\max}} = ne^{x_{\max}}\end{equation}
各端取对数即得
\begin{equation}x_{\max} < \text{logsumexp}(x) \leq x_{\max} + \log n\end{equation}

点击阅读全文...

11 Dec

输入梯度惩罚与参数梯度惩罚的一个不等式

在本博客中,已经多次讨论过梯度惩罚相关内容了。从形式上来看,梯度惩罚项分为两种,一种是关于输入的梯度惩罚$\Vert\nabla_{\boldsymbol{x}} f(\boldsymbol{x};\boldsymbol{\theta})\Vert^2$,在《对抗训练浅谈:意义、方法和思考(附Keras实现)》《泛化性乱弹:从随机噪声、梯度惩罚到虚拟对抗训练》等文章中我们讨论过,另一种则是关于参数的梯度惩罚$\Vert\nabla_{\boldsymbol{\theta}} f(\boldsymbol{x};\boldsymbol{\theta})\Vert^2$,在《从动力学角度看优化算法(五):为什么学习率不宜过小?》《我们真的需要把训练集的损失降低到零吗?》等文章我们讨论过。

在相关文章中,两种梯度惩罚都声称有着提高模型泛化性能的能力,那么两者有没有什么联系呢?笔者从Google最近的一篇论文《The Geometric Occam's Razor Implicit in Deep Learning》学习到了两者的一个不等式,算是部分地回答了这个问题,并且感觉以后可能用得上,在此做个笔记。

最终结果

假设有一个$l$层的MLP模型,记为
\begin{equation}\boldsymbol{h}^{(t+1)} = g^{(t)}(\boldsymbol{W}^{(t)}\boldsymbol{h}^{(t)}+\boldsymbol{b}^{(t)})\end{equation}
其中$g^{(t)}$是当前层的激活函数,$t\in\{1,2,\cdots,l\}$,并记$\boldsymbol{h}^{(1)}$为$\boldsymbol{x}$,即模型的原始输入,为了方便后面的推导,我们记$\boldsymbol{z}^{(t+1)}=\boldsymbol{W}^{(t)}\boldsymbol{h}^{(t)}+\boldsymbol{b}^{(t)}$;参数全体为$\boldsymbol{\theta}=\{\boldsymbol{W}^{(1)},\boldsymbol{b}^{(1)},\boldsymbol{W}^{(2)},\boldsymbol{b}^{(2)},\cdots,\boldsymbol{W}^{(l)},\boldsymbol{b}^{(l)}\}$。设$f$是$\boldsymbol{h}^{(l+1)}$的任意标量函数,那么成立不等式
\begin{equation}\Vert\nabla_{\boldsymbol{x}} f\Vert^2\left(\frac{1 + \Vert \boldsymbol{h}^{(1)}\Vert^2}{\Vert\boldsymbol{W}^{(1)}\Vert^2 \Vert\nabla_{\boldsymbol{x}}\boldsymbol{h}^{(1)}\Vert^2}+\cdots+\frac{1 + \Vert \boldsymbol{h}^{(l)}\Vert^2}{\Vert\boldsymbol{W}^{(l)}\Vert^2 \Vert\nabla_{\boldsymbol{x}}\boldsymbol{h}^{(l)}\Vert^2}\right)\leq \Vert\nabla_{\boldsymbol{\theta}} f\Vert^2\label{eq:f}\end{equation}

点击阅读全文...