画像の機械学習が劣化する理由

## 前書き
注意：ここに書いていることは2020年代としては、古すぎる見解になっている。

近年の自己教師あり学習の大幅な進展で、ここで述べているようなアプローチは大幅に古めかしいものになっている。
・自己教師あり学習の進展は、画像認識タスクに対する共通のbackbone を作り出しており、後段で個々の画像認識タスクに対するfine-tuningをするアプローチに変わってきている。
・そのため、ラベル付きの限られたデータで特徴量の抽出をしていたのが、自己教師あり学習に基づく特徴量の抽出になっている。
・各人、自己教師あり学習について調べることをお勧めする。

----

## 主旨
　単純に学習データを追加するだけでは学習が改善しないことがある。そのような場合へのヒントを著者の限られた経験の中から記述する。

## はじめに
画像認識の機械学習を改善するためにはデータを追加すればよい。
そう思っている人が大半だろう。

ただ、**データを追加したからといって必ずしも機械学習結果は改善しないことがある。**
品質の悪いデータ（画像とアノテーション）を与えれば、学習結果が劣化することは理解しやすい。それどころか、間違ったアノテーションのデータを与えていないはずなのに、データの追加によって、学習結果が悪化してしまうことは、わりと簡単に起こる。

この文章では、品質が悪くないデータ（画像とアノテーション）を与えても、機械学習結果が劣化することがあることについて、個人的な経験に基づいて述べる。この文章では、どのような原因で学習が劣化してしまうのかの例を示します。
個人的な経験の範囲で、それに対する対策案を示しますので、読者の方は、それをヒントに自力で解決方法を模索してみてください。

## 原則：機械学習アルゴリズムは、データの分布の影響を受ける。
## 原則：機械学習アルゴリズムは、データの平均の影響を受けることがある。
- 例：顔照合アルゴリズムは、使用しているデータセットでの平均顔の影響を受けることがある。
- 固有顔を用いる顔照合のアルゴリズムでは、平均顔からの残差を固有顔に展開する。そのため平均顔という形で、使用しているデータセットのデータの分布の影響を受ける。
- その結果、顔照合アルゴリズムは、西洋人を得意とする顔照合ライブラリでは東洋人の精度がでなく、東洋人を得意とする顔照合ライブラリでは、西洋人を苦手とすることがわかっている。
- これは、ヒトによる顔照合でも、見慣れていない人種・民族の人の顔照合は簡単じゃないことにも共通している。

## 原則：機械学習では、ポジティブサンプルに共通性の高い特徴が選ばれる。それが本質的な内容でなくても。
- 例:サッカー場でサッカー選手の人検出を学習させるとしよう。そうすると背景の芝生を学習してしまう。

## 原則：簡単に分類できてしまえば、細かい特徴を使ってまで分類の学習を進めようとは働かない。

## 原則:人にとっても紛らわしいものは、機械学習にとっても紛らわしいものである可能性が高い。紛らわしいものを学習データに加えないほうが、学習が安定して進みやすい。

## 原則：学習での損失関数には、データによる積算という形で、データの分布の影響を受ける。
- どのようなデータに対して学習の最適化をするのかで、学習結果が影響を受ける。出現頻度が高いデータに対しては、学習が進行しやすいが、出現頻度が少ないと、そのデータに対しては学習が進行しにくい。ある見え方のデータに対して学習を進行させようとするならば、その見え方のデータの比率を増やしていくことが必要になる。また、そのような見え方のデータを増やしていくと、その見え方での学習が進展しやすい。

### 原則：機械学習のアルゴリズム・機械学習で使用する特徴量によっては、学習できる内容に限界があることがある。
そのような場合、学習データの追加によって、学習が破綻することがある。そのようなアルゴリズム・特徴量である場合には、特徴量やアルゴリズムを見直すことが効果的である。


### 原則：高すぎる自由度の学習アルゴリズムでは、少ないデータセットでは学習しきれないことがある。学習アルゴリズムの自由度を減らした方が学習結果が改善することがある。

例：SVMでの学習の場合には、入力データを主成分分析を実施して、上位の主成分の比率のベクトルを用いて、学習を行うことが多い。

