Какой решатель я должен использовать, чтобы заменить minFunc при переносе разреженной фильтрации MATLAB на F#

У меня есть следующий код разреженной фильтрации MATLAB, который я хотел бы перенести на F#. Мне известно о F# Type Provider для MATLAB, но я не могу использовать его здесь, потому что это создаст зависимость от MATLAB (я могу использовать его для тестирования)

function [optW] = SparseFiltering(N, X);
   % N = # features to learn, X = input data (examples in column)
   % You should pre-process X by removing the DC component per example,
   % before calling this function.
   % e.g., X = bsxfun(@minus, X, mean(X));
   addpath minFunc/ % Add path to minFunc optimization package
   optW = randn(N, size(X, 1));
   optW = minFunc(@SparseFilteringObj, optW(:), struct('MaxIter', 100), X, N);
   optW = reshape(optW, [N, size(X, 1)]);
end

function [Obj, DeltaW] = SparseFilteringObj (W, X, N)
   % Reshape W into matrix form
   W = reshape(W, [N, size(X,1)]);
   % Feed Forward
   F = W*X; % Linear Activation
   Fs = sqrt(F.ˆ2 + 1e-8); % Soft-Absolute Activation
   [NFs, L2Fs] = l2row(Fs); % Normalize by Rows
   [Fhat, L2Fn] = l2row(NFs'); % Normalize by Columns
   % Compute Objective Function
   Obj = sum(sum(Fhat, 2), 1);
   % Backprop through each feedforward step
   DeltaW = l2grad(NFs', Fhat, L2Fn, ones(size(Fhat)));
   DeltaW = l2grad(Fs, NFs, L2Fs, DeltaW');
   DeltaW = (DeltaW .* (F ./ Fs)) * X';
   DeltaW = DeltaW(:);
end

function [Y,N] = l2row(X) % L2 Normalize X by rows
   % We also use this to normalize by column with l2row(X')
   N = sqrt(sum(X.ˆ2,2) + 1e-8);
   Y = bsxfun(@rdivide,X,N);
end

function [G] = l2grad(X,Y,N,D) % Backpropagate through Normalization
   G = bsxfun(@rdivide, D, N) - bsxfun(@times, Y, sum(D.*X, 2) ./ (N.ˆ2));
end

Я понимаю большую часть кода MATLAB, но я не уверен, что эквивалент MATLAB minFunc находится в.Net. Я верю, что хочу один из Microsoft.SolverFoundation.Solvers, По данным сайта MATLAB

... параметры по умолчанию для minFunc вызывают квазиньютоновскую стратегию, где при вычислении направления шага используются обновления BFGS с ограниченной памятью с масштабированием Шенно-Фуа, а для поиска точки, удовлетворяющей условиям Вольфа, используется скобка вычислить направление шага. При поиске строки (защищенная) кубическая интерполяция используется для генерации пробных значений, и метод переключается на поиск линии обратного слежения Armijo на итерациях, где целевая функция входит в область, где параметры не выдают действительный результат

Учитывая приведенную выше информацию, может ли кто-нибудь подтвердить, что Microsoft.SolverFoundation.Solvers.CompactQuasiNewtonModel - правильный путь?

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

1 ответ

Решение

Я думаю, что CompactQuasiNewtonSolver - ваш лучший выбор. Если вы посмотрите на образцы SolverFoundation, есть CQN пример, который демонстрирует, как реализовать и решить функцию Розенброка. Its results are inline with what I see in minFunc's Rosenbrock example. The sample above is in C#; but it should be easy to translate to F#.

Кроме того, есть ли другие очевидные "ошибки" при переносе кода выше на F#? (new to this type of port)?

You probably need a good linear algebra package to get close to MATLAB code. Math.Net seems to be an ideal choice since it has good F# support.

Alternatively, you can reimplement the code using Accord.NET framework. The framework has an implementation of L-BFGS algorithm for optimization in Machine Learning, so it is closer to your purpose.

Другие вопросы по тегам