BrainJS / brain.js

🤖 GPU accelerated Neural networks in JavaScript for Browsers and Node.js
https://brain.js.org
MIT License
14.33k stars 1.07k forks source link

Add Exponential Linear Unit(ELU) #939

Open AbhinavShaw09 opened 3 weeks ago

AbhinavShaw09 commented 3 weeks ago

A GIF or MEME to give some spice of the internet

Summary

The Exponential Linear Unit (ELU) activation function is used in neural networks and deep learning due to its benefits over other activation functions like ReLU (Rectified Linear Unit) and its variants. Here are some reasons why ELU might be preferred:

Benefits of ELU 1.Mitigates Vanishing Gradient Problem: ELU addresses the vanishing gradient problem more effectively than activation functions like Sigmoid or Tanh. It does this by ensuring that gradients do not vanish as quickly, especially for negative inputs.

2.Smoothness and Nonlinearity: ELU provides smooth, nonlinear behavior for both positive and negative inputs. This smoothness can help the network learn better representations and improve convergence.

3.Negative Values Handling: Unlike ReLU, which zeroes out negative values, ELU allows negative values to pass through but scales them in a non-linear way. This helps in learning richer representations and reduces bias in the network output.

4.Self-Normalizing Properties: The ELU activation function helps maintain mean activations close to zero, which can lead to faster convergence. This self-normalizing property is beneficial for training deep networks.

5.Avoids Dead Neurons: ELU avoids the issue of dead neurons (common in ReLU) where neurons become inactive and stop learning because they output zero for all inputs.

Basic example

import { ELU } from './activation-functions';

// Create an ELU activation function with a custom alpha value
const elu = new ELU(0.5);

// Example input values
const inputs = [1, 0, -1, -2];

// Apply ELU activation function
const activated = elu.activate(inputs);
console.log('Activated values:', activated);

// Example error propagated back
const error = 0.5;

// Compute gradient for each activated value
const gradients = Array.isArray(activated)
  ? activated.map(value => elu.measure(value, error))
  : elu.measure(activated, error);

console.log('Gradients:', gradients);

Motivation

Use Cases

Deep Neural Networks (DNNs): Use Case: ELU is beneficial in very deep networks where maintaining healthy gradients across many layers is crucial. It helps ensure that gradients remain significant and stable.

Convolutional Neural Networks (CNNs): Use Case: In CNNs, ELU can be used to avoid dead neurons and improve the learning of complex features, especially in layers with many filters and pooling operations.

Generative Models: Use Case: In models like Generative Adversarial Networks (GANs), ELU's properties can aid in generating more diverse and realistic outputs by preventing the collapse of gradient signals.

Recurrent Neural Networks (RNNs): Use Case: For RNNs, ELU can help in learning temporal patterns more effectively by ensuring gradients are well-behaved and do not vanish.

Expected Outcomes

-Improved Training Stability: Outcome: ELU can lead to more stable training dynamics by avoiding issues with vanishing gradients and dead neurons, which can improve the convergence of the training process.

-Faster Convergence: Outcome: The self-normalizing property of ELU can help networks converge faster compared to some other activation functions by keeping activations centered around zero.

-Better Model Performance: Outcome: By mitigating issues like vanishing gradients and providing smoother non-linearity, ELU can lead to improved performance of neural networks on various tasks, including image classification, natural language processing, and more.

-Reduced Risk of Dead Neurons: Outcome: With ELU, the risk of neurons becoming inactive and failing to learn is reduced, which helps in maintaining a more active and learning-capable network.

AbhinavShaw09 commented 3 weeks ago

@robertleeplummerjr Assign me this, I will add this