Реализация поиска минимума функции методом градиентного спуска в среде MatLab | Статья в журнале «Молодой ученый»

Отправьте статью сегодня! Журнал выйдет 30 ноября, печатный экземпляр отправим 4 декабря.

Опубликовать статью в журнале

Автор:

Научный руководитель:

Рубрика: Технические науки

Опубликовано в Молодой учёный №9 (508) март 2024 г.

Дата публикации: 01.03.2024

Статья просмотрена: 382 раза

Библиографическое описание:

Гелашвили, А. А. Реализация поиска минимума функции методом градиентного спуска в среде MatLab / А. А. Гелашвили. — Текст : непосредственный // Молодой ученый. — 2024. — № 9 (508). — С. 82-86. — URL: https://moluch.ru/archive/508/111684/ (дата обращения: 16.11.2024).



В данной статье описана реализация метода градиентного спуска в программе MatLab.

Ключевые слова: поиск минимума, поиск экстремума, оптимизация, метод градиентного спуска, метод наискорейшего спуска.

Введение.

Машинное обучение сейчас занимает чуть ли не первое место среди наиболее быстро развивающихся направлений науки и является очень перспективным направлением для различных разработок. В современном машинном обучении применяется множество математических методов и алгоритмов оптимизации. Один из них — метод градиентного спуска.

Градиентный спуск — это алгоритм оптимизации, используемый для минимизации ошибок в модели машинного обучения. Особенно большой интерес к градиентным методам в последние годы связан с тем, что градиентные спуски и их рандомизированные варианты лежат в основе почти всех современных алгоритмов обучения, разрабатываемых в анализе данных [1]. Теперь подробнее рассмотрим суть метода.

Идея метода.

Задача — поиск минимума некоторой функции с начальным приближением (некоторой точкой, в окрестности которой возможно наблюдается экстремум). Главное условие работы метода — возможность вычисления градиента этой функции. Суть метода заключается в том, чтобы “двигаться” (осуществляя тем самым оптимизацию) в направлении антиградиента (то есть направлении наискорейшего спуска — из-за этого метод иногда называют методом наискорейшего спуска); но для реализации этой идеи нам потребуется умножать антиградиент функции на некоторое число, которое может быть как постоянным, так и меняться (в нашем случае будет использоваться постоянное), чтобы не “перепрыгнуть” экстремум при первой итерации и не потерять точность при последующих (при постоянной ). Формула, описывающая данную идею: ).

Алгоритм.

Имея формулу, предложенную выше несложно описать алгоритм, ищущий минимум функции данным методом. Таким образом нужно:

  1. Циклически выполнять описанное в формуле действие: ; а для поверхностей еще и .
  2. При срабатывании одного из критериев останова (которых довольно много) останавливать процесс. Причем критерий останова работает на основе вводимого параметра .
  3. Последняя полученная точка будет найденным минимумом.

Реализация.

Описанный алгоритм был реализован в виде отдельной функции, экспериментально выбрав критерий останова, который давал наибольшую точность (подробности реализации конкретного критерия можно увидеть в коде MatLab, представленном в листинге 3); тоже подобрана экспериментально, и в данном случае взята равной 0,01. Также в связи с тем, что в условии нашей задачи сказано найти минимум поверхности, реализация метода будет включать в себя оптимизацию не только по x, но и по y аналогичным способом. Во время каждой итерации строится точка, соответствующая последнему найденному x и y на уже созданном ранее графике, содержащем саму поверхность и точку минимума, найденную стандартным методом, который был реализован также в отдельной функции (представлена в листинге 2). Для следующей задачи: после выполнения программа выводит следующее:

«Стандартный» метод:

Точка (1.0000, 2.0000) является минимумом. Значение функции в данной точке: -5.0000

Метод градиентного спуска:

Точка (1.0158, 2.0000) является экстремумом. Количество итераций, потребовавшихся для поиска: 275

Таким образом мы видим, что метод градиентного спуска работает с некоторой точностью, и она ограничена, в данном случае, тем, что по y функция “пришла” к точке, в которой наблюдается экстремум, быстрее (причем, как выяснилось, зависимость от не линейна и никак не связана с его порядком, потому что в данном примере был равен 0,001).

Графики:

Найденные экстремумы, двумерный вид

Рис. 1. Найденные экстремумы, двумерный вид

“Путь” градиентного метода, трехмерный вид

Рис. 2. “Путь” градиентного метода, трехмерный вид

Код основной программы:

clear

clf

clc

close

hold on

grid on

syms x y

%Записываем функцию и ищем двумя методами

f=x^2+y^3-2*x-3*y^2;

%Поверхность

[X Y]=meshgrid(-10:.1:10);

Z=X.^2+Y.^3-2.*X-3.*Y.^2;

surf (X,Y,Z);

fprintf('"Стандартный" метод:\n');

[a,b]=ex(f);

plot3(a,b,subs(f,{x,y},[a,b]),'*b');

