自然言語処理モデルBERTの検証(2)-MeCab+WordPiece


[前回] 自然言語処理モデルBERTの検証(1)-予測のお試し

はじめに

前回は、名人から提供されたDockerイメージを実行し、BERTによる予測をさくっと検証しました。
今回は、開発環境を用意し、BERTの実装と予測検証を行ってみます。

開発環境と言っても、Google様から提供されるJupyter notebookクラウド実行環境、
Google Colaboratoryを使用します。
Googleアカウントを持っていれば、無料プランでもPythonによる機械学習を実装できます。

Colabノートブックに、コードを記述し、インタラクティブに実行できます。

検証シナリオ

「一番幸せを感じるのはどんな時か」を予測してみましょう。

東北大学 乾・鈴木研究室から公開された学習済みモデルを使用します。
https://github.com/cl-tohoku/bert-japanese
トークナイザーは、日本語形態素解析器MecabとWordPieceが使用されています。

検証開始

Colabノートブックに、下記コマンドを入力し、実行します。

MeCabのPythonラッパーをインストール

! pip install mecab-python3

transformersライブラリをインストール

! pip install transformers

MeCabを容易に利用するためMecabのPythonラッパーfugashiをインストール

! pip install fugashi

IPA辞書をインストール

! pip install ipadic

学習済みモデルをインポート

import torch
from transformers import BertJapaneseTokenizer
from transformers import BertForMaskedLM

tokenizerのインスタンスを作成

tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')

modelのインスタンスを作成

model = BertForMaskedLM.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')

トークナイザーで、入力文をtoken idの配列に変換
肝は、mask_tokenでマスキングされている予測対象のトークンです。

in_ids = tokenizer.encode(f'''一番幸せを感じるのは{tokenizer.mask_token}をする時だ。''', return_tensors='pt')
print(in_ids)

すると、token idの配列が表示される

tensor([[    2,  4749, 13215,    11, 11486,     5,     9,     4,    11,    34,
            72,    75,     8,     3]])

token idの配列を対応する語彙に変換

print(tokenizer.convert_ids_to_tokens(in_ids[0].tolist()))

出力結果

['[CLS]', '一番', '幸せ', 'を', '感じる', 'の', 'は', '[MASK]', 'を', 'する', '時', 'だ', '。', '[SEP]']

マスキングされたトークンのインデックスを取得

mask_idx = torch.where(in_ids == tokenizer.mask_token_id)[1].tolist()[0]
print(mask_idx)

結果は、

7

モデルを実行し、結果を出力

result = model(in_ids)
predicts = result[0][:, mask_idx].topk(5).indices.tolist()[0]
for predict in predicts:
    out_ids = in_ids.tolist()[0]
    out_ids[mask_idx] = predict
    print(tokenizer.decode(out_ids))

気になっていた予測結果が出ました

[CLS] 一番 幸せ を 感じる の は 仕事 を する 時 だ 。 [SEP]
[CLS] 一番 幸せ を 感じる の は キス を する 時 だ 。 [SEP]
[CLS] 一番 幸せ を 感じる の は 恋 を する 時 だ 。 [SEP]
[CLS] 一番 幸せ を 感じる の は 食事 を する 時 だ 。 [SEP]
[CLS] 一番 幸せ を 感じる の は ゲーム を する 時 だ 。 [SEP]

「仕事」が、幸せの上位になっています。
楽しく、楽して仕事できたらいいですね。

おわりに

Google Colaboratory環境で、トークナイザーとしてMeCab+WordPieceを用いた、
BERTによる予測を行った結果、幸せの答え(?)を得られたようです。
引き続き、機能・性能両面で検証を進めてまいります。
お楽しみに。

[次回] 自然言語処理モデルBERTの検証(3)-GLUEベンチマーク