模型简介
模型特点
模型能力
使用案例
🚀 芬兰语版Ahma-7B模型
Ahma-7B是一个基于Meta的Llama(v1)架构的70亿参数的仅解码器变换器模型,它是在芬兰语数据上从头开始预训练的。原始的Llama模型架构在这篇论文中被提出,并首次在这个页面发布。
“Ahma”是什么意思呢?“Ahma”在芬兰语中是“狼獾”的意思!在芬兰拉普兰地区,狼獾是驯鹿遭受损害的最大原因。
有两种不同大小的基础Ahma模型,它们都是从头开始预训练的:针对1390亿个标记的Ahma-3B和针对1490亿个标记的Ahma-7B:
模型 | 上下文长度 | 层数 | 维度 | 头数 | 参数 |
---|---|---|---|---|---|
Ahma-3B | 2048 | 26 | 3200 | 32 | 36亿 |
Ahma-7B | 2048 | 32 | 4096 | 32 | 70亿 |
还有两个经过指令微调的版本:
模型 | 上下文长度 | 层数 | 维度 | 头数 | 参数 |
---|---|---|---|---|---|
Ahma-3B-Instruct | 2048 | 26 | 3200 | 32 | 36亿 |
Ahma-7B-Instruct | 2048 | 32 | 4096 | 32 | 70亿 |
✨ 主要特性
- 基于Meta的Llama(v1)架构,在芬兰语数据上从头开始预训练。
- 采用两阶段预训练方法,使模型具备一定的指令跟随能力。
- 提供不同大小的基础模型和指令微调版本。
🚀 快速开始
预期用途和限制
此模型仅以自监督的方式进行预训练,没有进行任何有监督的训练。你可以将此模型用于文本生成,或者针对下游任务进行微调。该模型采用了两阶段预训练方法,在第二阶段将单轮指令跟随示例与其他训练数据混合(在本README后面会详细解释)。由于这种方法,这个预训练模型已经具备了指令跟随能力,但如果你针对指令跟随或其他用例进行特定的微调,可能会获得更好的结果。对于指令跟随微调,你应该使用下面展示的相同提示格式。
如何使用
微调
我们现在已经添加了微调示例笔记本以及相关视频!
- 笔记本: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")
# use the custom prompt format function or the chat template feature in the tokenizer to format your inputs
# prompt = format_prompt("Listaa kolme hyötyä, joita pienet avoimen lähdekoodin kielimallit tuovat?")
# inputs = tokenizer(prompt, return_tensors="pt")
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]
"""
1. Parempi luettavuus ja ymmärtäminen: Pienten avoimen lähdekoodin kielimallien avulla voidaan luoda ymmärrettävämpää ja luettavampaa tekstiä, mikä helpottaa ihmisten ymmärtämistä ja tiedon hankkimista.
2. Parempi mukautuvuus ja monipuolisuus: Avoimen lähdekoodin mallit antavat kehittäjille mahdollisuuden luoda räätälöityjä ratkaisuja omiin tarpeisiinsa, jolloin he voivat hyödyntää olemassa olevaa tietämystä ja asiantuntemusta.
3. Lisääntynyt yhteistyö ja avoimuus: Avoimen lähdekoodin mallien ansiosta kehittäjät voivat tehdä yhteistyötä muiden kanssa, jakaa ideoita ja parantaa koodin laatua jakamalla oivalluksia ja parhaita käytäntöjä. Tämä edistää yhteistyöhön perustuvaa ympäristöä ja kannustaa jatkuvaan parantamiseen.
"""
如果你愿意,也可以尝试不同的系统提示指令。
限制和偏差
此模型仅使用芬兰语文本进行训练,不包括代码,因此不应用于多语言和代码生成用例。
该模型使用的训练数据包含大量来自互联网的内容,这些内容远非中立。因此,模型可能会有有偏差的预测。这种偏差也会影响该模型的所有微调版本。
为了减少有毒内容,训练数据使用了毒性分类器进行过滤,但它无法真正消除所有有毒文本。
📦 训练数据
此模型在14个数据集的组合上进行预训练:
- CulturaX_fi_cleaned,我们对原始CulturaX数据集中的芬兰语部分进行了清理。
- HPLT_1.2_fi_cleaned,我们对原始HPLT v1.2数据集中的芬兰语部分进行了清理。
- wikipedia_20231101_fi_cleaned,我们使用了2023年11月的维基百科芬兰语子集。
- Reddit_fi_2006_2022,经过过滤和后处理的芬兰语Reddit数据集。
- Yle Finnish News Archive 2011 - 2018
- Yle Finnish News Archive 2019 - 2020
- Finnish News Agency Archive (STT)
- The Suomi24 Sentences Corpus
- Project Lönnrot
- Finnish parliament speeches
- multilingual_cc_news,我们使用了多语言CC - News数据集中的芬兰语子集。
- fi-news-corpus
- 芬兰高等教育公开论文
- 芬兰单轮指令跟随数据集,由多个最初公开许可的英语数据集翻译成芬兰语组合而成。例如,Ultrachat, Aya, Capybara等
原始数据集经过自动清理,以过滤掉低质量和非芬兰语的示例。此外,使用仅用非常干净的芬兰语文本训练的KenLM模型为所有文本计算了困惑度分数。这个困惑度分数可以用来确定文本包含的芬兰语的“干净”程度。为了减少有毒文本,我们使用了图尔库自然语言处理小组(TurkuNLP)发布的芬兰语毒性分类器TurkuNLP/bert-large-finnish-cased-toxicity对所有文本示例进行分类。分类后的毒性标签分数可以用来确定文本的毒性程度。
所有数据集被连接起来,并使用text - dedup中的MinHashLSH对整个数据集进行近似去重。使用前95%的困惑度分数作为过滤阈值,过滤掉质量最差的5%的文本。为了减少有毒内容的数量,数据集被过滤为只包含“label_identity_attack”、“label_insult”、“label_threat”和“label_severe_toxicity”毒性标签分数低于80%的文本示例。
最后,从CulturaX、维基百科、Yle、STT、Suomi24和Reddit数据集中各随机选择20,000个文本示例作为评估数据集。
最终的训练数据集有230亿个单词(使用正则表达式“\w+”计算),评估数据集有2300万个单词。经过分词后,训练数据集有410亿个标记,评估数据集有4000万个标记。对于两阶段预训练,训练数据集划分如下:
第一阶段:
数据集 | 单词数 | 比例 |
---|---|---|
CulturaX | 128.2亿 | 59.88% |
HPLT v1.2 | 50.34亿 | 23.51% |
Suomi24 | 30.18亿 | 14.09% |
1.41亿 | 0.66% | |
CC - News | 3.11亿 | 1.45% |
FI新闻语料库 | 0.04亿 | 0.02% |
Project Lönnrot | 0.83亿 | 0.39% |
总计 | 214.1亿 | 100.0% |
第二阶段:
数据集 | 单词数 | 比例 |
---|---|---|
CulturaX(使用KenLM困惑度分数选择的更干净的样本) | 22.52亿 | 55.48% |
维基百科 | 0.95亿 | 2.34% |
STT | 2.53亿 | 6.23% |
Yle | 2.12亿 | 5.22% |
芬兰议会演讲 | 0.21亿 | 0.52% |
芬兰高等教育公开论文 | 8.55亿 | 21.07% |
芬兰指令跟随数据集(注意:过采样2倍) | 3.71亿 | 9.14% |
总计 | 40.59亿 | 100.0% |
🔧 技术细节
预处理
使用SentencePiece实现的字节对编码(BPE)对文本进行分词,将所有数字拆分为单个数字,并使用字节来分解未知的UTF - 8字符。总词汇量大小为64k个标记。输入是2048个连续标记的序列。文本不进行小写处理,因此该模型区分大小写:“finnish”和“Finnish”是不同的。在预训练中使用了BOS和EOS标记。
两阶段预训练
该模型在由Google TPU Research Cloud赞助的TPUv4 - 32虚拟机上进行训练。训练使用了基于Jax/Flax的EasyLM框架的略微修改版本,并受到了OpenLLaMA项目的启发。使用的优化器是Lion。
两阶段预训练方法受到了MiniCPM研究结果的启发。在第一阶段(占整个训练的79%),我们使用了噪声较大的网络抓取数据集。在第二阶段(占整个训练的21%),我们主要使用了更干净的数据集和指令跟随数据集混合在一起,就像MiniCPM那样。两阶段预训练的学习率调度是预热 - 稳定 - 衰减(WSD)。在第一阶段,学习率调度在大约80亿个标记上进行线性预热,达到1e - 4的峰值学习率(注意:使用Lion优化器时,学习率必须比常用的AdamW小约10倍),然后是一个稳定阶段,保持1e - 4的学习率不变。在第二阶段,学习率调度在最初的70亿个标记上从1e - 4线性衰减到6e - 6,然后是剩余标记的稳定阶段。
在第一阶段,模型针对1180亿个标记进行训练,大约是第一阶段训练数据的三个轮次,这受到了这篇论文研究结果的启发。在第二阶段,模型针对310亿个标记进行训练,接近第二阶段训练数据的五个轮次。
由于采用了WSD学习率调度,你可以更轻松地尝试不同的第一阶段模型检查点。例如,你可以在较早的检查点上应用第二阶段训练,或者在第二阶段之前继续进行预训练。模型检查点每100,000个训练步骤(大约130亿个标记)推送到此存储库。
📚 详细文档
评估结果
FIN - bench
这个Ahma 7B基础模型主要使用图尔库自然语言处理小组(TurkuNLP)的FIN - bench进行评估,并对其他相关的芬兰语模型进行了相同的评估以作比较:图尔库自然语言处理小组的FinGPT 8B、图尔库自然语言处理小组、SiloGen和HPLT的Viking 7B以及SiloGen、图尔库自然语言处理小组和HPLT的Poro 34B。以下是FIN - bench中0次射击和3次射击设置的结果。
0次射击结果:
基准测试 | Ahma 3B基础模型(指令提示格式) | Ahma 3B指令微调模型(指令提示格式) | Ahma 7B基础模型(指令提示格式) | Ahma 7B指令微调模型(指令提示格式) | FinGPT 8B | Viking 7B | Poro 34B(8位量化) |
---|---|---|---|---|---|---|---|
类比 | 50.77 | 48.46 | 56.92 | 41.54 | 49.23 | 40.00 | 54.62 |
算术 | 27.64 | 22.14 | 11.50 | 14.70 | 33.15 | 30.16 | 30.34 |
因果关系 | 59.48 | 58.82 | 59.48 | 53.60 | 66.01 | 58.82 | 62.74 |
情感 | 36.25 | 28.12 | 36.25 | 27.50 | 22.50 | 26.25 | 35.63 |
实证判断 | 33.33 | 35.35 | 33.33 | 33.33 | 27.27 | 33.33 | 49.49 |
常识 | 44.29 | 48.57 | 51.43 | 37.14 | 40.00 | 24.29 | 51.43 |
HHH对齐 | 42.09 | 41.66 | 44.23 | 43.22 | 41.81 | 42.51 | 42.92 |
意图识别 | 24.42 | 26.16 | 43.64 | 56.94 | 17.49 | 22.40 | 68.35 |
误解 | 46.27 | 47.01 | 46.27 | 47.01 | 53.73 | 53.73 | 52.24 |
释义 | 59.50 | 73.00 | 67.00 | 70.50 | 51.00 | 50.00 | 51.00 |
句子歧义 | 53.33 | 65.00 | 60.00 | 63.33 | 51.67 | 48.33 | 50.00 |
相似性抽象 | 65.79 | 68.42 | 71.05 | 61.84 | 60.53 | 65.79 | 60.53 |
非算术平均 | 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次射击结果:
基准测试 | Ahma 3B基础模型(指令提示格式) | Ahma 3B指令微调模型(指令提示格式) | Ahma 7B基础模型(指令提示格式) | Ahma 7B指令微调模型(指令提示格式) | FinGPT 8B | Viking 7B | Poro 34B(8位量化) |
---|---|---|---|---|---|---|---|
类比 | 50.77 | 49.23 | 49.23 | 43.08 | 40.77 | 54.62 | 76.92 |
算术 | 38.38 | 43.89 | 20.88 | 26.81 | 43.63 | 45.78 | 53.68 |
因果关系 | 60.78 | 64.71 | 66.01 | 62.74 | 64.05 | 58.82 | 67.32 |
情感 | 30.00 | 41.25 | 30.00 | 53.75 | 44.37 | 48.13 | 56.87 |
实证判断 | 46.46 | 44.44 | 39.39 | 39.39 | 32.32 | 43.43 | 63.64 |
常识 | 47.14 | 40.00 | 27.14 | 44.29 | 54.29 | 28.57 | 74.29 |
HHH对齐 | 43.53 | 44.80 | 43.80 | 45.09 | 45.39 | 44.80 | 46.07 |
意图识别 | 20.52 | 44.22 | 36.42 | 39.02 | 51.45 | 58.82 | 83.67 |
误解 | 50.75 | 52.24 | 46.27 | 51.49 | 52.99 | 46.27 | 52.99 |
释义 | 50.50 | 58.50 | 57.50 | 65.00 | 53.00 | 54.50 | 55.00 |
句子歧义 | 53.33 | 48.33 | 53.33 | 51.67 | 51.67 | 53.33 | 66.67 |
相似性抽象 | 69.74 | 72.37 | 72.37 | 69.74 | 64.47 | 73.68 | 75.00 |
非算术平均 | 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基础模型在算术任务上表现不佳,但在非算术任务上明显优于相同大小的模型,如FinGPT 8B和Viking 7B,尤其是在0次射击的使用场景中。在0次射击的非算术任务中,Ahma 7B基础模型甚至与大5倍的Poro 34B模型相当。这一结果可能归因于Ahma的两阶段预训练以及在预训练阶段包含指令跟随示例。
在3次射击设置中,结果更为复杂。Ahma 7B基础模型在3次射击设置中表现较差,可能是由于使用了指令提示格式,并且只有单轮指令跟随训练示例。
MTBench芬兰语
这个Ahma 7B基础模型还使用LumiOpen的MTBench芬兰语进行了评估,尽管这个Ahma模型没有针对聊天进行微调。由于MTBench还评估多轮聊天,而Ahma基础模型仅使用单轮指令跟随示例进行预训练,我们分别报告了MTBench芬兰语单轮和多轮评估示例的结果。为了进行比较,我们从SiloGen、图尔库自然语言处理小组和HPLT的Poro 34B聊天模型的模型卡片中复制了其可能的多轮结果。
单轮结果:
基准测试 | Ahma 3B基础模型(指令提示格式) | Ahma 3B指令微调模型(指令提示格式) | Ahma 7B基础模型(指令提示格式) | Ahma 7B指令微调模型(指令提示格式) |
---|---|---|---|---|
编码 | 1.00 | 1.00 | 1.70 | 1.10 |
提取 | 2.00 | 1.30 | 3.10 | 3.00 |
人文学科 | 4.05 | 6.20 | 6.60 | 8.00 |
数学 | 3.00 | 3.20 | 3.90 | 2.90 |
推理 | 2.90 | 4.60 | 3.70 | 5.70 |
角色扮演 | 4.80 | 6.50 | 6.60 | 7.20 |
科学、技术、工程和数学(STEM) | 5.10 | 5.95 | 6.75 | 7.30 |
写作 | 6.60 | 9.00 | 7.10 | 8.80 |
总体平均 | 3.68 | 4.72 | 4.93 | 5.50 |
多轮结果:
基准测试 | Ahma 3B基础模型(指令提示格式) | Ahma 3B指令微调模型(指令提示格式) | Ahma 7B基础模型(指令提示格式) | Ahma 7B指令微调模型(指令提示格式) | Poro 34B聊天模型 |
---|---|---|---|---|---|
编码 | 1.00 | 1.00 | 1.40 | 1.05 | 3.70 |
提取 | 1.55 | 1.15 | 2.05 | 2.65 | 6.37 |
人文学科 | 3.25 | 6.20 | 4.95 | 7.85 | 9.25 |
数学 | 2.20 | 2.70 | 2.50 | 2.40 | 1.20 |
推理 | 2.45 | 3.50 | 2.55 | 4.50 | 4.35 |
角色扮演 | 4.90 | 6.40 | 6.35 | 6.60 | 7.35 |
科学、技术、工程和数学(STEM) | 4.20 | 4.78 | 4.28 | 5.40 | 7.80 |
写作 | 3.80 | 6.65 | 4.10 | 6.25 | 8.50 |
总体平均 | 2.92 | 4.05 | 3.52 | 4.59 | 6.06 |
可以看出,正如预期的那样,Ahma 7B基础模型在多轮示例中表现不佳,因为它仅使用单轮指令跟随示例进行预训练。此外,编码性能如预期的那样较差,因为Ahma 7B模型没有使用代码数据进行训练。在单轮设置中,Ahma 7B优于Ahma 3B基础模型和指令微调版本,展示了通过指令微调进一步改进的更大基础能力。
📄 许可证
本项目采用Apache 2.0许可证。
致谢
如果没有谷歌通过TPU Research Cloud慷慨提供的计算资源,这个项目是不可能完成的。
团队成员
- Aapo Tanskanen,Hugging Face个人资料,领英个人资料
- Rasmus Toivanen,Hugging Face个人资料,领英个人资料
如有更多细节需求,请随时联系我们🤗



