Чому спуск градієнта неефективний для великого набору даних?


13

Скажімо, наш набір даних містить 1 мільйон прикладів, тобто , і ми хочемо використовувати спуск градієнта для виконання логістичної або лінійної регресії на цих наборах даних.x1,,x106

Що це з методом градієнтного спуску робить його неефективним?

Нагадаємо, що крок градієнта спуску в момент часу задається:t

wt+1=wt+ηtf(x)

де - функція втрат.f

З вищенаведеним кроком я не бачу нічого незвичайного, що призводить до неефективності алгоритму. Це обчислення ? Чи не могла ця операція бути попередньо обчислена, тобто кожен вже обчислений, і просто оцінити їх у кожній точці данихff(x) xi?fxxi?


1
Неефективний щодо ...? Навіть найменші квадрати неефективні для великого набору даних. Вам потрібна велика нотація O, щоб мати змістовні уявлення про те, що робить для алгоритму. Не всі алгоритми GD мають однакові великі O. (чи не так?)n
AdamO

Відповіді:


7

Це допоможе, якщо ви надали контекст для твердження, що спуск градієнта неефективний. Неефективний щодо чого?

Я здогадуюсь, що тут відсутній контекст - це порівняння зі стохастичним чи партійним градієнтом у грунтовому навчанні. Ось як відповісти на питання в цьому контексті. Ви оптимізуєте параметри моделі, навіть гіперпараметри. Отже, у вас є функція витрат , де - ваші дані, і - вектор параметрів, а - функція втрати. Щоб мінімізувати цю вартість, ви використовуєте градієнтний спуск над параметрами : x i Θ L ( ) θ j i=1nL(xi|Θ)xiΘL() θj

θji=1nL(Θ|xi)

Отже, ви бачите, що вам потрібно отримати суму над усіма даними . Це прикро, адже це означає, що ви постійно переглядаєте дані для кожного кроку свого градієнтного спуску. Ось так виходить пакетний і стохастичний градієнтний спуск: що робити, якщо ми взяли вибірку з набору даних і обчислили градієнт на вибірці, а не на повний набір? Тут - кількість спостережень у вибірці . Отже, якщо ваш зразок становить 1/100-ту загальну кількість, ви пришвидшите свої розрахунки в 100 разів! Очевидно, що це вносить шум, який подовжує навчання, але шум зменшується зі швидкістюхi=1,,нnss

θjк=1нсL(Θ|хк)
нсс nнв той час як сума розрахунку збільшується на , тому ця хитрість може спрацювати.н

Крім того, замість того, щоб чекати, поки не буде обчислена повна сума , ви можете розділити це на партії і зробити крок для кожної партії . Таким чином, ви зробили б M кроків до моменту обчислення суми за весь набір даних. Це були б шумніші кроки, але з часом шум відміняється.M s = 1n s i s = 1i=1нс=1Мiс=1нс


19

Є два способи, за якими спуск градієнта може бути неефективним. Цікаво, що кожен з них веде свій власний метод виправлення, що є майже протилежними рішеннями. Дві проблеми:

(1) Занадто багато оновлень градієнта спуску потрібно.

(2) Кожен крок спуску градієнта занадто дорогий.

Що стосується (1), порівнюючи спуск градієнта з методами, що враховують інформацію про похідні другого порядку, градієнтний спуск, як правило, є дуже неефективним щодо покращення втрат при кожній ітерації. Дуже стандартний метод, метод Ньютона , зазвичай потребує набагато меншої кількості ітерацій для сходження, тобто для логістичної регресії 10 ітерацій методу Ньютона часто матимуть менші втрати, ніж рішення, що забезпечується 5000 ітерацій градієнта спуску. Для лінійної регресії це ще більш екстремально; є рішення закритої форми! Однак, оскільки кількість предикторів стає дуже великою (тобто 500+), метод Ньютона / безпосередньо рішення для лінійної регресії може стати занадто дорогим за ітерацію через кількість необхідних операцій з матрицею, тоді як спуск градієнта матиме значно менші витрати за ітерацію.

