Как минимизировать многовариантную функцию затрат в Julia с Optim? - PullRequest
3 голосов
/ 01 февраля 2020

В настоящее время я застрял, пытаясь использовать пакет Optim в Julia, чтобы минимизировать функцию затрат. Функция затрат - это функция затрат для регуляризованной регрессии L2 c. Он построен следующим образом:

using Optim

function regularised_cost(X, y, θ, λ)
    m = length(y)

    # Sigmoid predictions
    h = sigmoid(X * θ)

    # left side of the cost function
    positive_class_cost = ((-y)' * log.(h))

    # right side of the cost function
    negative_class_cost = ((1 .- y)' * log.(1 .- h))

    # lambda effect
    lambda_regularization = (λ/(2*m) * sum(θ[2 : end] .^ 2))

    # Current batch cost
    ? = (1/m) * (positive_class_cost - negative_class_cost) + lambda_regularization

    # Gradients for all the theta members with regularization except the constant
    ∇? = (1/m) * (X') * (h-y) + ((1/m) * (λ * θ))  

    ∇?[1] = (1/m) * (X[:, 1])' * (h-y) # Exclude the constant

    return (?, ∇?)
end

Я хотел бы использовать алгоритм LBFGS в качестве решателя, чтобы найти лучшие веса, которые минимизируют эту функцию, на основе моих обучающих примеров и меток, которые определены как:

opt_train = [ones(size(X_train_scaled, 1)) X_train_scaled] # added intercept
initial_theta = zeros(size(opt_train, 2))

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

cost, gradient! = regularised_cost(opt_train, y_train, initial_theta, 0.01)

res = optimize(regularised_cost,
               gradient!,
               initial_theta,
               LBFGS(),
               Optim.Options(g_tol = 1e-12,
                             iterations = 1000,
                             store_trace = true,
                             show_trace = true))

Как передать обучающие примеры и метки вместе с градиентами, чтобы решатель (LBFGS) мог найти мне лучшие веса для тета?

1 Ответ

2 голосов
/ 09 февраля 2020

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

Согласно документам по , связанным с параметризованной константой

Это должно быть так. Что-то вроде:

loss_and_grad(theta) = regularised_cost(opt_train, y_train, theta, 0.01)

loss(theta) = first(loss_and_grad(theta))

res = optimize(loss, initial_theta)

Я оставлю это вам, чтобы посмотреть, как подключить градиент.

Напоминание: не используйте неконстантные Глобал. Они медленные, в частности то, как они используются в написанной мной функции loss_and_grad, будет медленным. Поэтому вы должны объявить opt_train и y_train как const. Или создайте функцию, которая принимает их и возвращает функцию потерь et c

...