1. Test Modules
  2. Training Characteristics
    1. Input Learning
      1. Gradient Descent
      2. Conjugate Gradient Descent
      3. Limited-Memory BFGS
    2. Results
  3. Results

Subreport: Logs for com.simiacryptus.ref.lang.ReferenceCountingBase

Test Modules

Using Seed 2084552626322608128

Training Characteristics

Input Learning

In this apply, we use a network to learn this target input, given it's pre-evaluated output:

TrainingTester.java:332 executed in 0.03 seconds (0.000 gc):

    return RefArrays.stream(RefUtil.addRef(input_target)).flatMap(RefArrays::stream).map(x -> {
      try {
        return x.prettyPrint();
      } finally {
        x.freeRef();
      }
    }).reduce((a, b) -> a + "\n" + b).orElse("");

Returns

    [
    	[ [ -1.468, 1.044, 0.456 ], [ -1.44, -1.968, -1.264 ], [ -0.048, 0.544, -1.2 ], [ 0.172, -0.776, 1.664 ], [ 1.14, -1.04, -0.048 ], [ -1.588, -1.704, 1.72 ], [ 1.992, -0.172, 1.212 ], [ 0.556, -0.672, 0.24 ], ... ],
    	[ [ 1.6, -0.16, 0.68 ], [ -0.26, -1.94, 1.172 ], [ -0.672, -0.316, 0.804 ], [ -1.86, 0.004, 0.5 ], [ -1.408, -1.144, 1.908 ], [ -1.064, -1.184, 1.168 ], [ 0.728, 1.048, -1.336 ], [ -1.436, -1.176, -1.016 ], ... ],
    	[ [ -0.328, -0.34, 1.352 ], [ -0.844, 0.78, 1.888 ], [ -1.024, 1.084, -0.232 ], [ -1.82, -1.448, -1.008 ], [ -1.44, -0.816, -1.468 ], [ 1.032, -0.276, -1.16 ], [ -0.204, 1.556, 0.636 ], [ 1.36, 1.564, 1.876 ], ... ],
    	[ [ 1.608, 1.416, -1.668 ], [ -0.06, -1.356, -1.932 ], [ -0.352, 1.7, 1.436 ], [ 0.324, -1.776, 0.68 ], [ -0.668, -1.228, -1.132 ], [ 1.86, 1.508, 0.904 ], [ -0.456, -1.424, 1.628 ], [ 1.384, 0.928, -0.5 ], ... ],
    	[ [ -1.804, -0.34, 0.808 ], [ 1.708, -1.416, 1.712 ], [ 0.496, 1.036, -1.816 ], [ -1.624, 1.312, -1.788 ], [ -1.992, 0.484, -1.256 ], [ 0.88, 1.82, -1.764 ], [ 0.388, 1.98, -1.644 ], [ 0.38, 1.612, -0.66 ], ... ],
    	[ [ -0.66, -0.024, 1.848 ], [ -1.884, -1.192, -0.368 ], [ 1.112, -0.916, -0.316 ], [ 1.928, 1.176, -0.648 ], [ 0.832, 0.968, 0.464 ], [ -0.008, 1.712, 1.86 ], [ 0.648, -0.988, -1.144 ], [ 1.54, -1.572, -0.184 ], ... ],
    	[ [ -1.076, 1.672, 1.42 ], [ 0.344, -0.5, 1.144 ], [ 1.76, -1.804, 1.332 ], [ 0.208, 0.844, -0.448 ], [ -0.956, -0.176, 0.708 ], [ 1.5, -0.112, -1.128 ], [ 0.292, 1.656, -1.6 ], [ 1.708, 1.024, 1.032 ], ... ],
    	[ [ -0.504, 0.324, -1.524 ], [ -0.748, 1.02, 0.8 ], [ -0.32, 1.952, 1.656 ], [ -1.744, 1.488, -1.308 ], [ -0.672, 0.052, 1.784 ], [ -0.228, -1.544, -1.296 ], [ -1.604, -1.292, 1.716 ], [ -0.4, 1.688, 1.18 ], ... ],
    	...
    ]
    [
    	[ [ 0.864, 0.26, 0.124 ], [ 0.108, 0.512, -1.88 ], [ 0.232, 1.316, -0.668 ], [ 0.812, 0.968, -0.928 ], [ -0.24, 1.772, -1.824 ], [ -1.24, -0.268, 1.688 ], [ 1.848, 0.004, -0.564 ], [ 0.748, -1.684, 0.536 ], ... ],
    	[ [ 0.368, 0.372, -1.112 ], [ 1.856, 0.052, -0.152 ], [ -1.06, -1.724, -0.324 ], [ 0.28, -1.372, 0.448 ], [ 1.844, 0.352, -1.76 ], [ 1.356, -0.888, -0.444 ], [ 1.24, 0.484, 1.56 ], [ 0.92, 1.26, 0.856 ], ... ],
    	[ [ -0.56, 0.884, -1.392 ], [ 1.628, -1.108, 0.824 ], [ -0.556, 1.644, -1.296 ], [ 0.16, -0.288, -1.108 ], [ 0.804, 0.996, 0.076 ], [ 1.192, -1.384, 0.788 ], [ 0.456, -1.844, -1.524 ], [ -0.032, 1.476, 0.076 ], ... ],
    	[ [ -0.1, -1.032, 1.744 ], [ -1.64, -0.168, -0.852 ], [ -0.524, 1.396, 0.56 ], [ -1.336, -0.82, -1.336 ], [ 0.188, -1.492, -1.848 ], [ -1.864, 0.888, 0.384 ], [ -1.564, -0.628, -1.036 ], [ -0.052, -0.144, -1.424 ], ... ],
    	[ [ -1.652, 0.284, 0.072 ], [ 1.436, -0.748, 0.728 ], [ -0.028, -0.28, 0.852 ], [ -0.684, -1.276, 0.876 ], [ 1.792, -0.528, -0.2 ], [ 1.268, 1.624, 1.284 ], [ 1.876, 1.312, -0.516 ], [ -1.924, 0.068, -1.612 ], ... ],
    	[ [ -1.36, -0.772, -0.652 ], [ 1.264, 0.676, -0.4 ], [ 0.368, 1.316, 1.868 ], [ 1.388, 1.572, 1.24 ], [ -0.4, -0.168, 0.992 ], [ -1.456, 0.956, -1.828 ], [ -1.668, 0.692, 0.668 ], [ -1.1, 0.28, 0.688 ], ... ],
    	[ [ -0.888, -1.088, 1.408 ], [ 0.108, 1.42, 0.128 ], [ -1.248, 0.06, 0.4 ], [ 0.36, 0.916, -0.684 ], [ 1.364, 0.304, 0.416 ], [ 0.016, 1.988, -0.332 ], [ -0.472, -1.156, -0.388 ], [ -0.46, -1.844, 1.232 ], ... ],
    	[ [ 1.712, -0.544, -1.996 ], [ 1.928, -0.256, 0.82 ], [ -0.596, 1.224, 1.724 ], [ 1.624, -1.636, -1.372 ], [ 0.028, -0.936, 1.152 ], [ -1.052, 0.272, 0.836 ], [ 0.592, 1.636, 1.828 ], [ -1.136, 1.772, -1.828 ], ... ],
    	...
    ]
    [
    	[ [ -0.992, 0.816, 0.692 ], [ 0.028, -1.18, -1.028 ], [ -1.564, 1.144, 1.652 ], [ -0.604, 1.944, 0.704 ], [ 1.596, 1.06, -1.152 ], [ -0.952, -0.912, -1.244 ], [ -0.176, -1.3, -1.708 ], [ 1.728, 0.144, 1.564 ], ... ],
    	[ [ -0.032, -0.64, 0.58 ], [ -1.388, -0.412, -1.888 ], [ -1.78, 0.672, 0.416 ], [ -1.3, 1.988, -0.908 ], [ -1.82, -0.124, 0.524 ], [ 0.044, 0.536, -1.16 ], [ -0.032, -0.932, 1.38 ], [ -0.408, -0.876, -0.992 ], ... ],
    	[ [ 0.224, 0.728, 0.596 ], [ -0.332, 1.172, 0.532 ], [ -1.768, -0.052, -1.376 ], [ -1.692, -1.76, 0.712 ], [ 0.756, -1.78, 1.668 ], [ -1.64, -1.068, -1.86 ], [ 1.632, -1.92, 1.456 ], [ -1.42, -1.756, -0.384 ], ... ],
    	[ [ -1.116, -1.572, 0.528 ], [ 1.656, -0.592, 1.856 ], [ -1.56, -1.464, 0.196 ], [ -0.888, -0.768, 0.508 ], [ -0.372, 1.996, 0.26 ], [ 0.876, 0.068, 1.64 ], [ -0.7, 1.808, 0.888 ], [ 1.092, -1.652, -1.596 ], ... ],
    	[ [ -1.82, 1.332, 1.324 ], [ 1.912, 0.016, 1.12 ], [ 0.16, 0.844, -0.336 ], [ -1.54, 0.32, 0.592 ], [ -1.424, -1.792, 0.272 ], [ -1.752, -1.192, 0.936 ], [ 0.312, -1.64, -0.856 ], [ 1.9, -1.116, -0.408 ], ... ],
    	[ [ 1.936, -1.824, -1.112 ], [ 0.528, 1.372, 0.184 ], [ -1.14, -1.496, -1.492 ], [ 1.832, 0.912, -1.94 ], [ 1.684, -1.08, 0.404 ], [ -1.004, 0.264, -1.204 ], [ 0.72, -0.224, -1.472 ], [ -1.256, -1.932, 1.952 ], ... ],
    	[ [ 0.472, 0.984, -1.764 ], [ 0.912, 0.484, 0.736 ], [ 1.952, 1.456, -0.96 ], [ 1.008, 1.02, -0.256 ], [ -0.72, 0.948, 0.296 ], [ 1.712, -1.456, -0.584 ], [ -0.212, 0.308, -0.912 ], [ -0.744, -0.56, -0.76 ], ... ],
    	[ [ -1.14, 0.924, -0.412 ], [ -0.26, 0.64, -0.844 ], [ -0.872, -1.644, -0.932 ], [ -1.428, 1.876, -1.584 ], [ -0.672, 0.628, -0.644 ], [ 0.28, -1.592, 1.604 ], [ 0.44, -0.144, 0.28 ], [ -0.88, 0.452, 1.844 ], ... ],
    	...
    ]
    [
    	[ [ -1.696, -0.508, -0.132 ], [ -1.592, -0.908, 0.2 ], [ -0.408, 0.264, -1.144 ], [ -0.012, 1.932, 0.2 ], [ 1.272, 1.356, -1.444 ], [ -1.944, -0.796, 0.952 ], [ -1.192, -1.424, 1.636 ], [ 1.908, 0.736, 0.948 ], ... ],
    	[ [ 0.448, -1.228, 0.736 ], [ 1.8, -1.008, 1.3 ], [ -1.76, -1.668, 0.38 ], [ 1.876, -1.936, 0.792 ], [ -1.064, 1.304, 1.472 ], [ -0.576, -0.8, 0.724 ], [ 1.44, -1.7, 1.42 ], [ -1.356, 0.668, 0.444 ], ... ],
    	[ [ -1.444, 1.752, -1.212 ], [ -0.272, 1.192, 1.552 ], [ -0.048, -1.456, 0.0 ], [ 0.524, -0.66, -0.3 ], [ -1.336, 0.52, 0.656 ], [ 1.368, -0.856, -0.212 ], [ -0.832, 0.384, -1.772 ], [ -1.444, -0.936, -0.216 ], ... ],
    	[ [ 0.088, -1.496, 0.9 ], [ 0.4, -0.716, -1.652 ], [ 0.96, -1.32, 0.82 ], [ 0.816, 1.96, 0.6 ], [ 1.588, 1.18, -0.6 ], [ 0.912, -0.58, -0.94 ], [ 1.9, -1.592, -1.616 ], [ 1.86, 1.292, -0.836 ], ... ],
    	[ [ 1.956, -0.668, 0.008 ], [ 1.216, 0.816, 1.924 ], [ -1.264, -0.6, 0.648 ], [ 1.896, -0.032, -0.476 ], [ 1.912, 0.016, -0.536 ], [ -1.668, 1.884, 1.88 ], [ 1.04, 1.916, -1.28 ], [ -1.6, 0.424, 1.004 ], ... ],
    	[ [ -0.504, 0.12, -1.252 ], [ -1.096, -1.74, 1.568 ], [ 1.14, 0.368, -1.988 ], [ 1.86, -0.248, -0.14 ], [ 1.24, -0.7, -0.368 ], [ 0.872, 0.06, 1.656 ], [ -1.064, -0.696, -0.92 ], [ 1.828, -0.596, -0.332 ], ... ],
    	[ [ -0.844, 1.408, 0.828 ], [ -1.092, 0.856, 1.504 ], [ -1.42, -0.612, 0.392 ], [ 1.828, -1.688, 1.32 ], [ 1.484, 0.052, 1.2 ], [ 0.936, -0.952, -1.94 ], [ 0.888, -0.34, 1.688 ], [ -0.256, -0.912, -1.372 ], ... ],
    	[ [ 0.564, -0.024, 1.644 ], [ 1.152, -1.176, -1.172 ], [ -1.444, -0.048, 0.38 ], [ 0.72, -1.564, 0.556 ], [ 0.304, -1.696, 0.696 ], [ 0.956, -0.72, 1.04 ], [ -1.972, 0.412, -1.964 ], [ -0.812, -1.62, -0.2 ], ... ],
    	...
    ]
    [
    	[ [ 1.764, 0.568, 0.396 ], [ -0.536, 1.968, 1.76 ], [ 1.64, 0.572, 0.264 ], [ -1.02, -1.916, 1.856 ], [ 1.512, -0.704, 0.688 ], [ 0.344, -1.38, 1.148 ], [ -0.872, 1.424, 1.092 ], [ 0.552, -1.436, 1.848 ], ... ],
    	[ [ 1.892, 1.372, 1.768 ], [ -0.212, -1.956, 1.168 ], [ -0.752, 0.972, 1.484 ], [ -1.396, -0.028, 1.524 ], [ 0.516, 1.6, -1.012 ], [ 0.188, -0.9, 0.58 ], [ 1.228, -1.772, 0.344 ], [ -0.108, 0.064, -0.468 ], ... ],
    	[ [ 1.984, -1.396, -1.128 ], [ -0.456, -0.12, 1.796 ], [ 1.652, -0.48, 1.892 ], [ -1.764, 1.232, 0.62 ], [ -0.528, -0.772, -0.412 ], [ -1.644, 1.216, -0.428 ], [ 1.392, 1.984, -0.46 ], [ -1.956, 0.748, 2.0 ], ... ],
    	[ [ -1.548, 0.18, 1.788 ], [ 0.376, -1.98, 1.856 ], [ -0.232, 1.54, 1.156 ], [ -0.072, -1.432, -1.044 ], [ -1.592, 0.3, 0.68 ], [ 0.94, -0.16, 1.772 ], [ 0.08, 0.592, 0.82 ], [ 0.276, -1.12, 1.504 ], ... ],
    	[ [ 1.916, -0.368, 0.316 ], [ -1.052, 0.404, -1.924 ], [ 0.284, 1.572, 0.1 ], [ -0.044, -1.996, -1.884 ], [ 1.984, 0.008, 0.124 ], [ -1.652, 0.776, 1.592 ], [ -1.82, 1.116, -1.404 ], [ -0.544, -1.364, -0.688 ], ... ],
    	[ [ -0.892, 1.528, 1.496 ], [ 1.876, 1.748, -0.7 ], [ 1.692, -1.896, -1.68 ], [ 1.132, 0.94, 1.708 ], [ -1.42, -1.576, -0.136 ], [ 1.844, -1.932, 0.42 ], [ -1.144, -1.176, -1.98 ], [ -0.032, -1.264, -1.124 ], ... ],
    	[ [ -0.264, -0.26, 0.56 ], [ 0.008, -0.96, -1.7 ], [ 0.212, -0.376, -1.68 ], [ 0.232, 1.428, 1.76 ], [ -0.516, 0.388, -1.188 ], [ -1.104, 0.92, -0.456 ], [ 1.968, 1.88, -0.652 ], [ 1.584, -1.452, 1.344 ], ... ],
    	[ [ -1.66, -0.752, 1.796 ], [ 1.752, -1.816, -0.676 ], [ -1.936, 1.564, -1.652 ], [ 1.076, -1.828, 1.94 ], [ 0.608, 0.356, 0.724 ], [ -1.332, -0.984, 0.6 ], [ 0.592, 0.844, -0.452 ], [ 0.636, 0.572, 1.104 ], ... ],
    	...
    ]

