`add_bos_token` cannot properly control OPT tokenizer
Author: soheeyang
Pull request: no

### System Info

- `transformers` version: 4.32.1
- Platform: Linux-5.15.0-1027-gcp-x86_64-with-glibc2.31
- Python version: 3.9.17
- Huggingface_hub version: 0.16.4
- Safetensors version: 0.3.3
- Accelerate version: 0.22.0
- Accelerate config:    not found
- PyTorch version (GPU?): 2.0.1+cu117 (True)
- Tensorflow version (GPU?): not installed (NA)
- Flax version (CPU?/GPU?/TPU?): not installed (NA)
- Jax version: not installed
- JaxLib version: not installed
- Using GPU in script?: no
- Using distributed or parallel set-up in script?: no

### Who can help?

@ArthurZucker

The behaviour of OPT tokenizers becomes different according to how `add_bos_token` is set. 

If `add_bos_token=False` is given when the tokenizer is initialised, bos token is not added to the tokenized outputs.
```
tokenizer = AutoTokenizer.from_pretrained(tokenizer_path, add_bos_token=False)
```

However, when `add_bos_token=False` is set after initialisation, bos token is still added to the tokenized outputs.
```python3
tokenizer = AutoTokenizer.from_pretrained(tokenizer_path)
tokenizer.add_bos_token = False
```

LLaMA tokenizers do not have this bug.

### Information

- [ ] The official example scripts
- [X] My own modified scripts

### Tasks

- [ ] An officially supported task in the `examples` folder (such as GLUE/SQuAD, ...)
- [X] My own task or dataset (give details below)

### Reproduction

```python3
from transformers import AutoTokenizer
LLAMA_PATH = ... # llama path must be set

for tokenizer_name, tokenizer_path in [
    ('gpt', 'gpt2'),
    ('llama', LLAMA_PATH),
    ('opt', 'facebook/opt-125m'),
]:
    tokenizer = AutoTokenizer.from_pretrained(tokenizer_path, add_bos_token=False)
    
    buggy_tokenizer = AutoTokenizer.from_pretrained(tokenizer_path)
    buggy_tokenizer.add_bos_token = False
    
    output = tokenizer('hello')['input_ids']
    buggy_output = buggy_tokenizer('hello')['input_ids']

    print(tokenizer_name, output, buggy_output)
```

### Buggy Behaviour
```
gpt [31373] [31373]
llama [22172] [22172]
opt [42891] [2, 42891]  # bug!
```

### Expected behavior
```
gpt [31373] [31373]
llama [22172] [22172]
opt [42891] [42891]
```

Comments:
Hey! Thanks for reporting, this is expected. The Fast tokenizers should have these parameters set by defaults. `Llama` is the only model for which we implemented the property `add_bos_token` that updates the tokenizer's `post_processor`. 

The philosophy behind `tokenizers` is that once a tokenizer is saved, we should not change it again, but rather re-convert it (which is what happends when you do from pretained with the argument `add_bos_token=False`). 

We could add a warning or raise an error when people try to set it, as it is not recommended. cc @Narsil as I am less rigid on the `tokenizers` philosophy 🤗 


Thank you so much for the clarification! I didn't know about the philosophy of freezing the behaviour of the tokenizer upon initialisation. I thought this was a bug because `tokenizer.add_bos_token` seemed like the attribute that one could use to dynamically control the behaviour. Warning/error sounds like a great solution.

Absolutely no worries 🤗 glad I could be of any help