事前学習モデルのFine-tuningでテキスト分類を自動化する

目次

はじめに

「社内の問い合わせを自動で振り分けたい」「大量のテキストをカテゴリに分類したい」——こうしたニーズは業務の中でよく出てきます。

最初に思いつくのは、「専用のモデルをゼロから学習させる」という方法です。しかし実際にやってみると、いくつかの壁にぶつかります。

  • データ不足:モデルに言語を一から覚えさせるには、数十万〜数百万件規模のデータが必要になる
  • 計算コスト:GPUを使っても数日〜数週間かかることがある
  • それでも精度が出ない:少ないデータでは汎化できず、テストで崩れる

この記事では、こうした問題を解決する「事前学習モデルのFine-tuning」という手法を紹介します。

事前学習モデルとは、大量のテキストデータであらかじめ言語の構造・意味を学習済みのモデルです。このモデルから追加学習を行うことで、少ないデータ・短時間でも高い精度を実現できます。

実験では、同じBERTアーキテクチャを使って 「事前学習モデルをFine-tuningしたケース」 と 「ゼロから学習させたケース」 を比較し、その差を数値で確認します。


事前学習モデルの取得

使用モデル

今回は cl-tohoku/bert-base-japanese-v3 を使用します。東北大学が公開している日本語特化のBERTモデルで、日本語の大規模コーパスで事前学習されています。

項目内容
モデル名cl-tohoku/bert-base-japanese-v3
パラメータ数約1億1100万(111M)
学習言語日本語
アーキテクチャBERT-base(12層・12ヘッド・隠れ層768次元)
取得元Hugging Face Hub

なぜこのモデルか

ローカルPC(GPU非搭載・RAM 16GB)での実行を前提としているため、モデルサイズは重要な選定基準です。BERT-baseは約440MBと比較的軽量で、CPUのみの環境でも推論・学習が現実的に動作します。

モデルの取得手順

Hugging FaceのTransformersライブラリを使って1行でダウンロードできます。

from transformers import AutoTokenizer, AutoModelForSequenceClassification

MODEL_NAME = "cl-tohoku/bert-base-japanese-v3"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForSequenceClassification.from_pretrained(
    MODEL_NAME,
    num_labels=4
)

ダウンロードしたモデルはローカルに保存しておくことで、以降はオフラインで利用できます。


Fine-tuningの実施

BERTによるテキスト分類の仕組み

BERTはテキストを入力すると、[CLS]と呼ばれる特殊トークンに文章全体の意味を凝縮した768次元のベクトルを出力します。このベクトルに対してシンプルな全結合層(分類ヘッド)を追加することで、分類タスクに応用できます。

入力テキスト
    ↓
[ BERT ] ← 文章の意味を理解・特徴を抽出
    ↓
[CLS] ベクトル(768次元)
    ↓
[ 分類ヘッド(全結合層)]
    ↓
クラスラベル(返品・支払い・配送・その他)

Fine-tuningとスクラッチ学習の違い

今回は同じBERT構造で2つのモデルを比較します。

Fine-tuningモデルスクラッチモデル
初期重み日本語事前学習済みランダム初期化
学習データ1000件1000件(同じ)
学習手順同じ同じ
アーキテクチャ同じBERT-base同じBERT-base

唯一の違いは初期重みだけです。これにより「事前学習の効果」を純粋に測定できます。

学習パラメータ

MAX_LEN    = 128   # 最大トークン長
BATCH_SIZE = 16    # バッチサイズ
EPOCHS     = 3     # エポック数
LR         = 2e-5  # 学習率

損失関数にはクロスエントロピー損失を使用し、スケジューラーによる学習率の線形減衰を適用しています。


実験シナリオの設定

タスク定義

ECサイトや問い合わせ窓口に届くカスタマーサポートの問い合わせ文を4つのカテゴリに自動分類します。

ラベルカテゴリ例
0返品・交換「開封したら思っていたものと違いました」
1支払い「明細に見覚えのない金額が記載されていました」
2配送「注文から1週間経ちますがまだ来ていません」
3その他「ログインできなくなりました」

データセット

キーワードに頼らず文脈で判断が必要な表現を意図的に採用しています。

件数各クラス
学習データ1,000件250件ずつ
テストデータ100件25件ずつ

