2013-05-22 3 views
5

Я выполняю логистическую регрессию в MATLAB с регуляцией L2 по текстовым данным. Моя программа хорошо работает для небольших наборов данных. Для больших наборов он работает бесконечно.MATLAB fminunc() не заполняется для больших наборов данных. Работает для меньших

Я видел потенциально дублированный вопрос (matlab fminunc not quitting (running indefinitely)). В этом вопросе стоимость начальной теты была NaN, и на консоли была ошибка. Для моей реализации я получаю реальную стоимость и нет ошибки даже при выполнении подробных параметров fminunc(). Поэтому я считаю, что этот вопрос может быть не дубликат.

Мне нужна помощь в масштабировании его на большие наборы. Размер учебных данных, над которыми я работаю в настоящее время, составляет примерно 10 тыс. * 12 тыс. (Текстовые файлы 10 тыс. Кумулятивно содержат 12 тыс. Слов). Таким образом, у меня есть примеры обучения m = 10k и n = 12k.

Моя функция стоимость определяется следующим образом: функция

function [J gradient] = costFunction(X, y, lambda, theta) 

    [m n] = size(X); 
    g = inline('1.0 ./ (1.0 + exp(-z))'); 
    h = g(X*theta); 
    J =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h))+ (lambda/(2*m))*norm(theta(2:end))^2; 

    gradient(1) = (1/m)*sum((h-y) .* X(:,1)); 

    for i = 2:n 
     gradient(i) = (1/m)*sum((h-y) .* X(:,i)) - (lambda/m)*theta(i); 
    end 
end 

Я выполняю оптимизацию использования fminunc MATLAB в(). Параметры Перехожу к fminunc() являются:

options = optimset('LargeScale', 'on', 'GradObj', 'on', 'MaxIter', MAX_ITR); 
theta0 = zeros(n, 1); 

[optTheta, functionVal, exitFlag] = fminunc(@(t) costFunction(X, y, lambda, t), theta0, options); 

Я бегу этот код на машине с этими спецификациями:

функция
Macbook Pro i7 2.8GHz/8GB RAM/MATLAB R2011b 

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

K>> theta0 = zeros(n, 1); 
K>> [j g] = costFunction(X, y, lambda, theta0); 
K>> j 

j = 

    0.6931 

K>> max(g) 

ans = 

    0.4082 

K>> min(g) 

ans = 

    -2.7021e-05 

Программа занимает невероятно долгое время. Я начал профилирование, сохраняя MAX_ITR = 1 для fminunc(). С помощью одной итерации программа не завершила выполнение даже после того, как прошло несколько часов. Мои вопросы:

  1. Я делаю что-то неправильно математически?

  2. Должен ли я использовать любой другой оптимизатор вместо fminunc()? При использовании LargeScale = on fminunc() использует алгоритмы доверия домена.

  3. Является ли эта проблема кластерной шкалой и не должна запускаться на одной машине?

Любые другие общие советы будут оценены. Благодаря!


Это помогло решить проблему: я был в состоянии получить эту работу, установив флаг LargeScale на «выключено» в fminunc(). Из того, что я собираю, LargeScale = 'on' использует алгоритмы области доверия, в то время как при его отключении используются квази-новые методы. Использование квази-ньютоновских методов и передача градиента работали намного быстрее для этой конкретной задачи и дали очень хорошие результаты.


+1

Проблема довольно маленькая, где-то рядом с кластерным масштабом. Однако использование универсального решателя, такого как 'fminunc', является излишним. Вероятно, вам лучше использовать другой решатель. Рассматривали ли вы другие методы (например, линейный SVM, который, как известно, очень хорошо подходит для классификации текста)? Чтобы дать вам идею, небольшая проблема, подобная этой, может быть решена за считанные секунды с помощью линейного SVM. –

+0

