class_docstr: The original attention from Badhanau et al. (2014)
  https://arxiv.org/abs/1409.0473 based on a Multi-Layer Perceptron.
  
  The attention score between position i in the encoder and position j in the
  decoder is:
  alpha_ij = V_a * tanh(W_ae * enc_i + W_ad * dec_j + b_a)
code: def __init__(self, decoder_hidden_state_dim, context_dim, **kwargs):
      super().__init__(decoder_hidden_state_dim, context_dim)
  
      self.context_dim = context_dim
      self.attention_dim = kwargs.get("attention_dim", context_dim)
      # W_ae and b_a
      self.encoder_proj = Linear(
          context_dim, self.attention_dim, bias=True
      )
      # W_ad
      self.decoder_proj = Linear(
          decoder_hidden_state_dim, self.attention_dim, bias=False
      )
      # V_a
      self.to_scores = Linear(self.attention_dim, 1, bias=False)
      self.src_length_masking = kwargs.get("src_length_masking", True)
  
file_path: translate/pytorch_translate/attention/mlp_attention.py
imports: import numpy
  import torch
  import torch.nn.functional
  from pytorch_translate.attention import attention_utils, BaseAttention, register_attention
  from pytorch_translate.common_layers import Linear
label_desc: Use image node_id 1 to create a new MLPAttention object from inherited base classes: BaseAttention with example: obj = MLPAttention(decoder_hidden_state_dim, context_dim)