tokenizer object incorrectly modified in PreTrainedTokenizerFast.train_new_from_iterator() 
Author: dctelus
Pull request: no
Labels: name: bug

### System Info

```shell
- `transformers` version: 4.19.2
- Platform: Linux-5.10.16.3-microsoft-standard-WSL2-x86_64-with-glibc2.29
- Python version: 3.8.10
- Huggingface_hub version: 0.6.0
- PyTorch version (GPU?): 1.11.0+cu102 (False)
- 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?

@SaulLu

### 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

Steps to reproduce this behavior:

1) Create a tokenizer object from `tokenizers.implementations.ByteLevelBPETokenizer()`
2) Instanciate a PreTrainedTokenizer with it (`PreTrainedTokenizerFast.__init__(tokenizer_object=tokenizer)`)
3) Train the model using `PreTrainedTokenizer.train_new_from_iterator()`
4) Encode a token not found in the training set
5) Notice that the tokenized string has a unk token (or nothing) instead of the token

See this example:

```
import tokenizers
import transformers
tokenizer = tokenizers.implementations.ByteLevelBPETokenizer()
tokenizer_fast = transformers.PreTrainedTokenizerFast(tokenizer_object=tokenizer).train_new_from_iterator(text_iterator=["a" for _ in range(1000)], length=1000, vocab_size=5000)

## {'input_ids': [0], 'token_type_ids': [0], 'attention_mask': [1]}
print(tokenizer_fast("ab"))
```

This is because in `tokenization_utils_fast.py`, in `PreTrainedTokenizer.train_new_from_iterator`, the following code snippet ignores the class of the tokenizer_object that was passed inside the `__init__`:
```
print(type(self._tokenizer)) # <class 'tokenizers.implementations.byte_level_bpe.ByteLevelBPETokenizer'>
tokenizer = TokenizerFast.from_str(json.dumps(tokenizer_json))
print(type(tokenizer)) # <class 'tokenizers.Tokenizer'
```

And the `ByteLevelBPETokenizer` has a custom `train_from_iterator` which provides an initial_alphabet.

This issue does not arise if using only the `tokenizers` library for training:

```
import tokenizers
import transformers

tokenizer = tokenizers.implementations.ByteLevelBPETokenizer()
tokenizer.train_from_iterator(iterator=["a" for _ in range(1000)], length=1000, vocab_size=5000)
tokenizer_fast = transformers.PreTrainedTokenizerFast(tokenizer_object=tokenizer)

## {'input_ids': [64, 65], 'token_type_ids': [0, 0], 'attention_mask': [1, 1]}
print(tokenizer_fast("ab"))
```

### Expected behavior

I would expect the transformer library to use the tokenizer_object's train_from_iterator, even if that object is from a specific implementation. This is currently fixable on my side by providing **kwargs to train_new_from_iterator to emulate what the `ByteLevelBPETokenizer` is doing, but is something I expect the library to handle by itself.

Comments:
Maybe also cc @Narsil