Gradient Descent

First, we train using basic gradient descent method apply weak line search conditions.

TrainingTester.java:480 executed in 0.92 seconds (0.000 gc):

    IterativeTrainer iterativeTrainer = new IterativeTrainer(trainable.addRef());
    try {
      iterativeTrainer.setLineSearchFactory(label -> new ArmijoWolfeSearch());
      iterativeTrainer.setOrientation(new GradientDescent());
      iterativeTrainer.setMonitor(TrainingTester.getMonitor(history));
      iterativeTrainer.setTimeout(30, TimeUnit.SECONDS);
      iterativeTrainer.setMaxIterations(250);
      iterativeTrainer.setTerminateThreshold(0);
      return iterativeTrainer.run();
    } finally {
      iterativeTrainer.freeRef();
    }
Logging
Reset training subject: 511601635981
Final threshold in iteration 0: -697.4522216796875 (> 0.0) after 0.904s (< 30.000s)

Returns

    -697.4522216796875

This training apply resulted in the following configuration:

TrainingTester.java:610 executed in 0.00 seconds (0.000 gc):

    RefList<double[]> state = network.state();
    assert state != null;
    String description = state.stream().map(RefArrays::toString).reduce((a, b) -> a + "\n" + b)
        .orElse("");
    state.freeRef();
    return description;

Returns

    

And regressed input:

TrainingTester.java:622 executed in 0.01 seconds (0.000 gc):

    return RefArrays.stream(RefUtil.addRef(data)).flatMap(x -> {
      return RefArrays.stream(x);
    }).limit(1).map(x -> {
      String temp_18_0015 = x.prettyPrint();
      x.freeRef();
      return temp_18_0015;
    }).reduce((a, b) -> a + "\n" + b).orElse("");

Returns

    [
    	[ [ 0.356, -0.48, 1.548 ], [ 1.856, 1.516, 0.308 ], [ -0.216, -1.056, 0.104 ], [ 1.864, 1.996, -1.928 ], [ 0.092, -1.424, -0.66 ], [ 1.76, 0.58, 0.9 ], [ 1.6, 2.0, 0.324 ], [ -1.36, 1.7, -1.124 ], ... ],
    	[ [ -1.524, -0.488, -1.092 ], [ -0.352, -0.22, 0.9 ], [ 1.556, 0.32, 0.364 ], [ 0.712, 1.54, 0.796 ], [ 1.492, 1.48, 0.272 ], [ -0.444, 0.404, -1.284 ], [ 0.764, 1.04, -1.304 ], [ -1.684, -1.268, 1.536 ], ... ],
    	[ [ 0.904, 1.02, 0.324 ], [ -0.92, 1.248, -1.924 ], [ -0.212, 1.832, 1.684 ], [ -1.496, 0.028, -1.196 ], [ -0.248, -1.004, -1.232 ], [ 1.292, -0.464, -1.532 ], [ -1.56, 0.228, 1.496 ], [ 1.448, 0.104, -0.424 ], ... ],
    	[ [ -0.276, 1.292, -1.604 ], [ 1.596, 1.38, 1.128 ], [ 1.34, 0.8, 1.84 ], [ -0.548, 1.152, -1.148 ], [ -0.272, 0.464, -0.044 ], [ -0.912, 1.812, 1.26 ], [ -1.752, 1.428, 1.932 ], [ -0.348, 1.352, -1.732 ], ... ],
    	[ [ 1.66, -1.884, 1.58 ], [ 0.168, 0.028, 0.044 ], [ 0.26, 0.308, 1.928 ], [ -1.964, 1.048, -1.74 ], [ -0.144, -0.516, -0.124 ], [ -1.732, -1.48, -0.192 ], [ 1.02, 1.692, -0.156 ], [ -0.88, 1.0, 1.176 ], ... ],
    	[ [ 0.512, -0.288, -1.132 ], [ 0.528, -0.128, 0.372 ], [ 1.816, 0.36, 1.532 ], [ -0.472, -0.976, 1.06 ], [ 1.22, 0.308, 1.736 ], [ 1.8, -1.16, 1.32 ], [ 1.104, 0.584, 1.812 ], [ 0.608, -1.772, 1.612 ], ... ],
    	[ [ 0.916, 0.232, 0.144 ], [ 1.004, 0.492, 0.856 ], [ -1.436, -1.216, -1.74 ], [ 1.036, -1.488, -0.548 ], [ -1.132, -1.508, 0.044 ], [ 0.712, 0.64, 1.268 ], [ -1.788, -1.712, 0.32 ], [ -1.588, -1.68, -1.932 ], ... ],
    	[ [ 1.048, 0.876, 0.824 ], [ 0.228, 0.14, -0.136 ], [ 1.852, 0.2, -1.348 ], [ -0.524, -0.596, -1.18 ], [ 1.436, 0.288, -0.704 ], [ -1.868, -0.868, 0.756 ], [ 0.48, 1.432, 1.504 ], [ 0.268, -1.492, 0.288 ], ... ],
    	...
    ]

To produce the following output:

TrainingTester.java:633 executed in 0.11 seconds (0.030 gc):

    Result[] array = ConstantResult.batchResultArray(pop(RefUtil.addRef(data)));
    @Nullable
    Result eval = layer.eval(array);
    assert eval != null;
    TensorList tensorList = Result.getData(eval);
    String temp_18_0016 = tensorList.stream().limit(1).map(x -> {
      String temp_18_0017 = x.prettyPrint();
      x.freeRef();
      return temp_18_0017;
    }).reduce((a, b) -> a + "\n" + b).orElse("");
    tensorList.freeRef();
    return temp_18_0016;

Returns

    [
    	[ [ -697.4519653320312 ] ]
    ]

Conjugate Gradient Descent

First, we use a conjugate gradient descent method, which converges the fastest for purely linear functions.

TrainingTester.java:452 executed in 0.76 seconds (0.355 gc):

    IterativeTrainer iterativeTrainer = new IterativeTrainer(trainable.addRef());
    try {
      iterativeTrainer.setLineSearchFactory(label -> new QuadraticSearch());
      iterativeTrainer.setOrientation(new GradientDescent());
      iterativeTrainer.setMonitor(TrainingTester.getMonitor(history));
      iterativeTrainer.setTimeout(30, TimeUnit.SECONDS);
      iterativeTrainer.setMaxIterations(250);
      iterativeTrainer.setTerminateThreshold(0);
      return iterativeTrainer.run();
    } finally {
      iterativeTrainer.freeRef();
    }
