Amazon SageMaker JumpStartでBERTベースの多言語モデルをファインチューニングして日本語テキストの感情分類モデルを作成する

画像処理系の学習済みモデルに対するファインチューニングがピックアップされることが多いSageMaker JumpStartですが、自然言語処理においても非常にお手軽かつ強力です。
2022.11.16

データアナリティクス事業本部 インテグレーション部 機械学習チームの貞松です。

これまで、Amazon SageMaker JumpStart(以降SageMaker JumpStart)を使った画像処理に関する学習済みモデルのファインチューニングは、私の投稿含め幾つかの記事がDevelopersIOでも投稿されていますが、自然言語処理に関する学習済みモデルについては、あまり取り上げられていないように思います。

そこで今回はSageMaker JumpStartでBERTベースの多言語モデルをファインチューニングすることにより、日本語テキストの感情分類モデルを作成してみます。
ちなみに感情分類モデルを作成する、と書きましたが、感情分類以外にも日本語のテキスト分類モデル作成に応用可能なので、是非参考にしてみてください。

SageMaker JumpStartとは

SageMaker JumpStartは事前準備されたリソースを活用して、目的に合わせた機械学習の実行を容易にしてくれる非常に強力な機能です。
全体的な概要については、以下の記事をご参照ください。

BERTベースの多言語モデルでファインチューニングを実行する

学習データを準備する

元データ

学習データの元データとして、下記のデータを使用します。
感情分類の多言語データセットに含まれる日本語のサブセットです。

データ前処理

元データは、train, test, validの3種類のデータがそれぞれCSVとTSVファイルで用意されています(計6ファイル)
データ定義は以下の通りです。

  • text
    • テキスト本文。
  • label
    • 感情を表すのラベル。以下の3種類のいずれかが入っている。
      • negative
      • neutral
      • positive
  • source
    • データソース(データの取得元)

SageMaker JumpStart上のBERTベースの多言語モデルでファインチューニングを実行する場合、以下の仕様でファイルを作成・配置する必要がある為、事前にデータ前処理を施します。

  • ヘッダーなし
  • 列は以下の2列
    • ラベル
      • 数値型(基本的には0始まり)
    • テキスト
      • 文字列(今回は日本語)
      • わかち書きの必要なし!(わかち書きの必要なし!)
  • ファイル名は「data.csv」で、任意のS3パスに配置

今回は以下のようなPythonコードで仕様に沿った入力ファイルを作成してS3に配置しました。

import pandas as pd

input_file = "train.csv"

df = pd.read_csv(input_file, header=0)
df = df.reindex(columns=["label", "text"])
df = df.replace({"label": {"negative": 0, "neutral": 1, "positive": 2}})

df.to_csv("data.csv", header=False, index=False)

生成されたファイルの中身は以下のようになっています。

ファインチューニングを実行する

学習データの準備ができたら、SageMaker JumpStartでファインチューニングを実行します。
まずはSageMaker Studioを起動して、SageMaker JumpStartの画面を開きます。
JumpStartのトップ画面にあるText Classificationカテゴリの中からBERT Base Multilingual Casedを選択します。

BERT Base Multilingual Casedの画面が別タブで開きます。

BERT Base Multilingual Casedに限らず、学習済みモデルの詳細画面は概ね同様の構成となっており、以下のような内容が含まれます。

  • Deploy Model
    • 学習済みモデルをSageMaker Endpointにデプロイします。
  • Train Model (本記事で扱うのはココ)
    • 学習済みモデルに対してファインチューニングを実行します。
  • Run in notebook
    • 上記2つの操作をSageMaker API経由で実行するためのサンプルノートブックを起動します。
    • Jupyter Notebook上で実行なので、AWS SDK for Python(Boto3)を使用してAPIアクセスするような処理になっています。
  • Note
    • 対象の学習済みモデルの概要や利用方法について記載されています。
    • BERT Base Multilingual Casedでは、以下の項目について記載されています。
      • Description (概要)
      • Use the Deployed Model for Inference (デプロイされた推論モデルの使用方法)
      • Fine-tune the Model on a New Dataset (新規データによるモデルのファインチューニング実行方法)

