内部の仕組みを明らかにする:BERTのアテンションメカニズムの深い探求
内部の仕組みを解き明かす:BERTのアテンションメカニズムの深い探求
イントロダクション
BERT(Bidirectional Encoder Representations from Transformers)は、トランスフォーマーモデルと教師なし事前学習を活用した自然言語処理のためのシステムです。事前学習を行うことで、BERTはマスクされた言語モデリングと文予測の2つの教師なしタスクを通じて学習を行います。これにより、BERTはゼロからではなく、特定のタスクに適応することが可能になります。基本的に、BERTは言語を理解するためのユニークなモデルを使用した事前学習されたシステムであり、多様なタスクへの適用を容易にします。この記事では、BERTのアテンションメカニズムとその動作について理解しましょう。
さらに読む:BERTとは?ここをクリック!
学習目標
- BERTのアテンションメカニズムを理解する
- BERTにおけるトークン化の方法
- BERTにおけるアテンションの重みの計算方法
- BERTモデルのPython実装
この記事はデータサイエンスブログマラソンの一環として公開されました。
BERTのアテンションメカニズム
まず、アテンションとは、モデルが文の重要な入力特徴により大きな重みを置く方法の一つです。
以下の例を考えて、アテンションがどのように基本的に機能するかを理解しましょう。
例1
上記の文では、BERTモデルは次の単語「fell」の予測にとって、「cat」と動詞「jumped」により重みを置くことが重要であると判断するかもしれません。「cat」がどこからジャンプしたかを知るよりも、「cat」と「jumped」を知ることが重要です。
例2
次の文を考えてみましょう。
「spaghetti」という単語を予測するために、アテンションメカニズムはスパゲッティの品質「bland」よりも動詞「eating」により重みを大きくすることを可能にします。
例3
同様に、以下のような翻訳タスクにおいて:
入力文: How was your day
目標文: Comment se passe ta journée
出力フレーズの各単語に対して、アテンションメカニズムは入力文から重要で関連がある単語をマッピングし、これらの単語により大きな重みを与えます。上のイメージでは、フランス語の単語「Comment」が単語「How」に最も重みを与えていること、および「journee」の単語に対しては、入力単語「day」が最も重みを受けていることに注意してください。これがアテンションメカニズムが、関連する予測のためにより重要な単語により大きな重みを置くことにより、より高い出力精度を達成するのに役立つ方法です。
気になるのは、モデルが異なる入力単語に異なる重みを与える方法です。次のセクションで、アテンションの重みがこのメカニズムを具体的にどのように実現するのかを見てみましょう。
合成表現のためのアテンションの重み
BERTは、シーケンスを処理するために注意重みを使用します。3つの要素を持つベクトルからなるシーケンスXを考えます。注意関数は、Xを同じ長さの新しいシーケンスYに変換します。各Yベクトルは、Xベクトルの重み付き平均であり、重みは注意重みと呼ばれます。これらの重みは、Xの単語埋め込みに適用され、Yの合成埋め込みを生成します。
Yの各ベクトルの計算は、対応するYベクトルを生成するために必要な入力特徴の注意度に応じて、x1、x2、およびx3に割り当てられた異なる注意重みに依存します。数学的に言えば、以下のようになります。
上記の方程式では、0.4、0.3、および0.2の値は、y1、y2、およびy3の合成埋め込みを計算するためにx1、x2、およびx3に割り当てられる異なる注意重みです。x1、x2、およびx3に割り当てられる注意重みは、y1、y2、およびy3の合成埋め込みを計算するために完全に異なります。
注意は、個々の単語を理解するだけでなく、文脈内で異なる単語の関連性を理解するために文の文脈を理解する上で重要です。たとえば、次の文の次の単語を予測しようとする言語モデルの場合
「The restless cat was ___」
モデルは、不安定な猫の概念を理解するだけでなく、不安定または猫の概念を個別に理解する必要があります。不安定な猫はよくジャンプするので、ジャンプが文中の次の単語として適切な場合があります。
重要なポイントとクエリベクトルによる重み付け
これまでに、注意の重みが入力単語の合成表現を与えるのに役立つことを知りました。ただし、その次の質問は、これらの注意の重みがどこから来るのかです。注意の重みは、キーおよびクエリベクトルとして知られる2つのベクトルから取得されます。
BERTは、関連性に基づいて各単語ペアにスコアを割り当てる関数を使用して、単語のペア間の注意を測定します。互換性を評価するために、クエリベクトルとキーベクトルを単語埋め込みとして使用します。たとえば、「ジャンピング」と「猫」との間のスコアは、’ジャンピング’のクエリベクトル(q1)と’猫’のキーベクトル(k2)の内積で計算されます – q1*k2。
互換性スコアを有効な注意重みに変換するには、正規化する必要があります。BERTはこれを行うために、これらのスコアにsoftmax関数を適用し、それらが正の値であり、合計が1になるようにします。結果として得られる値は、各単語の最終的な注意の重みです。注目すべきは、キーとクエリベクトルが前の層の出力から動的に計算されるため、BERTは特定の文脈に応じて注意メカニズムを調整することができることです。
BERTのアテンションヘッド
BERTは、複数のアテンションメカニズム(ヘッド)を学習します。これらのヘッドは同時に協調して動作します。複数のヘッドを持つことで、BERTは1つのヘッドしか持たない場合よりも単語間の関係をより良く理解できます。
BERTは、クエリ、キー、および値のパラメータをN分割します。これらのNペアはそれぞれ別々のヘッドを通過し、アテンションの計算を行います。これらのペアの結果は、最終的なアテンションスコアを生成するために組み合わされます。これが「マルチヘッドアテンション」と呼ばれる理由であり、各単語の複数の関係性とニュアンスを捉えるためのBERTの能力を向上させます。
BERTは、複数のアテンションレイヤーを積み重ねます。各レイヤーは前のレイヤーの出力に対してアテンションを払います。これを何度も繰り返すことによって、BERTはモデルが深くなるにつれて非常に詳細な表現を作成することができます。
特定のBERTモデルによって、アテンションのレイヤーは12または24層あり、各レイヤーには12または16のアテンションヘッドがあります。これは、単一のBERTモデルが最大で384の異なるアテンションメカニズムを持つことを意味します。なぜなら、重みはレイヤー間で共有されないからです。
BERTモデルのPython実装
ステップ1. 必要なライブラリをインポートする
PyTorchを使用するために、Pythonのライブラリ「torch」をインポートする必要があります。transformersライブラリからBertTokenizerとBertForSequenceClassificationをインポートする必要もあります。トークナイザーライブラリはテキストのトークナイズを可能にするのに役立ち、BertForSequenceClassificationはテキスト分類に使用されます。
import torchfrom transformers import BertTokenizer, BertForSequenceClassification
ステップ2. 事前学習済みのBERTモデルとトークナイザーをロードする
このステップでは、「bert-base-uncased」という事前学習済みモデルをロードし、BertForSequenceClassificationのfrom_pretrainedメソッドに渡します。ここでは、シンプルな感情分類を行いたいので、num_labelsを2と設定しています。これは「ポジティブクラス」と「ネガティブクラス」を表します。
model_name = 'bert-base-uncased'tokenizer = BertTokenizer.from_pretrained(model_name)model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)
ステップ3. GPUが利用可能な場合はデバイスをGPUに設定する
このステップは、デバイスをGPUに切り替えるか、CPUに維持するためのものです。
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model.to(device)#import csv
ステップ4. 入力テキストを定義し、トークナイズする
このステップでは、分類を行いたい入力テキストを定義します。また、テキストをトークンのシーケンスに変換する役割を担うトークナイザーオブジェクトを定義します。トークンは機械学習モデルが理解できる情報の基本単位です。 ‘max_length’パラメータは、トークン化されたシーケンスの最大長を設定します。トークン化されたシーケンスがこの長さを超える場合、システムはそれを切り詰めます。 ‘padding’パラメータは、トークン化されたシーケンスが最大長に達するまでゼロでパディングされることを指示します。パラメータ “truncation” は、トークン化されたシーケンスが最大長を超える場合に、そのシーケンスを切り詰めるかどうかを示します。
このパラメータがTrueに設定されているため、必要に応じてシーケンスは切り詰められます。 “return_tensors”パラメータは、トークン化されたシーケンスを返す形式を指定します。この場合、関数はシーケンスをPyTorchテンソルとして返します。次に、生成されたトークンの ‘input_ids’ と ‘attention_mask’ を指定したデバイスに移動します。先に議論したアテンションマスクは、特定の予測タスクに対してより注意を払うべき入力シーケンスのどの部分を示すバイナリテンソルです。
text = "この映画はあまり楽しめませんでした。素晴らしかったです!"#入力テキストをトークン化するtokens = tokenizer.encode_plus( text, max_length=128, padding='max_length', truncation=True, return_tensors='pt')# 入力テンソルをデバイスに移動するinput_ids = tokens['input_ids'].to(device)attention_mask = tokens['attention_mask'].to(device)#import csv
ステップ5. 感情予測を行う
次のステップでは、モデルは与えられたinput_idsおよびattention_maskに対する予測を生成します。
with torch.no_grad(): outputs = model(input_ids, attention_mask)predicted_label = torch.argmax(outputs.logits, dim=1).item()sentiment = 'positive' if predicted_label == 1 else 'negative'print(f"入力テキストの感情は {sentiment} です。")#import csv
出力
入力テキストの感情はポジティブです。
結論
この記事では、BERTのアテンションについて、文の文脈と単語の関係を理解する上での重要性を強調しました。アテンションの重みによって、入力単語の複合的な表現が重み付け平均を通じて与えられます。この重みの計算には、キーとクエリのベクトルが関与します。BERTは、これらのベクトルのドット積を取ることによって、2つの単語間の互換性スコアを決定します。このプロセスはBERTの「ヘッド」と呼ばれ、単語に焦点を当てるための方法です。複数のアテンションヘッドはBERTの単語の関係の理解を向上させます。最後に、事前学習済みBERTモデルのPython実装について調べました。
要点
- BERTは2つの重要なNLPの進化であるトランスフォーマーアーキテクチャと教師なし事前学習に基づいています。
- それは「アテンション」を使用して、文章の中で関連する入力特徴を優先させ、単語の関係や文脈を理解するのに役立ちます。
- アテンションの重みは、複合表現のために入力の重み付き平均を計算します。複数のアテンションヘッドとレイヤーの使用により、BERTは前のレイヤーの出力に重点を置いて詳細な単語表現を作成できます。
よくある質問
この記事に表示されるメディアはAnalytics Vidhyaの所有ではなく、著者の裁量で使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles