2012-02-21 4 views
8

Я пытаюсь реализовать алгоритм регрессии Softmax для решения проблемы K-классификатора после просмотра лекций профессора Эндрю Нг о GLM. Я думал я понял все, что он говорил, пока, наконец, не пришел к написанию кода для реализации функции затрат для SoftMax регрессии, которая заключается в следующем:Как векторизовать уравнения?

Cost function for Softmax Regression with Weight Decay

Проблема, которую я имею пытается фигурой из способа векторизации этого. Снова я думал Я понял, как идти об векторизации уравнений, как это, так как я был в состоянии сделать это для линейной и логистической регрессии, но, посмотрев на эту формулу, я застрял.

Хотя я хотел бы найти для этого векторизованное решение (я понимаю, что уже есть аналогичный вопрос: Vectorized Implementation of Softmax Regression), меня больше интересует, может ли кто-нибудь из вас сказать мне способ (ваш путь) до методично преобразовывать уравнения, подобные этому, в векторизованные формы. Например, для тех из вас, кто является экспертами или опытными ветеранами в ML, когда вы впервые читаете новые алгоритмы в литературе и видите их в аналогичных обозначениях вышеприведенного уравнения, как вы собираетесь конвертировать их в векторизованные формы?

Я понимаю, что, возможно, я отхожу от ученика, который спрашивает Моцарта: «Как вы так хорошо играете на пианино?» Но мой вопрос просто мотивирован желанием стать лучше на этом материале и предположить, что не все родились, зная, как векторизовать уравнения, и поэтому кто-то там должен разработать свою собственную систему, и если да, то, пожалуйста, поделитесь! Спасибо заранее!

Приветствия

+0

Можете ли вы дать ссылку на лекции по ГЖС? – justis

+1

Предоставлено классом ML профессора Эндрю Нга в Стэнфорде: http://cs229.stanford.edu/materials.html - материал регрессии GLM и Softmax находится в конце лекции 1 – oort

ответ

1

Это выглядит довольно сложно, так как векторизации вы делаете экспонент в ваших речах. Я предполагаю, что вы поднимаете e на произвольные полномочия. То, что вы можете векторизовать, - это второй термин выражения \ sum \ sum theta^2, просто убедитесь, что вы используете. * Оператор в matlab enter link description here к компьютеру \ theta^2

То же самое касается внутренних условий отношения который входит в логарифм. \ theta 'x^(i) является векторизуемым выражением.

Вы также можете воспользоваться технологией запоминания или динамического программирования и попытаться повторно использовать результаты вычислений e^\ theta 'x^(i).

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

2

Файлы справки, которые приходят с октаву иметь эту запись:

19.1 Основные векторизации

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

for i = 1:n 
    for j = 1:m 
    c(i,j) = a(i,j) + b(i,j); 
    endfor 
endfor 

по сравнению с гораздо проще

c = a + b; 

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

Это особенно важно для петель с «дешевыми» телами. Часто это достаточно, чтобы векторизовать только самый внутренний цикл, чтобы получить приемлемый результат. производительность. Общее эмпирическое правило состоит в том, что «порядок» векторизованного тела должен быть больше или равен «порядку» замкнутого контура .

В качестве менее тривиального примера, вместо того, чтобы

for i = 1:n-1 
    a(i) = b(i+1) - b(i); 
endfor 

запись

a = b(2:n) - b(1:n-1); 

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

for i = 1:n 
    if (a(i) > 5) 
    a(i) -= 20 
    endif 
endfor 

запись

a(a>5) -= 20; 

, который использует тот факт, что 'а> 5' производит логический индекс.

Используйте поэлементные векторные операторы, когда это возможно, чтобы избежать цикла (такие операторы, как '. *' И '. ^').  Арифметические операции. Для простых встроенных функций функция «векторизация» может делать это автоматически.

- Встроенная функция: векторизовать (FUN) Создать векторизованную версию функции FUN инлайн путем замены все вхождения «», «/», и т.д., с. «» ./»и т.д.

This may be useful, for example, when using inline functions with 
numerical integration or optimization where a vector-valued 
function is expected. 

     fcn = vectorize (inline ("x^2 - 1")) 
     => fcn = f(x) = x.^2 - 1 
     quadv (fcn, 0, 3) 
     => 6 

See also:  inline,  formula, 
 argnames. 

использовать также вещание в этих поэлементных операторах как для избежать ненужных циклов и выделения промежуточных памяти.
 Радиовещание.

Используйте встроенные и библиотечные функции, если это возможно. Встроенные и скомпилированные функции выполняются очень быстро. Даже с библиотечной функцией m-файла, шансы хорошие, что они уже оптимизированы или будут оптимизированы более в будущей версии.

Например, даже лучше, чем

a = b(2:n) - b(1:n-1); 

является

a = diff (b); 

функции Большинство Octave написаны с векторными и массив аргументов в уме. Если вы обнаружите, что пишете цикл с очень простой операцией, вероятность того, что такая функция уже существует, равна . Следующие функции часто встречаются в коде векторизованного:

  • Индекс манипуляции

    * find 
    
    * sub2ind 
    
    * ind2sub 
    
    * sort 
    
    * unique 
    
    * lookup 
    
    * ifelse/merge 
    
  • Повторение

    * repmat 
    
    * repelems 
    
  • Векторизованное арифметическая

    * sum 
    
    * prod 
    
    * cumsum 
    
    * cumprod 
    
    * sumsq 
    
    * diff 
    
    * dot 
    
    * cummax 
    
    * cummin 
    
  • Форма высокой размерности массивов

    * reshape 
    
    * resize 
    
    * permute 
    
    * squeeze 
    
    * deal 
    

Также обратите внимание на эти страницы из вики Stanford ML для некоторых больше указаний с примерами.

http://ufldl.stanford.edu/wiki/index.php/Vectorization

http://ufldl.stanford.edu/wiki/index.php/Logistic_Regression_Vectorization_Example

http://ufldl.stanford.edu/wiki/index.php/Neural_Network_Vectorization

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