1. 序章

このチュートリアルでは、 GradientDescentアルゴリズムについて学習します。 Javaでアルゴリズムを実装し、段階的に説明します。

2. 最急降下法とは何ですか?

最急降下法は、特定の関数の極小値を見つけるために使用される最適化アルゴリズムです。損失関数を最小化するために、高レベルの機械学習アルゴリズム内で広く使用されています。

勾配は傾斜の別の言葉であり、降下は下降を意味します。 名前が示すように、最急降下法は関数の最後に到達するまで関数の勾配を下っていきます。

3. 最急降下法の特性

最急降下法は、グローバル最小値とは異なる可能性のあるローカル最小値を検出します。開始ローカルポイントは、アルゴリズムのパラメーターとして指定されます。

これは反復アルゴリズムであり、各ステップで、勾配を下って極小値に近づこうとします。

実際には、アルゴリズムはバックトラッキングです。 このチュートリアルでは、最急降下法のバックトラックを説明して実装します。

4. ステップバイステップの図

最急降下法には、入力として関数と開始点が必要です。 関数を定義してプロットしてみましょう。

任意の時点から開始できます。 x =1から始めましょう。

最初のステップでは、最急降下法が事前定義されたステップサイズで勾配を下ります。

次に、同じステップサイズでさらに進みます。 ただし、今回は最後のステップよりもyが大きくなります。

これは、アルゴリズムが極小値を通過したことを示しているため、ステップサイズを小さくして逆方向に進みます。

その後、現在のyが前のyよりも大きい場合は常に、ステップサイズが小さくなり、無効になります。 反復は、目的の精度が達成されるまで続きます。

ご覧のとおり、最急降下法はここでローカル最小値を見つけましたが、グローバル最小値ではありません。 x =1ではなくx =-1から開始すると、グローバル最小値が見つかります。

5. Javaでの実装

最急降下法を実装する方法はいくつかあります。 ここでは、勾配の方向を見つけるために関数の導関数を計算しないため、この実装は微分不可能な関数に対しても機能します。

precisionstepCoefficientを定義し、それらに初期値を与えましょう。

double precision = 0.000001;
double stepCoefficient = 0.1;

最初のステップでは、比較用の前のyはありません。 x の値を増減して、yが上下するかどうかを確認できます。 正のstepCoefficientは、xの値を増やしていることを意味します。

それでは、最初のステップを実行しましょう。

double previousX = initialX;
double previousY = f.apply(previousX);
currentX += stepCoefficient * previousY;

上記のコードでは、 f関数 、 と initialXダブル 、両方とも入力として提供されます。

考慮すべきもう1つの重要なポイントは、最急降下法が収束することが保証されていないことです。 ループに陥らないように、反復回数に制限を設けましょう。

int iter = 100;

後で、iterを反復ごとに1つずつデクリメントします。 したがって、最大100回の反復でループから抜け出します。

previousX ができたので、ループを設定できます。

while (previousStep > precision && iter > 0) {
    iter--;
    double currentY = f.apply(currentX);
    if (currentY > previousY) {
        stepCoefficient = -stepCoefficient/2;
    }
    previousX = currentX;
    currentX += stepCoefficient * previousY;
    previousY = currentY;
    previousStep = StrictMath.abs(currentX - previousX);
}

各反復で、新しい y を計算し、それを以前のyと比較します。 currentYpreviousYより大きい場合、方向を変更してステップサイズを小さくします。

ステップサイズが目的の精度より小さくなるまで、ループが続きます。 最後に、currentXをローカル最小値として返すことができます。

return currentX;

6. 結論

この記事では、段階的な図を使用して最急降下アルゴリズムについて説明しました。

また、Javaで最急降下法を実装しました。 コードはGitHubから入手できます。