docstr: Compute negative log likelihood(nll)
  
  Normally, this function is called in batchify_nll.
  Args:
      text: (Batch, Length)
      text_lengths: (Batch,)
      max_lengths: int
docstr_tok: ["Compute","negative","log","likelihood","(","nll",")","Normally",",","this","function","is","called","in","batchify_nll",".","Args",":","text",":","(","Batch",",","Length",")","text_lengths",":","(","Batch",",",")","max_lengths",":","int"]
code: def nll(
      self,
      text: torch.Tensor,
      text_lengths: torch.Tensor,
      max_length: Optional[int] = None,
  ) -> Tuple[torch.Tensor, torch.Tensor]:
      """Compute negative log likelihood(nll)
  
      Normally, this function is called in batchify_nll.
      Args:
          text: (Batch, Length)
          text_lengths: (Batch,)
          max_lengths: int
      """
      batch_size = text.size(0)
      # For data parallel
      if max_length is None:
          text = text[:, : text_lengths.max()]
      else:
          text = text[:, :max_length]
  
      # 1. Create a sentence pair like '<sos> w1 w2 w3' and 'w1 w2 w3 <eos>'
      # text: (Batch, Length) -> x, y: (Batch, Length + 1)
      x = F.pad(text, [1, 0], "constant", self.eos)
      t = F.pad(text, [0, 1], "constant", self.ignore_id)
      for i, l in enumerate(text_lengths):
          t[i, l] = self.sos
      x_lengths = text_lengths + 1
  
      # 2. Forward Language model
      # x: (Batch, Length) -> y: (Batch, Length, NVocab)
      y, _ = self.lm(x, None)
  
      # 3. Calc negative log likelihood
      # nll: (BxL,)
      nll = F.cross_entropy(
          y.view(-1, y.shape[-1]), t.view(-1), reduction="none"
      )
      # nll: (BxL,) -> (BxL,)
      if max_length is None:
          nll.masked_fill_(
              make_pad_mask(x_lengths).to(nll.device).view(-1), 0.0
          )
      else:
          nll.masked_fill_(
              make_pad_mask(x_lengths, maxlen=max_length + 1)
              .to(nll.device)
              .view(-1),
              0.0,
          )
      # nll: (BxL,) -> (B, L)
      nll = nll.view(batch_size, -1)
      return nll, x_lengths
  
file_path: espnet/espnet2/lm/espnet_model.py
imports: from typing import Dict, Optional, Tuple
  import torch
  import torch.nn.functional
  from typeguard import check_argument_types
  from espnet2.lm.abs_model import AbsLM
  from espnet2.torch_utils.device_funcs import force_gatherable
  from espnet2.train.abs_espnet_model import AbsESPnetModel
  from espnet.nets.pytorch_backend.nets_utils import make_pad_mask
label_desc: Use image node_id 2 for calling the ESPnetLanguageModel obj's underlying member method code with example usage: obj.nll(text, text_lengths, max_length) and returns: nll,  x_lengths