27 Feb

Muon续集:为什么我们选择尝试Muon?

本文解读一下我们最新的技术报告《Muon is Scalable for LLM Training》,里边分享了我们之前在《Muon优化器赏析:从向量到矩阵的本质跨越》介绍过的Muon优化器的一次较大规模的实践,并开源了相应的模型(我们称之为“Moonlight”,目前是一个3B/16B的MoE模型)。我们发现了一个比较惊人的结论:在我们的实验设置下,Muon相比Adam能够达到将近2倍的训练效率。

Muon的Scaling Law及Moonlight的MMLU表现

Muon的Scaling Law及Moonlight的MMLU表现

优化器的工作说多不多,但说少也不少,为什么我们会选择Muon来作为新的尝试方向呢?已经调好超参的Adam优化器,怎么快速切换到Muon上进行尝试呢?模型Scale上去之后,Muon与Adam的性能效果差异如何?接下来将分享我们的思考过程。

点击阅读全文...

5 Mar

MoE环游记:3、换个思路来分配

这篇文章我们继续探讨MoE的负载均衡问题。在上一篇文章《MoE环游记:2、不患寡而患不均》中,我们主要讨论了通过Aux Loss来促进负载均衡的思路。Aux Loss固然简单直观,但它也有一个明显的缺点——权重不好调——调低了无法促进均衡,调高了容易损害LM Loss,所以业界一直有寻找替代方案的尝试。

本文要分享的是名为“Loss-Free”的方案,由DeepSeek在《Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts》提出。和DeepSeek众多耀眼的开源作品相比,这篇论文也许不算起眼,但在笔者看来,它潜在的学术影响力可能远超其他工作,因为所提方法不仅简单有效,而且极具普适性,堪称经典。

方法大意

面对负载不均衡,Aux Loss的应对思路是通过额外的损失引导Router给出均衡的打分,而Loss-Free的想法则是换个新的分配思路,即不改变Router现有打分结果,而是改变$\mathop{\text{argtop}}_k \boldsymbol{\rho}$这个分配方式。

点击阅读全文...

13 Mar

初探muP:超参数的跨模型尺度迁移规律

这篇文章我们来学习Maximal Update Parametrization,简称“muP”,它出自论文《Tensor Programs V: Tuning Large Neural Networks via Zero-Shot Hyperparameter Transfer》,随着LLM训练的普及,它逐渐已经成为了科学炼丹的事实标配之一。

众所周知,完整训练一次大型LLM的成本是昂贵的,这就决定了我们不可能直接在大型LLM上反复测试超参数。一个很自然的想法是希望可以在同结构的小模型上仔细搜索超参数,找到最优组合后直接迁移到大模型上。尽管这个想法很朴素,但要实现它并不平凡,它需要我们了解常见的超参数与模型尺度之间的缩放规律,而muP正是这个想法的一个实践。

方法大意

在接入主题之前,必须先吐槽一下muP原论文写得实在太过晦涩,并且结论的表达也不够清晰,平白增加了不少理解难度,所以接下来笔者尽量以一种(自认为)简明扼要的方式来复现muP的结论。

点击阅读全文...

27 Mar

《方程与宇宙》:活力积分和开普勒方程(二)

二体运动

二体运动

上一回的讨论中,我们已经解决了大部分的问题,并且表达了找到r或者$\theta$关于时间t的函数的希望。在最后的内容中,我们做了以下工作:

由(7)得到$\dot{\theta}=h/r^2$,代入(6)得到:
$$\ddot{r} -h^2/r^3=-\frac{\mu}{r^2}\tag{10}$$这是一个二阶微分方程,它的解很容易找出,但是这个积分太复杂:
$$\dot{r}\frac{d\dot{r}}{dr}=h^2/r^3-\frac{\mu}{r^2}$$
$\dot{r}d\dot{r}=(h^2/r^3-\frac{\mu}{r^2})dr$,两端积分
$$\dot{r}^2={2\mu}/r-h^2/r^2+K_1\tag{11}$$$$\Rightarrow {dt}/{dr}=\frac{r}{\sqrt{K_1 r^2+2\mu r-h^2}}$$
$t=\int \frac{r}{\sqrt{K_1 r^2+2\mu r-h^2}}dr$

点击阅读全文...

28 Apr

继续“让Keras更酷一些”之旅。

今天我们会用Keras实现灵活地输出任意中间变量,还有无缝地进行权重滑动平均,最后顺便介绍一下生成器的进程安全写法

