Skip to content

dynamicroutingblock

Module/Class Name: DynamicRoutingBlock

Overview

The DynamicRoutingBlock class, which subclass nn.Module, provides the structure for incorporating dynamic routing mechanism between two sub-blocks in a neural network. A dynamic routing algorithm allows a neural network to learn from inputs internally and configure its neurons' connections, thereby allowing the neural network to adapt better to the specific task at hand. This pytorch-based class encapsulates the operations of a dynamic routing block, a higher-level structure in a neural network architecture.

class DynamicRoutingBlock(nn.Module):

Class Definition

Below, you will find the class definition, along with detailed descriptions of its parameters. This gives you a better understanding of the class and circles the logic it follows.

def __init__(self, sb1: nn.Module, sb2: nn.Module, routing_module: nn.Module):
Parameters:

Parameter Type Description
sb1 nn.Module The first sub-block
sb2 nn.Module The second sub-block
routing_module nn.Module The module that computes routing weights

Method Definitions

Forward Method

This method defines the forward pass of the dynamic routing block. The routing_weights are first computed by inputting x into the provided routing_module. These weights are then used to compute the final output.

def forward(self, x: torch.Tensor) -> torch.Tensor:

Parameters:

Parameter Type Description
x torch.Tensor The input tensor

Return:

Type Description
torch.Tensor The output tensor after dynamic routing

Functionality and Usage

To illustrate the usefulness and workings of the DynamicRoutingBlock, let's walk through an example. Suppose you want to create a dynamic routing block that routes between two linear transformation (i.e., nn.Linear) sub-blocks, sb1 and sb2, and you have a routing_module that computes a sigmoid activation of a dot product with a learnable weight vector.

Firstly, define your two sub-blocks and routing module:

sb1 = nn.Linear(5, 3)
sb2 = nn.Linear(5, 3)


class RoutingModule(nn.Module):
    def __init__(self):
        super().__init__()
        self.weights = nn.Parameter(torch.randn(5))

    def forward(self, x):
        return torch.sigmoid(x @ self.weights)


routing_module = RoutingModule()

Then, you instantiate your dynamic routing block like this:

drb = DynamicRoutingBlock(sb1, sb2, routing_module)

The input can be passed to this block to yield the output:

x = torch.randn(3, 5)
y = drb(x)
In the process, the dynamic routing block has learned to route between sb1 and sb2 depending on routing_module's weights, allowing the module to discover which sub-block is more 'helpful' for any given input.

Dynamic routing is a powerful tool for allowing a neural network to determine more complex, hierarchical relationships among its inputs. Consequently, using dynamic routing blocks such as described could potentially assist in enhancing the network's predictive performance. The DynamicRoutingBlock class provided here provides a simple, yet powerful implementation of such a dynamic routing mechanism.