Logging
Reset training subject: 512747274538
Final threshold in iteration 0: -697.4519287109375 (> 0.0) after 0.759s (< 30.000s)

Returns

    -697.4519287109375

This training apply resulted in the following configuration:

TrainingTester.java:610 executed in 0.00 seconds (0.000 gc):

    RefList<double[]> state = network.state();
    assert state != null;
    String description = state.stream().map(RefArrays::toString).reduce((a, b) -> a + "\n" + b)
        .orElse("");
    state.freeRef();
    return description;

Returns

    

And regressed input:

TrainingTester.java:622 executed in 0.01 seconds (0.000 gc):

    return RefArrays.stream(RefUtil.addRef(data)).flatMap(x -> {
      return RefArrays.stream(x);
    }).limit(1).map(x -> {
      String temp_18_0015 = x.prettyPrint();
      x.freeRef();
      return temp_18_0015;
    }).reduce((a, b) -> a + "\n" + b).orElse("");

Returns

    [
    	[ [ 0.356, -0.48, 1.548 ], [ 1.856, 1.516, 0.308 ], [ -0.216, -1.056, 0.104 ], [ 1.864, 1.996, -1.928 ], [ 0.092, -1.424, -0.66 ], [ 1.76, 0.58, 0.9 ], [ 1.6, 2.0, 0.324 ], [ -1.36, 1.7, -1.124 ], ... ],
    	[ [ -1.524, -0.488, -1.092 ], [ -0.352, -0.22, 0.9 ], [ 1.556, 0.32, 0.364 ], [ 0.712, 1.54, 0.796 ], [ 1.492, 1.48, 0.272 ], [ -0.444, 0.404, -1.284 ], [ 0.764, 1.04, -1.304 ], [ -1.684, -1.268, 1.536 ], ... ],
    	[ [ 0.904, 1.02, 0.324 ], [ -0.92, 1.248, -1.924 ], [ -0.212, 1.832, 1.684 ], [ -1.496, 0.028, -1.196 ], [ -0.248, -1.004, -1.232 ], [ 1.292, -0.464, -1.532 ], [ -1.56, 0.228, 1.496 ], [ 1.448, 0.104, -0.424 ], ... ],
    	[ [ -0.276, 1.292, -1.604 ], [ 1.596, 1.38, 1.128 ], [ 1.34, 0.8, 1.84 ], [ -0.548, 1.152, -1.148 ], [ -0.272, 0.464, -0.044 ], [ -0.912, 1.812, 1.26 ], [ -1.752, 1.428, 1.932 ], [ -0.348, 1.352, -1.732 ], ... ],
    	[ [ 1.66, -1.884, 1.58 ], [ 0.168, 0.028, 0.044 ], [ 0.26, 0.308, 1.928 ], [ -1.964, 1.048, -1.74 ], [ -0.144, -0.516, -0.124 ], [ -1.732, -1.48, -0.192 ], [ 1.02, 1.692, -0.156 ], [ -0.88, 1.0, 1.176 ], ... ],
    	[ [ 0.512, -0.288, -1.132 ], [ 0.528, -0.128, 0.372 ], [ 1.816, 0.36, 1.532 ], [ -0.472, -0.976, 1.06 ], [ 1.22, 0.308, 1.736 ], [ 1.8, -1.16, 1.32 ], [ 1.104, 0.584, 1.812 ], [ 0.608, -1.772, 1.612 ], ... ],
    	[ [ 0.916, 0.232, 0.144 ], [ 1.004, 0.492, 0.856 ], [ -1.436, -1.216, -1.74 ], [ 1.036, -1.488, -0.548 ], [ -1.132, -1.508, 0.044 ], [ 0.712, 0.64, 1.268 ], [ -1.788, -1.712, 0.32 ], [ -1.588, -1.68, -1.932 ], ... ],
    	[ [ 1.048, 0.876, 0.824 ], [ 0.228, 0.14, -0.136 ], [ 1.852, 0.2, -1.348 ], [ -0.524, -0.596, -1.18 ], [ 1.436, 0.288, -0.704 ], [ -1.868, -0.868, 0.756 ], [ 0.48, 1.432, 1.504 ], [ 0.268, -1.492, 0.288 ], ... ],
    	...
    ]

