When you initialize the optimizer using
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

or similar, pytorch creates one param_group. The learning rate is accessible via param_group['lr'] and the list of parameters is accessible via param_group['params']
If you want different learning rates for different parameters, you can initialise the optimizer like this.
optim.SGD([
                {'params': model.base.parameters()},
                {'params': model.classifier.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)

This creates two parameter groups with different learning rates. That is the reason for having param_groups.
You might find reading the source for SGD to be useful. http://pytorch.org/docs/0.3.1/_modules/torch/optim/sgd.html#SGD 248