in drqa/reader/model.py [0:0]
def update(self, ex):
"""Forward a batch of examples; step the optimizer to update weights."""
if not self.optimizer:
raise RuntimeError('No optimizer set.')
# Train mode
self.network.train()
# Transfer to GPU
if self.use_cuda:
inputs = [e if e is None else e.cuda(non_blocking=True)
for e in ex[:5]]
target_s = ex[5].cuda(non_blocking=True)
target_e = ex[6].cuda(non_blocking=True)
else:
inputs = [e if e is None else e for e in ex[:5]]
target_s = ex[5]
target_e = ex[6]
# Run forward
score_s, score_e = self.network(*inputs)
# Compute loss and accuracies
loss = F.nll_loss(score_s, target_s) + F.nll_loss(score_e, target_e)
# Clear gradients and run backward
self.optimizer.zero_grad()
loss.backward()
# Clip gradients
torch.nn.utils.clip_grad_norm_(self.network.parameters(),
self.args.grad_clipping)
# Update parameters
self.optimizer.step()
self.updates += 1
# Reset any partially fixed parameters (e.g. rare words)
self.reset_parameters()
return loss.item(), ex[0].size(0)