2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIエンジニアへの道 - 18日目:LLMを動かす!Hugging Face Transformersライブラリ入門

Posted at

18日目:LLMを動かす!Hugging Face Transformersライブラリ入門

皆さん、こんにちは!AI学習ロードマップ18日目を迎えました。これまでの3日間で、LLM(大規模言語モデル)の概要、その根幹技術であるTransformer、そして主要なモデルであるBERTとGPTについて学んできました。概念的な理解は深まったことと思います。

今日からは、いよいよこれらの強力なLLMを「実際に動かす」ことに焦点を当てていきます。そのために不可欠なツールが、オープンソースのライブラリ「Hugging Face Transformers」です。このライブラリは、最先端のLLMモデルを簡単に利用・学習できるように設計されており、自然言語処理(NLP)分野のデファクトスタンダードとなっています。

本日は、Hugging Face Transformersライブラリの基本的な使い方、テキスト分類(感情分析)の例を通じて、事前学習済みモデルのロード、推論、そして簡単なファインチューニングの概念までを、Pythonでのコード例とともに詳しく解説していきます。

18日目:LLMを動かす!Hugging Face Transformersライブラリ入門 - visual selection.png


1. Hugging Face Transformersライブラリとは?

Hugging Faceは、AI、特に自然言語処理(NLP)の分野でデファクトスタンダードとなっているオープンソースのプラットフォームです。その中でも「Transformers」ライブラリは、以下の理由から世界中の研究者や開発者に広く利用されています。

  • 豊富なモデル: BERT、GPT、T5、RoBERTa、XLNetなど、最新かつ多様なTransformerベースのモデルが多数提供されています。
  • 簡単な利用: 数行のコードで、事前学習済みモデルをダウンロードし、利用できます。複雑なモデルアーキテクチャを自分で構築する必要はありません。
  • 高い柔軟性: 事前学習済みモデルをそのまま推論に使うだけでなく、特定のタスクに合わせてファインチューニング(微調整)することも容易です。
  • エコシステム: モデルだけでなく、データセット、評価指標、デモアプリケーションなど、NLP開発に必要な様々なツールが提供されています。
  • フレームワーク非依存: TensorFlowとPyTorchの両方で動作し、簡単に切り替えられます。

要するに、Transformersライブラリは、LLMを使ったNLPアプリケーション開発の敷居を大きく下げ、高速なプロトタイピングと開発を可能にする「LLMのツールキット」と言えます。


2. Transformersライブラリの基本的な使い方

Transformersライブラリの主要なコンポーネントは以下の3つです。

  1. AutoTokenizer: テキストをモデルが理解できる数値IDに変換(トークン化)するためのクラス。
  2. AutoModel: 事前学習済みモデルをロードするためのクラス。
  3. Pipeline: 特定のタスク(テキスト分類、質問応答など)を、前処理から推論まで一貫して実行するための高レベルAPI。

まずは、最も手軽にLLMの機能を試せるpipelineから見ていきましょう。

2.1. Pipelineを使ったテキスト分類(感情分析)の例

感情分析(Sentiment Analysis)は、テキストがポジティブ、ネガティブ、中立のいずれかの感情を表現しているかを判定するタスクです。これはテキスト分類の一種です。

# !pip install transformers sentencepiece accelerate # 必要なライブラリのインストール (初回のみ)

from transformers import pipeline

# 感情分析用のパイプラインをロード
# 'sentiment-analysis'タスクを指定すると、適切なモデルが自動的にダウンロードされる
classifier = pipeline('sentiment-analysis')

# テキストを入力して感情を予測
text1 = "I love this movie! It's absolutely fantastic."
result1 = classifier(text1)
print(f"テキスト: '{text1}'")
print(f"感情分析結果: {result1}")
# 出力例: [{'label': 'POSITIVE', 'score': 0.9998}]

text2 = "This product is terrible, I'm very disappointed."
result2 = classifier(text2)
print(f"\nテキスト: '{text2}'")
print(f"感情分析結果: {result2}")
# 出力例: [{'label': 'NEGATIVE', 'score': 0.9997}]

