Как я могу остановить процесс оптимизации scipy.optimize.fmin_l_bfgs_b вручную? - PullRequest
0 голосов
/ 23 декабря 2018

Я использую spicy.optimize.fmin_l_bfgs_b для оптимизации.

Калькулятор для вычисления loss и grad реализован классом

from calculator import loss_calculator

class one_batch:

    def __init__(self, setup_dict):
        self.setup_dict = setup_dict 

    def calculate(self):
        temp_instance = loss_calculator(self.setup_dict, self.parameters)
        self.loss, self.grad = temp_instance.result()

    def objective_function(self, parameter):
        self.parameters = parameters 
        self.calculate()
        ###########################################################
        #  I want to check if some convergence occures here. If   #
        #   the convergence occurs, stop l-bfgs-b optimization.   #
        ###########################################################
        return self.loss, self.grad

Для оптимизации, экземплярone_batch будет создаваться каждый раз при загрузке новой партии примеров.

from scipy.optimize import fmin_l_bfgs_b as optimizer
model_vector = initial_vector
for n in range(niter):
    setup_dict = setup_dict # load the batch of examples 
    temp_batch = one_batch(setup_dict)
    model_update = optimizer(temp_batch.objective_function, x0=model_vector)
    model_vector = model_update

Как вы можете видеть из кода, я хочу добиться:

Когда optimizer вызывает temp_batch.objective_function для минимизации функции потерь, если происходит некоторая конвергенция, яхотите «сломать» процесс оптимизации, закодированный в spicy.optimize.fmin_l_bfgs_b.

Как я могу это сделать?

1 Ответ

0 голосов
/ 23 декабря 2018

Параметры конвергенции для l_bfgs_b algo:

  1. factr - значение по умолчанию 1e7, увеличьте его значение, если хотите досрочно остановить фитинг.

Типичнозначения для фактора: 1e12 для низкой точности;1e7 для умеренной точности;10.0 для чрезвычайно высокой точности.

Если вы знакомы с функцией optimize.minimize, то отношение между ftol и factr приведено в документации .

Обратите внимание, что опция ftol доступна через этот интерфейс, в то время как factr предоставляется через этот интерфейс, где factr - это коэффициент, умножающий точность вычислений с плавающей запятой по умолчанию для машины на ftol: ftol = factr* numpy.finfo (float) .eps.

pgtol: число с плавающей запятой, необязательно

Итерация остановится, когда max {| proj g_i |i = 1, ..., n} <= pgtol, где pg_i - это i-й компонент прогнозируемого градиента. </p>

Попробуйте this , если хотите это сделать optimize.minimize метод с использованием l_bfgs_b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...