BERT: ディープ双方向トランスフォーマーの事前トレーニング

著者: 禅とコンピュータープログラミングの芸術

1 はじめに

近年、自然言語処理の分野で大規模な事前学習モデルが広く適用されるようになり、BERT (Bidirectional Encoder Representations from Transformers) が現時点で最良の手法の 1 つであると広く考えられています。これは 2018 年に Google によって提案されました。その中心的なアイデアは、Transformer モデルによってトレーニングされた多層エンコーダー層を使用して入力テキスト シーケンスを表現し、事前トレーニングを通じてモデルが豊富なコンテキスト情報をキャプチャできるようにすることです。同時に、モデルのパフォーマンスを向上させるために 2 つの蒸留戦略も使用されます。この論文では、著者は BERT モデルのコード実装およびその他の拡張機能を分析し、詳細に説明し、サンプルコードを提供します。読者の皆様がこの記事から知識を得て、実務に応用していただければ幸いです。

2. 中心となる概念

変成器

機械学習モデルは、エンコーダーとデコーダーの 2 つの部分に分けることができます。このうち、エンコーダは入力シーケンスを固定次元のベクトル形式に変換する責任を負い、デコーダは生成または推論を通じてシーケンスを復号する、つまり符号化されたベクトルを復元する責任を負います。より強力な表現機能を実現するために、Google チームは新しいアテンション メカニズム Transformer を提案しました。その中心的な考え方は、計算時に単一の要素の関連性だけでなく、文全体または文書全体の関連性も考慮することです。

上の図に示すように、各 Transformer ブロックには 2 つのサブレイヤーが含まれています。最初のレイヤーは位置ベースのフィードフォワード ネットワーク (セルフ アテンション)、2 番目のレイヤーは単純なフィードフォワード ネットワーク (フィードフォワード ネットワーク) です。 )。この構造は、標準 Seq2seq モデルの Encoder-Decoder 構造に似ていますが、RNN や CNN とは異なり、モデルが入力シーケンス全体に直接焦点を当てることができます。したがって、Transformer には大きな利点があります。

バート

BERT モデルは、テキスト分類、感情分析、固有表現認識などを含むさまざまな自然言語処理タスクに使用できる、事前トレーニング済みの Transformers ベースの言語理解モデルです。その主な機能は次のとおりです。

  1. Transformer ベース: BERT は、BERT-base、BERT-large、BERT-xlarge と呼ばれる、Transformer に基づくマルチレイヤー エンコーダーを採用しています。つまり、Transformer アーキテクチャは、さまざまなレイヤー数とサイズの間で最良の結果を実現します。

  2. マスクされた LM を使用した事前トレーニング: BERT はマスクされた言語モデル (MLM) タスクで事前トレーニングされます。つまり、言語モデリングのために入力テキストのごく一部をランダムにマスクします。そうすることで、モデルの堅牢性と堅牢性を向上させることができます。

  3. 2 つの蒸留戦略が採用されています: タスク固有の蒸留 (元のモデルの出力結果を蒸留モデルに蒸留)、教師なしドメイン適応 (ラベルのないデータセットに対して教師あり手法を使用) モデルは転移学習を実行します。

3. コアアルゴリズムの原則と具体的な操作手順

1. 事前トレーニング

データの準備

BERT は英語の Wikipedia (wikipedia corpus) をトレーニング コーパスとして使用します。コーパスには約 25 億のトークンが含まれており、合計は約 3.34 GB になります。

マスクされた言語モデリング (MLM)

MLM タスクは、入力テキストのいくつかの単語をマスクすることによって、マスクされた単語の正しいラベルを予測することを目的としています。以下の図に示すように、「帽子をかぶった猫」を予測すると仮定すると、モデルはマスクされていない単語「猫」と「帽子」を予測する必要があります。この予測タスクの目的は、モデルがより多くのコンテキスト情報を習得できるようにし、それによってモデルのパフォーマンスを向上させることです。

BERT の MLM で採用されている戦略は、いくつかの単語をランダムにマスクすることです。まず、モデルは入力テキストから単語のごく一部 (通常は 15%) をランダムに選択し、それらを特別な [MASK] マーク シンボルに置き換えます。次に、モデルはこれらのマスクされた単語に対応する正しいトークンの生成を試みます。最後に、モデルは予測結果に基づいてモデル パラメーターを調整し、モデルの言語理解能力を強化します。

次の文の予測 (NSP)

次の文の予測タスクは、2 つの隣接するテキストの断片が同じ文に属するかどうかを予測することを目的としています。たとえば、質問応答システムでは、2 つの連続するテキストの断片が同じ文に属しているかどうかをモデルが判断できない場合、あいまいさが発生します。以下の図に示すように、「足の速い茶色のキツネは怠惰な犬を飛び越えます。」と「足の速い茶色の犬は逃げます。」という 2 つのテキスト断片が同じ文に属するかどうかを判断すると仮定すると、モデルは次のことを行う必要があります。それらの間に明確な違いがあるかどうかを判断します。

BERT は、次文予測の事前トレーニングにバイナリ分類タスクを使用します。まず、モデルは入力テキストから連続するテキストセグメントのペアをランダムに抽出し、それらを組み合わせて文グループを作成します。次に、モデルは 2 つのテキストが同じ文に属しているかどうかを判断します。最後に、モデルはバックプロパゲーションを通じてモデル パラメーターを調整し、モデルの言語理解能力を向上させます。