To produce the following output:

TrainingTester.java:633 executed in 0.08 seconds (0.000 gc):

    Result[] array = ConstantResult.batchResultArray(pop(RefUtil.addRef(data)));
    @Nullable
    Result eval = layer.eval(array);
    assert eval != null;
    TensorList tensorList = Result.getData(eval);
    String temp_18_0016 = tensorList.stream().limit(1).map(x -> {
      String temp_18_0017 = x.prettyPrint();
      x.freeRef();
      return temp_18_0017;
    }).reduce((a, b) -> a + "\n" + b).orElse("");
    tensorList.freeRef();
    return temp_18_0016;

Returns

    [
    	[ [ -697.4519653320312 ] ]
    ]

Limited-Memory BFGS

Next, we apply the same optimization using L-BFGS, which is nearly ideal for purely second-order or quadratic functions.

TrainingTester.java:509 executed in 34.15 seconds (3.078 gc):

    IterativeTrainer iterativeTrainer = new IterativeTrainer(trainable.addRef());
    try {
      iterativeTrainer.setLineSearchFactory(label -> new ArmijoWolfeSearch());
      iterativeTrainer.setOrientation(new LBFGS());
      iterativeTrainer.setMonitor(TrainingTester.getMonitor(history));
      iterativeTrainer.setTimeout(30, TimeUnit.SECONDS);
      iterativeTrainer.setIterationsPerSample(100);
      iterativeTrainer.setMaxIterations(250);
      iterativeTrainer.setTerminateThreshold(0);
      return iterativeTrainer.run();
    } finally {
      iterativeTrainer.freeRef();
    }
