code: def intrinsic_attention(self, text:str, class_id:int=None):
          
          self.model.train()
          _eval_dropouts(self.model)
          self.model.zero_grad()
          self.model.reset()
          ids = self.data.one_item(text)[0]
          emb = self.model[0].module.encoder(ids).detach().requires_grad_(True)
          lstm_output = self.model[0].module(emb, from_embeddings=True)
          self.model.eval()
          cl = self.model[1](lstm_output + (torch.zeros_like(ids).byte(),))[0].softmax(dim=-1)
          if class_id is None: class_id = cl.argmax()
          cl[0][class_id].backward()
          attn = emb.grad.squeeze().abs().sum(dim=-1)
          attn /= attn.max()
          tokens = self.data.single_ds.reconstruct(ids[0])
          return tokens, attn
docs: Calculate the intrinsic attention of the input w.r.t to an output `class_id`, or the classification given by the model if `None`.
          For reference, see the Sequential Jacobian session at https://www.cs.toronto.edu/~graves/preprint.pdf