language:
- fi
license: apache-2.0
tags:
- 芬兰语
- llama
datasets:
- Finnish-NLP/CulturaX_fi_cleaned
- Finnish-NLP/HPLT_1.2_fi_cleaned
- Finnish-NLP/wikipedia_20231101_fi_cleaned
- Finnish-NLP/Reddit_fi_2006_2022
- intfloat/multilingual_cc_news
inference: false
pipeline_tag: text-generation
芬兰语Ahma-7B模型
Ahma-7B是基于Meta Llama(v1)架构的70亿参数仅解码器Transformer模型,完全使用芬兰语从头预训练。原始Llama模型架构在这篇论文中提出,并首次发布于此页面。
Ahma是什么意思?Ahma是芬兰语中"狼獾"的意思!在芬兰拉普兰地区,狼獾是造成驯鹿损害的最大原因。
目前有两种不同规模的Ahma基础模型,均从头开始预训练:
- Ahma-3B:训练1390亿token
- Ahma-7B:训练1490亿token
模型 |
上下文长度 |
层数 |
维度 |
头数 |
参数 |
Ahma-3B |
2048 |
26 |
3200 |
32 |
36亿 |
Ahma-7B |
2048 |
32 |
4096 |
32 |
70亿 |
以及两个指令调优版本:
预期用途与限制
该模型仅通过自监督方式预训练,未进行任何监督训练。您可将此模型用于文本生成或针对下游任务进行微调。本模型采用两阶段预训练方法,在第二阶段将单轮指令跟随示例与其他训练数据混合(后文将详细说明)。得益于这种方法,该预训练模型已具备指令跟随能力,但若专门针对指令跟随或其他用例进行微调可能会获得更好效果。进行指令跟随微调时,应使用下文展示的相同提示格式。
使用方法
微调
我们现已添加微调示例笔记本及配套视频!
笔记本:https://huggingface.co/Finnish-NLP/Ahma-3B/blob/main/Finetune_Ahma_3B_example.ipynb
视频:https://www.youtube.com/watch?v=6mbgn9XzpS4
推理
若要将此模型用于指令跟随,需使用与预训练第二阶段相同的提示格式(基本与Meta在其Llama2模型中使用的格式相同)。注意:不要使用transformers库中的"LlamaTokenizer",而应始终使用AutoTokenizer或纯sentencepiece分词器。以下是使用指令跟随提示格式的示例,包含可修改的生成参数:
from transformers import AutoTokenizer, AutoModelForCausalLM
system_prompt = "Olet tekoälyavustaja. Vastaat aina mahdollisimman avuliaasti. Vastauksesi eivät saa sisältää mitään haitallista, epäeettistä, rasistista, seksististä, vaarallista tai laitonta sisältöä. Jos kysymyksessä ei ole mitään järkeä tai se ei ole asiasisällöltään johdonmukainen, selitä miksi sen sijaan, että vastaisit jotain väärin. Jos et tiedä vastausta kysymykseen, älä kerro väärää tietoa."
def format_prompt(prompt: str) -> str:
prompt = f" [INST] <<SYS>>\n{system_prompt.strip()}\n<</SYS>>\n\n{prompt.strip()} [/INST] "
return prompt
tokenizer = AutoTokenizer.from_pretrained("Finnish-NLP/Ahma-7B")
model = AutoModelForCausalLM.from_pretrained("Finnish-NLP/Ahma-7B")
model = model.to("cuda")
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": "Listaa kolme hyötyä, joita pienet avoimen lähdekoodin kielimallit tuovat?"},
]
inputs = tokenizer.apply_chat_template(
messages, tokenize=True, add_generation_prompt=True, return_tensors="pt"
)
inputs = inputs.to("cuda")
generated_ids = model.generate(
inputs,
temperature=0.6,
penalty_alpha=0.6,
top_k=4,
do_sample=True,
repetition_penalty=1.2,
min_length=5,
max_length=2048,
)
generated_text = tokenizer.batch_decode(generated_ids, skip_special_tokens=False)[0]
您也可以尝试不同的系统提示指令。
限制与偏差
该模型仅使用芬兰语文本(不含代码)训练,因此不适用于多语言和代码生成场景。
训练数据包含大量来自互联网的内容,远非中立。因此,模型的预测可能存在偏差。这种偏差也会影响该模型的所有微调版本。
为减少有害内容,训练数据已通过毒性分类器过滤,但无法完全消除所有有害文本。
训练数据
该模型在14个数据集的组合上进行预训练:
原始数据集经过自动清理以过滤低质量和非芬兰语示例。同时使用KenLM模型计算所有文本的困惑度分数,用于确定文本的芬兰语"纯净度"。为减少有毒文本,使用TurkuNLP发布的芬兰语毒性分类器对所有文本示例进行分类。
所有数据集经过拼接并使用MinHashLSH进行近去重。选择困惑度分数前95%作为过滤阈值,剔除质量最差的5%文本。为减少有毒内容,数据集被过滤为仅包含毒性标签分数低于80%的文本示例。
最终训练数据集包含230亿词(使用正则表达式"\w+"计算),评估数据集包含2300万词。分词后,训练数据集有410亿token,评估数据集有4000万token。
两阶段预训练的数据集划分如下:
第一阶段:
数据集 |
词数 |
比例 |
CulturaX |
128.2亿 |
59.88% |
HPLT v1.2 |
50.34亿 |
23.51% |
Suomi24 |
30.18亿 |
14.09% |
其他 |
12.89亿 |
6.02% |
总计 |
214.1亿 |
100% |
第二阶段:
数据集 |
词数 |
比例 |
CulturaX(更干净样本) |
22.52亿 |
55.48% |
其他 |
18.07亿 |
44.52% |
总计 |
40.59亿 |
100% |
训练过程
预处理
使用SentencePiece实现的字节对编码(BPE)进行分词,将所有数字拆分为单独数字,并使用字节分解未知UTF-8字符。总词汇量为64k token。输入为2048个连续token的序列。文本未转为小写,因此该模型区分大小写。预训练中使用了BOS和EOS token。
两阶段预训练
模型在Google TPU研究云赞助的TPUv4-32 VM上训练。训练使用略微修改的基于Jax/Flax的EasyLM框架,受OpenLLaMA项目启发。优化器使用Lion。
两阶段预训练方法受MiniCPM发现启发。第一阶段(占整个训练的79%)使用噪声较大的网络抓取数据集。第二阶段(21%)主要使用更干净的数据集和指令跟随数据集混合。学习率调度采用Warmup-Stable-Decay(WSD)。
第一阶段训练1180亿token,约为第一阶段训练数据的3个epoch。第二阶段训练310亿token,接近第二阶段训练数据的5个epoch。
得益于WSD学习率调度,可以更轻松地尝试不同的第一阶段模型检查点。例如,可以在较早的检查点上应用第二阶段训练,或在第二阶段之前继续预训练。
评估结果
FIN-bench
Ahma 7B基础模型主要使用TurkuNLP的FIN-bench进行评估,并与相关芬兰语模型比较:
0-shot结果:
基准测试 |
Ahma 3B基础 |
Ahma 3B指令 |
Ahma 7B基础 |
Ahma 7B指令 |
FinGPT 8B |
Viking 7B |
Poro 34B(8bit量化) |
非算术平均 |
47.55 |
48.95 |
51.33 |
48.30 |
46.17 |
44.42 |
52.08 |
总体平均 |
36.49 |
34.06 |
29.20 |
29.64 |
38.93 |
36.50 |
40.00 |
3-shot结果:
基准测试 |
Ahma 3B基础 |
Ahma 3B指令 |
Ahma 7B基础 |
Ahma 7B指令 |
FinGPT 8B |
Viking 7B |
Poro 34B(8bit量化) |
非算术平均 |
48.48 |
51.49 |
49.05 |
51.63 |
51.19 |
50.94 |
61.96 |
总体平均 |
42.87 |
47.27 |
33.41 |
37.84 |
46.99 |
48.07 |
57.36 |
可见Ahma 7B基础模型在算术任务上表现不佳,但在非算术任务上明显优于同规模模型,尤其在0-shot使用中。Ahma 7B基础模型甚至在0-shot非算术任务上与5倍大的Poro 34B模型相当。这一结果可能归因于Ahma的两阶段预训练和在预训练阶段包含指令跟随示例。
在3-shot设置下,结果更为复杂。Ahma 7B基础模型在3-shot设置中表现较差,可能是由于使用指令提示格式且仅包含单轮指令跟随训练示例。
MTBench芬兰语
虽然Ahma模型未针对聊天进行微调,但仍使用LumiOpen的MTBench芬兰语进行评估。由于MTBench评估多轮聊天而Ahma基础模型仅使用单轮指令跟随示例预训练,我们分别报告了单轮和多轮评估示例的结果。
单轮结果:
基准测试 |
Ahma 3B基础 |
Ahma 3B指令 |
Ahma 7B基础 |
Ahma 7B指令 |
总体平均 |
3.68 |
4.72 |
4.93 |
5.50 |
多轮结果:
| 基准测试 | Ahma 3B基础 | Ahma 3B指令 | Ahma 7B基础 | Ahma 7B指令 | P