ファインチューニング実行の為、「Train Model」のセクションを確認していきます。
デフォルトでは「Data Source」の領域が展開された状態になっており、その他の領域は折りたたまれた状態になっています。  

以下、各領域の内容について解説します。

Data Source

データソースとして既存のデータセットを選択するか、任意のS3パスに配置済みの独自データを選択することができます。
選択方法として、以下3パターンがあります。

  • Default dataset
    • 既存のデータセットを使用します。
    • 具体的にはSST-2という映画のネガティブ/ポジティブ評価データを使用します。
  • Find S3 bucket
    • 独自データが配置されているS3パスをGUI上で検索して選択します。
  • Enter S3 bucket location
    • 独自データが配置されているS3パスのURIを直接入力します。

Deployment Configuration

ファインチューニングのトレーニングジョブ実行に関する設定項目です。

  • SageMaker training instance
    • トレーニングジョブを実行するインスタンスタイプを選択します。
  • Model name
    • 出力される学習済みモデルの名称を入力します。
  • Custom resource tags
    • 任意でリソースタグを付けます。
  • Use JumpStart prefix
    • 出力されるS3パスにJumpStartからの出力であることを示すプレフィックスを含めるか否かを選択します。
  • Custom output S3 bucket
    • 学習済みモデルファイルの出力先S3パスを選択します。
    • 選択方法として、以下3パターンがあります。
      • Default output S3 bucket
        • デフォルトのSageMaker用S3バケット(自動生成)配下に出力します。
      • Find S3 bucket
        • 出力先のS3パスをGUI上で検索して選択します。
      • Enter S3 bucket location
        • 出力先S3パスのURIを直接入力します。

Hyper-parameters

ファインチューニングのトレーニングジョブに対するハイパーパラメータ設定です。
今回はデフォルト設定のまま実行しますが、設定可能項目としては以下の項目が存在します。

  • Train-only-top-layer
    • Trueの場合は、最上位の分類層のパラメーターのみがファインチューニングされます。
    • Falseの場合は、全てのパラメーターがファインチューニングされます。
  • Epochs
    • トレーニングデータセットに対する学習アルゴリズムの反復回数を指定します。
  • Batch size
    • モデルの重みが更新される前に実行されるトレーニング例の数を指定します。
  • Optimizer
    • TensorFlowの内部で使用される最適化アルゴリズムを選択します。
  • Learning rate
    • モデル更新時の重みの更新率を設定します。
  • Warmup_steps_fraction
    • Optimizerがadamwの時のみ有効。
    • 学習率0〜設定された学習率までの勾配更新ステップの合計数の割合を指定します。
  • Beta-1
    • Optimizerがadamもしくはadamwの時のみ有効。
    • 1次モーメント推定の指数関数的減衰率を指定します。
  • Beta-2
    • Optimizerがadamもしくはadamwの時のみ有効。
    • 2次モーメント推定の指数関数的減衰率を指定します。
  • Momentum
    • Optimizerがsgdもしくはnagの時のみ有効。
    • モメンタムの値を指定します。
  • Epsilon
    • Optimizerがadam、rmsprop、adadelta、adagradで使用するεの値を指定します。
    • 通常は0除算を避けるために極小さな値を設定します。
  • Rho
    • Optimizerがadadeltaもしくはrmspropの時に使用する勾配の割引率を指定します。
  • Initial-accumulator-value
    • Optimizerがadagradの時に使用するaccumulatorの開始値を指定します。
  • Early-stopping
    • Trueの場合、後述のEarly-stopping-patienceとEarly-stopping-min-deltaに基づいてトレーニングを早期に停止します。
  • Early-stopping-patience
    • 設定したエポック数で改善がない場合にEarly-stoppingが実行されます。
  • Early-stopping-min-delta
    • 設定した値より変化がない場合は改善なしとみなし、改善なしとみなされたエポックが前述のEarly-stopping-patienceで設定された回数連続した場合にEarly-stoppingが実行されます。
  • Dropout-rate
    • Reinitialize-top-layerがFalseでない場合に有効。
    • 最上位分類層にあるドロップアウト層のドロップアウト率を指定します。
  • Regularizers-l2
    • Reinitialize-top-layerがFalseでない場合に有効。
    • トレーニング損失のL2正則化係数を指定します。
  • Validation-split-ratio
    • 入力データセットから検証データとして分割する割合を設定します。
  • Reinitialize-top-layer
    • Autoの場合は、最上位の分類層パラメーターが最初期化されます。
    • Trueの場合は、最初期化した際に増分学習が実行されます。

