optimizer = new Adam(0.001, 0.1, 0.001); } /** * @test */ public function build() : void { $this->assertInstanceOf(Adam::class, $this->optimizer); $this->assertInstanceOf(Adaptive::class, $this->optimizer); $this->assertInstanceOf(Optimizer::class, $this->optimizer); } /** * @test * @dataProvider stepProvider * * @param \Rubix\ML\NeuralNet\Parameter $param * @param \Tensor\Tensor $gradient * @param array[] $expected */ public function step(Parameter $param, Tensor $gradient, array $expected) : void { $this->optimizer->warm($param); $step = $this->optimizer->step($param, $gradient); $this->assertEquals($expected, $step->asArray()); } /** * @return \Generator */ public function stepProvider() : Generator { yield [ new Parameter(Matrix::quick([ [0.1, 0.6, -0.4], [0.5, 0.6, -0.4], [0.1, 0.1, -0.7], ])), Matrix::quick([ [0.01, 0.05, -0.02], [-0.01, 0.02, 0.03], [0.04, -0.01, -0.5], ]), [ [0.0010000000000000007, 0.0010000000000000009, -0.0010000000000000007], [-0.0010000000000000007, 0.0010000000000000007, 0.0010000000000000007], [0.0010000000000000007, -0.0010000000000000007, -0.0010000000000000007], ], ]; } }