ЦОС Python #2: Метод градиентного спуска
HTML-код
- Опубликовано: 6 фев 2025
- Теория и практика метода градиентного спуска (метод наискорейшего спуска). Как выбирается шаг сходимости, к чему приводит нормировка градиента.
Инфо-сайт: proproprogs.ru
Файлы grad1_1.py и grad1_2.py: github.com/sel...
Отличное объяснение, я кайфанул))) Искренне не понимаю, почему преподы в университете не могут рассказывать так же понятно.
скорее очень наглядно получается, когда демонстрируют работу. Преподам обязательно надо визуально подкреплять работу всего этого.
Спасибо за материал)
Вот такое объяснение я и искал. По-человечески, с примерами и пояснениями, а не сухим ученым языком. Я когда писал курсовые, всегда старался именно так излагать материал. Премного благодарен)
Пожалуй, самое понятное объяснение Градиентного спуска во всем Рунете! Спасибо
Разбирался в градиентном спуске, колеблясь "как точка около истины" пока не натолкнулся на это видео. Низкий поклон учителю!
лучшее объяснение градиентного спуска, мой лайк стремиться к плюс бесконечности
Блин мне бы такие видео уроки когда я учился... Понятно и главное интересно! Спасибо
Супер! Четко, ясно, локанично. Редко такое встречается. Спасибо за вашу работу!
очень круто и наглядно, спасибо! и отдельно за код на python:)
Превосходно! Спасибо большое! очень крутой стиль изложения!
это первое хорошее объяснение !!!
Довольно интересная подача. Благодарю!
Потрясающее объяснение, спасибо!
Спасибо за внятное объяснение.
Очень крутое объяснение!
Классное видео, все очень понятно, спасибо!
Спасибо вам за подробнейшее объяснение!!!
Очень доступно и понятно! Спасибо!!!
Спасибо большое за понятное объяснение!
8:30 да это же подойдёт для анимации мяча, который упал в ямку! 😍
Большое спасибо!
Восхитительно
Очень крутые уроки!
Благодарю, полезно, доступно
Очень классное видео! Спасибо
Круто! Спасибо!)
самое интересующее меня было - как найти величину шага. тут это по какой то причине не объяснено, пришлось искать на английские каналы, где всё по полочкам объяснено.
Величина шага сходимости ищется с помощью минимизации функции, мы хотим подобрать такой шаг, чтобы не улететь мимо минимума, а такого результата можно добиться с помощью такой штуки. Например, у меня есть функция x1^2 + x1 + 3x1x2 + 2x2^2 + x2 - 1, надо пройтись по ней методом наискор. спуска. Сначала ищем градиент функционала - это DF = ([2x1 +3x2 + 1], [3x1 +4x2 + 1]), начальное приближение возьмём как x0 = (0, 0). Запишем формулу первой итерации: x1 = x0 + L*DF(x0). Ищем х1: x1 = (0, 0) + L * (1,1) = (L, L), надо найти оптимальный L, это будет argminF(x1) = L^2 + L + 3L^2 + 2L^2 + L -1 = 6L^2 + L - 1. Минимум этой функции - вершина, так как это парабола, а значит её можно найти по формуле L0 = - b/2a = -1/12. Подставим к x1, получим (-1/12, -1/12) - это наша первая точка, дальше вторую итерацию можно записать как х2 = х1 + L*DF(x1) и т.д. В общем виде: xn+1 = xn + L*DF(xn). Вы можете мне возразить, а какого хуя там +, когда в видосе минус. Прикол в том, что с - мы идём вдоль антиградиента, когда с +, мы идём по градиенту.
Если хотите, можете просто в моей формуле поменять + на - и всё будет, как и в видеоролике. Надеюсь, что я нормально объяснил.
Супер!
оч. круто и понятно
Очень годно
👍👍👍👍👍
😎
А почему не используется библиотека decimal? Ведь она же позволяет убрать погрешность питона в работе с десятичными числами, а это очень важно для таких задач
Здравствуйте, спасибо за видео, вопрос такой зачем нужно вычислять градиент с помощью производной? направление движения мы поймем по разнице между выходным значением и эталоном. далее используем лямбда и все. Не совсем понятно зачем нужна производная. Спасибо
Производная (численно) как раз то, что вы сейчас сказали ))
Хорошо бы было упомянуть седловые точки
Ничего не понял, но насладился логикой объяснения.
А как поступать, если вычеслить производную достаточно проблиматично? (комбинация сложных функций типа Гамма функциая или бета и т.д. )
тогда использовать прилиженное вычисление, которое, в среднем, дает то же направление, что и истинный градиент
Обычно же эпсиланд используют для обозначения шага сходимости
в разной литературе по разному
Здравствуйте,
А что если мы изначально, случайным образом, попали в область локального максимума.
Как тогда в этом случае поведет себя эта программа.
будет колебаться вокруг него, если это единственный минимум, либо же может выскочить и перейти в локальный минимум
@@selfedu_rus спасибо за ответ
реализовать подобную анимацию в юпитере как-то можно? там сразу конечный вариант графика выдаёт
в юпитере не работал с анимацией не скажу
так только через дикую задницу
for i in range(N):
xx = xx - lmd*df(xx) # изменение аргумента на текущей итерации по формуле град. спуска
point.set_offsets([xx, f(xx)]) # отображение нового положения точки на текущей итерации, которое получили в строке выше
# перерисовка графика и задержка на 30 мс
''' не работает в юпитере, только в обычном пайчарме
fig.canvas.draw()
fig.canvas.flush_events()
time.sleep(0.03)
'''
#plt.plot(pl.randn(100))
fig, ax = plt.subplots()
ax.grid(True)
ax.plot(x_plt, f_plt, c='#448800')
#point.Draw()
plt.scatter(xx, f(xx), c='red'if(i==N-1)else'blue' )
display.clear_output(wait=True)
display.display(plt.gcf())
time.sleep(0.03)
if i
Здравствуйте, попробовал написать такую же программу, но почему то выдает ошибку AttributeError: объект 'FigureCanvasTkAgg' не имеет атрибута 'flush' , подскажите. что делать)
За видео респект, интересно, кратко и понятно!
Первое. По этой ссылке исходники github.com/selfedu-rus/python-algorithms Второе, вместо canvas попробуйте plt.draw() и plt.gcf().canvas.flush_events()
При запуске программы точка не движется, мб быть я какую-нибудь из библиотек не добавил(
@@ДимаБарвинский-у6к странно, тогда просто посмотрите в документации по matplotlib - это он все рисует
А почему ось x которая вроде как ось абсцисс здесь называют осью ординат?
не нашел где, но во всех остальных случаях произносится "абсцисс"
@@selfedu_rus 4:00-4:10
да, это оговорка )
Ну я так понял здесь это не разбирается, но типа learning rate можно динамически изменять, типа от 0.9 до 0.01 и так за счет этого можно выйти из локального минимума
Пока нет алгоритмов, которые бы за приемлемое время (объем вычислений) находили глобальный оптимум. Поэтому классический градиентный спуск пытаются улучшить разными способами. Например, это оптимизация Adagard, Adadelta, Adam, моменты Нестерова и т.п.
А почему нельзя просто посчитать массив точек и выбрать наименьшую?
Во-первых, вы должны так сформировать этот массив, чтобы в нем было наименьшее значение. Если вы знаете, как это сделать, то уже что то знаете о граничных значениях и это можно использовать. Во-вторых, число оптимизируемых параметров часто составляет от нескольких сотен до миллионов (в нейронных сетях) и здесь простой перебор уже не поможет.
@@selfedu_rus, но ведь у вас в примере двадцать шагов с шагом примерно 0.2 или около того? Ведь алгоритм не с while, а с range(N)
@@savel2work ну это просто пример, в реальных задачах не всегда известен диапазон
@@selfedu_rus, а как же тогда поступать в реальности?
@@savel2work градиентный спуск, ему только начальное приближение нужно (можно взять случайное число и от него уже двигаться к оптимальному значению)
Это конечно все хорошо, но в Jupiter Notebook именно такой код не работает и никакой анимации вы не увидите
в первой ячейке перед импортами напиши %matplotlib
5+
+
это не наискорейший спуск