26 Nov

求解微分方程的李对称方法(二)

由于重装系统时的粗心大意,笔者把《求解微分方程的李对称方法》的Word文档弄丢了,更不幸的是存有该文档的U盘也弄丢了~没办法,只好重新把这篇文章录入了。幸好之前曾把它打印成纸质版,还有旧稿可以参考。现发布《求解微分方程的李对称方法(二)》,希望能够为对李对称方法有兴趣的朋友提供些许资源。

相比(一),(二)将所有内容重新用CTex录入了,果然,$\LaTeX$才是写数学论文软件中的佼佼者,虽然是纯代码编辑,但是这正符合我追求简洁清晰的风格。在内容上,(二)增加了一阶常微分方程组的内容,并对(一)的部分细节做了修改,本文完成后就初步相对完整地叙述了一阶常微分方程组的李对称积分的思路,内容增加到了13页。而在接下来的(三)中,将会提供李代数的内容;如果有(四)的话,就会谈到李对称方法的计算机实现。希望大家会喜欢这系列文章。更期待大家的读后感(包括挑错)^_^

点击阅读全文...

18 Jun

线性微分方程组:已知特解求通解

含有$n$个一阶常微分方程的一阶常微分方程组
$$\dot{\boldsymbol{x}}=\boldsymbol{A}\boldsymbol{x}$$
其中$\boldsymbol{x}=(x_1(t),\dots,x_n(t))^{T}$为待求函数,而$\boldsymbol{A}=(a_{ij}(t))_{n\times n}$为已知的函数矩阵。现在已知该方程组的$n-1$个线性无关的特解$\boldsymbol{x}_1,\boldsymbol{x}_2,\dots,\boldsymbol{x}_{n-1}$(解的列向量),求方程的通解。

这是我的一位同学在6月5号问我的一道题目,我当时看了一下,感觉可以通过李对称的方法很容易把解构造出来,当晚就简单分析了一下,发现根据李对称的思想,由上面已知的信息确实足以把通解构造出来。但是我尝试了好几天,尝试了几何、代数等思想,都没有很好地构造出相应的正则变量出来,从而也没有写出它的显式解,于是就搁置下来了。今天再分析这道题目时,竟在无意之间构造出了让我比较满意的解来~

点击阅读全文...

27 Oct

算符的艺术:差分、微分与伯努利数

两年前,笔者曾写过《算子与线性常微分方程》两篇,简单介绍了把线形常微分方程算符化,然后通过对算符求逆的方法求得常微分方程的通解。而在这篇文章中,笔者打算介绍关于算符类似的内容:差分算符、微分算符以及与之相关的伯努利数(Bernoulli数)。

我们记$D=\frac{d}{dx}$,那么$Df=\frac{df}{dx}$,同时定义$\Delta_t f(x)=f(x+t)-f(x)$,并且记$\Delta \equiv \Delta_1 =f(x+1)-f(x)$,这里我们研究的$f(x)$,都是具有良好性态的。我们知道,$f(x+t)$在$t=0$附近的泰勒展式为
$$\begin{aligned}f(x+t)&=f(x) + \frac{df(x)}{dx}t + \frac{1}{2!}\frac{d^2 f(x)}{dx^2}t^2 + \frac{1}{3!}\frac{d^3 f(x)}{dx^3}t^3 + \dots\\
&=\left(1+t\frac{d}{dx}+\frac{1}{2!}t^2\frac{d^2}{dx^2}+\dots\right)f(x)\\
&=\left(1+tD+\frac{1}{2!}t^2 D^2+\dots\right)f(x)\end{aligned}$$

点击阅读全文...

20 Nov

Transformer升级之路:15、Key归一化助力长度外推

