Arquitectura de BertModel:
Tome bert-base-chino como ejemplo:
model = BertModel.from_pretrained("../model/bert-base-chinese")
Parámetros del modelo estadístico:
# 参数量的统计
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 lo anterior se puede ver que:
La proporción de la capa de incrustación es 0.16254008305735163
Parte del codificador del codificador contabilizada 0.8316849528014959
Capa de pooler contabilizada 0.005774964141152439
Parámetros totales: 102267648
Análisis del valor de retorno:
La documentación sobre BertModel es la siguiente:
BERT Estamos en un viaje para avanzar y democratizar la inteligencia artificial a través del código abierto y la ciencia abierta. https://huggingface.co/docs/transformers/main/en/model_doc/bert#transformers.BertModel explica en detalle el progreso aquí:
Se deben devolver last_hidden_state y pooler_output, y hidden_state se devuelve cuando se establece el modelo output_hidden_states=True
o config.output_hidden_states=True .
Déjame explicarte aquí:
La longitud de las salidas es 3:
# salidas[0] == último_estado_oculto: (tamaño_de_lote, longitud_de_secuencia, tamaño_oculto)
# salidas[1] == pooler_output : (batch_size, hidden_size)
# salidas[2] == estado_oculto: (tamaño_de_lote, longitud_de_secuencia, tamaño_oculto)
Como se puede ver en la figura anterior:
modelo.incrustaciones(entrada_tensor) == salidas[2][0]