Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
            }
        }