انتقل إلى المحتوى

خوارزمية أصل التدرج: الفرق بين النسختين

من ويكيبيديا، الموسوعة الحرة
تم حذف المحتوى تمت إضافة المحتوى
أُنشئَت بترجمة الصفحة "Gradient descent"
وسوم: تغير في القوالب [المحتوى] [المحتوى2]
(لا فرق)

نسخة 18:35، 30 أبريل 2020

أصل التدرج هو خوارزمية تحسين تكرارية من الدرجة الأولى للعثور على الحد الأدنى المحلي لدالة قابلة للاشتقاق. للعثور على الحد الأدنى المحلي للدالة باستخدام منحدر التدرج ، نتخذ خطوات تتناسب مع سلبية التدرج (أو التدرج التقريبي) للدالة عند النقطة الحالية. ولكن إذا اتخذنا بدلاً من ذلك خطوات تتناسب مع إيجابية التدرج ، فإننا نقترب من الحد الأقصى المحلي لهذه الوظيفة ؛ يُعرف الإجراء بعد ذلك بصعود متدرج . تم اقتراح خوارزمية أصل التدرج من قبل العالم الرياضي كوشي في عام 1847. [1]

وصف

رسم توضيحي لأصل التدرج على سلسلة من مجموعات المستويات

يعتمد أصل التدرج على الملاحظة أنه إذا كانت الدالة متعددة المتغيرات معرفة و قابلة للاشتقاق في جوار النقطة ، فإن ينخفض بسرعة أكبرإذا ذهبنا من في اتجاه التدرج السلبي لـ في .

ويتبع ذلك أنه إذا كان

فإنه لكل صغيرة بما يكفي ، . وبعبارة أخرى ، الحد يطرح من لأننا نريد التحرك ضد التدرج نحو الحد الأدنى المحلي. مع أخذ هذه الملاحظة في الاعتبار ، يبدأ المرء بتخمين كحد أدنى محلي ،و يعتبر بعد ذلك التسلسل , بحيث:

لدينا تسلسل رتيب

لذا نأمل أن يكون التسلسل يتقارب نحو الحد الأدنى المحلي المطلوب. لاحظ أن قيمة حجم الخطوة يسمح بالتغيير في كل تكرار. مع بعض الافتراضات على الدالة (فمثلا، محدبة و ليبشيتزية ) وخيارات معينة من (على سبيل المثال ، يتم اختياره إما عن طريق البحث الخطي الذي يلبي شروط Wolfe ، أو طريقة Barzilai – Borwein [2] [3] الموضحة على النحو التالي) ،

يمكن ضمان التقارب إلى الحد الأدنى المحلي.

عندما تكون الدالة محدبة ، كل الحدود الدنيا المحلية هي أيضًا حد أدنى عام، لذلك في هذه الحالة يمكن أن يتقارب أصل التدرج إلى الحل العام.

هذه العملية موضحة في الصورة المجاورة. هنا من المفترض أن يتم تعريفها على المستوى ، وأن الرسم البياني له شكل وعاء . المنحنيات الزرقاء هي الخطوط الكنتورية ، أي المناطق التي تكون فيها قيمة ثابتة. يظهر سهم أحمر ينشأ عند نقطة اتجاه التدرج السلبي في تلك النقطة. لاحظ أن التدرج (السلبي) عند نقطة ما هو متعامد مع خط الكفاف الذي يمر عبر تلك النقطة. نرى أن أصل التدرج يقودنا إلى قاع الوعاء ، أي إلى النقطة التي تكون فيها قيمة الدالة هي الحد الأدنى.

أمثلة

يعاني أصل التدرج من مشاكل في الدوال "المرضية" مثل دالة Rosenbrock الموضحة هنا.

تحتوي دالة Rosenbrock على واد منحني ضيق يحتوي على الحد الأدنى. الجزء السفلي من الوادي مسطح للغاية. بسبب الوادي المسطح المنحني يكون التحسين متعرجًا ببطء مع أحجام خطوات صغيرة نحو الحد الأدنى.

يمكننا رؤية مثال آخر على الطبيعة المتعرجة لهذه الطرقية: فلنطبق خوارزمية أصل التدرج على الدالة التالية:

خوارزمية أصل التدرج في العمل. (1: كفاف)خوارزمية أصل التدرج في العمل. (2: السطح)

