2012-02-21 7 views
8

Sto cercando di implementare l'algoritmo di regressione di Softmax per risolvere il problema del classificatore K dopo aver visto le lezioni del professor Andrew Ng su GLM. Ho pensato ho capito tutto quello che stava dicendo fino a quando finalmente è venuto a scrivere il codice per implementare la funzione di costo per Softmax la regressione, che è la seguente:Come vettorializzare equazioni?

Cost function for Softmax Regression with Weight Decay

Il problema che sto avendo sta cercando di capire un modo per vettorializzare questo. Di nuovo I ho pensato a ho capito come fare per vettorizzare equazioni come questa dato che ero in grado di farlo per regressione lineare e logistica, ma dopo aver osservato quella formula sono bloccato.

Mentre mi piacerebbe capire una soluzione vettoriale per questo (mi rendo conto che esiste già una domanda simile già pubblicata: Vectorized Implementation of Softmax Regression), quello a cui sono più interessato è se qualcuno di voi può dirmi un modo (a modo tuo) a metodicamente convertire equazioni come questa in forme vettorizzate. Ad esempio, per quelli di voi che sono esperti o veterani stagionati in ML, quando leggete nuovi algoritmi in letteratura per la prima volta e li vedete scritti in notazione simile all'equazione sopra, come si fa a convertirli in forme vettorializzate?

Mi rendo conto che potrei venire come essere lo studente che chiede a Mozart: "Come suoni il piano così bene?" Ma la mia domanda è semplicemente motivata dal desiderio di diventare migliore in questo materiale, e partendo dal presupposto che non tutti sono nati sapendo come vettorializzare equazioni, e quindi qualcuno là fuori deve aver escogitato il proprio sistema, e se è così, per favore condividi! Molte grazie in anticipo!

Acclamazioni

+0

può fornire un link alla conferenza su GLM? – justis

+1

Per gentile concessione della classe ML del Professor Andrew Ng a Stanford: http://cs229.stanford.edu/materials.html - il materiale di regressione GLM e Softmax si trova alla fine di Lezione 1 – oort

risposta

1

questo sembra piuttosto difficile da vettorizzare dal momento che si sta facendo esponenziali interno delle somme. Presumo che tu stia elevando e a poteri arbitrari. Quello che puoi vettorizzare è il secondo termine dell'espressione \ sum \ sum theta^2 assicurati di usare. * Operatore in matlab enter link description here nel computer \ theta^2

Lo stesso vale per i termini interni del rapporto del che va nel logaritmo. \ theta 'x^(i) è un'espressione vettoriale.

Si potrebbe anche trarre vantaggio da una tecnica di memoizzazione o di programmazione dinamica e provare a riutilizzare i risultati dei calcoli di e^\ theta 'x^(i).

Generalmente nella mia esperienza il modo di vettorializzare è innanzitutto quello di ottenere l'implementazione di un'implementazione non vettoriale. Quindi prova a vettorizzare le parti più ovvie del tuo calcolo. Ad ogni passo, modifica la tua funzione molto poco e controlla sempre se ottieni lo stesso risultato del calcolo non vettorializzato. Inoltre, avere più casi di test è molto utile.

2

I file di aiuto che vengono con Octave hanno questa entrata

19,1 Vettorizzazione base

Per una buona prima approssimazione, l'obiettivo in vettorializzazione è quello di scrivere il codice che evita i loop e usa tutta-array operazioni.Come un esempio banale , considerano

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

rispetto al molto più semplice

c = a + b; 

Questo non è solo più facile da scrivere; è anche internamente molto più facile da ottimizzare . Octave delega questa operazione a un'implementazione di base che, tra le altre ottimizzazioni, può utilizzare le istruzioni hardware del vettore speciale o, in teoria, potrebbe persino eseguire le aggiunte nel parallelo . In generale, se il codice è vettorializzato, l'implementazione sottostante ha più libertà riguardo alle ipotesi che può fare nell'ordine per ottenere un'esecuzione più rapida.

Questo è particolarmente importante per i loop con corpi "economici". Spesso è sufficiente per vettorizzare solo il ciclo più interno per ottenere prestazioni accettabili . Una regola generale è che "l'ordine" del corpo vettorizzato deve essere maggiore o uguale a "ordine" del ciclo di chiusura .

Come esempio meno banale, invece di

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

scrittura

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

Questo mostra un importante concetto generale sull'utilizzo di matrici per l'indicizzazione invece di ciclare su una variabile indice.  Espressioni dell'indice. Utilizzare anche l'indicizzazione booleana generosamente. Se è necessario testare una condizione , questa condizione può anche essere scritta come indice booleano . Ad esempio, invece di

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

scrittura

a(a>5) -= 20; 

che sfrutta il fatto che 'a> 5' produce un indice booleana.

Utilizzare gli operatori vettore elementare quando possibile per evitare il looping (operatori come ". *" E ". ^").  Operazioni aritmetiche. Per le semplici funzioni inline , la funzione 'vectorize' può farlo automaticamente.

- Funzione incorporata: vectorize (FUN) Crea una vettorizzati versione della funzione FUN inline sostituendo tutte le occorrenze di '', '/', ecc, con'. '' ./', ecc

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. 

exploit anche trasmissioni in questi operatori elementwise sia per evitare il loop e inutili allocazioni di memoria intermedie.
 Trasmissione.

Utilizzare le funzioni incorporate e di libreria, se possibile. Le funzioni compilate e compilate sono molto veloci. Anche con una funzione di libreria di file m, le probabilità di sono buone che sono già ottimizzate o che saranno ottimizzate di più in una versione futura.

Per esempio, anche meglio di

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

è

a = diff (b); 

maggior parte delle funzioni di ottava sono scritti con vettoriali e matrice argomenti in mente. Se ti ritrovi a scrivere un loop con un'operazione molto semplice, le probabilità di sono che tale funzione esiste già. Le funzioni seguenti verificano frequentemente in codice vettorizzato:

  • manipolazione Indice

    * find 
    
    * sub2ind 
    
    * ind2sub 
    
    * sort 
    
    * unique 
    
    * lookup 
    
    * ifelse/merge 
    
  • Ripetizione

    * repmat 
    
    * repelems 
    
  • aritmetica Vettorizzati

    * sum 
    
    * prod 
    
    * cumsum 
    
    * cumprod 
    
    * sumsq 
    
    * diff 
    
    * dot 
    
    * cummax 
    
    * cummin 
    
  • forma di maggiori dimensioni array

    * reshape 
    
    * resize 
    
    * permute 
    
    * squeeze 
    
    * deal 
    

Anche guardare queste pagine da un wiki Stanford ML per un po 'di guida con esempi.

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