语言:
- 阿萨姆语
- 孟加拉语
- 古吉拉特语
- 印地语
- 卡纳达语
- 马拉雅拉姆语
- 马拉地语
- 奥里亚语
- 旁遮普语
- 泰米尔语
- 泰卢固语
标签:
- 多语言
- 自然语言处理
- 印度语言处理
IndicBART 是一个专注于印度语言和英语的多语言序列到序列预训练模型。它目前支持11种印度语言,并基于mBART架构构建。您可以通过使用有监督的训练数据对模型进行微调,以构建印度语言的自然语言生成应用,如机器翻译、摘要生成、问题生成等。IndicBART的一些显著特点包括:
- 支持的语言:阿萨姆语、孟加拉语、古吉拉特语、印地语、马拉地语、奥里亚语、旁遮普语、卡纳达语、马拉雅拉姆语、泰米尔语、泰卢固语和英语。mBART50和mT5并不支持所有这些语言。
- 模型比mBART和mT5(基础版)小得多,因此在微调和解码时计算成本更低。
- 在大型印度语言语料库(4.52亿句子和90亿词元)上训练,其中包括印度英语内容。
- 除英语外,所有语言均以天城文书写,以促进相关语言之间的迁移学习。
您可以在这篇论文中了解更多关于IndicBART的信息。
详细文档请参阅:https://github.com/AI4Bharat/indic-bart/ 和 https://indicnlp.ai4bharat.org/indic-bart/
预训练语料库
我们使用了涵盖12种语言的IndicCorp数据,包含4.52亿句子(90亿词元)。模型采用mBART的文本填充目标进行训练。
使用方法:
from transformers import MBartForConditionalGeneration, AutoModelForSeq2SeqLM
from transformers import AlbertTokenizer, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("ai4bharat/IndicBART", do_lower_case=False, use_fast=False, keep_accents=True)
# 或使用 tokenizer = AlbertTokenizer.from_pretrained("ai4bharat/IndicBART", do_lower_case=False, use_fast=False, keep_accents=True)
model = AutoModelForSeq2SeqLM.from_pretrained("ai4bharat/IndicBART")
# 或使用 model = MBartForConditionalGeneration.from_pretrained("ai4bharat/IndicBART")
# 初始映射
bos_id = tokenizer._convert_token_to_id_with_added_voc("<s>")
eos_id = tokenizer._convert_token_to_id_with_added_voc("</s>")
pad_id = tokenizer._convert_token_to_id_with_added_voc("<pad>")
# 获取语言ID可使用['<2as>', '<2bn>', '<2en>', '<2gu>', '<2hi>', '<2kn>', '<2ml>', '<2mr>', '<2or>', '<2pa>', '<2ta>', '<2te>']中的任意一个
# 首先对输入和输出进行分词。IndicBART的训练格式为输入应为“句子</s><2xx>”,其中xx为语言代码。类似地,输出应为“<2yy>句子</s>”。
inp = tokenizer("I am a boy </s> <2en>", add_special_tokens=False, return_tensors="pt", padding=True).input_ids # tensor([[ 466, 1981, 80, 25573, 64001, 64004]])
out = tokenizer("<2hi> मैं एक लड़का हूँ </s>", add_special_tokens=False, return_tensors="pt", padding=True).input_ids # tensor([[64006, 942, 43, 32720, 8384, 64001]])
# 注意,如果使用印地语或马拉地语以外的语言,应使用Indic NLP库将其脚本转换为天城文。
model_outputs=model(input_ids=inp, decoder_input_ids=out[:,0:-1], labels=out[:,1:])
# 计算损失
model_outputs.loss ## 此处未使用标签平滑。
# 获取逻辑值
model_outputs.logits
# 生成文本。请注意decoder_start_token_id的设置。
model.eval() # 关闭dropout
model_output=model.generate(inp, use_cache=True, num_beams=4, max_length=20, min_length=1, early_stopping=True, pad_token_id=pad_id, bos_token_id=bos_id, eos_token_id=eos_id, decoder_start_token_id=tokenizer._convert_token_to_id_with_added_voc("<2en>"))
# 解码输出字符串
decoded_output=tokenizer.decode(model_output[0], skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(decoded_output) # I am a boy
# 注意,如果输出语言不是印地语或马拉地语,应使用Indic NLP库将天城文转换为目标语言。
# 掩码测试示例
inp = tokenizer("I am [MASK] </s> <2en>", add_special_tokens=False, return_tensors="pt", padding=True).input_ids
model_output=model.generate(inp, use_cache=True, num_beams=4, max_length=20, min_length=1, early_stopping=True, pad_token_id=pad_id, bos_token_id=bos_id, eos_token_id=eos_id, decoder_start_token_id=tokenizer._convert_token_to_id_with_added_voc("<2en>"))
decoded_output=tokenizer.decode(model_output[0], skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(decoded_output) # I am happy
inp = tokenizer("मैं [MASK] हूँ </s> <2hi>", add_special_tokens=False, return_tensors="pt", padding=True).input_ids
model_output=model.generate(inp, use_cache=True, num_beams=4, max_length=20, min_length=1, early_stopping=True, pad_token_id=pad_id, bos_token_id=bos_id, eos_token_id=eos_id, decoder_start_token_id=tokenizer._convert_token_to_id_with_added_voc("<2en>"))
decoded_output=tokenizer.decode(model_output[0], skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(decoded_output) # मैं जानता हूँ
inp = tokenizer("मला [MASK] पाहिजे </s> <2mr>", add_special_tokens=False, return_tensors="pt", padding=True).input_ids
model_output=model.generate(inp, use_cache=True, num_beams=4, max_length=20, min_length=1, early_stopping=True, pad_token_id=pad_id, bos_token_id=bos_id, eos_token_id=eos_id, decoder_start_token_id=tokenizer._convert_token_to_id_with_added_voc("<2en>"))
decoded_output=tokenizer.decode(model_output[0], skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(decoded_output) # मला ओळखलं पाहिजे
注意事项:
- 该模型与最新版本的transformers兼容,但开发时使用的是4.3.2版本,建议尽可能使用4.3.2版本。
- 虽然我只展示了如何获取逻辑值和损失以及如何生成输出,但您可以执行MBartForConditionalGeneration类支持的所有操作,详见https://huggingface.co/docs/transformers/model_doc/mbart#transformers.MBartForConditionalGeneration。
- 注意,我使用的分词器基于SentencePiece而非BPE,因此使用了AlbertTokenizer类而非MBartTokenizer类。
- 如果使用非天城文书写的语言(英语除外),应首先使用Indic NLP库将其转换为天城文。获取输出后,再将其转换回原始书写系统。
在下游任务上微调
- 如需微调此模型,可使用YANMTT工具包,按照此处的说明操作。
- (未经测试)也可使用HuggingFace官方脚本进行翻译和摘要任务。
贡献者
- Raj Dabre
- Himani Shrotriya
- Anoop Kunchukuttan
- Ratish Puduppully
- Mitesh M. Khapra
- Pratyush Kumar
论文
如果使用IndicBART,请引用以下论文:
@misc{dabre2021indicbart,
title={IndicBART: A Pre-trained Model for Natural Language Generation of Indic Languages},
author={Raj Dabre and Himani Shrotriya and Anoop Kunchukuttan and Ratish Puduppully and Mitesh M. Khapra and Pratyush Kumar},
year={2021},
eprint={2109.02903},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
许可证
该模型基于MIT许可证提供。