データナード

機械学習と自然言語処理についての備忘録 (旧ナード戦隊データマン)

LASERtrain: 文Embedding LASERの訓練方法

LASERはクロスリンガルのセンテンスエンコーダとして使えるモデルです。

概要

LASERについての概要は以下で書いたことがあります。

Sentence Embeddingを用いた多言語の転移学習 - ナード戦隊データマン

もし、publicの事前訓練済みモデルを使うだけならば、以下の方法で使うことができます。

  1. https://github.com/facebookresearch/LASER を見てLASERをインストールする。
  2. インストールが正常に完了したら、https://github.com/sugiyamath/laserencoder/ を用いて文をエンコードする。

しかし、これらのスクリプトは訓練コードを載せていません。2019/10/30時点では、以下のissueでは訓練方法について議論されていますが、まだコード自体は公開されていません。

Source code for training · Issue #70 · facebookresearch/LASER · GitHub

そこで、今回は訓練可能なコードとして公開されているLASERtrainを使います。

https://github.com/transducens/LASERtrain

LASERtrainの使い方

ダウンロード

git clone https://github.com/transducens/LASERtrain

訓練前に行うこと

fairseqを使っているため、訓練前にfairseq-preprocessを実行しておく必要があります。さらにその前に、対象のコーパスをsentencepiece等でエンコードしておく必要があります。

  1. コーパスを用意。
  2. コーパスからsentencepieceを学習。
  3. コーパスをsentencepieceでエンコード
  4. fairseq-preprocessを実行。

fairseq-preprocessの実行例は以下です。

fairseq-preprocess \
  --source-lang $SRC --target-lang $TGT \
  --trainpref $DATA/train.bpe.${SRC}-${TGT} --validpref $DATA/valid.bpe.${SRC}-${TGT} --testpref $DATA/test.bpe.${SRC}-${TGT} \
  --destdir $DATABIN \
  --joined-dictionary \
  --workers 8

訓練方法

基本的には、fairseqのユーザ定義モデルの訓練方法を利用します。訓練例は以下のスクリプトです。

https://github.com/transducens/LASERtrain/blob/master/bucc/train.sh

訓練したモデルからエンコードする

エンコードスクリプトは以下で公開しています。

https://github.com/sugiyamath/wmt19_pcf_experiments/blob/master/laser/scripts/embed.py

エンコード方法の例は以下です。

[encode_target.sh]

DATA_ROOT=$1
SCRIPT_DIR=$2
MODEL=$3
USER_DIR=$4
cat ${DATA_ROOT}/ne-en/target_laser.en | python3 ${SCRIPT_DIR}/embed.py ${DATA_ROOT}/laser/data-bin/ --task multilingual_translation_singlemodel --lang-pairs ne-en --path ${MODEL} --output-file ${DATA_ROOT}/ne-en/target_laser.en.enc --user-dir ${USER_DIR}
bash scripts/encode_target.sh ../data ./scripts ./checkpoints/checkpoint_best.pt ./LASERtrain/fairseq-modules/

エンコードされたデータを読み込むには以下のようなpythonコードを実行します。

import numpy as np
dim = 1024
data = np.fromfile("../data/ne-en/target_laser.en.enc", dtype=np.float32)
data.resize(data.shape[0] // dim, dim)

注意点

LASERtrainはfacebookresearch(本家)のLASERとコンパチビリティがありません。理論的には整合しているはずですが、実装の詳細は一致していないところがあります。例えば、facebookresearchのLASERはfastBPEを使うように実装されていますが、LASERtrainはsentencepieceであっても、事前に前処理してさえいれば動作します。

参考

  1. https://github.com/facebookresearch/LASER
  2. https://github.com/transducens/LASERtrain
  3. https://github.com/raymondhs/fairseq-laser