大体上,我们可以将目前Transformer的长度外推技术分为两类:一类是事后修改,比如NTK-RoPEYaRNReRoPE等,这类方法的特点是直接修改推理模型,无需微调就能达到一定的长度外推效果,但缺点是它们都无法保持模型在训练长度内的恒等性;另一类自然是事前修改,如ALIBIKERPLEXPOS以及HWFA等,它们可以不加改动地实现一定的长度外推,但相应的改动需要在训练之前就引入,因此无法不微调地用于现成模型,并且这类方法是否能够Scale Up还没得到广泛认可。

在这篇文章中,笔者将介绍一种意外发现的长度外推方案——“KeyNorm”——对Attention的Key序列做L2 Normalization,很明显它属于事前修改一类,但对Attention机制的修改非常小,因此看上去非常有希望能够Scale Up。

最初动机

之所以说“意外发现”,是因为该改动的原始动机并不是长度外推,而是尝试替换Scaled Dot-Product Attention中的Scale方式。我们知道,Attention的标准定义是(本文主要考虑Causal场景)
\begin{equation}\boldsymbol{o}_i = \frac{\sum_{j = 1}^i\exp\left(\frac{\boldsymbol{q}_i\cdot \boldsymbol{k}_j}{\sqrt{d}}\right)\boldsymbol{v}_j}{\sum_{j = 1}^i\exp\left(\frac{\boldsymbol{q}_i\cdot \boldsymbol{k}_j}{\sqrt{d}}\right)},\quad \boldsymbol{q}_i,\boldsymbol{k}_j\in\mathbb{R}^d\label{eq:sdpa}\end{equation}

点击阅读全文...

22 Nov

基于Amos优化器思想推导出来的一些“炼丹策略”

如果将训练模型比喻为“炼丹”,那么“炼丹炉”显然就是优化器了。据传AdamW优化器是当前训练神经网络最快的方案,这一点笔者也没有一一对比过,具体情况如何不得而知,不过目前做预训练时多数都用AdamW或其变种LAMB倒是真的。然而,正如有了炼丹炉也未必能炼出好丹,即便我们确定了选择AdamW优化器,依然有很多问题还没有确定的答案,比如:

1、学习率如何适应不同初始化和参数化?

2、权重衰减率该怎么调?

3、学习率应该用什么变化策略?

4、能不能降低优化器的显存占用?

尽管在实际应用时,我们大多数情况下都可以直接套用前人已经调好的参数和策略,但缺乏比较系统的调参指引,始终会让我们在“炼丹”之时感觉没有底气。在这篇文章中,我们基于Google最近提出的Amos优化器的思路,给出一些参考结果。

点击阅读全文...

6 Oct

哥德巴赫猜想浅谈1

高斯说过“数学是科学的皇后,而算术则是数学的女王。”这里的“算术”,其实就是我们现在所说的数论。从很小的时候开始,我便对数论情有独钟。虽然后来接触了很多更为有趣的数学分支,但是对数学的热情依然不减。我想,这大概是因为小时候的情结吧。小学时候,小小年纪的我,刚刚学完素数、合数、约数、整除等等概念,对数字尤其有兴趣。我想,在那时候我唯一能够读懂的数学难题只有数论这一领域吧。比如费马大定理,$x^n+y^n=z^n$,对于n大于2没有正整数解,很容易就知道它在讲什么;再比如,哥德巴赫猜想,每个大于4的偶数都可以分拆成两个奇素数之和,也很简单就弄懂它讲的是什么。所以,小小的我看懂了这些问题后就饶有兴致地摆弄数字啦,也许正因为如此,才让我对数字乃至对数学都有深厚的爱。

哥德巴赫猜想,无疑是数论中的一个璀璨明珠,可是目前来讲,它还是可望不可即的。一个看似如此简单的猜想,却困惑了数学家几百年,至今无人能解。尽管如此,我还是愿意细细地研究它,慢慢地品味它,在“论证”、或者说验算它的时候,欣赏到数学那神秘的美妙。本文主要就是研究给定偶数的“哥德巴赫分拆数”,即通过实际验算得出每个偶数分拆为两个素数之和的不同分拆方式的数目,比如6=3+3,只有一种分拆方式;8=3+5=5+3;有两种分拆方式;10=3+7=5+5=7+3,有三种分拆方式;等等。偶数2n的分拆数记为$G_2 (2n)$。