text3 = "The weather today is cloudy."
result3 = classifier(text3)
print(f"\nテキスト: '{text3}'")
print(f"感情分析結果: {result3}")
# 出力例: [{'label': 'NEUTRAL', 'score': 0.99}] (または POSITIVE/NEGATIVE でスコアが低い場合も)

たった数行で、高度な感情分析が実行できましたね!pipelineは非常に便利ですが、内部で何が起こっているかを理解するために、もう少し低レベルな使い方を見ていきましょう。

2.2. AutoTokenizerとAutoModelを使った推論

pipelineの裏側では、AutoTokenizerAutoModelが使われています。これらを直接使うことで、より細かい制御が可能になります。

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

# 事前学習済みモデルの名前を指定
# ここでは、汎用的な感情分析モデルとして 'distilbert-base-uncased-finetuned-sst-2-english' を使用
model_name = "distilbert-base-uncased-finetuned-sst-2-english"

# トークナイザーとモデルをロード
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

# 感情分析したいテキスト
text = "This is an amazing library, I really enjoy using it!"

# 1. テキストをトークン化し、モデルが理解できる形式に変換
# return_tensors='pt' は PyTorch テンソルとして出力することを意味
inputs = tokenizer(text, return_tensors="pt")
print(f"\n--- トークナイザーの出力 (一部) ---")
print(f"入力ID: {inputs['input_ids']}")
print(f"アテンションマスク: {inputs['attention_mask']}")
# input_ids: 各トークンに対応する数値ID
# attention_mask: パディング(長さを揃えるために追加される空白部分)をモデルが無視するためのマスク

# 2. モデルを使って推論
# モデルの出力はロジット (分類前のスコア)
with torch.no_grad(): # 推論時は勾配計算を無効化 (メモリと速度の最適化)
    outputs = model(**inputs)

# 3. 出力から予測結果を解釈
# ロジットをソフトマックス関数に通して確率に変換
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)

# クラスラベルを取得 (例: 'POSITIVE', 'NEGATIVE')
# モデルのconfigからidとラベルのマッピングを取得
id_to_label = model.config.id2label
predicted_class_id = predictions.argmax().item()
predicted_label = id_to_label[predicted_class_id]
predicted_score = predictions[0][predicted_class_id].item()

print(f"\n--- モデルの出力 ---")
print(f"ロジット: {outputs.logits}")
print(f"確率: {predictions}")
print(f"\n予測された感情: {predicted_label} (スコア: {predicted_score:.4f})")

この例では、pipelineが内部で行っているトークン化、モデルへの入力、出力の解釈といったステップを明示的に示しました。これにより、Transformerモデルがテキストをどのように数値として処理し、予測結果を出すのかが少し見えてきたのではないでしょうか。


3. 簡単なファインチューニングの概念

LLMの真の力は、特定のタスクに合わせてファインチューニングできる点にあります。事前学習済みモデルは、一般的な言語理解能力を持っていますが、特定の業界の専門用語や、特殊な文脈でのタスクには特化していません。ファインチューニングを行うことで、これらのニーズに対応できます。

ファインチューニングの基本的な流れは以下の通りです。

  1. タスク固有のデータセットを用意: 目的のタスク(例:特定の業界のレビューの感情分析)に応じた、ラベル付きの訓練データを用意します。
  2. 事前学習済みモデルをロード: AutoModelForSequenceClassification.from_pretrained()のように、タスクに合ったヘッド(例:分類用の層)が追加されたモデルをロードします。
  3. モデルを訓練: 用意したデータセットを使って、モデルのパラメータを微調整します。この際、事前学習で得られた知識を壊さないよう、学習率を小さくしたり、訓練データを少しずつ与えたりする工夫がされます。
  4. モデルを評価・デプロイ: ファインチューニング後のモデルを評価し、実運用に備えます。

ファインチューニングの利点:

  • データ効率: ゼロからモデルを訓練するよりも、はるかに少ないデータで高い性能を達成できます。
  • 計算効率: 事前学習済みの重みを利用するため、訓練時間が短縮されます。
  • 高性能: 複雑なモデルアーキテクチャを自分で設計する必要がなく、最先端のモデルの恩恵を受けられます。

簡易的なファインチューニングのイメージ (Hugging Face Trainer クラス)

