機械学習の全体像

# はじめに
機械学習の分野はとても広いです.
実務では特定の技術だけでなく様々なものをうまく組み合わせて問題解決することが求められるため、
全ての技術を詳細に知る必要はないですが、全体を把握しておくことは重要です.

# 大分類
大きく3つに分けられます.
- 教師あり学習: データから何かしら予測
- 教師なし学習: データに隠れた構造を抽出
- 強化学習: 最適な行動を学習


# 全体像
|  | 教師あり学習 | 教師なし学習 | 強化学習 |
| --- | --- | --- | --- |
| 学習対象 | 正解 | 構造 <br> 特徴 | 最適な行動 |
| 実用例 | 翻訳 <br> 災害予測 <br> 自動運転 | 異常検知 <br> レコメンド | ゲームAI <br> ロボットの自動制御 |
| タスク | 2値分類 <br> 画像分類 <br> 物体検出 <br> セグメンテーション <br> 画像生成 <br> 文章分類 <br> 翻訳 <br> 文章生成 <br> 時系列予測 | クラスタリング <br> 次元圧縮 | <br> 価値最大化 |
| アルゴリズム(非NN) | ロジスティック回帰 <br> パーセプトロン <br> SVM <br> 決定木 <br> 状態空間モデル | PCA <br> NMF <br> LLE <br> Kmeans <br> Fazzy-CMeans | Q学習 <br> Actor-Critic |
| アルゴリズム(NN系) | MLP <br> CNN <br> FCN <br> UNet <br> RNN <br> Transformer <br> GAN | AutoEncoder <br> VAE | DQN <br> A3C |


# 教師あり学習

## 概要
入力値から何かしらの予測をしたい場合を考えます.
予測する対象の正解データが事前に得られる場合、
入力値から正解データを出力するモデルを学習する手法を教師あり学習と言います.

## 主なタスク
何を入力して、何を出力するかでタスクが分類されます.
代表的なものに以下が挙げられます
- 時系列予測: 現在以前の時系列データ ⇒ 未来の時系列データ
- 画像分類: 画像 ⇒ ラベル
- 物体検出: 画像 ⇒ 物の位置と種類
- セグメンテーション: 画像をピクセル単位で分割
- 文章分類: 文章 ⇒ ラベル
- 機械翻訳: ある言語の文章 ⇒ 別の言語の文章

## 時系列予測
現在以前のデータから将来のデータを予測します.

### 実用例
**株価予測**
https://logics-of-blue.com/stock-price-forecast-by-arima/#:~:text=%E6%99%82%E7%B3%BB%E5%88%97%E8%A7%A3%E6%9E%90%E3%81%A8%E3%81%AF,%E6%89%8B%E6%B3%95%E3%81%AE%E4%B8%80%E3%81%A4%E3%81%A7%E3%81%99%E3%80%82

**災害予測**
https://built.itmedia.co.jp/bt/articles/2202/22/news029.html

**自動車の事故防止システム**
https://www.lnews.jp/2015/10/h102817.html

### 主要なアルゴリズム
**自己回帰モデル（AR・MA・ARMA・ARIMA）**
時系列間の関係を数学的に定量化、モデル化する.
周期性のあるデータだと精度が出やすいです.
https://logics-of-blue.com/stock-price-forecast-by-arima/

**状態空間モデル**
観測できない隠れた状態というデータを組み込みます.
非常に柔軟にモデリングできます.
https://unaoya-sigma.hatenadiary.jp/entry/car_sail

**決定木系**
端的に言うと条件分岐のルールを学習するモデルのことです.
入力に過去、出力に未来のデータを使い、ルールを学習させます.

**random foreset, 勾配ブースティング**が有名
チューニングが楽で、割と精度でやすいです.
https://qiita.com/ynakayama/items/6a472e5ebbe9365186bd
https://dev.classmethod.jp/articles/2017ad_20171211_dt-2/

**RNN系**
ニューラルネットをループさせて長さが可変の入力値でも学習できます.
可変長の時系列データを予測RNN系が使えます.
派生のLSTMをよく使います.
https://qiita.com/kazukiii/items/df809d6cd5d7d1f57be3
https://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca

**Transformer**
Attentionだけの可変長のエンコーダとデコーダです.
翻訳によく使われるが、時系列にも使えます.
https://qiita.com/omiita/items/72998858efc19a368e50

**gMLP**
MLPベースの手法で、Googleが2021に発表しました.
Attentionの必要性に疑問を持ち、MLPで頑張ったらTransformerと同様の精度出ました.
Transformerの有用性がないというわけでななく、
自然言語の特定のタスク以外ではTransformerの有用性が低いを示しています.
https://deepsquare.jp/2021/05/gmlp/


