機械学習でなんとかしようと安易に考えるな

世の中にはよい機械学習の結果が存在する。高い精度で推論（分類・検出）できるものがある。
だから、データの特性が、元々の想定から変わった時にも「機械学習だから、学習させればなんとかなるよね」と期待する人がいるかもしれない。
 この文章は、そのような安易な考え方に立つことを戒めるために書く。
(もちろん、機械学習は今までになかった価値をいろんな分野にもたらす可能性が極めて高い。)

(主張したいことは、
- **ビジネスとして見返りが期待できる内容の機械学習をすること。**
- **100%の精度が期待できる機械学習は、そんなに多くない。それでも見返りが期待できる使い方をしてほしい。**
- 1人のエンジニアに支援なしに丸投げするのではなく、**チームとしての支援**が有効であること。
- **最初の問題設定を疑ってかかること。手書き文字認識の強化で宅配便の伝票をなんとかするよりは、手書きを必要としない方がいい。**
)

## garbage in garbage out（ゴミが入ればゴミが出る）
とはよく言われていることだ。

学習の元になるデータの品質が低ければ、学習がうまくいくことはない。


## 学習の難易度を高くしすぎるな(画像の機械学習での例)
- 対象物を面内回転の範囲を広げると難易度が１つ上がる。
- 対象物への視点位置の変化を増やすと難易度が１つ上がる。
- 照明条件に逆光を加えると難易度が１つ上がる。
- 暗がりでノイズが増えると難易度が１つ上がる。
- 対象物に隠れが生じると難易度が1つ上がる。
- 今よりも小さいものを検出させようとすると難易度が1つ上がる。

#### 難易度を上げていったときに、上手に学習しきれる保証はない。
- 学習の難易度を上げていくと、学習しきって精度がでるようになるまでの作業量が増えていく。
- 追加したデータがポジティブサンプルとネガティブサンプルとの境界面を作りにくくしている。
- そのため、追加した状況によっては、以前よりも検出率が低下しているということもある。

#### 今までと挙動が異なるデータを学習データに加えることは学習をぶち壊す。
例：数字の文字認識の機械学習のデータセットに、アルファベットのデータを中途半端に加えたとしよう。
そのとき、それまでできていた数字の文字認識ができなくなることが予想される。活字の１（いち）とｌ（エル）は区別が難しい。
１文字ごとの文字認識という枠組みでは扱いきれくなる。
このように今までと挙動の異なるデータを加えることは、今までの学習をぶち壊す。
だから、なんでもかんでも機械学習でなんとかしようと安易に考えるな。

##### 例：郵便番号の読み取り

- 郵便番号の読み取りは、入力が数字だけという大前提があることが、扱いを簡単にしている。
- もし十分な読み取りができなかった場合には、それをはじいて人による読み取りを実行すればよい。

これは、前提を上手に設定することで、機械学習の負担を減らして、安定な運用を可能にしている例である。

##### 例：手書き住所の読み取り

- 手書き文字認識の使用例としては手書き住所の読み取りがある。
- 手書き住所でうまく読み取れたのかどうかは、実在の都道府県の住所のデータベースとの整合性で実在する地名になっているのかどうかで確認できる。
- そのような工夫なしに手書きの文字認識で住所を正しく読み取れるほど、人の手書き文字の扱いは簡単ではない。

##### 例：郵便システムの場合
いったん住所を読み込んだ後は、その結果を紫外光のバーコードを封書・はがきに印刷して、その結果を利用するようにしている。そのことで、文字の読み取りの頻度を減らしている。（もし、手書き文字認識という機械学習がとても簡単で安価な技術だったら、どの段階でも手書き文字認識をするという方法もあるだろう。しかし、一度文字認識をしたら、バーコードにした方がとても安く運用できるということを意味している。）

