Было бы полезно, если бы вы предоставили контекст для утверждения, что градиентный спуск неэффективен. Неэффективно по отношению к чему?
Я предполагаю, что отсутствующий контекст здесь - сравнение со стохастическим или пакетным градиентным спуском в машинном обучении. Вот как можно ответить на вопрос в этом контексте. Вы оптимизируете параметры модели, даже гиперпараметры. Итак, у вас есть функция стоимости , где x i - ваши данные, а Θ - вектор параметров, а L ( ) - функция потерь. Чтобы минимизировать эту стоимость, вы используете градиентный спуск по параметрам θ j :
∂ΣNя = 1L ( хя| Θ)ИксяΘL ( ) θJ
∂∂θJΣя = 1NL ( Θ | xя)
Итак, вы видите, что вам нужно получить сумму по всем данным . Это прискорбно, потому что это означает, что вы продолжаете просматривать данные для каждого шага вашего градиентного спуска. Вот как происходит пакетное и стохастическое спускание градиента: что если мы произвели выборку из набора данных и вычислили градиент для выборки, а не для полного набора?
∂Икся = 1 , … , н
Здесьпевявляется число наблюдений в выборкес. Таким образом, если ваша выборка составляет 1/100 от общего набора, вы ускоряете свои вычисления в 100 раз! Очевидно, что это вносит шум, который удлиняет обучение, но шум уменьшается со скоростью√
∂∂θJΣк = 1NsL ( Θ | xК)
Nss то время как количество вычислений увеличивается при
n, так что этот прием может сработать.
N--√N
С другой стороны , не insteado ждать до полной суммы вычисляются, вы можете разделить это на партию, и сделать шаг для каждой партии Й М сек = 1 Σ п S я ы = 1 . Таким образом, вы бы сделали M шагов к тому времени, когда будет вычислена сумма по всему набору данных. Это были бы более шумные шаги, но шум со временем исчезает.ΣNя = 1ΣMs = 1ΣNsяs= 1