JavaScriptで勾配降下アルゴリズムを使用した非常に単純な線形回帰を実装しましたが、複数のソースを参照していくつかのことを試した後、収束することはできません。直線回帰の勾配降下が収束しない
データは絶対線形であり、入力としては0〜30の数字だけで、x * 3は正しい出力として学習します。
- 演習:私は含めて、さまざまな場所から数式を取っ
train(input, output) { const predictedOutput = this.predict(input); const delta = output - predictedOutput; this.m += this.learningRate * delta * input; this.b += this.learningRate * delta; } predict(x) { return x * this.m + this.b; }
:
この
は勾配降下の背後にあるロジックですalso here) - Stanford's CS229 Lecture Notes
- this other PDF slides I found from Carnegie Mellon
私はすでに試みた:
- 正規化入力値と出力値を[-1、1]〜[0,1に
- 正規化入力値と出力値の範囲]範囲
- 平均値= 0、標準偏差= 1の正規化入出力値
- 学習率を下げる(1e-7は私が行ったのと同じくらい低い)
- 非ゼロバイアス(
y = x * 3 + 2
) - -1と1の間のランダム 非ゼロ値を持つ重みを初期化して設定線形データを有する全て(
- にバイアスなしで設定線形データを有します
y = x * 3
)
なお、重み(this.b
およびthis.m
)はデータ値に近づくことはなく、無限に広がります。
明らかに何か間違っていますが、私はそれが何であるか把握できません。
更新:オンライン学習によると、私は、一次関数に簡単な近似をモデル化しようとしている
:ここに私の問題は、正確に何であるかを見つけ出すことに役立ちもう少し文脈です線形回帰擬似ニューロン。それによって、私のパラメータは次のとおりです。
- 重み:[
this.m
、this.b
] - 入力:[
x
、1
] - 活性化機能:など、私のネットとしてのアイデンティティ機能
z(x) = x
y = this.m * x + this.b * 1
で表され、近似したいデータ駆動関数をシミュレートします(y = 3 * x
)。
私のネットワークは、パラメータthis.m = 3
とthis.b = 0
を「学習」したいのですが、ローカルミニマムに陥っているようです。
私の誤差関数は、平均二乗誤差である:
error(allInputs, allOutputs) {
let error = 0;
for (let i = 0; i < allInputs.length; i++) {
const x = allInputs[i];
const y = allOutputs[i];
const predictedOutput = this.predict(x);
const delta = y - predictedOutput;
error += delta * delta;
}
return error/allInputs.length;
}
私の重みを更新するための私のロジックはのためにwi -= alpha * dError/dwi
(私がこれまでにチェックした情報源による)になります私は体重をthis.m
とthis.b
と呼びますので、JavaScriptコードに戻すことができます。予測値はy^
とも呼ばれます。ここから
:体重補正ロジックにあることを適用する
error = y - y^
= y - this.m * x + this.b
dError/dm = -x
dError/db = 1
そしてそう、:
this.m += alpha * x
this.b -= alpha * 1
しかし、これは全く正しいようではありません。
文脈のないコードがあるため、これは広すぎます。しかし、この '' 'this.m + = this.learningRate * delta * input;' 'は馴染んでいません。入力はここでは何もしません。バイアス処理も奇妙に見えます。私はJSに精通していないので、私はそれらの表現がベクトル化された表現であると期待していますか?そうでない場合は、最初から始めてください。 – sascha
学習アルゴリズムは 'w + = learningRate * gradient * input'ではありませんか?それは、常に「m」に関して「y = m.x + b」の導関数の結果として現れる。 (どちらか、それとも私はそれを完全に誤解しています) – Alpha
@sascha PS:これよりもはるかに多くのコードはありませんが、教えてください。 – Alpha