2017-10-18 8 views
0

私は、JavaScriptの勾配降下を伴う最初の(単変量)線形回帰を実装しました。他のパラメータよりも1つのパラメータの収束が速い

const LEARNING_RATE = 0.000001; 

let m = 0; 
let b = 0; 

const hypothesis = x => m * x + b; 

const learn = (alpha) => { 
    if (x.length <= 0) return; 

    let sum1 = 0; 
    let sum2 = 0; 

    for (var i = 0; i < x.length; i++) { 
    sum1 += hypothesis(x[i]) - y[i]; 
    sum2 += (hypothesis(x[i]) - y[i]) * x[i]; 
    } 

    b = b - alpha * sum1/(x.length); 
    m = m - alpha * sum2/(x.length); 
} 

// repeat until convergence learn(LEARNING_RATE); 

仮説におけるM用のスロープを迅速に調整するが、y軸に交点が調整する年齢を取ります。私はそれを動作させるために、bに対して異なる学習率を使用しなければならなかった。

const learn = (alpha) => { 
    if (x.length <= 0) return; 

    let sum1 = 0; 
    let sum2 = 0; 

    for (var i = 0; i < x.length; i++) { 
    sum1 += hypothesis(x[i]) - y[i]; 
    sum2 += (hypothesis(x[i]) - y[i]) * x[i]; 
    } 

    b = b - 100000 * alpha * sum1/(x.length); 
    m = m - alpha * sum2/(x.length); 
} 

アルゴリズムの問​​題の方向を誰かが指摘できますか? GitHub repositoryおよびthis articleに見つけることができます。

答えて

0

まず、収束のスピードをバイアスの変化の速さではなく、グローバルな最小値にする必要があります。モデルにエラーはありません(おそらく2/N係数を忘れるかもしれませんが、mとb係数についてはこのパラメータは1になります)。

あなたが知っているように、勾配降下法は、各繰り返しで重みを更新するための予測からの誤差を使用しています。あなたの偏見に小さな誤差がある場合、更新は小さな変化をつかむでしょう。これは、モデルの通常の動作です。

There are例をよく説明します。

PS。学習率のカスタム変更は、異常行動やgminimumに減少する問題につながります。 this courseをお勧めします。 link for course I have posted above

+0

ご返信ありがとうございます。アルゴリズム自体に間違いがないと私はあなたを正しくしましたか?しかし、わずかな学習率で学習するだけで時間がかかりますか? –

+1

はい、間違いはありませんでした。はい、小規模の学習率の場合は、後で極端に分かります。 –

関連する問題