class_docstr: CTC-attention hybrid Encoder-Decoder model
class_docstr_tok: ["CTC-attention","hybrid","Encoder-Decoder","model"]
docstr: Compute negative log likelihood(nll) from transformer-decoder
  
  Normally, this function is called in batchify_nll.
  
  Args:
      encoder_out: (Batch, Length, Dim)
      encoder_out_lens: (Batch,)
      ys_pad: (Batch, Length)
      ys_pad_lens: (Batch,)
docstr_tok: ["Compute","negative","log","likelihood","(","nll",")","from","transformer-decoder","Normally",",","this","function","is","called","in","batchify_nll",".","Args",":","encoder_out",":","(","Batch",",","Length",",","Dim",")","encoder_out_lens",":","(","Batch",",",")","ys_pad",":","(","Batch",",","Length",")","ys_pad_lens",":","(","Batch",",",")"]
code: def nll(
      self,
      encoder_out: torch.Tensor,
      encoder_out_lens: torch.Tensor,
      ys_pad: torch.Tensor,
      ys_pad_lens: torch.Tensor,
  ) -> torch.Tensor:
      """Compute negative log likelihood(nll) from transformer-decoder
  
      Normally, this function is called in batchify_nll.
  
      Args:
          encoder_out: (Batch, Length, Dim)
          encoder_out_lens: (Batch,)
          ys_pad: (Batch, Length)
          ys_pad_lens: (Batch,)
      """
      ys_in_pad, ys_out_pad = add_sos_eos(
          ys_pad, self.sos, self.eos, self.ignore_id
      )
      ys_in_lens = ys_pad_lens + 1
  
      # 1. Forward decoder
      decoder_out, _ = self.decoder(
          encoder_out, encoder_out_lens, ys_in_pad, ys_in_lens
      )  # [batch, seqlen, dim]
      batch_size = decoder_out.size(0)
      decoder_num_class = decoder_out.size(2)
      # nll: negative log-likelihood
      nll = torch.nn.functional.cross_entropy(
          decoder_out.view(-1, decoder_num_class),
          ys_out_pad.view(-1),
          ignore_index=self.ignore_id,
          reduction="none",
      )
      nll = nll.view(batch_size, -1)
      nll = nll.sum(dim=1)
      assert nll.size(0) == batch_size
      return nll
  
imports: import logging
  from contextlib import contextmanager
  from typing import Dict, List, Optional, Tuple, Union
  import torch
  from packaging.version import parse
  from typeguard import check_argument_types
  from espnet2.asr.ctc import CTC
  from espnet2.asr.decoder.abs_decoder import AbsDecoder
  from espnet2.asr.encoder.abs_encoder import AbsEncoder
  from espnet2.asr.frontend.abs_frontend import AbsFrontend
  from espnet2.asr.postencoder.abs_postencoder import AbsPostEncoder
  from espnet2.asr.preencoder.abs_preencoder import AbsPreEncoder
  from espnet2.asr.specaug.abs_specaug import AbsSpecAug
  from espnet2.asr.transducer.error_calculator import ErrorCalculatorTransducer
  from espnet2.asr_transducer.utils import get_transducer_task_io
  from espnet2.layers.abs_normalize import AbsNormalize
  from espnet2.torch_utils.device_funcs import force_gatherable
  from espnet2.train.abs_espnet_model import AbsESPnetModel
  from espnet.nets.e2e_asr_common import ErrorCalculator
  from espnet.nets.pytorch_backend.nets_utils import th_accuracy
  from espnet.nets.pytorch_backend.transformer.add_sos_eos import add_sos_eos
  from espnet.nets.pytorch_backend.transformer.label_smoothing_loss import LabelSmoothingLoss
label_desc: Use image node_id 6 for calling the ESPnetASRModel obj's underlying member method code with example usage: obj.nll(encoder_out, encoder_out_lens, ys_pad, ys_pad_lens) and returns: nll