func sgdOnSequences(f *rnn.Bidirectional, s []seqtoseq.Sample) { gradient := autofunc.NewGradient(f.Parameters()) for _, x := range s { inRes := seqfunc.ConstResult([][]linalg.Vector{x.Inputs}) output := f.ApplySeqs(inRes) upstreamGrad := make([]linalg.Vector, len(x.Outputs)) for i, o := range x.Outputs { upstreamGrad[i] = o.Copy().Scale(-1) } output.PropagateGradient([][]linalg.Vector{upstreamGrad}, gradient) } for _, vec := range gradient { for i, x := range vec { if x > 0 { vec[i] = 1 } else { vec[i] = -1 } } } gradient.AddToVars(-StepSize) }