[SVMについて調べてみる](https://qiita.com/nonbiri15/items/3b0440a95e61f134413d)


### 原則：データを2分してtrain, testとして評価するだけでは不十分である。検証用のデータを別に用意する必要がある。

同じデータセットを2分してtest, train として評価すると、似通ったデータが両方にあるために、それなりによい結果になることがある。しかし未知のデータセットに対して評価を実施すると散々な結果になることがある。予め、検証用のデータをとっておいて、train, testのどちらにも含めないようにすることだ。検証用のデータを使って事前に確認しないと、本番のリリース後に性能が出ないことになってしまう。

### 原則：その分野での先験的な知識による絞り込み、先験的な知識を反映した特徴量の選択が、学習に効果的な場合がある。

### 原則：間違えたラベリングは学習データにつきもの。よい学習アルゴリズムならば、ラベリングを間違えている可能性の高いものを見つけ出すことができる。

例：サポートベクターマシンの場合、学習時に間違いを許容する度合いをマージンのとり方で指定できる。学習時の間違いを許容しないものでは、無理やり高すぎる自由度の中で損失関数を最小化する。そのため、不自然な結果で学習をしてしまう。
一方、よい学習アルゴリズムでは、不自然な学習結果にならないように、正則化がはたらいていて、間違ったラベリングの結果の影響を影響を低減することができる。だから、そのようなアルゴリズムを選択することである。

### 原則：自由度が高いモデルでは、ポジティブデータの多様性を十分に高めることが必要になる。そのためには、加工データ、CGデータ、GANなどでの作成データを学習用のポジティブに加えなくてはならないことがある。

### 原則：検出や分類などの学習がほんとうに上手くいっているのかを見るには、単一の指標では不十分である。データの特徴ごとに学習後の評価をすることで、学習の弱点を見つけて性能の向上ができる。

### 原則：再現率が低い場合には、ポジティブサンプルを増やす。適合率が低い場合には、ネガティブサンプルを増やす。

## このような原則の結果から言えること

考えもなしに学習データを単純に加えることは、時として次のような結果をもたらしやすい。

- 本質に関わる要因ではなく、たまたま学習データに共通に見られる特徴に基づいて、いっけん学習できたように見えても、実は本番のデータを入力させたときには、散々な結果になるということが起こりうる。
機械学習のアルゴリズムについての書籍は多数あるが、そのための学習データの品質を確保するには何をどうすれば良いのかを書いた書籍はほとんど存在しない。
- 機械学習結果を引き継いで、性能を高めることを要望されても、学習データの品質を高めるためには何をどうすればよいのかの経験がとぼしいと、学習データを増強したのに、学習結果が劣化することを目にすることになる。

## 生じうる事例と対策へのアドバイス

### 事例：簡単すぎるポジティブサンプルが多すぎると、難しめのサンプルを分類できなくなる。

- 対策：十分にスコアが高く検出できているポジティブサンプルは、学習に加えなくてよい。それらを除外して学習させても学習できることが多い。
- 
### 事例：紛らわしすぎるネガティブサンプルが多すぎると、ポジティブサンプルの再現率が低下する。

- 対策１：そのネガティブサンプルを間違えてしまったときの損失が大きくなければ、ネガティブサンプルから除外しよう。
- 例：写実的な人のイラストがあったら、人検出用のネガティブサンプルには含めない（塗りつぶす・もしくはポジティブサンプルとしてアノテーションを加える。）
- 対策２：ネガティブサンプルをきちんと推論結果に反映できているとらえる。ポジティブサンプルを十分に増やしていけば、ポジティブサンプルの再現率が改善する。

### 事例：同一の背景の画像を多数含めてしまうと、対象物ではなく背景の特徴を学習してしまう。
背景差し替え画像を学習に加えるのがよい。
### 事例：限られた環境でのデータだけを多数増加させると、その環境に対してだけ過学習してしまって、他の環境での性能が低下してしまう。

### 事例：主成分分析を前処理に用いている機械学習の場合、学習データの平均と違ってくるデータセットを入力とすると、とたんに性能が低下することがある。
　例：西洋人の比率が高い顔照合ライブラリは、東洋人に対して性能が出にくいことがある。
対策：簡単な回避方法を見出していない。

### 単純に学習データを増やすだけのアプローチでは、学習時間の著しい増大・使用メモリ量の爆発的な増大・推論時間の増大をもたらすことがある。
 f1スコアの値を数ポイント増大させるために、学習データを増強させることがある。学習アルゴリズムによっては、使用メモリ量の大幅な増加・推論時間の増加によって、割が合わなくなる場合がある。

- 対策１：データの追加だけしてデータの総数を増やしているけれども、データをリサンプリングして、データの分布はそのままに、データ数減らしても十分な学習ができることがある。そのような場合だと、使用メモリの大幅な増加・推論時間の増加を食い止めることができる。
- 対策２：データ拡張によって学習データを増やしている場合、データ拡張の条件を見直して、データ拡張後のデータの総数を増やさないようにする。
- 対策３：異なるアルゴリズムの利用
学習アルゴリズムによっては、学習データを全てメモリに格納するタイプのアルゴリズムがある。その1例はサポートベクターマシンだ。サポートベクターマシンは、データの数が多くなるとメモリの使用量が多くなりすぎて、実行が遅くなったり、そのままでは実行できなくなることがある。
　そのようにデータの量が大量にあるときは、別のアルゴリズムを使うことも視野に入れたほうがよい。scikit-learnにはさまざまなアルゴリズムがあるから、別のアルゴリズムも試してみよう。さいわい、scikit-learnは、異なるアルゴリズムも同じインタフェースで学習と推論ができるライブラリになっている。




機械学習のアルゴリズムが、たくさんのOpen source の実装として公開されていて、訓練済みのモデルも公開されている。にもかかわらず、自分の用途のためには、既存の実装では不十分なことがある。
　既存の学習で利用しているデータセットと、目的としているドメインのデータセットでデータの分布に違ってくる。
　機械学習では、大半の労力が、学習をするためのデータと検証するためのデータの収集・アノテーションの付与・管理に費やされる。(半教師あり学習、自己教師あり学習などに移行できていればいいが、そういうフェーズに移行するためにも、まず最初の学習を作るためのデータの収集・アノテーションの付与は避けられない。)


## データの影響は、使用する学習アルゴリズム・またその中で使用するハイパーパラメータによって異なる。

### 例：Haar-Cascade検出器の場合
Viola-Jonesの顔検出で有名なアルゴリズムにHaar-Cascade検出器がある。[OpenCVの顔検出器](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html) として知られている。
Adaboostと呼ばれるアルゴリズムを使用している。
推論時には、候補領域の画像に対して、各段の強判別器を通していくたびに、非顔判定がなされていく。最終段の強判別器でも残ったものが顔とするものだ。
学習時には、ある段の強判別器を学習するには、顔のポジティブサンプルとその前の段の強判別器での推論を通過したネガティブサンプルとで学習される。そのため、後段の強判別器の学習になれば、ピックアップされるネガティブサンブルが少なくなっていく。そのネガティブサンプルが、それより前段の強判別器の学習結果に強く依存している。
　そのため、大量に背景画像群を用意したつもりでも、後段の強判別器の学習に使われる画像はとても偏ったピックアップされたネガティブサンプルになってしまっている。

[「AdaBoostはノイズの多いデータや異常値に影響を受ける。」](https://ja.wikipedia.org/wiki/AdaBoost#:~:text=AdaBoost%E3%81%AF%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%AE%E5%A4%9A%E3%81%84%E3%83%87%E3%83%BC%E3%82%BF%E3%82%84%E7%95%B0%E5%B8%B8%E5%80%A4%E3%81%AB%E5%BD%B1%E9%9F%BF%E3%82%92%E5%8F%97%E3%81%91%E3%82%8B%E3%80%82)とある。

実際、背景画像群の中に見逃していた顔画像が存在すると、特定の段の強判別器の学習データにピックアップされたネガティブサンプルの中に顔画像が紛れ込んでしまう。そのような紛れ込んでしまった顔画像が、ネガティブサンプルに分類されるように強判別器は学習されてしまう。その結果、検出の再現率が低下してしまう。

このため、実用となる学習を作り上げるためには、そのようなデータを見つけたら、元の背景画像群を修正して、顔を塗りつぶしておく必要がある。

### 例：初期の人検出器で使われたHOG-SVMの人検出器の場合
深層学習以前の人検出器にはHOG特徴量を用いたSVM（サポートベクターマシン）の検出器がある。
サポートベクターマシンの利点：
 ポジティブサンプルとネガティブサンプルとを分離できればよいとするだけではなく、ポジティブサンプルとネガティブサンプルとの境界面の距離をなるべく広く確保しようとする仕組みがあること。
　このため、他のアルゴリズムに比べれば少ないデータで、学習の性能が確保されやすいと言われている。
　また、サポートベクターマシンでは、誤分類をどう損失関数に含めるのかを指定するのかCostパラメータ（もしくは、Regularization parameter）があります。
　これを調整することで、混入してしまったネガティブサンプルの影響を低減させることができます。

また、SVMの場合には、主成分分析によって、入力データの次元を予め減らしておくという手法が用いられることが多くあります。
　この場合、主成分分析をすることによって、寄与率の高いベクトルが選び出されることによって、偶発的なノイズデータの影響を受けにくくなるという利点があります。
　深層学習が広く用いられる時代ですが、SVMはいぜん有用な手法です。　

サポートベクターマシンでのハイパーパラメータの最適化の方法は、grid searchによって行われたりしています。

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html

https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/#grid_parameter_search_for_regression

### サーポートベクターマシンで、少数派のクラスの精度を改善するには
分類問題で、少数派のデータに対しては分類精度がでなくなりがちです。これは、どの機械学習の枠組みでも生じる問題です。ただ、SVMの場合には、class_weightを設定することによって、そのクラスに対する損失関数での重みを調整することによって、少数派のデータに対する分類の精度を保ちやすい仕組みが用意されています。
https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

### 例：深層学習の場合
深層学習といえども、学習データの与え方しだいによっては、学習結果が劣化することがあります。

- 損失関数の定義には、学習時のデータセットが入ります。
- 少数派のデータは、損失関数での比率が低くなる。
- 少数派のデータは、学習に損失関数が減少していく過程で、他に大きな要因の学習が完了しないうちは、少数派のデータの学習が進行しない。学習が打ち切られた状態によっては、少数派のデータに対する学習が極度に劣化した状態になることがあります。

## 多数確保できるデータは、似通ったデータになりがち
- 多数確保できるデータを、そのまま学習データに加えると、上記の理由で、学習結果が劣化することがあります。
- 表面的には、多数確保したデータのtrain側,valid側で、validの再現率・適合率が向上します。
- しかし、実際のユースケースでは、再現率が極端に低下していて、実用に耐えないことが起こりえます。
- 似通ったデータになりがちなのは、学習を進めていく上で、危険な兆候です。

### 似通った背景
- 画像の分類問題・検出問題では、対象物を含む矩形領域にも必ず背景領域が存在します。
- その背景が学習に影響してしまう。

### 偏った被写体
- 顔で年齢性別推定をすることを考えてみましょう。そのとき18歳から60歳で9割を占めるデータセットで、年齢性別の学習をしたらどうなるでしょうか？
- 一般物体検出でも、被写体の見え方の分布が重要なことがわかりますね。

## 検出しやすい画像ばかり追加すると、従来よりも検出性能が劣化する。
これまでに述べたことで、検出しやすい画像ばかり追加すると、検出性能が劣化することがあるのがわかるでしょう。

## 間違ったラベリングは学習データにつきもの
- 間違ったラベリングの影響は、学習アルゴリズムによって違ってきます。
    - Haar-Cascadeの場合、影響を受けやすいようです。特に意図せず入り込んだ背景画像の中の対象物は、後段の強判別器への性能に大きく影響します。
    - 後段の強判別器が学習する際に使われるネガティブサンプルは、前段の強判別器を通り抜けたものなので、とても偏ったものになります。そのため、そこでピックアップされた背景画像中の対象物は、それ以降の段の強判別器の性能を著しく低下させます。
    - しかし、Haar-Cascadeの後段の強判別器の性能が十分なものかは、検証しにくい点がありました。
    - 畳み込みニューラルネットワークが一般化した状況で、新たにHaar-Cascadeの識別器を使う理由はないでしょう。
    - サポートベクターマシンの場合には、学習後の誤分類をどれくらい許容するのかを設定するパラメータがあります。正則化パラメータです。この値を大きくすると誤分類を許容しない学習になっていきます。[参考先](https://qiita.com/yh0sh/items/d58a3e4850ec77b58be0#%E6%AD%A3%E5%89%87%E5%8C%96regularization)
    - 誤分類をある程度許容する場合には、間違ったラベルの影響は、低下します。推測結果は全体の分類がすんなり分類しやすときの期待されるラベルに置き換わります。
    - ノイズの影響があるデータを分類するときには、サポートベクターマシンを使って、正則化パラメータを含めたハイパーパラメータの最適化を考慮しましょう。
- 主成分分析による次元の削減も、ノイズの影響を低下させるのに有効だ。
    - auto-encoderもノイズの影響の削減に有効 

- 間違ったラベリングであることが判明したら、データを修正しよう。


## データの管理
### ポジティブサンプルとネガティブサンプルは区別しやすくなるように、学習データを作った方がよい。

ポジティブサンプルとネガティブサンプルとの特徴の分布が似ているほど、機械学習は難しくなっていきます。

特に学習の初期では、対象物が物に隠れている状況の画像を学習データに加えるべきではありません。学習の初期の段階では、目的の検出器が作れるかどうか、わかっていません。既存の似たような検出器があるからといって、あなたの用途での見え方・被写体で、同じように検出できるとは限りません。

### 学習・評価用の画像は、１つのフォルダで評価するのでなく、類似性の高い撮影環境・被写体の見え方に応じてグルーピングして、それぞれのグループごとに評価するのがよい。





### 経験則：　検出が難しすぎるポジティブサンプル・誤検出が避けられないネガティブサンプルは、学習データから除外した方がよい。

### 経験

## 「正しく分類できていれば十分だろ」では十分ではない。
機械学習を訓練用の画像についてそれなりに正しく分類できるようにすることはできるだろう。
しかし、それが本当に適切な視点にしたがって分類できているのかは意味しない。

[AIだって騙される？AIの抱える弱点とは一体何か](https://securitynews.so-net.ne.jp/topics/sec_20009.html)
![](https://securitynews.so-net.ne.jp/content/so_net/securitynews/topics/sec_20009/_jcr_content/mainparsys/image_d6d0.img.jpg/1555665601856.jpg)
パンダの画像にノイズを混ぜ込むと、テナガザル(gibbon)に分類させてしまうことができるというものです。

これは、CNNの画像認識といえども、人の脳が行っている画像認識とはまだまだ差があることを示していると言って良いでしょう。

機械学習のアルゴリズムによっては、その損失関数が、正しく分類できていれば、それで十分であるとするものがあります。そうすると、どんな奇妙な方法であっても”正しく分類”できていれば、それ以上学習が進展しないものとなります。

他方、損失関数に正則化項が入っていて、”正しく分類”できているだけでは不十分とするものがあります。先に示したサポートベクターマシンの場合には、正則化項が入っているものです。

## 問題設定（あるいは要求仕様）が変わってしまうことがある。
例：
図柄入りナンバープレートというのが登場してしまった。そのことによって、ナンバープレート認識する対象自体が変わってしまった。従来のナンバープレート認識アルゴリズムでは、図柄の部分が文字認識をするのは困難になったであろう。そのため、実績のあった枯れた技術としてのナンバープレート認識のライブラリは、新規に図柄入ナンバープレートに対応するか、日本国内でのナンバープレート認識の活用を断念するかの選択を迫られたに違いない。
　これも、画像の機械認識が「劣化」した事例と言えるだろう。


[国土交通省](
https://www.mlit.go.jp/jidosha/zugaranumber_zenkokur4/)



[図柄入りの新ナンバープレートをAIカメラが自動認識、照度ゼロ環境にも対応可能](https://monoist.itmedia.co.jp/mn/articles/2011/12/news056.html)

# 最後に

学習データを改善して良好な結果を得るためのヒントを述べました。
あなたのかかえている学習の課題について、なんらかのヒントになれば幸いです。

---
追記

## 仮説：新しいポジティブサンプルの追加は、境界面の移動を生じさせる。その境界面の精度が足りないと、適合率を保ったときには、再現率の低下を引き起こす。

これは、私の作業仮説である。まだ十分な個人的な検証さえできてない。
　「境界面の精度」などというまだ確認していない作業仮説を使って議論している。
　うまく分類ができている場合には, t-SNEのようなマッピングで、分類の分布を可視化できる。
　
例：　[t-SNEを使ったMNISTデータの次元削減・可視化](https://www.sairablog.com/article/python-tsne-sklearn-matplotlib.html)
　もし、その仮説を検証したいと思う場合には、新しいポジティブサンプルを加える前の、ポジティブサンプル・ネガティブサンプルのマッピングを見てみよう。
　その場合、ポジティブサンプルとネガティブサンプルが分離できていると期待する。
　それが、新しいポジティブサンプルを加えた場合には、分布が乱れていると推測する。
　
このように書いているけれども、私はそのような検証を実施していない。t-SNEを使ったマッピングでの例示は、圧倒的に分類問題であって、検出問題ではないからだ。検出問題でのネガティブサンプルは、どう扱っていいのかわからないほど多様なものになる。
 
 そのため、新しいポジティブサンプルを加える際にどうすべきかについての個人的な見解を先に、以下の内容で書いている。

[未検出データを追加すべきか、先送りすべきか。](https://qiita.com/nonbiri15/items/77cf58f580462afbb0b4)


## 追記(2022.03.11)

### 平均だけでなく標準偏差も重要だ。
データの分布の標準偏差が小さくなってしまうと、本来持つべきデータの広がりがなくなってしまう。似たデータばかり増やしてしまうとデータの標準偏差が小さくなってしまう。そうすると、そのクラスに対する判定が成功する入力の範囲が狭くなっていってしまう。
だから、似すぎるデータは除外するようにデータをメンテナンスすることが大切だ。

## 追記：最小検出サイズの変更によって、データセットを改定しなければならないことがある。
最小検出サイズが向上することで、小さな対象物に対してアノテーション漏れの状況になることがあります。
アノテーション漏れの対象物に対する検出は、「誤検出」となります。
この場合、「誤検出」を抑制するように学習が進展していき、それに付随して再現率が低下することがあります。
それを回避する方法は、正解のアノテーションを付与することか、その小さな対象物を塗りつぶす。
そのどちらかをとる必要があります。　

# 追記
本当に劣化しているのか、正解のアノテーション漏れの可能性はないか？

- 学習データの増強や、よりよい学習アルゴリズムへの置き換えは、従来よりも検出性能が改善する。
- 従来は検出できてなかった諸条件での検出性能が向上して、正解のアノテーションがないままの、検出の改善が起こっているかもしれない。
- そのような状況では、誤検出としてカウントされる。
- 誤検出としてカウントされた画像を見ない限りどちらとも判別できない。
    - 隠れが発生していても検出できるようになった。（従来はその隠れの具合ではアノテーションをつけていなかった）
- そういった可能性があるので、本当に劣化しているのかどうか、誤検出とカウントされた検出枠を確認することだ。

## 追記： Vision Transformer 系の技術が進展しているなかでの追記

>　原則：簡単に分類できてしまえば、細かい特徴を使ってまで分類の学習を進めようとは働かない。

Vision Transformer の中で、[masked autoencoder](https://github.com/facebookresearch/mae) がある。
この処理のすばらしいところは、画像からかなりの比率を隠して,
わずかの領域のヒントを元に、元画像を復元させるという訓練をしている点にある。
そのため、細かい特徴に着目するように強制される。
その点が従来の技術と異なっている。
- [Masked Autoencoders Are Scalable Vision Learners](https://arxiv.org/pdf/2111.06377.pdf)
- [【論文5分まとめ】Masked Autoencoders Are Scalable Vision Learners](https://zenn.dev/takoroy/articles/98400e156576df)

---

他の人は、学習データのそろえ方についてどのように書いているか。
[機械学習の仕組みと学習データ](https://thinkit.co.jp/article/13201)



### 関連記事
[機械学習のデータセットはどう失われるか](https://qiita.com/nonbiri15/items/043118f6f55fe70c1baf)