이 저장소에는 EMNLP 2021 결과 소스 코드가 포함되어 있습니다.
우리 논문에서 우리는 이중 언어 서브 워드 어휘를 구성하는 새로운 방법을 제안합니다. 우리는 공동으로 구성된 서브 워드 어휘의 한계로 잘못된 양성 (언어마다 다른 의미를 가진 동일한 하위 단어)과 잘못된 부정 (유사한 의미를 가진 다른 하위 단어)을 식별합니다. Smala는 감독되지 않은 최첨단 매핑 기술을 사용하여 서브 워드 정렬을 추출하고이를 사용하여 서브 워드 유사성을 기반으로하는 교차 앵커를 만듭니다.
먼저 각 언어마다 하위 단어를 별도로 배우고 해당 임베딩을 훈련시킵니다. 그런 다음 매핑 방법을 적용하여 임베딩 사이의 유사성 점수를 얻습니다. 이는 두 언어의 하위 단어 사이의 정렬을 추출하는 데 사용합니다. 우리는 마침내 정렬 된 서브 워드의 매개 변수를 묶어 훈련 중에 앵커를 만듭니다.
환경 생성 (선택 사항) : 이상적으로는 프로젝트를위한 환경을 만들어야합니다.
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 스크립트에서 66 행을 변경해야합니다. from .extract 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
Sepervediventaries 또는 동일한 (하위) 단어에 의존하고 싶지 않기 때문에 감독되지 않은 VECMAP 버전을 사용하여 모노 링 누드 서브 워드를 공통 공간에 매핑하십시오. (Vecmap)의 Github Repo를 복제 한 다음 실행하십시오.
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
정렬에 따라 대상 언어에 대한 새로운 어휘 (정렬 된 서브 워드가 두 Langauges에 동일한 임베딩을 가리 킵니다)를 만듭니다.
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
위의 단계는 정렬되지 않은 서브 워드의 추가 초기화 (논문에서 ours+align )를 추가로 Smala를 사용하는 역할을합니다. 논문에 포함 된 다른 모델과 비교하려면 다음 단계를 수정해야합니다.
ours : 위와 같이 깃발이없는 extract_alignments.py 스크립트를 실행하십시오.--initialize~--prob None 플래그가있는 init_weight.py 스크립트.joint : 서브 워드 매핑과 고정의 첫 번째 단계를 건너 뛰고 extract_alignments.py 스크립트를 --similarity surface_form 과 함께 실행하십시오.--initialize~--model_type joint 플래그와 init_weight.py 스크립트 --prob None 사용하여 create_new_vocabs.py 스크립트를 실행하십시오.ramen : 위의 단계를 건너 뛰고, 확률 벡터 (소문자)를 생성하는 방법에 대한라면을 참조하고 올바른 --prob 플래그와 원래 토큰 화기 (예 : --tgt_vocab el-tokenizer/vocab.txt )를 사용하여 init_weight.py 스크립트를 실행하십시오. 우리의 방법은 또한 병렬 데이터를 이용할 수 있습니다 (논문에서는 Europarl 및 United Nations의 데이터를 사용합니다). 이렇게하려면 먼저 (예 : 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
그런 다음 Factalign을 실행합니다.
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 1.0 및 XNLI-MT 1.0 파일을 XNLI Repo에서 다운로드하여 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
우리의 결과를 재현하려면 LM 훈련 및 씨앗 12 , 93 , 2319 , 1210 및 21 에 씨앗 12 사용하여 XNLI 미세 조정에 사용하십시오.
코드를 공개해 주신 커뮤니티에 감사의 말씀을 전합니다! 이 저장소에는 Huggingface 및 Ramen, 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}
}