From 451dd2a11f9f1815c7bacb11683f5d1ac2e21f9c Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Sun, 22 Jun 2025 19:59:17 +0300 Subject: [PATCH 01/22] SAM-7 added HyperbolicTangent --- .../HyperbolicTangent/HyperbolicTangent.php | 29 +++-- .../HyperbolicTangentTest.php | 119 ++++++++++++++++++ 2 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php diff --git a/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php b/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php index 830d0becd..bb9a8c8a5 100644 --- a/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php +++ b/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php @@ -6,6 +6,8 @@ use NumPower; use NDArray; +use Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts\ActivationFunction; +use Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts\IBufferDerivative; /** * Hyperbolic Tangent @@ -16,11 +18,17 @@ * @category Machine Learning * @package Rubix/ML * @author Andrew DalPino + * @author Samuel Akopyan */ -class HyperbolicTangent implements ActivationFunction +class HyperbolicTangent implements ActivationFunction, IBufferDerivative { /** - * @inheritdoc + * Apply the Hyperbolic Tangent activation function to the input. + * + * f(x) = tanh(x) + * + * @param NDArray $input The input values + * @return NDArray The activated values */ public function activate(NDArray $input) : NDArray { @@ -28,19 +36,26 @@ public function activate(NDArray $input) : NDArray } /** - * @inheritdoc + * Calculate the derivative of the activation function. + * + * f'(x) = 1 - tanh^2(x) + * + * @param NDArray $output Output matrix + * @return NDArray Derivative matrix */ public function differentiate(NDArray $output) : NDArray { - return 1 - ($output ** 2); + // Calculate tanh^2(x) + $squared = NumPower::pow($output, 2); + + // Calculate 1 - tanh^2(x) + return NumPower::subtract(1.0, $squared); } /** * Return the string representation of the activation function. * - * @internal - * - * @return string + * @return string String representation */ public function __toString() : string { diff --git a/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php b/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php new file mode 100644 index 000000000..445b03110 --- /dev/null +++ b/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php @@ -0,0 +1,119 @@ + + */ + public static function computeProvider() : Generator + { + yield [ + NumPower::array([ + [9.0, 2.5, 2.0, 1.0, -0.5, 0.0, 20.0, -10.0], + ]), + [ + [0.9999999403953552, 0.9866142868995667, 0.9640275835990906, 0.7615941762924194, -0.46211716532707214, 0.0, 1.0, -1.0], + ], + ]; + + yield [ + NumPower::array([ + [-0.12, 0.31, -0.49], + [0.99, 0.08, -0.03], + [0.05, -0.52, 0.54], + ]), + [ + [-0.11942730098962784, 0.3004370927810669, -0.45421645045280457], + [0.7573622465133667, 0.07982976734638214, -0.02999100275337696], + [0.049958378076553345, -0.47769999504089355, 0.4929879903793335], + ], + ]; + } + + /** + * @return Generator + */ + public static function differentiateProvider() : Generator + { + yield [ + NumPower::array([ + [0.9640275835990906, 0.7615941762924194, -0.46211716532707214, 0.0, 1.0, -1.0], + ]), + [ + [0.07065081596374512, 0.41997432708740234, 0.7864477038383484, 1.0, 0.0, 0.0], + ], + ]; + + yield [ + NumPower::array([ + [-0.11942730098962784, 0.3004370927810669, -0.45421645045280457], + [0.7573623085022249, 0.07978830223560329, -0.029991223630861304], + [0.049958395721942955, -0.4778087574005698, 0.4930591567725708], + ]), + [ + [0.985737144947052, 0.9097375273704529, 0.7936874032020569], + [0.42640233039855957, 0.9936338067054749, 0.9991005063056946], + [0.9975041747093201, 0.7716988325119019, 0.7568926811218262], + ], + ]; + } + + /** + * Set up the test case. + */ + protected function setUp() : void + { + parent::setUp(); + + $this->activationFn = new HyperbolicTangent(); + } + + #[Test] + #[TestDox('Can be cast to a string')] + public function testToString() : void + { + static::assertEquals('Hyperbolic Tangent', (string) $this->activationFn); + } + + #[Test] + #[TestDox('Correctly activates the input')] + #[DataProvider('computeProvider')] + public function testActivate(NDArray $input, array $expected) : void + { + $activations = $this->activationFn->activate($input)->toArray(); + + static::assertEqualsWithDelta($expected, $activations, 1e-16); + } + + #[Test] + #[TestDox('Correctly differentiates the output')] + #[DataProvider('differentiateProvider')] + public function testDifferentiate(NDArray $output, array $expected) : void + { + $derivatives = $this->activationFn->differentiate($output)->toArray(); + + static::assertEqualsWithDelta($expected, $derivatives, 1e-16); + } +} From 868830bb87565666f4bf17a478027b20969adab9 Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Sun, 22 Jun 2025 20:10:34 +0300 Subject: [PATCH 02/22] SAM-7 fix for function docblock --- src/Datasets/Labeled.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Datasets/Labeled.php b/src/Datasets/Labeled.php index 99bc4f690..7392bc708 100644 --- a/src/Datasets/Labeled.php +++ b/src/Datasets/Labeled.php @@ -178,7 +178,7 @@ public function __construct(array $samples = [], array $labels = [], bool $verif /** * Return the labels. * - * @return mixed[] + * @return list */ public function labels() : array { From 43fb507c67dafd0e057e8095ace9bf1722e23f3b Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Sun, 22 Jun 2025 22:46:57 +0300 Subject: [PATCH 03/22] Fix for merge issues --- .github/workflows/ci.yml | 6 ------ docs/transformers/regex-filter.md | 15 --------------- 2 files changed, 21 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 092650111..295cff531 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,14 +8,8 @@ jobs: runs-on: ${{ matrix.operating-system }} strategy: matrix: -<<<<<<< HEAD operating-system: [windows-latest, ubuntu-latest, macos-latest] php-versions: ['8.4'] -======= - operating-system: [ubuntu-latest, macos-latest] - php-versions: ['8.0', '8.1', '8.2'] ->>>>>>> master - steps: - name: Checkout uses: actions/checkout@v3 diff --git a/docs/transformers/regex-filter.md b/docs/transformers/regex-filter.md index 94540a0e2..8283b22a2 100644 --- a/docs/transformers/regex-filter.md +++ b/docs/transformers/regex-filter.md @@ -28,7 +28,6 @@ $transformer = new RegexFilter([ ``` ## Predefined Regex Patterns -<<<<<<< HEAD | Class Constant | Description | |---|----------------------------------------------------------------------------------------------------------| | EMAIL | A pattern to match any email address. | @@ -41,20 +40,6 @@ $transformer = new RegexFilter([ | EXTRA_WHITESPACE | Matches consecutively repeated whitespace characters. | | MENTION | A pattern that matches Twitter-style mentions (@example). | | HASHTAG | Matches Twitter-style hashtags (#example). | -======= -| Class Constant | Description | -|---|---| -| EMAIL | A pattern to match any email address. | -| URL | An alias for the default (Gruber 1) URL matching pattern. | -| GRUBER_1 | The original Gruber URL matching pattern. | -| GRUBER_2 | The improved Gruber URL matching pattern. | -| EXTRA_CHARACTERS | Matches consecutively repeated non word or number characters such as punctuation and special characters. | -| EXTRA_WORDS | Matches consecutively repeated words. | -| EXTRA_WHITESPACE | Matches consecutively repeated whitespace characters. | -| EMOJIS | A pattern to match unicode emojis. | -| MENTION | A pattern that matches Twitter-style mentions (@example). | -| HASHTAG | Matches Twitter-style hashtags (#example). | ->>>>>>> 2.4 ## Additional Methods This transformer does not have any additional methods. From e16b4a4e891fc8786ae8bc1158e8db30cb9fbdbd Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Sun, 22 Jun 2025 23:50:09 +0300 Subject: [PATCH 04/22] SAM-8 implemented LeakyReLU --- .../Exceptions/InvalidLeakageException.php | 14 ++ .../LeakyReLU/LeakyReLU.php | 87 ++++---- .../HyperbolicTangentTest.php | 8 +- .../LeakyReLU/LeakyReLUTest.php | 186 ++++++++++++++++++ 4 files changed, 251 insertions(+), 44 deletions(-) create mode 100644 src/NeuralNet/ActivationFunctions/LeakyReLU/Exceptions/InvalidLeakageException.php create mode 100644 tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php diff --git a/src/NeuralNet/ActivationFunctions/LeakyReLU/Exceptions/InvalidLeakageException.php b/src/NeuralNet/ActivationFunctions/LeakyReLU/Exceptions/InvalidLeakageException.php new file mode 100644 index 000000000..5cc6b0fa9 --- /dev/null +++ b/src/NeuralNet/ActivationFunctions/LeakyReLU/Exceptions/InvalidLeakageException.php @@ -0,0 +1,14 @@ + */ -class LeakyReLU implements ActivationFunction +class LeakyReLU implements ActivationFunction, IBufferDerivative { /** * The amount of leakage as a ratio of the input value to allow to pass through when inactivated. @@ -30,73 +36,74 @@ class LeakyReLU implements ActivationFunction protected float $leakage; /** - * @param float $leakage - * @throws InvalidArgumentException + * Class constructor. + * + * @param float $leakage The amount of leakage as a ratio of the input value to allow to pass through when inactivated. + * @throws InvalidLeakageException */ public function __construct(float $leakage = 0.1) { - if ($leakage <= 0.0 or $leakage >= 1.0) { - throw new InvalidArgumentException('Leakage must be between' - . " 0 and 1, $leakage given."); + if ($leakage <= 0.0 || $leakage >= 1.0) { + throw new InvalidLeakageException( + message: "Leakage must be between 0 and 1, $leakage given." + ); } $this->leakage = $leakage; } /** - * Compute the activation. + * Apply the Leaky ReLU activation function to the input. * - * @internal + * f(x) = x if x > 0 + * f(x) = leakage * x if x ≤ 0 * - * @param Matrix $input - * @return Matrix + * @param NDArray $input The input values + * @return NDArray The activated values */ public function activate(NDArray $input) : NDArray { + // Calculate positive part: x for x > 0 $positive = NumPower::maximum($input, 0); - $negative = NumPower::minimum($input, 0); - $negativeLeakage = $negative * $this->leakage; + // Calculate negative part: leakage * x for x <= 0 + $negative = NumPower::multiply( + NumPower::minimum($input, 0), + $this->leakage + ); - return $positive + $negativeLeakage; + // Combine both parts + return NumPower::add($positive, $negative); } /** - * Calculate the derivative of the activation. + * Calculate the derivative of the activation function. * - * @internal + * f'(x) = 1 if x > 0 + * f'(x) = leakage if x ≤ 0 * - * @param Matrix $input - * @param Matrix $output - * @return Matrix + * @param NDArray $x Input matrix + * @return NDArray Derivative matrix */ - public function differentiate(Matrix $input, Matrix $output) : Matrix + public function differentiate(NDArray $x) : NDArray { - $positive = NumPower::greater($input, 0); - $negative = NumPower::lessEqual($input, 0) * $this->leakage; + // For x > 0: 1 + $positive = NumPower::greater($x, 0); - return $positive + $negative; - } + // For x <= 0: leakage + $negative = NumPower::multiply( + NumPower::lessEqual($x, 0), + $this->leakage + ); - /** - * @internal - * - * @param float $input - * @return float - */ - public function _differentiate(float $input) : float - { - return $input > 0.0 - ? 1.0 - : $this->leakage; + // Combine both parts + return NumPower::add($positive, $negative); } /** - * Return the string representation of the object. - * - * @internal + * Return the string representation of the activation function. * - * @return string + * @return string String representation */ public function __toString() : string { diff --git a/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php b/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php index 445b03110..79dc6b11c 100644 --- a/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php +++ b/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php @@ -4,16 +4,16 @@ namespace Rubix\ML\Tests\NeuralNet\ActivationFunctions\HyperbolicTangent; +use Generator; +use NumPower; +use NDArray; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\Attributes\TestDox; -use NumPower; -use NDArray; -use Rubix\ML\NeuralNet\ActivationFunctions\HyperbolicTangent\HyperbolicTangent; use PHPUnit\Framework\TestCase; -use Generator; +use Rubix\ML\NeuralNet\ActivationFunctions\HyperbolicTangent\HyperbolicTangent; #[Group('ActivationFunctions')] #[CoversClass(HyperbolicTangent::class)] diff --git a/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php b/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php new file mode 100644 index 000000000..38ab6952d --- /dev/null +++ b/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php @@ -0,0 +1,186 @@ + + */ + public static function computeProvider() : Generator + { + yield [ + NumPower::array([ + [2.0, 1.0, -0.5, 0.0, 20.0, -10.0], + ]), + [ + [2.0, 1.0, -0.05000000074505806, 0.0, 20.0, -1.0], + ], + ]; + + yield [ + NumPower::array([ + [-0.12, 0.31, -0.49], + [0.99, 0.08, -0.03], + [0.05, -0.52, 0.54], + ]), + [ + [-0.012000000104308128, 0.3100000023841858, -0.049000002443790436], + [0.9900000095367432, 0.07999999821186066, -0.003000000026077032], + [0.05000000074505806, -0.05199999734759331, 0.5400000214576721], + ], + ]; + } + + /** + * @return Generator + */ + public static function differentiateProvider() : Generator + { + yield [ + NumPower::array([ + [2.0, 1.0, -0.5, 0.0, 20.0, -10.0], + ]), + [ + [1.0, 1.0, 0.10000000149011612, 0.10000000149011612, 1.0, 0.10000000149011612], + ], + ]; + + yield [ + NumPower::array([ + [-0.12, 0.31, -0.49], + [0.99, 0.08, -0.03], + [0.05, -0.52, 0.54], + ]), + [ + [0.10000000149011612, 1.0, 0.10000000149011612], + [1.0, 1.0, 0.10000000149011612], + [1.0, 0.10000000149011612, 1.0], + ], + ]; + } + + /** + * @return Generator + */ + public static function boundaryProvider() : Generator + { + // Test very large positive values (should be equal to input) + yield [ + NumPower::array([ + [100.0, 500.0, 1000.0], + ]), + [ + [100.0, 500.0, 1000.0], + ], + ]; + + // Test very large negative values (should be input * leakage) + yield [ + NumPower::array([ + [-100.0, -500.0, -1000.0], + ]), + [ + [-10.0, -50.0, -100.0], + ], + ]; + + // Test values close to zero + yield [ + NumPower::array([ + [0.001, -0.001, 0.0001, -0.0001], + ]), + [ + + [0.0010000000474974513, -0.00010000000474974513, 0.00009999999747378752, -0.000009999999747378752], + ], + ]; + } + + /** + * Set up the test case. + */ + protected function setUp() : void + { + parent::setUp(); + + $this->activationFn = new LeakyReLU(0.1); + } + + #[Test] + #[TestDox('Can be constructed with valid leakage parameter')] + public function testConstructorWithValidLeakage() : void + { + $activationFn = new LeakyReLU(0.2); + + static::assertInstanceOf(LeakyReLU::class, $activationFn); + static::assertEquals('Leaky ReLU (leakage: 0.2)', (string) $activationFn); + } + + #[Test] + #[TestDox('Throws exception when constructed with invalid leakage parameter')] + public function testConstructorWithInvalidLeakage() : void + { + $this->expectException(InvalidLeakageException::class); + + new LeakyReLU(1.5); + } + + #[Test] + #[TestDox('Can be cast to a string')] + public function testToString() : void + { + static::assertEquals('Leaky ReLU (leakage: 0.1)', (string) $this->activationFn); + } + + #[Test] + #[TestDox('Correctly activates the input')] + #[DataProvider('computeProvider')] + public function testActivate(NDArray $input, array $expected) : void + { + $activations = $this->activationFn->activate($input)->toArray(); + + static::assertEqualsWithDelta($expected, $activations, 1e-16); + } + + #[Test] + #[TestDox('Correctly differentiates the input')] + #[DataProvider('differentiateProvider')] + public function testDifferentiate(NDArray $input, array $expected) : void + { + $derivatives = $this->activationFn->differentiate($input)->toArray(); + + static::assertEqualsWithDelta($expected, $derivatives, 1e-16); + } + + #[Test] + #[TestDox('Correctly handles boundary values during activation')] + #[DataProvider('boundaryProvider')] + public function testBoundaryActivate(NDArray $input, array $expected) : void + { + $activations = $this->activationFn->activate($input)->toArray(); + + static::assertEqualsWithDelta($expected, $activations, 1e-16); + } +} From c3f6530c1719a039bade251d933eeb9ee3bcb1cf Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Mon, 23 Jun 2025 00:04:29 +0300 Subject: [PATCH 05/22] SAM-8 style fixes for import classes --- tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php | 8 ++++---- tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php | 8 ++++---- .../ActivationFunctions/HardSiLU/HardSiLUTest.php | 8 ++++---- .../ActivationFunctions/HardSigmoid/HardSigmoidTest.php | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php b/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php index 657bab1be..14e2dff9a 100644 --- a/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php +++ b/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php @@ -4,16 +4,16 @@ namespace Rubix\ML\Tests\NeuralNet\ActivationFunctions\ELU; +use Generator; +use NDArray; +use NumPower; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\Attributes\TestDox; -use NumPower; -use NDArray; -use Rubix\ML\NeuralNet\ActivationFunctions\ELU\ELU; use PHPUnit\Framework\TestCase; -use Generator; +use Rubix\ML\NeuralNet\ActivationFunctions\ELU\ELU; use Rubix\ML\NeuralNet\ActivationFunctions\ELU\Exceptions\InvalidAlphaException; #[Group('ActivationFunctions')] diff --git a/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php b/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php index 6d3177015..b9cc02293 100644 --- a/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php +++ b/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php @@ -4,16 +4,16 @@ namespace Rubix\ML\Tests\NeuralNet\ActivationFunctions\GELU; +use Generator; +use NDArray; +use NumPower; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\Attributes\TestDox; -use NumPower; -use NDArray; -use Rubix\ML\NeuralNet\ActivationFunctions\GELU\GELU; use PHPUnit\Framework\TestCase; -use Generator; +use Rubix\ML\NeuralNet\ActivationFunctions\GELU\GELU; #[Group('ActivationFunctions')] #[CoversClass(GELU::class)] diff --git a/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php b/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php index 22ef0bdea..812f1bf1d 100644 --- a/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php +++ b/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php @@ -4,16 +4,16 @@ namespace Rubix\ML\Tests\NeuralNet\ActivationFunctions\HardSiLU; +use Generator; +use NDArray; +use NumPower; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\Attributes\TestDox; -use NumPower; -use NDArray; -use Rubix\ML\NeuralNet\ActivationFunctions\HardSiLU\HardSiLU; use PHPUnit\Framework\TestCase; -use Generator; +use Rubix\ML\NeuralNet\ActivationFunctions\HardSiLU\HardSiLU; #[Group('ActivationFunctions')] #[CoversClass(HardSiLU::class)] diff --git a/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php b/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php index 5320e796b..12b6cdcd3 100644 --- a/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php +++ b/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php @@ -4,16 +4,16 @@ namespace Rubix\ML\Tests\NeuralNet\ActivationFunctions\HardSigmoid; +use Generator; +use NDArray; +use NumPower; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\Attributes\TestDox; -use NumPower; -use NDArray; -use Rubix\ML\NeuralNet\ActivationFunctions\HardSigmoid\HardSigmoid; use PHPUnit\Framework\TestCase; -use Generator; +use Rubix\ML\NeuralNet\ActivationFunctions\HardSigmoid\HardSigmoid; #[Group('ActivationFunctions')] #[CoversClass(HardSigmoid::class)] From 287ec5f31bf2714a586257ac4e422a4a74e1c1f5 Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Mon, 23 Jun 2025 00:04:53 +0300 Subject: [PATCH 06/22] SAM-8 changed LeakyReLUTest initial values --- .../LeakyReLU/LeakyReLUTest.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php b/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php index 38ab6952d..2e00f5f5a 100644 --- a/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php +++ b/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php @@ -35,7 +35,7 @@ public static function computeProvider() : Generator [2.0, 1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [2.0, 1.0, -0.05000000074505806, 0.0, 20.0, -1.0], + [2.0, 1.0, -0.004999999888241291, 0.0, 20.0, -0.09999999403953552], ], ]; @@ -46,9 +46,9 @@ public static function computeProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [-0.012000000104308128, 0.3100000023841858, -0.049000002443790436], - [0.9900000095367432, 0.07999999821186066, -0.003000000026077032], - [0.05000000074505806, -0.05199999734759331, 0.5400000214576721], + [-0.0011999999405816197, 0.3100000023841858, -0.004900000058114529], + [0.9900000095367432, 0.07999999821186066, -0.00029999998514540493], + [0.05000000074505806, -0.005199999548494816, 0.5400000214576721], ], ]; } @@ -63,7 +63,7 @@ public static function differentiateProvider() : Generator [2.0, 1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [1.0, 1.0, 0.10000000149011612, 0.10000000149011612, 1.0, 0.10000000149011612], + [1.0, 1.0, 0.009999999776482582, 0.009999999776482582, 1.0, 0.009999999776482582], ], ]; @@ -74,9 +74,9 @@ public static function differentiateProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [0.10000000149011612, 1.0, 0.10000000149011612], - [1.0, 1.0, 0.10000000149011612], - [1.0, 0.10000000149011612, 1.0], + [0.009999999776482582, 1.0, 0.009999999776482582], + [1.0, 1.0, 0.009999999776482582], + [1.0, 0.009999999776482582, 1.0], ], ]; } @@ -102,7 +102,7 @@ public static function boundaryProvider() : Generator [-100.0, -500.0, -1000.0], ]), [ - [-10.0, -50.0, -100.0], + [-1.0, -5.0, -10.0], ], ]; @@ -113,7 +113,7 @@ public static function boundaryProvider() : Generator ]), [ - [0.0010000000474974513, -0.00010000000474974513, 0.00009999999747378752, -0.000009999999747378752], + [0.0010000000474974513, -0.000010000000656873453, 0.00009999999747378752, -0.0000009999999974752427], ], ]; } @@ -125,7 +125,7 @@ protected function setUp() : void { parent::setUp(); - $this->activationFn = new LeakyReLU(0.1); + $this->activationFn = new LeakyReLU(0.01); } #[Test] @@ -151,7 +151,7 @@ public function testConstructorWithInvalidLeakage() : void #[TestDox('Can be cast to a string')] public function testToString() : void { - static::assertEquals('Leaky ReLU (leakage: 0.1)', (string) $this->activationFn); + static::assertEquals('Leaky ReLU (leakage: 0.01)', (string) $this->activationFn); } #[Test] From eef5c57735a06d963901f5cb7b8b15a1912c7de6 Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Mon, 23 Jun 2025 00:20:55 +0300 Subject: [PATCH 07/22] SAM-8 typo fixes --- .../LeakyReLU/Exceptions/InvalidLeakageException.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NeuralNet/ActivationFunctions/LeakyReLU/Exceptions/InvalidLeakageException.php b/src/NeuralNet/ActivationFunctions/LeakyReLU/Exceptions/InvalidLeakageException.php index 5cc6b0fa9..c8f081b85 100644 --- a/src/NeuralNet/ActivationFunctions/LeakyReLU/Exceptions/InvalidLeakageException.php +++ b/src/NeuralNet/ActivationFunctions/LeakyReLU/Exceptions/InvalidLeakageException.php @@ -7,7 +7,7 @@ use Rubix\ML\Exceptions\InvalidArgumentException; /** - * Invalid `alpha` parameter for ELU Activation function + * Invalid `Leakage` parameter for LeakyReLU Activation function */ class InvalidLeakageException extends InvalidArgumentException { From cd980eaebb16a769b1d6b14fa41de86681a0285d Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Mon, 23 Jun 2025 00:36:26 +0300 Subject: [PATCH 08/22] SAM-8 typo fixes --- .../ActivationFunctions/LeakyReLU/LeakyReLU.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php b/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php index 29fab906d..c68237a9a 100644 --- a/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php +++ b/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php @@ -64,16 +64,16 @@ public function __construct(float $leakage = 0.1) public function activate(NDArray $input) : NDArray { // Calculate positive part: x for x > 0 - $positive = NumPower::maximum($input, 0); + $positiveActivation = NumPower::maximum($input, 0); // Calculate negative part: leakage * x for x <= 0 - $negative = NumPower::multiply( + $negativeActivation = NumPower::multiply( NumPower::minimum($input, 0), $this->leakage ); // Combine both parts - return NumPower::add($positive, $negative); + return NumPower::add($positiveActivation, $negativeActivation); } /** @@ -88,16 +88,16 @@ public function activate(NDArray $input) : NDArray public function differentiate(NDArray $x) : NDArray { // For x > 0: 1 - $positive = NumPower::greater($x, 0); + $positivePart = NumPower::greater($x, 0); // For x <= 0: leakage - $negative = NumPower::multiply( + $negativePart = NumPower::multiply( NumPower::lessEqual($x, 0), $this->leakage ); // Combine both parts - return NumPower::add($positive, $negative); + return NumPower::add($positivePart, $negativePart); } /** From 0025293a89263b7011935c08e1ad7b91f69dea31 Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Mon, 23 Jun 2025 19:20:57 +0300 Subject: [PATCH 09/22] SAM-8 turned back function signature in docblock --- src/Datasets/Labeled.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Datasets/Labeled.php b/src/Datasets/Labeled.php index 7392bc708..99bc4f690 100644 --- a/src/Datasets/Labeled.php +++ b/src/Datasets/Labeled.php @@ -178,7 +178,7 @@ public function __construct(array $samples = [], array $labels = [], bool $verif /** * Return the labels. * - * @return list + * @return mixed[] */ public function labels() : array { From 45361aa78bce5adcc9ef57c1cac74518dc3338bc Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Mon, 23 Jun 2025 19:29:02 +0300 Subject: [PATCH 10/22] SAM-8 fixed parameter name like in interface --- .../HyperbolicTangent/HyperbolicTangent.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php b/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php index bb9a8c8a5..305c621b0 100644 --- a/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php +++ b/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php @@ -40,13 +40,13 @@ public function activate(NDArray $input) : NDArray * * f'(x) = 1 - tanh^2(x) * - * @param NDArray $output Output matrix + * @param NDArray $x Output matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $output) : NDArray + public function differentiate(NDArray $x) : NDArray { // Calculate tanh^2(x) - $squared = NumPower::pow($output, 2); + $squared = NumPower::pow($x, 2); // Calculate 1 - tanh^2(x) return NumPower::subtract(1.0, $squared); From eb864c297906761750d35a80b41097600920f67f Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Mon, 23 Jun 2025 19:48:08 +0300 Subject: [PATCH 11/22] Renamed parameter name like in interface --- .../Base/Contracts/IBufferDerivative.php | 5 +++-- src/NeuralNet/ActivationFunctions/ELU/ELU.php | 10 +++++----- src/NeuralNet/ActivationFunctions/GELU/GELU.php | 12 ++++++------ .../ActivationFunctions/HardSiLU/HardSiLU.php | 8 ++++---- .../ActivationFunctions/HardSigmoid/HardSigmoid.php | 8 ++++---- .../HyperbolicTangent/HyperbolicTangent.php | 6 +++--- 6 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/Base/Contracts/IBufferDerivative.php b/src/NeuralNet/ActivationFunctions/Base/Contracts/IBufferDerivative.php index 239cfc0f6..9e9b071f5 100644 --- a/src/NeuralNet/ActivationFunctions/Base/Contracts/IBufferDerivative.php +++ b/src/NeuralNet/ActivationFunctions/Base/Contracts/IBufferDerivative.php @@ -13,14 +13,15 @@ * @package Rubix/ML * @author Andrew DalPino * @author Aleksei Nechaev + * @author Samuel Akopyan */ interface IBufferDerivative extends Derivative { /** * Calculate the derivative of the single parameter. * - * @param NDArray $x Input matrix + * @param NDArray $output Output matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $x) : NDArray; + public function differentiate(NDArray $output) : NDArray; } diff --git a/src/NeuralNet/ActivationFunctions/ELU/ELU.php b/src/NeuralNet/ActivationFunctions/ELU/ELU.php index ff165dbc7..5f52d2293 100644 --- a/src/NeuralNet/ActivationFunctions/ELU/ELU.php +++ b/src/NeuralNet/ActivationFunctions/ELU/ELU.php @@ -76,18 +76,18 @@ public function activate(NDArray $input) : NDArray * f'(x) = 1 if x > 0 * f'(x) = α * e^x if x ≤ 0 * - * @param NDArray $x Output matrix + * @param NDArray $output Output matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $x) : NDArray + public function differentiate(NDArray $output) : NDArray { // For x > 0: 1 - $positivePart = NumPower::greater($x, 0); + $positivePart = NumPower::greater($output, 0); // For x <= 0: α * e^x - $negativeMask = NumPower::lessEqual($x, 0); + $negativeMask = NumPower::lessEqual($output, 0); $negativePart = NumPower::multiply( - NumPower::multiply($negativeMask, NumPower::exp($x)), + NumPower::multiply($negativeMask, NumPower::exp($output)), $this->alpha ); diff --git a/src/NeuralNet/ActivationFunctions/GELU/GELU.php b/src/NeuralNet/ActivationFunctions/GELU/GELU.php index 1667b1131..195868b29 100644 --- a/src/NeuralNet/ActivationFunctions/GELU/GELU.php +++ b/src/NeuralNet/ActivationFunctions/GELU/GELU.php @@ -87,19 +87,19 @@ public function activate(NDArray $input) : NDArray * - β = 0.044715 * - sech^2(z) = (1/cosh(z))^2 * - * @param NDArray $x Output matrix + * @param NDArray $output Output matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $x) : NDArray + public function differentiate(NDArray $output) : NDArray { // Calculate x^3 - $cubed = NumPower::pow($x, 3); + $cubed = NumPower::pow($output, 3); // Calculate inner term: ALPHA * (x + BETA * x^3) $innerTerm = NumPower::multiply( self::ALPHA, NumPower::add( - $x, + $output, NumPower::multiply(self::BETA, $cubed) ) ); @@ -122,7 +122,7 @@ public function differentiate(NDArray $x) : NDArray NumPower::multiply( NumPower::multiply( 0.5 * self::ALPHA, - $x + $output ), $sech2 ), @@ -130,7 +130,7 @@ public function differentiate(NDArray $x) : NDArray 1.0, NumPower::multiply( 3.0 * self::BETA, - NumPower::pow($x, 2) + NumPower::pow($output, 2) ) ) ); diff --git a/src/NeuralNet/ActivationFunctions/HardSiLU/HardSiLU.php b/src/NeuralNet/ActivationFunctions/HardSiLU/HardSiLU.php index 8fbc39e83..0f9bd86fa 100644 --- a/src/NeuralNet/ActivationFunctions/HardSiLU/HardSiLU.php +++ b/src/NeuralNet/ActivationFunctions/HardSiLU/HardSiLU.php @@ -63,16 +63,16 @@ public function activate(NDArray $input) : NDArray * * f'(x) = HardSigmoid(x) + x * HardSigmoid'(x) * - * @param NDArray $x Input matrix + * @param NDArray $output Output matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $x) : NDArray + public function differentiate(NDArray $output) : NDArray { // Calculate HardSigmoid(x) - $hardSigmoid = $this->hardSigmoid->activate($x); + $hardSigmoid = $this->hardSigmoid->activate($output); // Calculate HardSigmoid'(x) - $hardSigmoidDerivative = $this->hardSigmoid->differentiate($x); + $hardSigmoidDerivative = $this->hardSigmoid->differentiate($output); // Calculate x * HardSigmoid'(x) $xTimesDerivative = NumPower::multiply($x, $hardSigmoidDerivative); diff --git a/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php b/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php index 1c82ade35..801e92f9a 100644 --- a/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php +++ b/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php @@ -79,14 +79,14 @@ public function activate(NDArray $input) : NDArray * f'(x) = 0.2 if -2.5 < x < 2.5 * f'(x) = 0 otherwise * - * @param NDArray $x Input matrix + * @param NDArray $output Output matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $x) : NDArray + public function differentiate(NDArray $output) : NDArray { // For values in the linear region (-2.5 < x < 2.5): SLOPE - $inLinearRegion = NumPower::greater($x, self::LOWER_BOUND); - $inLinearRegion = NumPower::multiply($inLinearRegion, NumPower::less($x, self::UPPER_BOUND)); + $inLinearRegion = NumPower::greater($output, self::LOWER_BOUND); + $inLinearRegion = NumPower::multiply($inLinearRegion, NumPower::less($output, self::UPPER_BOUND)); $linearPart = NumPower::multiply($inLinearRegion, self::SLOPE); // For values outside the linear region: 0 diff --git a/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php b/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php index 305c621b0..bb9a8c8a5 100644 --- a/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php +++ b/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php @@ -40,13 +40,13 @@ public function activate(NDArray $input) : NDArray * * f'(x) = 1 - tanh^2(x) * - * @param NDArray $x Output matrix + * @param NDArray $output Output matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $x) : NDArray + public function differentiate(NDArray $output) : NDArray { // Calculate tanh^2(x) - $squared = NumPower::pow($x, 2); + $squared = NumPower::pow($output, 2); // Calculate 1 - tanh^2(x) return NumPower::subtract(1.0, $squared); From 5203c0a61a3d45d6927577bae9a54d4369e11f9f Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Mon, 23 Jun 2025 19:56:23 +0300 Subject: [PATCH 12/22] SAM-7 differentiate parameter renamed --- .../LeakyReLU/LeakyReLU.php | 8 ++++---- .../ActivationFunctions/ELU/ELUTest.php | 6 +++--- .../ActivationFunctions/GELU/GELUTest.php | 6 +++--- .../HardSiLU/HardSiLUTest.php | 6 +++--- .../HardSigmoid/HardSigmoidTest.php | 6 +++--- .../LeakyReLU/LeakyReLUTest.php | 20 +++++++++---------- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php b/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php index c68237a9a..92d6e3792 100644 --- a/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php +++ b/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php @@ -82,17 +82,17 @@ public function activate(NDArray $input) : NDArray * f'(x) = 1 if x > 0 * f'(x) = leakage if x ≤ 0 * - * @param NDArray $x Input matrix + * @param NDArray $output Output matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $x) : NDArray + public function differentiate(NDArray $output) : NDArray { // For x > 0: 1 - $positivePart = NumPower::greater($x, 0); + $positivePart = NumPower::greater($output, 0); // For x <= 0: leakage $negativePart = NumPower::multiply( - NumPower::lessEqual($x, 0), + NumPower::lessEqual($output, 0), $this->leakage ); diff --git a/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php b/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php index 14e2dff9a..a872fdcbd 100644 --- a/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php +++ b/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php @@ -128,11 +128,11 @@ public function testActivate(NDArray $input, array $expected) : void } #[Test] - #[TestDox('Correctly differentiates the input')] + #[TestDox('Correctly differentiates the output')] #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $input, array $expected) : void + public function testDifferentiate(NDArray $output, array $expected) : void { - $derivatives = $this->activationFn->differentiate($input)->toArray(); + $derivatives = $this->activationFn->differentiate($output)->toArray(); static::assertEqualsWithDelta($expected, $derivatives, 1e-16); } diff --git a/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php b/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php index b9cc02293..0a7295134 100644 --- a/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php +++ b/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php @@ -108,11 +108,11 @@ public function testActivate(NDArray $input, array $expected) : void } #[Test] - #[TestDox('Correctly differentiates the input')] + #[TestDox('Correctly differentiates the output')] #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $input, array $expected) : void + public function testDifferentiate(NDArray $output, array $expected) : void { - $derivatives = $this->activationFn->differentiate($input)->toArray(); + $derivatives = $this->activationFn->differentiate($output)->toArray(); static::assertEqualsWithDelta($expected, $derivatives, 1e-16); } diff --git a/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php b/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php index 812f1bf1d..749a1f322 100644 --- a/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php +++ b/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php @@ -175,11 +175,11 @@ public function testActivate(NDArray $input, array $expected) : void } #[Test] - #[TestDox('Correctly differentiates the input')] + #[TestDox('Correctly differentiates the output')] #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $input, array $expected) : void + public function testDifferentiate(NDArray $output, array $expected) : void { - $derivatives = $this->activationFn->differentiate($input)->toArray(); + $derivatives = $this->activationFn->differentiate($output)->toArray(); static::assertEqualsWithDelta($expected, $derivatives, 1e-16); diff --git a/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php b/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php index 12b6cdcd3..bd46e342d 100644 --- a/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php +++ b/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php @@ -108,11 +108,11 @@ public function testActivate(NDArray $input, array $expected) : void } #[Test] - #[TestDox('Correctly differentiates the input')] + #[TestDox('Correctly differentiates the output')] #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $input, array $expected) : void + public function testDifferentiate(NDArray $output, array $expected) : void { - $derivatives = $this->activationFn->differentiate($input)->toArray(); + $derivatives = $this->activationFn->differentiate($output)->toArray(); static::assertEqualsWithDelta($expected, $derivatives, 1e-16); } diff --git a/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php b/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php index 2e00f5f5a..982e94de3 100644 --- a/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php +++ b/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php @@ -164,16 +164,6 @@ public function testActivate(NDArray $input, array $expected) : void static::assertEqualsWithDelta($expected, $activations, 1e-16); } - #[Test] - #[TestDox('Correctly differentiates the input')] - #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $input, array $expected) : void - { - $derivatives = $this->activationFn->differentiate($input)->toArray(); - - static::assertEqualsWithDelta($expected, $derivatives, 1e-16); - } - #[Test] #[TestDox('Correctly handles boundary values during activation')] #[DataProvider('boundaryProvider')] @@ -183,4 +173,14 @@ public function testBoundaryActivate(NDArray $input, array $expected) : void static::assertEqualsWithDelta($expected, $activations, 1e-16); } + + #[Test] + #[TestDox('Correctly differentiates the output')] + #[DataProvider('differentiateProvider')] + public function testDifferentiate(NDArray $output, array $expected) : void + { + $derivatives = $this->activationFn->differentiate($output)->toArray(); + + static::assertEqualsWithDelta($expected, $derivatives, 1e-16); + } } From ed71ea5663b7a26df9f9f3dc7acad2f955ad121f Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Tue, 24 Jun 2025 06:53:39 +0300 Subject: [PATCH 13/22] Refactoring Derivative sub-interfaces --- .../Base/Contracts/IBufferDerivative.php | 4 ++-- .../Base/Contracts/IOBufferDerivative.php | 19 +++++++++++++++++++ .../Base/Contracts/OBufferDerivative.php | 18 ++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/Base/Contracts/IBufferDerivative.php b/src/NeuralNet/ActivationFunctions/Base/Contracts/IBufferDerivative.php index 9e9b071f5..b29011bc8 100644 --- a/src/NeuralNet/ActivationFunctions/Base/Contracts/IBufferDerivative.php +++ b/src/NeuralNet/ActivationFunctions/Base/Contracts/IBufferDerivative.php @@ -20,8 +20,8 @@ interface IBufferDerivative extends Derivative /** * Calculate the derivative of the single parameter. * - * @param NDArray $output Output matrix + * @param NDArray $input Input matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $output) : NDArray; + public function differentiate(NDArray $input) : NDArray; } diff --git a/src/NeuralNet/ActivationFunctions/Base/Contracts/IOBufferDerivative.php b/src/NeuralNet/ActivationFunctions/Base/Contracts/IOBufferDerivative.php index c77ff3e04..4263fcea9 100644 --- a/src/NeuralNet/ActivationFunctions/Base/Contracts/IOBufferDerivative.php +++ b/src/NeuralNet/ActivationFunctions/Base/Contracts/IOBufferDerivative.php @@ -2,6 +2,25 @@ namespace Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts; +use NDArray; + +/** + * Derivative based on input / output buffer + * + * @category Machine Learning + * @package Rubix/ML + * @author Andrew DalPino + * @author Aleksei Nechaev + * @author Samuel Akopyan + */ interface IOBufferDerivative { + /** + * Calculate the derivative of the activation. + * + * @param NDArray $input Input matrix + * @param NDArray $output Output matrix + * @return NDArray Derivative matrix + */ + public function differentiate(NDArray $input, NDArray $output) : NDArray; } diff --git a/src/NeuralNet/ActivationFunctions/Base/Contracts/OBufferDerivative.php b/src/NeuralNet/ActivationFunctions/Base/Contracts/OBufferDerivative.php index 0ae53eeb8..760dc4593 100644 --- a/src/NeuralNet/ActivationFunctions/Base/Contracts/OBufferDerivative.php +++ b/src/NeuralNet/ActivationFunctions/Base/Contracts/OBufferDerivative.php @@ -2,6 +2,24 @@ namespace Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts; +use NDArray; + +/** + * Derivative based on output buffer + * + * @category Machine Learning + * @package Rubix/ML + * @author Andrew DalPino + * @author Aleksei Nechaev + * @author Samuel Akopyan + */ interface OBufferDerivative { + /** + * Calculate the derivative of the activation. + * + * @param NDArray $output Output matrix + * @return NDArray Derivative matrix + */ + public function differentiate(NDArray $output) : NDArray; } From b0ce0ff049f335ee26933b16cd0b3a6783825380 Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Tue, 24 Jun 2025 19:08:56 +0300 Subject: [PATCH 14/22] Refactoring ELU with IOBufferDerivative --- src/NeuralNet/ActivationFunctions/ELU/ELU.php | 29 ++++++++++--------- .../ActivationFunctions/ELU/ELUTest.php | 27 ++++++++--------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/ELU/ELU.php b/src/NeuralNet/ActivationFunctions/ELU/ELU.php index 5f52d2293..654f8cb06 100644 --- a/src/NeuralNet/ActivationFunctions/ELU/ELU.php +++ b/src/NeuralNet/ActivationFunctions/ELU/ELU.php @@ -7,7 +7,7 @@ use NumPower; use NDArray; use Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts\ActivationFunction; -use Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts\IBufferDerivative; +use Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts\IOBufferDerivative; use Rubix\ML\NeuralNet\ActivationFunctions\ELU\Exceptions\InvalidAlphaException; /** @@ -26,7 +26,7 @@ * @author Aleksei Nechaev * @author Samuel Akopyan */ -class ELU implements ActivationFunction, IBufferDerivative +class ELU implements ActivationFunction, IOBufferDerivative { /** * Class constructor. @@ -71,28 +71,29 @@ public function activate(NDArray $input) : NDArray } /** - * Calculate the derivative of the activation function. + * Calculate the derivative of the ELU activation function using input and output. * - * f'(x) = 1 if x > 0 - * f'(x) = α * e^x if x ≤ 0 + * f'(x) = 1 if x > 0 + * f'(x) = f(x) + α if x ≤ 0, where f(x) is the ELU output * - * @param NDArray $output Output matrix - * @return NDArray Derivative matrix + * @param NDArray $input Input matrix (used to determine x > 0 mask) + * @param NDArray $output Output from the ELU activation function + * @return NDArray Derivative matrix */ - public function differentiate(NDArray $output) : NDArray + public function differentiate(NDArray $input, NDArray $output): NDArray { // For x > 0: 1 - $positivePart = NumPower::greater($output, 0); + $positiveMask = NumPower::greater($input, 0); - // For x <= 0: α * e^x - $negativeMask = NumPower::lessEqual($output, 0); + // For x <= 0: output + α + $negativeMask = NumPower::lessEqual($input, 0); $negativePart = NumPower::multiply( - NumPower::multiply($negativeMask, NumPower::exp($output)), - $this->alpha + NumPower::add($output, $this->alpha), + $negativeMask ); // Combine both parts - return NumPower::add($positivePart, $negativePart); + return NumPower::add($positiveMask, $negativePart); } /** diff --git a/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php b/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php index a872fdcbd..a375347d2 100644 --- a/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php +++ b/tests/NeuralNet/ActivationFunctions/ELU/ELUTest.php @@ -35,7 +35,7 @@ public static function computeProvider() : Generator [1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [1.0, -0.39346933364868164, 0.0, 20.0, -0.9999545812606812], + [1.0, -0.3934693, 0.0, 20.0, -0.9999545], ], ]; @@ -46,9 +46,9 @@ public static function computeProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [-0.11307956278324127, 0.3100000023841858, -0.3873736262321472], - [0.9900000095367432, 0.07999999821186066, -0.029554465785622597], - [0.05000000074505806, -0.40547943115234375, 0.5400000214576721], + [-0.1130795, 0.3100000, -0.3873736], + [0.9900000, 0.0799999, -0.0295544], + [0.0500000, -0.4054794, 0.5400000], ], ]; } @@ -63,7 +63,7 @@ public static function differentiateProvider() : Generator [1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [1.0, 0.6065306663513184, 1.0, 1.0, 4.539993096841499E-5], + [1.0, 0.6065306, 1.0, 1.0, 0.0000454], ], ]; @@ -74,9 +74,9 @@ public static function differentiateProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [0.8869204521179199, 1.0, 0.6126263737678528], - [1.0, 1.0, 0.9704455137252808], - [1.0, 0.5945205688476562, 1.0], + [0.8869204, 1.0, 0.6126263], + [1.0, 1.0, 0.9704455], + [1.0, 0.5945205, 1.0], ], ]; } @@ -124,16 +124,17 @@ public function testActivate(NDArray $input, array $expected) : void { $activations = $this->activationFn->activate($input)->toArray(); - static::assertEqualsWithDelta($expected, $activations, 1e-16); + static::assertEqualsWithDelta($expected, $activations, 1e-7); } #[Test] - #[TestDox('Correctly differentiates the output')] + #[TestDox('Correctly differentiates the input using buffered output')] #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $output, array $expected) : void + public function testDifferentiate(NDArray $input, array $expected) : void { - $derivatives = $this->activationFn->differentiate($output)->toArray(); + $output = $this->activationFn->activate($input); + $derivatives = $this->activationFn->differentiate($input, $output)->toArray(); - static::assertEqualsWithDelta($expected, $derivatives, 1e-16); + static::assertEqualsWithDelta($expected, $derivatives, 1e-7); } } From c84319e5f2b06252c2295f897c2bbcfe4d871c2c Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Tue, 24 Jun 2025 19:28:41 +0300 Subject: [PATCH 15/22] Refactoring GELU with IBufferDerivative --- .../ActivationFunctions/GELU/GELU.php | 12 ++++----- .../ActivationFunctions/GELU/GELUTest.php | 26 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/GELU/GELU.php b/src/NeuralNet/ActivationFunctions/GELU/GELU.php index 195868b29..008219469 100644 --- a/src/NeuralNet/ActivationFunctions/GELU/GELU.php +++ b/src/NeuralNet/ActivationFunctions/GELU/GELU.php @@ -87,19 +87,19 @@ public function activate(NDArray $input) : NDArray * - β = 0.044715 * - sech^2(z) = (1/cosh(z))^2 * - * @param NDArray $output Output matrix + * @param NDArray $input Input matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $output) : NDArray + public function differentiate(NDArray $input) : NDArray { // Calculate x^3 - $cubed = NumPower::pow($output, 3); + $cubed = NumPower::pow($input, 3); // Calculate inner term: ALPHA * (x + BETA * x^3) $innerTerm = NumPower::multiply( self::ALPHA, NumPower::add( - $output, + $input, NumPower::multiply(self::BETA, $cubed) ) ); @@ -122,7 +122,7 @@ public function differentiate(NDArray $output) : NDArray NumPower::multiply( NumPower::multiply( 0.5 * self::ALPHA, - $output + $input ), $sech2 ), @@ -130,7 +130,7 @@ public function differentiate(NDArray $output) : NDArray 1.0, NumPower::multiply( 3.0 * self::BETA, - NumPower::pow($output, 2) + NumPower::pow($input, 2) ) ) ); diff --git a/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php b/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php index 0a7295134..2a4e35b14 100644 --- a/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php +++ b/tests/NeuralNet/ActivationFunctions/GELU/GELUTest.php @@ -34,7 +34,7 @@ public static function computeProvider() : Generator [2, 1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [1.9545977115631104, 0.8411920070648193, -0.1542859971523285, 0.0, 20.0, 0.0], + [1.9545977, 0.8411920, -0.1542859, 0.0, 20.0, 0.0], ], ]; @@ -45,9 +45,9 @@ public static function computeProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [-0.054269056767225266, 0.19273021817207336, -0.15292881429195404], - [0.830374538898468, 0.04255049675703049, -0.014641005545854568], - [0.025996938347816467, -0.15681639313697815, 0.38089409470558167], + [-0.0542690, 0.1927302, -0.1529288], + [0.8303745, 0.0425504, -0.0146410], + [0.0259969, -0.1568163, 0.3808940], ], ]; } @@ -62,7 +62,7 @@ public static function differentiateProvider() : Generator [1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [1.0829640626907349, 0.1326301246881485, 0.5, 1.0, -0.0], + [1.0829640, 0.1326301, 0.5, 1.0, -0.0], ], ]; @@ -73,9 +73,9 @@ public static function differentiateProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [0.4047141969203949, 0.7395542860031128, 0.13881805539131165], - [1.080506443977356, 0.5636941194534302, 0.47607067227363586], - [0.5398608446121216, 0.12045331299304962, 0.8914529085159302], + [0.4047141, 0.7395542, 0.1388180], + [1.0805064, 0.5636941, 0.4760706], + [0.5398608, 0.1204533, 0.8914529], ], ]; } @@ -104,16 +104,16 @@ public function testActivate(NDArray $input, array $expected) : void { $activations = $this->activationFn->activate($input)->toArray(); - static::assertEqualsWithDelta($expected, $activations, 1e-16); + static::assertEqualsWithDelta($expected, $activations, 1e-7); } #[Test] - #[TestDox('Correctly differentiates the output')] + #[TestDox('Correctly differentiates the input')] #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $output, array $expected) : void + public function testDifferentiate(NDArray $input, array $expected) : void { - $derivatives = $this->activationFn->differentiate($output)->toArray(); + $derivatives = $this->activationFn->differentiate($input)->toArray(); - static::assertEqualsWithDelta($expected, $derivatives, 1e-16); + static::assertEqualsWithDelta($expected, $derivatives, 1e-7); } } From de4ef87bb05a5fe2d5db572c1ec00ed23884b8fb Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Tue, 24 Jun 2025 23:12:09 +0300 Subject: [PATCH 16/22] Refactoring HardSigmoid with IBufferDerivative --- .../ActivationFunctions/HardSigmoid/HardSigmoid.php | 8 ++++---- .../HardSigmoid/HardSigmoidTest.php | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php b/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php index 801e92f9a..78df22dcb 100644 --- a/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php +++ b/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php @@ -79,14 +79,14 @@ public function activate(NDArray $input) : NDArray * f'(x) = 0.2 if -2.5 < x < 2.5 * f'(x) = 0 otherwise * - * @param NDArray $output Output matrix + * @param NDArray $input Input matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $output) : NDArray + public function differentiate(NDArray $input) : NDArray { // For values in the linear region (-2.5 < x < 2.5): SLOPE - $inLinearRegion = NumPower::greater($output, self::LOWER_BOUND); - $inLinearRegion = NumPower::multiply($inLinearRegion, NumPower::less($output, self::UPPER_BOUND)); + $inLinearRegion = NumPower::greaterEqual($input, self::LOWER_BOUND); + $inLinearRegion = NumPower::multiply($inLinearRegion, NumPower::lessEqual($input, self::UPPER_BOUND)); $linearPart = NumPower::multiply($inLinearRegion, self::SLOPE); // For values outside the linear region: 0 diff --git a/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php b/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php index bd46e342d..6fd535c11 100644 --- a/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php +++ b/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php @@ -62,7 +62,7 @@ public static function differentiateProvider() : Generator [2.5, 1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [0.0, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.0, 0.0], + [0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.0, 0.0], ], ]; @@ -104,16 +104,16 @@ public function testActivate(NDArray $input, array $expected) : void { $activations = $this->activationFn->activate($input)->toArray(); - static::assertEqualsWithDelta($expected, $activations, 1e-16); + static::assertEqualsWithDelta($expected, $activations, 1e-7); } #[Test] - #[TestDox('Correctly differentiates the output')] + #[TestDox('Correctly differentiates the input')] #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $output, array $expected) : void + public function testDifferentiate(NDArray $input, array $expected) : void { - $derivatives = $this->activationFn->differentiate($output)->toArray(); + $derivatives = $this->activationFn->differentiate($input)->toArray(); - static::assertEqualsWithDelta($expected, $derivatives, 1e-16); + static::assertEqualsWithDelta($expected, $derivatives, 1e-7); } } From 6dd013f2351d0af10090d8ecdbfb239566efc42b Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Tue, 24 Jun 2025 23:18:43 +0300 Subject: [PATCH 17/22] Refactoring HardSigmoid with IBufferDerivative --- .../HardSigmoid/HardSigmoidTest.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php b/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php index 6fd535c11..a39bf1d86 100644 --- a/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php +++ b/tests/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoidTest.php @@ -34,7 +34,7 @@ public static function computeProvider() : Generator [2.5, 2.4, 2.0, 1.0, -0.5, 0.0, 20.0, -2.5, -2.4, -10.0], ]), [ - [1.0, 0.9800000190734863, 0.8999999761581421, 0.699999988079071, 0.4000000059604645, 0.5, 1.0, 0.0, 0.019999980926513672, 0.0], + [1.0, 0.9800000, 0.8999999, 0.6999999, 0.4000000, 0.5, 1.0, 0.0, 0.0199999, 0.0], ], ]; @@ -45,9 +45,9 @@ public static function computeProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [0.47600001096725464, 0.5619999766349792, 0.4020000100135803], - [0.6980000138282776, 0.515999972820282, 0.49399998784065247], - [0.5099999904632568, 0.3959999978542328, 0.6079999804496765], + [0.4760000, 0.5619999, 0.4020000], + [0.6980000, 0.5159999, 0.4939999], + [0.5099999, 0.3959999, 0.6079999], ], ]; } @@ -59,10 +59,10 @@ public static function differentiateProvider() : Generator { yield [ NumPower::array([ - [2.5, 1.0, -0.5, 0.0, 20.0, -10.0], + [2.5, 1.0, -0.5, 0.0, 20.0, -2.5, -10.0], ]), [ - [0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.0, 0.0], + [0.2000000, 0.2000000, 0.2000000, 0.2000000, 0.0, 0.2000000, 0.0], ], ]; @@ -73,9 +73,9 @@ public static function differentiateProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [0.20000000298023224, 0.20000000298023224, 0.20000000298023224], - [0.0, 0.20000000298023224, 0.20000000298023224], - [0.20000000298023224, 0.20000000298023224, 0.20000000298023224], + [0.2000000, 0.2000000, 0.2000000], + [0.0, 0.2000000, 0.2000000], + [0.2000000, 0.2000000, 0.2000000], ], ]; } From 6020364cc628fbbdf65e6fa19a540f8ad1cf87b9 Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Tue, 24 Jun 2025 23:22:30 +0300 Subject: [PATCH 18/22] Refactoring HardSigmoid with IBufferDerivative --- src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php b/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php index 78df22dcb..40039d4cc 100644 --- a/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php +++ b/src/NeuralNet/ActivationFunctions/HardSigmoid/HardSigmoid.php @@ -76,7 +76,7 @@ public function activate(NDArray $input) : NDArray /** * Calculate the derivative of the activation function. * - * f'(x) = 0.2 if -2.5 < x < 2.5 + * f'(x) = 0.2 if -2.5 <= x <= 2.5 * f'(x) = 0 otherwise * * @param NDArray $input Input matrix @@ -84,7 +84,7 @@ public function activate(NDArray $input) : NDArray */ public function differentiate(NDArray $input) : NDArray { - // For values in the linear region (-2.5 < x < 2.5): SLOPE + // For values in the linear region (-2.5 <= x <= 2.5): SLOPE $inLinearRegion = NumPower::greaterEqual($input, self::LOWER_BOUND); $inLinearRegion = NumPower::multiply($inLinearRegion, NumPower::lessEqual($input, self::UPPER_BOUND)); $linearPart = NumPower::multiply($inLinearRegion, self::SLOPE); From e278894d1ac5a399ab21bea9ee9ca95e8ca0b0d2 Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Wed, 25 Jun 2025 16:55:36 +0300 Subject: [PATCH 19/22] Refactoring HardSiLU with IBufferDerivative --- .../hard-silu-derivative.png | Bin 48315 -> 74612 bytes .../images/activation-functions/hard-silu.png | Bin 48031 -> 62872 bytes .../ActivationFunctions/HardSiLU/HardSiLU.php | 10 ++-- .../HardSiLU/HardSiLUTest.php | 43 +++++++++--------- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/docs/images/activation-functions/hard-silu-derivative.png b/docs/images/activation-functions/hard-silu-derivative.png index 089d0eac59569a612c7837c9179d9286f5b2848f..4cb2a03206ecf352adc4c640eb1ba00b73aecdf1 100644 GIT binary patch literal 74612 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 F{{l^7eA55` literal 48315 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

}O#<`Wx-(Nzrdmq5mpE>-bd(8I*IZjp zq1PaDG+r^`cOO$f*+rBW(m8`tH%@IlL42gqpyExd3CuCuN^zhm z_`74C&>mQwVsk)N6c6{sn_#P7>5gSwP$3|FOlV(zWEF9--ri^>N=Is7ijtt8_bG54 z+76d14q94z=c%u`uVX%zG3!tIA?8_0VpJ}!HYoN|+eoUFm1Cb^$dv7&r)9lLIj(f*VftSMrIl~}u;Y3{JIqv`k zeX%oIV?6ko1@8y(v9L$&B_gn=$bGQL+xvD@)G0a{snEhFnNivy=u}Z#pBFmha2c1X zz(nRuVfQ<0wxP{h0!g^IY$>ji&IA@8Anplq@ptREDWx_J3x@Fd2{_oSZBb@s;uy-S z>Ev3tAssWV|A6vDHA<2ZHa*^pzKai0uuWsQL&M1U?wvb6tw&p3|5?PSJj+Bd8<3JT z#VR3ClN?9u&IHD7Ap*{)?!`s~$da68jf|5X+RCfP86G~!Y8bD=An0AMrltnTt!q0kRF^pNzU@^{04EKf(^Q86_JOJYll;=QF^OGKE2||W@VFh#p z5aIoHhR0;4BJ?bk@A{)88DTf8~SL#Mg-yvW~+eYTn&+lB!M^z4aP#t8+o zy$3mWX-zGv+qU7Mis7tQ_u4fTr_g*F9li=nZ!L4_U9}L?g%SuI0jAjX{k+ns1Z7}Z zyKqkh4~+LtQq7|i|E$}r0eQ2xH-)gF9{=GU1^-mMBvTlE;977)n8sJF6cnz`2(x2u zgikOIxa8jO2~L~U;Mx@{+X&O7ocM5O$2fTxnY>&#k?DHCaVbU#;q_^*Q={U|GDe<{|9Mi@nir1 diff --git a/docs/images/activation-functions/hard-silu.png b/docs/images/activation-functions/hard-silu.png index de9fd2a8b25e2e5e132eb3f729c49c4985035ff3..db84ce40eed09f22bd9a75d722ecf8e309359fa9 100644 GIT binary patch literal 62872 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 literal 48031 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 PB;av21g$UpU}y5*PbkdF diff --git a/src/NeuralNet/ActivationFunctions/HardSiLU/HardSiLU.php b/src/NeuralNet/ActivationFunctions/HardSiLU/HardSiLU.php index 0f9bd86fa..6ed54631a 100644 --- a/src/NeuralNet/ActivationFunctions/HardSiLU/HardSiLU.php +++ b/src/NeuralNet/ActivationFunctions/HardSiLU/HardSiLU.php @@ -63,19 +63,19 @@ public function activate(NDArray $input) : NDArray * * f'(x) = HardSigmoid(x) + x * HardSigmoid'(x) * - * @param NDArray $output Output matrix + * @param NDArray $input Input matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $output) : NDArray + public function differentiate(NDArray $input) : NDArray { // Calculate HardSigmoid(x) - $hardSigmoid = $this->hardSigmoid->activate($output); + $hardSigmoid = $this->hardSigmoid->activate($input); // Calculate HardSigmoid'(x) - $hardSigmoidDerivative = $this->hardSigmoid->differentiate($output); + $hardSigmoidDerivative = $this->hardSigmoid->differentiate($input); // Calculate x * HardSigmoid'(x) - $xTimesDerivative = NumPower::multiply($x, $hardSigmoidDerivative); + $xTimesDerivative = NumPower::multiply($input, $hardSigmoidDerivative); // Calculate HardSigmoid(x) + x * HardSigmoid'(x) return NumPower::add($hardSigmoid, $xTimesDerivative); diff --git a/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php b/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php index 749a1f322..5eee0a332 100644 --- a/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php +++ b/tests/NeuralNet/ActivationFunctions/HardSiLU/HardSiLUTest.php @@ -34,7 +34,7 @@ public static function computeProvider() : Generator [2.5, 2.0, 1.0, -0.5, 0.0, 20.0, -2.5, -10.0], ]), [ - [2.5, 1.7999999523162842, 0.699999988079071, -0.20000000298023224, 0.0, 20.0, 0.0, 0.0], + [2.5, 1.7999999, 0.6999999, -0.2000000, 0.0, 20.0, 0.0, 0.0], ], ]; @@ -45,9 +45,9 @@ public static function computeProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [-0.05711999908089638, 0.1742199957370758, -0.19698001444339752], - [0.6910200119018555, 0.04127999767661095, -0.014819999225437641], - [0.025499999523162842, -0.2059199959039688, 0.3283199965953827], + [-0.0571199, 0.1742199, -0.1969800], + [0.6910200, 0.0412799, -0.0148199], + [0.0254999, -0.2059199, 0.3283199], ], ]; @@ -66,9 +66,9 @@ public static function computeProvider() : Generator // At x = 2.5, HardSigmoid(x) = 1, so HardSiLU(2.5) = 2.5 * 1 = 2.5 [0.0, 2.5], // Just inside boundaries - [-0.0004997340147383511, 2.498500347137451], + [-0.0004997, 2.4985003], // Just outside boundaries - [0.0, 2.500999927520752], + [0.0, 2.5009999], ], ]; @@ -76,12 +76,12 @@ public static function computeProvider() : Generator yield [ NumPower::array([ // Zero and very small values around zero - [0.0, 0.0000001, -0.0000001, 0.0000000001, -0.0000000001], + [0.0, 0.000001, -0.0000001, 0.0000000001, -0.0000000001], ]), [ // HardSiLU(0) = 0 * 0.5 = 0 // For very small values, HardSigmoid(x) ≈ 0.5, so HardSiLU(x) ≈ x * 0.5 - [0.0, 0.00000005000000058430487, -0.00000004999999703159119, 0.0000000000500000006675716, -0.0000000000500000006675716], + [0.0, 0.0000005, -0.0000000, 0.0000000, -0.0000000], ], ]; } @@ -96,7 +96,7 @@ public static function differentiateProvider() : Generator [2.5, 1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [1.0, 0.8999999761581421, 0.30000001192092896, 0.5, 1.0, 0.0], + [1.5, 0.8999999, 0.30000001192092896, 0.5, 1.0, 0.0], ], ]; @@ -107,9 +107,9 @@ public static function differentiateProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [0.45200002193450928, 0.6239999532699585, 0.30400002002716064], - [0.8960000276565552, 0.531999945640564, 0.48799997568130493], - [0.5199999809265137, 0.2919999957084656, 0.715999960899353], + [0.4520000, 0.6239999, 0.3040000], + [0.8960000, 0.5319999, 0.4879999], + [0.5199999, 0.2919999, 0.7159999], ], ]; @@ -125,9 +125,9 @@ public static function differentiateProvider() : Generator ]), [ // At boundaries: derivative is 0 at x = -2.5 and 1 at x = 2.5 - [0.0, 1.0], + [-0.5, 1.5], // Just inside boundaries - [-0.49960005283355713, 1.4996000528335571], + [-0.4996000, 1.4996000], // Just outside boundaries [0.0, 1.0], ], @@ -137,12 +137,12 @@ public static function differentiateProvider() : Generator yield [ NumPower::array([ // Zero and very small values around zero - [0.0, 0.0000001, -0.0000001, 0.0000000001, -0.0000000001], + [0.0, -0.00001, 0.000001, -0.0000001, 0.00000001, -0.000000001], ]), [ // At x = 0, derivative is 0.5 // For very small values, derivative is close to 0.5 - [0.5, 0.5, 0.4999999403953552, 0.5, 0.5], + [0.5, 0.4999960, 0.5000003, 0.4999999, 0.5, 0.5], ], ]; } @@ -171,17 +171,16 @@ public function testActivate(NDArray $input, array $expected) : void { $activations = $this->activationFn->activate($input)->toArray(); - static::assertEqualsWithDelta($expected, $activations, 1e-16); + static::assertEqualsWithDelta($expected, $activations, 1e-7); } #[Test] - #[TestDox('Correctly differentiates the output')] + #[TestDox('Correctly differentiates the input')] #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $output, array $expected) : void + public function testDifferentiate(NDArray $input, array $expected) : void { - $derivatives = $this->activationFn->differentiate($output)->toArray(); - - static::assertEqualsWithDelta($expected, $derivatives, 1e-16); + $derivatives = $this->activationFn->differentiate($input)->toArray(); + static::assertEqualsWithDelta($expected, $derivatives, 1e-7); } } From 87cb3b9aa3b69e78f5ede2074db4f3e72f44092e Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Wed, 25 Jun 2025 19:44:40 +0300 Subject: [PATCH 20/22] Refactoring HyperbolicTangent with IBufferDerivative --- .../HyperbolicTangent/HyperbolicTangent.php | 4 +-- .../HyperbolicTangentTest.php | 28 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php b/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php index bb9a8c8a5..629422c86 100644 --- a/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php +++ b/src/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangent.php @@ -7,7 +7,7 @@ use NumPower; use NDArray; use Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts\ActivationFunction; -use Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts\IBufferDerivative; +use Rubix\ML\NeuralNet\ActivationFunctions\Base\Contracts\OBufferDerivative; /** * Hyperbolic Tangent @@ -20,7 +20,7 @@ * @author Andrew DalPino * @author Samuel Akopyan */ -class HyperbolicTangent implements ActivationFunction, IBufferDerivative +class HyperbolicTangent implements ActivationFunction, OBufferDerivative { /** * Apply the Hyperbolic Tangent activation function to the input. diff --git a/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php b/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php index 79dc6b11c..948d1c297 100644 --- a/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php +++ b/tests/NeuralNet/ActivationFunctions/HyperbolicTangent/HyperbolicTangentTest.php @@ -34,7 +34,7 @@ public static function computeProvider() : Generator [9.0, 2.5, 2.0, 1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [0.9999999403953552, 0.9866142868995667, 0.9640275835990906, 0.7615941762924194, -0.46211716532707214, 0.0, 1.0, -1.0], + [0.9999999, 0.9866142, 0.9640275, 0.7615941, -0.4621171, 0.0, 1.0, -1.0], ], ]; @@ -45,9 +45,9 @@ public static function computeProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [-0.11942730098962784, 0.3004370927810669, -0.45421645045280457], - [0.7573622465133667, 0.07982976734638214, -0.02999100275337696], - [0.049958378076553345, -0.47769999504089355, 0.4929879903793335], + [-0.1194273, 0.3004370, -0.4542164], + [0.7573622, 0.0798297, -0.0299910], + [0.0499583, -0.4776999, 0.4929879], ], ]; } @@ -59,23 +59,23 @@ public static function differentiateProvider() : Generator { yield [ NumPower::array([ - [0.9640275835990906, 0.7615941762924194, -0.46211716532707214, 0.0, 1.0, -1.0], + [0.9640275, 0.7615941, -0.4621171, 0.0, 1.0, -1.0], ]), [ - [0.07065081596374512, 0.41997432708740234, 0.7864477038383484, 1.0, 0.0, 0.0], + [0.0706509, 0.4199743, 0.7864477, 1.0, 0.0, 0.0], ], ]; yield [ NumPower::array([ - [-0.11942730098962784, 0.3004370927810669, -0.45421645045280457], - [0.7573623085022249, 0.07978830223560329, -0.029991223630861304], - [0.049958395721942955, -0.4778087574005698, 0.4930591567725708], + [-0.1194273, 0.3004370, -0.4542164], + [0.7573623, 0.0797883, -0.0299912], + [0.0499583, -0.4778087, 0.4930591], ]), [ - [0.985737144947052, 0.9097375273704529, 0.7936874032020569], - [0.42640233039855957, 0.9936338067054749, 0.9991005063056946], - [0.9975041747093201, 0.7716988325119019, 0.7568926811218262], + [0.9857371, 0.9097375, 0.7936874], + [0.4264023, 0.9936338, 0.9991005], + [0.9975042, 0.7716988, 0.7568927], ], ]; } @@ -104,7 +104,7 @@ public function testActivate(NDArray $input, array $expected) : void { $activations = $this->activationFn->activate($input)->toArray(); - static::assertEqualsWithDelta($expected, $activations, 1e-16); + static::assertEqualsWithDelta($expected, $activations, 1e-7); } #[Test] @@ -114,6 +114,6 @@ public function testDifferentiate(NDArray $output, array $expected) : void { $derivatives = $this->activationFn->differentiate($output)->toArray(); - static::assertEqualsWithDelta($expected, $derivatives, 1e-16); + static::assertEqualsWithDelta($expected, $derivatives, 1e-7); } } From edb02d02423ed704708905aa6c38c6079d7adf8b Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Wed, 25 Jun 2025 20:03:34 +0300 Subject: [PATCH 21/22] Refactoring LeakyReLU with IBufferDerivative --- .../LeakyReLU/LeakyReLU.php | 8 ++--- .../LeakyReLU/LeakyReLUTest.php | 32 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php b/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php index 92d6e3792..bace16275 100644 --- a/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php +++ b/src/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLU.php @@ -82,17 +82,17 @@ public function activate(NDArray $input) : NDArray * f'(x) = 1 if x > 0 * f'(x) = leakage if x ≤ 0 * - * @param NDArray $output Output matrix + * @param NDArray $input Input matrix * @return NDArray Derivative matrix */ - public function differentiate(NDArray $output) : NDArray + public function differentiate(NDArray $input) : NDArray { // For x > 0: 1 - $positivePart = NumPower::greater($output, 0); + $positivePart = NumPower::greater($input, 0); // For x <= 0: leakage $negativePart = NumPower::multiply( - NumPower::lessEqual($output, 0), + NumPower::lessEqual($input, 0), $this->leakage ); diff --git a/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php b/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php index 982e94de3..179ea5bd9 100644 --- a/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php +++ b/tests/NeuralNet/ActivationFunctions/LeakyReLU/LeakyReLUTest.php @@ -35,7 +35,7 @@ public static function computeProvider() : Generator [2.0, 1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [2.0, 1.0, -0.004999999888241291, 0.0, 20.0, -0.09999999403953552], + [2.0, 1.0, -0.0049999, 0.0, 20.0, -0.0999999], ], ]; @@ -46,9 +46,9 @@ public static function computeProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [-0.0011999999405816197, 0.3100000023841858, -0.004900000058114529], - [0.9900000095367432, 0.07999999821186066, -0.00029999998514540493], - [0.05000000074505806, -0.005199999548494816, 0.5400000214576721], + [-0.0011999, 0.3100000, -0.0049000], + [0.9900000, 0.0799999, -0.0002999], + [0.0500000, -0.0051999, 0.5400000], ], ]; } @@ -60,10 +60,10 @@ public static function differentiateProvider() : Generator { yield [ NumPower::array([ - [2.0, 1.0, -0.5, 0.0, 20.0, -10.0], + [4.0, 2.0, 1.0, -0.5, 0.0, 20.0, -10.0], ]), [ - [1.0, 1.0, 0.009999999776482582, 0.009999999776482582, 1.0, 0.009999999776482582], + [1.0, 1.0, 1.0, 0.0099999, 0.0099999, 1.0, 0.0099999], ], ]; @@ -74,9 +74,9 @@ public static function differentiateProvider() : Generator [0.05, -0.52, 0.54], ]), [ - [0.009999999776482582, 1.0, 0.009999999776482582], - [1.0, 1.0, 0.009999999776482582], - [1.0, 0.009999999776482582, 1.0], + [0.0099999, 1.0, 0.0099999], + [1.0, 1.0, 0.0099999], + [1.0, 0.0099999, 1.0], ], ]; } @@ -113,7 +113,7 @@ public static function boundaryProvider() : Generator ]), [ - [0.0010000000474974513, -0.000010000000656873453, 0.00009999999747378752, -0.0000009999999974752427], + [0.0010000, -0.0000100, 0.0000999, -0.0000009], ], ]; } @@ -161,7 +161,7 @@ public function testActivate(NDArray $input, array $expected) : void { $activations = $this->activationFn->activate($input)->toArray(); - static::assertEqualsWithDelta($expected, $activations, 1e-16); + static::assertEqualsWithDelta($expected, $activations, 1e-7); } #[Test] @@ -171,16 +171,16 @@ public function testBoundaryActivate(NDArray $input, array $expected) : void { $activations = $this->activationFn->activate($input)->toArray(); - static::assertEqualsWithDelta($expected, $activations, 1e-16); + static::assertEqualsWithDelta($expected, $activations, 1e-7); } #[Test] - #[TestDox('Correctly differentiates the output')] + #[TestDox('Correctly differentiates the input')] #[DataProvider('differentiateProvider')] - public function testDifferentiate(NDArray $output, array $expected) : void + public function testDifferentiate(NDArray $input, array $expected) : void { - $derivatives = $this->activationFn->differentiate($output)->toArray(); + $derivatives = $this->activationFn->differentiate($input)->toArray(); - static::assertEqualsWithDelta($expected, $derivatives, 1e-16); + static::assertEqualsWithDelta($expected, $derivatives, 1e-7); } } From 6c4d9f4c3c3c4fca59dd60492eb44ab7c3979a1c Mon Sep 17 00:00:00 2001 From: Samuel Akopyan Date: Wed, 25 Jun 2025 20:14:19 +0300 Subject: [PATCH 22/22] Typo fix in exception text --- src/NeuralNet/ActivationFunctions/ELU/ELU.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NeuralNet/ActivationFunctions/ELU/ELU.php b/src/NeuralNet/ActivationFunctions/ELU/ELU.php index 654f8cb06..a0ca1fe36 100644 --- a/src/NeuralNet/ActivationFunctions/ELU/ELU.php +++ b/src/NeuralNet/ActivationFunctions/ELU/ELU.php @@ -40,7 +40,7 @@ public function __construct(protected float $alpha = 1.0) { if ($this->alpha < 0.0) { throw new InvalidAlphaException( - message: "Alpha must be greater than 0, $alpha given." + message: "Alpha must be greater than 0, {$this->alpha} given." ); } }