BERT改良版であるRoBERTaの日本語モデルを利用する

BERT改良版であるRoBERTaの日本語モデルを利用する データ分析

この記事では、RoBERTaの日本語モデルを利用する方法を解説しています。

本記事の内容

  • RoBERTa日本語モデルの利用に必要なモノ
  • RoBERTa日本語モデル
  • Transformers
  • SentencePiece
  • RoBERTa日本語モデルの動作確認

それでは、上記に沿って解説していきます。

RoBERTa日本語モデルの利用に必要なモノ

BERTは、自然言語処理における革命児と言われることがあります。
そして、そのBETRを改良したモノがRoBERTaになります。

専門的なことは、他の記事などで調べてください。
この記事では、RoBERTaを日本語で利用することがゴールと言えます。

利用するためには、様々な方法が存在します。
おそらく、その中でもかなり簡単な方法になるでしょう。

そのために必要となるのは、以下。

  • RoBERTa日本語モデル
  • Transformers
  • SentencePiece

もちろん、大前提としてPythonを動かす環境は必要となります。
個人的には、PyCharmが現状では最高なIDEだと評価しています。

上記で挙げた必要なモノを下記で説明していきます。

RoBERTa日本語モデル

RoBERTaの日本語モデルは、複数存在しています。
ここでは、rinna社が開発したRoBERTaの日本語モデルを取り上げます。

japanese-roberta-base
https://huggingface.co/rinna/japanese-roberta-base

rinna社のサイトでは、次のように記載されています。

rinna社は、マイクロソフトのAI&リサーチ部門でAIキャラクターの研究開発を行っていたチームが スピンアウトして設立したAI開発会社です。2020年6月に、東京 渋谷で創業しました。

2021年になって、rinna社はGPT-2用の日本語モデルも公開しています。

日本語の自然言語処理では、 rinna社はその存在感を増しています。
その意味では、RoBERTa日本語モデルは安心して使い続けることができそうです。

そして、簡単に利用できます。
そのためには、Transformersが必要となります。

Transformers

Transformersについては、次の記事で説明しています。

上記を参考にして、Transformersのインストールを行います。
また、機械学習のフレームワークにはPyTorchをおススメします。
そのことも、上記記事内で説明しています。

あと、RoBERTa日本語モデルはSentencePieceをトークナイザーとして利用しています。

そのため、RoBERTa日本語モデルの利用の際にもSentencePieceが必要となります。

SentencePiece

SentencePieceについては、次の記事で解説しています。

上記を参考にして、SentencePieceのインストールを行います。
これで、TransformersとSentencePieceをインストールした状態のはずです。

この時点で、インストール済みのパッケージを確認しておきます。

>pip list 
Package            Version 
------------------ ------------ 
certifi            2021.5.30 
charset-normalizer 2.0.4 
click              8.0.1 
colorama           0.4.4 
filelock           3.0.12 
huggingface-hub    0.0.12 
idna               3.2 
joblib             1.0.1 
numpy              1.21.2 
packaging          21.0 
Pillow             8.3.1 
pip                21.2.4 
pyparsing          2.4.7 
PyYAML             5.4.1 
regex              2021.8.21 
requests           2.26.0 
sacremoses         0.0.45 
sentencepiece      0.1.96 
setuptools         57.4.0 
six                1.16.0 
tokenizers         0.10.3 
torch              1.9.0+cu111 
torchaudio         0.9.0 
torchvision        0.10.0+cu111 
tqdm               4.62.2 
transformers       4.9.2 
typing-extensions  3.10.0.0 
urllib3            1.26.6

Transformersで必要となる機械学習フレームワークは、PyTorchをインストール済みです。
正確に言うと、GPU版のPyTorchになります。

PyTorchのインストールは、次の記事で解説しています。

以上、これでRoBERTa日本語モデルを動かす準備が整いました。
次は、RoBERTa日本語モデルの動作確認を行います。

RoBERTa日本語モデルの動作確認

モデルの利用に関して、注意書きがあります。

注1:[CLS]の使用 マスクされたトークンを予測するには、モデルの学習時に使用される[CLS]トークンを文の前に追加して、モデルが正しくエンコードするようにしてください。
注2:トークン化後に[MASK]を使用する場合 A) 入力文字列に直接[MASK]を入力した場合と、B) トークン化後にトークンを[MASK]に置き換えた場合では、トークンの配列が異なるため、予測結果も異なります。トークン化の後に[MASK]を使用するのがより適切です(モデルの事前学習方法と一致しているため)。しかし、Huggingface Inference APIは入力文字列に[MASK]をタイプすることしかサポートしておらず、よりロバスト性の低い予測結果を生成します。

動作確認は、以下のコードで行います。
上記の注意書きに関する部分に、【注1】【注2】(コメント)を記載。

import torch 
from transformers import T5Tokenizer, RobertaForMaskedLM 
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-roberta-base") 
tokenizer.do_lower_case = True  # due to some bug of tokenizer config loading 
model = RobertaForMaskedLM.from_pretrained("rinna/japanese-roberta-base") 
# original text 
text = "子供にとって、ゲームは害になるのか?" 

# prepend [CLS] 【注1】
text = "[CLS]" + text 
# tokenize 
tokens = tokenizer.tokenize(text) 
print(tokens) 
# mask a token 【注2】
masked_idx = 5 
tokens[masked_idx] = tokenizer.mask_token 
print(tokens) 
# convert to ids 
token_ids = tokenizer.convert_tokens_to_ids(tokens) 
print(token_ids) 
#exit() 
# convert to tensor 
token_tensor = torch.tensor([token_ids]) 
# get the top 10 predictions of the masked token 
model = model.eval() 
with torch.no_grad(): 
    outputs = model(token_tensor) 
    predictions = outputs[0][0, masked_idx].topk(10) 
for i, index_t in enumerate(predictions.indices): 
    index = index_t.item() 
    token = tokenizer.convert_ids_to_tokens([index])[0] 
    print(i, token)

上記を実行した結果は、以下。

['[CLS]', '▁', '子供', 'にとって', '、', 'ゲーム', 'は', '害', 'になる', 'のか', '?'] 
['[CLS]', '▁', '子供', 'にとって', '、', '[MASK]', 'は', '害', 'になる', 'のか', '?'] 
[4, 9, 2038, 1522, 7, 6, 11, 5596, 367, 1974, 3017] 
0 アルコール 
1 チョコレート 
2 インターネット 
3 ゲーム 
4 ストレス 
5 タバコ 
6 ギャンブル 
7 おもちゃ 
8 スポーツ 
9 いじめ

結果を見ればわかりますが、「ゲーム」をマスクしています。
「ゲーム」部分に10個のワードが、候補として挙げられています。

これって、日本語の意味を解釈していないとできません。
ここでは、子供にとって「害」になりえるモノだと判定されるワードになりますね。

なお、マスクする位置は以下で指定しています。

# mask a token 【注2】 
masked_idx = 5

「ゲーム」のindex(0スタート)が、5という意味になります。
文章を変更したい場合は、以下を変更します。

# original text 
text = "子供にとって、ゲームは害になるのか?"

同時に、「masked_idx」も変更する必要があります。

以上、RoBERTa日本語モデルの動作確認について説明しました。

タイトルとURLをコピーしました