🚀 CNMBert
CNMBert 是一個用於翻譯拼音縮寫的模型,它基於 Chinese-BERT-wwm 訓練而來,通過修改預訓練任務適配拼音縮寫翻譯,在該任務上相較於微調過的 GPT 模型以及 GPT-4o 達到了 SOTA 水平。
🚀 快速開始
安裝依賴
from transformers import AutoTokenizer, BertConfig
from CustomBertModel import predict
from MoELayer import BertWwmMoE
加載模型
tokenizer = AutoTokenizer.from_pretrained("Midsummra/CNMBert-MoE")
config = BertConfig.from_pretrained('Midsummra/CNMBert-MoE')
model = BertWwmMoE.from_pretrained('Midsummra/CNMBert-MoE', config=config).to('cuda')
預測詞語
print(predict("我有兩千kq", "kq", model, tokenizer)[:5])
print(predict("快去給魔理沙看b吧", "b", model, tokenizer[:5]))
輸出示例
['塊錢', 1.2056937473156175], ['塊前', 0.05837443749364857], ['開千', 0.0483869208528063], ['可千', 0.03996622172280445], ['口氣', 0.037183335575008414]
['病', 1.6893256306648254], ['吧', 0.1642467901110649], ['唄', 0.026976384222507477], ['包', 0.021441461518406868], ['報', 0.01396679226309061]
✨ 主要特性
- 適配拼音縮寫翻譯:通過修改預訓練任務,使模型能夠有效處理拼音縮寫到漢字的轉換。
- 多模型可選:提供 CNMBert-Default 和 CNMBert-MoE 兩種模型,滿足不同需求。
- 多種預測模式:支持束搜索和回溯的無剪枝暴力搜索,可根據需求選擇。
📦 安裝指南
文檔未提及具體安裝步驟,可參考相關依賴庫的安裝方法進行安裝。
💻 使用示例
基礎用法
from transformers import AutoTokenizer, BertConfig
from CustomBertModel import predict
from MoELayer import BertWwmMoE
tokenizer = AutoTokenizer.from_pretrained("Midsummra/CNMBert-MoE")
config = BertConfig.from_pretrained('Midsummra/CNMBert-MoE')
model = BertWwmMoE.from_pretrained('Midsummra/CNMBert-MoE', config=config).to('cuda')
print(predict("我有兩千kq", "kq", model, tokenizer)[:5])
高級用法
def backtrack_predict(sentence: str,
predict_word: str,
model,
tokenizer,
top_k=10,
fast_mode=True,
strict_mode=True):
print(backtrack_predict("我有兩千kq", "kq", model, tokenizer)[:5])
📚 詳細文檔
什麼是拼音縮寫
形如 "bhys" -> "不好意思","ys" -> "原神" 這樣,使用拼音首字母來代替漢字的縮寫,我們稱之為拼音縮寫。更多關於拼音縮寫的討論可參考 大家為什麼會討厭縮寫? - 遠方青木的回答 - 知乎。
CNMBert 模型對比
模型 |
模型權重 |
Memory Usage (FP16) |
模型大小 |
QPS |
MRR |
Acc |
CNMBert-Default |
Huggingface |
0.4GB |
131M |
12.56 |
59.70 |
49.74 |
CNMBert-MoE |
Huggingface |
0.8GB |
329M |
3.20 |
61.53 |
51.86 |
說明:
- 所有模型均在相同的 200 萬條 wiki 以及知乎語料下訓練。
- QPS 為 queries per second(由於沒有使用 c 重寫 predict 所以現在性能很糟...)。
- MRR 為平均倒數排名(mean reciprocal rank)。
- Acc 為準確率(accuracy)。
預測函數說明
def predict(sentence: str,
predict_word: str,
model,
tokenizer,
top_k=8,
beam_size=16,
threshold=0.005,
fast_mode=True,
strict_mode=True):
def backtrack_predict(sentence: str,
predict_word: str,
model,
tokenizer,
top_k=10,
fast_mode=True,
strict_mode=True):
注意事項
⚠️ 重要提示
由於 BERT 的自編碼特性,導致其在預測 MASK 時,順序不同會導致預測結果不同,如果啟用 fast_mode
,則會正向和反向分別對輸入進行預測,可以提升一點準確率(2% 左右),但是會帶來更大的性能開銷。strict_mode
會對輸入進行檢查,以判斷其是否為一個真實存在的漢語詞彙。
如何微調模型
請參考 TrainExample.ipynb,在數據集的格式上,只要保證 csv 的第一列為要訓練的語料即可。
Q&A
Q:感覺這個東西準確度有點低啊。
A:可以嘗試設置 fast_mode
和 strict_mode
為 False
。 模型是在很小的數據集(200w)上進行的預訓練,所以泛化能力不足很正常,可以在更大數據集或者更加細分的領域進行微調,具體微調方式和 Chinese-BERT-wwm 差別不大,只需要將 DataCollactor
替換為 CustomBertModel.py
中的 DataCollatorForMultiMask
。
🔧 技術細節
文檔未提供詳細技術細節。
📄 許可證
本項目採用 AGPL-3.0 許可證。
引用
如果您對 CNMBert 的具體實現感興趣的話,可以參考
@misc{feng2024cnmbertmodelhanyupinyin,
title={CNMBert: A Model For Hanyu Pinyin Abbreviation to Character Conversion Task},
author={Zishuo Feng and Feng Cao},
year={2024},
eprint={2411.11770},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2411.11770},
}