|
@@ -2,10 +2,15 @@ package main
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"math"
|
|
"math"
|
|
|
|
|
+ "math/rand"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
const (
|
|
|
|
|
+ Input int = 1433
|
|
|
Hidden int = 50
|
|
Hidden int = 50
|
|
|
|
|
+ Output int = 7
|
|
|
|
|
+ Sample int = 5000
|
|
|
|
|
+ Batch int = 20
|
|
|
RateWo float64 = 0.02
|
|
RateWo float64 = 0.02
|
|
|
RateWi float64 = 0.04
|
|
RateWi float64 = 0.04
|
|
|
RateB float64 = 0.05
|
|
RateB float64 = 0.05
|
|
@@ -67,39 +72,45 @@ func GetEmbedding(G Graph, u, k int, l []Layer) Vector {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if Do > 0 {
|
|
if Do > 0 {
|
|
|
- l[k-1].O.Divide(float64(Do))
|
|
|
|
|
- l[k].E.Add(Multiply(l[k-1].O, l[k].p.Wo))
|
|
|
|
|
|
|
+ l[k].E.Add(Multiply(l[k-1].O.Divide(float64(Do)), l[k].p.Wo))
|
|
|
}
|
|
}
|
|
|
if Di > 0 {
|
|
if Di > 0 {
|
|
|
- l[k-1].I.Divide(float64(Di))
|
|
|
|
|
- l[k].E.Add(Multiply(l[k-1].I, l[k].p.Wi))
|
|
|
|
|
|
|
+ l[k].E.Add(Multiply(l[k-1].I.Divide(float64(Di)), l[k].p.Wi))
|
|
|
}
|
|
}
|
|
|
return l[k].f(l[k].E)[0]
|
|
return l[k].f(l[k].E)[0]
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func Train(G Graph) []Layer {
|
|
func Train(G Graph) []Layer {
|
|
|
- p1 := Parameter{MakeRandomMatrix(1433, Hidden), MakeRandomMatrix(1433, Hidden), MakeRandomMatrix(1433, Hidden)}
|
|
|
|
|
- p2 := Parameter{MakeRandomMatrix(Hidden, 7), MakeRandomMatrix(Hidden, 7), MakeRandomMatrix(Hidden, 7)}
|
|
|
|
|
- l := []Layer{{d: 1433}, {d: Hidden, f: ReLU, p: p1}, {d: 7, f: Softmax, p: p2}}
|
|
|
|
|
- for u, X := range G.X {
|
|
|
|
|
- GetEmbedding(G, u, 2, l)
|
|
|
|
|
- delta := MakeMatrix(1, 7)
|
|
|
|
|
- delta[0][nodeLabel[u]] = 1
|
|
|
|
|
- delta.Sub(l[2].E)
|
|
|
|
|
- DWo2, DWi2, DB2 := Multiply(l[1].O.Transpose(), delta), Multiply(l[1].I.Transpose(), delta), Multiply(l[1].E.Transpose(), delta)
|
|
|
|
|
- DWo2.Divide(1 / RateWo)
|
|
|
|
|
- DWi2.Divide(1 / RateWi)
|
|
|
|
|
- DB2.Divide(1 / RateB)
|
|
|
|
|
- delta = Multiply(delta, l[2].p.B.Transpose())
|
|
|
|
|
- for i := 0; i < Hidden; i++ {
|
|
|
|
|
- if l[1].E[0][i] == 0 {
|
|
|
|
|
- delta[0][i] = 0
|
|
|
|
|
|
|
+ p1 := Parameter{MakeRandomMatrix(Input, Hidden), MakeRandomMatrix(Input, Hidden), MakeRandomMatrix(Input, Hidden)}
|
|
|
|
|
+ p2 := Parameter{MakeRandomMatrix(Hidden, Output), MakeRandomMatrix(Hidden, Output), MakeRandomMatrix(Hidden, Output)}
|
|
|
|
|
+ l := []Layer{{d: Input}, {d: Hidden, f: ReLU, p: p1}, {d: Output, f: Softmax, p: p2}}
|
|
|
|
|
+ for i := 0; i < Sample; i++ {
|
|
|
|
|
+ DWo2, DWi2, DB2 := MakeMatrix(Hidden, Output), MakeMatrix(Hidden, Output), MakeMatrix(Hidden, Output)
|
|
|
|
|
+ DWo1, DWi1, DB1 := MakeMatrix(Input, Hidden), MakeMatrix(Input, Hidden), MakeMatrix(Input, Hidden)
|
|
|
|
|
+ u := nodeId[rand.Intn(len(nodeId))]
|
|
|
|
|
+ for j := 0; j < Batch; j++ {
|
|
|
|
|
+ GetEmbedding(G, u, 2, l)
|
|
|
|
|
+ delta := MakeMatrix(1, Output)
|
|
|
|
|
+ delta[0][nodeLabel[u]] = 1
|
|
|
|
|
+ delta.Sub(l[2].E)
|
|
|
|
|
+ DWo2.Add(Multiply(l[1].O.Transpose(), delta).Divide(float64(Batch) / RateWo))
|
|
|
|
|
+ DWi2.Add(Multiply(l[1].I.Transpose(), delta).Divide(float64(Batch) / RateWi))
|
|
|
|
|
+ DB2.Add(Multiply(l[1].E.Transpose(), delta).Divide(float64(Batch) / RateB))
|
|
|
|
|
+ delta = Multiply(delta, l[2].p.B.Transpose())
|
|
|
|
|
+ for k := 0; k < Hidden; k++ {
|
|
|
|
|
+ if l[1].E[0][k] == 0 {
|
|
|
|
|
+ delta[0][k] = 0
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ DWo1.Add(Multiply(l[0].O.Transpose(), delta).Divide(float64(Batch) / RateWo))
|
|
|
|
|
+ DWi1.Add(Multiply(l[0].I.Transpose(), delta).Divide(float64(Batch) / RateWi))
|
|
|
|
|
+ DB1.Add(Multiply(Matrix{G.X[u]}.Transpose(), delta).Divide(float64(Batch) / RateB))
|
|
|
|
|
+ neighbor := make([]int, 0)
|
|
|
|
|
+ for v := range G.A[u] {
|
|
|
|
|
+ neighbor = append(neighbor, v)
|
|
|
|
|
+ }
|
|
|
|
|
+ u = neighbor[rand.Intn(len(neighbor))]
|
|
|
}
|
|
}
|
|
|
- DWo1, DWi1, DB1 := Multiply(l[0].O.Transpose(), delta), Multiply(l[0].I.Transpose(), delta), Multiply(Matrix{X}.Transpose(), delta)
|
|
|
|
|
- DWo1.Divide(1 / RateWo)
|
|
|
|
|
- DWi1.Divide(1 / RateWi)
|
|
|
|
|
- DB1.Divide(1 / RateB)
|
|
|
|
|
l[2].p.Wo.Add(DWo2)
|
|
l[2].p.Wo.Add(DWo2)
|
|
|
l[2].p.Wi.Add(DWi2)
|
|
l[2].p.Wi.Add(DWi2)
|
|
|
l[2].p.B.Add(DB2)
|
|
l[2].p.B.Add(DB2)
|