Logging
Reset training subject: 513714141024
Reset training subject: 514103585729
Adding measurement 29513cfe to history. Total: 0
LBFGS Accumulation History: 1 points
Constructing line search parameters: GD
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
th(0)=5.859375E-4;dx=-1.3595581054686197
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(2.154434690031884)=5.859375E-4; dx=5061448.237611033 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(1.077217345015942)=5.859375E-4; dx=2530724.386597046 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(0.3590724483386473)=5.859375E-4; dx=843575.29163355 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(0.08976811208466183)=5.859375E-4; dx=210892.91782378632 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(0.017953622416932366)=5.859375E-4; dx=42178.20453643008 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(0.002992270402822061)=5.859375E-4; dx=7029.559135434851 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(4.2746720040315154E-4)=5.859375E-4; dx=1003.6319732666566 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(5.343340005039394E-5)=5.859375E-4; dx=125.85697174075524 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(5.9370444500437714E-6)=5.859375E-4; dx=13.698577880856378 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(5.937044450043771E-7)=5.859375E-4; dx=-0.5561828613280286 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(5.397313136403428E-8)=5.859375E-4; dx=-1.3595581054686194 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(4.4977609470028565E-9)=5.859375E-4; dx=-1.3595581054686194 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(3.4598161130791205E-10)=5.859375E-4; dx=-1.3595581054686194 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(2.4712972236279432E-11)=5.859375E-4; dx=-1.3595581054686197 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(1.6475314824186289E-12)=5.859375E-4; dx=-1.3595581054686194 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(1.029707176511643E-13)=5.859375E-4; dx=-1.3595581054686197 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
WOLFE (weak): th(6.057101038303783E-15)=5.859375E-4; dx=-1.3595581054686194 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(5.451390934473404E-14)=5.859375E-4; dx=-1.3595581054686197 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
WOLFE (weak): th(3.028550519151891E-14)=5.859375E-4; dx=-1.3595581054686194 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(4.239970726812647E-14)=5.859375E-4; dx=-1.3595581054686197 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
WOLFE (weak): th(3.6342606229822695E-14)=5.859375E-4; dx=-1.3595581054686197 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
WOLFE (weak): th(3.9371156748974584E-14)=5.859375E-4; dx=-1.3595581054686197 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(4.0885432008550525E-14)=5.859375E-4; dx=-1.3595581054686197 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
Armijo: th(4.012829437876256E-14)=5.859375E-4; dx=-1.3595581054686194 evalInputDelta=0.0
Non-optimal measurement 5.859375E-4 < 5.859375E-4. Total: 1
mu >= nu (3.9371156748974584E-14): th(0.0)=5.859375E-4
Fitness changed from 5.859375E-4 to 5.859375E-4
Static Iteration Total: 34.1450; Orientation: 1.2683; Line Search: 31.7043
Iteration 1 failed. Error: 5.859375E-4
Previous Error: 0.0 -> 5.859375E-4
Optimization terminated 1
Final threshold in iteration 1: 5.859375E-4 (> 0.0) after 34.146s (< 30.000s)

Returns

    5.859375E-4

This training apply resulted in the following configuration:

TrainingTester.java:610 executed in 0.00 seconds (0.000 gc):

    RefList<double[]> state = network.state();
    assert state != null;
    String description = state.stream().map(RefArrays::toString).reduce((a, b) -> a + "\n" + b)
        .orElse("");
    state.freeRef();
    return description;

Returns

    

And regressed input:

TrainingTester.java:622 executed in 0.00 seconds (0.000 gc):

    return RefArrays.stream(RefUtil.addRef(data)).flatMap(x -> {
      return RefArrays.stream(x);
    }).limit(1).map(x -> {
      String temp_18_0015 = x.prettyPrint();
      x.freeRef();
      return temp_18_0015;
    }).reduce((a, b) -> a + "\n" + b).orElse("");

Returns

    [
    	[ [ 0.356, -0.48, 1.548 ], [ 1.856, 1.516, 0.308 ], [ -0.216, -1.056, 0.104 ], [ 1.864, 1.996, -1.928 ], [ 0.092, -1.424, -0.66 ], [ 1.76, 0.58, 0.9 ], [ 1.6, 2.0, 0.324 ], [ -1.36, 1.7, -1.124 ], ... ],
    	[ [ -1.524, -0.488, -1.092 ], [ -0.352, -0.22, 0.9 ], [ 1.556, 0.32, 0.364 ], [ 0.712, 1.54, 0.796 ], [ 1.492, 1.48, 0.272 ], [ -0.444, 0.404, -1.284 ], [ 0.764, 1.04, -1.304 ], [ -1.684, -1.268, 1.536 ], ... ],
    	[ [ 0.904, 1.02, 0.324 ], [ -0.92, 1.248, -1.924 ], [ -0.212, 1.832, 1.684 ], [ -1.496, 0.028, -1.196 ], [ -0.248, -1.004, -1.232 ], [ 1.292, -0.464, -1.532 ], [ -1.56, 0.228, 1.496 ], [ 1.448, 0.104, -0.424 ], ... ],
    	[ [ -0.276, 1.292, -1.604 ], [ 1.596, 1.38, 1.128 ], [ 1.34, 0.8, 1.84 ], [ -0.548, 1.152, -1.148 ], [ -0.272, 0.464, -0.044 ], [ -0.912, 1.812, 1.26 ], [ -1.752, 1.428, 1.932 ], [ -0.348, 1.352, -1.732 ], ... ],
    	[ [ 1.66, -1.884, 1.58 ], [ 0.168, 0.028, 0.044 ], [ 0.26, 0.308, 1.928 ], [ -1.964, 1.048, -1.74 ], [ -0.144, -0.516, -0.124 ], [ -1.732, -1.48, -0.192 ], [ 1.02, 1.692, -0.156 ], [ -0.88, 1.0, 1.176 ], ... ],
    	[ [ 0.512, -0.288, -1.132 ], [ 0.528, -0.128, 0.372 ], [ 1.816, 0.36, 1.532 ], [ -0.472, -0.976, 1.06 ], [ 1.22, 0.308, 1.736 ], [ 1.8, -1.16, 1.32 ], [ 1.104, 0.584, 1.812 ], [ 0.608, -1.772, 1.612 ], ... ],
    	[ [ 0.916, 0.232, 0.144 ], [ 1.004, 0.492, 0.856 ], [ -1.436, -1.216, -1.74 ], [ 1.036, -1.488, -0.548 ], [ -1.132, -1.508, 0.044 ], [ 0.712, 0.64, 1.268 ], [ -1.788, -1.712, 0.32 ], [ -1.588, -1.68, -1.932 ], ... ],
    	[ [ 1.048, 0.876, 0.824 ], [ 0.228, 0.14, -0.136 ], [ 1.852, 0.2, -1.348 ], [ -0.524, -0.596, -1.18 ], [ 1.436, 0.288, -0.704 ], [ -1.868, -0.868, 0.756 ], [ 0.48, 1.432, 1.504 ], [ 0.268, -1.492, 0.288 ], ... ],
    	...
    ]