トレーニング前の手順

  1. トークン化: ワードピース アルゴリズムを使用して入力テキストをセグメント化します。

  2. マスキング: 入力テキスト内の一部の単語を [MASK] タグに置き換えます。

  3. セグメント埋め込み: 各文をトークンとセグメント埋め込みに分割します。このうち、トークン埋め込みは単語の意味情報を表現し、セグメント埋め込みは文全体の情報を表現します。

  4. 位置エンコーディング: 位置エンコーディングを導入し、すべての埋め込みに位置情報を追加して、モデルの位置相関を改善します。

  5. トレーニング: タスク固有のモデルを微調整し、抽出してパフォーマンスを向上させます。

2.微調整

BERT の蒸留戦略には、タスク固有の蒸留と教師なしドメイン適応の 2 つのタイプが含まれます。

タスク固有の蒸留

タスク層の蒸留では、最初に元の BERT モデルを使用して事前トレーニングを行い、一般的な言語理解能力を取得します。次に、モデルのパフォーマンスを向上させるために特定のタスクに合わせてモデルを微調整します。具体的には、NLP タスクでは、MNLI データ セットに基づいて蒸留を実行できますが、ここでは説明しません。

監視されていないドメイン適応

教師なしドメイン適応 (UDA) は、クロスドメイン データを活用してソース ドメインのデータ分散に適応することを目的としています。具体的には、まずソース ドメインの BERT モデルを使用して入力テキストを事前トレーニングし、次にターゲット ドメインの教師なしデータを使用してモデルをトレーニングします。ターゲット ドメイン データをテストして、モデルの一般化能力を検証します。

4. 特定のコードの実装

設置環境

!pip install transformers==3.0.2 torch==1.6.0 torchvision==0.7.0 tensorboardX

事前トレーニングされたモデルをロードする

from transformers import BertTokenizer, BertModel, AdamW, get_linear_schedule_with_warmup

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

入力テキストを分割し、パディングを実行します。

text = "Hello, my dog is cute."
marked_text = "[CLS] " + text + " [SEP]"
tokenized_text = tokenizer.tokenize(marked_text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
segments_ids = [1]*len(tokenized_text)

tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])

モデルを使用して予測を行う

outputs = model(tokens_tensor, token_type_ids=segments_tensors)
last_hidden_states = outputs[0]

完全なコードのサンプル

import torch
from transformers import BertTokenizer, BertModel

# Load pre-trained model and tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased', output_attentions=False, output_hidden_states=True)

# Example input sentence
text = "Hello, my dog is cute."

# Convert text to tokens and pad it with zeros up to max length
marked_text = "[CLS] " + text + " [SEP]"
tokenized_text = tokenizer.tokenize(marked_text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
segments_ids = [1]*len(tokenized_text)
input_ids = indexed_tokens + ([0]*(tokenizer.max_length-len(indexed_tokens)))
attn_masks = ([1]*len(indexed_tokens)) + ([0]*(tokenizer.max_length-len(indexed_tokens)))
tokens_tensor = torch.tensor([[input_ids]])
segments_tensors = torch.tensor([[segments_ids]])
attn_mask_tensors = torch.tensor([[attn_masks]])

# Run inference on model
outputs = model(tokens_tensor, token_type_ids=segments_tensors, attention_mask=attn_mask_tensors)[0].squeeze()
predicted_index = int(torch.argmax(outputs[0]))
predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]
print("Predicted token:", predicted_token)

# Check that correct token has high probability score
assert all(outputs[0][int(tokenizer.vocab['cute'])] > outputs[0][int(tokenizer.vocab['not'])])

5. 今後の展開と課題

BERT に関する既存の研究は大きな進歩を遂げました。現在、BERT は多くの自然言語処理タスクで最先端の結果を達成しています。しかし、解決すべき問題はまだたくさんあります。例えば:

  1. 過剰なモデル容量によって引き起こされる過剰なメモリ使用の問題。BERT のモデルのサイズは、レイヤーやサイズによって異なります。BERT モデルのサイズを圧縮する方法はいくつかありますが、それでもこの問題を完全に解決することはできません。

  2. モデルのトレーニング効率が低いという問題。現在、BERT は Transformer ベースのエンコーダ/デコーダ構造を使用しています。これは、計算の複雑さとパラメータの数の点で優れています。ただし、トレーニング プロセス自体も非常に複雑で、多くの場合、数日、場合によっては数週間かかります。したがって、BERT の学習時間をいかに短縮するかが今後の研究の方向性となります。

  3. よりリッチなモデル アーキテクチャの問題。BERT ベースと BERT-large に加えて、他の BERT ベースのモデル アーキテクチャもあります。その中で、BERT のエンコーダーは、GPT-2 の Transformer-XL など、他のタイプのエンコーダーに置き換えることができるため、モデル アーキテクチャをより柔軟に設計できます。さらに、BERT ベースのモデルは、グローバルな特徴を学習できるようにするアテンション メカニズムを追加するなど、さらに変更することができます。

おすすめ

転載: blog.csdn.net/universsky2015/article/details/133566136