You could check, if the parameters are updated using the current approach, as I’m not sure if your approach of using the state_dict to separate the weight and bias parameters would work.
Directly accessing the parameters would work:
weight_list = [p for n, p in model.named_parameters() if 'weight' in n]
bias_list = [p for n, p in model.named_parameters() if 'bias' in n]

Besides that you are using two weight decay approaches via the optimizer as well as your custom regularization so you should also check if you want to remove the regularization usage.