Security Settings

トレーニングジョブ実行時のセキュリティに関する設定です。
ジョブ実行用のIAMロールやジョブ実行インスタンスのVPC設定、データの暗号化キーについて設定可能です。

必要な設定を全て施したら「Train」ボタンをクリックしてファインチューニングのトレーニングジョブを実行します。

学習済みモデルをエンドポイントにデプロイする

トレーニングジョブの実行が完了したら、学習済みモデルをSageMaker Endpointにデプロイします。 以下、デプロイに関する設定項目について解説します。

Deployment Configuration

  • SageMaker hosting instance
    • エンドポイントをホストするインスタンスタイプを選択します。
  • Endpoint name
    • エンドポイント名を入力します。
  • Custom resource tags
    • 任意でリソースタグを付けます。
  • Use JumpStart prefix
    • 作成されるリソース名にJumpStartから生成されたことを示すプレフィックスを含めるか否かを選択します。
  • Custom model artifact S3 bucket
    • 学習済みモデルが配置されている(出力された)S3パスを選択します。
    • 選択方法として、以下3パターンがあります。
      • Default model artifact S3 bucket
        • デフォルトのSageMaker用S3バケット(自動生成)配下にある規定のモデルアーティファクト出力パスを選択します。
      • Find S3 bucket
        • 学習済みモデルが配置されているS3パスをGUI上で検索して選択します。
      • Enter S3 bucket location
        • 学習済みモデルが配置されているS3パスのURIを直接入力します。

Security Settings

エンドポイントのセキュリティに関する設定です。
設定内容はトレーニングジョブのセキュリティと同様です。

デプロイ済みエンドポイントで推論(テキストの感情分類)を実行する

エンドポイントへのデプロイが完了したら、エンドポイント実行用のサンプルノートブックを開いて、実際に感情分類処理を実行してみます。

ノートブックの中段にあるtext1、text2の部分を書き換えます。
ここでは、元データのtext.csvからnegative、neutral、positiveのラベルが付いたデータをそれぞれ一つずつ入力データとして使用します。

入力されたデータをエンドポイントに渡して、感情分類実行した結果は以下の通りです。
3つとも正しく分類されていることが確認できます(negative=0、 neutral=1、 positive=2のラベルに対応しています)

特に判定の難しいneutralが明確に分類できていることから、比較的良好な性能となっていることが伺えます。

エンドポイントの削除

SageMaker Endpointは稼働時間による従量課金の為、不要になった段階で削除しましょう。
JumpStartから作成されたEndpointは、SageMaker Studio上からGUI操作で削除することができます。

サイドバーからJumpStartのタブを選択して、該当のエンドポイントを選択します。

エンドポイント詳細画面が右側に展開されるので、一番下にある「Delete Endpoint」からエンドポイントの削除を実行します。

まとめ

SageMaker JumpStart上でBERTベースの多言語モデルを手持ちのデータでファインチューニングすることにより、独自のラベルでテキスト分類できるようにする手順について解説しました。
今回は3ラベルの感情分類モデルを作成しましたが、別ジャンルのさらに多数のラベルを分類するようなモデルももちろん作成可能です。
今回作成した感情分類モデルについては、判断の難しいNeutralなテキストについても明確に分類できていたので、他のデータでファインチューニングした場合の性能も期待できそうです。
お手軽且つ実戦レベルで独自の分類モデル作成ができますので、ぜひ実際の現場課題に対して応用していただけると幸いです。