تعليقات

يعمل أصل التدرج في فضاءَات متعددة الأبعاد، حتى في الأبعاد اللانهائية. في الحالة الأخيرة ، تكون مساحة البحث عادةً عبارة عن فضاء دالي ، و نحسب مشتقة Fréchet الخاصة بالدالة التي سيتم تصغيرها لتحديد اتجاه الهبوط. [4]

يمكن أن يستغرق أصل التدرج العديد من التكرارات لحساب الحد الأدنى المحلي بالدقة المطلوبة ، إذا كان الانحناء في اتجاهات مختلفة مختلفًا تمامًا للدالة المحددة. لمثل هذه الدوال، فإن التهيئة المسبقة ، التي تغير هندسة المساحة لتشكيل مجموعات مستوى الوظيفة مثل الدوائر المتحدة المركز ، تعالج التقارب البطيء. ومع ذلك ، يمكن أن يكون إنشاء وتطبيق الشروط المسبقة مكلفًا من الناحية الحسابية.

يمكن دمج أصل التدرج مع بحث خطي ، للعثور على حجم الخطوة الأمثل محليًا في كل تكرار. يمكن أن يستغرق إجراء البحث الخطي وقتًا طويلاً.

على العكس من ذلك ، باستخدام ثابتة صغيرة يمكن أن يسفرعن تقارب ضعيف.

يمكن أن تكون الطرق المستندة إلى طريقة نيوتن وانقلاب الهسيان باستخدام تقنيات التدرج المترافق بدائل أفضل. [5] [6] بشكل عام ، تتقارب هذه الأساليب في عدد أقل من التكرارات ، ولكن تكلفة كل تكرار أعلى. ومن الأمثلة على ذلك طريقة BFGS التي تتكون من حساب مصفوفة في كل خطوة يتم من خلالها ضرب متجهة التدرج للذهاب إلى اتجاه "أفضل" ، مقترنًا بخوارزمية بحث خطي أكثر تعقيدًا ، للعثور على القيمة "الأفضل" لـ

بالنسبة للمسائل الكبيرة للغاية ، حيث تهيمن مشاكل ذاكرة الكمبيوتر ، يجب استخدام طريقة محدودة الذاكرة مثل L-BFGS بدلاً من BFGS أو أصل التدرج.

يمكن النظر إلى أصل التدرج على أنه تطبيق طريقة أويلر لحل المعادلات التفاضلية العادية لتدفق متدرج .

أمثلة حسابية

تطبق أمثلة التعليمات البرمجية التالية خوارزمية أصل التدرج للعثور على الحد الأدنى للدالة مع مشتقة:

حل ل وتقييم المشتق الثاني عند الحلول يبين أن الوظيفة لها نقطة هضبة عند 0 والحد الأدنى العام عند

بيثون

فيما يلي تطبيق بلغة برمجة Python :

next_x = 6 # We start the search at x=6
gamma = 0.01 # Step size multiplier
precision = 0.00001 # Desired precision of result
max_iters = 10000 # Maximum number of iterations

# Derivative function
def df(x): 
  return 4 * x ** 3 - 9 * x ** 2


for _ in range(max_iters):
  current_x = next_x
  next_x = current_x - gamma * df(current_x)

  step = next_x - current_x
  if abs(step) <= precision:
    break

print("Minimum at ", next_x)

# The output for the above will be something like
# "Minimum at 2.2499646074278457"

سكالا

هنا تنفيذ في لغة برمجة سكالا

import math._
 
val curX = 6
val gamma = 0.01 
val precision = 0.00001 
val previousStepSize = 1 / precision

def df(x: Double): Double = 4 * pow(x, 3) - 9 * pow(x, 2)

def gradientDescent(precision: Double, previousStepSize: Double, curX: Double): Double = {
 if (previousStepSize > precision) {
  val newX = curX + -gamma * df(curX)	
  println(curX)
  gradientDescent(precision, abs(newX - curX), newX)
 } else curX	 
}

val ans = gradientDescent(precision, previousStepSize, curX)
println(s"The local minimum occurs at $ans")

جافا

import java.util.function.Function;
import static java.lang.Math.pow; 
import static java.lang.Math.abs

double gamma = 0.01;
double precision = 0.00001;

