Как векторизовать уравнения? - PullRequest
9 голосов
/ 21 февраля 2012

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

Cost function for Softmax Regression with Weight Decay

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

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

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

Приветствия

Ответы [ 2 ]

2 голосов
/ 17 февраля 2015

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

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

1 голос
/ 29 февраля 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...