Ну, режим профилирования/отладки, безусловно, замедлит его. Вы пытались установить опцию '' Display'' на '' iter'', используя 'optimset'? посмотреть, что делает 'fminunc'? На небольших наборах данных, где он работает, что такое 'exitflag', описывающий условие выхода? Кроме того, почему у вас есть встроенное уравнение в вашей функции затрат? Это можно заменить на [анонимную функцию] (http://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html) ('g = @ (z) 1 ./ (1 + exp (- z))) или полностью удалены ('h = 1 ./ (1 + exp (-X * theta))). – horchler

+0

@MarcClaesen Спасибо Marc. Я хотел бы специально попробовать логистическую регрессию для этой проблемы. Вы упомянули, что лучше попробовать другой решатель. Вы бы рекомендовали какой-либо конкретный решатель для этой цели? –

ответ

0

Вот мой совет:

-Установить флаг Matlab, чтобы показать вывод отладки во время работы. Если вы не просто распечатаете в своей стоимости стоимость, которая позволит вам контролировать количество итераций итераций.

И второе, что очень важно:

Ваша проблема некорректных, или так сказать недоопределенной. У вас есть пространство с 12 тыс. Объектов и представлены только 10 тыс. Примеров, что означает, что для неограниченной оптимизации ответ - Inf. Чтобы сделать быстрый пример, почему это так, ваша проблема такова: Минимизировать x + y + z, учитывая, что x + y-z = 2. Области функции dim 3, пространственное векторное пространство - 1d. Я предлагаю использовать PCA или CCA для уменьшения размерности текстовых файлов, сохраняя их изменение до 99%. Вероятно, это даст вам пространство с функциями ~ 100-200dim.

PS: Просто укажите, что проблема связана с требованиями к размеру кластера, которая обычно является 1kk + точками данных и что fminunc вовсе не является излишним, а LIBSVM не имеет к этому никакого отношения, поскольку fminunc - это просто квадратичный оптимизатор, тогда как LIBSVM является классификатором. Для очистки LIBSVM использует нечто похожее на fminunc только с другой целевой функцией.

+0

В то время как PCA (или лучше для текста, логарифмирования + SVD + L2-нормализация) может помочь, нет никакой проблемы при применении регуляризованного LogReg к этой проблеме. Фактически, в NLP n_features >> n_samples отнюдь не исключительны. У ОП есть ошибка в их коде. –

+0

log-scaling + SVD + L2 нормализация ни в коем случае не является процедурой уменьшения размерности. Во-вторых, в NLP, где n_features >> n_samples, что вы делаете, если вы не уменьшаете пространство функций, вы класируете в двойном пространстве, чтобы проблема не была наложена. И проблема в основном возникает из-за того, что оптимизация не ограничена, как я указал на примере, который вы бы согласились, неразрешима? –

+0

* Усеченный * SVD, конечно, и на самом деле довольно эффективный тусклый. красный. метод, когда функции являются булевыми или малыми частотами; это называется LSA в литературе. OP выполняет регуляризированную LR, что должно сделать проблему разрешимой в первичной. Я подозреваю, что отсутствие разреженных структур данных - это то, что убивает производительность. –

0

Вот что я подозреваю, что это проблема, основанная на моем опыте с этим типом проблемы. Вы используете плотное представление для X вместо sparse. Вы также видите типичный эффект в классификации текста, что число членов растет примерно линейно с количеством выборок. Эффективно стоимость матричного умножения X*theta растет квадратично с количеством выборок.

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

Я не гуру Матлаба, но я знаю, что у него есть sparse matrix package, поэтому попробуйте использовать его.

1

Мне удалось получить эту работу, установив флаг LargeScale в 'off' в fminunc(). Из того, что я собираю, LargeScale = 'on' использует алгоритмы области доверия, в то время как при его отключении используются квази-новые методы. Использование квази-ньютоновских методов и передача градиента работали намного быстрее для этой конкретной задачи и дали очень хорошие результаты.

Смежные вопросы