Function<Double,Double> df = x -> 4 * pow(x, 3) - 9 * pow(x, 2);
	
double gradientDescent(Function<Double,Double> f) {

	double curX = 6.0;
	double previousStepSize = 1.0;

	while (previousStepSize > precision) {
	  double prevX = curX;
	  curX -= gamma * f.apply(prevX);
	  previousStepSize = abs(curX - prevX);
	}
	return curX;
}
	
double res = gradientDescent(df);
System.out.println(String.format("The local minimum occurs at %f", res));

لغة البرمجة C

ها هي نفس الخوارزمية المطبقة في لغة البرمجة C.

#include <stdio.h>
#include <stdlib.h> 

double dfx(double x) {
  return 4*(x*x*x) - 9*(x*x);
}

double abs_val(double x) {
  return x > 0 ? x : -x;
}

double gradient_descent(double dx, double error, double gamma, unsigned int max_iters) {
  double c_error = error + 1;
  unsigned int iters = 0;
  double p_error;
  while (error < c_error && iters < max_iters) {
    p_error = dx;
    dx -= dfx(p_error) * gamma;
	  c_error = abs_val(p_error-dx);
    printf("\nc_error %f\n", c_error);
    iters++;
  }
  return dx;
}

int main() {
  double dx = 6;
  double error = 1e-6;
  double gamma = 0.01;
  unsigned int max_iters = 10000;
  printf("The local minimum is: %f\n", gradient_descent(dx, error, gamma, max_iters));
  return 0;
}
// adjust training set size

const M = 10;

// generate random training set

const DATA = [];

const getRandomIntFromInterval = (min, max) =>
 Math.floor(Math.random() * (max - min + 1) + min);

const createRandomPortlandHouse = () => ({
 squareMeter: getRandomIntFromInterval(0, 100),
 price: getRandomIntFromInterval(0, 100),
});

for (let i = 0; i < M; i++) {
 DATA.push(createRandomPortlandHouse());
}

const _x = DATA.map(date => date.squareMeter);
const _y = DATA.map(date => date.price);

// linear regression and gradient descent

const LEARNING_RATE = 0.0003;

let thetaOne = 0;
let thetaZero = 0;

const hypothesis = x => thetaZero + thetaOne * x;

const learn = (x, y, alpha) => {
 let thetaZeroSum = 0;
 let thetaOneSum = 0;

 for (let i = 0; i < M; i++) {
  thetaZeroSum += hypothesis(x[i]) - y[i];
  thetaOneSum += (hypothesis(x[i]) - y[i]) * x[i];
 }

 thetaZero = thetaZero - (alpha / M) * thetaZeroSum;
 thetaOne = thetaOne - (alpha / M) * thetaOneSum;
}

const MAX_ITER = 1500;
for (let i = 0; i < MAX_ITER; i++) {
 learn(_x, _y, LEARNING_RATE);
 console.log('thetaZero ', thetaZero, 'thetaOne', thetaOne);
}


  1. ^ Lemaréchal، C. (2012). "Cauchy and the Gradient Method" (PDF). Doc Math Extra: 251–254.
  2. ^ Barzilai، Jonathan؛ Borwein، Jonathan M. (1988). "Two-Point Step Size Gradient Methods". IMA Journal of Numerical Analysis. ج. 8 ع. 1: 141–148. DOI:10.1093/imanum/8.1.141.
  3. ^ Fletcher، R. (2005). "On the Barzilai–Borwein Method". في Qi؛ Teo، K.؛ Yang، X. (المحررون). Optimization and Control with Applications. Applied Optimization. Boston: Springer. ج. 96. ص. 235–256. ISBN:0-387-24254-6.
  4. ^ Akilov، G. P.؛ Kantorovich، L. V. (1982). Functional Analysis (ط. 2nd). Pergamon Press. ISBN:0-08-023036-9.
  5. ^ Press، W. H.؛ Teukolsky، S. A.؛ Vetterling، W. T.؛ Flannery، B. P. (1992). Numerical Recipes in C: The Art of Scientific Computing (ط. 2nd). New York: Cambridge University Press. ISBN:0-521-43108-5.
  6. ^ Strutz، T. (2016). Data Fitting and Uncertainty: A Practical Introduction to Weighted Least Squares and Beyond (ط. 2nd). Springer Vieweg. ISBN:978-3-658-11455-8.