37
Ver. 1.0, 2017-08-19 森下功啓 1

シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

Embed Size (px)

Citation preview

Page 1: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

Ver. 1.0, 2017-08-19

森下功啓

1

Page 2: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

更新履歴

• 2017-08-19 Ver. 1.0 release

2

Page 3: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

Series Index

ML-01 機械学習の概要

ML-02 機械学習におけるデータの前処理

ML-03 ランダムフォレストによる自動識別

ML-04 機械学習の性能の定義と一般的な性能向上策

ML-05 ニューラルネットワーク

ML-06 ニューラルネットワークによる線形回帰

ML-07 ニューラルネットワークによる非線形回帰

ML-08 ニューラルネットワークを用いた識別・分類 ーシングルラベルー

ML-09 ニューラルネットワークを用いた識別・分類 ーマルチラベルー

ML-10 ニューラルネットワークで画像識別

ML-11ニューラルネットワークのチューニングの基本

3

Page 4: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

Re:識別(分類)問題とは?

• 特徴ベクトルを基に、クラスを分類する問題を識別問題という

4

• 特徴ベクトルが数値やラベルという点は回帰問題と同じ

• 正解が文字列や整数で与えられる「ラベル」という点が回帰問題と異なる

“ネコ”

“イヌ”

学習器

学習器

ここでの「クラス」とは、”ネコ”とか”イヌ”のこと

Page 5: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

5

識別(分類)問題は更にシングルラベル分類問題とマルチラベル分類問題に別れる

*正確には、識別(分類)問題といえばシングルラベルでの分類問題を指し、「シングルラベル分類問題」とはほぼ言わないのだが、このスライドでは区別しやすくこう呼ぶこととする。

Page 6: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

シングルラベル分類問題とマルチラベル分類問題• 写真に写っている物体が”イヌ”か”ネコ”かという単一のラベルに分類する問題は、シングルラベル分類問題という

• 一方で、「SF」「アニメ」など、映画のジャンルの様に複数のラベルに分類する問題はマルチラベル分類問題という

6

タイトル アニメ SF 映画版 押し

プリンセス・プリンシパル ◯ ◯ ◯

ノーゲーム・ノーライフ ゼロ ◯ ◯ ◯

マルチラベルの例

入力画像 識別結果の正解

ネコが写った画像 “ネコ”

イヌが写った画像 “イヌ”

シングルラベルの例

Page 7: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

7

このスライドでは、シングルラベル分類問題を扱う

Page 8: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

8

さて、扱う問題領域を明らかにしたので、次は

シングルラベル分類問題をNNで扱う上での定石を見てみよう

Page 9: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

ラベルを含む問題はほぼ非線形問題

9

4次元ベクトルデータ

花のラベル(整数)

2

1

0

この変換を一次式だけで実現は不可能

Irisの識別例

非線形な問題を扱えるアルゴリズムを使う

Page 10: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

正解ラベルをベクトル化する

• 正解(整数)を非線形回帰問題として求められなくはない

• しかし、正解はベクトル化した方が高性能となる• 正解をベクトル化すると、出力層におけるとあるユニットにつながる結合係数を調整しても、他の出力層のユニットには影響せず、調整し易い

• ∴正解ラベルをベクトル化する(これをOne-hot-encodingという)

10

教師データに含まれる正解ラベル

2

1

0

virginica

versicolor

setosa

Irisの識別例におけるOne-hot-encoding

[0, 0, 1]

[0, 1, 0]

[1, 0, 0]

このベクトルを出力層のユニットの出力として学習させる

ベクトル化した正解ラベル

Page 11: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

11

3層NNを使ったIris分類においてversicolorの特徴量を入力した場合の出力層の出力例

中間層(隠れ層)

出力層入力層

がくの長さ

がくの幅

花弁の長さ

花弁の幅

setosa

versicolor

virginica

0.07

0.93

0.1

出力値最大のユニットが推定結果

Page 12: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

NNにおける識別問題への対応

• ニューラルネットワークを用いて識別問題を解く場合、実現したいことが非線形な変換なので、3層以上の構成として、中間層には非線形な活性化関数を使う

• また、出力層のユニットには0か1しか出して欲しくないので、出力層の活性化関数はsigmoidを使う

• 故に、入力する特徴ベクトルは次元ごとの正規化をしていないとほとんど学習が進まない• 正規化しない場合は、活性化関数を全てLeakyReLUにすると良いかもしれないが、ノイズに弱くなるかもしれない

• 出力層の出力を確率に変換するために、softmax層を使う

12

Page 13: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

Softmax層の役割

13

• 出力層の複数のユニットが同時に活性化している場合は、推定結果の信頼性は低下する• 例えば、”ネコ”のユニットが最も活性化していても、他にも”イヌ”のユニットも活性化している場合は”ネコ”の可能性は下がる

• Softmax層は信頼性を反映した確率を計算する

• 後述する、categorical_crossentropyを使った学習にも寄与する

中間層(隠れ層) 出力層

ネコ

イヌ

0.98

0.65

・・・

中間層(隠れ層) 出力層

ネコ

イヌ

0.98

0.05

・・・

ネコのユニットは0.98と強く発火してい

るが、イヌのユニットもそこそこ発火しており、ネコの可能性が低い状態

ネコのユニットは同じ0.98だが、イ

ヌのユニットは発火しておらず、ネコである可能性が高い状態

小さい

Page 14: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

基本的なモデル構成のイメージ

14

活性化関数はReLUやsigmoidなど 活性化関数は

sigmoid

中間層(隠れ層)

Softmax層

入力層

出力層

・・・

中間層は1層以上

𝑥1𝑥2𝑥3⋮

𝑥𝑛−1𝑥𝑛

𝑦1𝑦2𝑦3⋮

