基于Llama的藏文增量预训练及模型开源共享


一、ChatGPT简要技术回顾

为何出圈:不再是传统意义的人机对话系统,而是以自然语言为交互方式的通用语言处理平台。

  • 技术有突破:基础数据+核心模型+优化算法
  • 应用接地气:几乎可以完成所有语言相关的功能
  • 效果超预期:相比于先前系统效果产生质的飞跃

超出预期的交互体验:(1) 通用的意图理解能力;(2) 强大的连续对话能力;(3) 智能的交互修正能力;(4) 较强的逻辑推理能力。

二、基于海量数据的自监督学习

人工智能是研究人类智能的理论。人工智能旨在研发模拟人类智能的技术和系统。人工智能是研究用于模拟和扩展人类智能的理论的科学。人工智能是计算机科学的一个分支,它企图了解人类智能的本质。人工智能旨在产出一种新的能以人类智能相似的方式做出反应的智能机器。该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。

人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能……

三、ChatGPT核心技术:基于人类反馈的学习

二、问题

预训练(Pretraining)是一个非常消耗资源的工作,尤其在 LLM 时代。随着LLama2的开源,越来越多人都开始尝试在这个强大的英文基座模型上进行中文增强。目前不少开源模型在英文以及中文等语种上具有不错的效果,但由于缺乏领域数据,往往在一些特定语种中表现不理想,这时就需要增量预训练和微调等方法来提高模型的特定语种任务的能力。今天给大家带来一篇基于Llama2-7B的藏文增量预训练方法。

三、方案

3.1 硬件设备

Sun Apr 14 18:29:42 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 520.61.05    Driver Version: 520.61.05    CUDA Version: 11.8     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla V100-DGXS...  On   | 00000000:07:00.0 Off |                    0 |
| N/A   43C    P0    39W / 300W |    118MiB / 32768MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  Tesla V100-DGXS...  On   | 00000000:08:00.0 Off |                    0 |
| N/A   44C    P0    54W / 300W |   3158MiB / 32768MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  Tesla V100-DGXS...  On   | 00000000:0E:00.0 Off |                    0 |
| N/A   42C    P0    38W / 300W |      4MiB / 32768MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   3  Tesla V100-DGXS...  On   | 00000000:0F:00.0 Off |                    0 |
| N/A   43C    P0    39W / 300W |      4MiB / 32768MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

3.1 训练数据

CPT 数据集为通用领域,主要包含不同阶段的教科书、藏文学术论文、云藏网、中国藏文学术期刊网、国家哲学社会科学学术期刊数据库、BDRC、西藏人民网以及主流媒体公众号等,全部开源。

3.2 基座模型

在本研究中,本文采用Llama 2 作为基础模型,具体分别使用7B 和13B 两个版本。本文没有对模型架构进行重大更改。选择Llama 2 作为基础模型的原因在于其在处理长上下文任务方面已经展现出了强大的性能,而我们的目标是通过CPT 持续预训练,进一步扩展其在较长上下文的藏文上的能力。

3.3 训练参数

CUDA_VISIBLE_DEVICES=3 python src/train_bash.py \
    --stage pt \
    --do_train \
    --model_name_or_path Llama2_7B_base \
    --dataset train_post_merge \
    --finetuning_type freeze \
    --lora_target q_proj,v_proj \
    --output_dir path_to_pt_checkpoint \
    --overwrite_cache \
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \
    --lr_scheduler_type cosine \
    --logging_steps 10 \
    --save_steps 50000 \
    --learning_rate 1e-5 \
    --num_train_epochs 3.0 \
    --plot_loss \
    --fp16

3.4 损失函数

基于Llama的藏文增量预训练loss下降图

四、新意

4.1 加载预测方法

# -- coding: utf-8 --
# @time :
# @author : shajiu
# @email : 18810979033@163.com
# @file : .py
# @software: pycharm
def llama2_7B_base(content,per_model_path):
    """
    用于预测llama2_7b_base模型
    :param content: 待预测的query
    :param per_model_path: 模型路径
    :return:
    """
    import torch
    from transformers import LlamaForCausalLM,LlamaTokenizer
    device=torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")
    tokenizer=LlamaTokenizer.from_pretrained(per_model_path)
    model=LlamaForCausalLM.from_pretrained(per_model_path, device_map='auto', trust_remote_code=True)
    input_ids = tokenizer(content, return_tensors="pt").input_ids
    input_ids = input_ids.to(device)
    pred=model.generate(input_ids, max_new_tokens=500, do_sample=True, top_k=30, top_p=0.85, temperature=0.5,
                             repetition_penalty=1., eos_token_id=2, bos_token_id=1, pad_token_id=0)
    rets = tokenizer.batch_decode(pred, skip_special_tokens=True, clean_up_tokenization_spaces=False)
    output=rets[0].strip().replace(content, "")
    print("Assistant:\n",output)

五、贡献

15G增量预训练数据全部开源
基于Llama的藏文增量预训练模型及权重共享

六、价值

我们构建了一个15G 的大规模高质量藏语无监督预训练数据集,首次针对藏语构建15G的CPT数据集,且通过CPT后开源了对应的模型以及权重。

七、效果(结论)

  • warmup 的步数不会影响最终性能

    当模型经过「充分」训练后,不管多长的预热步数最后的性能都差不多。
    这种前提是「充分训练」,如果只看训练前期的话,使用更长的预热步数(黄色的线)。无论是「上游任务」还是「下游任务」,模型的 Loss 都要比其他预热步数要低(下游学的快,上游忘的慢)。

  • 学习率越大,下游任务越好,上游任务越差

    经过充分训练后,学习率越大,下游性能最好,上游性能最差(忘得最多)。同样,我们看前期训练,尽管紫色线条在最后的 loss 是最低的,但在前期 loss 会增加的非常大,随后下降。

  • 在初始预训练中使用 Rewarmup 会损伤性能

    尽管 warmup 策略在 Finetune 和 Continue Pretraining 中都起到了更好的效果(相较于常量学习率),但是,这建立在「切换了训练数据集(数据分布)」的前提下。
    在原数据集上使用 warmup 接着训练会造成性能损伤,学习率越大则损伤越大,且这种损伤是无法在后续的训练中被找回的。

八、个人反思

缺陷:特定语种数据训练后,往往通用能力会有所下降,需要混合通用数据以缓解模型遗忘通用能力。
考虑:LLaMA本身对中文的支持不友好,大多数相关衍生工作是直接在原版上进行pretrain/finetune的,从而采取了更大胆的策略——增加中文词表,可能进一步加剧中文训练不充分的问题,但从长远看是否有利于后续进一步预训练就得靠时间检验了,加入词表是有一定破坏性的:

一是破坏原有分词体系;
二是增加了未训练的权重。

所以如果不能进行充分训练的话,可能会有比较大的问题。如果不是特别专的领域(比如生物医学等涉及很多专业词汇的领域)没有太大必要去扩充英文词表。


文章作者: 沙九
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 沙九 !
  目录
s's