<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>OOD on M1KE BL0G</title><link>https://www.m1ke.org/tags/ood/</link><description>Recent content in OOD on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><lastBuildDate>Wed, 22 Jul 2026 10:52:57 +0900</lastBuildDate><atom:link href="https://www.m1ke.org/tags/ood/index.xml" rel="self" type="application/rss+xml"/><item><title>分布外データを含む分類でFalse Positiveを抑える方法</title><link>https://www.m1ke.org/p/%E5%88%86%E5%B8%83%E5%A4%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%90%AB%E3%82%80%E5%88%86%E9%A1%9E%E3%81%A7false-positive%E3%82%92%E6%8A%91%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Wed, 22 Jul 2026 10:52:57 +0900</pubDate><guid>https://www.m1ke.org/p/%E5%88%86%E5%B8%83%E5%A4%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%90%AB%E3%82%80%E5%88%86%E9%A1%9E%E3%81%A7false-positive%E3%82%92%E6%8A%91%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;img src="https://www.m1ke.org/p/%E5%88%86%E5%B8%83%E5%A4%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%90%AB%E3%82%80%E5%88%86%E9%A1%9E%E3%81%A7false-positive%E3%82%92%E6%8A%91%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/distribution.jpg" alt="Featured image of post 分布外データを含む分類でFalse Positiveを抑える方法" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;機械学習モデルを利用したシステムの開発で、precisionを高める必要があった。&lt;/li&gt;
&lt;li&gt;特に、対象ではないデータをpositiveと誤判定するFalse Positive（FP）のコストが高かったた&lt;/li&gt;
&lt;li&gt;そのため、評価データ上でFPを発生させず、可能な限り高いrecallやcoverageを維持することを目標にした&lt;/li&gt;
&lt;li&gt;しかし、本番環境では入力がフリーフォームに近く、事前にすべての入力パターンを列挙したり、完全に制限したりすることは難しい&lt;/li&gt;
&lt;li&gt;なので、学習時に想定していなかった未知のデータ、すなわち分布外データに対する対策が必要になった&lt;/li&gt;
&lt;li&gt;この記事では、そのときに実施した対策と、それぞれの限界についてまとめる&lt;/li&gt;
&lt;li&gt;なお、有限の評価データでFPが0件だったとしても、将来のあらゆる入力に対してFPが発生しないことを保証できるわけではない&lt;/li&gt;
&lt;li&gt;本記事における「FPを抑える」とは、モデルとシステムの両面から誤判定のリスクを下げることを意味する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="用語"&gt;用語&lt;/h2&gt;
&lt;h3 id="ラベル"&gt;ラベル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;positive
&lt;ul&gt;
&lt;li&gt;判定対象であるデータに付ける正例ラベル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;negative
&lt;ul&gt;
&lt;li&gt;判定対象ではないデータに付ける負例ラベル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="idとood"&gt;IDとOOD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ID（In-Distribution）
&lt;ul&gt;
&lt;li&gt;学習時および運用時に想定している分布に属するデータ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OOD（Out-of-Distribution）
&lt;ul&gt;
&lt;li&gt;学習時に想定した分布から外れるデータ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;疑似OOD
&lt;ul&gt;
&lt;li&gt;外部データやデータ加工によって作成した、OODを模したデータ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NOTE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ID/OODとpositive/negativeは別の概念&lt;/li&gt;
&lt;li&gt;ID/OODは「想定した分布に属するか」を表し、positive/negativeは「判定対象であるか」を表す。したがって、IDのnegativeやOODのpositiveが存在する可能性もある&lt;/li&gt;
&lt;li&gt;実装上、OODをnegativeまたはNoneとして扱う場合があるが、概念として同一ではない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mining"&gt;Mining&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;mining
&lt;ul&gt;
&lt;li&gt;大量の候補から、学習に役立つデータを発掘すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;hard negative mining
&lt;ul&gt;
&lt;li&gt;現在のモデルがpositiveと誤判定しやすい負例を優先的に発掘すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ood検出"&gt;OOD検出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;入力が学習時に想定した分布の範囲内か、それとも分布外かを判定すること&lt;/li&gt;
&lt;li&gt;一般には、モデルや特徴量からOODスコアを算出し、しきい値を超えた入力をOODとして扱う&lt;/li&gt;
&lt;li&gt;ただし、IDとOODの境界は絶対的なものではなく、「何を想定範囲とするか」というタスクの定義にも依存する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="iid独立同分布"&gt;i.i.d.（独立同分布）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;データが互いに独立であり、同じ確率分布に従うという仮定のこと&lt;/li&gt;
&lt;li&gt;機械学習では、学習データと評価・運用データが同じ分布から生成されるという仮定を置くことが多い&lt;/li&gt;
&lt;li&gt;現実の運用環境では、時間、ユーザー、センサー、入力方法などの変化によって、この仮定が崩れることがある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="内挿と外挿"&gt;内挿と外挿&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内挿（interpolation）
&lt;ul&gt;
&lt;li&gt;学習データが十分に存在する領域における予測&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;外挿（extrapolation）
&lt;ul&gt;
&lt;li&gt;学習データがほとんど存在しない領域における予測&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;学習域
&lt;ul&gt;
&lt;li&gt;学習データが分布している領域を指す非形式的な表現&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多次元データでは、各特徴量が単独では学習時の範囲内でも、特徴量の組み合わせとしては学習データから大きく外れていることがある。&lt;/p&gt;
&lt;p&gt;なお、外挿とOODは関係が深いが、必ずしも同じ概念ではない。&lt;/p&gt;
&lt;h2 id="分布シフト"&gt;分布シフト&lt;/h2&gt;
&lt;h3 id="機械学習モデルの前提と問題"&gt;機械学習モデルの前提と問題&lt;/h3&gt;
&lt;p&gt;教師あり機械学習モデルは一般に、学習データから得た統計的な関係が評価時や運用時にも成立することを期待して学習される。&lt;/p&gt;
&lt;p&gt;しかし、現実の運用環境では次のような理由でデータ分布が変化する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データの収集方法が変わる&lt;/li&gt;
&lt;li&gt;ユーザー層が変わる&lt;/li&gt;
&lt;li&gt;撮影環境やセンサーが変わる&lt;/li&gt;
&lt;li&gt;時間の経過によって対象の性質が変わる&lt;/li&gt;
&lt;li&gt;学習データの選び方に偏りがある&lt;/li&gt;
&lt;li&gt;データ生成メカニズムそのものが変わる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このような学習時と運用時の分布の違いを、分布シフトと呼ぶ。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E5%88%86%E5%B8%83%E5%A4%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%90%AB%E3%82%80%E5%88%86%E9%A1%9E%E3%81%A7false-positive%E3%82%92%E6%8A%91%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/shift.png"
width="1536"
height="524"
srcset="https://www.m1ke.org/p/%E5%88%86%E5%B8%83%E5%A4%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%90%AB%E3%82%80%E5%88%86%E9%A1%9E%E3%81%A7false-positive%E3%82%92%E6%8A%91%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/shift_hu_41a43bf2ed4e261b.png 480w, https://www.m1ke.org/p/%E5%88%86%E5%B8%83%E5%A4%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%90%AB%E3%82%80%E5%88%86%E9%A1%9E%E3%81%A7false-positive%E3%82%92%E6%8A%91%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/shift_hu_6f7e4c04a0ed0b87.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="293"
data-flex-basis="703px"
&gt;&lt;/p&gt;
&lt;h3 id="主なデータセットシフト"&gt;主なデータセットシフト&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;シフト&lt;/th&gt;
&lt;th&gt;変化するもの&lt;/th&gt;
&lt;th&gt;不変と仮定するもの&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Covariate Shift&lt;/td&gt;
&lt;td&gt;$P(x)$&lt;/td&gt;
&lt;td&gt;$P(y \mid x)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Label Shift&lt;/td&gt;
&lt;td&gt;$P(y)$&lt;/td&gt;
&lt;td&gt;$P(x \mid y)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concept Shift&lt;/td&gt;
&lt;td&gt;$P(y \mid x)$&lt;/td&gt;
&lt;td&gt;一般には特に定まらない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;他にも、次のような表現が使われる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;用語&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Domain Shift&lt;/td&gt;
&lt;td&gt;撮影環境、計測方法、データセット、利用環境などのドメインが変化すること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sample Selection Bias&lt;/td&gt;
&lt;td&gt;データの選択方法や収集方法によって、観測された分布に偏りが生じること&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;例えば、道路画像が昼から夜に変化するケースはDomain Shiftに当たる&lt;/li&gt;
&lt;li&gt;これによって$P(x)$が変化し、$P(y \mid x)$が変わらないと仮定できる場合はCovariate Shiftとしても扱える&lt;/li&gt;
&lt;li&gt;実際のシステムでは、複数の種類のシフトが同時に発生することもある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="評価指標"&gt;評価指標&lt;/h2&gt;
&lt;p&gt;False Positiveを議論するときは、precisionとFalse Positive Rateを区別する必要がある。&lt;/p&gt;
&lt;p&gt;$$
\mathrm{Precision} = \frac{TP}{TP + FP}
$$&lt;/p&gt;
&lt;p&gt;$$
\mathrm{FPR} = \frac{FP}{FP + TN}
$$&lt;/p&gt;
&lt;p&gt;NOTE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;precisionは、モデルがpositiveと判定したもののうち、実際にpositiveだった割合を表す&lt;/li&gt;
&lt;li&gt;FPRは、実際にはnegativeだったデータのうち、誤ってpositiveと判定された割合を表す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、すべての入力をnegativeまたは棄却にすれば、FPを0件にすること自体はできる。そのため、安全性を評価する際にはFPだけでなく、recallやcoverageも同時に確認する必要がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;recall
&lt;ul&gt;
&lt;li&gt;実際のpositiveをどの程度検出できたか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;coverage
&lt;ul&gt;
&lt;li&gt;全入力のうち、棄却せず自動判定できた割合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;selective risk
&lt;ul&gt;
&lt;li&gt;棄却せず受理した予測における誤り率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="対処方法"&gt;対処方法&lt;/h2&gt;
&lt;h3 id="そもそもデータセットの確認"&gt;そもそもデータセットの確認&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;traindataが一部間違っていた結果精度がでずに。。。ということもおうおうにしてある&lt;/li&gt;
&lt;li&gt;ゴミを入れたらゴミがでるだけなので、そこのCheckを先にするべき&lt;/li&gt;
&lt;li&gt;それをし終わった後に、モデルのパラメーター増やすなどの改善フローに入れる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="クラスの定義を絞る"&gt;クラスの定義を絞る&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;精度が低いものに対して、データ量を増やして曖昧な境界線を学習させるのではなく、クラス自体の範囲を狭める&lt;/li&gt;
&lt;li&gt;クラスの判定対象を狭め、クラス間の境界が太くなるようにモデルの設計をする&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="userの入力を狭める"&gt;Userの入力を狭める&lt;/h3&gt;
&lt;p&gt;任意の入力を完全に扱うという要件を見直し、システムが対応する入力の範囲を明確にした。&lt;/p&gt;
&lt;p&gt;例えば、次のような条件を定義する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;対応するデータ形式&lt;/li&gt;
&lt;li&gt;対応するクラス&lt;/li&gt;
&lt;li&gt;必要な画像品質&lt;/li&gt;
&lt;li&gt;許可するユーザーや利用環境&lt;/li&gt;
&lt;li&gt;モデルが判定してよい状況&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ユーザーごとに対象データを登録または学習し、その範囲だけを判定対象にする方法も考えられる。&lt;/p&gt;
&lt;p&gt;機械学習モデルの改善だけで安全性を確保しようとせず、モデルが動作してよい範囲をシステム側で定義することが重要だった。&lt;/p&gt;
&lt;h3 id="ゲート処理"&gt;ゲート処理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ブラックリスト方式ですべての不正入力を列挙するのではなく、条件を満たした入力だけを許可するホワイトリスト方式のゲートを設けた&lt;/li&gt;
&lt;li&gt;ゲート処理によって、OODや不適合入力が分類モデルまで到達する可能性を減らせる。その結果、False Positiveを抑えやすくなる&lt;/li&gt;
&lt;li&gt;一方で、本来はpositiveである入力まで棄却するとFalse Negativeが増える&lt;/li&gt;
&lt;li&gt;そのため、ゲートの厳しさとcoverageのトレードオフを評価する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="noneクラスを追加する"&gt;Noneクラスを追加する&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;低い確信度を単純に棄却するだけでなく、明示的なNoneまたはOtherクラスを追加した&lt;/li&gt;
&lt;li&gt;これにより、モデルは既知のpositiveクラスだけでなく、学習時に与えた負例をNoneとして識別できるようになる&lt;/li&gt;
&lt;li&gt;ただし、Noneクラスを追加しても、あらゆる未知入力を識別できるわけではない&lt;/li&gt;
&lt;li&gt;学習に使用した負例や、それに近いOODには有効でも、まったく異なる未知入力に対して誤って高い確信度を出す可能性は残る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、$K+1$クラスのsoftmax分類では、あるクラス$k$について次の関係がある。&lt;/p&gt;
&lt;p&gt;$$
1-p_k = p_{\mathrm{None}} + \sum_{j \ne k,\mathrm{None}} p_j
$$&lt;/p&gt;
&lt;p&gt;したがって、$p_{\mathrm{None}}$は「他の既知クラスではなくNoneらしい」という情報を持つが、&lt;strong&gt;$1-p_k$と独立した別の確率ではない&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;二値分類の場合は、原則として次のようになる。&lt;/p&gt;
&lt;p&gt;$$
p_{\mathrm{None}} = 1-p_{\mathrm{positive}}
$$&lt;/p&gt;
&lt;h3 id="負例をepochごとに入れ替える"&gt;負例をepochごとに入れ替える&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Noneクラスとして利用できる負例が大量にある場合、各epochで異なる負例をサンプリングした&lt;/li&gt;
&lt;li&gt;これにより、Noneクラスの件数を極端に増やさずに、多様な負例をモデルへ提示できる&lt;/li&gt;
&lt;li&gt;ただし、epochごとにランダムに入れ替えるだけではhard negative miningとは限らない&lt;/li&gt;
&lt;li&gt;現在のモデルが高いpositiveスコアを出した負例を優先的に選ぶ場合に、hard negative miningと呼べる&lt;/li&gt;
&lt;li&gt;また、学習時のクラス比率を変えること自体は禁止ではない&lt;/li&gt;
&lt;li&gt;クラス比率、サンプリング方法、クラス重みは、precision、recall、確率校正に影響するため、目的に合わせて検証する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="oodスコアを算出する"&gt;OODスコアを算出する&lt;/h3&gt;
&lt;p&gt;分類モデルのsoftmax確率だけでなく、入力が分布外である可能性を表すOODスコアを算出した。&lt;/p&gt;
&lt;p&gt;OODスコアとしては、例えば次のようなものがある:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maximum Softmax Probability&lt;/li&gt;
&lt;li&gt;Energy Score&lt;/li&gt;
&lt;li&gt;特徴空間における学習データからの距離&lt;/li&gt;
&lt;li&gt;複数モデル間の予測の不一致&lt;/li&gt;
&lt;li&gt;OOD検出専用モデルの出力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OODスコアにしきい値を設定し、しきい値を超えた入力をOut of Scopeとして棄却する。&lt;/p&gt;
&lt;p&gt;ただし、OODスコアは必ずしもOODである確率ではない。また、学習分布から明確に離れたfar-OODは検出できても、IDに近いnear-OODは検出が難しい場合がある。&lt;/p&gt;
&lt;h3 id="判定しきい値を上げる"&gt;判定しきい値を上げる&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;positiveと判定するしきい値を上げる方法は、False Positiveを抑えるための単純で有効な方法である&lt;/li&gt;
&lt;li&gt;一般には、しきい値を上げるとprecisionは上がりやすくなるが、recallとcoverageは下がる&lt;/li&gt;
&lt;li&gt;また、DNNは未知入力に対しても高いsoftmaxスコアを出すことがある。そのため、分類確率のしきい値だけに依存せず、OODスコアやゲート処理と組み合わせる必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="相対的な確信度を利用する"&gt;相対的な確信度を利用する&lt;/h3&gt;
&lt;p&gt;一つのクラスの確信度だけでなく、複数クラス間のスコアを比較した。&lt;/p&gt;
&lt;p&gt;例えば、次のような値を利用できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Top-1とTop-2の確率差&lt;/li&gt;
&lt;li&gt;Top-1とTop-2のlogit差&lt;/li&gt;
&lt;li&gt;予測分布のエントロピー&lt;/li&gt;
&lt;li&gt;複数モデル間の予測のばらつき&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同じTop-1確率でも、他のクラスと僅差の場合と、一つのクラスだけが突出している場合では意味が異なる。&lt;/p&gt;
&lt;p&gt;ただし、相対的な確信度は主に既知クラス間の曖昧さを表す指標であり、それだけでOODを検出できるわけではない。OOD入力に対して一つのクラスが突出することもある。&lt;/p&gt;
&lt;h3 id="アンサンブルで判定する"&gt;アンサンブルで判定する&lt;/h3&gt;
&lt;p&gt;複数のモデルを利用し、予測結果やモデル間の不一致を判定材料にした。&lt;/p&gt;
&lt;p&gt;例えば、次のような方法が考えられる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数モデルの平均確率を使う&lt;/li&gt;
&lt;li&gt;すべてのモデルがpositiveと判定した場合だけ受理する&lt;/li&gt;
&lt;li&gt;モデル間の予測分散が大きい場合は棄却する&lt;/li&gt;
&lt;li&gt;異なる特徴や学習データを使ったモデルを組み合わせる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アンサンブルは予測性能や不確実性推定を改善する可能性がある。&lt;/p&gt;
&lt;p&gt;ただし、複数モデルが同じ学習データや特徴に依存している場合、同じ入力に対して同時に誤る可能性がある。アンサンブルだけで安全性を保証できるわけではない。&lt;/p&gt;
&lt;h3 id="selective-classification"&gt;Selective Classification&lt;/h3&gt;
&lt;p&gt;確信度が不十分な場合に、モデルが無理に分類せず棄却できる仕組みを追加した。&lt;/p&gt;
&lt;p&gt;棄却された入力については、次のようなフローへ移す。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザーに確認する&lt;/li&gt;
&lt;li&gt;管理者によるレビューへ送る&lt;/li&gt;
&lt;li&gt;より高精度なモデルで再判定する&lt;/li&gt;
&lt;li&gt;安全側のデフォルト処理を実行する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これはSelective ClassificationまたはClassification with a Reject Optionと呼ばれる考え方に近い。&lt;/p&gt;
&lt;p&gt;棄却を増やせば受理した予測の精度は高めやすいが、自動処理できるcoverageは下がる。そのため、誤り率とcoverageの両方を評価する必要がある。&lt;/p&gt;
&lt;p&gt;また、ユーザーへの確認を追加しても、ユーザー自身が正解を判断できなければ安全性は保証されない。誰が何を根拠に確認するかまで設計する必要がある。&lt;/p&gt;
&lt;h3 id="タスクに適したモデルへ変更する"&gt;タスクに適したモデルへ変更する&lt;/h3&gt;
&lt;p&gt;分類対象同士の違いが細かい場合は、Fine-grained classificationに適したモデルや学習方法を採用する。&lt;/p&gt;
&lt;p&gt;例えば、車とペットボトルのような上位カテゴリ間の分類に比べ、タカとワシのように同じ上位カテゴリ内の下位カテゴリを区別する分類では、細かな局所特徴が重要になる。&lt;/p&gt;
&lt;p&gt;この場合、次のような方法が考えられる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高解像度の入力を使う&lt;/li&gt;
&lt;li&gt;局所特徴や部位に注目するモデルを使う&lt;/li&gt;
&lt;li&gt;Metric LearningやContrastive Learningを使う&lt;/li&gt;
&lt;li&gt;階層分類を行う&lt;/li&gt;
&lt;li&gt;タスク専用の特徴抽出器を利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fine-grained classificationへの対応は既知クラス間の識別性能を改善する方法であり、それ自体がOOD対策になるわけではない。&lt;/p&gt;
&lt;h3 id="事前確率を考慮する"&gt;事前確率を考慮する&lt;/h3&gt;
&lt;p&gt;クラスの発生頻度が学習時と運用時で異なる場合、運用環境の事前確率を考慮する方法がある。&lt;/p&gt;
&lt;p&gt;Label Shiftを仮定できる場合、推論結果は次のように補正できる。&lt;/p&gt;
&lt;p&gt;$$
P_{\mathrm{test}}(y \mid x)
\propto
P_{\mathrm{train}}(y \mid x)
\frac{P_{\mathrm{test}}(y)}
{P_{\mathrm{train}}(y)}
$$&lt;/p&gt;
&lt;p&gt;ただし、この補正は主に次の仮定が成立する場合に利用できる。&lt;/p&gt;
&lt;p&gt;$$
P_{\mathrm{test}}(x \mid y) = P_{\mathrm{train}}(x \mid y)
$$&lt;/p&gt;
&lt;p&gt;運用環境の事前確率を正しく推定できない場合や、Concept Shiftも発生している場合には、単純な補正が逆効果になる可能性がある。&lt;/p&gt;
&lt;p&gt;また、False PositiveとFalse Negativeのコスト差を反映したい場合は、事前確率補正とは分けて、コストを考慮した判定しきい値を設計する。&lt;/p&gt;
&lt;h3 id="転移学習を利用する"&gt;転移学習を利用する&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;大規模データで事前学習されたモデルを利用し、対象タスクへFine-tuningする&lt;/li&gt;
&lt;li&gt;事前学習によって得られた汎用的な表現は、限られた学習データだけで一から学習する場合よりも、分類性能や分布シフトへの頑健性を改善する可能性がある&lt;/li&gt;
&lt;li&gt;LLMにおけるLoRAは、事前学習済みモデルを少ない追加パラメータでFine-tuningするParameter-Efficient Fine-Tuningの一手法である。LoRA自体が転移学習と同義というわけではない&lt;/li&gt;
&lt;li&gt;また、転移学習を行ってもOODを必ず検出できるわけではないため、OODスコアや棄却処理とは別に考える必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="運用中の監視と再学習"&gt;運用中の監視と再学習&lt;/h3&gt;
&lt;p&gt;開発時に想定できなかった入力は、運用開始後にも発生する。&lt;/p&gt;
&lt;p&gt;そのため、次の情報を継続的に収集する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;棄却された入力&lt;/li&gt;
&lt;li&gt;高い確信度で誤判定した入力&lt;/li&gt;
&lt;li&gt;モデル間で判定が分かれた入力&lt;/li&gt;
&lt;li&gt;ユーザーが訂正した入力&lt;/li&gt;
&lt;li&gt;時間経過による入力分布の変化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;収集したデータからhard negativeを発掘し、評価データの追加や再学習に利用する。&lt;/p&gt;
&lt;p&gt;ただし、同じデータをしきい値調整と最終評価の両方に使うと、性能を過大評価する可能性がある。学習用、検証用、最終評価用のデータは分ける必要がある。&lt;/p&gt;
&lt;h3 id="信頼度をキャリブレーション"&gt;信頼度をキャリブレーション&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分類器が出力する信頼度 (confidence) が、分類結果が真に正しい可能性を表すように補正する&lt;/li&gt;
&lt;li&gt;これを、信頼度キャリブレーション (confidence calibration) と呼ぶ&lt;/li&gt;
&lt;li&gt;つまり、AIや自動化システムへの信頼を、そのシステムの実際の当たりやすさに近づけていく手法&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="評価方法"&gt;評価方法&lt;/h2&gt;
&lt;p&gt;OOD対策は、単一のテストデータだけで評価しないほうがよい。&lt;/p&gt;
&lt;p&gt;例えば、次のように評価データを分ける。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IDのpositive&lt;/li&gt;
&lt;li&gt;IDのnegative&lt;/li&gt;
&lt;li&gt;IDに近いnear-OOD&lt;/li&gt;
&lt;li&gt;IDから明確に離れたfar-OOD&lt;/li&gt;
&lt;li&gt;実際の運用ログから作ったデータ&lt;/li&gt;
&lt;li&gt;時期、ユーザー、環境などで分けたデータ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;確認する指標には次のようなものがある。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;対象&lt;/th&gt;
&lt;th&gt;主な指標&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;通常の分類&lt;/td&gt;
&lt;td&gt;Precision、Recall、FPR、F1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OOD検出&lt;/td&gt;
&lt;td&gt;AUROC、AUPR、FPR@95TPR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;棄却を含む分類&lt;/td&gt;
&lt;td&gt;Coverage、Selective Risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安全性&lt;/td&gt;
&lt;td&gt;受理した予測におけるFP件数・FP率と信頼区間&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;しきい値は検証データで決定し、最終評価データを確認してから変更しないことも重要である。&lt;/p&gt;
&lt;p&gt;評価データ上でFPが0件だった場合も、「観測されたFPが0件だった」と表現し、将来のFPが0であると断定しない。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ID/OODとpositive/negativeは別の概念として扱う必要がある&lt;/li&gt;
&lt;li&gt;DNNは未知入力に対しても高い確信度を出すことがあるため、分類確率のしきい値だけでは十分ではない&lt;/li&gt;
&lt;li&gt;False Positiveを抑えるには、入力ゲート、Noneクラス、疑似OOD、hard negative mining、OODスコア、アンサンブル、棄却などを組み合わせる必要がある&lt;/li&gt;
&lt;li&gt;Noneクラスや転移学習は有効な場合があるが、単独で未知入力全般に対応できるわけではない&lt;/li&gt;
&lt;li&gt;安全性が重要なシステムでは、確信度が不十分な入力を無理に分類せず、人間による確認や安全側の処理へ移す設計が重要である&lt;/li&gt;
&lt;li&gt;有限の評価データから、将来のあらゆる入力に対するFP 0件を保証することはできない&lt;/li&gt;
&lt;li&gt;FPだけを減らすとrecallやcoverageが低下するため、これらのトレードオフも評価する必要がある&lt;/li&gt;
&lt;li&gt;OODへの対処は単一のモデルや手法で完結するものではなく、入力制約、モデル、棄却、監視、再学習を含むシステム全体で設計する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OOD対策の本質は、すべての入力を無理に分類することではなく、モデルが判断してよい範囲を定め、判断できない入力を安全に棄却すること。&lt;/p&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/1610.02136" target="_blank" rel="noopener"
&gt;A Baseline for Detecting Misclassified and Out-of-Distribution Examples in Neural Networks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/1812.04606" target="_blank" rel="noopener"
&gt;Deep Anomaly Detection with Outlier Exposure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://papers.nips.cc/paper/2020/hash/f5496252609c43eb8a3d147ab9b9c006-Abstract.html" target="_blank" rel="noopener"
&gt;Energy-based Out-of-distribution Detection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2006.15207" target="_blank" rel="noopener"
&gt;ATOM: Robustifying Out-of-distribution Detection Using Outlier Mining&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://papers.nips.cc/paper_files/paper/2017/hash/9ef2ed4b7fd2c810847ffa5fa85bce38-Abstract.html" target="_blank" rel="noopener"
&gt;Simple and Scalable Predictive Uncertainty Estimation using Deep Ensembles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://papers.nips.cc/paper/2019/hash/8558cb408c1d76621371888657d2eb1d-Abstract.html" target="_blank" rel="noopener"
&gt;Can You Trust Your Model&amp;rsquo;s Uncertainty? Evaluating Predictive Uncertainty Under Dataset Shift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://proceedings.mlr.press/v97/geifman19a" target="_blank" rel="noopener"
&gt;SelectiveNet: A Deep Neural Network with an Integrated Reject Option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://proceedings.mlr.press/v80/lipton18a" target="_blank" rel="noopener"
&gt;Detecting and Correcting for Label Shift with Black Box Predictors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2406.14551" target="_blank" rel="noopener"
&gt;Advancing Fine-Grained Classification by Structure and Subject Preserving Augmentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://iblog.ridge-i.com/entry/2021/03/10/110000" target="_blank" rel="noopener"
&gt;トップカンファレンスにおけるデータセットシフトと機械学習&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>