ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

微積分とか、勾配降下法についても、教わってきた

2019-08-16 16:51:09 | Weblog
前に行列について教わってきたと書いたが、
微積分についても教わってきた

機械学習・ディープラーニングを始めるための数学準備講座【関数・微分・勾配法編】
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/




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする