题外话:大家网上所看到的都是真的。无需跟我求证。不过话说回来,这些都不重要。在AGI一浪高过一浪的时代,所有固步自封,不向前看都是暴殄天物,对时代的辜负。今天看到斯坦福抄袭了刘知远老师他们的「小钢炮」MiniCPM-Llama3-V 2.5。就认真研究了一下。说实话,我觉得模型结构创新不多的。Stanford大可不必去抄袭,这些模型代码很多都是将前人一些好的做法糅合在了一起。因此小钢炮也可以说是集百家之长了。除了模型结构外,小钢炮在数据集构建、训练过程的炼丹炉火候把控上做了文章。有不少经验总结。这些trick值得仔细琢磨
训练大模型一个个尝试超参数不现实,他们先构建了一个小数据集,然后在小模型结构下做超参数贝叶斯搜索。具体对下面5组超参数有尝试:1)嵌入输出扩展(Embedding Output Scaling):将嵌入的输出乘以一个缩放因子 scale emb。这有助于调整嵌入层的输出范围,以适应模型规模的变化。2)残差连接扩展(Residual Connection Scaling):在每一层的每个残差连接之前,将块的输出张量乘以 scale depth/pnum layers 的缩放因子。这里 scale depth根据网络的深度进行调整,pnum layers 表示层的数量。这种扩展有助于控制残差连接的梯度流动,防止深层网络中的梯度消失或爆炸问题。3)张量初始化(Initialization of Tensors):将每个二维张量参数的初始化标准差设置为 init std/√dm/dbase,其中 dm 是模型的维度,dbase 是基础维度。其他参数的初始化设置为0.1。这种初始化策略有助于在模型训练开始时为不同规模的模型提供合适的参数范围。4)张量学习率扩展(Learning Rate Scaling of Tensors):调整每个二维张量参数的学习率,使其为其他部分(或整体学习率)的1/(dm/dbase) 倍。这有助于根据模型的规模和维度调整不同参数的学习速率,以实现更稳定的训练。5)语言模型头部扩展(LM Head Scaling):将输出的逻辑值调整为原始值的 1/(dm/dbase)倍。这种扩展有助于控制模型输出的尺度,使得预测的分布不会因为模型规模的变化而发生剧烈变化。Batch size大小也会影响模型训练的最终效果。也是炼丹炉需要掌握的火候之一。Size过大或过小,对于训练时间来说可能影响有限(因为size大,迭代一个batch需要的时间就长了。相同GPU资源下,训练的轮次虽少了,但计算次数跟batchsize小是一样的);但对最终loss的收敛值是有影响的,大,前期loss大,学习率也需要大一点,然后后期loss相对而言也大,从而loss收敛跳跃的幅度也大。
假定学习率其他参数一定的情况下,模型结构大小就提前预定了能得到一个多大收敛loss。那么,batchsize 跟C4数据集上的loss关系大概是一个对数线性关系。他们发现,初始学习率设置为0.01就算最优了。但学习率的衰减计划不能简单用老一套momentum。他们构建了一个叫预热-稳定-衰减的三阶段学习率变化范式。
其中,大小的W T S都讲的是训练步数达到某个临界点。然后是当下的学习率是初始学习率N的一个函数。1、词典表优化。词典表对应就是softmax最后一层回归的shape,shape越大,需要吃的数据和模型结构参数就越多。MiniCPM-1.2B的词典大小用的是一个7万大小的。共享输入-输出层是减少模型参数数量的一种技术,特别是在小型语言模型(SLM)中,嵌入层往往占用了大量参数空间。在MiniCPM-2.4B和MiniCPM-1.2B这两种模型中,为了使模型参数更小,采用了嵌入共享技术。3、transformer搭积木时,选择的是瘦而深的架构。这个跟苹果设计的大语言模型结构是类似的。4、采用了批查询注意力机制。参考的是mobileLLM[1]的做法。这些做法其实跟苹果的之前那个模型结构设计方式大差不差。1、mobile LLM:Zechun Liu, Changsheng Zhao, Forrest Iandola, Chen Lai, Yuandong Tian, Igor Fedorov,Yunyang Xiong, Ernie Chang, Yangyang Shi, Raghuraman Krishnamoorthi, et al. Mobilellm: Optimizing sub-billion parameter language models for on-device use cases. arXiv preprint arXiv:2402.14905, 2024.