このリポジトリには、EMNLP 2021調査用紙のソースコードが含まれています。
私たちの論文では、バイリンガルのサブワード語彙を構築する新しい方法を提案しています。共同で構築されたサブワード語彙の制限として、誤検知(言語間で異なる意味を持つ同一のサブワード)と誤動否定(同様の意味の異なるサブワード)を識別します。 Smalaは、監督されていない最先端のマッピング手法を使用してサブワードアライメントを抽出し、それらを使用してサブワードの類似性に基づいて横断的なアンカーを作成します。
最初に各言語のサブワードを個別に学習し、次に対応する埋め込みをトレーニングします。次に、マッピング方法を適用して、埋め込み間で類似性スコアを取得します。これは、2つの言語のサブワード間でアラインメントを抽出するために使用します。最終的に、アラインされたサブワードのパラメーターを結び付けて、トレーニング中にアンカーを作成します。
環境の作成(オプション):理想的には、プロジェクトの環境を作成する必要があります。
conda create -n smala_env python=3.7.9
conda activate smala_env
Pytorch 1.6.0をインストール:
conda install pytorch==1.6.0 torchvision==0.7.0 -c pytorch
プロジェクトのクローン:
git clone https://github.com/GeorgeVern/smala.git
cd smala
次に、残りの要件をインストールします。
pip install -r requirements.txt
データの抽出、前処理、アライメントに必要なツール(*)をインストールします。
bash install tools.sh
(*)wikiextractor/wikiextractor.pyスクリプトfrom .extract 66行from extractを変更する必要があります。
Wikipediaのデータをダウンロードしてプリプロースし、英語(EN)および別の言語の言語固有の言語固有のことを学習します。たとえば、ギリシャ語(EL):
bash get-mono-data.sh en
bash get-mono-data.sh el el-tokenizer
各言語のサブワード埋め込みを学習します。
bash learn_subw_embs.sh en
bash learn_subw_embs.sh el el-tokenizer
シード辞書や同一の(サブ)単語に依存したくないため、VECMAPの監視なしバージョンを使用して、単一言語のサブワード埋め込みを共通の空間にマッピングします。 (vecmap)のgithubリポジトリをクローンしてから実行します。
python3 vecmap/map_embeddings.py --unsupervised smala/data/mono/txt/en/WP/en.train.wp.vec smala/data/mono/txt/el/WP/el.train.wp.vec smala/data/mono/txt/en/WP/mapped_en_el_embs.txt smala/data/mono/txt/el/WP/mapped_el_embs.txt
マッピングされたサブワード埋め込みからサブワードアライメントを抽出します。
python3 extract_alignments.py --src_emb data/mono/txt/en/WP/mapped_en_el_embs.txt --tgt_emb data/mono/txt/el/WP/mapped_el_embs.txt --similarity cosine --alignment_dir en-el --initialize
アラインメントに基づいて、ターゲット言語の新しい語彙を作成します(両方のランゴージュに同じ埋め込みを指すように)。
python3 utils/create_new_vocabs.py --tgt_tokenizer el-tokenizer --model_type ours --alignment_dir alignments/en-el
ターゲットモデルの埋め込み層を初期化します。
python3 utils/init_weight.py --tgt_vocab alignments/en-el/new_tgt_vocab.txt --prob alignments/en-el/prob_vector --tgt_model emb_layer/el/bert-ours_align_embs
上記の手順は、非整列されたサブワードの追加の初期化でSmalaを採用するのに役立ちます( ours+align in the Paper)。論文に含まれている他のモデルと比較するには、これらの手順を変更する必要があります。
ours :上記のように、flagのないextract_alignments.pyスクリプトを実行します--initialize~--prob Noneフラグを使用したinit_weight.pyスクリプト。joint :サブワードマッピングとアンカーの最初のステップをスキップして、 --similarity surface_formを使用してextract_alignments.pyスクリプトを実行します。--initialize~--model_type jointフラグと--prob None init_weight.pyスクリプトを使用して、 create_new_vocabs.pyスクリプトを実行します。ramen :上記の手順をスキップして、確率ベクトル(小文字も)を作成する方法に関するラーメンを参照し、正しい--probフラグと元のトークナー(例--tgt_vocab el-tokenizer/vocab.txt )を使用してinit_weight.pyスクリプトを実行します。私たちの方法は、並列データを活用することもできます(論文では、Europarlおよび国連のデータを使用します)。そのためには、最初に(例: data/para/en-el )をダウンロードし、プリプロレス(トークン化および小文字)を並列コーパスする必要があります。その後、実行:
python3 utils/apply_tokenizer.py --tokenizer bert --file data/para/en-el/en-el.en.txt
python3 utils/apply_tokenizer.py --tokenizer el-tokenizer --file data/para/en-el/en-el.el.txt
次に、FastAlignを実行します。
bash run_fast-align.sh en el data/para/en-el/WP/en-el.en.wp data/para/en-el/WP/en-el.el.wp data/para/en-el/WP/fast-align
ファーストアライイン出力から類似性マトリックスを取得するには、ラーメンリポジトリをクローンして実行します。
python3 ramen/code/alignment/get_prob_para.py --bitxt smala/data/para/en-el/WP/fast-align/cleared.en-el --align smala/data/para/en-el/WP/fast-align/align.en-el --save smala/data/para/en-el/WP/fast-align/probs.para.en-el.pth
最後に、アライメントを抽出するには、新しい語彙を作成し、ターゲットモデルの埋め込み層を初期化します。
python3 extract_alignments_para.py --tgt_tokenizer el-tokenizer --similarity_matrix data/para/en-el/WP/fast-align/probs.para.en-el.pth --alignment_dir en-el_fastalign
python3 utils/create_new_vocabs.py --tgt_tokenizer el-tokenizer --model_type ours --alignment_dir alignments/en-el_fastalign
python3 utils/init_weight.py --tgt_vocab alignments/en-el_fastalign/new_tgt_vocab.txt --prob alignments/en-el_fastalign/prob_vector --tgt_model emb_layer/el/bert-ours_align_para_embs
smala runを使用して、前処理されたLMを新しい言語に転送するには:
python3 fine-tune_biBERTLM.py
--tgt_lang el
--output_dir ckpts/greek_ours_align
--foreign_model emb_layer/el/bert-ours_align_embs
--biLM_model_name ours
--alignment_dir alignments/en-el
--tgt_tokenizer_name alignments/en-el/new_tgt_vocab.txt
--do_train --do_eval
--evaluation_strategy steps
--seed 12
--per_device_eval_batch_size 38
--max_steps 120000
--eval_steps 5000
--logging_steps 5000
--save_steps 5000
--per_device_train_batch_size 38
--eval_accumulation_steps 1
Xnliで転送されたLMを微調整する(英語)実行:
(XNLI RepoからXNLI 1.0およびXNLI-MT 1.0ファイルをダウンロードし、 dataフォルダー内でそれらを解凍します)
python3 fine-tune_xnli.py
--data_dir data/
--biLM_model_name ours
--biLM ckpts/greek_ours_align/checkpoint-120000/
--foreign_model emb_layer/el/bert-ours_align_embs
--language en
--output_dir ckpts/greek_xnli_ours_align/
--tgt_tokenizer_name alignments/en-el/new_tgt_vocab.txt
--alignment_dir alignments/en-el/
--do_train --do_eval
--seed 12
ターゲット言語(ギリシャ語など)でゼロショットテストを実行します。
python3 fine-tune_xnli.py
--data_dir data/
--biLM_model_name ours
--biLM ckpts/greek_ours_align/checkpoint-120000/
--foreign_model emb_layer/el/bert-ours_align_embs
--language el
--output_dir ckpts/greek_xnli_ours_align/
--tgt_tokenizer_name alignments/en-el/new_tgt_vocab.txt
--alignment_dir alignments/en-el/
--do_test
--seed 12
私たちの結果を再現するには93 LMトレーニングにはシード12 2319使用し、シード12 XNLI微調整に使用21 1210 。
コードをリリースしてくれたコミュニティに感謝します!このリポジトリには、Huggingfaceからのコード、およびラーメン、VECMAP、XLM、およびSimalignリポジトリのコードが含まれています。
このリポジトリを調査で使用する場合は、論文を引用してください。
@misc{vernikos2021subword,
title={Subword Mapping and Anchoring across Languages},
author={Giorgos Vernikos and Andrei Popescu-Belis},
year={2021},
eprint={2109.04556},
archivePrefix={arXiv},
primaryClass={cs.CL}
}