ラベル名のみを使用したテキスト分類に使用されるソースコード:EMNLP 2020で公開されている言語モデルの自己トレーニングアプローチ。
コードを実行するには、少なくとも1つのGPUが必要です。
実行する前に、次のコマンドを入力して、最初に必要なパッケージをインストールする必要があります。
$ pip3 install -r requirements.txt
また、NLTKライブラリにストップワードをダウンロードする必要があります。
import nltk
nltk.download('stopwords')
Python 3.6以上を強くお勧めします。古いPythonバージョンを使用すると、パッケージの互換性の問題につながる可能性があります。
datasets下のペーパーで使用されているデータセットをダウンロードするための4つのget_data.shスクリプトと、4つのデータセットでモデルを実行するために、 agnews.sh 、 dbpedia.sh 、 imdb.sh 、 amazon.shトレーニングする4つのトレーニングBashスクリプトを提供します。
注:私たちのモデルはトレーニングラベルを使用していません。完全性と評価のためにのみ、トレーニング/テストセットグラウンドトゥルースラベルを提供します。
トレーニングバッシュスクリプトでは、2つの10GB GPUがあると想定しています。 GPUの数が異なる場合、または異なるメモリサイズのGPUがある場合は、次のコマンドライン引数を適切に変更する方法については次のセクションを参照してください(他の引数を変更しないでください): train_batch_size 、 accum_steps 、 eval_batch_size 、 gpus 。
コマンドライン引数の意味は、入力時に表示されます
python src/train.py -h
次の議論はモデルのパフォーマンスに直接影響し、慎重に設定する必要があります。
train_batch_size 、 accum_steps 、 gpus :これらの3つの引数を一緒に設定する必要があります。 train_batch_size * accum_steps * gpusとして計算された効果的なトレーニングバッチサイズが約128であることを確認する必要があります。たとえば、4つのGPUを持っている場合、 train_batch_size = 32, accum_steps = 1, gpus = 4設定できます。 1つのGPUをお持ちの場合は、 train_batch_size = 32, accum_steps = 4, gpus = 1を設定できます。 GPUのメモリサイズが異なる場合、効果的なトレーニングバッチサイズを128程度に保つために、 accum_stepsとgpusを調整しながらtrain_batch_size変更する必要がある場合があります。eval_batch_size :この引数は、アルゴリズムの速度にのみ影響します。 GPUが保持できるように、大きな評価バッチサイズを使用します。max_len :この引数は、モデルに供給されたドキュメントの最大長を制御します(長いドキュメントが切り捨てられます)。理想的には、 max_len最長のドキュメントの長さに設定する必要があります( max_len BERTアーキテクチャでは512を超えることはできません)が、より大きなmax_lenを使用すると、より多くのGPUメモリも消費し、バッチサイズが小さくなり、トレーニング時間が長くなります。したがって、 max_lenを減らすことにより、モデルの精度をより高速なトレーニングと交換できます。mcp_epochs 、 self_train_epochs :それぞれマスクされたカテゴリ予測タスクと自己トレーニングタスクでモデルをトレーニングするためのエポック数を制御します。 mcp_epochs = 3, self_train_epochs = 1ほとんどのデータセットで適切な出発点になりますが、データセットが小さい場合( 100,000ドキュメント未満)、それらを増やすことができます。その他の引数は、デフォルト値として保持できます。
新しいデータセットでコードを実行するには、
datasetsの下にyour_datasetという名前のディレクトリを作成します。your_datasetの下にあるText Corpus train.txt (1行ごとに1つのドキュメント)を準備します(ドキュメントラベルは必要ありません)。label_names.txtの準備your_dataset (各行には1つのカテゴリのラベル名が含まれています。複数の単語がカテゴリのラベル名として使用されている場合は、同じ行に入れて、Whitespace文字で分離します)。test_labels.txtを使用して、テストCorpus test.txt (1行ごとのドキュメント) 0提供することを選択できます(各行には、対応するドキュメントのカテゴリインデックスを示す整数がlabel_names.txtれています。テストコーパスが提供されている場合、トレーニングが完了したら、コードはyour_datasetに分類結果をout.txtに書き込みます。テストコーパスのグラウンドトゥルースラベルが提供されている場合、セルフトレーニング中にテスト精度が表示されます。これは、ハイパーパラメーターの調整と小さなテストセットを使用してチェリーピッキングに役立ちます。your_datasetの下でfinal_model.ptとして保存されます。注:コードは、継続的なトレーニングのために、データセットディレクトリの下にある.ptファイルとして中間データとモデルチェックポイントをキャッシュします。トレーニングコーパスまたはラベル名を変更してコードを再実行する場合、最初にすべての.ptファイルを削除して、コードが古い結果をロードしないようにする必要があります。
独自のデータセットを準備するときは、いつでもデータセットのサンプルを参照できます。
調査に役立つコードを見つけた場合は、次の論文を引用してください。
@inproceedings{meng2020text,
title={Text Classification Using Label Names Only: A Language Model Self-Training Approach},
author={Meng, Yu and Zhang, Yunyi and Huang, Jiaxin and Xiong, Chenyan and Ji, Heng and Zhang, Chao and Han, Jiawei},
booktitle={Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing},
year={2020},
}