[自然言語処理 (NLP)] ERNIE 言語モデルに基づくテキスト意味マッチング
著者について: 大学生、Huawei Cloud Sharing の専門家、Alibaba Cloud の専門ブロガー、Tengyun Pioneer (TDP) のメンバー、Yunxi Smart Project のゼネラル ディレクター、National Committee of Experts on Computer Teaching and Industrial Practice Resource Construction in Colleges and Universities ( はもちろん、プログラミング愛好家も、みんなと一緒に学び、進歩することを楽しみにしています~TIPCC
.
ブログのホームページ:ぃ・Ling Yu がの学習ログ
.
この記事のコラム:人工知能
. No stop .
記事ディレクトリ
序文
(1) タスクの説明
テキスト マッチングは、2 つのテキスト間の関係を一般的に研究する自然言語処理 (NLP) の分野において、常に基本的かつ重要な方向性です。テキスト類似度計算、自然言語推論、質問応答システム、情報検索などはすべて、さまざまなデータやシナリオのテキスト マッチング アプリケーションと見なすことができます。これらの自然言語処理タスクの大部分は、テキスト マッチング問題に抽象化できます. たとえば、情報検索は検索用語とドキュメント リソースのマッチングに起因し、質問応答システムは質問と回答候補のマッチングに起因します. 、および言い換え問題は2つに帰することができます同義文の一致、対話システムは前の文と応答の一致に帰することができ、機械翻訳は2つの言語の一致に帰することができます。
(2) データソース
データセットは、Tianchi「Public AI Star」Challenge-New Crown Epidemic Similar Sentence Pair Judgement Competition によって提供されます。
疫病との戦いに直面して、疫病知識クイズの応用が広く推進されています。自然言語技術による質問応答の類似度分類をどのように行うかは、依然として貴重な問題です。たとえば、患者からの類似の質問を特定することは、患者の真の要求を理解し、正確な回答を迅速に照合し、患者の利得感を向上させるのに役立ちます; 医師からの類似の回答を要約することは、回答の標準化を分析し、標準化を確実にするのに役立ちます。流行中の相談、誤診を避ける。
競争は、流行に関連する呼吸分野の実データの蓄積に焦点を当てており、データの粒度はより洗練されており、判断の難易度は複数部門のテキスト類似性マッチングよりも高く、質問と回答のデータもよりタイムリーです。 . 質問は 20 語に制限されており、比較的標準化された文のペアを形成します。
データセットの例:
# 解压数据集
!tar -zxvf /home/aistudio/data/data48492/COVID19_sim_competition.tar.gz
# 查看数据集样例
!head -n 5 COVID19_sim_competition/train.tsv
出力を以下の図 1 に示します。
データセットは、テキスト ペア (text_a、text_b、text_a はクエリ、text_b はタイトル) とカテゴリ (ラベル) を提供します。ラベルは 1 です。これは、text_a と text_b のテキスト セマンティクスが類似していることを意味します。それ以外の場合は、類似していないことを意味します。
テキスト マッチング タスクは、バージョン 1.8.0 以降、PaddleHub に組み込まれています。テキスト マッチング タスクは、ポイントごとのタイプとペアごとのタイプに分けることができます。
- 各サンプルは通常、2 つのテキスト (クエリ、タイトル) で構成されます。カテゴリ形式は 0 または 1 で、0 はクエリがタイトルと一致しないことを意味し、1 は一致することを意味します。
- 通常、各サンプルは 3 つのテキスト (query、positive_title、negative_title) で構成されます。positive_title は、negative_title よりもクエリによく一致します。
このデータセットの例によると、マッチング タスクはポイントごとのタイプです。
次に、このチュートリアルでは、PaddleHub を事前トレーニング済みモデル ERNIE と組み合わせて使用し、ポイントごとのテキスト マッチング タスクを完了する方法を示します。
ペアワイズ テキスト マッチング タスクは、チュートリアルを参照できます:
https://aistudio.baidu.com/aistudio/projectdetail/709472
1.PaddleHub がカスタム データセットを読み込む
テキスト マッチング タスク用のカスタム データ セットをロードするには、TextMatchingDataset クラスを継承し、データ セット ストレージ アドレスを置き換えるだけです。次のコード例は、カスタム データセットを PaddleHub に読み込んで使用する方法を示しています。このようにして、事前トレーニング済みのモデルを小さなデータセットで微調整するだけで済みます。
# 安装PaddleHub 1.8.1版本
!pip install paddlehub==1.8.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
from paddlehub.dataset.base_nlp_dataset import TextMatchingDataset
class COVID19Competition(TextMatchingDataset):
def __init__(self, tokenizer=None, max_seq_len=None):
base_path = 'COVID19_sim_competition'
super(COVID19Competition, self).__init__(
is_pair_wise=False, # 文本匹配类型,是否为pairwise
base_path=base_path,
train_file="train.tsv", # 相对于base_path的文件路径
dev_file="dev.tsv", # 相对于base_path的文件路径
train_file_with_header=True,
dev_file_with_header=True,
label_list=["0", "1"],
tokenizer=tokenizer,
max_seq_len=max_seq_len)
次に、セマンティック事前トレーニング モデル ERNIE がテキスト マッチングを最適化します。
Google の BERT モデルや Baidu の ERNIE モデルなど、事前にトレーニングされたモデルに関心がある場合は、独自のタスクでその効果を試す価値もあります。
Baidu の事前トレーニング モデル ERNIE は、大量のデータでトレーニングした後、非常に優れた特徴抽出を行いました。転移学習のアイデアを利用して、大量のデータで学習したセマンティック情報を使用して、小さなデータセット (この例の医療テキスト データセットなど) でのタスクを支援できます。
PaddleHub は豊富な事前トレーニング済みモデルを提供し、PaddlePaddle エコシステムですべての事前トレーニング済みモデルを簡単に取得できます。以下は、PaddleHub を使用してワンクリックで ERNIE を読み込み、テキスト マッチング タスクを最適化する方法を示しています。
(1)、PaddleHub ワンクリック読み込み ERNIE
import paddlehub as hub
import paddle
paddle.enable_static()
module = hub.Module(name="ernie")
# Pointwise任务需要: query, title_left (2 slots)
inputs, outputs, program = module.context(
trainable=True, max_seq_len=128, num_slots=2)
シーケンスの最大長 max_seq_len は調整可能なパラメーターです. 推奨値は 128 です. 値はタスク テキストの長さに応じて調整できますが、512 を超えることはできません.
num_slots: タスクの入力テキストに一致するテキスト内のデータの量。ポイント単位のテキスト マッチング タスク num_slots は 2 にする必要があります。これは、クエリとタイトルを意味します。ペアワイズ テキスト マッチング タスク num_slots は 3 である必要があります。
他のセマンティック モデル (ernie_tiny、RoBERTa など) を試してみたい場合は、Module の name パラメータを置き換えるだけです。
(2) Tokenizer を選択してデータを読み込みます
tokenizer = hub.BertTokenizer(vocab_file=module.get_vocab_path(), tokenize_chinese_chars=True)
dataset = COVID19Competition(tokenizer=tokenizer, max_seq_len=128)
module.get_vocab_path()
事前トレーニング済みモデルに対応する語彙を返します。
tokenize_chinese_chars
中国語のテキストを分割するかどうか
ノート:
- Transformer クラス モデル (ERNIE、BERT、RoBerta など) を使用する場合は、 を選択する必要があります
hub.BertTokenizer
。 - 非 Transformer クラス モデル (word2vec_skipgram、tencent_ailab_chinese_embedding_small など) を使用する場合は、選択する必要があります。
hub.CustomTokenizer
- データセット オブジェクトを作成するときは、最初のステップのインターフェース
max_seq_len
と一致している必要があります。module.context
max_seq_len
- ここでは、データを取り出して印刷します. docs を使用してデータのリストを取得し、labels を使用してデータのラベル値を取得し、それを印刷してデータの予備的な印象を得ることができます.
(3) 最適化戦略と運用構成の選択
ERNIE/BERT などの Transformer モデルの移行最適化戦略は次のAdamWeightDecayStrategy
とおりです。
詳細については、戦略を参照してください。
AdamWeightDecayStrategy
パラメータ:
learning_rate
: 最大学習率lr_scheduler
:オプションの減衰戦略が 2 つlinear_decay
あります。noam_decay
warmup_proprotion
: トレーニング ウォームアップの割合。0.1 に設定すると、トレーニング ステップの最初の 10% で学習率が 0.1 まで徐々に増加します。learning_rate
weight_decay
: モデルのオーバーフィッティングを避けるため、モデルの定期的な項の戦略と同様の重みの減衰
strategy = hub.AdamWeightDecayStrategy(
weight_decay=0.01,
warmup_proportion=0.1,
learning_rate=5e-5)
PaddleHub は、 、 などの多くの最適化戦略を提供しますAdamWeightDecayStrategy
。ULMFiTStrategy
詳細DefaultFinetuneStrategy
については、戦略を参照してください。
(4)、実行構成を選択します
Finetune を実行する前に、次のコードの構成など、いくつかのランタイム構成を設定できます。つまり、次のことを意味します。
-
use_cuda
: トレーニングに CPU を使用するには、False に設定します。お使いのマシンが GPU をサポートし、PaddlePaddle の GPU バージョンがインストールされている場合は、このオプションを True に設定することをお勧めします。 -
num_epoch
: Finetune 中にトレーニング セットをトラバースする回数。 -
batch_size
: 各トレーニング中、モデルに入力されるデータの各バッチのサイズは 32 であり、モデルのトレーニング中にバッチ データを並列処理できるため、batch_size が大きいほどトレーニング効率が高くなりますが、メモリ負荷が大きすぎます。batch_size によってトレーニングに必要なメモリが不足する可能性があるため、適切な batch_size を選択することは重要なステップです。 -
checkpoint_dir
: トレーニング パラメータとデータ ストレージ ディレクトリ。 -
eval_interval
: 100 ステップごとに検証セットのパフォーマンス評価を実行します。 -
strategy
: 戦略を微調整します。
その他の実行構成については、RunConfigを参照してください。
config = hub.RunConfig(
eval_interval=300,
use_cuda=True,
num_epoch=3,
batch_size=32,
checkpoint_dir='ckpt_ernie_pointwise_matching',
strategy=strategy)
(5) 微調整タスクの確立
事前トレーニング済みのモデル ERNIE を使用してポイントごとのテキスト マッチング タスクを完了するには、クエリとタイトル テキストをつなぎ合わせて ERNIE に入力し、CLS 機能 (pooled_output) を取得して、完全に接続されたレイヤーをバイナリ分類用に出力することを考えるかもしれません。次の図は、文のペアの分類タスクでの BERT の使用法を示しています。
ただし、上記の使用法の問題点は、ERNIE のモデル パラメータが非常に大きいため、計算量が非常に多くなり、予測速度が不十分になることです。したがって、オンラインビジネスの要件を満たすことはできません。この問題に対応して、PaddleHub に組み込まれているテキスト マッチング ネットワークの結果は、sentence-bert の構造を採用しています。
文
-bertはツインタワー(シャム)のネットワーク構造を採用。Query と Title はそれぞれ ERNIE に入り、ERNIE パラメータを共有し、それぞれの sequence_output 機能を取得します。次に、sequence_output でプーリングを実行し (PaddleHub はデフォルトで平均プーリング操作を使用します。PaddleHub の作成者は、多くの実験の後、平均プーリングと max_pooling の実験効果にほとんど違いがないことを発見しました)、出力はそれぞれ u、v として記録されます。次に、3 つの表現 (u、v、|uv|) が 2 項分類のために結合されます。ネットワーク構造は上の図に示されています。
Sentence-BERT の詳細については、次の論文を参照してください: https://arxiv.org/abs/1908.10084
では、Sentence-BERT はどのように Siamese のネットワーク構造を使用して予測速度を向上させているのでしょうか?
Siamese のネットワーク構造の利点は、クエリとタイトルがそれぞれ同じネットワークに入力されることです。たとえば、情報検索タスクでは、データベース内のタイトル テキストを事前に計算し、対応する sequence_output フィーチャをデータベースに保存できます。ユーザーがクエリを検索するとき、クエリの sequence_output 特徴とデータベースに格納されているタイトルの sequence_output 特徴を計算するだけでよく、単純な mean_pooling と全結合層を介してバイナリ分類を実行します。このようにして、予測効率が大幅に向上し、モデルのパフォーマンスも保証されます。
タスクのマッチングに一般的に使用されるシャム ネットワーク構造については、 https ://blog.csdn.net/thriving_fcl/article/details/73730552 を参照してください。
3.タスクを設定する
適切な事前トレーニング済みのモデルと移行する準備が整ったデータセットを使用して、タスクの組み立てを開始します。
- 入力変数と出力変数、およびパドル プログラムを含むモジュールのコンテキストを取得します。
- 出力変数からテキスト マッチング用の単語レベルの特徴 sequence_output を検索します。
- タスクを生成するために sequence_output の後に一致するネットワークを接続します。
PointwiseTextMatchingTask
パラメータは次のとおりです。
-
dataset
:データ; -
query_feature
: 事前トレーニングから抽出されたクエリの対応する特徴。 -
title_feature
:プレトレーニングから抽出されたタイトル対応特徴。 -
tokenizer
: データプロセッサ -
config
: 実行構成;
# 构建迁移网络,使用ERNIE的token-level输出
query = outputs["sequence_output"]
title = outputs['sequence_output_2']
# 创建pointwise文本匹配任务
pointwise_matching_task = hub.PointwiseTextMatchingTask(
dataset=dataset,
query_feature=query,
title_feature=title,
tokenizer=tokenizer,
config=config)
4.微調整を開始する
モデルのトレーニングには、finetune_and_eval インターフェースを選択します. 微調整プロセス中、このインターフェースは定期的にモデルの効果を評価し、トレーニング プロセス全体のパフォーマンスの変化を理解できるようにします.
run_states=pointwise_matching_task.finetune_and_eval()
5. モデルを使用して予測を行う
微調整が完了したら、モデルを使用して予測を行います. 予測プロセス全体は、次の手順に大まかに分けることができます。
- ネットワークを構築する
- 予測データを生成するトークナイザー
- 予測プログラムに切り替える
- 事前トレーニング済みのパラメーターを読み込む
- プログラムを実行して予測を行う
予測データのサンプル、コードは次のとおりです。
# 预测数据样例
text_pairs = [
[
"小孩吃了百令胶囊能打预防针吗", # query
"小孩吃了百令胶囊能不能打预防针", # title
],
[
"请问呕血与咯血有什么区别?", # query
"请问呕血与咯血异同?", # title
]
]
results = pointwise_matching_task.predict(
data=text_pairs,
max_seq_len=128,
label_list=dataset.get_labels(),
return_result=True,
accelerate_mode=False)
for index, text in enumerate(text_pairs):
print("data: %s, prediction_label: %s" % (text, results[index]))
出力を以下の図 2 に示します。
要約する
この一連の記事の内容は、清華が発行した「自然言語処理の実践」の関連するメモと洞察に基づいています.コードはBaidu Fei Paoに基づいて開発されています.侵害または不適切な場合は、プライベートメッセージを送信してください処理に協力して、あなたがそれを見たら戻ってくるでしょう!! !
最後に、記事の締めくくりとして、このイベントの一文を引用します~( ̄▽ ̄~)~:
[学習の最大の理由は、凡庸さをなくすことであり、一日も早く、もう 1 回素晴らしい人生を送り、1 日後にはもう 1 日平凡な生活を過ごすことです。】
ps: よりエキサイティングなコンテンツについては、この記事のコラムに入力してください:人工知能、チェックして、サポートとアドバイスを歓迎します~( ̄▽ ̄~)~