機械学習のための数学のおさらい
微分法と機械学習
株式会社オープンストリーム
CTO 寺田英雄
2017.08.18
fun-tech
数学ユーザーになろう!
■ 機械学習エンジニアにとって必要な数学力は、
まずは、”ツールとして”数学を使う能力です。
➢ 学校のテストのようなトリビアルな数学問題を解くことが
目的ではありません。
➢ 数式の読み方と、その意味・イメージを理解できればOK。
■ 学校の数学が苦手だった人でも大丈夫です。
■ 言語やライブラリが進化しているので、
面倒な計算はコンピュータに任せればOK。
2
今日の目標
■ 微分法とはどういうことか、だいたい分かる
■ 機械学習に微分法が必要であることが分かる
■ ディープラーニング(NN)の学習と微分の関わりが
ざっくり分かる
■ 微分関連の数学記号に慣れる
3
注:この資料では、説明をシンプルにするため、
数学的な厳密性は省略しています
目次
1. なぜ機械学習には微分法が必要なのか?
2. 微分法のおさらい
3. 微分法による機械学習の実例
4. 数値微分
5. Deep Learning と微分法
6. まとめ
4
5
イントロダクション
1.なぜ機械学習には微分法が必要なのか?
関数(函数/function)のおさらい
■ 数学的な関数のざっくり定義
➢ ある数 x を入れたら、別の数 y が(ある規則に従って)出てくる箱
• 入力変数x、出力変数 y
6
こう書きます
記号は任意です
x, y に使える色々な『数』の種類がある
● 数の種類:数学での呼び方と、プログラムでの呼び方(例)
7
数学 プログラム 例(Python/numpy)
スカラー(scalar) 数値定数、数値変数 0 ; 500 ; x ; y
ベクトル(vector) 1次元配列 v = np.array([1, 4, 5])
行列(matrix) 2次元配列 m = np.array([[3, 7, 11], [1, 8, 2]])
テンソル(tensor) 3次元(以上の)配列 m = np.array([
[[1,2], [3,4]],
[[5,6], [7,8]],
[[9,10], [11, 12]],
])
備考:
*テンソルは、他の数のクラス(スカラ・ベクトル・行列)をまとめて表せる概念です。
テンソル観点で、その数クラスを表すときの配列の次元数のことを『階数』といいます。
スカラー=階数0のテンソル;ベクトル=階数1のテンソル;行列=階数2のテンソル
関数の入力・出力は、上記のどんな組み合わせを用いても良い
関数は便利な考え方
入力から出力を得るもの:なんでも関数とみなせる
■ RDBデータベースは関数
➢ 入力:SQL/出力:クエリ結果データ
■ コンパイラは関数
➢ 入力:ソースコード/出力:実行バイナリ
■ 顔認識は関数
➢ 入力:画像/出力:顔の位置・大きさ
■ 天気予報は関数
➢ 入力:現在までの気象データ/出力:明日の天候、気温、降水確率
8
機械学習(ML)
=
データから(自動的に)
関数を作らせる仕事
9
機械学習利用時の具体的ステップ
1. 問題の性質=作りたい関数の性質を考えて
2. (関数を作らせるための)どのMLアルゴリズムを使うか決める
3. データをMLアルゴリズムに与えて、関数を作らせる
4. できあがった関数を使う
10
どうやって、関数を作っているの?
機械学習:関数の作られかた
1. 関数には調整用のパラメータ変数θがある(ものが多い*)
2. MLアルゴリズムは、あなたのデータに合わせて
『最も良い』パラメータθの値を自動的に決定する
11
パラメータってどんなもの?
*クラスタリング等の例外があります。
こう書きます
パラメータの例
■ 直線:1次関数
■ グラフ:直線
■ パラメータ: θ=(a, b) a:傾き, b:切片
12
1次関数の例
13
パラメータを変える→関数の形が変わる
補足:直線の傾き?
■ x軸方向の変化量⊿xに対するy軸方向の変化量⊿yの割合
➢ =(x軸方向に+1進んだときの、y値の変化量)=a
14
⊿x
⊿y
1
a
パラメータの例
■ 放物線:2次関数
■ グラフ:放物線
■ パラメータ:θ=(a, b, c)
15
2次関数の例
16
パラメータを変える→関数の形が変わる
パラメータの模式図
17
機械学習:関数の作られかた
1. 関数には、調整用のパラメータ変数がある(ものが多い)
2. 各アルゴリズムは、あなたのデータに合わせて
『最も良い』パラメータ(=関数の形)を自動決定している
3. 最も良いパラメータを選ぶ方法:
パラメータに対する評価(良し悪し)を数値化して判断する
→パラメータをいろいろ変化させてみて、評価値の変化をみる
→評価値 E はパラメータθを入力とする関数(と考えることができる)
a. Eが利得値(gain)ならば、最大のものを選ぶ
OR
b. Eが損失値(loss)ならば、最小のものを選ぶ
18
関数の最大・最小を求めたい → 微分法が便利
ここまでのまとめ
なぜ機械学習に微分法が必要なのか?
■ 機械学習とはデータから関数 y=f(x,θ) を作る仕事
■ 目的のデータに『良く合う(適合する)』関数を作りたい
➢ 関数の形はパラメータθで決まる
➢ θによる関数 f の適合度関数 E=h(θ) とする
➢ 関数 h の最大(極大)値・最小(極小)値を求めるのに、
微分法が使える(数学的な原理)
19
20
これが本題
2.微分法のおさらい
微分法の主な使い道
■ (1)関数の最大(極大)値・最小(極小)値問題を解く
■ (2)微分方程式を解く ※今回の範囲外
➢ 自然現象は、微分方程式の形で表現できるものが多い
(例:物体の運動、惑星の運行、水や空気の流れ、電気回路・・・)
➢ 微分方程式を解くと:
• 惑星や宇宙船の軌道を予測・制御できる
• 電気回路の動作を予測・制御できる
• 天気シミュレーション:大気の流れや気温の変化の予測ができる
• etc...
21
微分法による関数の極大・極小値の求め方概略
■ ある関数* f について、『微分』という操作を加えると、
『導関数**』と呼ばれる別の関数を作ることができる。
■ 元の関数 f が極値(極大値or極小値)となる位置では、
導関数の値はゼロとなる。
➢ つまり:導関数の値がゼロになる位置を見つければ、
そこは f の最大(極大)値か最小(極小)値となっている
22
なぜそうなる?
*微分可能な関数
**導関数の別名:微分係数、微分
導関数は、f(x)の各位置における接線の傾きになる
■ 接線って?(接線の定義)
➢ 曲線に”接しているだけ”の線
➢ 曲線上のある一点だけを通り、他の(付近の)点は通らない直線
23
放物線 y = x^2
x=1を通る接線
傾き a=2
3次関数
x=-1 を通る接線
傾き a=-2
接線の傾きがゼロになるとなぜ:極大・極小?
■ 傾きがないので、その付近では関数の値はそれ以上大きく
(OR小さく)なれない
24
接線は無数にある。
接線の傾きがゼロ以外なら、
関数の値はその付近で増減している。
接線の傾きがゼロになる位置
この場合は極小値
極値の例(3次関数)
25
接線を数学的にきちんと定める:極限(1)
■ 曲線y=f(x)上のある点Pと、少し離れた別の点Qを考えます。
■ この2点を通る直線Lを考えます。
■ QをどんどんPに近づけていくと、L(の傾き)は、
どんどん接線Tに近くなります。
26
y=f(x)
T
L
P
Q
x
y
接線を数学的にきちんと定める:極限(2)
■ Qを限りなくPに近づけていったとき、Lが限りなく近づいていく先を求めることを、『点Pに
おけるLの極限を求める』といいます。
➢ この場合のLの極限は点Pの接線Tになります
■ 数式では以下のように書きます(上記の日本語を数式に翻訳)
27
←『直線Lは、P, Qに応じて
決まる』という意味を表現していま
す。
接線を数学的にきちんと定める:極限(3)
■ 直線Lをxy座標で書き直します
■ 接線Tの定義式に当てはめて
28
y=f(x)
T
L
P
Q
⊿x
⊿y
L:
接線を数学的にきちんと定める:極限(4)
■      という値が存在するとき、その値をPにおける微分係数といいます。
     微分係数は以下の記号で表します。
