For some reason, I want to modify the linear layer inside BartForConditionalGeneration. Therefore, I use a BartModel with Linear just like BartForConditionalGeneration. The Performance has a large drop-down when using BartModel with Linear. It’s so strange  
For same training and evaluation data:
BartForConditionalGeneration
{'Bleu_1': 0.3756316307557612, 'Bleu_2': 0.2187763449001214, 'Bleu_3': 0.14257622050968358, 'Bleu_4': 0.09772224033332834, 'ROUGE_L': 0.31379157899331667, 'CIDEr': 0.2487453519966872}
BartModel with Linear
{'Bleu_1': 0.28135212418299216, 'Bleu_2': 0.039374791862140796, 'Bleu_3': 5.7869382968790495e-08, 'Bleu_4': 9.583990840791874e-11, 'ROUGE_L': 0.13023605134624447, 'CIDEr': 0.012828799693149772}
Here is my code
BartForConditionalGeneration 8
BartModel with Linear 4
Some trial and notes for your reference:

use set_output_embeddings to replace linear layer - dropdown
tie linear weight with BartModel.shared weight - dropdown
re-init linear weight with config.std and 0 mean  - dropdown
clone BartModel.shared weight  to linear weight - dropdown
add bias or remove bias - dropdown
extend BartForConditionalGeneration and rename lm_head model - dropdown
use different seq2seq models (t5) - dropdown