NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略
作者:来自 vivo 互联网算法团队- Huang Minghui
本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型,以及其与 LLM(Large Language Model)的异同和协同关系。接着列举了实战与应用的案例,包括使用 ChatGPT 生成的样本微调 NLLB-200 和使用 NLLB-200 的翻译结果作为 LLM 的 prompt 等。通过本文的研究和实践,可以为小语种翻译模型和语言模型的融合提供一定的参考和借鉴。
一、NLLB 背景介绍
NLLB(No Language Left Behind) [1] 是Meta发起的一个项目,目标是打破语言障碍。不论每个人说的是什么语言,都能使他们平等地获取信息和交流。官方对外宣称,这是全球第一个以单一模型对应多数语言翻译的设计,希望借此能够帮助更多人在社群平台上进行跨语言互动。
NLLB 计划的核心是开发一个既准确又能适应大量语言的翻译模型。这不仅包括像英语、中文和西班牙语这样的广泛使用的语言,还扩展到那些使用人数较少的语言,比如土著和地区性语言,它们通常缺乏用于高质量机器翻译的数据资源。NLLB 计划的更广泛愿景是促进不同语言障碍背后的沟通与知识获取,进而支持全球社区的教育、经济机会和社会包容性。随着这些语言的AI模型和数据集的改进,它们可以被集成到各种工具和平台中,以提供实时翻译服务、内容理解和其他与语言相关的功能,为全球用户带来好处。
NLLB 项目包含多种语言的翻译数据集,也包含基于机器学习技术的翻译模型,这些技术和模型能够更有效地从有限的数据中学习,使得那些可能几乎没有翻译数据的语言也能被翻译成其他语言。为了实现这些目标,NLLB 聚集了研究人员、语言学家和工程师,共同致力于先进的机器学习模型、数据收集和增强策略,以及改进的评估方法,以确保翻译不仅仅是字面上的,而且在文化和语境上也是准确的。
在本文中,我们主要要介绍的是 NLLB 项目中的主角,也就是 NLLB-200 这个预训练模型。这是 Meta AI 开源的一个机器翻译的大模型,支持200+语言之前的互相翻译。
1.1 NLLB-200 数据
目前,谷歌翻译能够覆盖大约130种语言的翻译,而微软则大约能够翻译110种语言。Meta AI 的目标是通过 NLLB 计划实现覆盖200多种语言的翻译。因此,除了考虑模型本身,Meta AI 还需要关注翻译模型层面之外的方面,包括数据标注与数据清洗等。
NLLB-200 项目使用的数据集名为 Flores-200,它是 Flores-101 数据集的扩展,其中包含来自世界各地的101种语言。而 Flores-200 数据集不仅覆盖了之前的语言集合,还增加了更多语言,使总数扩大到了200种。
除了收集公开可用数据和使用网络爬虫爬取的数据外,研究团队还采用回译策略来进一步扩充训练数据集。回译是一种独特的数据增强技术,涉及使用已有的机器翻译模型将目标语言的文本翻译回源语言,以创造新的、丰富的训练样本,有助于提高模型在各种语言上的表现和准确性。
由于这些数据用于机器翻译任务,因此其格式都是句子对格式,即包含第一种语言及其相应的表达,同时包含对应翻译的第二种语言的表达。数据示例如下:
{"translation": {"ace_Latn": "Gobnyan hana geupeukeucewa gata atawa geutinggai meunan mantong gata.","ban_Latn": "Ida nenten jaga manggayang wiadin ngutang semeton."},"laser_score": 1.2499876022338867,"source_sentence_lid": 1.0000100135803223,"target_sentence_lid": 0.9991400241851807,"source_sentence_source": "paracrawl9_hieu","source_sentence_url": "_","target_sentence_source": "crawl-data/CC-MAIN-2020-10/segments/1581875144165.4/wet/CC-MAIN-20200219153707-20200219183707-00232.warc.wet.gz","target_sentence_url": "https://alkitab.mobi/tb/Ula/31/6/\n"
}
1.2 NLLB-200 分词器
在收集并清理了大量数据之后,NLLB-200 模型使用了 一些方法来促进模型学习到语言不可知(language-agnostic)的表示,从而能够用于多种语言之间的转换,而不仅仅是针对特定的单一语言。其中,最关键的要素之一是设计了一个能够处理所有语言的分词器。在这个分词器中,使用了一个共享的词汇表,采用共享的 SentencePiece 词汇表来编码所有涉及的语言的输入和输出序列。
这意味着相同的子词单元可以在不同的语言之间共用,有助于模型学习到跨语言共通的词汇表示。该 SentencePiece 模型是在采样的1亿个句子上进行训练的。为了确保低资源语言能够得到充分的表示,NLLB 团队对高资源语言进行了下采样,同时对低资源语言进行了上采样,最终训练出一个词表大小高达256206的模型(相比之下,Llama/Llama2/Llama3的词表大小为32000)。
要使用 NLLB 的分词器,我们可以直接调用 Transformers,里面有一个 NllbTokenizer,接收的参数为:
- vocab_file (str)- bos_token (str, optional, defaults to "<s>")- eos_token (str, optional, defaults to "</s>")- sep_token (str, optional, defaults to "</s>")- unk_token (str, optional, defaults to "<unk>")- pad_token (str, optional, defaults to "<pad>")- mask_token (str, optional, defaults to "<mask>")- tokenizer_file (str, optional)- src_lang (str, optional)- tgt_lang (str, optional)- sp_model_kwargs (Dict[str, str])
from transformers import NllbTokenizertokenizer = NllbTokenizer.from_pretrained("nllb/nllb-200-distilled-1.3B", src_lang="eng_Latn", tgt_lang="fra_Latn"
)
example_english_phrase = " UN Chief Says There Is No Military Solution in Syria"
expected_translation_french = ("Le chef de l'ONU affirme qu'il n'y a pas de solution militaire en Syrie."
)
inputs = tokenizer(example_english_phrase, text_target=expected_translation_french, return_tensors="pt")
1.3 NLLB-200 模型
在大型分词器准备好之后,每一个句子都能够合理地被拆分成若干个 token,并且找到对应的 token id。那接下来就是进入模型训练的部分。NLLB-200 模型使用了 Transformer 架构来学习不同语言之间的表示。
-
共享的模型参数:在一个统一的神经网络架构中对所有语言使用共享的参数。这强制模型学习到不特定于任何单个语言的特征表示。
-
交叉语言迁移学习:通过在相似的语言对训练时共享知识,可以使模型在不同语言间转移学到的模式,以利于语言不可知特征的发展。
-
多任务学习:在训练中包含任务不局限于翻译,比如语言建模、降噪自编码器或其他任务,这也有助于模型捕捉语言共通性。
多语种机器翻译模型能够学习不同语言之间的转换,而不必为每一个语言对分别建立独立的模型。这样的方法减少了模型的数量和维护成本,并允许模型在不同语言之间分享知识,通常有助于改进低资源语言的翻译性能。
1.4 NLLB-200 蒸馏
【表1】: NLLB-200及蒸馏版本的参数量
开源的 NLLB-200 的 MoE (Mixture of Experts) 版本具备高达545亿个参数,要在我们的设备上运行如此规模的模型确实存在一定难度,对计算资源的要求较高。然而,开发者同时也提供了一个经过蒸馏的精简版本。这个经蒸馏处理的模型仅含13亿参数,相较于原版更为轻量,降低了对硬件资源的依赖,使得在资源受限的环境中运行变得可行。
二、NLLB 与 LLM
NLLB 作为一个翻译任务,和 LLM 一样,都可以表述为序列到序列任务,都属于生成式任务。那么,NLLB 和 LLM 有哪些异同点呢?二者是不是相互冲突?二者能不能有协同合作的机会?
2.1 NLLB 与 LLM 模型异同
NLLB 和 LLM 都使用 Transformer 结构作为基础。不同之处在于,NLLB 采用标准的编码器-解码器架构,而基于 GPT 的模型则仅使用了解码器(而 BERT 使用的是编码器)。
在 Transformer 模型中,编码器负责理解和提取输入文本中的相关信息。这个过程通常包括处理文本序列化形式(如单词或字符),并利用自注意力机制来理解文本中的上下文关系。编码器的输出是输入文本的连续表示,通常称为嵌入。这种嵌入包含了编码器从文本中提取的所有有用信息,并以模型可处理的高维向量格式表示。然后,这个嵌入会传递给解码器。解码器的任务是根据从编码器接收到的嵌入生成翻译后的文本(目标语言)。解码器同样使用自注意力机制和编码器-解码器注意力机制来生成翻译文本。
LLMs 中有的是只有编码器(encoder-only),有的是只有解码器(decoder-only),而有的是两者混合(encoder-decoder hybrid)。这三种类型都属于 Seq2Seq(序列对序列)模型。尽管名义上是只有编码器,但实际上 LLMs 仍能够解码一些文本和标记,因此也可以看作是解码器。然而,与 decoder-only 和编码器-解码器类型不同,encoder-only 类型的 LLMs 更注重理解输入内容,并生成针对特定任务的输出,而不像前两种类型那样具有自回归特性。自回归表示输出内容是基于先前生成的标记,逐个标记生成上下文理解。总的来说,encoder-only 类型更擅长分类任务;编码器-解码器类型擅长生成强烈依赖于输入的输出,如翻译和文本总结;而 decoder-only 类型则适用于各种Q&A等任务。
2.2 NLLB 与 LLM 目标不同
现在的大规模语言模型也拥有很强的翻译能力,但是 LLM,比如 ChatGPT,擅长翻译更高资源的语言,而 NLLB-200 则是对低资源语言的翻译做了很多的改善。NLLB-200 和 LLM 在翻译能力上的差异主要体现在它们的专注点和训练目标上:
1.专业度:
NLLB-200 被设计和优化用来进行机器翻译,支持200多种语言,特别包括很多低资源语言。这意味着它在机器翻译方面应当展现出较高的专业度和准确率,特别是在那些通常没有足够数据支持的语言对之间的翻译。
LLM 虽然也能进行一定的翻译任务,但它的主要目标是进行自然语言理解和生成,为了创建流畅和自然的对话。因此,它的翻译能力可能不如明确为翻译目的而训练的模型,如 NLLB-200。
2.覆盖范围:
NLLB-200 专门致力于包括广泛的语言,确保即使是低资源语言也有良好的翻译支持。
LLM 支持多语言处理,但它的训练数据集可能不如 NLLB-200 那样全面覆盖多种语言,尤其是对于低资源语言。
3.适用性:
NLLB-200 专为翻译而设计,适用于需要精确翻译的场景。
LLM 虽然可以完成简单的翻译任务,但它更适用于需要理解上下文、生成人性化回答的对话场景。
总之,NLLB-200 基于其训练和设计被期望在机器翻译方面表现优异,而 LLM 则更侧重于创建高质量的对话体验。如果需要进行复杂或专业的翻译工作,特别是跨越稀有语言的翻译, NLLB-200 可能是更好的选择;而在需要与人类用户进行自然交流的场合,则可能会偏向使用 LLM。
2.3 NLLB 与 LLM 如何协同
NLLB-200 和 LLM 在翻译上的擅长点不同,然而,LLM 的强大自然语言理解和生成能力可以与 NLLB-200 独特的翻译技术互惠互利:
通过利用 LLM 所特有的生成能力,可以创造更精确的领域特定术语数据集 [2] 。这种针对性强的数据集能够进一步用于对 NLLB-200 进行细致的调整,从而在特定的技术或专业领域提升其翻译效果。
当下的大型语言模型(LLM)主要以主流语言为核心,这一现象得益于英语、中文等语言的语料在获取便利性、数据质量和量级方面的明显优势。针对语料资源较为稀缺的小语种,比如55种非洲语言,这种中心化趋势意味着LLM在这些语种上不如在主流语种上表现得那么出色,因此可以依赖 NLLB-200 的翻译能力,将小语种 prompt 翻译成主流语言,再去使用 LLM [3]。
这两种结合方案我们在后面将用实战的形式来展开讲述。
三、实战与应用
3.1 使用 LLM 生成针对性数据微调 NLLB-200
目前,外销应用商店主要运营国家包括印度、印尼、泰国、马来西亚、菲律宾和越南。此外,还有几十个用户量较少的国家和地区也在使用。由于用户输入的查询语种繁多,2023年初的评测结果显示,各个国家都存在着本地语言查询导致的 badcase。由于少数国家的用户行为数据较少,基于用户行为的模型无法很好地发挥作用。另外,许多应用在国外都采用英文名称,因此本地语言的查询与英文应用在仅靠文本匹配时会出现不匹配的情况,导致无法返回用户想要的结果。为了解决这一问题,我们需要引入翻译功能,将各运营国家缺少召回的本地语言 query 统一翻译成英语,然后进行结果召回。
因为 NLLB-200 模型原始的训练数据来源于各种文章,其中可能包含大量修饰性词语,可能导致文本召回抓取不到关键信息。因此,为了在外销商店搜索中使用 NLLB-200 模型,我们需要对模型进行简单的微调。
3.2 LoRA 微调:方案介绍
大型语言模型参数庞大(例如,GPT-3 的参数量为 1750 亿),在应用到下游任务时,需要相当高的算力来微调全部参数。为了节省成本,一些参数高效(Parameter Efficient)的微调方法被提出,旨在仅训练少量参数使模型适应到下游任务。
LoRA(Label-Oriented Attentive Fine-tuning)微调是一种被广泛使用的方法,其通过引入标签相关的关注机制,帮助模型更好地专注于与所预测标签相关的信息,从而提高了模型对关键信息的学习和提取能力。这种方法在提升模型性能和推理能力方面取得了显著效果。因此,将 LoRA 微调引入到模型训练中可以帮助模型更好地理解和学习标签相关的文本信息,从而提高模型的预测准确性和泛化能力。目前,对于计算机视觉领域的稳定扩散(stable diffusion)和自然语言处理领域的 Llama,LoRA 已成为主流的微调方法。
LoRA(Label-Oriented Attentive Fine-tuning)提出了一种独特的微调方法:固定预训练模型参数并在原本的权重矩阵旁路添加低秩矩阵的乘积作为可训练参数,用以模拟参数的变化量。这一方法旨在通过细微的调整来适应下游任务的需求。
【图1】:LoRA微调方法
具体而言,左侧的W代表了 LLM 的预训练参数,在常见的完成 fine-tuning 当中,这个W参数会随着训练而更新为W+ΔWW+ΔW,其中ΔWΔW可以被拆解成ΔW=BAΔW=BA。
因此h=W+ΔW=W+BAh=W+ΔW=W+BA。
在前向计算当中,hx=(W+ΔW)x=(W+BA)xhx=(W+ΔW)x=(W+BA)x。
也就是说,左侧的 WW 代表了 LLM 的预训练参数,被固定不变。而右侧则包括两个矩阵:AA 和 BB,它们根据下游任务进行微调。在获得结果之后,将 WW 和 BABA 合并,输出新的模型权重。另一种方法是左右侧的参数不进行合并,而是在推理时同时载入两个模型同步进行计算,然后将计算结果相加。这一方法的创新之处在于其独特的参数调整方式,目标是实现对模型权重的微调而不需要调整大量的参数,从而提高了模型在特定任务上的适应性和性能表现。对于深度学习领域而言,LoRA 的应用已显示出广阔的应用前景和潜力。
此外,现在我们不再需要自行开发微调算法了,因为 Hugging Face 已经开源了一个 PEFT 库 [4] ,其中包括了许多高效微调的方法可供直接调用。从代码上看,PEFT 支持多种高效微调方式,而且 Hugging Face 已经为常用的参数微调方法提供了封装,直接调用即可使用。PEFT 库中封装好的方法有如下:
class PeftType(str, enum.Enum):"""Enum class for the different types of adapters in PEFT.Supported PEFT types:- PROMPT_TUNING- MULTITASK_PROMPT_TUNING- P_TUNING- PREFIX_TUNING- LORA- ADALORA- BOFT- ADAPTION_PROMPT- IA3- LOHA- LOKR- OFT- POLY- LN_TUNING"""PROMPT_TUNING = "PROMPT_TUNING"MULTITASK_PROMPT_TUNING = "MULTITASK_PROMPT_TUNING"P_TUNING = "P_TUNING"PREFIX_TUNING = "PREFIX_TUNING"LORA = "LORA"ADALORA = "ADALORA"BOFT = "BOFT"ADAPTION_PROMPT = "ADAPTION_PROMPT"IA3 = "IA3"LOHA = "LOHA"LOKR = "LOKR"OFT = "OFT"POLY = "POLY"LN_TUNING = "LN_TUNING"VERA = "VERA"
根据 PEFT 官方提供的指南,可以看出 LoRA 已经覆盖了所有模态和模型,因此属于一种通用的技巧,掌握了这个方法就可以应用于多个场景。正是因为如此,我们选择使用这种方法来进行外销商店搜索的翻译微调。
从源码来看,我们不需要自己编写代码,只需调用 LoRA 就可以直接用于以下几大类任务:
class TaskType(str, enum.Enum):"""Enum class for the different types of tasks supported by PEFT.Overview of the supported task types:- SEQ_CLS: Text classification.- SEQ_2_SEQ_LM: Sequence-to-sequence language modeling.- CAUSAL_LM: Causal language modeling.- TOKEN_CLS: Token classification.- QUESTION_ANS: Question answering.- FEATURE_EXTRACTION: Feature extraction. Provides the hidden states which can be used as embeddings or featuresfor downstream tasks."""SEQ_CLS = "SEQ_CLS"SEQ_2_SEQ_LM = "SEQ_2_SEQ_LM"CAUSAL_LM = "CAUSAL_LM"TOKEN_CLS = "TOKEN_CLS" QUESTION_ANS = "QUESTION_ANS"FEATURE_EXTRACTION = "FEATURE_EXTRACTION"
3.3 NLLB 模型微调:数据
因为我们希望将 query 翻译成英语后,能够通过文本匹配与英语 APP 进行匹配,因此,我们希望翻译的结果也可以尽量接近英语APP的命名方式。比如:
尽量少连词、修饰词等非实体,比如,“The digital wallet.“就有“the”这种无用的连词,可能引入噪音,而翻译成“digital wallet”,则更便于文本召回。
在一词多义中,尽量选择 APP 常用的词汇,比如同样表示“无网状态“,就应该翻译成“offline”而不是”netless”。
为了实现这个效果,我们需要首先针对性的准备一批数据用于微调。数据生成的工作我们采用了 ChatGPT(基于GPT 3.5的版本):
1.选择海外运营国家中曝光 top100 的 APP;
2.输入 APP 主标签名字进行翻译,让 ChatGPT 将 APP 名称翻译成印地语、泰语、越南语(与英语差别较大的语言),如【表2】的示例。构建成“小语种-英语”的翻译对,进行模型微调。
【表2】:训练数据示例
3.4 NLLB模型微调:训练
3.4.1 初始化一个预训练的模型
from transformers import AutoModelForSeq2SeqLM
model = AutoModelForSeq2SeqLM.from_pretrained("nllb/nllb-200-distilled-1.3B")
3.4.2 设置 lora 参数,通过 get_peft_model() 获取需要训练的 PeftModel
from peft import get_peft_model, LoraConfig, TaskTypepeft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM,inference_mode=False,r=8,lora_alpha=16,lora_dropout=0.1,target_modules=["q_proj", "k_proj", "v_proj", "out_proj", "fc_in", "fc_out", "wte"],)
lora_model = get_peft_model(model, peft_config)
lora_model.print_trainable_parameters()
# trainable params: 4718592 || all params: 1375356928 || trainable%: 0.3430812688646303
3.4.3 按照平常的训练方式进行训练
训练参数量降至原先的0.34%,原本需要几块 GPU 并行训练的参数,现在可以降低至单卡完成,甚至可以在 CPU 机器上完成。训练完毕,将 PeftModel 保存下来。
lora_model.save_pretrained('nllb_lora_model')
3.5 NLLB 模型微调:推理
因为前面我们仅仅保存了 PeftModel 模型,因此,在推理过程中,我们需要将 base 模型和 lora 参数同时载入进行推理。
3.5.1 初始化前面的 base 模型
from transformers import AutoModelForSeq2SeqLM
model = AutoModelForSeq2SeqLM.from_pretrained("nllb/nllb-200-distilled-1.3B")
3.5.2 通过获取保存的 lora 参数,获取 PeftModel 结果
from peft import PeftConfig, PeftModel
config = PeftConfig.from_pretrained("nllb_lora_model")
lora_model = PeftModel.from_pretrained(model, "nllb_lora_model")
3.5.3 按照平常的推理方式输出结果
从自身实验结果来看,LoRA 微调速度很快,需要的计算资源小,同时产生的结果也很不错,大多数 case 基本上可以达到和全量参数微调类似的效果。
lora_model.generate(**encoded_text, forced_bos_token_id=tokenizer.lang_code_to_id["eng_Latn"]
)
从开源的测试来看,LoRA 基本上都是可以训练不足1%的参数,完成接近全量参数微调的效果。
3.6 NLLB 模型微调前后效果对比
翻译同时能够做源语言的简单纠错与补全
比如说,用户的输入为免的游戏,实际表述应该是免费的游戏,经过 NLLB-200 模型翻译后,可以得到正确的英语free games。从而可以方便进行后续的文本、标签、语义等召回。
无用的连词减少,能够得到更适合应用搜索的简洁 query
原始版本的翻译是基于文章的,所以会有很多连词等等,让整个句子读起来更通顺更优美(更长)。这种方式并不利于应用搜索,因为应用名称本身就很短,普通的 query 也是一两个短词,所以翻译出一整个长句子,反而不利于召回到正确的结果。比如下面的 case:
拿第一个结果举例,如果翻译出来 Playing games of chat,那就会有很多 Party Games 的召回,和用户的需求比较不符。原因是 query 里面包含比较多词语,因此就会带来一定的噪音,使得文本匹配的时候,匹配到一些并不关键的词语。
因此需要模型尽量翻译出靠近 APP 的名字,如果是翻译出 chat game ,那整个 query 就简洁了不少,因此噪音减少之后,召回的结果相关度也明显增加,甚至可以通过类似标签找到 Prank Master 一类的结果。
让 query 更符合 APP 命名某类应用应该是有一类应用常用的命名方式的,比如仿真模拟类游戏,一般就叫做什么 simulation 或者是 simulator,词典的话,一般就是 dictionary 而不是 word,教发音的 APP 名字一般是 spell 而不是 syllable,因此,在下游数据 finetune 之后,可以让翻译的 query 更加靠近 APP 本身命名。
比如,翻译成 A mocking game,事实上很少有应用或者游戏的名字带有 mocking 的,因此文本召回使用的主要关键词的是 game,那当然就很难满足用户的需求。
但是如果能够翻译出来 simulation game,那就能找到学校模拟、史莱姆模拟等一系列模拟游戏。
四、使用 NLLB-200 翻译结果作为 LLM 的 prompt
毫无疑问,无论是 GPT3.5 还是 GPT4,都是以英文为中心的大规模语言模型。而文心一言、通义千问以及豆包和 kimi,则是以中文为中心。
大规模语言模型的训练是极其耗费资源的,所以像是非洲贫穷国家,很难出现一款以自己的语言为中心的大规模语言模型。那是不是这些国家的人,如果不会中文和英文,就不能享受到大规模语言模型的便利了呢?答案当然不是的,现在的一部分研究表明,将小语种的 prompt 翻译到英文之后,ChatGPT 或者 Llama 就可以迅速给出对应的准确结果。
4.1 直接 prompt 和翻译 prompt 的实践
我们尝试一个很小众的语种–毛利语(mri)的问题。一般而言,我们会根据语种统计,比如 Common Crawl,把高于1%占比的语言看作高资源语种,其他看作低资源语种。根据统计,毛利语的语言占比为0.0009%,是当之无愧的小语种。接下来,我们就用这个低资源语种来做prompt的实验。
输入:
Ko te hanga i te koroka me 2 raka o te kakahu muka kahurangi me te haurua o te nui o te kakahu muka ma. E hia katoa nga momo kakahu ka whakamahia kia rite ki te whakatakotoranga: “Whakautu:”.
ChatGPT 输出:
Kia taea te hanga i te koroka me 2 raka o te kakahu muka kahurangi me te haurua o te nui o te kakahu muka ma, ka taea te whakamahia i nga momo kakahu katoa ka rite ki te whakatakotoranga "Whakautu: ". Ka taea te whakamahi i nga momo kakahu penei i te kakahu muka, te kakahu pukapuka, te kakahu rarau, me etahi atu. Ko te take he kia rite te whakamahi me te whakarite i te whakatakotoranga ki te hiahia o te tangata.
但是,这个回答从格式上看应该就不对。我们把输出翻译回中文来做理解,可以看到,这个回答的意思是:
为了能够用2锁蓝色纤维布和一半数量的白色纤维布制作一件斗篷,所有类型的布料都可以按照“答案:”的格式使用。可用于纤维布、书布、鞋布等不同类型的衣服。原因就是要根据用户的需求来使用。
这个回答是完全驴唇不对马嘴的回答。
同时,我们把这个问题输入到两个以中文语料为中心的模型–通义千问和 ChatGLM2 里面看一下。可以看到,以中文语料为中心的两个模型更加没办法理解和处理这个问题。
通义千问 qwen-max-1201输出:
Ko te whakautu i to kōrero, heoi anō tēnei: “Tau Arapi” kua whakamahia hei tauira mō te whakatakotoranga o ngā momo kakahu. Ko te koroka me 2 raka o te kakahu muka kahurangi me te haurua o te nui o te kakahu muka ma, ka whakamahia kia rite ki te whakatakotoranga o "Whakautu: ". Nā reira, ko te whakatakotoranga o ngā momo kakahu nei e rua ake atu ana ki te tauira o "Whakautu: ".
ChatGLM2-6B 输出:
I’m sorry, but it appears that the text you provided doesn’t have a clear question or request for me to respond to. Could you please provide more context or clarify what you would like to know or talk about?
但是如果我们将它翻译成中文或者英语呢?通过翻译软件,我们可以得到这个 prompt 直接翻译成中文是:
制作一件袍子需要2 匹蓝色纤维布料和这个数量一半的白色纤维布料。它一共需要用掉多少匹布料,您的最终答案的格式应为:“答案: <阿拉伯数字>”.
对应的输出 ChatGPT 输出:
製作一件袍子需要 2 匹藍色纖維布料和這個數量一半的白色纖維布料。它一共需要用掉多少匹布料?答案:3。
虽然输出是繁体字,但是不影响我们理解,这个回答结果是正确的。同理,我们也把这个prompt输入到通义千问和 ChatGLM2 里面看一下。可以看到,此时通义千问已经可以回答正确了。
通义千问 qwen-max-1201 输出:
答案: 3 匹
ChatGLM2-6B 输出:
答案:4.5
翻译成英语,则是:
To make a robe, two pieces of blue fiber and half of that amount of white fiber are needed. How many pieces of fabric does it take to make? You should format your final answer as “Answer:”.
ChatGPT 输出是:
To make the robe, it takes a total of 3 pieces of fabric.Answer: 3
同理,我们也把这个 prompt 输入到通义千问和 ChatGLM2 里面看一下。可以看到,此时通义千问依旧是可以正确回答的。ChatGLM 的回答错误可能是因为6B模型在推理上的不足。
通义千问 qwen-max-1201 输出:
To make a robe, we need 2 pieces of blue fiber and half of that amount of white fiber. Half of 2 is 1, so we need 1 piece of white fiber.In total, we need 2 pieces of blue fiber + 1 piece of white fiber = 3 pieces of fabric.Therefore, the answer is: Answer: 3.
ChatGLM2-6B 输出:
Answer: 7
我们可以看到,一旦毛利语的 prompt 先通过翻译,变成了高资源语种,比如中文或者英语,模型就能给出正确的答案,同时格式也能够满足我们的要求。
4.2 直接 prompt 和翻译 prompt 的效果
【图2】:各语种直接 prompt &统一翻译成英语 prompt 在 ChatGPT 和 Llama-2-70B-Chat 的表现
在论文中,研究人员提到,高资源语种翻译成英语之后再输入大模型,可能并不会有很大的提升,甚至还可能带来噪音,影响效果。但是,低资源语种,如果能够先翻译成高资源语种,然后再输入现在以高资源语种为中心的大模型,往往就能够取得不错的效果。
我们从【图2】也可以看出来,对于中文这种高资源语言,使用翻译之后,在 ChatGPT 中效果还不如直接用中文 prompt;而在 Llama 中,将中文翻译成英语,然后再输入 Llama,表现则要优于中文 prompt,这可能是因为 Llama 训练语料中的中文语料数量要远远 ChatGPT 中的中文语料数量。
五、总结与展望
使用 LLM 生成的语料来微调特定任务的 NLLB 模型是一个常见的做法,许多场景都在尝试利用 LLM 的知识来更好地适应自己的任务。然而,LLM 生成的知识可能存在误导性,有时甚至可能与事实不符,因此在使用这些语料时,需要进行机器筛选或人工判断。
虽然机器翻译能提升以英语或中文等高资源语言为中心的 LLM 在多语言 NLP 任务中的性能,但并非适用于所有情境。对于需要深度语言理解及考虑文化差异的任务,使用母语提示常常更具有潜力,因为母语能更准确地捕捉文化和语言的微妙差别。因此,开发更多种类的多语言 LLM 是非常必要的。
【参考资料】
[1] Costa-jussà M R, Cross J, Çelebi O, et al. No language left behind: Scaling human-centered machine translation[J]. arXiv preprint arXiv:2207.04672, 2022.
[2] Moslem Y, Romani G, Molaei M, et al. Domain terminology integration into machine translation: Leveraging large language models[C]//Proceedings of the Eighth Conference on Machine Translation. 2023: 902-911.
[3] Liu C, Zhang W, Zhao Y, et al. Is translation all you need? a study on solving multilingual tasks with large language models[J]. arXiv preprint arXiv:2403.10258, 2024.
[4] PEFT(https://huggingface.co/docs/peft/main/en/index)
相关文章:
NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略
作者:来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型,以及其与 LLM(Large Language Model)的异同和协同关系。接着…...
C#的委托delegate与事件event
在C#中,delegate(委托)和 event(事件)是两个非常重要的概念,它们主要用于实现回调机制和事件驱动编程。下面详细介绍它们的原理和使用场景。 1. Delegate(委托) 1.1 委托的原理 委托…...
Spring Boot 集成MyBatis-Plus
文章目录 一、背景说明二、集成过程 2.1 引入 maven 依赖2.2 增加属性配置2.3 自动配置类 三、验证集成 3.1 控制器3.2 服务类3.3 Mapper接口类3.4 实体类3.4 不要忘记XML文件3.5 发起请求 四、技巧拓展 4.1 如何打印sql语句?4.2 如何对参数增加非空验证?…...
javacv将视频切分为m3u8视频并播放
学习链接 ffmpeg-demo 当前对应的 gitee代码 Spring boot视频播放(解决MP4大文件无法播放),整合ffmpeg,用m3u8切片播放。 springboot 通过javaCV 实现mp4转m3u8 上传oss 如何保护会员或付费视频?优酷是怎么做的? - HLS 流媒体加密 ffmpe…...
Docker 入门与实战:从安装到容器管理的完整指南
🚀 Docker 入门与实战:从安装到容器管理的完整指南 🌟 📖 简介 在现代软件开发中,容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊,以其轻量级、高效和跨平台的特性,深…...
计算机视觉:卷积神经网络(CNN)基本概念(二)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 接上一篇《计算机视觉&am…...
SQL SERVER的PARTITION BY应用场景
SQL SERVER的PARTITION BY关键字说明介绍 PARTITION BY关键字介绍具体使用场景排名计算累计求和分组求最值分组内百分比计算分组内移动平均计算分组内数据分布统计分组内数据偏移计算 总结 PARTITION BY关键字介绍 在SQL SERVER中,关键字PARTITION BY主要用于窗口函…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十二节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(TesterPresent_0x3E服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x3E服务、会话保持、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x3E服…...
gsoap实现webservice服务
gsoap实现webservice服务 在实现Web服务时,使用gSOAP是一个很好的选择,因为它提供了强大的工具和库来创建SOAP和RESTful服务。gSOAP是一个C和C语言开发的库,它支持SOAP协议的各种版本,包括SOAP 1.1和SOAP 1.2。下面是如何使用gSO…...
达梦:dmserver占用io高排查
目录标题 1. 使用达梦数据库的性能视图查询当前活动会话查询执行时间较长的 SQL 2. 使用 DM 性能监视工具3. 使用操作系统工具监控 I/Oiostat 工具dstat 工具 4. 优化查询和索引审查 SQL 执行计划优化索引 5. 调整数据库参数6. 分析数据库日志7. 硬件和存储检查总结 针对达梦数…...
MoE架构中的专家选择门控机制:稀疏激活如何实现百倍效率突破?
技术原理(数学公式与核心逻辑) 核心公式 门控网络输出: G ( x ) Softmax ( W g ⋅ x b g ) G(x) \text{Softmax}(W_g \cdot x b_g) G(x)Softmax(Wg⋅xbg) 最终输出: y ∑ i 1 n G i ( x ) ⋅ E i ( x ) (仅保留Top-…...
用python写一个聊天室程序
下面是一个简单的基于Socket的Python聊天室程序示例,包括服务器端和客户端: 服务器端代码: import socket import threadingdef handle_client(client, address):print(f"New connection from {address}")while True:msg client…...
七星棋牌全开源修复版源码解析:6端兼容,200种玩法全面支持
本篇文章将详细讲解 七星棋牌修复版源码 的 技术架构、功能实现、二次开发思路、搭建教程 等内容,助您快速掌握该棋牌系统的开发技巧。 1. 七星棋牌源码概述 七星棋牌修复版源码是一款高度自由的 开源棋牌项目,该版本修复了原版中的多个 系统漏洞&#…...
Vulhub靶机 ActiveMQ任意 文件写入(CVE-2016-3088)(渗透测试详解)
一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 漏洞版本:ActiveMQ在5.14.0之前的版本(不包括5.14.0) 二、访问靶机IP 8161端口 默认账户密码都是admin 1、利用bp抓包,修改为PUT方法并在fileserver…...
Cloud: aws:network: limit 含有pps这种限制
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-ena.html#statistics-ena 这个是调查网络问题的一个网页; 在里面,竟然含有pps这种限制:ethtool -S;其实是比较苛刻的安全相关的策略? [ec2-user ~]$ ethtool -S ethN NIC statistics:tx_timeout: …...
28、深度学习-自学之路-NLP自然语言处理-做一个完形填空,让机器学习更多的内容程序展示
import sys,random,math from collections import Counter import numpy as npnp.random.seed(1) random.seed(1) f open(reviews.txt) raw_reviews f.readlines() f.close()tokens list(map(lambda x:(x.split(" ")),raw_reviews))#wordcnt Counter() 这行代码的…...
观察者模式说明(C语言版本)
观察者模式主要是为了实现一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。下面使用C语言实现了一个具体的应用示例,有需要的可以参考…...
LC-搜索二维矩阵II、相交链表、反转链表、回文链表、环形链表、环形链表ll
搜索二维矩阵II 方法:从右上角开始搜索 我们可以从矩阵的右上角开始进行搜索。如果当前元素 matrix[i][j] 等于 target,我们直接返回 true。如果 matrix[i][j] 大于 target,说明 target 只能出现在左边的列,所以我们将列指针向左…...
如何查看 Linux 服务器的 MAC 地址:深入解析与实践指南
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
国产FPGA开发板选择
FPGA开发板是学习和开发FPGA的重要工具,选择合适的开发板对学习效果和开发效率至关重要。随着国产FPGA的发展,淘宝上的许多FPGA开发板店铺也开始进行国产FPGA的设计和销售,本文将对国产FPGA和相关店铺做个简单梳理,帮助有需要使用…...
iOS 获取设备占用内存
获取应用占用内存 获取应用进程占用内存 - (NSUInteger)memoryUsage {task_vm_info_data_t vmInfo;mach_msg_type_number_t count TASK_VM_INFO_COUNT;kern_return_t result task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vmInfo, &count);if (result …...
用自己的数据训练yolov11目标检测
文章目录 概要理论知识整体架构流程架构优化多任务支持多参数体量 操作实操环境配置数据准备数据标注数据放置路径 训练预测 概要 官网:https://github.com/ultralytics/ultralytics?tabreadme-ov-file 提示:以 停车场空位检测 公开数据集示例&#x…...
golang如何将结构体和函数进行绑定?
在Go语言中,结构体和函数的绑定通常通过方法(method)来实现。方法是一种特殊的函数,它与某个类型关联,特别是结构体类型。下面是如何将结构体和函数进行绑定的具体步骤: 定义结构体:首先需要定义…...
【苍穹外卖】学习
软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。那么这一小节,我们将从 软件开发流程、角色…...
架构——LVS负载均衡主要模式及其原理、服务水平、优缺点
LVS(Linux Virtual Server)是一款高性能的开源负载均衡软件,支持多种负载均衡模式。以下是其主要模式及其原理、服务水平、优缺点: 1. NAT 模式(Network Address Translation) 原理: 请求流程…...
DFS算法篇:理解递归,熟悉递归,成为递归
1.DFS原理 那么dfs就是大家熟知的一个深度优先搜索,那么听起来很高大尚的一个名字,但是实际上dfs的本质就是一个递归,而且是一个带路径的递归,那么递归大家一定很熟悉了,大学c语言课程里面就介绍过递归,我…...
让编程变成一种享受-明基RD320U显示器
引言 作为一名有着多年JAVA开发经验的从业者,在工作过程中,显示器的重要性不言而喻。它不仅是我们与代码交互的窗口,更是影响工作效率和体验的关键因素。在多年的编程生涯中,我遇到过各种各样的问题。比如,在进行代码…...
C语言简单练习题
文章目录 练习题一、计算n的阶乘bool类型 二、计算1!2!3!...10!三、计算数组arr中的元素个数二分法查找 四、动态打印字符Sleep()ms延时函数system("cls")清屏函数 五、模拟用户登录strcmp()函数 六、猜数字小游戏产生一个随机数randsrandRAND_MAX时间戳time() 示例 …...
基于Python的深度学习音乐推荐系统(有配套论文)
音乐推荐系统 提供实时音乐推荐功能,根据用户行为和偏好动态调整推荐内容 Python、Django、深度学习、卷积神经网络 、算法 数据库:MySQL 系统包含角色:管理员、用户 管理员功能:用户管理、系统设置、音乐管理、音乐推荐管理、系…...
Java:单例模式(Singleton Pattern)及实现方式
一、单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例,是 Java 中最简单的设计模式之一。该模式常用于需要全局唯一实例的场景,例如日志记录器、配置管理、线程池、数据库…...
解锁养生秘籍,拥抱健康生活
在这个快节奏的时代,人们行色匆匆,常常在忙碌中忽略了健康。其实,养生并非遥不可及,它就藏在生活的细微之处,等待我们去发现和实践。 规律作息是健康的基础。日出而作,日落而息,顺应自然规律&am…...
数据结构之堆(Heap)
数据结构之堆(Heap) 数据结构之堆(Heap)一、堆的核心概念1. 定义与性质2. 存储方式 二、核心操作与算法1. 操作复杂度概览2. 关键操作详解(1) 向上调整(Sift Up)(2) 向下调整(Sift Down…...
人工智能 - 机器学习、深度学习、强化学习是人工智能领域的理论基础和方法论
机器学习、深度学习、强化学习是人工智能领域的三大核心方向,各自具有独特的理论基础和方法论。以下是它们的核心理论知识总结: 一、机器学习(Machine Learning, ML) 1. 基础概念 目标:通过数据驱动的方式,让机器从经验中学习规律,完成预测、分类或决策任务。 核心范式…...
github上文件过大无法推送问题
GitHub 对文件大小有限制,超过 100 MB 的文件无法直接推送到仓库中。 解决思路: 使用 Git Large File Storage (Git LFS) 来管理大文件不上传对应的大文件 使用Git LFS: 1. 安装 Git LFS 首先,你需要安装 Git LFS。可以按照以…...
Elasticsearch:将 Ollama 与推理 API 结合使用
作者:来自 Elastic Jeffrey Rengifo Ollama API 与 OpenAI API 兼容,因此将 Ollama 与 Elasticsearch 集成非常容易。 在本文中,我们将学习如何使用 Ollama 将本地模型连接到 Elasticsearch 推理模型,然后使用 Playground 向文档提…...
【Linux】详谈 进程控制
目录 一、进程是什么 二、task_struct 三、查看进程 四、创建进程 4.1 fork函数的认识 4.2 2. fork函数的返回值 五、进程终止 5.1. 进程退出的场景 5.2. 进程常见的退出方法 5.2.1 从main返回 5.2.1.1 错误码 5.2.2 exit函数 5.2.3 _exit函数 5.2.4 缓冲区问题补…...
构建高效智能对话前端:基于Ant Design X 的deepseek对话应用
文章目录 实现的效果前言Ant Design X添加欢迎组件创建对话气泡存储对话历史渲染对话气泡 输入组件WebSocket 连接总结 实现的效果 待机页面: 等待页面: 完成页面: 前言 随着人工智能技术的飞速发展,大模型对话系统已成为…...
WordPress“更新失败,响应不是有效的JSON响应”问题的修复
在使用WordPress搭建网站时,许多人在编辑或更新文章时,可能会遇到一个提示框,显示“更新失败,响应不是有效的JSON响应”。这个提示信息对于不了解技术细节的用户来说,太难懂。其实,这个问题并不复杂&#x…...
华为交换机trunk简介配置
目录 一、Trunk 口简介二、Trunk 口配置案例及命令(一)组网需求(二)配置步骤(三)验证配置 三、注意事项 一、Trunk 口简介 Trunk 口是交换机中一种重要的端口类型,主要用于连接交换机与交换机、…...
DeepSeek从入门到精通(清华大学)
DeepSeek是一款融合自然语言处理与深度学习技术的全能型AI助手,具备知识问答、数据分析、编程辅助、创意生成等多项核心能力。作为多模态智能系统,它不仅支持文本交互,还可处理文件、图像、代码等多种格式输入,其知识库更新至2…...
【SpringBoot3】面向切面 AspectJ AOP 使用详解
文章目录 一、AspectJ介绍二、简单使用步骤 1、引入依赖2、定义一个Aspect3、开启AOP支持 三、AOP 核心概念四、切点(Pointcut) 1. execution2. within3. this & target4. args & args5. within & target & annotation 五、通知…...
容器运行常见数据库
一.涉及镜像压缩包 均为amd架构版本:mysql:5.7.42、postgres:13.16、dm8:20250206_rev257733_x86_rh6_64、oceanbase-ce:v4.0、opengauss:5.0.2 通过网盘分享的文件:db.tgz 链接: https://pan.baidu.com/s/1EBbFPZj1FxCA4_GxjVunWg?pwd563s 提取码: 5…...
OpenGL ES学习大纲
如果您想从头学习 OpenGL ES,以下是一个详细的学习大纲,涵盖了从基础到高级的知识点,循序渐进地帮助您掌握 OpenGL ES 的核心概念、API 使用、渲染管线、着色器编程、性能优化等内容。 1. 学习前的准备 1.1 基础知识 在学习 OpenGL ES 之前,您需要掌握以下基础知识: 数学…...
Kotlin 优雅的接口实现
1. 日常遇到的冗余的接口方法实现 日常开发中,经常会要实现接口,但是很多场景中,只需要用到其中一两个方法,例如 ActivityLifecycleCallbacks,它有很多个接口需要实现,但是很多时候我们只需要用到其中的一…...
数据结构实现顺序表的尾插,尾删,按值查找/修改/删除,按下标查找/增加/删除
头文件:head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 20enum num {success,false-1};typedef int datatype;typedef struct {int len;datatype data[MAXSIZE]; }S…...
qt实现文字跑马灯效果
实现跑马灯的方式多种多少样,可以通过定时器,或者animation等来实现。 本文通过定时器,将第一个文字,移动到最后一个这种方式来实现,还有其他方式哈。 直接上源码 h文件 #ifndef TEXTTICKER_H #define TEXTTICKER_…...
PyTorch Tensor 形状变化操作详解
PyTorch Tensor 形状变化操作详解 在深度学习中,Tensor 的形状变换是非常常见的操作。PyTorch 提供了丰富的 API 来帮助我们调整 Tensor 的形状,以满足模型输入、计算或数据处理的需求。本文将详细介绍 PyTorch 中常见的 Tensor 形状变换操作࿰…...
关于Node.js前端面试的试题概念、工作原理及实际应用
文章目录 1. 什么是Node.js?2. Node.js是如何工作的?3. Node.js与其他流行的框架相比有何优势?4. Node.js如何克服I/O操作阻塞的问题?5. 为什么Node.js是单线程的?6. 如果Node.js是单线程的,那么它是如何处…...
OpenCV机器学习(3)期望最大化(Expectation-Maximization, EM)算法cv::ml::EM
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::EM 是 OpenCV 机器学习模块中的一部分,用于实现期望最大化(Expectation-Maximization, EM)算法。EM …...
Spring Boot 集成 Kettle
Kettle 简介 Kettle 最初由 Matt Casters 开发,是 Pentaho 数据集成平台的一部分。它提供了一个用户友好的界面和丰富的功能集,使用户能够轻松地设计、执行和监控 ETL 任务。Kettle 通过其强大的功能和灵活性,帮助企业高效地处理大规模数据集…...