fprintf('Метод градиентного спуска:\n');

[U,I,iter]=gradient_descent(5,5,f,0.001);

fprintf('Точка (%.4f,%.4f) является экстремумом. Количество итераций, потребовавшихся для поиска: %d\n',double(U),double(I),double(iter));

colormap cool

shading interp

legend('Исследуемая поверхность','Экстремум стандартным методом','"Путь" поиска минимума градиентным методом');

%axis([-2 6 0 7]);

xlabel('X');

ylabel('Y');

zlabel('Z');

figure;

hold on

grid on

contour(X,Y,Z,50);

plot(a,b,'*b');

plot(U,I,'*r');

colormap cool

shading interp

legend('Линии уровня исследуемой поверхности','Экстремум стандартным методом','Экстремум градиентным методом');

xlabel('X');

ylabel('Y');

Рис. 3. Листинг 1. Код программы

Код функции ex:

function[out1, out2]=ex(f)

syms x y;

dfx=diff(f,x);

dfy=diff(f,y);

d1=diff(dfx,x);

d2=diff(dfx,y);

d3=diff(dfy,y);

[a,b]=solve(dfx,dfy);

a=a(abs(imag(double(a)))<10^(-8));

b=b(abs(imag(double(a)))<10^(-8));

for i=1:length(a)

A=subs(subs(d1,x,a(i)),y,b(i));

B=subs(subs(d2,x,a(i)),y,b(i));

C=subs(subs(d3,x,a(i)),y,b(i));

D=double(A*C-B^2);

z=subs(subs(f,x,a(i)),y,b(i));

if D>0

if A>0

fprintf('Точка (%.4f,%.4f) является минимумом. Значение функции в данной точке: %.4f\n',double(a(i)),double(b(i)),double(z));

out1=a(i);

out2=b(i);

else

fprintf('Точка (%.4f,%.4f) является максимумом. Значение функции в данной точке: %.4f\n',double(a(i)),double(b(i)),double(z));

out1=a(i);

out2=b(i);

end

elseif D<0

%fprintf('Точка (%.2f,%.2f) не является экстремумом.\n',double(a(i)),double(b(i)));

else

fprintf('Точка (%.2f,%.2f) требует дополнительных исследований.\n',double(a(i)),double(b(i)));

end

end

end

Рис. 4. Листинг 2. Код функции ex

Код функции gradient_descent:

function[out1,out2,out3]=gradient_descent(g,h,f,eps)

hold on

grid on

k=1;

lm=0.01;

%delta=0.9;

X(1)=g;

Y(1)=h;

syms x y

diff(f,x);

diff(f,y);

while (k<1000)

X(k+1)=X(k)-lm*(subs(diff(f,x),x,X(k)));

Y(k+1)=Y(k)-lm*(subs(diff(f,y),y,Y(k)));

%Лучшая проверка:

CND1=(((subs(diff(f,x),x,X(k)))^2 + (subs(diff(f,y),y,Y(k)))^2) <= eps);

%Хорошая проверка

%CND2=((abs(subs(subs(f,x,X(k+1)),y,Y(k+1))-subs(subs(f,x,X(k)),y,Y(k)))) <=eps);

if CND1

out1=X(k+1);

out2=Y(k+1);

break

End

k=k+1;

plot3(X(k),Y(k),subs(f,{x,y},[X(k),Y(k)]),'.r')

end

out1=X(k);

out2=Y(k);

out3=k;

if k==1000

disp('Перебор...')

end

end

Рис. 5. Листинг 3. Код функции gradient_descent

Литература:

  1. Градиентный спуск — Википедия // ВикипедиЯ URL: https://ru.wikipedia.org/wiki/Градиентный_спуск (дата обращения: 25.01.24).
  2. Горлач Б. А., Шахов, В. Г. Математическое моделирование. Построение моделей и численная реализация: Учебное пособие. — СПб.: Издательство «Лань», 2016. — 292 c. — (Учебники для вузов. Специальная литература) https://e.lanbook.com/reader/book/169100/#99.
  3. Горлач Б. А. Математический анализ: Учебное пособие. — СПб.: Издательство «Лань», 2013. — 608 с.: ил. — (Учебники для вузов. Специальная литература) https://e.lanbook.com/reader/book/4863/#316.
  4. Вычислительные методы линейной алгебры [Текст] / Д. К. Фаддеев, В. Н. Фаддеева. — 3-е изд., стер. — Санкт-Петербург: Лань, 2002. — 733 с.: ил., табл.; 20 см.; ISBN 5–8114–0317–8.
Основные термины (генерируются автоматически): градиентный спуск, код функции, стандартный метод, градиентный метод, значение функции, критерий останова, наискорейший спуск, экстремум, машинное обучение, отдельная функция.


Ключевые слова

оптимизация, метод градиентного спуска, поиск минимума, поиск экстремума, метод наискорейшего спуска

Похожие статьи

