勾配降下法は、与えられた関数を最小化するための反復アプローチです。解の初期推定から始め、その時点での関数の勾配を取得します。勾配の負の方向に解を進め、プロセスを繰り返します。アルゴリズムは最終的に、勾配がゼロ (極小値に対応) になる場所に収束します。したがって、あなたの仕事は、損失関数を最小化する theta0 と theta1 の値を見つけることです [たとえば、最小二乗誤差]。「収束」という用語は、局所的な最小値に到達し、それ以上の反復がパラメーターの値に影響を与えないことを意味します。つまり、theta0 と theta1 の値は一定のままです。例を見てみましょう 注: この説明では、最初の象限にあると仮定します。

関数 f(x) [あなたのケースではコスト関数] を最小化する必要があるとしましょう。このためには、f(x) の関数値を最小化する x の値を見つける必要があります。これは、勾配降下法を使用して x の値を見つけるための段階的な手順です。
- x の初期値を選択します。図の点Aにあるとしましょう。
- A での x に対する f(x) の勾配を計算します。
- これにより、点 A での関数の勾配が得られます。関数が A で増加しているため、正の値が得られます。
- x の初期推定値からこの正の値を減算し、 xie の値を更新します
x = x - [Some positive value]
。これにより、x が D [つまり最小値] に近づき、f(x) の関数値が減少します [図から]。反復 1 の後、点 B に到達したとします。
- B点では、手順4で述べたのと同じプロセスを繰り返し、C点に到達し、最終的にD点に到達します。
- 点 D では極小であるため、勾配を計算すると 0 [または 0 に非常に近い] が得られます。ここで、 x ie の値を更新しようとします
x = x - [0]
。同じ x [または前の x に非常に近い値] が得られます。この状態は「収束」として知られています。上記の手順は勾配を増加させるためのものですが、勾配を減少させる場合にも同様に有効です。たとえば、点 G の勾配は負の値になります。x ie を更新するとx = x - [ negative value] = x - [ - some positive value] = x + some positive value
。これにより x の値が増加し、x が点 F [または最小値に近づく] に近づきます。
この勾配降下を解決するには、さまざまなアプローチがあります。@mattnedrichが言ったように、2つの基本的なアプローチは
この擬似コードは次のようになるため、反復回数 N を使用します。
iter = 0
while (iter < N) {
theta0 = theta0 - gradient with respect to theta0
theta1 = theta1 - gradient with respect to theta1
iter++
}
- theta0 と theta1 の 2 つの連続する値がほぼ同じになるまで繰り返します。擬似コードは、別の回答で @Gerwin によって提供されます。
勾配降下法は、線形回帰で関数を最小化するアプローチの 1 つです。直接解もある。バッチ処理 (正規方程式とも呼ばれます) を使用すると、1 つのステップで theta0 と theta1 の値を見つけることができます。X が入力行列、y が出力ベクトル、シータが計算するパラメーターの場合、二乗誤差法では、この行列方程式を使用して 1 つのステップでシータの値を見つけることができます。
theta = inverse(transpose (X)*X)*transpose(X)*y
しかし、これには行列計算が含まれているため、行列 X のサイズが大きい場合、勾配降下法よりも明らかに計算コストが高くなります。これがあなたの質問に答えてくれることを願っています。そうでない場合は、お知らせください。