評価指標

  • Accuracy:全件中の正解率
  • F1-score(macro):各クラスのF1スコアの平均(クラス不均衡に強い)

精度比較

実験では、事前学習モデルをFine-tuningしたケースとゼロから学習させたケース(スクラッチモデル) を比較し、その差を数値で確認します。

結果サマリー

モデルAccuracyF1-score(macro)
事前学習 Fine-tuning100.0%1.0000
スクラッチ学習53.0%0.4931
改善幅+47.0%+0.5069

クラス別の詳細(スクラッチ学習)

カテゴリPrecisionRecallF1
返品・交換0.610.800.69
支払い0.830.200.32
配送0.440.320.37
その他0.470.800.59

バッチごとのLoss推移

グラフを見ると、2つのモデルの学習の様子が対照的であることがわかります。

Fine-tuning(青) は学習開始直後からlossが急速に低下しています。Epoch 1の途中(Step 30前後)にはすでに1.0を下回り、Epoch 2には0.1を切るまで収束しています。事前学習によって日本語の意味理解がすでに備わっているため、分類ルールの学習だけに集中でき、効率よく精度が上がっていきます。

スクラッチ(赤) は3エポック189ステップを通じて、lossがほとんど下がりません。グラフ上部の点線はランダム予測の水準(約1.386)を示していますが、スクラッチモデルはEpoch 2の終わりになってようやくその水準を下回り始める程度です。1000件のデータでは「日本語とは何か」を学びながら分類タスクを同時にこなすことは難しく、学習が収束しきれていません。

この差が、最終的なAccuracyの100% vs 53%という結果に直結しています。

考察

Fine-tuningモデルはAccuracy 100%、スクラッチは53% という大きな差が生まれました。

スクラッチモデルのクラス別結果を見ると、「支払い」と「配送」のF1スコアが特に低いことがわかります。これらはキーワードに頼らず文脈で判断が必要なカテゴリであり、言語の意味理解なしには正しく分類できません。

スクラッチモデルが苦手な理由は明確です。1000件のデータで「日本語の意味理解」と「分類タスクの学習」を同時にゼロからこなすのは、データ量として不十分です。

一方でFine-tuningモデルは、事前学習によってすでに日本語の文脈・ニュアンス・語の関係性を理解しています。そのため、1000件という少ないデータでも分類ルールだけを効率的に学習でき、高い精度を実現しました。

これが「ゼロから学習しなくていい」理由です。


他への応用例

今回はカスタマーサポートの問い合わせ分類を例に取りましたが、同じアプローチは様々な業務に応用できます。

情報抽出・固有表現認識

契約書や請求書から日付・金額・固有名詞を自動で抜き出す。社内文書の処理自動化に直結します。

特定フォーマットへの変換

自然文を JSON や CSV などの決まった構造に変換する。汎用モデルでは出力が安定しないケースでも、Fine-tuningで安定させることができます。

社内チャットボット・FAQ自動応答

社内ナレッジや製品情報に特化した質問応答システム。クラウドAPIに社内データを送れない環境でも、ローカルモデルのFine-tuningで実現できます。

エッジ・組み込み環境での推論

工場の設備ログ分類や、ネットワーク非接続環境でのリアルタイム判定など。小さいモデルをFine-tuningして特定タスクに特化させることで、制約の強い環境でも動作します。


まとめ

今回の実験では、同じBERTアーキテクチャ・同じ1000件のデータを使いながら、初期重みの違いだけでAccuracyに47%の差が生まれました。

Fine-tuningスクラッチ
学習データ1,000件1,000件
事前知識日本語理解ありなし
Accuracy100%53%

ゼロから学習させる場合、モデルは「日本語とは何か」から覚え直す必要があります。しかし実務では、そのための大量データも計算資源も用意することは難しい場合がほとんどです。

事前学習モデルのFine-tuningは、その問題をシンプルに解決します。言語理解はすでに済んでいるので、手持ちのデータでタスク固有のルールだけを学習すれば十分です。

今回紹介した問い合わせ分類の他にも、情報抽出・文書変換・FAQ応答など、テキストを扱う多くの業務に同じアプローチが活用できます。まずは手元のデータで試してみてください。

CTA
  • URLをコピーしました!
  • URLをコピーしました!
この記事を書いた人
目次