BERTを用いた文脈理解の仕組みと文章比較の具体例

こんにちは。ゆうせいです。

前回の記事で解説したEmbeddingは、単語そのものの意味を座標として固定して数値化する技術でした。しかし、人間の言語は同じ単語でも前後の文脈によって意味が変化します。本記事では、文章全体の文脈を読み取る高度な自然言語処理モデルであるBERTの仕組みについて、3つの例文を用いて解説します。

BERTの基本的な概念

BERTは、文章を最初から最後まで双方向から同時に読み込み、文脈を理解する技術です。従来の言語モデルが文章を左から右へ順番に単語を読んでいたのに対し、BERTは文章全体を一度に見渡します。

BERTの処理は、学校の教室にいる複数の生徒の会話を把握する教師の視点に似ています。教師は一人一人の発言を順番に聞くのではなく、誰が誰に対して話しているか、どのような表情をしているかという教室全体の状況を同時に観察して、会話の真意を理解します。BERTも教師の観察と同じように、ある単語が文章中の他のすべての単語とどのような関係を持っているかを計算し、文脈に応じた最適な数値を割り当てます。

BERTの名前の由来

BERTは「Bidirectional Encoder Representations from Transformers」の頭文字を取った略称です。

日本語では「Transformerによる双方向エンコーダ表現」を意味します。また、先行モデル(ELMo)に倣い、セサミストリートのキャラクター名に由来する遊び心も込められています。

3つの文章を用いた文脈解析の具体例

BERTが文章全体の文脈をどのように捉えるのかを理解するために、以下の3つの文章を再度確認します。

文章1:私は猫が好きです。

文章2:私は犬が好きです。

文章3:猫と犬が好きです。

双方向からの文脈の把握

文章1と文章2において、BERTは「猫」や「犬」という単語の前にある「私は」という主語と、後ろにある「が好きです」という述語の両方を確認します。前後の単語からの情報を掛け合わせることで、BERTは文章1の「猫」と文章2の「犬」が、単なる動物の種類を表すだけでなく、話し手が好意を抱いている対象としての役割を担っている事実を正確に理解します。

省略された情報の推論

文章3には「私は」という主語が存在しません。しかし、BERTは「と」という助詞によって「猫」と「犬」が並列の関係にあることを把握し、さらに「が好きです」という述語の存在から、日本語の特性として主語が省略されている状態であると推測します。

文脈を計算した結果、BERTは文章3が文章1および文章2と同じく個人の好みを述べる文章群であることを認識し、表面上の単語構成が異なっていても、3つの文章すべてが非常に近い意味合いを持つという高度な判定を下すことが可能になります。

注意機構を用いた関連性の計算

BERTが文章内の単語同士の関連性を把握する中核技術に、注意機構と呼ばれる仕組みが存在します。注意機構は、特定の単語を理解するために、文章内の他のどの単語に注意を向けるべきかを計算します。

注意機構における関連性の度合いを計算するための基本方程式は以下の通りです。数式内のQは検索条件、Kは照合対象、Vは実際の情報を表す行列であり、単語の重要度を確率として算出します。

Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V

注意機構の計算によって、文章3の「好き」という単語は「猫」と「犬」の両方に強い関連性を持つと判断され、文脈の正確な数値化が実現します。

Pythonを用いたBERTのプログラム構造

BERTの複雑な計算処理をゼロから自作することは非常に困難であるため、今回はトランスフォーマーズという自然言語処理に特化した外部の道具箱を利用します。トランスフォーマーズは、あらかじめ大量の文章を読んで学習を終えた優秀な読解の専門家を、インターネットを経由して自身のプログラムに呼び出す人材派遣サービスのような役割を果たします。

プログラム全体の流れは、文章を専門家が理解できる形式に分割し、専門家に文章全体の文脈を数値のまとまりとして評価させ、最後に算出された数値同士の角度を計算して意味の近さを判定するという手順で進行します。

BERTを実行するPythonコードの具体例

以下のプログラムは、日本語の学習を終えたBERTの専門家を呼び出し、3つの文章の類似度を計算する処理を記述したものです。

