[Matlab-Algorithmus] Gradient Descent (mit vollständigem MATLAB-Code)

Vorwort

Gradientenabstiegsmethode

Gradientenabstiegsmethodeist ein iterativer Optimierungsalgorithmus zur Minimierung einer Funktion. Die Grundidee besteht darin, den Minimalpunkt der Funktion durch Berechnung des Gradienten (der Ableitung) der Funktion zu ermitteln. Beim Gradientenabstieg werden Parameter (oder Variablen) entlang der Richtung des negativen Gradienten aktualisiert, um den Wert der Funktion zu verringern.

Das Folgende ist eine grundlegende Beschreibung der Gradientenabstiegsmethode:

  1. Anfangspunkt auswählen: Wählen Sie einen Anfangspunkt als Ausgangspunkt für die Optimierung.
  2. Gradient berechnen: Berechnen Sie den Gradienten (Ableitung) der Funktion am aktuellen Punkt. Der Gradient ist ein Vektor, der die partielle Ableitung jeder Variablen enthält.
  3. Parameter aktualisieren: Passen Sie die Parameter entlang der Richtung des negativen Gradienten an. Die Schrittgröße dieser Anpassung wird durch eine positive Zahl gesteuert, die als Lernrate bezeichnet wird und die Größe jeder Parameteraktualisierung bestimmt.
    Parameter (t + 1) = ^{(t+1)}=( t + 1 )= Linie( t ) − η ⋅ ∇ f ( ^{(t)}-\eta \cdot \nabla f\left(\right.( T )Dief(Parameter ( t ) ) \left.^{(t)}\right)( t ) )
    wobeieta \etaeta ist die Lernrate,∇ f ( \nabla f\left(\right.f(Parameter ( t ) ) \left.^{(t)}\right)( t ) )ist der Gradient der Funktion am aktuellen Parameterpunkt.
  4. Iteration: Wiederholen Sie die Schritte 2 und 3, bis die Stoppbedingung erfüllt ist, z. B. eine vorgegebene Anzahl von Iterationen oder der Gradient klein genug ist.

Der Erfolg des Gradientenabstiegs hängt von der Wahl der geeigneten Lernrate, des Startpunkts und der Stoppbedingungen ab. Zu den verschiedenen Varianten gehören der stochastische Gradientenabstieg (SGD) und der Batch-Gradientenabstieg (BGD), die bei der Berechnung von Gradienten unterschiedliche Datensätze verwenden. SGD verwendet Zufallsstichproben, während BGD den gesamten Datensatz verwendet. Diese Varianten zeigen unterschiedliche Leistung bei unterschiedlichen Problemen und Datensätzen.

Text

Für die gegebene Funktion f ( x ) f(x)f ( x ) :
f ( x ) = x ( 1 ) 2 + x ( 2 ) 2 − 2 ⋅ x ( 1 ) ⋅ x ( 2 ) + sin ⁡ ( x ( 1 ) ) + cos ⁡ ( x ( 2 ) ) f(x)=x(1)^2+x(2)^2-2 \cdot x(1) \cdot x(2)+\sin (x(1))+\cos (x(2) )f ( x )=x ( 1 )2+x ( 2 )22x ( 1 )x ( 2 )+Sünde ( x ( 1 ))+cos ( x ( 2 ))