To produce the following output:

TrainingTester.java:633 executed in 0.07 seconds (0.000 gc):

    Result[] array = ConstantResult.batchResultArray(pop(RefUtil.addRef(data)));
    @Nullable
    Result eval = layer.eval(array);
    assert eval != null;
    TensorList tensorList = Result.getData(eval);
    String temp_18_0016 = tensorList.stream().limit(1).map(x -> {
      String temp_18_0017 = x.prettyPrint();
      x.freeRef();
      return temp_18_0017;
    }).reduce((a, b) -> a + "\n" + b).orElse("");
    tensorList.freeRef();
    return temp_18_0016;

Returns

    [
    	[ [ -697.4519653320312 ] ]
    ]

TrainingTester.java:432 executed in 0.01 seconds (0.000 gc):

    return TestUtil.compare(title + " vs Iteration", runs);
Logging
No Data

TrainingTester.java:435 executed in 0.00 seconds (0.000 gc):

    return TestUtil.compareTime(title + " vs Time", runs);
Logging
No Data

Results

TrainingTester.java:255 executed in 0.04 seconds (0.000 gc):

    return grid(inputLearning, modelLearning, completeLearning);

Returns

Result

TrainingTester.java:258 executed in 0.00 seconds (0.000 gc):

    return new ComponentResult(null == inputLearning ? null : inputLearning.value,
        null == modelLearning ? null : modelLearning.value, null == completeLearning ? null : completeLearning.value);

Returns

    {"input":{ "LBFGS": { "type": "NonConverged", "value": NaN }, "CjGD": { "type": "NonConverged", "value": NaN }, "GD": { "type": "NonConverged", "value": NaN } }, "model":null, "complete":null}

LayerTests.java:425 executed in 0.00 seconds (0.000 gc):

    throwException(exceptions.addRef());

Results

detailsresult
{"input":{ "LBFGS": { "type": "NonConverged", "value": NaN }, "CjGD": { "type": "NonConverged", "value": NaN }, "GD": { "type": "NonConverged", "value": NaN } }, "model":null, "complete":null}OK
  {
    "result": "OK",
    "performance": {
      "execution_time": "40.342",
      "gc_time": "3.804"
    },
    "created_on": 1586735139712,
    "file_name": "trainingTest",
    "report": {
      "simpleName": "Float",
      "canonicalName": "com.simiacryptus.mindseye.layers.cudnn.SumReducerLayerTest.Float",
      "link": "https://github.com/SimiaCryptus/mindseye-cudnn/tree/59d5b3318556370acb2d83ee6ec123ce0fc6974f/src/test/java/com/simiacryptus/mindseye/layers/cudnn/SumReducerLayerTest.java",
      "javaDoc": ""
    },
    "training_analysis": {
      "input": {
        "LBFGS": {
          "type": "NonConverged",
          "value": "NaN"
        },
        "CjGD": {
          "type": "NonConverged",
          "value": "NaN"
        },
        "GD": {
          "type": "NonConverged",
          "value": "NaN"
        }
      }
    },
    "archive": "s3://code.simiacrypt.us/tests/com/simiacryptus/mindseye/layers/cudnn/SumReducerLayer/Float/trainingTest/202004124539",
    "id": "38fb0cf7-14d2-4c6b-9f96-38eee63f7e21",
    "report_type": "Components",
    "display_name": "Comparative Training",
    "target": {
      "simpleName": "SumReducerLayer",
      "canonicalName": "com.simiacryptus.mindseye.layers.cudnn.SumReducerLayer",
      "link": "https://github.com/SimiaCryptus/mindseye-cudnn/tree/59d5b3318556370acb2d83ee6ec123ce0fc6974f/src/main/java/com/simiacryptus/mindseye/layers/cudnn/SumReducerLayer.java",
      "javaDoc": ""
    }
  }