プロンプト - 「デザイン プロンプト テンプレート: 少ないデータを使用して事前トレーニングされたモデルの優れたパフォーマンスを実現し、フューショット タスクとゼロショット タスクを支援します」

Prompt任务(プロンプトタスク)

プロンプト (プロンプト) テンプレートを設計することにより、より少ない量のデータを使用して、主にフューショットやゼロショットなどのタスクに使用される事前トレーニング済みモデル (事前トレーニング済みモデル) でより良い結果を得ることができます。

1. 背景の紹介

プロンプトは、NLP における小規模サンプル学習の現在の研究において非常に重要な方向性です。たとえば、今日次のようなコメントが 2 件あったとします。

  1. リンゴの種類は何ですか、リンゴの味がなく、変な味がし、まったく甘くなく、超不味いです!
  2. この壊れたノートの速度は遅すぎるので、引っかかる必要はありません。

次に、説明されている商品の種類に基づいて分類タスクを実行する必要があります。

つまり、最初の文は「果物」カテゴリに分類する必要があり、2 番目の文は「コンピュータ」カテゴリに分類する必要があります。

直観的な方法は、この問題を従来のテキスト分類タスクとしてモデル化し、手動のラベル付けを通じて各カテゴリの ID を設定することです。次に例を示します。

{
    '电脑': 0,
    '水果': 1,
    ....
}

このようにして、ラベル付きデータセットは次のようになります。

什么苹果啊,都没有苹果味,怪怪的味道,而且一点都不甜,超级难吃!  1
这破笔记本速度太慢了,卡的不要不要的。    0
...

この方法は実行可能ですが、良好な結果を得るには「より多くのラベル付きデータ」が必要です。

ほとんどの事前トレーニング モデル (BRET など) は、事前トレーニング中に MLM タスクに [MASK] トークンを使用し、実際のダウンストリーム タスクでは [MASK] トークンを使用しないことが多いため、これは、現在、ダウンストリーム タスクをトレーニングするときに、より多くのデータセットは、上流のタスクと下流のタスク間の矛盾したギャップを平準化するために必要です。

では、十分なトレーニング データがない場合はどうすればよいでしょうか?

この問題を解決するために登場したのが、下流タスクに[MASK]のトークンを導入し、下流タスクをMLMと同様のタスクとして構築するプロンプトラーニングです。

たとえば、上記のコメントを次のように書き換えることができます。

这是一条[MASK][MASK]评论:这破笔记本速度太慢了,卡的不要不要的。

次に、モデルに 2 つの [MASK] トークンの実際の値が何であるかを予測させます。モデルは、マスクされた単語がコンテキストに基づいて「コンピューター」であると推論できます。

下流タスクも事前トレーニング タスクと同じ MLM タスクを使用するため、微調整に使用するトレーニング データを少なくできます。

ただし、これは P チューニングではありません。

上記の例から、文を構築する最も重要な部分はプロンプトの生成であることがわかります。

「这是一条[MASK][MASK]评论:」(prompt) + 这破笔记本速度太慢了,卡的不要不要的。(content)

括弧で囲まれたプレフィックス (プロンプト) の生成は非常に重要であり、異なるプロンプトはモデルの [MASK] 予測の精度に大きく影響します。

では、このプロンプトはどのように生成されるのでしょうか?

もちろん、さまざまな種類のプレフィックス プロンプトを手動で設計できます。これらをプロンプト パターンと呼びます。次に例を示します。

这是一条[MASK][MASK]评论:
下面是一条描述[MASK][MASK]的评论:
[MASK][MASK]:
...

しかし、プロンプトパターンを手動でリストするのは非常に面倒であり、データセットごとに異なるプロンプトパターンが必要であり、再利用性が非常に低いです。

では、機械自体を通じてプロンプトのパターンを学習できるのでしょうか?

それがPチューニングです。

1.1 P チューニング

