Не удается заставить Julia Flux работать для простого линейного регрессионного теста

#julia #flux.jl

#julia #flux.jl

Вопрос:

Я пользователь Julia, новичок в Flux и машинном обучении. В качестве первого теста и для понимания того, как работает Flux, я попытался использовать Flux для оценки простой линейной регрессионной модели. Но, очевидно, я делаю что-то не так, как обучение модели с использованием train! не дает мне ожидаемых коэффициентов OLS. Это меня удивило; поскольку линейная регрессия — простая задача выпуклой оптимизации, я ожидал, что градиентный спуск быстро сойдется к оптимальному. Итак, я предполагаю, что я что-то неправильно понял о том, как тренироваться! работает.

Вот мой код:

 using Flux
using Flux: @epochs
using GLM

# Load data: The features of the Iris data set
features = Flux.Data.Iris.features();
x = features[1:3,:];
y = features[4,:];

J, N = size(x); # number of explanatory variables, number of observations

model = Chain(Dense(J,1)); # define the model

loss(x,y) = Flux.Losses.mse(model(x),y); # define the loss function

function loss_all(X,y) # and define a full-sample loss function
    l = 0;
    for i in 1:length(y)
        l  = loss(X[:,i],y[i]);
    end
    return l
end

loss_all(x,y)
@epochs 10000 Flux.train!(loss, params(model), [(x,y)], Descent(0.01)); # train the model
loss_all(x,y)

# How does the result compare to OLS (should be exactly the same)?
x_augmented = vcat(ones(1,N),x);
ols = inv(x_augmented*transpose(x_augmented))*x_augmented*y
y_hat = transpose(x_augmented)*ols;
sse = sum((y_hat - y).^2)
  

Я ожидаю, что совершаю глупую ошибку, но я был бы очень признателен, если бы кто-нибудь помог мне определить проблему.

Ответ №1:

Самый простой способ исправить это — убедиться y , что форма соответствует model(x) :

 y = features[4:4,:];
  

Обратите внимание, что:

 Flux.Losses.mse(model(x),y)
  

расширяется до:

 mean((model(x) .- y).^2)
  

поэтому model(x) и y должны иметь ту же форму (после моего исправления они есть (1,150) ). В вашем исходном коде это было (1,150) vs (150,) , что означало, что измерения транслировались на (150,150) after (model(x) .- y).^2 .

Комментарии:

1. Большое спасибо, Богумил! Я думаю, вы имели в виду y = features[[4],:]; Но это решает проблему. Большое спасибо!