こんにちにゃんです。
水色桜(みずいろさくら)です。
今回は現状日本語モデルで最大規模を誇る言語モデルdeberta-v2-base-japaneseをファインチューニングして、CommonsenseQA(常識を問う選択式の質問)タスクを解いてみようと思います。
作成したモデルはこちらのサイト(Hugging Face)で配布しています。
初心者でも簡単に使えるようにしているのでぜひ使ってみてください。
環境
pandas 1.4.4
numpy 1.23.4
torch 1.12.1
transformer 4.24.0
Python 3.9.13
deberta-v2-base-japaneseとは?
日本語Wikipedeia(3.2GB)および、cc100(85GB)、oscar(54GB)を用いて訓練されたモデルです。京都大学黒橋研究室が公表されました。
データセット
今回、デーアセットはyahoo japanさんが公開しているJGLUEのうち、JCommonsenseQAを用いました。
このデータセットは下記の例のように、質問文と5つの選択肢、回答が含まれているデータセットです。
このデータセットを用いることで、常識を問う選択式の質問に応答できるようになります。
{"q_id": 8939, "question": "電子機器で使用される最も主要な電子回路基板の事をなんと言う?", "choice0": "掲示板", "choice1": "パソコン", "choice2": "マザーボード", "choice3": "ハードディスク", "choice4": "まな板", "label": 2}
{"q_id": 8940, "question": "田んぼが広がる風景を何という?", "choice0": "畑", "choice1": "海", "choice2": "田園", "choice3": "地方", "choice4": "牧場", "label": 2}
{"q_id": 8941, "question": "しゃがんだりする様を何という?", "choice0": "腰を下す", "choice1": "座る", "choice2": "仮眠を取る", "choice3": "寝る", "choice4": "起きる", "label": 0}
作成したモデルの精度
79.80339588918764
(参考BERT : 72.0, XLM RoBERTa base : 68.7, LUKE : 80.1)
学習
下記の記事と同様の方法でファインチューニングを行いました。
詳しくは下記記事をご覧ください。
デモ(サンプルコード)
サンプルコードを以下に示します。
コピペして使ってみてください。
from transformers import AutoTokenizer, AutoModelForMultipleChoice
import torch
import numpy as np
# modelのロード
tokenizer = AutoTokenizer.from_pretrained('Mizuiro-sakura/deberta-v2-japanese-base-finetuned-commonsenseqa')
model = AutoModelForMultipleChoice.from_pretrained('Mizuiro-sakura/deberta-v2-japanese-base-finetuned-commonsenseqa')
# 質問と選択肢の代入
question = '電子機器で使用される最も主要な電子回路基板の事をなんと言う?'
choice1 = '掲示板'
choice2 = 'パソコン'
choice3 = 'マザーボード'
choice4 = 'ハードディスク'
choice5 = 'まな板'
# トークン化(エンコーディング・形態素解析)する
token = tokenizer([question,question,question,question,question],[choice1,choice2,choice3,choice4,choice5],return_tensors='pt',padding=True)
leng=len(token['input_ids'][0])
# modelに入力するための下準備
X1 = np.empty(shape=(1, 5, leng))
X2 = np.empty(shape=(1, 5, leng))
X1[0, :, :] = token['input_ids']
X2[0, :, :] = token['attention_mask']
# modelにトークンを入力する
results = model(torch.tensor(X1).to(torch.int64),torch.tensor(X2).to(torch.int64))
# 最も高い値のインデックスを取得する
max_result=torch.argmax(results.logits)
print(max_result)
終わりに
今回はdeberta-v2-base-japaneseをファインチューニングしてCommonsenseQAタスクを解く方法について書いてきました。
ぜひ皆さんも使ってみてください。
では、ばいにゃん~。
謝辞
モデルを公開してくださった、京都大学黒橋研究室には感謝いたします。