人工的に構築されたテンプレートは人間にとって合理的ですが、機械の目にはプロンプト パターンがどのように見えるかが本当に重要でしょうか?

機械による自然言語の理解は、人間の理解とは異なる可能性が非常に高いです。私たちはかつて、言語の重要性についてモデルの注意力と人間の理解との比較実験を行ったところ、機械の言語理解と人間の理解の間には一定の違いがあることがわかりました。人間の理解の逸脱。

では、モデルに対して「合理的」と思われるプロンプト パターンを多数設定する必要があるのではなく、モデルが「合理的」と考えるプロンプト パターンを見つけられるようにする必要があるのでしょうか。

したがって、P-Tuning のトレーニングは、プロンプト トークンの生成、マスク ラベルの生成、MLM 損失の計算の 3 つのステップに分かれています。

1.1.1 プロンプトトークンの生成

プロンプト テンプレートを手動で作成する必要がなくなったので、マシンがどのような種類のテンプレートを好むかはわかりません...

テンプレートを作成してモデルに投げてみませんか。

大雑把に聞こえますが、まさにそのとおりです。

バックボン モデルとして中国語 BERT を選択し、プロンプト テンプレートを構成する要素として vocab.txt 内の [未使用] トークンを選択します。

[unused] は BERT ボキャブラリーで予約されている未使用のトークンであり、それ自体には意味がなく、ランダムな組み合わせはセマンティクスに大きな影響を与えません。そのため、プロンプト テンプレートの構築にこれを使用します。

次に、構築されたプロンプト パターンは次のようになります。

[unused1][unused2][unused3][unused4][unused5][unused6] 

1.1.2 マスクラベルの生成

プロンプト テンプレートの構築が完了したら、モデルがラベル予測タスクの完了に役立つように、マスク ラベルを文に追加する必要もあります。

ラベルの長さを 2 に設定し (「フルーツ」、「コンピューター」、どちらも 2 文字の長さ)、ラベルを文の先頭に置きます。

[CLS][MASK][MASK]这破笔记本速度太慢了,卡的不要不要的。[SEP]

その中で、[MASK] トークンは、予測に役立つモデルに必要なラベル トークンです。ここで、2 つの部分をまとめます。

[unused1][unused2][unused3][unused4][unused5][unused6][CLS][MASK][MASK]这破笔记本速度太慢了,卡的不要不要的。[SEP]

これがモデルへの最後の入力です。

1.1.3 MLM 損失の計算

次のステップでは、モデルの微調整を開始します。次のようなデータをモデルに供給します。

[unused1][unused2][unused3][unused4][unused5][unused6][CLS][MASK][MASK]这破笔记本速度太慢了,卡的不要不要的。[SEP]

そして、モデル予測[MASK]トークンの予測結果を取得し、実ラベルとの間のCrossEntropy Lossを計算します。

P-Tuning のタグ データは次のようになります。

水果    什么苹果啊,都没有苹果味,怪怪的味道,而且一点都不甜,超级难吃!
电脑    这破笔记本速度太慢了,卡的不要不要的。
...

つまり、このようなコンテキストではラベルが[MASK]でキャプチャしたものは「アイテムタイプ」に戻す必要があります。

1.1.4 実験

トレーニング データとして 63 個のコメント (8 カテゴリ) を選択し、417 個のコメントに対して分類テストを実行したところ、モデル F1 は 76% で収束できました。実験結果から、プロンプトベースのモデルは、トレーニング サンプルの数が少ない場合でも、比較的良好な結果を達成できることがわかります。従来の分類方法と比較して、P-Tuning はサンプルデータが小さい場合にモデルの過学習をより効果的に軽減できるため、堅牢性が向上します。

論文リンク: https://arxiv.org/pdf/2103.10385.pdf

2.PET (パターン活用トレーニング)

  • 環境のインストールこのプロジェクトは+の実装
    に基づいています。実行する前に関連する依存関係パッケージをインストールしてください。pytorchtransformers
