Transformers(6) - 言語モデル(マスクした単語の予測)

今回は、言語モデルを試してみます。

(Transformersのインストールは完了している想定となります。)

言語モデル

言語モデルは、テキストの自然な単語の並びを予測する処理です。

Transformersライブラリでは、言語モデルを事前に学習しておりその事前学習済みモデルを使ってチューニングを行います。

言語モデルの学習方法には下記のようなものがあります。

  • MLM(Masked Language Modeling)
  • CLM(Causal Language Modeling)

MLM(マスクした単語の予測)

MLMでは、文章内のマスクした単語の予測を学習する手法です。

サンプルコードは次の通りです。

タスク名に‘fill-mask’を指定し、言語モデル(MLM)のパイプラインを作成します。

文章内の予測したい箇所に{nlp.tokenizer.mask_token}を設定するとその位置の単語を予測することができます。

[Google Colaboratory]

1
2
3
4
5
6
7
from transformers import pipeline

# MLMのパイプラインの準備
nlp = pipeline('fill-mask')

# マスク位置の単語を予測
print(nlp(f'Once upon a time there was a young lady and an old {nlp.tokenizer.mask_token}.'))

単語の予測結果として次の情報が出力されます。

  • sequence
    予測した単語を埋め込んだ文章
  • score
    スコア
  • token_str
    予測した単語

[実行結果]

1
2
3
4
5
[{'sequence': 'Once upon a time there was a young lady and an old gentleman.', 'score': 0.49178990721702576, 'token': 22164, 'token_str': ' gentleman'}, 
{'sequence': 'Once upon a time there was a young lady and an old man.', 'score': 0.2817203998565674, 'token': 313, 'token_str': ' man'},
{'sequence': 'Once upon a time there was a young lady and an old boy.', 'score': 0.08439457416534424, 'token': 2143, 'token_str': ' boy'},
{'sequence': 'Once upon a time there was a young lady and an old lady.', 'score': 0.06599652022123337, 'token': 6429, 'token_str': ' lady'},
{'sequence': 'Once upon a time there was a young lady and an old woman.', 'score': 0.01124062854796648, 'token': 693, 'token_str': ' woman'}]

5つの単語が予測されました。

  • スコア 49 [gentleman]
    「a young lady」に対して「an old gentleman」は自然な予測だと思います。
  • スコア 28 [man]
    「a young lady」に対して「an old man」も自然な予測ではないでしょうか。
  • スコア 8 [boy]
    「an old boy」は単語として不自然な感じがします。
  • スコア 6 [lady]
    「a young lady」に対して「an old lady」も老若の女性ということで自然ですね。
  • スコア 1 [woman]
    「a young lady」に対して「an old woman」も特に問題なさそうです。

この程度の文章であれば、問題なくマスクした単語の予測ができることを確認できました。


次回は、トークナイザーを使ってみます。