Architecture de BertModel :
Prenons l'exemple de bert-base-chinese :
model = BertModel.from_pretrained("../model/bert-base-chinese")
Paramètres du modèle statistique :
# 参数量的统计
total_params = 0 # 模型总的参数量
total_learnable_params = 0 # 可学习的参数量
total_embedding_params = 0 # embeddings 层的参数量
total_encoder_params = 0 # Encoder编码器部分的参数量
total_pooler_params = 0
for name , param in model.named_parameters():
print(name , "->" , param.shape)
if param.requires_grad:
total_learnable_params += param.numel()
if "embedding" in name :
total_embedding_params += param.numel()
if "encoder" in name :
total_encoder_params += param.numel()
if "pooler" in name :
total_pooler_params += param.numel()
total_params += param.numel()
De ce qui précède, on peut voir que :
La proportion de la couche d'enrobage est de 0,16254008305735163
La partie codeur de l'encodeur représentait 0,8316849528014959
La couche Pooler représentait 0,005774964141152439
Paramètres totaux : 102267648
Analyse de la valeur de retour :
La documentation sur BertModel est la suivante :
BERT Nous sommes en train de faire progresser et de démocratiser l'intelligence artificielle grâce à l'open source et à la science ouverte. https://huggingface.co/docs/transformers/main/en/model_doc/bert#transformers.BertModel explique en détail les progrès ici :
last_hidden_state et pooler_output doivent être renvoyés, et hidden_state est renvoyé lorsque le modèle est défini output_hidden_states=True
ou config.output_hidden_states=True .
Laissez-moi vous expliquer ici :
La longueur des sorties est de 3 :
# sorties[0] == last_hidden_state : (batch_size, sequence_length, hidden_size)
# outputs[1] == pooler_output : (batch_size, hidden_size)
# sorties[2] == état_caché : (taille_batch, longueur_séquence, taille_cachée)
Comme on peut le voir sur la figure ci-dessus :
model.embeddings(input_tensor) == sorties[2][0]