pip install -r ../../requirements.txt

2.1 データセットの準備

2.1.1 ラベルデータの準備

ユーザーコメントに基づいてユーザーコメントの項目カテゴリを予測するプロジェクト(分類タスク)のサンプルデータの一部を に提供していますdata/comment_classify

トレーニングを使用するには自定义数据、サンプル データのようなデータセットを構築するだけです。

水果	什么苹果啊,都没有苹果味,怪怪的味道,而且一点都不甜,超级难吃!
书籍	为什么不认真的检查一下, 发这么一本脏脏的书给顾客呢!
酒店	性价比高的酒店,距离地铁近,邻华师大,环境好。
...

各行\tはセパレータで区切られており、前半は标签(label)、後半は です原始输入

2.1.2 バーバライザーの準備

Verbalizer は、「実際のラベル」と「ラベル予測単語」の間のマッピングを定義するために使用されます。

場合によっては、「実際のラベル」を [MASK] として使用して予測すると、意味上の流暢性が十分に得られない可能性があるため、「実際のラベル」に対して特定のマッピングを行います。

例えば:

"日本爆冷2-1战胜德国"是一则[MASK][MASK]新闻。	体育

この文のラベルは「スポーツ」ですが、ラベルを「サッカー」に設定すると、より予測しやすくなります。

したがって、ラベル「スポーツ」に対して多くのサブラベルを構築できます。推論する場合は、次のようにサブラベルを予測し、最終的に実際のラベルを推論するだけで済みます。

体育 -> 足球,篮球,网球,棒球,乒乓,体育
...

サンプル データの一部は、 のプロジェクトで提供されていますdata/comment_classify/verbalizer.txt

トレーニングを使用するには自定义数据、サンプル データのようなデータセットを構築するだけです。

电脑	电脑
水果	水果
平板	平板
衣服	衣服
酒店	酒店
洗浴	洗浴
书籍	书籍
蒙牛	蒙牛
手机	手机

この例では 1 対 1 言語化ツールを使用していますが、1 対多のマッピングを定義したい場合は、次のように で区切るだけで済みます','

...
水果	苹果,香蕉,橘子
...

2.1.3 プロンプト設定

プロモートは手動で作成されたテンプレートであり、サンプル データの一部はプロジェクト内で提供されますdata/comment_classify/prompt.txt

这是一条{
    
    MASK}评论:{
    
    textA}

このうち、中括弧で囲まれた部分が「カスタムパラメータ」であり、中括弧内の値をカスタマイズすることができます。

この例では、{MASK}は[MASK]トークンの位置を表し、{textA}はコメントデータの位置を表します。

たとえば、{textB} パラメータを追加する場合は、これを必要なテンプレートに変更できます。

{
    
    textA}{
    
    textB}{
    
    MASK}同的意思。

この時点で、プロンプト ファイルを変更するだけでなく、utils.pyファイル内のconvert_example()関数を変更してinputs_dict各「カスタム パラメータ」に値を割り当てる必要もあります。

...
content = content[:max_seq_len-10]      # 防止当[MASK]在尾部的时候被截掉

inputs_dict={
    
                               # 传入对应prompt的自定义参数
    'textA': content,                   
    'MASK': '[MASK]',
    'textB' = ...                       # 给对应的自定义字段赋值
}
...

2.2. モデルのトレーニング

train.shトレーニング スクリプト内の対応するパラメーターを変更して、モデルのトレーニングを開始します。

