ONNXパイプライン・モデル: テキスト分類

ONNXパイプライン・モデルは、テキスト文字列を入力として受け入れ、特定のラベルに属する入力文字列の確率を生成するテキスト分類モデルを提供します。パイプライン・モデルでは、必要な前処理および後処理も提供されます。

テキスト埋込みモデルに加えて、Hugging Faceリポジトリは、テキスト分類に使用できるトランスフォーマ・モデルもホストします。通常、これらのモデルは、分類「ヘッド」が追加されて微調整された埋込みモデルです。ヘッドは、モデルの出力を埋込みのベクトルからラベルと確率のリストに変更します。センチメント分析などのテキスト・ベースの分類タスクでは、OML4Py 2.1を使用してテキスト分類パイプラインを生成できます。

テキスト分類パイプライン

  1. 入力: テキスト分類パイプラインへの入力は、1つ以上のテキスト文字列のバッチまたは配列の形式で提供されます。入力に指定した各テキスト文字列は、ラベルと確率を含む出力リストに対応します。
  2. 前処理: テキスト埋込みパイプラインと同様に、テキスト分類パイプラインはテキスト入力をトークン化するためのトークナイザも構成します。OML4Py 2.1では、次のトークナイザ・クラスがサポートされています:

    表4-2 テキスト分類パイプラインで使用可能なトークナイザ・クラス

    トークナイザ・クラス トークナイザ・タイプ
    transformers.models.bert.BertTokenizer BERT
    transformers.models.clip.CLIPTokenizer CLIP
    transformers.models.distilbert.DistilBertTokenizer BERT
    transformers.models.gpt2.GPT2Tokenizer GPT2
    transformers.models.mpnet.MPNetTokenizer BERT
    transformers.models.roberta.tokenization_roberta.RobertaTokenizer ROBERTA
    transformers.models.xlm_roberta.XLMRobertaTokenizer SENTENCEPIECE

    ノート:

    トークナイザは、Hugging Faceでモデルに対して構成されたトークナイザ・クラスに基づいて自動的に構成されます。トークナイザ・クラスは、トランスフォーマ・ライブラリによって提供されます。Hugging Faceでモデルに対して構成されたトークナイザ・クラスがOML4Py 2.1でサポートされていない場合は、エラーが発生します。
  3. 元のモデル: 元のモデルは、Hugging Faceリポジトリまたはローカル・ファイル・システムの事前トレーニング済PyTorchモデルである必要があります。ローカル・ファイル・システムのモデルは、Hugging Face形式と一致する必要があります。
  4. 後処理: テキスト分類パイプラインは、デフォルトで後処理用のsoftmax関数を提供します。softmax関数は、モデルによって生成された一連のスコア(ロジット)を確率分布に正規化します。各値が[0,1]の範囲に正規化され、すべての値の合計が1になります。OML4Py 2.1でパイプラインを生成するときに空のポストプロセッサのリストを指定することで、softmax後処理を含めないように選択できます。
  5. 出力: 分類パイプラインの出力は、各入力文字列の確率のリストです。リストの長さは、分類ターゲットまたはラベルの合計数と同じです。
パイプライン・ジェネレータは、Hugging Faceのモデルの構成によって提供されるラベル・データを使用することを試みます。通常、このメタデータはlabel2idプロパティのconfig.jsonファイルで見つかります。このプロパティがモデルのconfig.jsonで見つからない場合、パイプライン・ジェネレータは指定したメタデータを使用するか、デフォルトで出力索引をラベルとして使用します。ラベル・メタデータを指定する場合、Hugging Faceリポジトリのconfig.jsonで提供されるメタデータよりも優先されます。

ノート:

ラベル・メタデータはONNXモデルの一部になりません。これは、export2dbを使用してモデルをデータベースにエクスポートする場合にのみ適用されます。

テキスト分類パイプラインの例

