LLaMA阅读笔记

LLaMA: Open and Efficient Foundation Language Models
介绍了论文中 “2. Approach” 部分,包括数据集和网络结构优化
数据来源:全部为开源数据集

预训练是一种利用大量无标注数据来训练一个通用模型的方法,然后再用特定任务的数据来微调模型。
数据混合是一种将不同来源或类型的数据组合在一起的方法,以增加数据的多样性和覆盖率。
采样比例是指从每个子集中抽取数据的概率。
轮数(epoch)是指对整个数据集进行一次完整的训练:除了书和wiki,其他都是1epoch
下面介绍一下看着陌生的Dataset:
CommonCrawl:用CCNet pipline 提取和过滤从互联网中爬取下来的文本,它可以根据语言、长度、重复度等标准来选择高质量的文本。
C4:也是互联网中爬取下的文本,但它的文本质量过滤依赖于一些启发式的标准,比如网页中的标点符号或者单词和句子的数量。
StackExchange:一些问答网站,有各个领域的高质量问答数据。
Tokenizer:
Bytepair encoding algorithm (BPE) : BPE算法是一种数据压缩算法,它可以将文本切分为任意大小的单元,不受语言或字符集的限制。它的基本思想是,每一步都将最常见的一对相邻数据单位替换为该数据中没有出现过的一个新单位,反复迭代直到满足停止条件。它可以有效地处理未登录词和稀有词,提高语言模型的性能。ChatGPT使用的也是BPE算法。
另外,他们把数分成单个的数字,对于未知的UTF-8字符,用的字节进行分解。
网络结构&训练
提高效率效率:
网络用了causal multi-head attention(因果自注意力)减少内存和训练时间,它可以保证只考虑当前和之前的输入。因果自注意力用一个掩码(mask)来实现,即在计算相似度时,把未来时刻的输入屏蔽掉。为了提高效率,用了XFormers和FlashAttention实现
用检查点(checkpointing)减少了反向传播过程中需要重新计算的激活值(activations)。具体来说,我们保存了那些计算代价较高的激活值,比如线性层的输出。
模型和序列并行:这是一种分布式训练的方法,它可以把一个大模型或者一个长序列拆分成多个小块,分配给不同的GPU进行并行计算,从而减少单个GPU的负担和内存需求。
计算和通信重叠:这是一种提高计算效率的方法,它可以让GPU在计算激活值的同时进行网络通信,从而减少等待时间和同步开销。
网络结构的优化:
Pre-normalization: 为了让训练更加稳定,llama给 transformer sub-layer 的输入做了normalize,而不是输出。用了RMSNorm
SwiGLU激活: ReLU替换成了SwiGLU。SwiGLU是一种激活函数,它是Gated Linear Units (GLU)的一种变体,使用Swish函数代替sigmoid函数。它可以提高transformer模型的性能,比ReLU或GELU激活函数更好。SwiGLU的优点是它可以动态地调整信息流的门控程度,根据输入的不同而变化。ReLU的缺点是它会导致神经元死亡,即输出为零的情况。GELU的缺点是它比ReLU更复杂,计算量更大。
旋转嵌入(Rotary Embeddings): GPTNeo是一种新型的位置编码方法,它可以兼顾绝对位置和相对位置的信息。它的基本思想是通过一个旋转矩阵来调整每个单词或标记的嵌入向量,使得它们的内积只与它们的相对位置有关。旋转嵌入不需要预先定义或学习位置嵌入向量,而是在网络的每一层动态地添加位置信息。旋转嵌入有一些优点,比如可以处理任意长度的序列,可以提高模型的泛化能力,可以减少计算量,可以适用于线性Attention等。
Optimizer:
AdamW, cosine learning rate, warmup