python pet.py \
    --model "bert-base-chinese" \
    --train_path "data/comment_classify/train.txt" \
    --dev_path "data/comment_classify/dev.txt" \
    --save_dir "checkpoints/comment_classify/" \
    --img_log_dir "logs/comment_classify" \
    --img_log_name "BERT" \
    --verbalizer "data/comment_classify/verbalizer.txt" \       # verbalizer文件位置
    --prompt_file "data/comment_classify/prompt.txt" \          # prompt_file文件位置
    --batch_size 8 \
    --max_seq_len 256 \
    --valid_steps 40  \
    --logging_steps 5 \
    --num_train_epochs 200 \
    --max_label_len 2 \                                         # 子标签最大长度
    --rdrop_coef 5e-2 \
    --device "cuda:0"                                           # 指定使用GPU

トレーニングが正しく開始されると、ターミナルは次の情報を出力します。

...
DatasetDict({
    
    
    train: Dataset({
    
    
        features: ['text'],
        num_rows: 63
    })
    dev: Dataset({
    
    
        features: ['text'],
        num_rows: 590
    })
})
Prompt is -> 这是一条{
    
    MASK}评论:{
    
    textA}100%|████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 12.96ba/s]
100%|████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  2.55ba/s]
global step 5, epoch: 0, loss: 3.74432, speed: 2.67 step/s
global step 10, epoch: 1, loss: 3.06417, speed: 5.86 step/s
global step 15, epoch: 1, loss: 2.51641, speed: 5.73 step/s
global step 20, epoch: 2, loss: 2.12264, speed: 5.84 step/s
global step 25, epoch: 3, loss: 1.80121, speed: 5.82 step/s
global step 30, epoch: 3, loss: 1.52964, speed: 5.78 step/s
...

logs/sentiment_classificationトレーニング曲線グラフは次のファイルに保存されます。

2.3. モデルの予測

モデルのトレーニングが完了したら、inference.pyトレーニングされたモデルをロードして適用するために実行します。

...
contents = [
        '地理环境不错,但对面一直在盖楼,门前街道上打车不方便。',
        '跟好朋友一起凑单买的,很划算,洗发露是樱花香的,挺好的。。。'
    ]                           # 自定义评论
res = inference(contents)       # 推测评论类型
...

推論プログラムを実行します。

python inference.py

次の推論結果が得られます。

Prompt is -> 这是一条{
    
    MASK}评论:{
    
    textA}。
Used 0.47s.
inference label(s): ['酒店', '洗浴']

3.P-チューニング:自動学習プロンプトパターン

  • 環境のインストールこのプロジェクトは+の実装
    に基づいています。実行する前に関連する依存関係パッケージをインストールしてください。pytorchtransformers
pip install -r ../../requirements.txt

torch
transformers==4.22.1
datasets==2.4.0
evaluate==0.2.2
matplotlib==3.6.0
rich==12.5.1
scikit-learn==1.1.2
requests==2.28.1

3.1 データセットの準備

3.1.1 ラベルデータの準備

ユーザーコメントに基づいてユーザーコメントの項目カテゴリを予測するプロジェクト(分類タスク)のサンプルデータの一部を に提供していますdata/comment_classify

トレーニングを使用するには自定义数据、サンプル データのようなデータセットを構築するだけです。

水果	什么苹果啊,都没有苹果味,怪怪的味道,而且一点都不甜,超级难吃!
书籍	为什么不认真的检查一下, 发这么一本脏脏的书给顾客呢!
酒店	性价比高的酒店,距离地铁近,邻华师大,环境好。
...

各行\tはセパレータで区切られており、前半は标签(label)、後半は です原始输入

3.1.2 バーバライザーの準備

Verbalizer は、「実際のラベル」と「ラベル予測単語」の間のマッピングを定義するために使用されます。

場合によっては、「実際のラベル」を [MASK] として使用して予測すると、意味上の流暢性が十分に得られない可能性があるため、「実際のラベル」に対して特定のマッピングを行います。

例えば:

"日本爆冷2-1战胜德国"是一则[MASK][MASK]新闻。	体育

この文のラベルは「スポーツ」ですが、ラベルを「サッカー」に設定すると、より予測しやすくなります。

