Не удается заставить Julia Flux работать для простого теста линейной регрессии
Я пользователь Джулии впервые знаком с 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)
против
(150,)
что означало, что размеры транслировались на
(150,150)
после
(model(x) .- y).^2
.