■ 別の記法もあります
29
ライプニッツの記法
「ディ−ワイディーエックス」
と読みます
ラグランジュの記法
「ワイダッシュ」
と読みます
ニュートンの記法
「ワイドット」
と読みます
微分係数を求めることを『微分する』といいます
初歩的な微分の例
例:          を     で微分する。
30
x
y
a a+h
f(a+h)
f(a)
←この計算は、どんな a についても成り立つの
で、a を変数 x と読み直し、関数と考えることが
できる。これを導関数という。
⊿
y
⊿
x
参考:いろいろな導関数(=微分)の公式
31
引用元:https://ja.wikipedia.org/wiki/%E5%BE%AE%E5%88%86
32
3. 微分法による機械学習の実例
一番シンプルな機械学習:最小二乗法
■ 目的
➢ 2つのデータ変数 X, Y があり、X と Y が比例関係にあると想定
されるとき、この X, Y の比例関係に最も近い直線を求めること。
➢ 例:
• X:身長, Y:体重
➢ 応用:身長から体重を予測する。
33
y:体重
x:身長
?
一番シンプルな機械学習:最小二乗法
■ 概略手順
➢ データに対する直線 f の『近さ』を示す関数 g を作る。
➢ 評価関数 g を微分して、極値(最小値)を求める。
■ gの作り方:データとfの当てはめ誤差の二乗
34
y:体重
x:身長
一番シンプルな機械学習:最小二乗法
■ sを全データについて計算し、その総和を計算する
35
y:体重
x:身長
?
1
2
3
4
5
6
7
8
このgを最小化するように
直線fのパラメータを決めればOK
y=f(x)
一番シンプルな機械学習:最小二乗法
■ gの最小値の求め方
■ g を a, bについて微分(偏微分)して、最小値を求める
36
←gは、変数a, b の関数(2変数関数)と見立てる
この連立方程式をとけば良い
#Pythonでは scikitの LinearRegressionクラスで
最小二乗法による関数当てはめができます。
偏微分(partial differenciation)とは?
■ 多変数関数について、どれか一つの変数に着目して微分するこ
と。その際、他の変数は定数と考える。
■ 例:
37
を、yについて偏微分する
xについて偏微分する
(デーエフデーエックスと読みます)
(デーエフデーワイと読みます)
偏微分記号:ギリシャ文字の D
『デー』
『パーシャルディ−』
『パーシャル』
『ラウンドディー』
『ラウンド』
偏微分の図形的イメージ
38
■ fは、(超)空間にある曲面を表す
■ 偏微分は、特定方向への曲面の傾きである
39
コンピュータ上での微分
4. 数値微分
解析的な微分と、数値微分
■ 解析的な微分
➢ 数学の世界:数式で関数を書けるもの。
➢ 手計算できる。
➢ 極大・極小がイッパツで見つかる。(微分=0を解くだけ)
■ 数値微分
➢ 微分を差分に置き換えて数値計算し、微分を『近似』したもの。
• コンピュータでは、極限(無限小)を直接扱えない。
• MLなど現実的な問題では、関数の形は非常に複雑になり、
解析的な数式では表現できない。
➢ 注意点
• 極大・極小は、探索処理で見つける必要がある。
• 厳密に見ると誤差がある。
✓ 実用的に十分な誤差範囲を設定し、そこで計算を打ち切る。
40
数値微分の実装
■ df/dx を ⊿f/⊿x で近似する
■ 十分に小さい ⊿x を決める
➢ 例えば、ディープラーニングでは、1/10000 = 0.0001が使われる
■ 以下を計算する
41
x=a
f(a)
f(a+⊿x
)
x=a+⊿x
数値微分の問題
■ 前か後か?:差分をとる方向によって結果が変わる・不安定
■ 対策:中心差分
42
前方差分
後方差分
真の接線
中心差分
43
5. Deep Learning と微分法
ディープラーニングはややこしい関数の生成器
■ 多層ニューラルネットワークは、複雑で高次元な関数を表現する
仕組み。
➢ 複雑ではあるけれども、関数であることに変わりはない
■ 解析的な微分はできない。
44
ディープラーニングの学習=損失関数の最小化
■ 教師あり学習(分類)
➢ 入力データ:
➢ ラベル(教師):
➢ DLの出力:
➢ 損失関数:
➢ NNの重みパラメータ:
45
Neural Network
←ネットワークの結合状態を調整
文字の正解ラ
ベル
例:手書き文字画像
■ wを勾配法によって繰り返し更新し、Lを最小化します。
つまり:
損失関数の最小化=wの調整
46
Neural Network
←ネットワークの結合状態を示す
となるwを探します。
アルゴリズム
(勾配降下法)
勾配法(勾配降下法)
■ 仮に wを2次元とすると、L はw上に表現された地形図のようなも
のになる。
47
注:実際の学習では、このような『全体像』は見えていません
勾配法(勾配降下法)
■ Lを各次元方向に偏微分した値を見れば、各地点で『最も傾いてい
る向き』が分かる。これを勾配(gradient)という。
48
『ナブラL』と読みます
勾配法(勾配降下法)
■ 勾配の向きにそって少しづつ坂を下れば、
いずれ極小値に到達できる。
49
極小値
学習率『エータ』
どれくらい早く坂を下る
か?
(ハイパーパラメータ)
勾配法のイメージ
■ あなたは突然山に放置されました。濃霧で足元しか見えません。
地図・GPSやコンパス等はありません。
■ あなたは不死身のロボットですが、歩行しかできません。
■ もっとも早く山を降りる方法は?
50
誤差逆伝播法
■ 勾配法の問題
➢ 計算に時間がかかる
■ 誤差逆伝播法(Backpropagation)
➢ 効率のよいwの更新ができる
➢ 詳しくは専門書にて・・・
51
まとめ
■ 機械学習とは?
➢ (複雑な)関数をコンピュータに作らせること
■ 関数を作る方法
➢ パラメータ最適化
■ パラメータ最適化の方法は?
➢ 微分法が使われる
■ 微分とは
➢ 曲線の接線の傾き=導関数を求める
■ 解析的微分と数値微分
■ 偏微分、勾配法とNNの学習
52

機械学習のための数学のおさらい