/BiLLa

BiLLa: A Bilingual LLaMA with Enhanced Reasoning Ability

Primary LanguagePythonApache License 2.0Apache-2.0

BiLLa: A Bilingual LLaMA with Enhanced Reasoning Ability

BiLLa是开源的推理能力增强的中英双语LLaMA模型。模型的主要特性有:

  • 较大提升LLaMA的中文理解能力,并尽可能减少对原始LLaMA英文能力的损伤;
  • 训练过程增加较多的任务型数据,利用ChatGPT生成解析,强化模型理解任务求解逻辑;
  • 全量参数更新,追求更好的生成效果。

因个人精力有限,我未能将BiLLa与当前主流的开源大模型进行充分的对比评测。以下是经过有限的评测分析得出的结论:

  • BiLLa-7B-LLM 中英语言建模能力显著优于 Chinese-LLaMA-7B
  • BiLLa-7B-SFT 中文推理能力显著优于 BELLE-LLaMA-Ext-7B 等模型;
  • 由GPT4打分,BiLLa-7B-SFT 在英文指令上得分显著高于 ChatGLM-6B,中文得分持平,但解题与代码得分更高。

欢迎开发者们使用BiLLa,更感谢开发者们协助全面评估BiLLa的各项能力!使用时遇到问题可翻阅FAQ模型局限性issues ~

作者10 10 6,深夜或周日不定期回答问题

更新记录

2023.5.21 BiLLa训练代码与训练数据公布!同时梳理了最近的问题,新增FAQ ~

2023.5.18 BiLLa具有视频理解能力啦!达摩院的同学发布Video-LLaMA-BiLLA,感谢对BiLLa能力的认可~

