Tracks
新しいカテゴリにテキストを分類する必要があるのに、その学習用にラベル付きの事例がひとつもないとしたら、どうしますか?
従来型の分類器には頼れません。予測したい各カテゴリについてラベル付きの事例を期待するため、学習を始める前に数週間のアノテーション作業が必要になります。しかも新しいカテゴリが出てきた瞬間、またラベリングに逆戻りです。
そこで注目すべきがゼロショット分類です。学習時に見たことのないラベルをモデルに割り当てさせることで、ラベリング工程そのものを省略します。実務的には、顧客のフィードバックを「請求に関する苦情」や「機能要望」といったカテゴリに、どちらの学習用データも用意せずに仕分けできるということです。
この記事では、ゼロショット分類の仕組み、従来手法やフューショットとの違い、そしてHugging Face Transformersを使って実際のNLPタスクに適用する方法を順に解説します。
Hugging Faceとは何か?Hugging Face Fundamentalsトラックに登録し、AIエージェントの構築やLLMのファインチューニングを学んでください。
ゼロショット分類とは?
ゼロショット分類は、モデルが特定のラベルで学習されていなくても、データにラベルを割り当てる機械学習アプローチです。
ここでのキーワードは「ゼロショット」です。予測したいカテゴリについて、モデルは学習用の事例をゼロ件しか見ていません。テキストと候補ラベルのリストを渡すと、モデルは既存の知識に基づいて最も合うものを選びます。
この知識のすべては事前学習から来ています。大規模モデルは巨大なテキストコーパスから言語や概念の広範な理解を獲得し、新しい分類を頼まれたときにはその一般知識に立ち戻ります。
ゼロショット分類の仕組み
ワークフローは、手順に分解するとシンプルです。必要なのは4つだけです。
-
テキストやデータを入力する: 分類したいものなら何でも構いません——顧客レビュー、サポートチケット、ニュースの見出し、ドキュメントの一部など。
-
候補ラベルを用意する: 可能性のあるカテゴリのリストをモデルに渡します。
"product question"、"refund request"、"technical issue"、"general inquiry"のような、単語や短いフレーズです。 -
入力とラベルの関係をモデルが評価する: モデルは各ラベルについて、事前学習による言語理解に基づき、入力との適合度をスコア化します。
-
最も確からしいラベルを選択する: スコアが最も高いラベルが予測として返され、しばしば各候補に対する信頼度も併せて返されます。
重要なのは、再学習せずにいつでも候補ラベルを入れ替えられる点です。明日新しいカテゴリを追加したくなったら、単にリストに加えるだけ。教師あり学習しか経験がないと、ちょっと衝撃的かもしれません。
ゼロショット分類 vs 従来の分類
どちらも(データにラベルを割り当てるという)同じ問題を解きますが、到達方法が異なります。
従来の分類
従来の分類器はラベル付き事例から学習します。各アイテムに正しいカテゴリが付いたデータセットを集めて学習させ、クラス同士を分けるパターンをモデルに学ばせます。
これは長年うまく機能してきましたが、大きな制約が2つあります。
- ラベル付き学習データが必要: 多くの場合、大量に必要です。その収集とアノテーションには時間と費用という、最も貴重で有限な資源がかかります。
- ラベル集合が固定: いったん学習すると、モデルは学習時に見たカテゴリしか予測できません。新しいクラスを追加するには、学習に戻る必要があります。
ゼロショット分類
ゼロショットはその逆です。タスク特化の学習工程は一切ありません。事前学習で得た知識を使い、どんなラベルでも評価します。
これにより、次の2つの利点があります。
- タスク特化の学習が不要: データ収集、アノテーション、学習を丸ごと省略できます。
- 柔軟なラベル集合: 途中でカテゴリを変更できます。追加・削除・名称変更——いずれも再学習なしで対応します。
トレードオフ
この柔軟性は無料ではありません。しっかりラベル付けされたデータセットで学習した従来型の分類器は、その特定タスクに関してはたいていゼロショットモデルを上回ります。まさに関心のある事例を見ており、それに最適化されているからです。
ゼロショットモデルはジェネラリストです。多くのことをそつなくこなしますが、特定の1つで最良になることは稀です。最終的な選択はニーズ次第です。
ラベル付きデータがあり、固定カテゴリで最高の精度を求めるなら従来型の分類器を学習してください。ラベル付きデータがない、あるいはカテゴリが頻繁に変わるなら、ゼロショットが動く解決策への最短経路です。
基盤モデルとLLMの役割
ゼロショット分類が広まったのは、大規模な事前学習モデルが十分に高性能になったからです。
基盤モデル以前は、見たことのないラベルのリストをそのまま渡して妥当な予測を期待することなどできませんでした。モデルは言語について十分に知らなかったのです。巨大コーパスでの事前学習が状況を変えました。インターネットの相当部分を読んだモデルは「refund」や「complaint」といった語を無数の文脈で目にしているため、新しい入力に結びつけることが可能になりました。
現在、多くのゼロショットワークフローを支える代表的なモデル群は次のとおりです。
- BERT系とその派生: BERT系モデルは事前学習でテキストの深い表現を学びます。RoBERTaやDeBERTaといった派生は、より良い学習手法や大型データセットでこれを押し広げました。
- NLIベースのモデル: 自然言語推論タスクでファインチューニングされたモデルです。既製のゼロショットパイプラインの多くはこれに基づいており、その理由は次のセクションで説明します。
- 現代のLLM: GPTファミリーやClaudeのような大規模言語モデルは、プロンプトによってゼロショット分類をこなせます。タスクを自然言語で記述し、カテゴリを列挙すると、モデルが1つを選びます。
共通点はスケールと汎用性です。狭いタスクで学習したモデルはそのタスクしかできません。広範なテキストデータで学習したモデルは、ラベル付き事例を見ずとも多くのタスクへ転用できます。
自然言語推論(NLI)とゼロショット分類
実務で目にするゼロショット分類器の多くは、NLIモデルに基づいています。これは驚かれる点なので、少し丁寧に説明します。
自然言語推論は独立したタスクです。2つの文(前提と仮説)を与え、両者の関係を判定します。出力は次の3ラベルのいずれかです。
- 含意(Entailment): 仮説は前提から導かれる。
- 矛盾(Contradiction): 仮説は前提に反する。
- 中立(Neutral): 2文は無関係、または判断材料が足りない。
例えば、前提が"The team finished the project two weeks early"、仮説が"The team delivered on time"であれば、NLIモデルは含意を予測すべきです。仮説が"The team missed the deadline"なら、矛盾を予測すべきです。
この設定はゼロショット分類と非常に相性が良いのです。入力を前提とみなし、各候補ラベルを仮説に変換すればよいからです。
たとえば、文"My package never arrived"を「配送の問題」「請求の問題」「製品に関する質問」のいずれかに分類したいとします。モデルはこれらをラベルとしてではなく、通常は"This text is about {label}"のような簡単なテンプレートで包んだ仮説として扱います。
-
前提:
"My package never arrived"| 仮説:"This text is about a shipping issue" -
前提:
"My package never arrived"| 仮説:"This text is about a billing issue" -
前提:
"My package never arrived"| 仮説:"This text is about a product question"
NLIモデルは各ペアをスコア化します。含意スコアが最も高い仮説が勝ち、そのラベルが予測になります。
モデルは「配送の問題」や「請求の問題」というラベルの意味を学ぶ必要はありません。必要なのは一般的な「含意」の見分け方だけであり、それはNLIでのファインチューニング中に身につけています。
これが、NLIベースのゼロショットがうまく機能する理由です。モデルは自分が学習したタスク(含意の判定)を行い、こちらは分類問題を一連の含意判定として提示しているだけなのです。
ゼロショット vs フューショット vs ファインチューニング
フルの学習を行わずに分類タスクをこなす方法はゼロショットだけではありません。代替手法と比較します。
ゼロショット
ゼロショットは事例がまったく不要です。入力と候補ラベルのリストを渡し、事前学習で得た知識に基づいて予測します。
モデルは特定タスクのラベル付きデータを見たことがありません。完全に一般知識で対応します。
フューショット
フューショットは、通常プロンプト内で、少数の例をモデルに示します。入力と正解ラベルのペアを2件、5件、多くて10件ほど提示し、同様に新しい入力を分類させます。
ここでモデルは再学習されていません。事前学習済みの重みを使い、例はあくまで参照——「このカテゴリとはこういう意味だ」という簡単な示し合わせとして機能します。
ファインチューニング
ファインチューニングは専用の学習プロセスです。事前学習済みモデルに対し、タスク用のラベル付きデータセットを与えて重みを更新し、特定カテゴリの予測に長けるようにします。
この3つの中で最も重い手法です。ラベル付きデータ、学習基盤、時間が必要です。その代わり、モデルはタスクに特化します。
3手法の比較
実務で重要な3要素——精度、柔軟性、コスト——が異なります。
| 精度 | 柔軟性 | コスト | |
|---|---|---|---|
| ゼロショット | 3者の中で最も低いが、汎用用途には十分良好 | 最高、いつでもラベルを変更可能 | 最低、データも学習も不要 |
| フューショット | ゼロショットより良好、特に選び抜いた例がある場合 | 高い、プロンプト内の例やラベルを変更可能 | 低い、少数の事例だけで済む |
| ファインチューニング | 学習したタスクに対しては最高 | 最低、新カテゴリには再学習が必要 | 最高、データ収集・アノテーション・学習を含む |
代替手法との比較におけるゼロショット学習
この表から読み取れるポイントをいくつか挙げます。
精度は単純な序列になりません。十分なラベル付きデータがあり、タスクが安定しているならファインチューニングが勝ちます。しかし、全く新しいタスクで学ぶ例がない場合、ファインチューニングは選択肢にならず、ゼロショットが唯一現実的な選択になります。
柔軟性は逆方向に動きます。ゼロショットはいつでもカテゴリを変更できます。ファインチューニング済みモデルは学習時のラベル集合に縛られます。
コストは最も分かりやすい差です。ゼロショットはセットアップ費用がほぼゼロ。フューショットは小さなアノテーション工程が加わります。ファインチューニングはそれ自体がプロジェクトで、専用インフラが必要です。
多くのチームが採用するワークフローは、まずゼロショットでタスクが実現可能かを確認することです。精度が不十分ならフューショットへ、まだ足りず重要なタスクであればファインチューニングへと進みます。
NLPにおけるゼロショット分類
ゼロショット分類は、多くのNLPワークフローで登場します。特に、ラベル付きデータが手に入りにくい、またはカテゴリが変わり続ける場面で活躍します。代表的な用途は次のとおりです。
感情分析
感情分析は教科書的な出発点です。テキストを入力し、"positive"、"negative"、"neutral"といったラベルから選ばせます。
興味深いのは、標準的な3分類を簡単に超えられる点です。従来の感情分類器は学習した範囲に固定されています。ゼロショットなら、"frustrated"、"satisfied"、"confused"、"excited"のような、より具体的なラベルもそのまま扱えます。文脈によって重視する感情カテゴリが変わる、プロダクトのフィードバックやSNSモニタリングに最適です。
トピック分類
トピック分類は文書を主題別に仕分けます。ニュース記事を"politics"、"sports"、"technology"、"finance"に、サポートチケットを"billing"、"shipping"、"account access"、"feature request"に、といった具合です。
ゼロショットなら導入は極めて容易です。新しいトピックごとにラベル付きデータセットは不要です。新機能をリリースして、その件に関するチケットを追跡したいなら、候補ラベルに"new feature feedback"を加えるだけで完了です。
インテント検出
インテント検出は、ユーザーが何をしようとしているかを判別します。多くのチャットボットや音声アシスタントの中核です。誰かが"I need to change my password"と入力したら、"password reset"(パスワードのリセット)という意図を、"general security question"ではなく認識する必要があります。
ここでゼロショットが威力を発揮します。実際のプロダクトではユーザーのインテントが時間とともに増え続け、機能が増えるたびに分類器を再学習するのは大変です。ゼロショットなら、モデルを変えずにインテントリストを最新に保てます。
コンテンツモデレーション
コンテンツモデレーションは、"hate speech"、"spam"、"harassment"、"misinformation"のような問題のあるテキストを検出します。プラットフォームはポリシーを最新に保たねばならず、新種の不正が現れるたびにカテゴリも変化します。
ここでもゼロショットは適任です。モデレーションチームはポリシーの変化に合わせてラベル定義を調整したり新規カテゴリを追加したりでき、エンジニアリング側の再学習サイクルを待つ必要がありません。大量件数のケースには従来型分類器と併用するのが一般的ですが、学習用事例が足りないロングテールのカテゴリはゼロショットで対応できます。
Hugging Face Transformersでのゼロショット分類
Hugging Faceのtransformersライブラリは、Pythonでゼロショット分類を試す最も簡単な方法です。pipelineAPIがモデル読み込みのほとんどを隠蔽してくれるので、数行のコードで予測まで到達できます。
このスニペットを初めて実行すると、モデルのダウンロードが走るため時間がかかります。
以下はそのまま動かせる完全な例です。
from transformers import pipeline
from pprint import pprint
# Load a zero-shot classification pipeline
classifier = pipeline(
"zero-shot-classification",
model="facebook/bart-large-mnli"
)
# The text you want to classify
text = "My package never arrived and customer support hasn't responded in three days."
# The labels you want the model to choose from
candidate_labels = [
"shipping issue",
"billing issue",
"product question",
"general inquiry"
]
# Run the classification
result = classifier(text, candidate_labels)
pprint(result)
出力は3つのフィールドを持つ辞書で、元の入力、尤度の高い順に並んだ候補ラベル、各ラベルの信頼度が含まれます。

