[Config, Serialization] more readable config serialization
Author: patrickvonplaten
Pull request: yes

Given the discussion in PR: #3433, we want to make the serialized model conf more readable. 

### Problem:

E.g. `bert-base-cased` has the following config on S3:
```
{
  "architectures": [
    "BertForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "max_position_embeddings": 512,
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  "type_vocab_size": 2,
  "vocab_size": 28996
}
```

But when saved all default params are saved as well (which is unnecessary):

```
{
  "architectures": [
    "BertForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "max_position_embeddings": 512,
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  "type_vocab_size": 2,
  "vocab_size": 28996
}
(which is readable imo) and once it's saved it now looks like this:

{
  "_num_labels": 2,
  "architectures": [
    "BertForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "bos_token_id": null,
  "do_sample": false,
  "early_stopping": false,
  "eos_token_id": null,
  "finetuning_task": null,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "id2label": {
    "0": "LABEL_0",
    "1": "LABEL_1"
  },
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "is_decoder": false,
  "is_encoder_decoder": false,
  "label2id": {
    "LABEL_0": 0,
    "LABEL_1": 1
  },
  "layer_norm_eps": 1e-12,
  "length_penalty": 1.0,
  "max_length": 20,
  "max_position_embeddings": 512,
  "min_length": 0,
  "model_type": "bert",
  "no_repeat_ngram_size": 0,
  "num_attention_heads": 12,
  "num_beams": 1,
  "num_hidden_layers": 12,
  "num_return_sequences": 1,
  "output_attentions": false,
  "output_hidden_states": false,
  "output_past": true,
  "pad_token_id": 0,
  "pruned_heads": {},
  "repetition_penalty": 1.0,
  "temperature": 1.0,
  "top_k": 50,
  "top_p": 1.0,
  "torchscript": false,
  "type_vocab_size": 2,
  "use_bfloat16": false,
  "vocab_size": 28996
} 
```

### Solution: 

We should only save the difference of the actual config to either **v1**) to the model class' config or **v2**) to the PretrainedConfig() (which contains most of the unnecessary default params). 

This PR implements either **v1**) or **v2**) - up for discussion! 

**v1**) for `bert-base-cased` would look like this:

```
{
  "architectures": [
    "BertForMaskedLM"
  ],
  "vocab_size": 28996
}
```

**v2**) for `bert-base-cased` would look like this:

```
{
  "architectures": [
    "BertForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "layer_norm_eps": 1e-12,
  "max_position_embeddings": 512,
  "model_type": "bert",
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  "pad_token_id": 0,
  "type_vocab_size": 2,
  "vocab_size": 28996
}
```


Comments:
I would prefer **v2**) because the parameters saved in each of the model configuration files are important for the models behavior and would be nice to see in the config (also to compare to other models' configs)

Need to look into it more but on principle this is very nice. (If Configs were `dataclass`-backed it would be even cleaner to implement – might be too big of a change though)

I agree that v2 is probably better, but will think about it some more.

For config hosted on our S3, what should we do? Update the official ones, but not the user-uploaded ones? Or just do all of them? :)

I would update all of them by downloading, save_pretrained() and upload. I already a very similar script I would only need to adapt a tiny bit

Does this impact the process for changing the default config?

Sounds good!

Ok, **v2** is now implemented. I agree with @julien-c that the `save_pretrained() `method should be kept as clean as possible and I think we can keep backward compatibility (for very special edge cases) by allowing a boolean argument to the `to_json_file()` method.  

Awesome, merging this