##### 例：手書き文字認識の必要性を減らす。
- 宅配便の受付時にデジタルデータとして届け先の住所なども事前に入力させてしまう。
- 例 [宅急便をスマホで送る](https://www.kuronekoyamato.co.jp/ytc/customer/send/sp/)
- そのようにすることで、手書き文字自体が発生しないようにして、手書き文字認識の必要性を減らすことだ。




#### 難易度を上げたときには、新しい工夫が必要になる。
- 難易度を上げていったときには、たいがいの場合、学習データの与え方に新しい工夫が必要になる。
- 工夫なしにデータを取得しても、新たに持ち込んだ難易度を解決する学習データになってくれない。
- 新しく持ち込んだ難易度を解決するには、どのようなデータの加工が効果的か考えて、学習データに追加することが多い。
- そのデータの加工が効果的だったときに、ようやくその難易度を解決して、利用可能な学習結果を得ることができる。

## 先験的な知識がある場合にはそれを活用しよう
深層学習以前に音声認識の分野で[メルケプストラム係数](https://zenn.dev/mitsu_h/articles/qiita-20200609-ba51b3a66a690bd1a502)が使われてきていた。
深層学習でもメルケプストラム係数が音声認識のための特徴量として使われているそうだ。
有用性が確認されている特徴量は、深層学習などの機械学習でも相変わらず有用だ。

業務系の分野の機械学習でも、その分野で有効なことがわかっている知見を反映した特徴量を特徴量の一部として加えた方が機械学習がうまくいきやすいそうだ。

先験的な知識から得られる特徴量を、学習によって発見させるには、学習に必要なデータの数と質とを増やしてしまうだろう。

だから言う。安易に「機械学習だから、学習させればなんとかなるよね」と考えてはならない。



#### 画像の機械学習は前処理によって簡単になることがある。
- カラー画像は、RGBの色空間で扱うよりも、HSVや`L*a*b*`などの色空間で扱った方が画像処理・画像認識が簡単になることがある。
- 輝度の変化もガンマ補正などをした方が画像認識が簡単になることがある。
- また、ヒストグラムの均等化などの前処理が特徴を見えやすくする場合もある。
- https://scikit-image.org/docs/stable/auto_examples/color_exposure/plot_local_equalize.html

そのような前処理なしに、すべてを機械学習だけで性能を確保しようとするのは、いたずらに難易度をあげてしまう。

これらも言わば、先験的な知識によって機械学習の難易度を低下させようとする試みである。

#### 学習可能であることと、あなたがその学習を期日までに遂行できることとは同じではない。
- 一般物体検出は十分な学習データさせ用意できれば、学習プログラムが公開されているので学習可能である。GCPなどのクラウドサービスを利用すれば、学習用の環境を整備するためのハードルも下がっている。
- 学習が必要なことは、大概の場合、自分で学習データを整備しなければならないということだ。
- もし、その課題が十分に市場的な価値がある学習内容だったら、既存の商用ライブラリとか既存のオープンソースでの学習結果に既に結果がある場合もあるだろう。
- あるいは、かかえている課題に対して有効なデータセットが提供されているかもしれない。たとえば、マスク顔のデータセット・多様な人種での顔画像のデータセット、こういったデータセットであなたの役に立つものを探してみよう。
- 自らデータを収集しなければならないときの作業量が、業務として遂行する際に許される作業量の範囲に収まってくれるのかどうかは簡単な話ではない。

#### 安易な機械学習は、偏見や差別を再生産する恐れがあることを自覚しよう。

- [「AIによる差別」の現状とは？事例、原因、世界各地の取り組みを紹介](https://ainow.ai/2020/02/17/183256/)
- [公平性（Fairness、フェアネス）とは？](https://atmarkit.itmedia.co.jp/ait/articles/1912/19/news024.html)

- [AI と人種・ジェンダー問題についてアメリカから学べること](https://www.jst.go.jp/tt/journal/journal_contents/2021/12/2112-02_article.html)



#### 入力データそのものが劣化してしまっていると、できることは限られる。

[年金記録問題](https://ja.wikipedia.org/wiki/%E5%B9%B4%E9%87%91%E8%A8%98%E9%8C%B2%E5%95%8F%E9%A1%8C)のように、人を特定するための情報が不十分であったり、記載ミスがあったりするときに、機械学習にできることは限られたものになるだろう。

**水滴がついてしまったカメラ**
 カメラに水滴がついてしまうと、見え方が通常と著しく変わってしまう。水滴越しの風景ではどうすることもできない。

**ピントがあっていない画像、動きブレのある画像**

中には、解像度の低いナンバープレート画像から番号を読み取るライブラリも存在する。しかし、それはナンバープレートという限られた画像の世界だ。ナンバープレートに用いられる文字の種類も限られるし、フォントのデザインも地域によって一定している。そのような状況の中で、集中的にその問題を解決するための努力を相当重ねられた結果としてその結果を実現している。
　だからそのような成果を安易に期待しないことだ。

ナンバープレート認識の商用ライブラリは、他社製のライブラリに打ち勝って販売し収益を上げるために、機能を強化する必要があって、その中で解像度の低いナンバープレートからの読み取りがある。ナンバープレート認識の基本機能があることで、商業的な根幹を確保しているのあって、「解像度の低いナンバープレート画像でも読み取れる」ことで商業的な根幹を作っているのではない。

**フレームレートの低い動画での追跡**
追跡アルゴリズムでは、フレームレートが低くなると追跡が難しくなる。
対象の移動速度とサンプリングレートの兼ね合いで、フレーム間での枠の重なりが減れば減るほど追跡は難しくなる。
撮影のフレームレートが低い動画撮影の場合には、追跡が難しくなる。ある限界を超えるとほぼほぼ不可能になる。
だから追跡を行おうとする場合には、撮影のフレームレートを高くすることが必要だ。

**機器の特性のばらつきを抑え込めていないときの機械学習**
多様なセンサのセンサ値をもとに機器を制御する機械学習を仮定しよう。しかも１つの学習結果を複数の機器に適用する場合を考える。この場合に、センサの特性が機器によってばらつかないこと、駆動系の条件が機器によってばらつかないことが必要になる。このため機械学習用のデータを取得する以前に機器の特性のばらつきを抑え込んでおくことが前提となる。間違っても、「機械学習でなんとかなるよね」としてはいけない。1kgのものが1kgとわかるためには、計測器が校正されているからだ。センサの特性が温度や湿度によって影響が受けるものがある。そのようなことによる系統的なバイアスがのったり、大きなランダムノイズがのる信号では、機械学習でも良い結果をえるのは難しい。

**多変量解析で十分なものには多変量解析を**
機械学習や深層学習にしても、ものによっては多変量解析で十分なことがある。多変量解析での注意事項は、機械学習・深層学習でも注意事項として考えたほうがいい。相関をもっている2変数（例：身長と体重）よりは、相関を持たない2変数（例：身長とBMI）の方がモデルが安定して学習できる可能性が高い。事前に変数のスケーリングをしておいて、値の大きな変数に過度に影響を受けないようにすることとか、多変量解析での前処理は機械学習でも有効な前処理であることが多い。



## 実用最小限の製品（Minimum Viable Product）は何だ。
実用最小限の製品は何だろう。
まずは、実用最小限の製品を満たせるレベルのなるべく単純化した状態の学習を実現させよう。
最初は実用最小限の製品を満たさないレベルの単純な実現しやすい条件で学習を成功させることだ。
その後、学習者・学習チームの能力の状況、学習用のデータの収集の計画に基づいて、少しづつ学習を改善していくことだ。
実用最小限の価値を実現すれば、不十分なりにユースケースが出てくる。
そのような状況の中で、次に解決してくれるとうれしいのがなんであるのかが、ユーザーによって明らかになってくる。
先にリストアップした難易度を上げる項目のうち、どれが解決する価値があるものかがわかってくる。

## 実用最小限の製品を実現することで、開発を継続できる費用が捻出できる。
- 機械学習のライブラリの開発はとても費用がかかる。
- 開発者の人件費、学習用の画像の取得のコスト、アノテーションの費用、もちろん、学習のための計算機の費用。簡単に億単位の費用になることがある。
- こういった費用を回収するあてもなく、開発を継続することはできない。

## 不十分な精度でも**不十分なりに成り立つビジネスモデル**を考えること
- 機械学習それ自体が価値を持つわけではない。
- それの使い方でどのようなビジネスモデルを考え、それによって実際に収益を獲得することで価値を持つ。
- 完璧すぎる条件を満たさないと成功しない製品は、市場的に成功しにくい。
- 検索エンジン、リコメンデーションシステムなどの技術は、不完全なりに役に立つことで、存在している。

## 機械学習で解決するということは、技術的な負債を抱えるということ
- 機械学習を用いて解決するということは、技術的な負債を抱え込むということである。
- 機械学習を実装して組み込んだ担当者以外には、理解している人のないシステムができあがるということ。
- その担当者が残っているうちはいいが、その担当者がいなくなってしまうと、メンテナンス不能なシステムが出来上がる。こういったものが、どこにどう残されているかはたちまち不明になってしまいやすい。
    - 学習データの所在
    - 学習用のコード
    - 学習結果
    - 評価結果
    - 実装上のコード
- 機械学習の分野は目まぐるしく変わっているので、そのとき使用したライブラリが次の年にはもう利用できないものになっている可能性もある。

## 組織としての協力を得られるようにしよう
- 組織としての協力が得られない状況では、機械学習は失敗する。
- 例；学習に必要なデータが得られない。
    - 機械学習は学習に必要なデータが得られることが大前提の方法である。
    - 服装を元に同一人物を見付ける技術を開発しようとするならば、そのようなデータを取得できる状況になければ、その開発はほぼ不可能である。
    - 数名の開発メンバーだけのデータで、十分な学習ができることはない。
- 例：運用時にアクセス可能なデータがわからない。
    - マッチングの機械学習をするとしよう。
    - 機械学習用のデータセットでは十分な品質のデータがあって、それらを用いて良好な結果が出たとしよう。
    - しかし、運用時には、ある項目が利用不可になっていたことが判明する。
    - そうなると、その項目を使っていた機械学習は使えなくなってしまう。
    - 運用者が利用可能なデータを早い段階から機械学習の担当者とすり合わせておくことが成功につながる。
- 例：期日までに機械学習を用いたシステムの開発を間に合わせる。
    - データの収集・アノテーションへの人員・外部依頼の予算の確保
    - 学習ができた前提でのシステムコードの開発の協力者の確保
    - 機械学習の学習実行環境の整備への予算の確保

## 不十分な学習しか得られなかったときの予防策を考えること
- いちばんやっちゃいけないことは「機械学習でなんとかなる」と安請負しておいて、必要なタイミングで「できませんでした」とすることだ。「機械学習でなんとかなる」を信じて、それ以外の改善のための取り組みを捨ててしまうことだ。取得するデータの品質は、機器を選択した時点で決まってしまう。後になって「その解像度では無理でした。」、「そのフレームレートでは無理でした」などとなって、その枠組みが台無しになってしまうことを避けよう。

### 機械学習でなんとかなることがわかる前では、バックアッププランを捨てないこと
- だから、ギリギリの設計にはしないことだ。
- 既存のライブラリでもそこそこの結果が得られるなら、それを利用するというバックアッププランを考えておこう。

## 同僚・上司にも機械学習を成功させるためのコツを知ってもらおう。
この文章をあなたの同僚や上司に紹介してみてください。
そうすれば、機械学習のプロジェクトを成功させるためのコツが伝わると期待しています。
そのコツがわかってもらった状況になると、機械学習の担当者のあなたの仕事が進めやすくなるはずです。

## まとめ
- 機械学習は、学習させる内容によって難易度があがってしまう。
- 対象分野に存在する先験的な知識を利用すると、学習が簡単になることがある。
- 取得時にデータの品質が劣化している場合には、できることは限られる。データ取得時に品質を確保しよう。
- 機械学習がそもそも不要になるような仕組みの設計はないかも考えてみよう。

## 参考図書
[仕事ではじめる機械学習 第2版](
https://www.oreilly.co.jp/books/9784873119472/)

----
## 追記
- データセットはものによっては難易度が高すぎる。
- 特に人検出に関するものは、人が見て「人の一部」であることがわかるものをpersonのラベリングをしているものがあります。
- そのため、「手だけが見えている」、「スケートボードでジャンプしているのを下から撮った画像」とか
　極めて難易度が高い画像が含まれているものもあります。
- あなたの必要な用途に、そういった特殊な画像よりは、あなたの用途にそった画像を評価する必要が有ります。



## 目的によっては近赤外画像を加えた近赤外ハイパースペクトラル画像を使った方がよい場合もある。
- 例：[近赤外ハイパースペクトラル画像 のディープラーニング認識](http://www.jwrs.org/woodience/mm048/B-2_048.pdf)

- 例：[マイクロプラスチックの高速な検出分類手法を確立 ―ハイパースペクトル画像診断技術を最適化、海水ろ過試料自動分析へ前進―](https://www.jamstec.go.jp/j/about/press_release/20200331/)