Реализация алгоритма поиска ближайших объектов с помощью K-D tree

В данной статье разработан алгоритм поиска ближайших объектов с помощью вспомогательной структуры, основанной на K-D tree, а также рассматривается приложение на языке Java, реализующее данный алгоритм.

Комбинированный алгоритм линейной оптимизации с поиском максимального потока на графе

В данной статье приводится описание комбинированного алгоритма линейной оптимизации с поиском максимального потока на графе на примере оптимизации работы железнодорожной станции со сложной топологией путей.

Разработка приложения для решения задачи о максимальном потоке

В статье представлена процесс разработки пользовательского приложения, решающего задачу поиска максимального потока алгоритмами Форда-Фалкерсона и Эдмонса-Карпа.

Решение многокритериальных задач линейного программирования (ЗЛП) методом последовательных уступок в MatLab

Оптимизация работы программы по скорости методами программирования без условных операторов

В статье приводится описание техники программирования без использования условных операторов. Такая техника позволяет минимизировать эффект ошибочного предсказания ветви процессора. Приводится сравнение скорости работы функций с условными операторами ...

Применение векторизации слов для нечеткого поиска

В этой статье рассматриваются вопросы выполнения нечеткого поиска, извлечение семантики слов и применение векторной модели для расширения поиска. Изложены общие идеи при решении поставленной задачи, приводятся алгоритмы с их последующей реализацией и...

Аппроксимация полиномов n степени методом наименьших квадратов

В данной статье рассмотрено решение проблемы уменьшения суммы квадратов отклонений определённых функций от искомых переменных для полиномиальных уравнений n степени. Приведено подробное решение для уравнений 2 степени, рассматриваемой проблемы. Предс...

Распараллеливание решения задач с использованием раскраски графа

В данной статье авторы рассматривают переупорядочивание матрицы на основе раскраски графа для обеспечения ускорения алгоритма неполной LU-факторизации на GPU.

Многопоточность в языке Swift

В статье рассмотрим основной способ выполнять код асинхронно, который используется в iOS приложениях. Подробно разобран основной функционал Grand Central Dispatch (GCD) и сценарии, в которых можно реализовать многопоточность с его помощью.

Разработка в среде C# программной реализации алгоритма выделения структурных особенностей

В работе описана реализация алгоритма выделения структурных особенностей матриц на языке C#. Представлена архитектура программы. Были проведены вычислительные эксперименты, результаты которых продемонстрированы в виде графиков.

Похожие статьи

Реализация алгоритма поиска ближайших объектов с помощью K-D tree

В данной статье разработан алгоритм поиска ближайших объектов с помощью вспомогательной структуры, основанной на K-D tree, а также рассматривается приложение на языке Java, реализующее данный алгоритм.

Комбинированный алгоритм линейной оптимизации с поиском максимального потока на графе

В данной статье приводится описание комбинированного алгоритма линейной оптимизации с поиском максимального потока на графе на примере оптимизации работы железнодорожной станции со сложной топологией путей.

Разработка приложения для решения задачи о максимальном потоке

В статье представлена процесс разработки пользовательского приложения, решающего задачу поиска максимального потока алгоритмами Форда-Фалкерсона и Эдмонса-Карпа.

Решение многокритериальных задач линейного программирования (ЗЛП) методом последовательных уступок в MatLab

Оптимизация работы программы по скорости методами программирования без условных операторов

В статье приводится описание техники программирования без использования условных операторов. Такая техника позволяет минимизировать эффект ошибочного предсказания ветви процессора. Приводится сравнение скорости работы функций с условными операторами ...

Применение векторизации слов для нечеткого поиска

В этой статье рассматриваются вопросы выполнения нечеткого поиска, извлечение семантики слов и применение векторной модели для расширения поиска. Изложены общие идеи при решении поставленной задачи, приводятся алгоритмы с их последующей реализацией и...

Аппроксимация полиномов n степени методом наименьших квадратов

В данной статье рассмотрено решение проблемы уменьшения суммы квадратов отклонений определённых функций от искомых переменных для полиномиальных уравнений n степени. Приведено подробное решение для уравнений 2 степени, рассматриваемой проблемы. Предс...

Распараллеливание решения задач с использованием раскраски графа

В данной статье авторы рассматривают переупорядочивание матрицы на основе раскраски графа для обеспечения ускорения алгоритма неполной LU-факторизации на GPU.

Многопоточность в языке Swift

В статье рассмотрим основной способ выполнять код асинхронно, который используется в iOS приложениях. Подробно разобран основной функционал Grand Central Dispatch (GCD) и сценарии, в которых можно реализовать многопоточность с его помощью.

Разработка в среде C# программной реализации алгоритма выделения структурных особенностей

В работе описана реализация алгоритма выделения структурных особенностей матриц на языке C#. Представлена архитектура программы. Были проведены вычислительные эксперименты, результаты которых продемонстрированы в виде графиков.

Задать вопрос