【DSW Gallery】RoBERTa Chinese text matching based on EasyNLP
EasyNLP を使用した RoBERTa 中国語テキストマッチング
EasyNLP は、Alibaba Cloud PAI アルゴリズムチームが PyTorch ベースで開発した、使いやすく豊富な NLP アルゴリズムフレームワーク (https://github.com/alibaba/EasyNLP) です。トレーニングからデプロイまで、NLP 開発環境をワンストップで提供します。EasyNLP はさまざまなモデルトレーニングおよび予測機能を提供し、自然言語処理の開発者が迅速かつ簡単にモデルを構築し、本番環境に適用できるようにすることを目的としています。
本記事では、テキストマッチングを例に、EasyNLP を使用して PAI-DSW 上で RoBERTa を活用した中国語テキストマッチングモデルの構築、トレーニング、評価、予測を迅速に行う方法を紹介します。
RoBERTa について
RoBERTa は、Facebook (現 META) AI Research が 2019 年 7 月に提案した、BERT ベースの改良型事前学習言語表現モデルです。正式名称は Robustly Optimized BERT pretraining Approach です。BERT と同様に Transformer エンコーダー構造を採用していますが、追加のトレーニングデータと改良された事前学習戦略を BERT に加えることで、より強力な事前学習言語モデルを実現しています。これにより、自然言語理解 (NLU) タスクにおいて BERT を大幅に上回る性能を発揮します。
動作環境要件
Python 3.6、PyTorch 1.8 イメージ、GPU モデル P100 または V100、メモリ 32 GB 以上が推奨されます。
EasyNLP のインストール
GitHub から EasyNLP のソースコードをダウンロードしてインストールすることが推奨されます。コマンドは以下の通りです。
。git clone https://github.com/alibaba/EasyNLP.git
。pip install -r EasyNLP/requirements.txt
。cd EasyNLP && python setup.py install
以下のコマンドでインストールが成功したかどうかを確認できます。
。 which easynlp
システムに easynlp の CLI ツールがインストールされていれば、EasyNLP コードライブラリのインストールは完了しています。
データ準備
まず、指定されたモデルディレクトリに移動し、本サンプルで使用するトレーニングセットおよびテストセットをダウンロードし、モデルを保存するフォルダを作成します。コマンドは以下の通りです。
。cd examples/appzoo_tutorials/text_match/single_tower
。 wget http://atp-modelzoo.oss-cn-hangzhou.aliyuncs.com/release/tutorials/ez_text_match/afqmc_public/train.csv
。 wget http://atp-modelzoo.oss-cn-hangzhou.aliyuncs.com/release/tutorials/ez_text_match/afqmc_public/dev.csv
データのダウンロードが完了したら、以下のコードで最初の 5 件のデータサンプルを確認できます。各行が 1 件のデータサンプル、各列がフィールド値となっており、テキストマッチング対象の 2 つの文章と、対応するマッチング結果のラベルが含まれています。
print('Training data sample:')
。head -n 5 train.csv
print('Development set data sample:')
。head -n 5 dev.csv
初期化
Python 3.6 環境で、まずインストールした EasyNLP からモデルの実行に必要な各種ライブラリをインポートし、初期化を行います。本チュートリアルでは chinese-roberta-wwm-ext を使用します。EasyNLP には豊富な事前学習済みモデルライブラリが統合されています。bert や albert など他の事前学習済みモデルを試す場合は、user_defined_parameters で対応する変更を行ってください。具体的なモデル名はモデルリストで確認できます。
# In order to avoid the conflict between the args in EasyNLP and the Jupyter system, it needs to be set manually, otherwise it cannot be initialized.
# If you run the code in the text on the command line or in the py file, you can ignore the following code.
import sys
sys.argv = ['main.py']
import torch.cuda
from easylp.appzoo import SingleTowerDataset
from easylp.appzoo import get_application_predictor, get_application_model, get_application_evaluator, get_application_model_for_evaluation
from easylp.core import Trainer, PredictorManager
from easynlp.utils import initialize_easynlp, get_args, get_pretrain_model_path
from easynlp.utils.global_vars import parse_user_defined_parameters
initialize_easynlp()
args = get_args()
user_defined_parameters = parse_user_defined_parameters('pretrain_model_name_or_path=hfl/chinese-roberta-wwm-ext loss_type=hinge_loss margin=0.45 gamma=32 embedding_size=256')
args.checkpoint_dir = "./text_match_single_tower_model_dir"
注意:上記のコードで「Address already in use」エラーが発生した場合は、以下のコマンドを実行して、該当ポートで実行中のプログラムを終了する必要があります。netstat -tunlp|grep 6000 kill -9 PID(PID は前のコマンドの実行結果に表示される対応するプログラム ID に置き換えてください)
データのロード
EasyNLP に組み込まれている SingleTowerDataset を使用して、トレーニングデータとテストデータをロードします。主なパラメーターは以下の通りです。
・ pretrained_model_name_or_path:事前学習済みモデルの名前またはパス。ここでは、カプセル化された get_pretrain_model_path 関数を使用してモデル名「hfl/chinese-roberta-wwm-ext」を処理し、パスを取得すると同時にモデルを自動的にダウンロードします
・ max_seq_length:テキストの最大長。超えた場合は切り詰められ、不足の場合はパディングされます
・ first_sequence, second_sequence, label_name:input_schema のどのフィールドを入力文ペアおよびラベル列などとして使用するかを指定します
・ label_enumerate_values:ラベル型の列挙値
・ is_training:トレーニングプロセスかどうかを示します。train_dataset は True、valid_dataset は False です
train_dataset = SingleTowerDataset(
pretrained_model_name_or_path=get_pretrain_model_path("hfl/chinese-roberta-wwm-ext"),
data_file="train.csv",
max_seq_length=128,
input_schema="example_id:str:1,sent1:str:1,sent2:str:1,label:str:1,cate:str:1,score:str:1",
first_sequence="sent1",
second_sequence="sent2",
label_name="label",
label_enumerate_values="0,1",
is_training=True)
valid_dataset = SingleTowerDataset(
pretrained_model_name_or_path=get_pretrain_model_path("hfl/chinese-roberta-wwm-ext"),
data_file="dev.csv",
max_seq_length=128,
input_schema="example_id:str:1,sent1:str:1,sent2:str:1,label:str:1,cate:str:1,score:str:1",
first_sequence="sent1",
second_sequence="sent2",
label_name="label",
label_enumerate_values="0,1",
is_training=False)
事前に hfl/chinese-roberta-wwm-ext を選択したため、ここでも事前学習済みモデルが自動的にダウンロードおよびロードされます。
モデルトレーニング
データを処理し、モデルをロードした後、モデルのトレーニングを開始します。EasyNLP のパッケージ化された get_application_model 関数を使用してトレーニング用のモデルを構築します。パラメーターは以下の通りです。
・ app_name:タスク名。ここではテキストマッチング「text_match」を選択します
・ pretrained_model_name_or_path:事前学習済みモデルの名前またはパス。ここでは、カプセル化された get_pretrain_model_path 関数を使用してモデル名「hfl/chinese-roberta-wwm-ext」を処理し、パスを取得すると同時にモデルを自動的にダウンロードします
・ num_labels:カテゴリ数。本サンプルのデータセットは二項分類データセットです
・ user_defined_parameters:ユーザー定義パラメーター。先ほど処理したカスタムパラメーター user_defined_parameters を直接渡します
model = get_application_model(app_name="text_match",
pretrained_model_name_or_path=get_pretrain_model_path("hfl/chinese-roberta-wwm-ext"),
num_labels=2,
user_defined_parameters=user_defined_parameters)
ログから、事前学習済みモデルのパラメーターがロードされたことが確認できます。次のステップでは、EasyNLP の Trainer クラスを使用してトレーニングインスタンスを作成し、トレーニングを実行します。
trainer = Trainer(model=model,
train_dataset = train_dataset,
evaluator=get_application_evaluator(app_name="text_match",
valid_dataset=valid_dataset,
eval_batch_sizee=32,
user_defined_parameters=user_defined_parameters))
trainer. train()
モデル評価
トレーニングプロセスが完了すると、トレーニング済みモデルは最初に指定した checkpoint_dir に保存されます。ローカルパスは「./text_match_single_tower_model_dir/」です。トレーニング済みモデルの効果を評価できます。まず EasyNLP の get_application_model_for_evaluation メソッドを使用して、評価用モデルを構築します。
model = get_application_model_for_evaluation(app_name="text_match",
pretrained_model_name_or_path="./text_match_single_tower_model_dir/",
user_defined_parameters=user_defined_parameters)
次に、EasyNLP の get_application_evaluator を使用して評価器を初期化し、現在のデバイスのモデルを指定してモデル評価を実行します。
evaluator = get_application_evaluator(app_name="text_match",
valid_dataset=valid_dataset,
eval_batch_size=32,
user_defined_parameters=user_defined_parameters)
model.to(torch.cuda.current_device())
evaluator.evaluate(model=model)
EasyNLP は、Alibaba Cloud PAI アルゴリズムチームが PyTorch ベースで開発した、使いやすく豊富な NLP アルゴリズムフレームワーク (https://github.com/alibaba/EasyNLP) です。トレーニングからデプロイまで、NLP 開発環境をワンストップで提供します。EasyNLP はさまざまなモデルトレーニングおよび予測機能を提供し、自然言語処理の開発者が迅速かつ簡単にモデルを構築し、本番環境に適用できるようにすることを目的としています。
本記事では、テキストマッチングを例に、EasyNLP を使用して PAI-DSW 上で RoBERTa を活用した中国語テキストマッチングモデルの構築、トレーニング、評価、予測を迅速に行う方法を紹介します。
RoBERTa について
RoBERTa は、Facebook (現 META) AI Research が 2019 年 7 月に提案した、BERT ベースの改良型事前学習言語表現モデルです。正式名称は Robustly Optimized BERT pretraining Approach です。BERT と同様に Transformer エンコーダー構造を採用していますが、追加のトレーニングデータと改良された事前学習戦略を BERT に加えることで、より強力な事前学習言語モデルを実現しています。これにより、自然言語理解 (NLU) タスクにおいて BERT を大幅に上回る性能を発揮します。
動作環境要件
Python 3.6、PyTorch 1.8 イメージ、GPU モデル P100 または V100、メモリ 32 GB 以上が推奨されます。
EasyNLP のインストール
GitHub から EasyNLP のソースコードをダウンロードしてインストールすることが推奨されます。コマンドは以下の通りです。
。git clone https://github.com/alibaba/EasyNLP.git
。pip install -r EasyNLP/requirements.txt
。cd EasyNLP && python setup.py install
以下のコマンドでインストールが成功したかどうかを確認できます。
。 which easynlp
システムに easynlp の CLI ツールがインストールされていれば、EasyNLP コードライブラリのインストールは完了しています。
データ準備
まず、指定されたモデルディレクトリに移動し、本サンプルで使用するトレーニングセットおよびテストセットをダウンロードし、モデルを保存するフォルダを作成します。コマンドは以下の通りです。
。cd examples/appzoo_tutorials/text_match/single_tower
。 wget http://atp-modelzoo.oss-cn-hangzhou.aliyuncs.com/release/tutorials/ez_text_match/afqmc_public/train.csv
。 wget http://atp-modelzoo.oss-cn-hangzhou.aliyuncs.com/release/tutorials/ez_text_match/afqmc_public/dev.csv
データのダウンロードが完了したら、以下のコードで最初の 5 件のデータサンプルを確認できます。各行が 1 件のデータサンプル、各列がフィールド値となっており、テキストマッチング対象の 2 つの文章と、対応するマッチング結果のラベルが含まれています。
print('Training data sample:')
。head -n 5 train.csv
print('Development set data sample:')
。head -n 5 dev.csv
初期化
Python 3.6 環境で、まずインストールした EasyNLP からモデルの実行に必要な各種ライブラリをインポートし、初期化を行います。本チュートリアルでは chinese-roberta-wwm-ext を使用します。EasyNLP には豊富な事前学習済みモデルライブラリが統合されています。bert や albert など他の事前学習済みモデルを試す場合は、user_defined_parameters で対応する変更を行ってください。具体的なモデル名はモデルリストで確認できます。
# In order to avoid the conflict between the args in EasyNLP and the Jupyter system, it needs to be set manually, otherwise it cannot be initialized.
# If you run the code in the text on the command line or in the py file, you can ignore the following code.
import sys
sys.argv = ['main.py']
import torch.cuda
from easylp.appzoo import SingleTowerDataset
from easylp.appzoo import get_application_predictor, get_application_model, get_application_evaluator, get_application_model_for_evaluation
from easylp.core import Trainer, PredictorManager
from easynlp.utils import initialize_easynlp, get_args, get_pretrain_model_path
from easynlp.utils.global_vars import parse_user_defined_parameters
initialize_easynlp()
args = get_args()
user_defined_parameters = parse_user_defined_parameters('pretrain_model_name_or_path=hfl/chinese-roberta-wwm-ext loss_type=hinge_loss margin=0.45 gamma=32 embedding_size=256')
args.checkpoint_dir = "./text_match_single_tower_model_dir"
注意:上記のコードで「Address already in use」エラーが発生した場合は、以下のコマンドを実行して、該当ポートで実行中のプログラムを終了する必要があります。netstat -tunlp|grep 6000 kill -9 PID(PID は前のコマンドの実行結果に表示される対応するプログラム ID に置き換えてください)
データのロード
EasyNLP に組み込まれている SingleTowerDataset を使用して、トレーニングデータとテストデータをロードします。主なパラメーターは以下の通りです。
・ pretrained_model_name_or_path:事前学習済みモデルの名前またはパス。ここでは、カプセル化された get_pretrain_model_path 関数を使用してモデル名「hfl/chinese-roberta-wwm-ext」を処理し、パスを取得すると同時にモデルを自動的にダウンロードします
・ max_seq_length:テキストの最大長。超えた場合は切り詰められ、不足の場合はパディングされます
・ first_sequence, second_sequence, label_name:input_schema のどのフィールドを入力文ペアおよびラベル列などとして使用するかを指定します
・ label_enumerate_values:ラベル型の列挙値
・ is_training:トレーニングプロセスかどうかを示します。train_dataset は True、valid_dataset は False です
train_dataset = SingleTowerDataset(
pretrained_model_name_or_path=get_pretrain_model_path("hfl/chinese-roberta-wwm-ext"),
data_file="train.csv",
max_seq_length=128,
input_schema="example_id:str:1,sent1:str:1,sent2:str:1,label:str:1,cate:str:1,score:str:1",
first_sequence="sent1",
second_sequence="sent2",
label_name="label",
label_enumerate_values="0,1",
is_training=True)
valid_dataset = SingleTowerDataset(
pretrained_model_name_or_path=get_pretrain_model_path("hfl/chinese-roberta-wwm-ext"),
data_file="dev.csv",
max_seq_length=128,
input_schema="example_id:str:1,sent1:str:1,sent2:str:1,label:str:1,cate:str:1,score:str:1",
first_sequence="sent1",
second_sequence="sent2",
label_name="label",
label_enumerate_values="0,1",
is_training=False)
事前に hfl/chinese-roberta-wwm-ext を選択したため、ここでも事前学習済みモデルが自動的にダウンロードおよびロードされます。
モデルトレーニング
データを処理し、モデルをロードした後、モデルのトレーニングを開始します。EasyNLP のパッケージ化された get_application_model 関数を使用してトレーニング用のモデルを構築します。パラメーターは以下の通りです。
・ app_name:タスク名。ここではテキストマッチング「text_match」を選択します
・ pretrained_model_name_or_path:事前学習済みモデルの名前またはパス。ここでは、カプセル化された get_pretrain_model_path 関数を使用してモデル名「hfl/chinese-roberta-wwm-ext」を処理し、パスを取得すると同時にモデルを自動的にダウンロードします
・ num_labels:カテゴリ数。本サンプルのデータセットは二項分類データセットです
・ user_defined_parameters:ユーザー定義パラメーター。先ほど処理したカスタムパラメーター user_defined_parameters を直接渡します
model = get_application_model(app_name="text_match",
pretrained_model_name_or_path=get_pretrain_model_path("hfl/chinese-roberta-wwm-ext"),
num_labels=2,
user_defined_parameters=user_defined_parameters)
ログから、事前学習済みモデルのパラメーターがロードされたことが確認できます。次のステップでは、EasyNLP の Trainer クラスを使用してトレーニングインスタンスを作成し、トレーニングを実行します。
trainer = Trainer(model=model,
train_dataset = train_dataset,
evaluator=get_application_evaluator(app_name="text_match",
valid_dataset=valid_dataset,
eval_batch_sizee=32,
user_defined_parameters=user_defined_parameters))
trainer. train()
モデル評価
トレーニングプロセスが完了すると、トレーニング済みモデルは最初に指定した checkpoint_dir に保存されます。ローカルパスは「./text_match_single_tower_model_dir/」です。トレーニング済みモデルの効果を評価できます。まず EasyNLP の get_application_model_for_evaluation メソッドを使用して、評価用モデルを構築します。
model = get_application_model_for_evaluation(app_name="text_match",
pretrained_model_name_or_path="./text_match_single_tower_model_dir/",
user_defined_parameters=user_defined_parameters)
次に、EasyNLP の get_application_evaluator を使用して評価器を初期化し、現在のデバイスのモデルを指定してモデル評価を実行します。
evaluator = get_application_evaluator(app_name="text_match",
valid_dataset=valid_dataset,
eval_batch_size=32,
user_defined_parameters=user_defined_parameters)
model.to(torch.cuda.current_device())
evaluator.evaluate(model=model)
Related Articles
-
A detailed explanation of Hadoop core architecture HDFS
Knowledge Base Team
-
What Does IOT Mean
Knowledge Base Team
-
6 Optional Technologies for Data Storage
Knowledge Base Team
-
What Is Blockchain Technology
Knowledge Base Team
Explore More Special Offers
-
Short Message Service(SMS) & Mail Service
50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00