## 画像分類
画像からラベルを出力します.

### 実用例
製造業での製品の検査
https://products.sint.co.jp/aisia-ad/blog/what-is-quality-inspection

ネットオークションで出品時の項目の自動入力
https://engineering.mercari.com/blog/entry/2017-12-23-100000/


### 主要なアルゴリズム
**SVM**
クラスの間を分類するような分離面を求めます.
分離面と各データの距離をマージンといいマージンが最大になるようにします.
https://aiacademy.jp/media/?p=248

**MLP**
ニューラルネットを多層にしたものです
基本は線型な結合と活性化関数による非線形変換の繰り返しです.
https://ai-scholar.tech/articles/image-recognition/mlp-mixer

**CNN(VGG, ResNet, ...etc)**
画像に特化したニューラルネットです.
畳み込みというアルゴリズムで特徴抽出です.
https://ai-kenkyujo.com/ai-architecture-02/
https://ai-scholar.tech/articles/image-recognition/VGG_back


## 物体検出
画像から物体の領域とラベルを出力します.

### 実用例

**自動運転**
https://tech.tier4.jp/entry/2020/06/03/163000

**画像の文字検出**
https://www.ieice.org/~iss/jpn/Publications/issposter_2019/data/pdf/ISS-SP-036.pdf

**監視システム**
https://www.mhi.co.jp/technology/review/pdf/562/562030.pdf


### 主要なアルゴリズム
**FasterRCNN**
ニューラルネットのみで領域とラベルを学習します.
これ以前は領域の抽出にSelectiveSearchと言うニューラルネット以外を使っていたため、E2Eで学習できませんでした.
ニューラルネットのみでE2Eで学習可能になり、かつ精度と速度も向上したため、大きなブレイクスルーとなりました.
https://blog.negativemind.com/2019/02/20/general-object-recognition-faster-r-cnn/

**SSD**
シングルショット検出器
FasterRCNNでは領域候補の抽出と領域とラベルと同時に出力します.
FasterRCNNと同等の精度で、より**高速**です
ただし**小さい物体は苦手**
https://blog.negativemind.com/2019/02/26/general-object-recognition-single-shot-multibox-detector/
https://jonathan-hui.medium.com/object-detection-speed-and-accuracy-comparison-faster-r-cnn-r-fcn-ssd-and-yolo-5425656ae359

**DETR**
Attentionを物体検出に適用しています.
https://club.informatix.co.jp/?p=1265


## セマンティックセグメンテーション
画像をピクセル単位で分類し、領域分割をします.

### 実用例

**自動運転**
https://jp.mathworks.com/products/automated-driving.html

**医療画像解析**
https://atmarkit.itmedia.co.jp/ait/articles/1803/14/news150.html

### 主要なアルゴリズム
**FCN**
fully convolutional networkの略
cnnだけでセグメンテーションできる
https://blog.negativemind.com/2019/03/11/semantic-segmentation-by-fully-convolutional-network/

**U-net**
文字通りU字型のネットワークで、エンコーダ&デコーダの構造になります.
エンコードした情報だけでは、正確なセグメントをエンコードできないので、エンコードとデコーダの各層を接続するのが特徴です.
https://www.skillupai.com/blog/tech/segmentation2/


## 文章分類
文章からラベルを出力します.

### 実用例
**コメントの自動削除**
https://alt.ai/news/news-1163/

**スパムメールの検知**
https://signate.jp/competitions/104

### 主要なアルゴリズム
**ロジスティック回帰**
古典的ですが、解釈がしやすく、分析しやすい
https://poniti.hatenablog.com/entry/2020/01/02/185114

**RNN**
ニューラルネットをループさせて長さが可変の入力値でも学習できる
可変の長さの文章を入力してラベルを出力させることが可能
https://qiita.com/Kosuke-Szk/items/43f330b0888f8e696c3f

**BERT**
Bertで事前学習されたエンコーダーで文章をベクトル化して、任意の識別器で分類します.
https://www.ai-shift.co.jp/techblog/2089

**ELECTRA**
2020のGoogleが発表しました.
Bertを超える精度でかつ推論も早いです.
GANの枠組みをBertに適用しています.
https://cinnamon.ai/ideas/2020/06/22/20200619_research_001/
https://www.softbanktech.co.jp/special/blog/dx_station/2021/0038/#content02


## 機械翻訳
ある文章を多言語に変換します.

