def METHOD_NAME(self, batch_shape=torch.Size([3])):
    data = self.create_batch_test_data(batch_shape)
    likelihood, labels = self.create_batch_likelihood_and_labels(batch_shape)
    model = self.create_model(data, labels, likelihood)
    mll = gpytorch.mlls.VariationalELBO(likelihood, model, num_data=labels.size(-1))
    model.train()
    likelihood.train()
    # We'll just do one step of gradient descent to mix up the params a bit
    optimizer = torch.optim.Adam([{"params": model.parameters()}, {"params": likelihood.parameters()}], lr=0.01)
    output = model(data)
    loss = -mll(output, labels).sum()
    loss.backward()
    optimizer.step()
    optimizer.zero_grad()
    output = model(data)
    loss = -mll(output, labels).sum()
    loss.backward()
    for _, param in model.named_parameters():
        self.assertTrue(param.grad is not None)
        self.assertGreater(param.grad.norm().item(), 0)
    for _, param in likelihood.named_parameters():
        self.assertTrue(param.grad is not None)
        self.assertGreater(param.grad.norm().item(), 0)
    optimizer.step()