模型概述
模型特點
模型能力
使用案例
🚀 芬蘭語版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個人資料,領英個人資料
如有更多細節需求,請隨時聯繫我們🤗



