ЦОС Python #2: Метод градиентного спуска

Поделиться
HTML-код
  • Опубликовано: 6 фев 2025
  • Теория и практика метода градиентного спуска (метод наискорейшего спуска). Как выбирается шаг сходимости, к чему приводит нормировка градиента.
    Инфо-сайт: proproprogs.ru
    Файлы grad1_1.py и grad1_2.py: github.com/sel...

Комментарии • 78

  • @АлексейТаганрогов
    @АлексейТаганрогов 3 года назад +61

    Отличное объяснение, я кайфанул))) Искренне не понимаю, почему преподы в университете не могут рассказывать так же понятно.

    • @yaroslavsergeev6737
      @yaroslavsergeev6737 2 года назад +4

      скорее очень наглядно получается, когда демонстрируют работу. Преподам обязательно надо визуально подкреплять работу всего этого.
      Спасибо за материал)

  • @Ramozzzz
    @Ramozzzz 2 года назад +9

    Вот такое объяснение я и искал. По-человечески, с примерами и пояснениями, а не сухим ученым языком. Я когда писал курсовые, всегда старался именно так излагать материал. Премного благодарен)

  • @ВячеславКузнецов-ъ3щ
    @ВячеславКузнецов-ъ3щ 3 года назад +16

    Пожалуй, самое понятное объяснение Градиентного спуска во всем Рунете! Спасибо

  • @rustambox
    @rustambox 2 года назад +16

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

  • @БорисАстафьев-в9ъ
    @БорисАстафьев-в9ъ 3 года назад +4

    лучшее объяснение градиентного спуска, мой лайк стремиться к плюс бесконечности

  • @escozoonv
    @escozoonv 4 года назад +12

    Блин мне бы такие видео уроки когда я учился... Понятно и главное интересно! Спасибо

  • @eugeneyuriev9577
    @eugeneyuriev9577 4 года назад +12

    Супер! Четко, ясно, локанично. Редко такое встречается. Спасибо за вашу работу!

  • @Lina_sg
    @Lina_sg 2 года назад +5

    очень круто и наглядно, спасибо! и отдельно за код на python:)

  • @Alex_chist
    @Alex_chist 4 года назад +7

    Превосходно! Спасибо большое! очень крутой стиль изложения!

  • @данилкоролёв-ж9л
    @данилкоролёв-ж9л Год назад +2

    это первое хорошее объяснение !!!

  • @lordadwond3929
    @lordadwond3929 Год назад +2

    Довольно интересная подача. Благодарю!

  • @NickyBricky373
    @NickyBricky373 Год назад +3

    Потрясающее объяснение, спасибо!

  • @andreishichko7906
    @andreishichko7906 11 месяцев назад +2

    Спасибо за внятное объяснение.

  • @machinelearningpodcast9502
    @machinelearningpodcast9502 3 года назад +8

    Очень крутое объяснение!

  • @cantwaitforit
    @cantwaitforit 4 года назад +7

    Классное видео, все очень понятно, спасибо!

  • @ВасилийЛавский
    @ВасилийЛавский 2 года назад +3

    Спасибо вам за подробнейшее объяснение!!!

  • @sergeyrykunov6737
    @sergeyrykunov6737 3 года назад +4

    Очень доступно и понятно! Спасибо!!!

  • @vladimirpotapov7050
    @vladimirpotapov7050 3 года назад +1

    Спасибо большое за понятное объяснение!

  • @mar_kha
    @mar_kha Год назад

    8:30 да это же подойдёт для анимации мяча, который упал в ямку! 😍

  • @_crimson1624
    @_crimson1624 3 года назад +2

    Большое спасибо!

  • @АлексейБаринов-ь5н
    @АлексейБаринов-ь5н 2 года назад +2

    Восхитительно

  • @ChistoPit
    @ChistoPit 4 года назад +3

    Очень крутые уроки!

  • @cpp
    @cpp Год назад +1

    Благодарю, полезно, доступно

  • @hippityhoppityboom
    @hippityhoppityboom 4 года назад +2

    Очень классное видео! Спасибо

  • @danysprrr
    @danysprrr 3 года назад +3

    Круто! Спасибо!)

  • @LightningTrooper
    @LightningTrooper 2 года назад +5

    самое интересующее меня было - как найти величину шага. тут это по какой то причине не объяснено, пришлось искать на английские каналы, где всё по полочкам объяснено.

    • @stephencry
      @stephencry 11 месяцев назад

      Величина шага сходимости ищется с помощью минимизации функции, мы хотим подобрать такой шаг, чтобы не улететь мимо минимума, а такого результата можно добиться с помощью такой штуки. Например, у меня есть функция 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). Вы можете мне возразить, а какого хуя там +, когда в видосе минус. Прикол в том, что с - мы идём вдоль антиградиента, когда с +, мы идём по градиенту.

    • @stephencry
      @stephencry 11 месяцев назад

      Если хотите, можете просто в моей формуле поменять + на - и всё будет, как и в видеоролике. Надеюсь, что я нормально объяснил.

  • @leonidzhezherun2318
    @leonidzhezherun2318 Год назад +1

    Супер!

  • @yuraisme
    @yuraisme 4 года назад +2

    оч. круто и понятно

  • @1233-s3w
    @1233-s3w 4 года назад +1

    Очень годно

  • @impellergimpeller5133
    @impellergimpeller5133 2 года назад +1

    👍👍👍👍👍

  • @jamjam3337
    @jamjam3337 Год назад +1

    😎

  • @noriodan244
    @noriodan244 2 года назад +2

    А почему не используется библиотека decimal? Ведь она же позволяет убрать погрешность питона в работе с десятичными числами, а это очень важно для таких задач

  • @АлексейПетров-з1ф3с
    @АлексейПетров-з1ф3с 10 месяцев назад +1

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

    • @selfedu_rus
      @selfedu_rus  7 месяцев назад

      Производная (численно) как раз то, что вы сейчас сказали ))

  • @JohnWickMovie
    @JohnWickMovie Год назад

    Хорошо бы было упомянуть седловые точки

  • @СергейКондулуков-з9ч

    Ничего не понял, но насладился логикой объяснения.

  • @efraimfligil3119
    @efraimfligil3119 2 года назад +3

    А как поступать, если вычеслить производную достаточно проблиматично? (комбинация сложных функций типа Гамма функциая или бета и т.д. )

    • @selfedu_rus
      @selfedu_rus  2 года назад +1

      тогда использовать прилиженное вычисление, которое, в среднем, дает то же направление, что и истинный градиент

  • @Верховныйтехножрец
    @Верховныйтехножрец 3 года назад +1

    Обычно же эпсиланд используют для обозначения шага сходимости

    • @selfedu_rus
      @selfedu_rus  3 года назад

      в разной литературе по разному

  • @ШамильЗиганшин-й3ю
    @ШамильЗиганшин-й3ю 3 года назад +2

    Здравствуйте,
    А что если мы изначально, случайным образом, попали в область локального максимума.
    Как тогда в этом случае поведет себя эта программа.

    • @selfedu_rus
      @selfedu_rus  3 года назад +1

      будет колебаться вокруг него, если это единственный минимум, либо же может выскочить и перейти в локальный минимум

    • @ШамильЗиганшин-й3ю
      @ШамильЗиганшин-й3ю 3 года назад +1

      @@selfedu_rus спасибо за ответ

  • @IlyaAb
    @IlyaAb 3 года назад +2

    реализовать подобную анимацию в юпитере как-то можно? там сразу конечный вариант графика выдаёт

    • @selfedu_rus
      @selfedu_rus  3 года назад

      в юпитере не работал с анимацией не скажу

    • @dicloniusN35
      @dicloniusN35 6 месяцев назад

      так только через дикую задницу
      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

  • @ДимаБарвинский-у6к
    @ДимаБарвинский-у6к 3 года назад +1

    Здравствуйте, попробовал написать такую же программу, но почему то выдает ошибку AttributeError: объект 'FigureCanvasTkAgg' не имеет атрибута 'flush' , подскажите. что делать)
    За видео респект, интересно, кратко и понятно!

    • @selfedu_rus
      @selfedu_rus  3 года назад

      Первое. По этой ссылке исходники github.com/selfedu-rus/python-algorithms Второе, вместо canvas попробуйте plt.draw() и plt.gcf().canvas.flush_events()

    • @ДимаБарвинский-у6к
      @ДимаБарвинский-у6к 3 года назад

      При запуске программы точка не движется, мб быть я какую-нибудь из библиотек не добавил(

    • @selfedu_rus
      @selfedu_rus  3 года назад

      @@ДимаБарвинский-у6к странно, тогда просто посмотрите в документации по matplotlib - это он все рисует

  • @user-ev7rm2yp9u
    @user-ev7rm2yp9u 4 года назад +2

    А почему ось x которая вроде как ось абсцисс здесь называют осью ординат?

    • @selfedu_rus
      @selfedu_rus  4 года назад

      не нашел где, но во всех остальных случаях произносится "абсцисс"

    • @user-ev7rm2yp9u
      @user-ev7rm2yp9u 4 года назад

      @@selfedu_rus 4:00-4:10

    • @selfedu_rus
      @selfedu_rus  4 года назад

      да, это оговорка )

  • @n_bazarov
    @n_bazarov 3 года назад

    Ну я так понял здесь это не разбирается, но типа learning rate можно динамически изменять, типа от 0.9 до 0.01 и так за счет этого можно выйти из локального минимума

    • @selfedu_rus
      @selfedu_rus  3 года назад

      Пока нет алгоритмов, которые бы за приемлемое время (объем вычислений) находили глобальный оптимум. Поэтому классический градиентный спуск пытаются улучшить разными способами. Например, это оптимизация Adagard, Adadelta, Adam, моменты Нестерова и т.п.

  • @savel2work
    @savel2work 2 года назад +1

    А почему нельзя просто посчитать массив точек и выбрать наименьшую?

    • @selfedu_rus
      @selfedu_rus  2 года назад

      Во-первых, вы должны так сформировать этот массив, чтобы в нем было наименьшее значение. Если вы знаете, как это сделать, то уже что то знаете о граничных значениях и это можно использовать. Во-вторых, число оптимизируемых параметров часто составляет от нескольких сотен до миллионов (в нейронных сетях) и здесь простой перебор уже не поможет.

    • @savel2work
      @savel2work 2 года назад

      @@selfedu_rus, но ведь у вас в примере двадцать шагов с шагом примерно 0.2 или около того? Ведь алгоритм не с while, а с range(N)

    • @selfedu_rus
      @selfedu_rus  2 года назад

      @@savel2work ну это просто пример, в реальных задачах не всегда известен диапазон

    • @savel2work
      @savel2work 2 года назад

      @@selfedu_rus, а как же тогда поступать в реальности?

    • @selfedu_rus
      @selfedu_rus  2 года назад

      @@savel2work градиентный спуск, ему только начальное приближение нужно (можно взять случайное число и от него уже двигаться к оптимальному значению)

  • @Zelloss67
    @Zelloss67 2 года назад +1

    Это конечно все хорошо, но в Jupiter Notebook именно такой код не работает и никакой анимации вы не увидите

    • @vrs9106
      @vrs9106 Год назад

      в первой ячейке перед импортами напиши %matplotlib

  • @evgzhu8558
    @evgzhu8558 3 года назад +1

    5+

  • @torbokovsanat
    @torbokovsanat 4 года назад

    +

  • @Bl4ck_Pyr4t200
    @Bl4ck_Pyr4t200 9 месяцев назад +1

    это не наискорейший спуск