3

I 1 die Eingangsschicht habe, 2 verborgene Schichten und 1 Ausgang Schicht und für ein einzelnes Trainingsbeispiel x mit dem Ausgang y I berechnet habe folgende:Gradientenabstieg vektorisiert Berechnung Abmessungen nicht korrekt

x = [1;0;1]; 
y = [1;1;1]; 

    theta1 = 

     4.7300 3.2800 1.4600 
      0   0   0 
     4.7300 3.2800 1.4600 

    theta2 = 

     8.8920 8.8920 8.8920 
     6.1670 6.1670 6.1670 
     2.7450 2.7450 2.7450 

    theta3 = 

     9.4460 6.5500 2.9160 
     9.3510 6.4850 2.8860 
     8.8360 6.1270 2.7270 

THETA1 steuert Zuordnung zwischen Eingang Schicht und layer1 tHETA2 Zuordnung zwischen layer1 und Layer2 steuert theta3 Zuordnung zwischen Layer2 steuert und die Ausgangsschicht

Aber Gradientenabstiegsverfahren verwendet zu berechnen: theta(i) = theta(i) - (alpha/m .* (x .* theta(i)-y)' * x)' wobei i = 1, 2 oder 3 die Abmessungen von x und y sind falsch. Die Dimensionen sind korrekt (mit korrekter Bedeutung kann die Theta-Berechnung ohne Fehler ausgeführt werden), wenn x und y 1x9 statt 1x3 sind. Muss ich die Architektur meines neuronalen Netzwerks ändern oder kann ich einfach x und y auf
setzen x = [1; 0; 1; 0; 0; 0; 0; 0; 0]; y = [1; 1; 1; 0; 0; 0; 0; 0; 0]; damit die Matrixmultiplikation funktioniert?

Update:

alpha=learning rate (.00001) 
m=number of training examples (1) 
theta(i) refers to theta1,theta2,theta3 

Ich bin vektorisiert Gradientenabfallsaktualisierung mit wie bei Vectorization of a gradient descent code

Update2 beschrieben:

Dieser MATLAB-Code scheint zu funktionieren:

m = 1; 
alpha = .0000001; 
x = [1;0;1]; 
y = [1; 1; 1]; 
theta1 = [4.7300 3.2800 1.4600; 0 0 0; 4.7300 3.2800 1.4600]; 
theta1 = theta1 - (alpha/m) * (x' * (theta1 * x - y)); 

ist theta1 = theta1 - (alpha/m) * (x' * (theta1 * x - y)); korrekte Umsetzung von vektorisierten Gr adient Abstieg?

Ich verstehe, dass dies Probleme beim Abrollen von Theta-Matrizen zu Theta-Vektoren verursachen wird, da die Dimensionen nicht gleich sein werden, aber für das Arbeiten mit Theta-Matrizen anstelle von Theta-Vektoren ist das korrekt?

Update: Formel von Vectorization of a gradient descent code modifiziert wird, wo Gradientenabfallsaktualisierung gegeben ist als: theta = theta - (alpha/m) * (X' * (X*theta-y)); ich es theta = theta - (alpha/m) * (x' * (theta * x - y)); verändert, so verändert (X*theta-y);-(theta * x - y);

+0

Die Aussage 'x. * Theta (i)' scheint fischig, da die Dimensionen nicht übereinstimmen, egal ob 'x' 1x3 oder 1x9 ist. Könntest du ein paar Dinge in deinem Post erklären: Ist 'theta (i)' etwas, das tatsächlich in deinen Code geschrieben wurde, oder schreibst du es nur hier, um sich gleichzeitig auf 'theta1',' theta2' oder 'theta3' zu beziehen? Sind 'alpha' und' m' Konstanten? – Geoff

+0

@Geoff siehe Frage Update 'Die Aussage x.* Theta (i) scheint fischig, da die Dimensionen nicht übereinstimmen. Ich stimme zu, ich bin mir nicht sicher, ob es ein Problem mit meiner Netzwerkarchitektur oder etwas anderes ist. –

Antwort

0

In Ihrem post verwiesen, X eine Matrix enthält m Zeilen (Anzahl von Trainingsproben). In Ihrem Fall ist m = 1, also wird X ein Zeilenvektor. Während Ihrer Initialisierung ist x ein Spaltenvektor. Die einfachste Änderung besteht also darin, x = x' und so festzulegen, dass sowohl Ihr Eingang als auch Ihr Ausgang Zeilenvektoren werden.

würde die Formel noch

theta3 = theta3 - (alpha/m) * (x' * (x*theta3-y)) = 
    9.4458 6.5499 2.9160 
    9.3510 6.4850 2.8860 
    8.8358 6.1269 2.7270 

Die Aktualisierungsregel für Theta2 und theta1 wäre ähnlich sein.

Auch der Fehler Begriff x*theta3-y hat immer die gleiche Form wie der Eingang x; und die rohe Aktualisierungsmenge x' * (x*theta3-y) hat immer die gleiche Form wie theta3.

+0

Sie haben die Funktion aktualisiert von 'theta1 = theta1 - (alpha/m) * (x' * (theta1 * x - y)); ' zu 'theta3 - alpha/m. * x * (Theta3 * x - y)', damit meine Gradientenabstiegsfunktion falsch ist '? –

+0

Ich könnte mich irren, haben Sie einen Bezug zu Ihrer Formel? – greeness

+0

siehe Frage Update –