在推导大模型 Decoder 的自注意力的算术强度时,遇到了如下的数列求和问题:
= i=1∑SoutSin+i1i=1∑Souti1−i=1∑Sini1这涉及到求调和级数的前 n 项和。所以,本文来研究这个问题。
调和级数的敛散性
我们知道,p-级数具有如下敛散性
n=1∑∞np1{ 发散, 收敛,p⩽1p>1当 p=1 时,原级数即为调和级数
n=1∑∞n1为了求出调和级数的前 n 项和,我们需要构造和函数
fn(x)=k=1∑nkxk将调和级数表示成幂级数 fn(x) 在 x=1 处的函数值 fn(1)。首先对 fn(x) 求一阶导数
fn′(x)=k=1∑nxk−1=1−x1−xn两边积分,得到
fn(x)⟹fn(1)=∫1−x1−xndx=∫011−x1−xndx+fn(0)=∫011−x1−xndx求解上述定积分需要借助 Gamma 函数和 Digamma 函数。
Gamma 函数和 Digamma 函数
我们知道,Gamma 函数的定义最初是为了快速计算阶乘的值。它满足
Γ(x)=xΓ(x−1)欧拉给出了 Gamma 函数的积分定义形式
Γ(x)=∫0+∞tx−1e−tdtGamma 函数也被称为第二类欧拉积分。而 Digamma 函数的定义为伽玛函数的对数的导数,即
Ψ(x)=dxdlnΓ(x)=Γ(x)Γ′(x)对 Gamma 函数求导,有
Γ′(x)⟹Γ′(1)=dxd∫0+∞tx−1e−tdt=∫0+∞tx−1e−tlntdt=∫0+∞e−tlntdt=∫01e−tlntdt+∫1+∞e−tlntdt=∫01te−t−1dt+∫1+∞te−tdt=−n→∞lim(k=1∑nk1−lnn)这里省略了中间非常复杂的计算。不过,最终我们得到了一个极限,其中恰好包含调和级数和对数函数。如果能够证明这个极限收敛,就能求出调和级数的前 n 项和。
调和级数与对数函数的关系
首先给出结论:虽然调和级数以及极限
n→∞limlnn都发散,但是它们的差
γ=n→∞limγn=n→∞lim(k=1∑nk1−lnn)收敛。通过 γn 单调递减且有下界,可以证明这个极限存在。我们可以通过计算机求解出这个近似值为
γ≈0.5772156649它被称作欧拉常数。目前,尚不能证明欧拉常数是有理数还是无理数。
这同时也说明了,调和级数和对数函数是同阶无穷大,即当 n→∞ 时
k=1∑nk1∼lnn至此,其实我们可以估算调和级数的前 n 项和为
k=1∑nk1≈lnn+γ并且可以证明
ln(n+1)<k=1∑nk1<lnn+1Digamma 函数的积分形式
有了欧拉常数 γ,通过一系列推导,可以得到 Digamma 函数的积分形式
Ψ(x)=−γ+∫011−t1−tx−1dt做好了上述铺垫后,我们就可以用 Digamma 函数来计算调和级数的前 n 项和
k=1∑nn1=fn(1)=∫011−x1−tndx=Ψ(n+1)+γ