1万4000件！？ ImageNetのラベルエラーを除外してモデルを評価したら、精度が爆上がりした件

こんにちは。株式会社Adansonsでエンジニアをしている、すずきと申します。
少し前、ImageNetにラベルエラーが存在することが報告され話題になりましたよね。

https://wired.jp/2021/05/10/foundations-ai-riddled-errors/

私自身、大学ではコンピュータービジョンの研究をしており、ImageNetでpretrainされたモデルや、ベンチマークとしてもImageNetを使用することもあるので、データの質次第ではこれまでの検証結果も変わってしまうのではと危機感を覚えました。
そこで今回は[こちらの論文](https://arxiv.org/abs/2006.07159)で報告されたラベルエラーに基づいたエラーデータをImageNetの評価データから除き、torchvisionで公開されているモデルを再評価してみました。

## ImageNetからエラーデータを除外してモデルを再検証してみた
ラベルエラーには以下の表の通り3つの種類があります。
|   | (1)ミスラベルデータ | (2)複数のラベルに当てはまるデータ | (3)どのラベルにも属さないデータ | 計 |
|:-:|:-:|:-:|:-:|:-:|
| データ数  | 3,670  | 7,432  | 3,162  | 14,264  |

エラーデータがなんと、1万4000件も！
評価データ数が5万件なので、そこそこ高い割合でエラーデータが含まれていることがわかります。
実際のエラーデータは以下のようになっています。
![ImageNetJa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730808/f0525039-4cc1-a925-87d4-3922233aff55.png)





### 1. やったこと
本記事ではこのうち評価データから(1)のミスラベルデータのみを除いたものと、(1)~(3)の全てのエラーデータを除いたものをそれぞれ評価データとして使って精度を再検証しました。
検証させたモデルは以下の10種類です。
|  |  |  |
|:-:|:-:|:-:|
| convnext_large  | EfficientNet-B7  | vit_b_16  |
| convnext_base  | EfficientNet-B5  | regnet_y_32gf  |
| convnext_small  | EfficientNet-B4  |   |
| convnext_tiny  | EfficientNet-B3  |   |

### 2. わかったこと
結果は表のようになりました。（数値は精度（単位 %）。カッコ内は順位）
|  | All Eval data | Except mislabeled data | Except all error data |
|:-:|:-:|:-:|:-:|
| convnext_large  | 84.409 (1)  | 87.459 (1)  | 95.578 (1)  |
| convnext_base  | 84.057 (2)  | 87.184 (2)  | 95.362 (2)  |
| Efficient-B7  | 83.927 (3)  | 87.106 (3)  | 95.318 (3)  |
| convnext_small  | 83.629 (4)  | 86.745 (4)  | 95.037 (5)  |
| EfficientNet-B4  | 83.389 (5)  | 86.534 (5)  | 95.146 (4)  |
| EfficientNet-B5  | 83.277 (6)  | 86.439 (6)  | 94.931 (6)  |
| convnext_tiny  | 82.504 (7)  | 85.618 (7)  | 94.450 (7)  |
| EfficientNet-B3  | 82.016 (8)  | 85.147 (8)  | 94.209 (8)  |
| vit_b_16  | 81.064 (9)  | 84.163 (9)  | 93.313 (9)  |
| regnet_y_32gf  | 80.610 (10)  | 83.707 (10)  | 92.965 (10)  |

当然と言えば当然ですが、クリーンなデータと比較して間違えやすいであろうエラーデータを除いた評価データで評価した場合は軒並み精度が向上しています。

### 3. 順位が入れ替わってる！
特に興味深いのは、エラーデータを除外せずに評価した場合と、(1)~(3)を全部除外した場合で、モデルの精度ランキングに変動がある点です。
これでは、これまでの研究で精度同士を比較した際に誤った結論を導いている可能性が否めません。
**評価データのはずが、本当にモデルの性能の評価に使っても良いものといえるんでしょうか？**

深層学習を用いたモデルの多くは、しばしばデータを顧みることを蔑ろにし、精度をはじめとした評価指標をモデルの表現力で改善することに躍起になっているように思います。
しかし、評価データに含まれるエラーデータまでも正確に処理することに意味はありません。例えば、「猫」と誤ってラベル付けされた犬の画像を「猫」だとモデルに推論させることって無意味ですよね。

モデルの適正な評価には正確で質の高いデータセットを用いることが必要です。

### 4. 品質の高いデータで学習すれば良いって話
本検証では実施しませんでしたが、評価時だけでなく、学習時も正確なラベル付けがされたデータを使うことはいうまでもなく重要です。
実際、(1)の異なるラベルが与えられている3670個のデータは、50000個ある評価データ全体の7.34%を占めているのにも関わらず、精度の増加量は平均して約3.22ポイント程度です。
母数が変わるため、ポイント数を単純に比較できないですが、平均して1550個、つまり3670個のミスラベルデータのうち半数近くのデータは間違えているラベルを正解として分類できるようにモデルが過学習していることがわかります。

### 5. ビジネス応用時には特にデータセット大事
特に、ビジネスでのAIを応用時など、自分たちでデータセットを作成する際は、質の高いデータセットを作ることが、AIの精度や信頼性を高めることに直結します。
本検証結果から、データの質を改善するだけで精度が約10ポイント上昇していることからも、AIシステムを開発する際は、モデルだけでなく、データセットの改善が重要であることがわかります。

## データセットの品質向上って大変じゃない？
データセットの品質が大事っていうここまでの話は至極当たり前のように感じられるかもしれません。
しかし、実際に不都合なデータを除いて検証サイクルを回すことは難しく、標準的な手法に関する議論が繰り広げられています。(https://sites.google.com/view/dataperf2022)

困難である理由は主に以下のことが考えられます。
- 特に非構造化データでは、データを比較・考察するためのメタデータが十分に無い。ラベルエラー情報のようなメタデータを新たに作るには手間がかかる。
- メタデータの管理にベストプラクティスがなく、フォルダ構造や外部のExcelやCSVファイルなど独自の仕様で定められた形式で存在しており、解析で使えるようデータを整理するのに手作業が必要になることがある。
- データローダー関数を書き直し、データをメタデータに基づいて様々な条件に分けて評価し考察することに手間がかかる。

### データセットの作成・品質向上・エラー分析できるツールを作ってます
私たちAdansonsは、この課題に取り組んでいて、上記の処理を簡単にできるツールを開発しており、本検証でもこのツールを活用してデータセットの再設計を行いました。
Adansons Baseというツールで、現在無料で公開しているバージョンでは、外部ファイルやフォルダ構造に記録されたメタデータを抽出して、整理されたデータベースを作り、データセット設計を簡単にする機能を実装しています。

今回のImageNetを用いた検証では、最初にラベルエラー情報を含む外部ファイルを取り込めば、Pythonコード上で簡単に任意の条件でフィルタされたデータセットを設計できるようになります！

**実際に今回の検証で使ったコードはこちら！**
https://github.com/adansons/base/blob/main/example/02_clean_imagenet.ipynb


**Adansons Baseの登録フォームはこちら！**
https://share.hsforms.com/1IiKZRnYrQz27zq05Ys_QKQ8moen

普段の開発で、データの扱いが面倒くさいな〜とか、整理して実際に評価に組み込むのが億劫だ〜と思った経験をお持ちの方はぜひBaseを使って見てください！

最後まで読んでいただきありがとうございました。