#8. Стохастический градиентный спуск SGD и алгоритм SAG | Машинное обучение
Вставка
- Опубліковано 28 лис 2024
- Практический курс по ML на Stepik: stepik.org/cou...
Суть стохастических алгоритмов при оптимизации эмпирического риска. Рассматривается классический алгоритм Stochastic Gradient Descent (SGD, Роббинса-Монро) и Stochastic Average Gradient (SAG).
Инфо-сайт: proproprogs.ru/ml
Телеграм-канал: t.me/machine_l...
Градиентный алгоритм: • ЦОС Python #2: Метод г...
О SAG никогда не слышал. Разве он где-то применяется? Объяснение SGD шикарное, спасибо!
Спасибо вам большое за отличное доступное объяснение! Очень жду полного продолжения по ML, с вами получается учиться.
Чем дальше в лес, тем толще партизаны.
Раз 5 пересмотрела, но медик поняла😅
Спасибо за понятное обьяснение!)
Сергей, благодарю! 👍
В том же духе!!!
Здравствуйте, видео по мл нравятся и я решил параллельно попробовать себя в комьютерном зрении, но недавно наткнулся на задачу, с которой сам разобраться до конца не могу. Суть задачи вот в чем: Требуется реализовать алгоритм сборки пазла из прямоугольных фрагментов изображений (с
точностью до поворота на 180 градусов). В задании будут представлены разбиения на разное количество
фрагментов (от 12 до 432). Каждый фрагмент может быть случайно повернут на один из углов (0, 90,
180, 270). Разрешение исходного изображения - 1200x900.
Пользоваться можно только numpy, но я думаю этого должно хватить. Сам я смог придумать такой алгоритм:
Брать у каждого фрагмента изображения по два пикселя с начала и конца каждой стороны и сравнивать их с другими пикселями каждой стороны других фрагментов. По сути, пиксель из себя представляет три значения: уровень красного, зеленого и синего от 0 до 255. Вычитая пиксели одного фрагмента из другого можно по разности определить, какие фрагменты имеют наибольшую схожесть.
Проблема возникла с ограничением фрагментов в одной строке. Потому, что доходя до края изображения программа не может понять, что это край и продолжает подбирать фрагменты. Если вдруг кто-то осилит это полотнище и подсказать, что можно сделать, я буду безгранично благодарен! Заранее спасибо
1. Думаю, все их можно привести к единому углу и масшатбу, используя собственные числа и собственные векторы (метод главных компонент над координатами точек каждого квадрата).
2. Сравнивать можно либо по корреляционному принципу, либо, все точки каждого квадрата вытянуть в строку, упорядочить по возрастанию (цветов) или убыванию и дальше брать те, что наиболее похожи. (Хотя здесь масса алгоритмов).
@@selfedu_rus с самим сравнением у меня вроде проблем нет. Все фрагменты ровно квадратные, посчитать необходимое количество фрагментов в строке/столбце можно просто поделив высоту или ширину итогового изображения(это фиксированные значения 1200 и 900) на длину грани этого квадратного фрагмента. У меня возникла проблема с тем, чтобы вовремя остановить программу. Я не могу придумать способ, чтобы передать программе, что данный фрагмент является краем изображения и что дальше него идти не надо
👍👍👍👍👍
Возник вопрос по поводу пересчёта функционала качества. Мы берём случайное значение x_k из нашей выборки и считаем функцию потерь и градиент. После чего мы хотим сравнить функционал качества для найденных текущих значений(например коеффициентов a, b в линейной регрессии) с функционалом качества предполагаемой хорошей прямой. Почему мы каждый раз берём разное количество элементов этой суммы в зависимости от выбранного случайного значения. Типа если мы выбрали x_2, то берём сумму первых двух слагаемых, а если x_100, то сумму первых 100?
И что если у нас эпох(итераций) больлше, чем размер датасета, как тогда считать?
Пересчет функционала у нас происходит по экспоненциальному скользящему среднему, т.е. мы учитываем все наблюдения, но строим лишь оценку функционала качества. Истинное значение получаем после градиентного спуска, когда полностью пересчитываем.
13:31 каким образом инициализировать градиенты? Вычислить как-то или взять случайные значеия?
первый раз вычисляются по всей выборке
А почему, скачко-образное схождение плохо? Вот например, в генечиских алгорирмах это сплош и рядом.
Скачками легко уйти не в том направлении и застрять в локальных минимумах. Как правило, сильные скачки не приводят к хорошим результатам адаптации (обучения).
8:32 это ведь не средняя сумма, а просто сумма. А средней она будет только при делении на m-1!
Зачем в классическом методе суммировать градиенты?? Надо ведь из каждой переменной (веса) вычитать свой градиент.
Я понял, сумма градиентов не по разным переменным, а по набору образов, верно?
Почему используется именно экспоненциальное среднее, а не обычное рекуррентное среднее?
а как вы его подсчитаете? для последних m значений придется хранить все m величин в памяти
9:45 почему нельзя так и оставить 1/m и не заменять ее лямбдой, взятой, вообще говоря, с потолка? К тому же лямбда изначально переменная величина, ведь она зависит от m, а вы ее волюнтаристски делаете постоянной.
мы здесь вычисляем экспоненциальное среднее (ЭС), а не среднее арифметическое (СА), т.к. СА вычислять на каждой итерации - вычислительно неудобно; ЭС - хорошая оценка для СА в плане понимания уровня значения СА и вычисляется очень быстро, поэтому на практике используют ее
@@selfedu_rus А в чем вычислительный выигрыш? При вычислении ЭС будет то же число слагаемых, только с другими коэффициентами.
@@PhyzmatClass простая рекуррентная формула: Q_m = r*a_(n-1) + (1-r)*Q_(m-1)
@@selfedu_rus Так ведь и обычное СА можно вычислять по той же самой рекуррентной формуле, но с лямбдой равной 1/m.
@@PhyzmatClass хранить все m значений придется
SAG выглядит как-то опасно... На каждом шаге пересчитывается один градиент из выборки, а вычитается средний по всей выборке. Если выборка большая, то этот средний градиент будет очень медленно обновляться, и оптимизацию будет сильно заносить. Нам уже будут попадаться точки дающие противоположную ошибку, а мы по инерции прём в том же направлении...
в SAG не нужно все усреднять каждый раз, мы храним все значения по отдельности и всю сумму (среднюю) сразу, поэтому можем ее корректировать новым вычисленным значением, исключив старое и добавив новое с множителем 1/L, где L - размер выборки
@@selfedu_rus Так в том и проблема! При выборке в миллион наблюдений обновление лишь одного компонента практически не изменит средний градиент. Это вносит сильную инерцию в корректировку параметров w. В какой-то момент мы получим правильное разделение, но средний градиент будет толкать w в прежнем направлении. Так как оценка качества тоже идет с инерцией из-за "скорости забывания", то w может занести сильно дальше нужного...
@@YbisZX В инерции нет ничего плохого, многие (если не все) оптимизаторы именно и создают эту инерцию, чтобы "выпрыгивать" из локальных минимумов. Ну а стоит его применять для какой-либо конкретной задачи или нет, нужно смотреть. Универсального решения здесь нет.