(这里定义的“分拆数”跟网上以及一般文献中的定义不同,这里把3+5和5+3看成是两种分拆方式,而网上一般的定义是只看成一种。我这里的定义的好处在于分拆方式的数目实际表示了分拆中涉及到的所有素数的个数。)

哥德巴赫猜想很难,这话没错,但是事实上哥德巴赫猜想是一个非常弱的命题。它说“每个大于4的偶数至少可以分拆成两个奇素数之和”,用上面的术语来说,就是每个偶数的“哥德巴赫分拆数”大于或等于1。可是经过实际验算发现,偶数越大,它的哥德巴赫分拆数越大,两者整体上是呈正相关关系的,比如$G_2 (100)=12,G_2 (1000)=56,G_2 (10000)=254$......所以,从强弱程度上来讲,这和“少于n的素数至少有一个”是差不多的(当然,难度有天壤之别)。

点击阅读全文...

12 Mar

历史上的谜案——刘徽有没有使用外推法?

刘徽

刘徽

话说当年我国古代数学家刘徽创立“割圆术”计算圆周率的事迹,在今天已被不少学生知晓;虽不能说家喻户晓,但是也为各教科书以及老师津津乐道。和古希腊的“数学之神”阿基米德同出一辙,刘徽也是使用圆的内接、外切正多边形来逼近圆形的;不一样的是,刘徽使用的方法是计算半径为1的圆的内接、外切正多边形的面积,而阿基米德计算的则是直径为1的圆的内接、外切正多边形的周长。两者的计算效果有什么区别呢?其实阿基米德的方法应该更快一点,阿基米德算到正n边形所得到的值,相当于刘徽算到正2n边形了。

在此我们不再对两者的计算方法进行区分,因为两者的本质都是一样的。按照现代数学的写法,“割圆术”的理论依据是
$$lim_{n\to \infty} n \sin(\frac{\pi}{n})=\pi\tag{1}$$
当然,刘徽不可能有现代计算正弦函数值的公式(现在计算正弦函数值一般用泰勒级数展开,而泰勒级数展开需要用到$\pi$的值),甚至在他那个时代就连笔墨也没有,据我所知即使是后来的祖冲之推算圆周率时,唯一的计算工具也只是现在称为“算筹”的小棍。不过刘徽还是凭借着超强的毅力,利用递推的方法逐步求圆周率。

点击阅读全文...

本文的主题是“为什么我们需要有限的学习率”,所谓“有限”,指的是不大也不小,适中即可,太大容易导致算法发散,这不难理解,但为什么太小也不好呢?一个容易理解的答案是,学习率过小需要迭代的步数过多,这是一种没有必要的浪费,因此从“节能”和“加速”的角度来看,我们不用过小的学习率。但如果不考虑算力和时间,那么过小的学习率是否可取呢?Google最近发布在Arxiv上的论文《Implicit Gradient Regularization》试图回答了这个问题,它指出有限的学习率隐式地给优化过程带来了梯度惩罚项,而这个梯度惩罚项对于提高泛化性能是有帮助的,因此哪怕不考虑算力和时间等因素,也不应该用过小的学习率。

对于梯度惩罚,本博客已有过多次讨论,在文章《对抗训练浅谈:意义、方法和思考(附Keras实现)》《泛化性乱弹:从随机噪声、梯度惩罚到虚拟对抗训练》中,我们就分析了对抗训练一定程度上等价于对输入的梯度惩罚,而文章《我们真的需要把训练集的损失降低到零吗?》介绍的Flooding技巧则相当于对参数的梯度惩罚。总的来说,不管是对输入还是对参数的梯度惩罚,都对提高泛化能力有一定帮助。

点击阅读全文...