Berechnen Sie den Gradienten und optimieren Sie ihn dann mithilfe des Gradientenabstiegs. Der Gradient ist ein Vektor, der die partielle Ableitung jeder Variablen enthält. Für diese Funktion ist der Gradient ∇ f ( x ) \nabla f(x)f ( x ) kann durch Bildung der partiellen Ableitung jeder Variablen ermittelt werden.
∂ f ∂ x ( 1 ) = 2 ⋅ x ( 1 ) − 2 ⋅ x ( 2 ) + cos ⁡ ( x ( 1 ) ) ∂ f ∂ x ( 2 ) = 2 ⋅ x ( 2 ) − 2 ⋅ x ( 1 ) − sin ⁡ ( x ( 2 ) ) \begin{aligned} & \frac{\partial f}{\partial x(1)}=2 \cdot x(1)-2 \cdot x(2)+\cos (x(1)) \\ & \frac{\partial f}{\partial x(2)}=2 \cdot x(2)-2 \cdot x(1)-\sin (x(2)) \ end{aligned}x ( 1 ) f=2x ( 1 )2x ( 2 )+cos ( x ( 1 ))x ( 2 ) f=2x ( 2 )2x ( 1 )Sünde ( x ( 2 ) )

Dann lautet die Aktualisierungsregel der Gradientenabstiegsmethode:
x ( t + 1 ) = x ( t ) − η ⋅ ∇ f ( x ( t ) ) x(t+1)=x(t)-\eta \cdot \nabla f(x(t))x ( t+1 )=x ( t )Dief ( x ( t ))

Darunter η \etaeta ist die Lernrate, eine positive Zahl, die die Schrittgröße jeder Parameteraktualisierung steuert. Wählen Sie eine geeignete Lernrate und beginnen Sie am Anfangspunktx (0) x(0)x ( 0 ) startet die Iteration zur Optimierung.

Dies ist ein einfaches Framework für die Gradientenabstiegsmethode, und die Parameter und Beendigungsbedingungen können entsprechend der spezifischen Situation angepasst werden. Es gibt verschiedene Varianten der Gradientenabstiegsmethode, wie zum Beispiel den stochastischen Gradientenabstieg (SGD) und den Batch-Gradientenabstieg (BGD), und die konkrete Wahl hängt von der Art des Problems und der Größe des Datensatzes ab.

Code

Pseudocode

% 定义目标函数
f = @(x) x(1)^2 + x(2)^2 - 2*x(1)*x(2) + sin(x(1)) + cos(x(2));

% 定义目标函数的梯度
grad_f = @(x) [2*x(1) - 2*x(2) + cos(x(1)); 2*x(2) - 2*x(1) - sin(x(2))];

% 设置参数
学习率 = 0.01;
最大迭代次数 = 1000;
容许误差 = 1e-6;

% 初始化起始点
x = [0; 0];

% 梯度下降
for 迭代次数 = 1:最大迭代次数
    % 计算梯度
    梯度 = grad_f(x);
    
    % 更新参数
    x = x - 学习率 * 梯度;
    
    % 检查收敛性
    if norm(梯度) < 容许误差
        break;
    end
end

% 显示结果
fprintf('最优解: x = [%f, %f]\n', x(1), x(2));
fprintf('f(x)的最优值: %f\n', f(x));
fprintf('迭代次数: %d\n', 迭代次数);

Ausführbarer Code

% 定义目标函数
f = @(x) x(1)^2 + x(2)^2 - 2*x(1)*x(2) + sin(x(1)) + cos(x(2));

% 定义目标函数的梯度
grad_f = @(x) [2*x(1) - 2*x(2) + cos(x(1)); 2*x(2) - 2*x(1) - sin(x(2))];

% 设置参数
learning_rate = 0.01;
max_iterations = 1000;
tolerance = 1e-6;

% 初始化起始点
x = [0; 0];

% 梯度下降
for iteration = 1:max_iterations
    % 计算梯度
    gradient = grad_f(x);
    
    % 更新参数
    x = x - learning_rate * gradient;
    
    % 检查收敛性
    if norm(gradient) < tolerance
        break;
    end
end

% 显示结果
fprintf('Optimal solution: x = [%f, %f]\n', x(1), x(2));
fprintf('Optimal value of f(x): %f\n', f(x));
fprintf('Number of iterations: %d\n', iteration);

Ergebnis

Fügen Sie hier eine Bildbeschreibung ein

Guess you like

Origin blog.csdn.net/AlbertDS/article/details/135091901