### 実用例
**GNMT(Google Neural Machine Translation)**
https://www.crimsonjapan.co.jp/blog/where_machine_translation_has_reached/

**DeepL**
https://www.deepl.com/ja/translator

### 主要なアルゴリズム
**SequenceToSequence**
RNNベースの方法です.
エンコーダーで特徴抽出し、エンコーダーで他言語を出力します.
https://blog.octopt.com/sequence-to-sequence/

**Transformer**
Attentionのみでエンコーダー、デコーダーを実装
https://crystal-method.com/topics/transformer-2/

**Bert**
Googleさんの有名なやつです.
Bidirectional Encoder Representations from Transformersの略で、日本語だとトランスフォーマーからの双方向エンコーダー表現
Transformerのエンコーダーを用いて、事前学習する際に使われます.
https://to-in.com/blog/104275
https://ledge.ai/bert/


# 教師なし学習

### 概要
特定の正解を与えずに、学習させる手法です.
データに隠れた特徴を抽出する際に使います.

## 主なタスク
**クラスタリング**
データを似ているものでグループ化

**次元削減**
データの次元を減らす

## クラスタリング
データ集合の各サンプルを似ているものをグループ化します.
あるサンプルを1つにクラスに割り当てる**ハードクラスタリング**と
あるサンプルを複数にクラスに割り当てる**ソフトクラスタリング**があります

### 実用例
**異常検知**
Kmeansベースで異常検知するXBOSと言うアルゴリズムについて書かれています.
https://www.scutum.jp/information/waf_tech_blog/2018/03/waf-blog-054.html

**レコメンド**
(執筆中)

### 主要なアルゴリズム
**Kmeans**
ソフトクラスタリングとハードクラスタリング両方あります.Hard-Kmeans, Soft-Kmeans)
サンプルにクラスを割り当ててから、以下を繰り返します.
中心点を求める ⇒ サンプルに中心点が一番近いクラスを割り当て
https://aiacademy.jp/media/?p=254

**Fuzzy C means**
ソフトクラスタリングの手法です.
ファジィ理論に基づくクラスタリングします.
サンプルが複数のクラスに所属できるのが特徴.
例: インドア: 0.7, アウトドア: 0.3
https://qiita.com/dr_paradi/items/50213a8c00a7b862d922

## **次元削減**
データの次元を減らすことで、要約します.

### 実用例
**前処理で特徴抽出**
一般的に、次元数が多いほど学習の難易度が上がります
必要な情報を残しつつ不要な情報を削れば、より学習しやすくなり、精度Upにつながります.
https://atmarkit.itmedia.co.jp/ait/articles/2006/29/news023.html

**可視化**
https://blog.brainpad.co.jp/entry/2022/03/09/160000

### 主要なアルゴリズム

**PCA（主成分分析)**
https://aiacademy.jp/media/?p=256

**NMF(非負値行列因子分解)**
https://thinkit.co.jp/article/17411

**LLE(Locally Linear Embedding)**
https://www.hellocybernetics.tech/entry/2017/07/06/133450

**AutoEncoder**
https://qiita.com/LicaOka/items/1f4d1131af05fe30674e

**VAE**
https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24


# 強化学習(執筆中)

### 概要
最適な行動を学習します。
教師ありでは、ある入力に対して正解となる出力が与えられましたが、現実では、明確に正解がわからないが、結果としていい選択だったかがわかるような場合は多いかと思います。例えば、ゲームではプレーヤーが様々な意思決定を行った結果として、最終的な勝ち負けが決まります。
このように、一意な正解がわからないが、その結果から各意思決定の良し悪しを評価できるような場合に、強化学習は有用です。
強化学習では、一意な正解を与えずに、長期的な価値を最大化するよう学習します。

## 主なタスク
価値の最大化

### 実用例
**ゲームAI**
https://www.sbbit.jp/article/cont1/58531
**ロボットの自動操縦**
https://xtech.nikkei.com/atcl/nxt/mag/rob/18/012600001/00095/


### 主要なアルゴリズム
- Q-learning
- Actor-Critic
- DQN
- A3C


# おわりに
機械学習の分類と主要なタスクおよびアルゴリズムについてまとめてみました.
実務では実際の問題とタスクに落とし込み、アルゴリズムを選定というStepがありますが、
まずどんなタスクがありそれぞれどんなアルゴリズムがあるのかということを知っておくと最適な解決策に早くだどりつくことができます.
また、全体像を把握しておくことで学習の指針にもなります.
この記事が少しでも参考になれば幸いです.


https://www.wantedly.com/companies/sweeep/projects