したがって、ラベル「スポーツ」に対して多くのサブラベルを構築できます。推論する場合は、次のようにサブラベルを予測し、最終的に実際のラベルを推論するだけで済みます。

体育 -> 足球,篮球,网球,棒球,乒乓,体育
...

サンプル データの一部は、 のプロジェクトで提供されていますdata/comment_classify/verbalizer.txt

トレーニングを使用するには自定义数据、サンプル データのようなデータセットを構築するだけです。

电脑	电脑
水果	水果
平板	平板
衣服	衣服
酒店	酒店
洗浴	洗浴
书籍	书籍
蒙牛	蒙牛
手机	手机

この例では 1 対 1 言語化ツールを使用していますが、1 対多のマッピングを定義したい場合は、次のように で区切るだけで済みます','

...
水果	苹果,香蕉,橘子
...

3.2 モデルのトレーニング

train.shトレーニング スクリプト内の対応するパラメーターを変更して、モデルのトレーニングを開始します。

python p_tuning.py \
    --model "bert-base-chinese" \               # backbone
    --train_path "data/comment_classify/train.txt" \
    --dev_path "data/comment_classify/dev.txt" \
    --verbalizer "data/comment_classify/verbalizer.txt" \ # verbalizer存放地址
    --save_dir "checkpoints/comment_classify/" \
    --img_log_dir "logs/comment_classify" \     # loss曲线图存放地址
    --img_log_name "BERT" \                     # loss曲线图文件名
    --batch_size 16 \
    --max_seq_len 128 \
    --valid_steps 20  \
    --logging_steps 5 \
    --num_train_epochs 50 \
    --max_label_len 2 \                         # 标签最大长度
    --p_embedding_num 15 \                      # p_token长度
    --device "cuda:0"                           # 指定使用哪块gpu

トレーニングが正しく開始されると、ターミナルは次の情報を出力します。

...
global step 5, epoch: 1, loss: 6.50529, speed: 4.25 step/s
global step 10, epoch: 2, loss: 4.77712, speed: 6.36 step/s
global step 15, epoch: 3, loss: 3.55371, speed: 6.19 step/s
global step 20, epoch: 4, loss: 2.71686, speed: 6.38 step/s
Evaluation precision: 0.70000, recall: 0.69000, F1: 0.69000
best F1 performence has been updated: 0.00000 --> 0.69000
global step 25, epoch: 6, loss: 2.20488, speed: 6.21 step/s
global step 30, epoch: 7, loss: 1.84836, speed: 6.22 step/s
global step 35, epoch: 8, loss: 1.58520, speed: 6.22 step/s
global step 40, epoch: 9, loss: 1.38746, speed: 6.27 step/s
Evaluation precision: 0.75000, recall: 0.75000, F1: 0.75000
best F1 performence has been updated: 0.69000 --> 0.75000
global step 45, epoch: 11, loss: 1.23437, speed: 6.14 step/s
global step 50, epoch: 12, loss: 1.11103, speed: 6.16 step/s
...

logs/sentiment_classificationトレーニング曲線グラフは次のファイルに保存されます。

3.3 モデル予測

モデルのトレーニングが完了したら、inference.pyトレーニングされたモデルをロードして適用するために実行します。

...
contents = [
    "苹果卖相很好,而且很甜,很喜欢这个苹果,下次还会支持的", 
    "这破笔记本速度太慢了,卡的不要不要的"
]   # 自定义评论
res = inference(contents)       # 推测评论类型
...

推論プログラムを実行します。

python inference.py

次の推論結果が得られます。

inference label(s): ['水果', '电脑']

参考リンク:https://github.com/HarderThenHarder/transformers_tasks/blob/main/prompt_tasks/p-tuning

さらに質の高いコンテンツについては、公式アカウント「Ting、人工知能」に注目してください。一部の関連リソースと質の高い記事が無料で提供されます。

おすすめ

転載: blog.csdn.net/sinat_39620217/article/details/132416452