2016-12-14 2 views
0

Я пытаюсь понять, как градиенты вычисляются при использовании miinibatch SGD. Я реализовал его в онлайн-курсе CS231, но понял только, что в промежуточных слоях градиент - это в основном сумма по всем градиентам, вычисленным для каждого образца (то же самое для реализаций в Caffe или Tensorflow). Только в последнем слое (убытке) они усредняются по количеству выборок. Это правильно? если это так, означает ли это, что, поскольку в последнем слое они усредняются, при выполнении backprop все градиенты также усредняются автоматически? Спасибо!Minibatch SGD вычисление градиента - среднее значение или сумма

+1

Как это связано с TensorFlow? – martianwars

+0

Я отметил его, потому что в реализации tensorflow это делается так же, как и люди в этом сообществе, как правило, знают о реализациях низкого уровня (может быть, не вы) и могут помочь ответить –

ответ

3

Лучше всего понять, почему SGD работает в первую очередь.

Обычно, что представляет собой нейронная сеть, очень сложная составная функция входного вектора x, метка y (или целевая переменная изменяется в зависимости от того, является ли проблема классификацией или регрессией) и некоторым вектором параметров w. Предположим, что мы работаем над классификацией. Мы на самом деле пытаемся сделать оценку максимального правдоподобия (на самом деле оценка MAP, так как мы, безусловно, будем использовать регуляцию L2 или L1, но на данный момент это слишком много технически) для переменного вектора w. Предполагая, что выборки независимы; то мы имеем следующую функцию затрат:

p(y1|w,x1)p(y2|w,x2) ... p(yN|w,xN) 

Оптимизация этого WRT для ш беспорядок из-за того, что все эти вероятности multiplicated (это будет производить безумно сложной производной WRT W). Мы используем вероятность журнала вместо (с поленом не изменят крайние точки, и мы разделим на N, так что мы можем лечить наше обучение устанавливаются в качестве эмпирического распределения вероятностей р (х))

J(X,Y,w)=-(1/N)(log p(y1|w,x1) + log p(y2|w,x2) + ... + log p(yN|w,xN)) 

Это фактическая стоимость функция у нас есть. Фактически нейронная сеть моделирует вероятностную функцию p (yi | w, xi). Это может быть очень сложная 1000 + многоуровневая ResNet или просто простой персептрон.

Теперь производная для ш проста в состоянии, так как у нас есть дополнение сейчас:

dJ(X,Y,w)/dw = -(1/N)(dlog p(y1|w,x1)/dw + dlog p(y2|w,x2)/dw + ... + dlog p(yN|w,xN)/dw) 

В идеале, выше фактический градиент. Но этот расчет партии нелегко вычислить. Что делать, если мы работаем над набором данных с 1М учебными образцами? Хуже того, набор обучения может быть потоком выборок x, который имеет бесконечный размер.

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

dJ(X,Y,w)/dw =(approx) dJ'/dw = -(1/m)(dlog p(y1|w,x1)/dw + dlog p(y2|w,x2)/dw + ... + dlog p(ym|w,xm)/dw) 

Помните, что мы имели эмпирический (или актуально в случае бесконечного множества подготовки) распределения данных р (Икс). Вышеприведенная операция рисования m выборок из p (x) и их усреднения фактически дает несмещенную оценку dJ '/ dw для реальной производной dJ (X, Y, w)/dw. Что это значит? Возьмите много таких m выборок и вычислите различные оценки dJ '/ dw, также их усредните, и вы получите очень близко, даже точно, dJ (X, Y, w)/dw в пределе бесконечной выборки. Можно показать, что эти шумные, но несмещенные оценки градиента будут вести себя как исходный градиент в конечном счете.В среднем SGD будет следовать по пути фактического градиента (но он может застревать в разных локальных минимумах, все зависит от выбора скорости обучения). Размер мини-балки m непосредственно связан с присущей ошибкой в ​​шумовой оценке dJ '/ dw. Если m велико, вы получаете градиентные оценки с низкой дисперсией, вы можете использовать более высокие скорости обучения. Если m мало или m = 1 (онлайн-обучение), дисперсия оценки dJ '/ dw очень высока, и вы должны использовать меньшие скорости обучения, или алгоритм может легко расходиться из-под контроля.

Теперь достаточно теории, ваш фактический вопрос был

Только в последнем слое (потери), что они усредняются по количеству образцов. Это верно? если это так, означает ли это, что, поскольку в последнем слое они усредняются, при выполнении backprop все градиенты также усредняются автоматически? Благодаря!

Да, этого достаточно, чтобы разделить на m в последнем слое, поскольку правило цепи будет распространять коэффициент (1/m) на все параметры, как только самый нижний уровень будет умножен на него. Вам не нужно делать отдельно для каждого параметра, это будет недействительным.

+1

Этот ответ чрезвычайно полезен и решил другой вопрос, который у меня возник о том, почему мы должны максимизировать вероятность регистрации, а не просто вероятность. Спасибо огромное! –

2

В последнем слое они усредняются, а в предыдущих суммируются. Суммированные градиенты в предыдущих слоях суммируются на разных узлах со следующего слоя, а не на примерах. Это усреднение выполняется только для того, чтобы сделать процесс обучения одинаковым, когда вы изменяете размер партии - все должно работать одинаково, если вы суммируете все слои, но соответствующим образом уменьшаете скорость обучения.

+0

, например, допустим, у меня есть полностью связанный уровень , sth like: y = XW, где X - матрица Nxd (N выборок с размерностью d), а W - dxM (M выходных узлов). то y равно NxM. Теперь, если у нас есть dL/dy (NxM), то dL/dW = dy/dW * dL/dy, то dL/dW = X_переводит * dL/dy; в этом случае, я думаю, dL/dW добавляет градиенты, поступающие для каждого отдельного образца. это правильно? –

+0

Нет, он добавляет градиенты для каждого __node__ в y (M). Предполагая, что L является средним по выборкам, dL/dy также является средним, но имеет некоторые размеры в соответствии с количеством узлов в выходном слое. – sygi

+0

Спасибо за вашу помощь, я немного смущен. Извините, , но если dL/dy является средним, то почему он имеет размер NxM (как один градиент для каждого образца)? –

Смежные вопросы