このシリーズでは、自然言語処理において主流であるTransformerを中心に、環境構築から学習の方法までまとめます。
今回の記事ではHuggingface Transformersの入門として、livedoor ニュース記事のデータセットによる文章分類モデルの推論の判断根拠を可視化する方法を紹介します。
Google colabを使用して、簡単に最新の自然言語処理モデルを実装することができますので、ぜひ最後までご覧ください。
【前回】
今回の内容
・学習と推論(前回までの内容)
・推論結果の可視化手法
・推論結果の出力
・LIMEによる可視化の実装
学習と推論(前回までの内容)
学習データの準備
文章分類問題のデータセットとして有名なlivedoor ニュース記事による分類モデルの作成を行いました。
(livedoor ニュースコーパス(https://www.rondhuit.com/download.html)より引用)
それぞれのニュース記事のタイトルから分類の学習を行います。
詳細は前回の記事で紹介していますので、合わせてご覧ください。
学習
用意したデータセットをもとにファインチューニングを実装し、モデルを保存しました。
推論
上記で作成したモデルで推論を実装しました。
推論結果の可視化手法
XAI、または説明可能な人工知能は、意思決定プロセスの説明を提供できる AI システムを設計および開発するためのアプローチです。これは、透明性があり、解釈可能で、信頼できる AI システムを作成する必要性に駆り立てられて、AI の分野で急速に成長している研究開発分野です。
XAI の必要性は、ディープ ラーニング ニューラル ネットワークなどの多くの高度な AI システムが複雑で不透明であり、意思決定にどのように到達するかを理解することが困難であるという事実から生じます。この透明性と解釈可能性の欠如は、特に医療、金融、セキュリティなどのリスクの高いアプリケーションでは、採用の障壁となる可能性があります。
XAI は、AI システムが意思決定プロセスを人間が理解できる方法で説明できるようにする方法と技術を開発することで、この問題に対処しようとしています。これには、より解釈しやすいアルゴリズムとモデルの設計、および人間がこれらのモデルの出力を理解するのに役立つ視覚化ツールやその他の手法の開発が含まれます。
XAI で使用される主要な手法には、ルールベースのシステム、デシジョン ツリー、モデルに依存しないアプローチ (LIME や SHAP など) が含まれます。これらは、モデルの内部動作に関する洞察を提供することを目的としています。さらに、研究者は、自然言語生成を使用して、人間が理解できる AI の決定の説明を作成することを検討しています。
LIMEとSHAP
LIME (Local Interpretable Model-Agnostic Explanations) は、機械学習モデルによって行われた個々の予測に対してローカルな説明を提供する、一般的な XAI メソッドの 1 つです。LIME は、特定のインスタンスの解釈可能なモデルを生成します。これは、そのインスタンスの近傍で元のモデルの動作を近似します。次に、このローカル モデルを使用して、予測にとって最も重要な特徴の観点から、そのインスタンスの予測を説明できます。
SHAP (SHApley Additive exPlanations) は、機械学習モデルの動作を包括的に説明するもう 1 つの XAI メソッドです。SHAP は、ゲーム理論の概念を使用して各機能に数値を割り当て、その機能が特定の入力に対するモデルの出力にどの程度寄与しているかを示します。これらの特徴属性は、入力空間全体でのモデルの動作を説明するために使用できます。また、モデル全体の最も重要な特徴を特定するために集約することもできます。
LIME と SHAP はどちらもモデルに依存しないため、アーキテクチャやトレーニング アルゴリズムに関係なく、あらゆるタイプの機械学習モデルに適用できます。これらは、画像分類、自然言語処理、レコメンデーション システムなど、幅広いアプリケーションの説明に使用できます。LIME や SHAP などの XAI メソッドは、機械学習モデルによって下された決定について説明を提供することで、これらのモデルに対する信頼を構築し、実際のアプリケーションでの安全で責任ある展開を可能にするのに役立ちます。
LIME
LIME (Local Interpretable Model-Agnostic Explanations) は、深層学習分類モデルの内部動作に関する洞察を提供するために使用される視覚化手法です。LIME の目標は、予測を行う際にモデルが使用する最も重要な機能を強調することによって、モデルの予測を説明することです。
LIME は、特定の入力の予測を説明するために使用されるインスタンス レベルでモデルの局所近似を作成することによって機能します。近似値は、入力データを摂動して合成データを生成することによって生成されます。合成データは、より単純で解釈可能なモデルのトレーニングに使用されます。この単純なモデルを使用して、元の深層学習モデルによって行われた予測を説明できます。
LIME は、モデルの予測に最も大きな影響を与える機能を強調する機能重要度チャートを生成します。このチャートは、モデルの出力を決定する上で、入力データのどの側面が最も重要であるかを特定するのに役立ちます。LIME は、予測に最も影響を与えた入力領域を強調表示することで、モデルが予測に到達した方法を視覚的に説明することもできます。
推論結果の出力
準備
ここからはGoogle colabを使用して実装していきます。
今回紹介するコードは以下のボタンからコピーして使用していただくことも可能です。
Googleドライブをマウントして、作業フォルダを作成します。
from google.colab import drive
drive.mount('/content/drive')
%cd '/content/drive/My Drive/huggingface_transformers_demo/transformers/'
必要なライブラリをインストールします。
!pip install transformers fugashi ipadic lime
前回学習したモデルの読み込み
まずは前回保存したモデルを読み込みます。
※モデルの作成は前回の記事をご覧ください。
import torch
import pandas as pd
import numpy as np
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# トークナイザの取得
tokenizer = AutoTokenizer.from_pretrained('./text/news_model')
# モデルの取得
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = (AutoModelForSequenceClassification
.from_pretrained('./text/news_model')
.to(device))
前回までに作成したデータセットを読み込みます。
# テストデータの取得
test_df = pd.read_csv("./text/news_test.csv",encoding='UTF-8')
推論結果を返す関数を定義します。
def predictor(sample_text):
inputs = tokenizer(sample_text,
return_tensors="pt",
add_special_tokens=True,
padding="max_length",
max_length=512,
truncation = True)
model.eval()
with torch.no_grad():
outputs = model(inputs["input_ids"].to(device), inputs["attention_mask"].to(device))
probas = torch.nn.functional.softmax(outputs.logits,dim=1).cpu().detach().numpy()
return probas
LIMEによる可視化の実装
class_namesを定義します。
# ニュース分類
class_names = [
'dokujo-tsushin',
'it-life-hack',
'smax',
'sports-watch',
'kaden-channel',
'movie-enter',
'topic-news',
'livedoor-homme',
'peachy'
]
テストデータセットからテキストと正解ラベルを取得して、結果を表示してみます。
# テストデータセットからテキストと正解ラベルを取得
text = test_df['sentence'][14]
label = test_df['label'][14]
# LIME入力用
texts = []
texts.append(text)
output = predictor(texts)
print(output)
print("予測", class_names[np.argmax(output)])
print("正解", class_names[label])
実行すると、以下のような結果が出力されます。
[[9.9903959e-01 7.3890129e-05 6.7874738e-05 8.1032791e-05 1.6462583e-04
5.8869515e-05 3.1493956e-04 1.1182066e-04 8.7406777e-05]]
予測 dokujo-tsushin
正解 dokujo-tsushin
結果を可視化
LIMEによる可視化を実装します。
explainer = LimeTextExplainer(class_names=class_names)
# 予測確率が高いTOP-K
exp = explainer.explain_instance(text, predictor, num_features=10, num_samples=70, top_labels=5)
exp.show_in_notebook(text=text)
# 結果を保存する
exp.save_to_file('explain.html')
分類結果を可視化することができました。
まとめ
最後までご覧いただきありがとうございました。
今回の記事ではHuggingface Transformersの入門として、livedoor ニュース記事のデータセットによる文章分類モデル推論結果の可視化手法を紹介しました。