import torch
from transformers import BertJapaneseTokenizer, BertModel
from torch.nn.functional import cosine_similarity

# 日本語を理解する専門家(モデル)と、文章を分割する道具(トークナイザー)を準備します
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
model = BertModel.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')

# 比較する3つの文章を定義します
sentences = ["私は猫が好きです。", "私は犬が好きです。", "猫と犬が好きです。"]

# 文章を数値のまとまり(ベクトル)に変換する処理を定義します
def get_sentence_vector(sentence):
    # 文章をBERTが理解できる形式に変換します
    inputs = tokenizer(sentence, return_tensors="pt", padding=True, truncation=True)
    
    # BERTに文章を読み込ませ、文脈を計算させます
    with torch.no_grad():
        outputs = model(**inputs)
        
    # 文章全体の意味を表す先頭の数値を抽出します
    return outputs.last_hidden_state[0][0]

# 3つの文章をそれぞれ数値に変換します
vector1 = get_sentence_vector(sentences[0])
vector2 = get_sentence_vector(sentences[1])
vector3 = get_sentence_vector(sentences[2])

# 変換された数値同士の類似度を計算します
sim1_2 = cosine_similarity(vector1.unsqueeze(0), vector2.unsqueeze(0)).item()
sim1_3 = cosine_similarity(vector1.unsqueeze(0), vector3.unsqueeze(0)).item()

print("文章1と文章2の類似度:", sim1_2)
print("文章1と文章3の類似度:", sim1_3)

<実行結果>

文章1と文章2の類似度: 0.9787610173225403

文章1と文章3の類似度: 0.8476817607879639


プログラムの内部処理の解説

提示したプログラムの中で実行されている重要な処理について解説します。

トークナイザーによる文章の分割

プログラムの冒頭で準備しているトークナイザーとは、入力された日本語の文章をBERTが理解できる最小単位に切り分けるカッターナイフのような道具です。日本語は英語のように単語の区切りに空白がないため、専用の辞書を用いて文章を正確に分割し、分割された単語それぞれに固有の出席番号を割り振る作業を行います。

モデルによる文脈の数値化

分割された文章のデータは、モデルと呼ばれるBERTの本体に渡されます。ここでBERTは文章全体を双方向から読み込み、単語同士の関係性を計算します。計算結果として出力される膨大な数値の中から、文章全体を総括する役割を持つ先頭のデータを抽出することで、文脈を反映した文章の座標データが完成します。

コサイン類似度による意味の比較

抽出された座標データは、コサイン類似度という数学的な指標を用いて比較されます。プログラムの後半部分では、抽出された数値のまとまり同士の角度を計算しています。出力される数値は最大で1となり、計算結果が1に近いほど2つの文章の文脈が似ているという事実を示します。

メリットとデメリット

BERTを用いて文章の文脈を解析する手法についてのメリットとデメリットは以下の通りです。

メリット

  • 単語の並び順や前後の関係性を考慮するため、主語の省略や複雑な言い回しを含む文章であっても正確に意味を捉えることができる。
  • 事前に大量のテキストデータで学習済みのモデルが存在するため、少量の追加データを読み込ませるだけで様々な自然言語処理に応用できる。

デメリット

  • 複雑な注意機構の計算を文章のすべての単語に対して実行するため、処理に要する時間が長くなり、高性能なコンピューターが必要になる。
  • BERTが特定の文脈として解釈した思考プロセスは複雑な行列計算の連続であるため、人間が処理の根拠を読み解くことが困難である。

まとめ

BERTは、文章全体を双方向から読み込み、注意機構を用いて単語同士の関係性を計算することで、人間が文脈を読む感覚に近い高度な文章理解を実現する技術です。

学習のステップとして、まずは公開されているBERTの学習済みモデルをプログラムに組み込み、3つの文章を入力して類似度を算出する処理を実行してみてください。次に、文章の単語を一部隠してBERTに元の単語を予測させる穴埋め問題の処理を実装し、最後に、特定の業務用途に合わせてBERTを追加学習させるファインチューニングの技術を学ぶという順序で進めることをお勧めします。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。