スキップしてメイン コンテンツに移動

Implementation of Robbins monro

Robbins monro の実装
sorry, this page is Japanese only. 
今回はRobbins monro の実装をしてみました。
Robbins monroは確率勾配降下法の学習率を入りテーション回数の逆数で割っていくものです。
使っているprogram言語はpython 3です。osはwindowsです。(macほしい...)


アルゴリズム
確率勾配降下方とは目的関数の最適解を求めるアルゴリズムです。目的関数をf(X)とすると、手順は以下のようになっています。

  1. 初期学習率$n_0$を決めます。訓練データDを用意します。この訓練データは複数の初期値の集まりです。
  2. 訓練データから一つ初期値をランダムに取り出し、これを$x_0$とし、最初の予測値とします。
  3. 次の式に現在の予測値$x_0$を代入し、新たな予測値$x_{n+1}$を得ます。$$x_{n+1} = x_{n} - \frac{n_0}{n} grad f(X_n)$$
  4. 収束して入れば4へ、収束していなければ2で得られた値$x{n+1}$を新たに$x_n$としてもう一度2を行う。
  5. 訓練データを一周していなければ2へ、一周していれば各初期値から得られた解の中から目的関数を最も小さくするものを選ぶ。  
実装例
以下の目的関数を最小化させてみましょう。
$$f(x,y) = (x-2)^2 + (y-3)^2 $$

コマンドラインでpythonを実行していきます。




予想通り、(2,3)という解を導き出してくれました。目的関数が簡単だったので、初期値をどの値でとってもばっちり正解にたどり着いてくれました。

CODE
以下にRobbins monroの関数だけ置いておきます。こちらにすべてのコードを載せています。
def Robbins_monro(function,grad,number_variable_gradient):

    init_learning_rate = 1.5

    stepsize = 1000

    init_value = np.array([range(-1000,1020,20) for i in range(number_variable_gradient)])

    possibility_solution = np.zeros((number_variable_gradient,101))
    for n in range(len(init_value[0,:])):
        old_estimation = init_value[:,n]
        for step in np.arange(1,stepsize+1):
            n_step = init_learning_rate/step
            old_estimation_t = old_estimation

            new_estimation = old_estimation - n_step*grad(old_estimation)
            old_estimation = new_estimation

        if n % 10 == 0:
            print('%s taimes step is comlicated \n'%n)
        possibility_solution[:,n] = new_estimation

    estimation = possibility_solution[:,0]
    for j in range(len(possibility_solution[:,0])):
        if function(estimation) > function(possibility_solution[:,j]):
            estimation = possibility_solution[:,j]

    return estimation



コメント

このブログの人気の投稿

Discrete Fourier transform

Introduction 日本語 ver I will write about Discrete Fourier transform. Discrete Fourier transform is Abbreviated DFT. I am making pdf about Audio Signal Processing. I publish pdf at  github . However, I write tex in Japanese. I take a lecture about the signal processing. There is lecture at  thie page . I update this pdf.

Bayes' theorem

Introduction sorry, this page is Japanese only.   今回はベイズの定理について書こうと思います。 ベイズの定理とは、イギリスのトーマス・ベイズによって発見された、条件付き確率に関する定理です。現在のベイズ推定で用いられる重要な定理です。どのような定理かを解説していこうと思います。 ベイズの定理 ベイズの定理とは 確率P(B|A):事象Aが起こった後での事象Bの確率(事後確率) 確率P(B):事象Aが起こる前の事象Bの確率(事前確率) とするとき以下が成り立つことを示しています。 $$P(B|A) = \frac{P(A|B) P(B)}{P(A)}$$ 例 例えば、次のように事象A、事象Bwo定義します。 事象A:あるYoutuberが動画を投稿したとき、再生回数が100万回を超える 事象B:あるYoutuberがお金を50万円以上使う動画を投稿する この時確率P(A|B)、つまり50万円以上を使った動画が再生回数100万回を超える確率は、youtube内の50万円以上使っている動画を根こそぎ集め、その再生回数を得ることによって推定できそうです。では確率P(A|B)がわかった時、確率P(B|A)もわかる。これがベイズの定理の強みです。(当然確率P(A)とP(B)がわかっている必要はあります。) 確率P(B|A)とはあるYoutuberの動画が再生回数100万回を超えたとき、その同がで50万円以上使っている確率となります。これがわかれば、100万回動画が再生される原因は本当に50万円以上お金を使うことなのかがわかります。 確率P(A|B)が低い時を考えてみましょう。 つまり、50万円以上使った動画は再生回数100万回を超える確率は高い。しかし、100万回再生回数を突破したとき、その動画が50万円以上使っている可能性は低い。この状況はベイズの定理の式を考えいると理解しやすいです。 ベイズの定理の式を見てみると、P(B|A)は低く、P(A|B)が高いということは、確率P(A)が著しく高い。もしくは、P(B)が著しく低い。この二つがあげられます。 つまり、あるYouruberが100万回再生を突破する確率がかなり、高い。もしくは、あるYoutuber...

Plane in two dimention

Introduction 日本語 ver Today, I prove this theorem. Plane in two dimention is expressed following. \[\{x|<x,v> = 0\}\] however, v is orthogonal vector for plane and not zero vector. Proof \[\forall k \in \{x|<x,v> = 0\},\] k is fulfill this form. \[<k,v> = 0\] Now, because k and v in two dimentinal space, each vector express following. \[k = (k_1,k_2)\] \[v = (v_1,v_2)\] Thus, \(<k,v>=k_1v_1 + k_2v_2=0\) Change this equation. \[k_2 = -\frac{v_1}{v_2} k_1\] This equation is plane that slope is \(-\frac{v_1}{v_2}\). Q.E.D