давайте предположим, что я хочу обучить алгоритм регрессии стохастического градиентного спуска, используя набор данных, который имеет N выборок. Поскольку размер набора данных фиксирован, я буду использовать данные T раз. На каждой итерации или «эпохе» я использую каждую обучающую выборку ровно один раз после случайного переупорядочения всего обучающего набора.
Моя реализация основана на Python и Numpy. Следовательно, использование векторных операций может значительно сократить время вычислений. Приступить к векторизации реализации пакетного градиентного спуска довольно просто. Однако в случае стохастического градиентного спуска я не могу понять, как избежать внешнего цикла, который повторяет все выборки в каждую эпоху.
Кто-нибудь знает векторизованную реализацию стохастического градиентного спуска?
РЕДАКТИРОВАТЬ : Меня спросили, почему я хотел бы использовать градиентный спуск онлайн, если размер моего набора данных фиксирован.
Из [1] видно, что градиентный спуск в режиме онлайн сходится медленнее, чем градиентный спуск в пакетном режиме, до минимума эмпирической стоимости. Однако он сходится быстрее к минимуму ожидаемой стоимости, которая измеряет производительность обобщения. Я хотел бы проверить влияние этих теоретических результатов на мою конкретную проблему с помощью перекрестной проверки. Без векторизованной реализации мой онлайн-код градиентного спуска будет намного медленнее, чем кодовый спуск. Это значительно увеличивает время, необходимое для завершения процесса перекрестной проверки.
РЕДАКТИРОВАТЬ : я включаю здесь псевдокод моей реализации градиентного спуска в режиме онлайн, по запросу ffriend. Я решаю проблему регрессии.
Method: on-line gradient descent (regression)
Input: X (nxp matrix; each line contains a training sample, represented as a length-p vector), Y (length-n vector; output of the training samples)
Output: A (length-p+1 vector of coefficients)
Initialize coefficients (assign value 0 to all coefficients)
Calculate outputs F
prev_error = inf
error = sum((F-Y)^2)/n
it = 0
while abs(error - prev_error)>ERROR_THRESHOLD and it<=MAX_ITERATIONS:
Randomly shuffle training samples
for each training sample i:
Compute error for training sample i
Update coefficients based on the error above
prev_error = error
Calculate outputs F
error = sum((F-Y)^2)/n
it = it + 1
[1] «Крупномасштабное онлайн-обучение», Л. Ботту, Й. Ле Канн, NIPS 2003.