Hybrid_forward implicit input argument and difference between params and _reg_params?

Hi, as far as I understand as I read through the python source code roughly, the way how hybrid_forward works is that it takes all the inputs from forward(), and then also takes the parameter values stored in self._reg_params. Is there a reason why it is designed this way, as the implicitly fed input arguments from self._reg_params would confuse people a little bit in some cases?

Also, since model.params stores the model level parameters already, what is the use of model._reg_params? I tried to register some parameters using model.params.get(), and found that this would only change model.params but not model._reg_params. On the other hand, by directly setting model.attr=value would change model._reg_params but not model.params. So what is the difference between these two and what are their use cases, respectively?