2013-09-20 4 views
2

Я пытаюсь собрать вместе, как SGDClassifier выбирает скорость обучения, когда я использую метод partial_fit для его обучения.Sklearn SGDClassifier minibatch-learning and learning rate schedule

есть, мой основной цикл обучения выглядит следующим образом:

from sklearn.linear_model import SGDClassifier 
m = SGDClassifier(n_iter=1, alpha=0.01) 
n_iter = 40 
t0 = time.time() 
for i in range(n_iter): 
    for fname in files: 
     X, y = load_next_batch(fname) 
     m.partial_fit(X, y, classes = [0, 1]) 
    print "%d: valid-error: %f (time: %fs)" % (i, 1.0-m.score(Xvalid, yvalid), time.time() - t0) 

сейчас, так как я делаю 40 проходит через весь набор обучения, я хотел бы, чтобы отжечь мою скорость обучения в течение долгого времени. Если бы я использовал fit вместо частичной подгонки, я понимаю, что это произойдет автоматически (если не изменить параметр learning_rate).

Однако мне непонятно, как это происходит при использовании частичной подгонки. Сбой кода тоже не помог. Может ли кто-нибудь уточнить, как я мог достичь отожженной скорости обучения в моей настройке?

ответ

2

fit использует partial_fit внутренне, поэтому learning rate configuration parameters применяется как для fit a partial_fit. График отжига по умолчанию - eta0/sqrt(t) с eta0 = 0.01.

Редактировать: это не так, как это видно в комментариях фактического расписания по умолчанию для SGDClassifier является:

1.0/(t + t0) где t0 установлен эвристический и t этого количества образцов видели в прошлом.

+0

Спасибо за ответ. Но я заметил, что для eta0 установлено значение 0 (хотя документация утверждает, что она равна 0,01) и остается такой на протяжении всего процесса. Поэтому я предполагаю, что SGDClassifier каким-то образом внутренне отслеживает скорость обучения другими способами ..... если бы я хотел узнать, что скорость обучения после 20 циклов через мой тренировочный набор, есть ли у меня способ запросить ? – Untom

+0

Документация не обновляется ... в [исходном коде] (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/) вы можете видеть, что для 'SGDClassifier 'расписание обучения по умолчанию называется« оптимальным »1.0/(t + t0)' где 't0' задается из данных; 'eta0' в этом случае не используется. Также даже для расписания 'invscaling' 'eta0' никогда не обновляется: это не фактическая скорость обучения, а только способ передать начальное значение. В обоих случаях прогресс расписания можно найти в атрибуте 'model.t_', который дает количество выборок, которые видели в прошлом. – ogrisel

+0

Я вижу, спасибо за разъяснение, я не смог понять код раньше :) – Untom

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