2016-03-28 14 views
0

Ich bin ein Anfänger der Taschenlampe und ich lese den Code der LSTM-Sprachmodelle. Ich bin verwirrt über die Implementierung der Einbettungsschicht (https://github.com/oxford-cs-ml-2015/practical6/blob/master/Embedding.lua).Taschenlampe: die Implementierung der Einbettungsschicht

Dies ist die updateGradInput Funktion in Einbettungsschicht:

function Embedding:updateGradInput(input, gradOutput) 
    if self.gradInput then 
    self.gradInput:resize(input:size()) 
    return self.gradInput 
    end 
end 

Meine erste Frage ist, warum in dieser Funktion eher eine if Aussage gibt es nicht nur wie unten:

function Embedding:updateGradInput(input, gradOutput) 
    self.gradInput:resize(input:size()) 
    return self.gradInput 
end 

Ich denke self.gradInput wird immer wahr, weil self.gradInput in __init() von nn.Module initialisiert wurde.

Meine zweite Frage ist, warum return self.gradInput direkt anstelle self.gradInput mit input und gradOutput berechnet? Ich meine self.gradInput = gradOutput * (deriv. of output wrt input).

Meine letzte Frage ist, was die Wirkung dieser Code in Embedding.lua:

-- we do not need to accumulate parameters when sharing 
Embedding.sharedAccUpdateGradParameters = Embedding.accUpdateGradParameters 

Was bedeutet es, von „wir brauchen keine Parameter zu akkumulieren, wenn sharing“?

Antwort

0

(1) ist, so dass, wenn jemand explizit nils gradInput, dann berechnen dont (2) wird, weil Einbettungsschichten tatsächlich keine gradInput haben, sind die Eingänge nicht differenzierbar