map([$this, 'compute']); } /** * Calculate the derivative of the activation function at a given output. * * @internal * * @param Matrix $z * @param Matrix $computed * @return Matrix */ public function differentiate(Matrix $z, Matrix $computed) : Matrix { return $z->map([$this, '_differentiate']); } /** * @param float $z * @return float */ public function compute(float $z) : float { return 0.5 * $z * (1.0 + tanh(self::ALPHA * ($z + self::BETA * $z ** 3))); } /** * @internal * * @param float $z * @return float */ public function _differentiate(float $z) : float { $zHat = $z ** 3; $alpha = 0.0356774 * $zHat + self::ALPHA * $z; $beta = 0.0535161 * $zHat + 0.398942 * $z; return 0.5 * tanh($alpha) + $beta * self::sech2($alpha) + 0.5; } /** * Return the string representation of the object. * * @return string */ public function __toString() : string { return 'GELU'; } }