イメージ分類のONNXパイプライン・モデルを生成するには、PythonユーティリティのMiningFunctionクラスを使用します。MiningFunctionクラスには、EMBEDDINGCLASSIFICATIONおよびREGRESSIONの3つの値のいずれかを指定できます。実行するタスクに応じて選択できます。MiningFunctionの列挙は次のように定義されます:
class MiningFunction(Enum) :
    EMBEDDING = 1
    CLASSIFCATION = 2
    REGRESSION = 3

テキスト分類パイプラインの作業をしているため、クラスMiningFunctionCLASSIFICATIONまたは2 (Enum)を選択します。

警告:

EmbeddingModelおよびEmbeddingModelConfigは非推奨です。かわりに、ONNXPipelineおよびONNXPipelineConfigをそれぞれ使用してください。非推奨クラスの詳細は、「事前トレーニング済モデルをONNXモデルに変換するPythonクラス(非推奨)」を参照してください。非推奨のクラスを使用した場合は、警告メッセージが表示されて、そのクラスが将来削除されることが示され、新しいクラスに切り替えるようにユーザーに通知されます。
  1. テンプレートを使用したテキスト・パイプラインの生成の例:
    from oml.utils import ONNXPipeline,ONNXPipelineConfig,MiningFunction
    config = ONNXPipelineConfig.from_template("text",max_seq_length=512)
    pipeline = ONNXPipeline("SamLowe/roberta-base-go_emotions",config=config,function=MiningFunction.CLASSIFICATION)
    pipeline.export2file("emotions","testouput")
  2. 前述の例で生成されたテキスト分類パイプラインのDB (SQL)へのインポート

    ノート:

    次のコードは、ONNX_IMPORTという名前のディレクトリをPL/SQLで作成していることを前提としています。
    BEGIN
        DBMS_VECTOR.LOAD_ONNX_MODEL(
        'ONNX_IMPORT',
        'emotions.onnx',
        'emotions',
        JSON('{"function":"classification","classificationProbOutput":"logits","input":{"input":["DATA"]},
            "labels":["admiration","amusement","anger","annoyance","approval","caring","confusion","curiosity",
                      "desire","disappointment","disapproval","disgust","embarrassment","excitement","fear","gratitude",
                      "grief","joy","love","nervousness","optimism","pride","realization","relief","remorse","sadness","surprise","neut"]}')
        );
    END;

    この例では、DBMS_VECTOR.LOAD_ONNX_MODELファンクションを呼び出してONNXパイプラインをデータベースにインポートするときに、ラベル・メタデータが適用されます。「labels」プロパティは、ONNXファイルの一部ではなく、この関数のJSON引数の一部であることを思い出してください。ラベルは個別に指定する必要があります(指定しない場合、出力の数値索引のみが使用されます)。export2db関数を使用してOML4Pyからデータベースに直接エクスポートする場合、Hugging Faceのモデルの構成で提供されるデフォルトのラベル・メタデータに依存するか、テンプレート引数を介して独自のラベル・メタデータを指定できます。

  3. デフォルトのラベル・メタデータを使用してテキスト分類パイプラインをエクスポートする例:
    from oml.utils importONNXPipeline,ONNXPipelineConfig,MiningFunction
    import oml
    config = ONNXPipelineConfig.from_template("text",max_seq_length=512,labels=["admiration","amusement","anger","annoyance","approval","caring",
                                              "confusion","curiosity","desire","disappointment","disapproval","disgust","embarrassment","excitement",
                                              "fear","gratitude","grief","joy","love","nervousness","optimism","pride","realization","relief",
                                              "remorse","sadness","surprise","neut"])
    pipeline = ONNXPipeline("SamLowe/roberta-base-go_emotions",config=config,function=MiningFunction.CLASSIFICATION)
    oml.connect("pyquser","pyquser",dsn="pydsn")
    pipeline.export2db("emotions")

    この例では、パイプラインは、テンプレートで指定したラベル・メタデータとともにエクスポートされます。この例は、前の2つのステップで示した例の組合せです。

  4. テキスト分類パイプラインのスコアリングの例:
    select prediction(emotions using 'Today is a good day' as data),
             prediction_probability(emotions using 'Today is a good day'as data) from dual;