2023.5.16 BiLLa-7B-SFT支持FastChat,方便交互体验!同时加入Chatbot Arena(瑟瑟发抖

2023.5.11 发布BiLLa-7B-LLM、BiLLa-7B-SFT两模型,并提供测试代码。

模型简介

该模型以原始LLaMa模型为基础,进行了如下三个阶段的训练。

  • 第一阶段:扩充中文词表,使用中文预训练语料Wudao、英文预训练语料PILE、翻译语料WMT的中英数据进行二次预训练。
  • 第二阶段:训练数据在第一阶段基础上增加任务型数据,训练过程中两部分数据保持1:1的比例混合。任务型数据均为NLP各任务的主流开源数据,包含有数学解题、阅读理解、开放域问答、摘要、代码生成等,利用ChatGPT API为数据标签生成解析,用于训练提升模型对任务求解逻辑的理解。
  • 第三阶段:保留第二阶段任务型数据,并转化为对话格式,增加其他指令数据(如Dolly 2.0Alpaca GPT4COIG等),进行对齐阶段的微调。

借鉴BELLE之前的工作,三阶段的训练均为全量参数的更新,未使用LoRA。

模型下载与使用

本项目开源的模型包含:

注意:因为LLaMA的License限制,本项目开放的模型权重并不能直接使用。开放的模型权重中word embedding的权重为训练后模型的权重和原始LLaMA权重的和,从而保证拥有LLaMA原始模型授权的开发者可以将本项目发布的模型转化成可以使用的格式。

拥有LLaMA原始模型的开发者可以通过embedding_convert.py完成BiLLa模型权重的还原,以下为示例:

python3 embedding_convert.py \
    --model_dir /path_to_BiLLa/BiLLa-7B-SFT \
    --meta_llama_pth_file /path_to_LLaMA/llama-7b/consolidated.00.pth

BiLLa-7B-SFT模型的使用可参考eval_codes/get_model_answer.py,下面运行示例是获取该模型的生成结果(用于GPT4打分):

python3 get_model_answer.py \
    --model-path /path_to_BiLLa/BiLLa-7B-SFT \
    --model-id billa \
    --question-file table/question_en.jsonl \
    --answer-file table/answer/answer_en_billa.jsonl

BiLLa-7B-SFT的模型输入可利用eval_codes/conversation.pyconv_billa构造,也可按以下格式自行构造(注意Assistant:必须有一个空格):

Human: [Your question]
Assistant: 

模型训练代码与数据

train_codes/README.md

模型评测

语言建模能力

本项目通过Conditional Generation评估模型的语言建模能力,在纯英文和中英混合的测试集上计算模型的Perplexity指标。

纯英文测试集为1000条PILE语料,中英混合测试集为1000条PILE加1000条WuDao语料,测试集数据均未参与BiLLa的训练,评测指标如下:

​中英混合 英文​
Meta LLaMA 7B 5.11
Chinese-LLaMA-7B 14.63​ 8.89​
BiLLa-7B-LLM 6.92 5.47

GPT4打分

本项目将BiLLa-7B-SFT和ChatGLM-6B的模型结果放在一起,由GPT4对比两模型结果进行打分。评测代码见本项目eval_codes/目录,该代码基本复用了FastChat的评测代码

英文评测数据来源于FastChat的80条问题,中文评测数据来源于BELLE的1000条问题,评测指标如下:

LLM-gpt4-eval

英文评测指标

问题类型 数量 BiLLa-7B-SFT ChatGLM-6B
generic 10 8.80 6.35
knowledge 10 8.30 6.70
roleplay 10 8.00 6.90
common-sense 10 8.30 7.55
fermi 10 5.50 6.20
counterfactual 10 7.90 6.70
coding 7 6.43 4.86
math 3 8.00 1.67
writing 10 9.00 6.85
Micro均分 7.84 6.39
Macro均分 7.80 5.97

中文评测指标

问题类型 数量 BiLLa-7B-SFT ChatGLM-6B
coding 38 6.95 6.33
open qa 285 7.42 7.49
brainstorming 179 7.84 8.27
classification 65 7.43 7.32
math 75 7.01 4.56
generation 98 7.88 8.4
summarization 40 7.72 8.78
rewrite 131 7.91 7.96
closed qa 52 7.54 8.19
extract 37 7.46 8.43
Micro均分 7.58 7.63
Macro均分 7.52 7.57

中文复杂推理

这里非常感谢学弟锴锴(PandaLLM作者)协助完成复杂推理的评测工作!

评测集采用LogiQA-v2C3,两数据集均未参与BiLLa的训练,评测指标如下:

LogiQA-v2​ C3-d​ C3-m​
BELLE-LLaMA-Ext-7B 26.41​ 29.52​ ​28.87​
Linly-Chinese-LLaMA-7b-hf 25.91​ 32.28​ 34.52​
Panda-Instruct-7B 31.93 47.30 57.04
BiLLa-7B-SFT 32.74 56.08 64.69

生成示例


Human: 女朋友对男朋友说,我都和你说了200次了,你也不长记性,又乱买东西。请问女生对男朋友说了多少次?
Assistant: 我不知道具体的数量,但是我可以告诉你,当一个人多次向另一个人表达相同的想法或建议时,他们可能会感到沮丧或失望。如果你希望能够与你的女朋友建立良好的沟通,那么最好的方法可能是倾听她的想法和感受,并尽力理解她的立场。这样,你们就可以一起合作,解决问题,并且在未来更好地沟通。


Human: 鸡兔同笼,头共有10,足共有28,请问鸡和兔各多少只?
Assistant: 设鸡的数量为x,兔的数量为y,则有以下两个方程式:

x + y = 10 (因为总数为10)
2x + 4y = 28 (因为每只鸡有2只脚,每只兔有4只脚)

将第一个方程式改写为x = 10 - y,代入第二个方程式中:

2(10-y) + 4y = 28

化简得

-2y + 20 = 28

-2y = -8

y = 4

将y的值代入x = 10-y,得到

x = 6

所以鸡的数量为6只,兔的数量为4只。

答案为6、4。


Human: 用Python写一个冒泡排序算法
Assistant: 这是一个简单的冒泡排序算法的Python实现:

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                
arr = [3, 5, 2, 8, 1, 6]

bubble_sort(arr)
print("排序后的数组:")
for i in range(len(arr)):
    print("%d" %arr[i])

输出结果为:

排序后的数组:
1
2
3
5
6
8

上面的代码中,我们定义了一个名为 bubble_sort 的函数,它接受一个整数数组作为输入。函数中,我们首先定义了一个 n 变量,用于表示数组的长度。
然后我们使用一个嵌套循环来遍历数组中的每个元素。在每一次循环中,我们将当前元素与下一个元素进行比较,如果当前元素大于下一个元素,则交换这两个元素的位置。最后,我们返回排序后的数组。
在主程序中,我们定义了一个包含若干个整数的数组,然后调用 bubble_sort 函数来对这个数组进行排序。最后,我们将排序后的数组打印出来。

FAQ

Q1: 是否计划在SFT基础上继续RLHF?是否有计划训练发布13B或更大的模型?

因个人工作原因,暂时都没法计划。如果有同学愿意继续训练并挂靠在BiLLa项目下,本人是非常乐意的。(还有这等好事?)

Q2: 为什么分三个阶段训练?对比二三阶段合并,效果会有差异吗?

BiLLa工作之初,只是根据自己的认知、经验和实际资源情况独自走到现在,也没有去做消融实验去验证。分三个阶段去训练,完全是基于自身构想的目标。第一阶段强化中文语言建模和第三阶段SFT,这里大多数人都没有异议。对于第二阶段,我加入任务数据,更多的是希望模型可以成为更懂NLP理解逻辑、更擅长推理的底座。

Q3: 测试时生成结果奇怪

Assistant:后面要加空格;不要用huggingface的pipeline

Q4: 评测baseline是否不合理?

欢迎补充评测!(最好是在一个较大的评测集上,跟参数量差不多的模型一起对比~)

Q5: 推理能力似乎一般?

BiLLa目前也只有7B... (你懂我意思吧) 目前和几个大厂和研究院的同学交流下来,给的反馈还是可以的,也都肯定了方向的正确性。不过局限性也如同一开始猜测的那样,常识类的、强知识类的、时事类的问题表现不行,更像是牺牲了模型原来内化的知识,来增强了推理能力。多轮能力表现一般。总结就是,不仅要模型参数量更大,在数据的选择上还要再下些功夫。

模型局限性

当前BiLLa模型未经RLHF训练,泛化性有待观望。

BiLLa训练过程中使用了较多的任务型数据,建议减少常识类的、时事类的提问。

BiLLa训练数据中包含了多轮对话摘要数据,但未直接包含多轮对话的生成数据,因此模型多轮对话能力可能较差。

使用限制

本项目相关资源仅供学术研究,不得用于商业用途。BiLLa生成的内容具有随机性,因而其可能产生有害内容。本项目不承担任何关于模型输出内容的法律责任。

引用

如果BiLLa对你的工作有帮助,欢迎引用!

@misc{BiLLA,
  author = {Zhongli Li},
  title = {BiLLa: A Bilingual LLaMA with Enhanced Reasoning Ability},
  year = {2023},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/Neutralzz/BiLLa}},
}