首先是输出中间变量。在自定义层时,我们可能希望查看中间变量,这些需求有些是比较容易实现的,比如查看中间某个层的输出,只需要将截止到这个层的部分模型保存为一个新模型即可,但有些需求是比较困难的,比如在使用Attention层时我们可能希望查看那个Attention矩阵的值,如果用构建新模型的方法则会非常麻烦。而本文则给出一种简单的方法,彻底满足这个需求。

接着是权重滑动平均。权重滑动平均是稳定、加速模型训练甚至提升模型效果的一种有效方法,很多大型模型(尤其是GAN)几乎都用到了权重滑动平均。一般来说权重滑动平均是作为优化器的一部分,所以一般需要重写优化器才能实现它。本文介绍一个权重滑动平均的实现,它可以无缝插入到任意Keras模型中,不需要自定义优化器。

至于生成器的进程安全写法,则是因为Keras读取生成器的时候,用到了多进程,如果生成器本身也包含了一些多进程操作,那么可能就会导致异常,所以需要解决这个这个问题。

点击阅读全文...

17 Jun

对比学习可以使用梯度累积吗?

在之前的文章《用时间换取效果:Keras梯度累积优化器》中,我们介绍过“梯度累积”,它是在有限显存下实现大batch_size效果的一种技巧。一般来说,梯度累积适用的是loss是独立同分布的场景,换言之每个样本单独计算loss,然后总loss是所有单个loss的平均或求和。然而,并不是所有任务都满足这个条件的,比如最近比较热门的对比学习,每个样本的loss还跟其他样本有关。

那么,在对比学习场景,我们还可以使用梯度累积来达到大batch_size的效果吗?本文就来分析这个问题。

简介

一般情况下,对比学习的loss可以写为
\begin{equation}\mathcal{L}=-\sum_{i,j=1}^b t_{i,j}\log p_{i,j} = -\sum_{i,j=1}^b t_{i,j}\log \frac{e^{s_{i,j}}}{\sum\limits_j e^{s_{i,j}}}=-\sum_{i,j=1}^b t_{i,j}s_{i,j} + \sum_{i=1}^b \log\sum_{j=1}^b e^{s_{i,j}}\label{eq:loss}\end{equation}
这里的$b$是batch_size;$t_{i,j}$是事先给定的标签,满足$t_{i,j}=t_{j,i}$,它是一个one hot矩阵,每一列只有一个1,其余都为0;而$s_{i,j}$是样本$i$和样本$j$的相似度,满足$s_{i,j}=s_{j,i}$,一般情况下还有个温度参数,这里假设温度参数已经整合到$s_{i,j}$中,从而简化记号。模型参数存在于$s_{i,j}$中,假设为$\theta$。

点击阅读全文...

19 Jun

向量结合复数:常曲率曲线(1)

在之前的一篇向量系列的文章中,我们通过结合物理与向量来巧妙地推导出了曲线(包括平面和空间的)的曲率半径为
$$R=\frac{v^2}{a_c}=\frac{|\dot{\vec{r}}|^3}{|\dot{\vec{r}}\times \ddot{\vec{r}}|}\tag{1}$$
曲率则是曲率半径的导数:$\rho=\frac{1}{R}$。我们反过来思考一下:曲率恒定的平面曲线是否只有圆?

答案貌似是很显然的,我们需要证明一下。

由于只是考虑平面情况,我们先设$\dot{\vec{r}}=(v cos\theta,v sin\theta)=z=ve^{i\theta}$,代入(1)得到
$\frac{\dot{\theta}}{v}=\rho$————(2)

点击阅读全文...

6 Nov

警察捉贼,追牛问题,导弹跟踪

王二小的牛跑了,当他发现时,牛在他正南方300米。且一直向正西方向匀速的跑,王二小立即追牛,他不是朝着一个固定的方向,而是每时每刻都朝着牛的方向跑,且速度是牛速度的4/3倍。当他追上牛时王二小共跑了多远?

问题分析

米拉斯反潜导弹

米拉斯反潜导弹

咋看起来,追牛和导弹是风牛马不相及的两件事:一个是生活小事,一个是物理问题,怎么能够扯到一块呢?

回想一下平时警察抓小偷的过程。警察不是物理学家,不会也可不能先去研究小偷的逃走路线函数,然后设计最小追赶时间的路程吧?那么,在不能预知小偷逃跑路线的前提下,警察要怎样捉小偷呢?很简单,盯死他!是的,只要你以更快的速度,一直朝着他跑,总能够追到的。继续联想下:要想用导弹跟踪摧毁一首敌舰,不也是只能够采用这种方式吗?回看文章开始的“追牛问题”,本质上不是一样的吗?以下是上海交大提出的导弹跟踪问题:

点击阅读全文...