Exemple #1
0
        public void MomentumOptimizer_SimpleMultivar()
        {
            // arrange
            var func      = new Mocks.SimpleMultivar();
            var lr        = 0.1D;
            var mu        = 0.9D;
            var w         = new double[2][] { new[] { 1.0D, 1.0D }, new[] { 1.0D } };
            var optimizer = new MomentumOptimizer(mu);

            // act & assert

            optimizer.Push(w, func.Gradient(w), lr);
            Assert.AreEqual(0, w[0][0]);
            Assert.AreEqual(0.8, w[0][1]);
            Assert.AreEqual(0, w[1][0]);
            Assert.AreEqual(2.04, optimizer.Step2, EPS);

            optimizer.Push(w, func.Gradient(w), lr);
            Assert.AreEqual(-0.74, w[0][0], EPS);
            Assert.AreEqual(0.14, w[0][1], EPS);
            Assert.AreEqual(-0.74, w[1][0], EPS);
            Assert.AreEqual(1.5308, optimizer.Step2, EPS);

            optimizer.Push(w, func.Gradient(w), lr);
            Assert.AreEqual(-0.490, w[0][0], EPS);
            Assert.AreEqual(-0.834, w[0][1], EPS);
            Assert.AreEqual(-0.490, w[1][0], EPS);
            Assert.AreEqual(1.073676, optimizer.Step2, EPS);

            optimizer.Push(w, func.Gradient(w), lr);
            Assert.AreEqual(0.1562, w[0][0], EPS);
            Assert.AreEqual(-1.4062, w[0][1], EPS);
            Assert.AreEqual(0.1562, w[1][0], EPS);
            Assert.AreEqual(1.16256172, optimizer.Step2, EPS);

            optimizer.Push(w, func.Gradient(w), lr);
            Assert.AreEqual(0.2691, w[0][0], EPS);
            Assert.AreEqual(-1.01498, w[0][1], EPS);
            Assert.AreEqual(0.2691, w[1][0], EPS);
            Assert.AreEqual(0.17854591, optimizer.Step2, EPS);
        }