2012-02-21 31 views
8

Estoy tratando de implementar el algoritmo de regresión de Softmax para resolver el problema del clasificador K después de ver las conferencias del Profesor Andrew Ng sobre GLM. Me pensé entendí todo lo que estaba diciendo hasta que finalmente llegó a escribir el código para implementar la función de costos para la regresión Softmax, que es como sigue:Cómo vectorizar ecuaciones?

Cost function for Softmax Regression with Weight Decay

El problema que estoy teniendo está tratando de averiguar una forma de vectorizar esto. De nuevo, yo , pensé en. Entendí cómo vectorizar ecuaciones como esta, ya que pude hacerlo para la regresión lineal y logística, pero después de mirar esa fórmula, estoy atascado.

Aunque me gustaría encontrar una solución vectorizada para esto (me doy cuenta de que ya hay una pregunta similar publicada: Vectorized Implementation of Softmax Regression), lo que más me interesa es si alguno de ustedes puede decirme un camino (a su manera) a metódicamente convertir ecuaciones como esta en formas vectorizadas. Por ejemplo, para aquellos de ustedes que son expertos o experimentados veteranos en ML, cuando lean nuevos algoritmos en la literatura por primera vez, y los vean escritos en notación similar a la ecuación anterior, ¿cómo hacen para convertirlos a formas vectorizadas?

Me doy cuenta de que podría ser como el estudiante que le pregunta a Mozart: "¿Cómo tocas el piano tan bien?" Pero mi pregunta simplemente está motivada por un deseo de mejorar en este material, y asumiendo que no todos nacieron sabiendo cómo vectorizar ecuaciones, por lo que alguien debe haber ideado su propio sistema, y ​​si es así, ¡por favor compártelo! ¡Muchas gracias de antemano!

Saludos

+0

¿Puede proporcionar un enlace a la conferencia sobre GLM? – justis

+1

Cortesía de la clase ML del Profesor Andrew Ng en Stanford: http://cs229.stanford.edu/materials.html - el material de Regresión GLM y Softmax se encuentra al final de la Clase 1 – oort

Respuesta

1

Éste parece bastante difícil de vectorizar ya que está haciendo exponenciales interior de sus sumas. Supongo que estás elevando e a poderes arbitrarios. Lo que puede vectorizar es el segundo término de la expresión \ sum \ sum theta^2 simplemente asegúrese de usar. * Operador en matlab enter link description here en computadora \ theta^2

Lo mismo ocurre con los términos internos de la relación de la eso va dentro del logaritmo \ theta 'x^(i) es una expresión vectorizable.

También puede beneficiarse de una técnica de memorización o programación dinámica y tratar de reutilizar los resultados de los cálculos de e^\ theta 'x^(i).

Generalmente, en mi experiencia, la forma de vectorizar es, en primer lugar, que la implementación no vectorizada funcione. Luego trata de vectorizar las partes más obvias de tu computación. En cada paso modifique su función muy poco y siempre verifique si obtiene el mismo resultado que el cálculo no vectorizado. Además, tener múltiples casos de prueba es muy útil.

2

Los archivos de ayuda que vienen con Octave tienen esta entrada:

19,1 vectorización básico

Para una muy buena primera aproximación, el objetivo de vectorización es código de escritura que evita bucles y utiliza todo el arsenal operaciones.Como un ejemplo trivial , considere

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

en comparación con el mucho más simple

c = a + b; 

Esto no es simplemente más fácil de escribir; también es internamente mucho más fácil optimizar . Octave delega esta operación en una implementación subyacente de que, entre otras optimizaciones, puede usar instrucciones de hardware de vector especial o incluso podría realizar las adiciones en el paralelo . En general, si el código está vectorizado, la implementación subyacente tiene más libertad sobre las suposiciones que puede hacer en para lograr una ejecución más rápida.

Esto es especialmente importante para los bucles con cuerpos "baratos". Con frecuencia es suficiente vectorizar solo el bucle más interno para obtener un rendimiento aceptable. Una regla general es que el "orden" del cuerpo vectorizado debe ser mayor o igual que el "orden" del bucle circundante .

Como un ejemplo menos trivial, en lugar de

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

escritura

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

Esto muestra un importante concepto general sobre el uso de matrices para indexación en lugar de bucle a través de una variable de índice.  Expresiones de índice. También use la indexación booleana generosamente. Si se debe probar una condición , esta condición también se puede escribir como un índice booleano . Por ejemplo, en lugar de

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

escritura

a(a>5) -= 20; 

que explota el hecho de que 'a> 5' produce un índice booleano.

Utilice los operadores de vectores con elementos cuando sea posible para evitar el bucle (operadores como '. *' Y '. ^').  Operaciones aritméticas. Para funciones en línea simples , la función 'vectorizar' puede hacer esto automáticamente.

- de las funciones integradas: vectorizar (FUN) Crear una versión vectorizada de la función FUN en línea mediante la sustitución de todas las ocurrencias de '', '/', etc., con'. '' ./', etc.

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. 

también explotan la radiodifusión en estos operadores elementwise tanto a evitar bucles y las asignaciones de memoria intermedios innecesarios.
 Radiodifusión.

Utilice funciones integradas y de biblioteca si es posible. Las funciones compiladas incorporadas y son muy rápidas. Incluso con una función de biblioteca de archivos m, es muy probable que ya esté optimizado, o se optimice más en una versión futura.

Por ejemplo, incluso mejor que

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

es

a = diff (b); 

mayoría de las funciones de octava se escriben con el vector y la matriz argumentos en mente. Si se encuentra escribiendo un ciclo con una operación muy simple, es probable que tal función ya exista. Las siguientes funciones se producen con frecuencia en el código vectorizado:

  • manipulación Índice

    * find 
    
    * sub2ind 
    
    * ind2sub 
    
    * sort 
    
    * unique 
    
    * lookup 
    
    * ifelse/merge 
    
  • Repetición

    * repmat 
    
    * repelems 
    
  • aritmética vectorizada

    * sum 
    
    * prod 
    
    * cumsum 
    
    * cumprod 
    
    * sumsq 
    
    * diff 
    
    * dot 
    
    * cummax 
    
    * cummin 
    
  • Forma de las matrices de dimensiones superiores

    * reshape 
    
    * resize 
    
    * permute 
    
    * squeeze 
    
    * deal 
    

Busque también en estas páginas de un wiki de Stanford ML para algunos más orientación con ejemplos.

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