🦁

ChatGPTで生成した単一ラベルのテキストデータをAutoMLで学習させ、自分のコメントを評価してもらうサンプル

2023/04/07に公開

自分が書く文章にはどういう傾向があるか、調べたくなりました。Google Cloud の AutoML は、機械学習を利用するハードルを大幅に下げてくれます。試しに単一ラベルのテキスト分類を学習させ、文章にラベルをつけてもらうことを試します。

流れの確認

AutoML を使って自分の文章にラベルをつけてもらうまでのステップを確認しておきます。

  1. 学習データを用意
  2. Vertex AI のテキスト分類(単一ラベル)データセットとして登録する
  3. AutoML でトレーニング
  4. モデルをデプロイし、エンドポイントを作成
  5. 自分の文章を投げてみる

このような流れです。とくにトレーニング部分をAutoMLでやってもらえるのはありがたいですね。

学習データを用意する

大変なのが学習データの準備です。当初、自分が書いたブログに自分でラベルをつけ、それを学習させることも考えたのですが、手間がかかるので却下しました。

ここでChatGPTに手伝ってもらう

ChatGPTの得意な領域のひとつに、ダミーデータおよびサンプルデータの生成があります。今回は以下のようなプロンプトで学習用の文章作成を依頼しました。

以下のようなラベルがあります。

positive: 「好き」「好み」など、ポジティブな感情を含む文章

このラベルに対して、適切だと思う文を100文字以上で50個生成してください。IT技術にちなんた文でお願いします。

単一ラベルテキストのデータセットとしては、ひとつのラベルに該当するデータが最低10個必要です(Vertex AIの要求)。ここでは一応50個生成していますが、15個くらいでもいいと思います。この作業を次のラベルで繰り返しました。

  • positive:「好き」「好み」など、ポジティブな感情を含む文章
  • negative:「嫌い」「苦手」など、ネガティブな感情を含む文章
  • fail: うまくいかなかったことを説明している文章
  • quote: ">" から始まる、引用を表す文章
  • opinion: 意見が含まれる文章
  • try: 実際に試してどうなったかが記載されている文章
  • issue: 課題を表す文章
  • code: ソースコード

どういうラベルがいいかはまだ模索中ですが、自分の文章を顧みてだいたいこういう要素が詰まってそうだ、というものを考えました。

サンプルデータをラベル付きのスプレッドシートに入れていく

当初、OpenAI API と スプレッドシートのSDKを組み合わせることも考えたのですが、レスポンスの内容が不安定(たとえば、「はい、そういったラベルの文章を出力するお手伝いができます」のようなズレた回答が混ざる)だったためChatGPTをベースに手作業で入れました。

画像のように第一カラムにサンプルテキストを、第二カラムにラベルを入れます。

このシートをCSVで出力してください。データセットとして登録します。

データセットを作成する

Google Cloud Vertex AI のデータセットを作成します。データセットのタイプを選択するとき、テキスト分類(単一ラベル)としてください。

次に、データセットへドキュメントを追加します。ここでさきほど作成したCSVを使います。パソコンからインポートファイルをアップロードとして、そのCSVを選んでください。

データ分割はランダムの「デフォルト」で良いと思います。その後、インポート参照分析とあるタブのうち、分析タブで、とくにラベル数不足のエラーが出ていなければ準備OKです。

AutoML でトレーニング

自動で適切なアルゴリズムを試し、一番精度が出ると判断したアルゴリズムを適用してくれるモードです。こちらとしては画面でポチポチするだけでトレーニングをしてくれるので大変助かります。しかし、その代わりというか、私の場合はトレーニング完了まで9時間かかりました。寝る前に実行開始することをオススメします。

Vertex AI の左ペインメニューでトレーニングを選び、+作成を押します。すると先ほど作成したデータセットとアノテーションセット(ラベルと文のセット)が選択できるはずなので選びます。トレーニング方法を「AutoML」としてください。

2.モデルの詳細では、はじめて作るモデルなので、新しいモデルのトレーニングでいいです。トレーニングを開始してください。その後、寝ます。おやすみなさい。

モデルをデプロイし、エンドポイントを作成

トレーニングが完了すると、トレーニングパイプラインで作業の完了がわかります。

ここまでできたら予測用のエンドポイントを作成できます。左ペインのメニューからエンドポイントを選択し、エンドポイントを作成してください。作成中のモデル設定で、作成されたモデルを選択します。これでしばらく待てばエンドポイントが作成されます。

試す

丁寧にリクエスト例も出してくれるので、さっそく Cloud Shell で試してみましょう。

> ENDPOINT_ID="00000000000000"
> PROJECT_ID="1111111111111"
> curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/ui/projects/${PROJECT_ID}/locations/us-central1/endpoints/${ENDPOINT_ID}:predict -d '{
  "instances": {
    "mimeType": "text/plain",
    "content": "次に、作成されたモデルをデプロイしてエンドポイントを作成します。"
  }
}'

{
  "predictions": [
    {
      "ids": [
        "8641602292656635904",
        "5772809330021629952",
        "9218063044960059392",
        "8201806987395072",
        "1147612512712130560",
        "5759298531139518464",
        "1161123311594242048",
        "2300534017318977536",
        "2314044816201089024",
        "4606377026532671488",
        "6925730834628476928",
        "4619887825414782976",
        "6912220035746365440"
      ],
      "confidences": [
        0.0073390332981944084,
        0.70815819501876831,
        0.00072439218638464808,
        0.00010403751366538927,
        0.16298328340053558,
        0.0024225716479122639,
        0.038506362587213516,
        0.013907374814152718,
        0.017786769196391106,
        0.0088923797011375427,
        0.0070339511148631573,
        0.01147755142301321,
        0.02066413126885891
      ],
      "displayNames": [
        "code",
        "operation",
        "fail",
        "negative",
        "fact",
        "issue",
        "try",
        "link",
        "background",
        "opinion",
        "succeed",
        "quote",
        "positive"
      ]
    }
  ],
  "modelVersionId": "1"
}

結果が少し見にくいのでコンソール画面に助けてもらうと、図のように「operationを表す文である可能性が高い」という予測結果を表しています。

ちょっと試してみましょう。

私は、たまには出社するのも良いコミュニケーションになると考えています。

もう少しopinionに出てきてほしいです。

昨日試したテストがうまく通ったので、気分が良いです。

negative!?なにか登録するデータを間違えたでしょうか。

curl -X POST

これは意図どおりcodeとして検出されています。ちょっと operation の指す意味が広すぎて、予測に悪い影響を与えてしまっているかもしれないです。

おわりに

AutoMLは便利なサービスですが、ラベルに合う文を探す・文にラベルをつけるのが億劫でなかなか試さないまま過ごしていました。ChatGPTによりダミーデータ生成がやりやすくなったので、あわせて試してみました。寝ている間にトレーニングを自動でやってくれるのは、ビジネスにも集中したい環境ではとてもありがたい機能です。

一方、モデルそのものの精度はまだお世辞には良いとは言えません。文章をひとつずつ高精度に評価しようとと思ったら、さらに大量のラベル付きデータが必要になりそうです。少ないデータセットでも予測活用する方法としては、たとえばスパムっぽい表現や攻撃的な文になっていないかをピンポイントで検出する作業がすぐにできそうだと思いました。さっそくChatGPTにサンプルデータを作ってもらいましょう。

そうですか、だめですか。データ生成方法については、また別のやり方を考えます。

参考

https://cloud.google.com/natural-language/automl/docs/beginners-guide?hl=ja

https://dev.classmethod.jp/articles/vertex-ai-automl-intro/

Discussion