Upload
katsuhiro-morishita
View
426
Download
3
Embed Size (px)
Citation preview
Ver. 1.0, 2017-08-19
森下功啓
1
更新履歴
• 2017-08-19 Ver. 1.0 release
2
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
Re:識別(分類)問題とは?
• 特徴ベクトルを基に、クラスを分類する問題を識別問題という
4
• 特徴ベクトルが数値やラベルという点は回帰問題と同じ
• 正解が文字列や整数で与えられる「ラベル」という点が回帰問題と異なる
“ネコ”
“イヌ”
学習器
学習器
ここでの「クラス」とは、”ネコ”とか”イヌ”のこと
5
識別(分類)問題は更にシングルラベル分類問題とマルチラベル分類問題に別れる
*正確には、識別(分類)問題といえばシングルラベルでの分類問題を指し、「シングルラベル分類問題」とはほぼ言わないのだが、このスライドでは区別しやすくこう呼ぶこととする。
シングルラベル分類問題とマルチラベル分類問題• 写真に写っている物体が”イヌ”か”ネコ”かという単一のラベルに分類する問題は、シングルラベル分類問題という
• 一方で、「SF」「アニメ」など、映画のジャンルの様に複数のラベルに分類する問題はマルチラベル分類問題という
6
タイトル アニメ SF 映画版 押し
プリンセス・プリンシパル ◯ ◯ ◯
ノーゲーム・ノーライフ ゼロ ◯ ◯ ◯
マルチラベルの例
入力画像 識別結果の正解
ネコが写った画像 “ネコ”
イヌが写った画像 “イヌ”
シングルラベルの例
7
このスライドでは、シングルラベル分類問題を扱う
8
さて、扱う問題領域を明らかにしたので、次は
シングルラベル分類問題をNNで扱う上での定石を見てみよう
ラベルを含む問題はほぼ非線形問題
9
4次元ベクトルデータ
花のラベル(整数)
2
1
0
この変換を一次式だけで実現は不可能
Irisの識別例
非線形な問題を扱えるアルゴリズムを使う
正解ラベルをベクトル化する
• 正解(整数)を非線形回帰問題として求められなくはない
• しかし、正解はベクトル化した方が高性能となる• 正解をベクトル化すると、出力層におけるとあるユニットにつながる結合係数を調整しても、他の出力層のユニットには影響せず、調整し易い
• ∴正解ラベルをベクトル化する(これをOne-hot-encodingという)
10
教師データに含まれる正解ラベル
2
1
0
virginica
versicolor
setosa
Irisの識別例におけるOne-hot-encoding
[0, 0, 1]
[0, 1, 0]
[1, 0, 0]
このベクトルを出力層のユニットの出力として学習させる
ベクトル化した正解ラベル
11
3層NNを使ったIris分類においてversicolorの特徴量を入力した場合の出力層の出力例
中間層(隠れ層)
出力層入力層
がくの長さ
がくの幅
花弁の長さ
花弁の幅
setosa
versicolor
virginica
0.07
0.93
0.1
出力値最大のユニットが推定結果
NNにおける識別問題への対応
• ニューラルネットワークを用いて識別問題を解く場合、実現したいことが非線形な変換なので、3層以上の構成として、中間層には非線形な活性化関数を使う
• また、出力層のユニットには0か1しか出して欲しくないので、出力層の活性化関数はsigmoidを使う
• 故に、入力する特徴ベクトルは次元ごとの正規化をしていないとほとんど学習が進まない• 正規化しない場合は、活性化関数を全てLeakyReLUにすると良いかもしれないが、ノイズに弱くなるかもしれない
• 出力層の出力を確率に変換するために、softmax層を使う
12
Softmax層の役割
13
• 出力層の複数のユニットが同時に活性化している場合は、推定結果の信頼性は低下する• 例えば、”ネコ”のユニットが最も活性化していても、他にも”イヌ”のユニットも活性化している場合は”ネコ”の可能性は下がる
• Softmax層は信頼性を反映した確率を計算する
• 後述する、categorical_crossentropyを使った学習にも寄与する
中間層(隠れ層) 出力層
ネコ
イヌ
0.98
0.65
・・・
中間層(隠れ層) 出力層
ネコ
イヌ
0.98
0.05
・・・
ネコのユニットは0.98と強く発火してい
るが、イヌのユニットもそこそこ発火しており、ネコの可能性が低い状態
ネコのユニットは同じ0.98だが、イ
ヌのユニットは発火しておらず、ネコである可能性が高い状態
小さい
基本的なモデル構成のイメージ
14
活性化関数はReLUやsigmoidなど 活性化関数は
sigmoid
中間層(隠れ層)
Softmax層
入力層
出力層
・・・
中間層は1層以上
𝑥1𝑥2𝑥3⋮
𝑥𝑛−1𝑥𝑛
𝑦1𝑦2𝑦3⋮
𝑦𝑁−1𝑦𝑁
各次元毎にN(0,1)に調整した特徴ベクトル
𝑦′1𝑦′2𝑦′3⋮
𝑦′𝑁−1𝑦′𝑁
𝑗=1
𝑁
𝑦′𝑗 = 1.0* 𝑁は識別したいクラス
の数でもあり、出力層のユニット数 に等しい。
Kerasでは、損失関数(目的関数)にbinary_crossentropyかcategorical_crossentropyを使う
• 出力の誤差を定義するのが損失関数
• binary_crossentropy• 正解のベクトルに含まれる1と0を学習に使う
• categorical_crossentropy• 正解のベクトルに含まれる1だけを学習に使う
• ∴Softmax層とセットで使う
• 一般的には、categorical_crossentropyが使われる
• とはいえ、性能の良い方を使えば良い
15
クラス間データ量のバランスを取る
16
クラス
イヌ
イヌ
イヌ
イヌ
ネコ
←こんな教師データを1通り学習すると、”イヌ”は5回学習されるが、”ネコ”は1回しか学習に使われない。
学習の過程で、本当は”ネコ”だけど”イヌ”と間違えても全体の誤差は少ない。”ネコ”は1/5の重みしかない。
極端な例で言うと、”イヌ”のデータ100万個と”ネコ”のデータ1万個を含む教師データの学習では、何を入力しても”イヌ”と答えても精度99%を達成できる。これでは”ネコ”と”イヌ”を分類できなくてダメ。
クラスの識別能力を高めるには、学習データ内の各クラスの数を同数にするか、学習時の重みを調整する。
17
な、長かった・・・・・
18
ようやく、NNでシングルラベル分類問題に取り組むための前提知識をインプットできた
それではお馴染みのIrisを分類するサンプルコードを眺めてみよう
Kerasを使ったIrisの分類例
19
アヤメ(Iris)の分類問題
20
Iris versicolorIris setosa Iris versinica
3種類の花の種類を自動的に識別したい
Irisの4つの特徴量
• ガク片の長さと幅
• 花弁の長さと幅
21
https://www.kamikochi-vc.or.jp/learn/dictionary/dic_plants.html
特徴量の散布図行列
花の種類毎(層別)に色を付けた散布図行列
setosaは完全に集団から独立しており、識別しやすそうだ。 22
サンプルプログラムのダウンロード
23
1
2
Download: https://github.com/KatsuhiroMorishita/machine_leaning_samples
24
• 以降のスライドでは、下記のプログラムを使った解説を行います• Irisの識別を行うサンプルです
iris_learning_str_label.csv
• 教師データのCSVファイル
• 正解は文字列のラベルで与えてある
25
iris_learning_num_label.csv
• 教師データのCSVファイル
• 正解は整数で与えてある
• 注:Excelで編集したときに数値が丸まったorz
26
iris_test.csv
• 検証用の正解が付属していない未知データのCSVファイル
27
learning.py
• 教師データを学習するプログラム(スクリプト)
• 教師データを学習データと検証データに自動的に分割
• 結果は教師データに含まれる正解ラベルに自動変換
28
200行もあって結構複雑→
29
データの読み込み
予測結果をラベルに変換する辞書を作成
クラス毎の重みを計算
モデルを構築
学習の実行
検証用のデータの予測
検証用のデータの予測結果の保存
学習器の学習済み結合係数やモデル情報の保存
learning.pyのmain()だけ
カスタマイズする際の調整項目
30
読み込むファイル名
学習回数やバッチサイズ
モデル構造(飛んで行った先の関数の記述を編集)
中間層の数(活性化関数の指定を忘れないように)
中間層のユニット数
学習係数
活性化関数はReLU
活性化関数はsigmoid
モデル構造
31
ユニット数input_dim
ユニット数3
ユニット数output_dim
中間層(隠れ層)
Softmax層
入力層Layer 0 Layer 1
Layer 3出力層
Layer 2
実行時に出力されるもの
32
学習に使ったデータと検証用のデータに対するlossのepoch毎の変化
コンソールに表示された、検証データを使って作成された分割表(上は数、下は割合)
この例では、2つのversicolorをvirginicaに誤って分類している。
ファイルにも保存されている
上から、モデルデータ,結合係数,正規化用のパラメータ(平均と標準偏差),ラベル変換用の辞書データ
prediction.py
• 未知データの属するクラスを推定するプログラム
• 取り込むファイルは正解が付属していないことを想定
• 結果はprediction_rexult.csvに出力
33
34
prediction.py
データの読み込み
モデル情報の読み込み
結合係数の読み込み
予測結果をラベルに変換する辞書の読み込み
予測と結果の保存
prediction.pyの実行結果
• 予測結果はprediction_result.csvに出力される
35出力例
36
予測結果をラベルに変換したりクラス間の重みを計算するなどの周辺機能のせいでプログラムが膨れてしまった。
このスライドでは、ニューラルネットワーク(NN)で識別問題を扱う上での複雑さが際立ったように思う。Scikit-learn内のランダム
フォレスト(RF)のシンプルさが目に染みる・・・。
だが、NNにはRFにはできない画像の識別がある。次は画像の識別について見てみよう。
あ、その前にマルチラベル分類問題だった。。。
37