𝑦𝑁−1𝑦𝑁

各次元毎にN(0,1)に調整した特徴ベクトル

𝑦′1𝑦′2𝑦′3⋮

𝑦′𝑁−1𝑦′𝑁

𝑗=1

𝑁

𝑦′𝑗 = 1.0* 𝑁は識別したいクラス

の数でもあり、出力層のユニット数 に等しい。

Page 15: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

Kerasでは、損失関数(目的関数)にbinary_crossentropyかcategorical_crossentropyを使う

• 出力の誤差を定義するのが損失関数

• binary_crossentropy• 正解のベクトルに含まれる1と0を学習に使う

• categorical_crossentropy• 正解のベクトルに含まれる1だけを学習に使う

• ∴Softmax層とセットで使う

• 一般的には、categorical_crossentropyが使われる

• とはいえ、性能の良い方を使えば良い

15

Page 16: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

クラス間データ量のバランスを取る

16

クラス

イヌ

イヌ

イヌ

イヌ

ネコ

←こんな教師データを1通り学習すると、”イヌ”は5回学習されるが、”ネコ”は1回しか学習に使われない。

学習の過程で、本当は”ネコ”だけど”イヌ”と間違えても全体の誤差は少ない。”ネコ”は1/5の重みしかない。

極端な例で言うと、”イヌ”のデータ100万個と”ネコ”のデータ1万個を含む教師データの学習では、何を入力しても”イヌ”と答えても精度99%を達成できる。これでは”ネコ”と”イヌ”を分類できなくてダメ。

クラスの識別能力を高めるには、学習データ内の各クラスの数を同数にするか、学習時の重みを調整する。

Page 17: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

17

な、長かった・・・・・

Page 18: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

18

ようやく、NNでシングルラベル分類問題に取り組むための前提知識をインプットできた

それではお馴染みのIrisを分類するサンプルコードを眺めてみよう

Page 19: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

Kerasを使ったIrisの分類例

19

Page 20: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

アヤメ(Iris)の分類問題

20

Iris versicolorIris setosa Iris versinica

3種類の花の種類を自動的に識別したい

Page 21: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

Irisの4つの特徴量

• ガク片の長さと幅

• 花弁の長さと幅

21

https://www.kamikochi-vc.or.jp/learn/dictionary/dic_plants.html

Page 22: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

特徴量の散布図行列

花の種類毎(層別)に色を付けた散布図行列

setosaは完全に集団から独立しており、識別しやすそうだ。 22

Page 23: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

サンプルプログラムのダウンロード

23

1

2

Download: https://github.com/KatsuhiroMorishita/machine_leaning_samples

Page 24: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

24

• 以降のスライドでは、下記のプログラムを使った解説を行います• Irisの識別を行うサンプルです

Page 25: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

iris_learning_str_label.csv

• 教師データのCSVファイル

• 正解は文字列のラベルで与えてある

25

Page 26: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

iris_learning_num_label.csv

• 教師データのCSVファイル

• 正解は整数で与えてある

• 注:Excelで編集したときに数値が丸まったorz

26

Page 27: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

iris_test.csv

• 検証用の正解が付属していない未知データのCSVファイル

27

Page 28: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

learning.py

• 教師データを学習するプログラム(スクリプト)

• 教師データを学習データと検証データに自動的に分割

• 結果は教師データに含まれる正解ラベルに自動変換

28

200行もあって結構複雑→

Page 29: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

29

データの読み込み

予測結果をラベルに変換する辞書を作成

クラス毎の重みを計算

モデルを構築

学習の実行

検証用のデータの予測

検証用のデータの予測結果の保存

学習器の学習済み結合係数やモデル情報の保存

learning.pyのmain()だけ

Page 30: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

カスタマイズする際の調整項目

30

読み込むファイル名

学習回数やバッチサイズ

モデル構造(飛んで行った先の関数の記述を編集)

中間層の数(活性化関数の指定を忘れないように)

中間層のユニット数

学習係数

Page 31: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

活性化関数はReLU

活性化関数はsigmoid

モデル構造

31

ユニット数input_dim

ユニット数3

ユニット数output_dim

中間層(隠れ層)

Softmax層

入力層Layer 0 Layer 1

Layer 3出力層

Layer 2

Page 32: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

実行時に出力されるもの

32

学習に使ったデータと検証用のデータに対するlossのepoch毎の変化

コンソールに表示された、検証データを使って作成された分割表(上は数、下は割合)

この例では、2つのversicolorをvirginicaに誤って分類している。

ファイルにも保存されている

上から、モデルデータ,結合係数,正規化用のパラメータ(平均と標準偏差),ラベル変換用の辞書データ

Page 33: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

prediction.py

• 未知データの属するクラスを推定するプログラム

• 取り込むファイルは正解が付属していないことを想定

• 結果はprediction_rexult.csvに出力

33

Page 34: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

34

prediction.py

データの読み込み

モデル情報の読み込み

結合係数の読み込み

予測結果をラベルに変換する辞書の読み込み

予測と結果の保存

Page 35: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

prediction.pyの実行結果

• 予測結果はprediction_result.csvに出力される

35出力例

Page 36: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

36

予測結果をラベルに変換したりクラス間の重みを計算するなどの周辺機能のせいでプログラムが膨れてしまった。

このスライドでは、ニューラルネットワーク(NN)で識別問題を扱う上での複雑さが際立ったように思う。Scikit-learn内のランダム

フォレスト(RF)のシンプルさが目に染みる・・・。

だが、NNにはRFにはできない画像の識別がある。次は画像の識別について見てみよう。

あ、その前にマルチラベル分類問題だった。。。

Page 37: シリーズML-08 ニューラルネットワークを用いた識別・分類ーシングルラベルー

37