Щодо (2), можливо, настільки великий набір даних, що кожна ітерація градієнтного спуску занадто дорога для обчислення. Для обчислення градієнта знадобляться операції ( = розмір вибірки, = кількість коваріатів). Хоча зовсім не є проблемою на сучасних комп’ютерах для значень , безумовно, буде щось на зразок , . У цьому випадку методи, які наближають похідну на основі менших підмножин даних, є більш привабливими, наприклад, стохастичний градієнтний спуск .n k n = 10 6 k < 100 n = 10 12 k = 10 3О(нк)нкн=106к<100н=1012к=103

Я кажу, що ці виправлення є майже протилежними, оскільки щось на зразок методу Ньютона коштує дорожче, але ефективніше (з точки зору зміни втрат) за оновлення, тоді як стохастичний градієнтний спуск насправді менш ефективний, але значно обчислювально дешевший за оновлення.


Дякую за чудову відповідь. Що ви маєте на увазі під = числом коваріатів? Мені не знайома ця термінологіяк
Карлос - Мангуст - Небезпека

2
@Learningonepageatatime: covariates = змінні предиктора.
Кліф АВ

10

Спершу дозвольте запропонувати покращити вашу нотацію. Зокрема, позначимо функцію втрат на а не на . Використання літери - це просто моя особиста перевага, оскільки вона нагадує мені, що ми маємо справу з L oss. Більш суттєва зміна дає зрозуміти, що втрата - це функція ваг а не даних . Важливо, що градієнт по відношенню до не . Тож де - розмірність вашого дані.f ( x ) L w x w x L ( w ) = ( LL(ш)f(х)LшхшхD

L(ш)=(Lш1,,LшD),
D

Незважаючи на те, що ми повинні думати про втрату як функцію ваг , будь-яка розумна функція втрат все ще буде залежати від усього набору даних (якби цього не було, з даних не вдалося б дізнатися нічого! ). Наприклад, в лінійній регресії ми, як правило, використовуємо функцію втрати суми квадратів Отже, для оцінки градієнта для певного набору ваг буде потрібно сума над усіма точками в наборі даних . Якщо , то кожен покроковий крок оптимізації градієнта спуску вимагатиме порядку мільйона операцій, що досить дорого.x L ( w ) = N i = 1 ( y i - w T x i ) 2 . L ( w ) w N x N = 10 6шх

L(ш)=i=1N(уi-шТхi)2.
L(ш)шNхN=106

3

Коротка відповідь: для розрахунку градієнта потрібно підсумовувати всі точки даних. Якщо у нас великий обсяг даних, то це потребує тривалого часу.

У мене тут детальна відповідь.

Як стохастичний градієнтний спуск може заощадити час порівняно зі стандартним градієнтним спуском?


З іншого боку, завжди майте на увазі, що крім ітераційних методів є прямі методи (градієнт пристойний). Якщо ми хочемо вирішити найменш квадратну задачу, прямий метод може бути надзвичайно ефективним. Наприклад, розкладання QR. Якщо у нас не занадто багато функцій, це дуже швидко.

Перевіривши це, це може вас здивувати: 5 мільйонів точок даних з двома функціями. Вирішення лінійної регресії / найменшого квадрата займає пару секунд!

x=matrix(runif(1e7),ncol=2)
y=runif(5e6)
start_time <- Sys.time()
lm(y~x)
end_time <- Sys.time()
end_time - start_time
# Time difference of 4.299081 secs

1

Хоча два згадані вами приклади, як правило, опуклі, я додам один пункт про невипуклі проблеми. На мою думку, є дві основні причини, чому (пакетний) градієнтний спуск можна вважати "неефективним". Перший пункт про обчислювальні зусилля для обчислення градієнта "великої" суми функцій уже дуже чітко окреслено в інших відповідях. Однак для проблем, які не є опуклими, GD має проблему, як правило, застрягти в "близькому" локальному мінімумі. Цей мінімум може бути дуже поганим порівняно зі світовим мінімумом. SGD або міні-пакет GD мають "перевагу" бродіння навколо (принаймні частково) випадковим чином і, таким чином, можуть мати шанс знайти кращий локальний мінімум. Дивіться цю відповідь CV тут . Або цей інший резюме окреслює, як випадковість може бути корисною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.