パイプラインの出力
"shipping issue"が信頼度0.82でトップになりました。モデルは学習中に配送クレームのラベル付き事例を見ていませんが、NLIデータでファインチューニングされた事前学習モデルbart-large-mnliの知識から推論しています。これは前のセクションで扱ったとおりです。
このワークフローに関して注目すべき点がいくつかあります。
-
モデルはNLIモデル:
bart-large-mnliはBARTをMultiNLIデータセットでファインチューニングしたものです。パイプライン呼び出し時に、裏側でラベルを仮説に変換してモデルに通します。 -
ラベルはいつでも変更可能: モデル自体を変える必要はありません。
candidate_labelsのリストを入れ替えれば、別のカテゴリで分類できます。 -
マルチラベルはフラグ1つで有効化: パイプライン呼び出し時に
multi_label=Trueを設定すると、ラベル同士が競合しません。各ラベルが独立に確率を得るため、1つの入力が複数カテゴリに属せます。
result = classifier(text, candidate_labels, multi_label=True)
pprint(result)

マルチラベルの出力
ワークフローは以上です。パイプラインを読み込み、ラベルを定義し、分類器を呼び出すだけ。ゼロから分類モデルを作るよりはるかに速く簡単です。
ゼロショット分類でよくある間違い
ゼロショット分類はセットアップが簡単であるがゆえに、誤用も起こりやすい手法です。現場でよく見かける誤りを挙げます。
曖昧なラベルを選ぶ
ラベルはタスクをモデルに伝える手段です。曖昧なラベルは曖昧な予測を生みます。
"good"や"bad"では、モデルに多くを伝えられません。"customer is happy with the product"や"customer is reporting a problem with the product"のような意味のあるフレーズなら、モデルは入力に対してより適切にスコアリングできます。ラベルは意味の通る語句にするほど効果的です。
また、重なり合うラベルは避けてください。"complaint"と"negative feedback"の両方が候補にあると、モデルは信頼度を分散させてしまい、どちらも明確な勝者になりません。
ゼロショットがファインチューニング並みに性能を出すと想定する
これは最も一般的な誤解です。ゼロショットは優秀ですが、魔法ではありません。
特定タスクのために数千件のラベル付き事例で学習したファインチューニング済みモデルは、ほぼ必ずゼロショットモデルを上回ります。ゼロショットで85%の精度が出ていて、プロダクションに95%が必要なら、ラベルの微調整ではその差は埋まりません。その時点で答えはファインチューニングです。
ラベル付きデータがない、カテゴリが頻繁に変わる、「十分良い」が本当に十分である——そんなときにゼロショットを使ってください。セットアップが早いからという理由だけで選び、高リスクのタスクで期待外れだと驚くのは避けましょう。
狭すぎるデータセットで評価する
よくあるのはこうです。ゼロショット分類器を作り、自分で用意した50件でテストしたら全問正解。リリースすると、本番では評価が散々というパターンです。
自作の50例は実ユーザーの入力を代表していません。よりきれいで、明確で、あなたのカテゴリ観に沿っています。モデルが実際に目にするであろうデータ——誤字、スラング、端境例を含むユーザー生成テキスト——で評価してください。まだそのデータがないなら、数百件の実入力をサンプリングして手動でラベル付けし、数値を信頼する前に確認しましょう。
ドメイン特有の言語を無視する
汎用のゼロショットモデルは汎用の言語を知っています。業界の専門用語は知りません。
医療用語、法律文書、金融の略語、エンジニアリング仕様などは、事前学習で目にしてはいるものの深くはありません。ICD-10コードやSQLエラーメッセージだらけの文を汎用ゼロショットモデルに分類させれば、結果はまちまちになるでしょう。
選択肢は2つあります。ラベルをモデルが理解しやすい平易な言葉に言い換えるか、そのドメインのテキストで事前学習されたモデルに切り替えるかです。医療ならBioBERT、金融ならFinBERTといったドメイン特化モデルは、専門的なタスクで汎用モデルを上回ることが多いです。
現代AIにおけるゼロショット分類の重要性
ゼロショット分類は、基盤モデルがAIの可能性をどう変えたかを最も明確に示す例のひとつです。
10年前、あらゆる分類タスクは「ラベル付きデータはあるか。ないならどう獲得するか?」から始まりました。アノテーションプロジェクトには数ヶ月、予算、ベンダー調整、品質管理が必要で、データが整うまでモデルは作れませんでした。
その前提は、もはや当てはまりません。
広範なテキストデータで学習した基盤モデルは、記述さえすれば新しい分類タスクに即応できるだけの言語理解をすでに持っています。定義すべきはラベルリストだけです。
この転換は、より大きなAIの潮流と結びつくいくつかの理由で重要です。
- 基盤モデルの本来の目的を示す: 大規模事前学習の狙いは、再学習なしに多様なタスクへ転用できる汎用モデルを作ることでした。ゼロショット分類は、その約束が具体化した代表例です。
- 教師ありデータセットへの依存を減らす: ラベル付きデータは今も有用ですが、動く分類器を作るための必須条件ではなくなりました。アノテーションに予算を割けないチームでも、価値のあるAI機能を展開できます。
- 展開スピードを変える: かつて四半期単位の工数が必要だった分類機能は、今や午後に試作できます。試すコストがほぼゼロになったことで、チームが選ぶ開発テーマにも影響します。
より広い流れとして、タスク特化モデルから汎用モデルへの移行があります。ファインチューニングにも、タスク次第ではスクラッチ学習にも出番はあります。しかし標準の出発点は変わりました。まず事前学習モデルに手を伸ばし、データがそれを正当化するときにだけ特化させるのです。
結論
ゼロショット分類は、もはやすべての機械学習課題に専用の学習が必要ではないことを思い出させてくれます。言語をすでに理解しているモデルは、与えるラベルを変えるだけで新しいタスクへと向け直せます。事例もファインチューニングも不要です。
この柔軟性こそが肝心です。今日重要なカテゴリが、来月も重要とは限りません。ゼロショットモデルなら、考えを変えても対応できます。
データのラベリングプロジェクトを始める前に、まずゼロショットでベースラインを動かしてください。タスクが解けるのか、部分的に解けるのか、重い手法がまだ必要なのか、午後には見えてきます。それだけの話です。
LLMが初めての方は、 Large Language Models (LLMs) Conceptsコースに登録してください。LLMアプリケーション、学習手法、最新研究について必要な知識をすべて学べます。
FAQs
ゼロショット分類をかんたんに言うと?
ゼロショット分類は、特定のラベルでモデルを学習させることなく、テキストにラベルを割り当てる方法です。モデルに入力と可能なカテゴリのリストを渡すと、事前学習で得た知識に基づいて最適なものを選びます。「ゼロ」は各カテゴリに必要な学習事例数を指し、その数がゼロであることを意味します。
自分でモデルを学習する代わりに、いつゼロショット分類を使うべき?
試行段階で使ってみたいとき、ラベル付きデータがないとき、カテゴリが頻繁に変わるとき、プロトタイプを素早く出荷したいときにゼロショットを使ってください。カテゴリ設計が定まっていない探索段階にも適しています。安定したラベル集合と十分なラベル付き事例があるなら、従来の分類器をファインチューニングしたほうが通常は精度が高くなります。
ゼロショット分類の精度はどれくらい?
精度は使用モデル、ラベルの明確さ、タスクが一般的な言語理解にどれだけ適合しているかに左右されます。定義が明確なタスクでは、ゼロショットでも実用レベルから本番投入レベルまで到達し得ますが、同じタスクで十分にラベル付きデータを用いて学習したファインチューニング済みモデルには、ほぼ常に及びません。ゼロショットは強力なベースラインとして扱ってください。
ゼロショット分類とNLIの違いは?
自然言語推論(NLI)は、一方の文が他方を含意するか、矛盾するか、中立かを判定するタスクです。ゼロショット分類は、その裏側のエンジンとしてNLIモデルを使います。入力は前提、各候補ラベルは仮説へと変換され、含意スコアが最も高い仮説のラベルが選ばれます。
英語以外のテキストでもゼロショット分類は使える?
はい、ただし多言語モデルが必要です。xlm-roberta-large-xnliのようなモデルは多言語NLIデータで学習されており、数十言語でゼロショット分類を扱えます。英語テキストにはbart-large-mnliなど英語専用モデルを、入力が英語以外なら多言語版へ切り替えてください。