前に行列について教わってきたと書いたが、
微積分についても教わってきた
機械学習・ディープラーニングを始めるための数学準備講座【関数・微分・勾配法編】
https://liberal-arts-beginners.connpass.com/event/140908/
ので、メモ
・関数・微分・勾配がなぜ重要か?
→関数値の最小化
関数
入力と出力の関係をうまく書いたもの
(漠然とした理解でも問題ない)
例:入力を2倍 f(x)=2x
f(x)=2x
入力が1のとき、2が出力されるのは
例:f(x)=x^2
入力が4のとき、4^4=16が出力される
※出力は1個(たか関数というのも理論的にはあるけど→円)
→2個以上あっても0個(なし)でもだめ。1個になること
極限
入力をある値に近づけていったときに、出力の値が何に近づくか
例:f(x)=2x
x=2 → 4
x=1.5 → 3
x=1.25 → 2.5
x=1.01 → 2.02
→2にちかずく
なぜ、1を代入しないのか:f(1)が求められないかもしれないから
lim 2x = 2
x→1
X→1のとき2x→2
今回は1を直接入力しても大丈夫
だめなときf(x)=(x-1)/(x^2-1)
1をいれると、0/0→不定形
※不定形 0が分母、無限大/無限大
実はlim f(x) =0.5
x→1
※今回は。因数分解して約分するとでてくる
微分
※微分は傾き
接線の傾き 近似
傾き:Y座標の変化をX座標の変化で割ったもの
f(x)=x^2の接戦の傾きは
( (x+h)^2-x^2 ) / h
=(x+h-x)(x+h+x) / h
= h (2x+h) / h
= 2x+h
ここでhを0に近づければ、接戦の傾き
lim (2h + h) = 2x
h→0
点xにおけるf(x)=x^2の接戦の傾きは2x
df(x)/dx = 2x
f(1)=x^2の接戦の傾きは
df(1)/dx = 2
※d differential 微分のd
xの係数が傾き
多変数関数
※入力が2個とか、3個とかはある→BMI
偏微分
変数を1つ決めて、それ以外の変数は気にせず微分
f(x,y)=x^2 + xy + y^2
xで微分
yで微分
勾配にむけて・・・最小値問題
点がある→直線を求める:線形回帰
回帰直線は
どうやって線を引いているか
実際のデータを1次式で表したときに誤差の和が最小になるように引く
勾配
・微分したもののこと
傾きが正か負かで進む方向を変える:勾配降下法
→勾配:のぼる方向、おりる方向がわかる
f(x)=x^2 の最小値
x=1としてスタート
f'(x)=2x
f'(1)=2 > 0 正なので、右に行くとのぼる
x=1-2
=-1
f'(-1)=-2 < 0 負なので左に行くとのぼる
※学習率をかけることにより変化しすぎるのを防ぐ
学習率a=0.1
f(x)=x^2 の最小値
x=1としてスタート
f'(x)=2x
f'(1)=2 > 0 正なので、右に行くとのぼる
x=1-2a
=1-0.2=0.8
f'(0.8)=1.6 > 0 正なので、右に行くとのぼる
x=0.8-1.6a
=0.8-0.2=0.8
= 0.64
f'(0.64)=1.28 > 0 正なので、右に行くとのぼる
x=0.64-1.28a
=0.64-0.128
= 0.512
問題:そもそも、微分をどうやって求める→定義に戻る。
コンピューターに微分を計算してもらうためには…
f'(x)=lim f(x+h)-f(x) / h
h→0
hが十分小さきとき:そこで満足する
hを十分小さくとって f(x+h)-f(x)/h ←これを微分として使う
勾配降下法
Step1 初期値を決める x=x0
(学習率を決める)
Step2 f'(x0)を計算する。
Step3 x←x-af'(x)
Step4 |f'(x)|が十分小さいなら終了
そうでないとき。反復回数が十分なら終了
そうでないときStep2にもどる
f'(x)を計算する
多変数に拡張した場合
Step1 初期値を決める x=x0 y=y0 (2つに増える)
(学習率を決める)
Step2 xの偏微分、yの偏微分を計算する。
Step3 x←x-axの偏微分、y←y-ayの偏微分
Step4 |xの偏微分^2+yの偏微分^2|が十分小さいなら終了
そうでないとき。反復回数が十分なら終了
そうでないときStep2にもどる
ところが、プログラムはxは変数→ベクトルに変わるだけ
なので、funcとx_initialをベクトルにする
diffをベクトルにする
勾配についてPythonで可視化して理解する
http://pynote.hatenablog.com/entry/math-gradient
最急降下法のアルゴリズム - Python 数値計算入門
https://python.atelierkobato.com/steep/
微積分についても教わってきた
機械学習・ディープラーニングを始めるための数学準備講座【関数・微分・勾配法編】
https://liberal-arts-beginners.connpass.com/event/140908/
ので、メモ
・関数・微分・勾配がなぜ重要か?
→関数値の最小化
関数
入力と出力の関係をうまく書いたもの
(漠然とした理解でも問題ない)
例:入力を2倍 f(x)=2x
f(x)=2x
入力が1のとき、2が出力されるのは
例:f(x)=x^2
入力が4のとき、4^4=16が出力される
※出力は1個(たか関数というのも理論的にはあるけど→円)
→2個以上あっても0個(なし)でもだめ。1個になること
極限
入力をある値に近づけていったときに、出力の値が何に近づくか
例:f(x)=2x
x=2 → 4
x=1.5 → 3
x=1.25 → 2.5
x=1.01 → 2.02
→2にちかずく
なぜ、1を代入しないのか:f(1)が求められないかもしれないから
lim 2x = 2
x→1
X→1のとき2x→2
今回は1を直接入力しても大丈夫
だめなときf(x)=(x-1)/(x^2-1)
1をいれると、0/0→不定形
※不定形 0が分母、無限大/無限大
実はlim f(x) =0.5
x→1
※今回は。因数分解して約分するとでてくる
微分
※微分は傾き
接線の傾き 近似
傾き:Y座標の変化をX座標の変化で割ったもの
f(x)=x^2の接戦の傾きは
( (x+h)^2-x^2 ) / h
=(x+h-x)(x+h+x) / h
= h (2x+h) / h
= 2x+h
ここでhを0に近づければ、接戦の傾き
lim (2h + h) = 2x
h→0
点xにおけるf(x)=x^2の接戦の傾きは2x
df(x)/dx = 2x
f(1)=x^2の接戦の傾きは
df(1)/dx = 2
※d differential 微分のd
xの係数が傾き
多変数関数
※入力が2個とか、3個とかはある→BMI
偏微分
変数を1つ決めて、それ以外の変数は気にせず微分
f(x,y)=x^2 + xy + y^2
xで微分
yで微分
勾配にむけて・・・最小値問題
点がある→直線を求める:線形回帰
回帰直線は
どうやって線を引いているか
実際のデータを1次式で表したときに誤差の和が最小になるように引く
勾配
・微分したもののこと
傾きが正か負かで進む方向を変える:勾配降下法
→勾配:のぼる方向、おりる方向がわかる
f(x)=x^2 の最小値
x=1としてスタート
f'(x)=2x
f'(1)=2 > 0 正なので、右に行くとのぼる
x=1-2
=-1
f'(-1)=-2 < 0 負なので左に行くとのぼる
※学習率をかけることにより変化しすぎるのを防ぐ
学習率a=0.1
f(x)=x^2 の最小値
x=1としてスタート
f'(x)=2x
f'(1)=2 > 0 正なので、右に行くとのぼる
x=1-2a
=1-0.2=0.8
f'(0.8)=1.6 > 0 正なので、右に行くとのぼる
x=0.8-1.6a
=0.8-0.2=0.8
= 0.64
f'(0.64)=1.28 > 0 正なので、右に行くとのぼる
x=0.64-1.28a
=0.64-0.128
= 0.512
問題:そもそも、微分をどうやって求める→定義に戻る。
コンピューターに微分を計算してもらうためには…
f'(x)=lim f(x+h)-f(x) / h
h→0
hが十分小さきとき:そこで満足する
hを十分小さくとって f(x+h)-f(x)/h ←これを微分として使う
勾配降下法
Step1 初期値を決める x=x0
(学習率を決める)
Step2 f'(x0)を計算する。
Step3 x←x-af'(x)
Step4 |f'(x)|が十分小さいなら終了
そうでないとき。反復回数が十分なら終了
そうでないときStep2にもどる
f'(x)を計算する
多変数に拡張した場合
Step1 初期値を決める x=x0 y=y0 (2つに増える)
(学習率を決める)
Step2 xの偏微分、yの偏微分を計算する。
Step3 x←x-axの偏微分、y←y-ayの偏微分
Step4 |xの偏微分^2+yの偏微分^2|が十分小さいなら終了
そうでないとき。反復回数が十分なら終了
そうでないときStep2にもどる
ところが、プログラムはxは変数→ベクトルに変わるだけ
なので、funcとx_initialをベクトルにする
diffをベクトルにする
勾配についてPythonで可視化して理解する
http://pynote.hatenablog.com/entry/math-gradient
最急降下法のアルゴリズム - Python 数値計算入門
https://python.atelierkobato.com/steep/