基于 fairseq 训练 LASER 多语言句子嵌入:配置格式、训练命令与源码架构解析(unilm 仓库实践)

基于 fairseq 训练 LASER 多语言句子嵌入:配置格式、训练命令与源码架构解析(unilm 仓库实践) 基于 fairseq 训练 LASER 多语言句子嵌入配置格式、训练命令与源码架构解析unilm 仓库实践【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilmLASERLanguage-Agnostic SEntence Representations是一套用于计算与使用多语言句子嵌入的库其核心思想是训练一个共享的编码器将任意语言的句子映射到同一个向量空间中从而支撑跨语言分类、平行语料挖掘、跨语言 NLI 等下游任务。本文以本仓库 kosmos-2/fairseq/examples/laser/README.md 为主体结合目录下的训练源码系统讲解 LASER 嵌入在 fairseq 中的完整训练流程从数据二值化与 JSON 配置文件的编写到训练命令中每个参数的含义再到laser任务与 LSTM/Transformer 两种模型架构的源码级实现细节。读完本文你将能够依据配置格式独立组织多语言平行语料、复现 LASER 风格的训练实验并理解共享编码器 多任务目标如何收敛出跨语言统一的句子表示。LASER 与本仓库的对应关系官方 LASER 仓库同时提供使用计算/应用句子嵌入与训练两部分能力而本仓库 kosmos-2/fairseq/examples/laser 目录专门承载fairseq 框架下的 LASER 嵌入训练源码主要包括文件职责README.md训练数据与配置文件格式、训练命令示例、下游应用清单laser_src/laser_task.py注册laser任务解析 JSON 配置、加载多语料、多数据集采样laser_src/laser_lstm.py注册laser_lstm模型双向 LSTM 编码器 LSTM 解码器laser_src/laser_transformer.py注册laser_transformer模型Transformer 编码器 语言嵌入解码器laser_src/multitask_data_utils.py多数据集 epoch 迭代器与数据集包装器训练时通过--user-dir examples/laser/laser_src将该目录挂载进 fairseq随后使用--task laser与--arch laser_lstm或laser_transformer即可启动。准备数据与配置文件第一步用 fairseq 对数据进行二值化LASER 训练读取的是 fairseq 标准二值化数据binarized indexed dataset。请先按 fairseq 官方的数据预处理流程将各语言对的平行语料source 与 target 文件二值化得到诸如train.srclang1-idx、train.srclang1.bin这类索引文件并准备好 SentencePiece 词表spm.src.cvocab与spm.tgt.cvocab。二值化这一步在源码中也有直接印证在 laser_task.py 的load_dataset中通过IndexedDataset(path, fix_lua_indexingTrue)加载数据集并明确抛出Unable to handle raw text异常——即该任务只接受已二值化的索引数据集不支持原始文本输入。第二步编写 JSON 配置文件将各语言对的数据路径登记到一个 JSON 配置文件中格式如下摘自原文档路径为示意{ src_vocab: /path/to/spm.src.cvocab, tgt_vocab: /path/to/spm.tgt.cvocab, train: [ { type: translation, id: 0, src: /path/to/srclang1-tgtlang0/train.srclang1, tgt: /path/to/srclang1-tgtlang0/train.tgtlang0 }, { type: translation, id: 1, src: /path/to/srclang1-tgtlang1/train.srclang1, tgt: /path/to/srclang1-tgtlang1/train.tgtlang1 }, { type: translation, id: 0, src: /path/to/srclang2-tgtlang0/train.srclang2, tgt: /path/to/srclang2-tgtlang0/train.tgtlang0 }, { type: translation, id: 1, src: /path/to/srclang2-tgtlang1/train.srclang2, tgt: /path/to/srclang2-tgtlang1/train.tgtlang1 } ], valid: [ { type: translation, id: 0, src: /unused, tgt: /unused } ] }其中src_vocab/tgt_vocab源、目标侧 SentencePiece 词表路径train/valid数据分割列表src与tgt指向二值化后的 fairseq 索引数据集文件id目标语言 id用于训练语言条件化的解码器详见下文语言嵌入一节。例如某语言对以语言 0 为翻译目标则id填 0valid中的路径可以填写占位符/unused因为从源码看 valid 分割不会真正加载数据load_dataset中if split valid: self.datasets[split] pair_datasets; return训练命令通常还会配合--disable-validation。从源码层面看该 JSON 文件会在 laser_task.py 的setup_task中被解析config json.load(f)并通过num_tasks max(dataset[id] for dataset in config[train]) 1计算语言目标语言总数——即配置中出现的最大id加一该数值将决定语言嵌入表的规模。词表则通过Dictionary.load(...)从src_vocab/tgt_vocab加载。训练命令行示例与参数详解原文档给出的完整训练命令如下fairseq-train \ /path/to/configfile_described_above.json \ --user-dir examples/laser/laser_src \ --log-interval 100 --log-format simple \ --task laser --arch laser_lstm \ --save-dir . \ --optimizer adam \ --lr 0.001 \ --lr-scheduler inverse_sqrt \ --clip-norm 5 \ --warmup-updates 90000 \ --update-freq 2 \ --dropout 0.0 \ --encoder-dropout-out 0.1 \ --max-tokens 2000 \ --max-epoch 50 \ --encoder-bidirectional \ --encoder-layers 5 \ --encoder-hidden-size 512 \ --decoder-layers 1 \ --decoder-hidden-size 2048 \ --encoder-embed-dim 320 \ --decoder-embed-dim 320 \ --decoder-lang-embed-dim 32 \ --warmup-init-lr 0.001 \ --disable-validation各参数的作用与源码对应关系如下参数含义源码佐证位置参数配置文件路径指向上一节的 JSON 配置LaserTask.add_args将configfile注册为位置参数laser_task.py--user-dir examples/laser/laser_src挂载自定义模块目录注册laser任务与laser_lstm/laser_transformer模型该目录下的__init__.py依次导入laser_task、laser_lstm、laser_transformer--task laser使用 LASER 多数据集翻译任务register_task(laser)laser_task.py--arch laser_lstm使用 LASER LSTM 编码器-解码器模型register_model(laser_lstm)laser_lstm.py--encoder-bidirectional编码器所有层均为双向 LSTMLSTMEncoder中的bidirectional标志laser_lstm.py--encoder-layers 5编码器 LSTM 层数传入LSTMEncoder(num_layers...)--encoder-hidden-size 512编码器隐藏维度双向时输出维度翻倍为 1024output_units hidden_size; if bidirectional: output_units * 2laser_lstm.py--decoder-layers 1/--decoder-hidden-size 2048解码器 LSTM 层数与隐藏维度LSTMDecoder的num_layers/hidden_size--encoder-embed-dim 320/--decoder-embed-dim 320编码器/解码器词嵌入维度Embedding(num_embeddings, embed_dim, padding_idx)laser_lstm.py--decoder-lang-embed-dim 32解码器语言嵌入维度语言 id 嵌入后拼接到解码器输入self.embed_lang nn.Embedding(num_langs, lang_embed_dim)laser_lstm.py--dropout 0.0全局 dropout未单独指定的粒度 dropout 默认继承该值base_architecture中encoder_dropout_in/out默认取args.dropoutlaser_lstm.py--encoder-dropout-out 0.1编码器输出 dropout对应LSTMEncoder的dropout_out--max-tokens 2000每 batch 最大 token 数传入data_utils.batch_by_size(... max_tokens...)laser_task.py--warmup-updates 90000/--warmup-init-lr 0.001/--lr 0.001配合inverse_sqrt学习率调度fairseq 标准优化器参数--update-freq 2梯度累积更新频率fairseq 标准训练参数--clip-norm 5梯度裁剪范数fairseq 标准训练参数--max-epoch 50最大训练轮数fairseq 标准训练参数--disable-validation关闭验证valid 分割本就无数据与load_dataset中 valid 直接返回空字典的行为一致任务侧还有几个命令行参数值得说明laser_task.py--weighting-alpha自动加权采样的 alpha 指数用于多语料间的自动配比默认None不启用自动加权--left-pad-source源侧是否左填充默认True--left-pad-target目标侧是否左填充默认False--max-source-positions/--max-target-positions源/目标序列最大 token 数默认均为 1024。源码级架构解析句子嵌入是如何练出来的多语料任务一个 batch 里混合所有语言对与普通翻译任务每次只在一个语料上训练不同laser任务的核心是把多个语言对的平行数据放进同一个多数据集里混合训练。在 multitask_data_utils.py 中MultitaskDatasetWrapper为每个语言对数据集打上target_language_id与名称标记并在collater中将它们注入到net_inputmultitask_data_utils.py使模型在 forward 时能拿到target_language_id与dataset_nameMultidatasetEpochBatchIterator同时持有多个子数据集的EpochBatchIteratorMultiItr通过已消费比例最小优先的轮转策略从各语料交替取 batchmultitask_data_utils.py实现多语料的均匀混合load_dataset中还支持可选的过采样JSON 中每个条目可带sample字段源码中dataset_config.get(sample, None)默认 1.0表示复制几份配合--weighting-alpha时会按语料长度占比的alpha次方自动计算加权采样倍数laser_task.py。共享编码器双向 LSTM max-pooling 得到句子向量LASER 的句子嵌入由编码器输出经max-pooling得到这是整个方法的标志性操作。在 laser_lstm.py 的LSTMEncoder.forward中将输入 token 映射为嵌入后经pack_padded_sequence打包变长序列输入双向 LSTM将填充位置 mask 为-inf避免被池化选中x x.float().masked_fill_(padding_mask, float(-inf))对时间维做最大值池化sentemb x.max(dim0)[0]得到B x C的句子嵌入编码器输出字典中同时返回sentemb与完整encoder_out供解码器使用。双向编码器配置下output_units 2 * hidden_size因此示例配置中 512 维隐藏层对应 1024 维句子嵌入。laser_transformer编码器采用同样的 max-pooling 思路laser_transformer.py对 Transformer 编码器的输出做 padding mask 后取时间维最大值并返回{sentemb: [sentemb]}。语言条件化解码器目标语言 id 如何参与生成解码器需要根据目标语言输出对应的目标语句为此 LASER 引入语言嵌入LSTM 解码器LSTMDecoder内建nn.Embedding(num_langs, lang_embed_dim)语言嵌入表权重在[-0.1, 0.1]均匀初始化。每个解码时间步的输入为「目标词嵌入 句子嵌入 语言嵌入」的三路拼接laser_lstm.py同时句子嵌入还会经sentemb2init线性层映射为解码器的初始隐状态/细胞状态除非设置--decoder-zero-init置零。Transformer 解码器LaserTransformerDecoder继承 fairseqTransformerDecoder将lang_embed_dim encoder_embed_dim拼进每一层的输入维度并使用no_encoder_attnTrue解码器不做标准 encoder-attention句子嵌入直接作为条件信息拼接进入输出投影层的输入维度相应扩为output_embed_dim lang_embed_dim encoder_embed_dimlaser_transformer.py。目标语言 id 由任务侧从 JSON 配置的id字段注入MultitaskDatasetWrapper的target_language_id在模型 forward 中通过lang_id参数传入并断言非空——这也解释了为什么配置中每条语料都必须正确填写id。两种架构的取舍laser_lstm示例命令采用双向 LSTM 编码器对句子整体建模、max-pooling 直接产出嵌入是 LASER 论文中最经典的实现laser_transformer以 Transformer 编码器替代 LSTM句子嵌入同样由 max-pooling 得到解码器为语言条件化 Transformer适合希望引入自注意力建模能力的场景。两者均通过register_model_architecture注册默认超参laser_lstm.py、laser_transformer.py未显式指定的维度参数会自动落到默认值。应用一个编码器零微调横跨多个任务训练完成后得到的共享多语言编码器可直接用于多种下游任务原文档强调所有任务都使用完全相同的多语言编码器不进行任何任务特定的优化或微调zero-shot。这些应用包括跨语言文档分类基于 MLDoc 语料8 种语言编码后接分类器即可完成跨语言迁移WikiMatrix 平行语料挖掘从 Wikipedia 中挖掘海量平行句对覆盖上千个语言对双语文本挖掘Bitext mining基于 BUCC 语料利用句子嵌入的相似度与 margin 策略召回平行句对跨语言 NLI基于 XNLI 语料进行零样本跨语言推理多语言相似度检索在共享向量空间中按相似度检索跨语言等价句子任意文本文件的句子嵌入为受支持语言的任意文本文件计算句子嵌入。这些应用体现了 LASER 设计的核心价值通过多语言机器翻译式的多任务训练迫使编码器将所有语言对齐到同一向量空间从而以零微调方式服务于各类跨语言场景。参考资料原文档给出以下论文作为方法依据此处列出文献信息供深入研读Holger Schwenk and Matthijs Douze,Learning Joint Multilingual Sentence Representations with Neural Machine Translation, ACL workshop on Representation Learning for NLP, 2017Holger Schwenk and Xian Li,A Corpus for Multilingual Document Classification in Eight Languages, LREC, 2018Holger Schwenk,Filtering and Mining Parallel Data in a Joint Multilingual Space, ACL, 2018Alexis Conneau et al.,XNLI: Cross-lingual Sentence Understanding through Inference, EMNLP, 2018Mikel Artetxe and Holger Schwenk,Margin-based Parallel Corpus Mining with Multilingual Sentence Embeddings, arXiv, 2018Mikel Artetxe and Holger Schwenk,Massively Multilingual Sentence Embeddings for Zero-Shot Cross-Lingual Transfer and Beyond, arXiv, 2018Holger Schwenk et al.,WikiMatrix: Mining 135M Parallel Sentences in 1620 Language Pairs from Wikipedia, arXiv, 2019Holger Schwenk et al.,CCMatrix: Mining Billions of High-Quality Parallel Sentences on the WEB, arXiv, 2019结合本仓库源码还可进一步阅读 laser_task.py、laser_lstm.py、laser_transformer.py 与 multitask_data_utils.py 来核对本文所述的每个实现细节。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考