Настройка решателя оптимизации поверх модели нейронной сети - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть обученная модель нейронной сети, разработанная с использованием инфраструктуры Keras в ноутбуке Jupyter. Это проблема регрессии, когда я пытаюсь предсказать выходную переменную, используя около 14 входных переменных или функций. В качестве следующего шага я хотел бы свести к минимуму свои выходные данные и определить, какую конфигурацию / значения эти 14 входных данных потребуется для достижения минимального значения выходного сигнала.

Итак, по сути, я хотел бы передать обученный объект модели как моя целевая функция в решателе, а также ряд ограничений на входные переменные для оптимизации / минимизации цели. Какой лучший Python решатель, который может помочь мне туда добраться?

Заранее спасибо!

1 Ответ

2 голосов
/ 11 апреля 2020

Итак, у вас уже есть обученная модель, которую мы можем представить как f(x) = y.

Стандартный метод SciPy, позволяющий минимизировать это, имеет соответствующее название scipy.optimize.minimize .

Чтобы использовать его, вам просто нужно адаптировать вашу функцию f(x) = y для соответствия API, который использует SciPy. То есть первый аргумент функции - это список params для оптимизации. Второй аргумент является необязательным и может содержать любые args, которые фиксированы для всей оптимизации (т. Е. Ваша обученная модель).

def score_trained_model(params, args):
    # Get the model from the fixed args.
    model = args[0]

    # Run the model on the params, return the output.
    return model_predict(model, params)

С этим, плюс начальное предположение, вы можете использовать minimize function now:

# Nelder-Mead is my go-to to start with.
# But it doesn't take advantage of the gradient.
# Something that does, e.g. BGFS, may perform better for your case.
method = 'Nelder-Mead'

# All zeros is fine, but improving this initial guess can help.
guess_params = [0]*14

# Given a trained model, optimize the inputs to minimize the output.
optim_params = scipy.optimize.minimize(
    score_trained_model,
    guess_params,
    args=(trained_model,),
    method=method,
)

Можно указать ограничения и границы для некоторых методов оптимизации. Для Nelder-Mead это не поддерживается, но вы можете просто вернуть очень большую ошибку при нарушении ограничений.


Более старый ответ.

OP хочет: оптимизируйте входные данные, x, а не гиперпараметры.

Похоже, вы хотите оптимизировать гиперпараметры. Моя Python библиотека на выбор hyperopt: https://github.com/hyperopt/hyperopt

Учитывая, что у вас уже есть некоторый обучающий и набранный код, например:

def train_and_score(args):
    # Unpack args and train your model.
    model = make_model(**args)
    trained = train_model(model, **args)

    # Return the output you want to minimize.
    return score_model(trained)

Вы можете легко использовать hyperopt для настройки таких параметров, как скорость обучения, отсев или выбор активаций:

from hyperopt import fmin, hp, tpe, space_eval

space = {
    'lr': hp.loguniform('lr', np.log(0.01), np.log(0.5)),
    'dropout': hp.uniform('dropout', 0, 1),
    'activation': hp.choice('activation', ['relu', 'sigmoid']),
}

# Minimize the training score over the space.
trials = Trials()
best = fmin(train_and_score, space, trials=trials, algo=tpe.suggest, max_evals=100)

# Print details about the best results and hyperparameters.
print(best)
print(space_eval(space, best))

Существуют также библиотеки, которые помогут вам напрямую интегрировать это с Keras. Популярным выбором является hyperas: https://github.com/maxpumperla/hyperas

...