public float TrainOne(Sent sent) { G.Need = true; var c = new ArcStandardConfig(sent, false, _rngChoice); GetTokenRepr(sent, true); var losses = 0f; while (!c.IsTerminal()) { var oracle = c.GetOracle(_conf.OraType, out float[] target, out string slabel); GetTrans(c, out Tensor op, out Tensor label); G.SoftmaxWithCrossEntropy(op, target, out float loss); losses += loss; if (slabel != null) { // in mapping 0 is unk, 1 is root var labelid = _train.DepLabel[slabel] - 1; G.SoftmaxWithCrossEntropy(label, labelid, out loss); losses += loss; } c.Apply(oracle, slabel); } G.Backward(); _opt.Update(FixedParams); _opt.Update(VariedParams); VariedParams.Clear(); G.Clear(); return(losses / sent.Count); }
private void GetTokenRepr(Sent sent, bool grad) { var x = new Tensor[sent.Count]; for (var i = 0; i < sent.Count; i++) { var form = _formemb[_train.Form[sent[i].Norm]]; form.RefCount++; var pos = _posemb[_train.PosTag[sent[i].Pos]]; pos.RefCount++; if (grad) { VariedParams.Add(form); VariedParams.Add(pos); } x[i] = G.Concat(form, pos); } var t = _surface.Step(G, x); for (var i = 0; i < sent.Count; i++) { sent[i].Repr = G.DropOut(t[i], 0.5f); } }