Hugging Face Transformersには、Trainerクラスという、ファインチューニングを簡単に行うための高レベルAPIが用意されています。これを使えば、訓練ループを自分で書く手間が省けます。

# from datasets import load_dataset # データセットを簡単にロードするためのライブラリ
# from transformers import TrainingArguments, Trainer
#
# # 1. データセットの準備 (例: IMDb映画レビューの感情分析データセット)
# # 実際のファインチューニングでは、独自のデータセットを pd.DataFrame や DatasetDict 形式で用意
# # dataset = load_dataset("imdb")
# # train_texts = dataset['train']['text']
# # train_labels = dataset['train']['label']
# # test_texts = dataset['test']['text']
# # test_labels = dataset['test']['label']
#
# # ダミーデータセットの作成 (ファインチューニングの概念を示すため)
# train_texts = ["This movie is great!", "I hate this film.", "It's okay, nothing special."]
# train_labels = [1, 0, 0] # 1: Positive, 0: Negative (またはバイナリ分類のラベル)
#
# # 2. トークナイザーでデータを準備
# # encoded_train_data = tokenizer(train_texts, padding=True, truncation=True, return_tensors="pt")
# # # ここでラベルも合わせて準備する必要がある
#
# # 3. モデルのロード (分類タスク用にヘッドが追加されたBERTモデル)
# # model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2) # 2クラス分類
#
# # 4. TrainingArgumentsの設定 (訓練に関する各種設定)
# # training_args = TrainingArguments(
# #     output_dir="./results", # モデルの出力先
# #     num_train_epochs=3,     # エポック数
# #     per_device_train_batch_size=8, # バッチサイズ
# #     logging_dir='./logs',   # ログ出力先
# #     logging_steps=10,       # ログ出力間隔
# #     evaluation_strategy="epoch", # 各エポックで評価
# #     save_strategy="epoch", # 各エポックでモデルを保存
# #     load_best_model_at_end=True, # 訓練終了時にベストモデルをロード
# # )
#
# # 5. Trainerの初期化と訓練の実行
# # trainer = Trainer(
# #     model=model,
# #     args=training_args,
# #     train_dataset=train_dataset_object, # DataLoaderなどを含むDatasetオブジェクト
# #     eval_dataset=eval_dataset_object,
# #     tokenizer=tokenizer,
# #     # compute_metrics=compute_metrics_function # 評価指標の計算関数 (オプション)
# # )
# # trainer.train()
#
# print("\n--- ファインチューニングの概念 (コードはコメントアウト) ---")
# print("Hugging FaceのTrainerクラスを使えば、簡単にモデルのファインチューニングが可能です。")
# print("実際には、独自のデータセットを準備し、それをtokenizerで処理してDatasetオブジェクトを作成する必要があります。")

上記はコードをコメントアウトしていますが、ファインチューニングの基本的な流れを理解するためのものです。実際にファインチューニングを行うには、独自のデータセットを用意し、それをモデルの入力形式に変換する処理が別途必要になります。


4. まとめと次へのステップ

本日は、AI学習ロードマップの18日目として、LLMを実際に動かすための強力なツール「Hugging Face Transformers」ライブラリの入門を学びました。

  • Hugging Face Transformersが、豊富なモデル、簡単な利用方法、高い柔軟性を提供し、NLP開発のデファクトスタンダードとなっていることを理解しました。
  • pipelineを使った高レベルAPIで、簡単に感情分析などのタスクを実行できることを確認しました。
  • AutoTokenizerAutoModelを直接使って、トークン化からモデル推論までのステップをより詳細に理解しました。
  • LLMの強力な応用であるファインチューニングの概念と、Hugging FaceのTrainerクラスを使ったその可能性について触れました。

Hugging Face Transformersライブラリは、現代のNLP開発において最も重要なツールの一つです。今日の知識を基に、様々な事前学習済みモデルを試したり、異なるタスクのpipelineを使ってみたりと、積極的に手を動かして経験を積んでみてください。

明日からは、このTransformersライブラリを実際に使って、テキスト分類の具体的な応用である「感情分析」を実装していきます。今日の知識が、明日からの実践的な学習に活かされることでしょう。

それでは、また明日!


2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?