Open MrSworder opened 2 years ago
embedding_size等于hidden_size时,为什么还要多此一举加个mapping层?显存太多了?
embedding_size等于hidden_size时,为什么还要多此一举加个mapping层?显存太多了?
我对embedding_size和hidden_size的理解可能有误,我理解的embedding_size是用来每一个输入字符的编码的维度大小,hidden_size是每一个注意力负责学习的维度大小,mapping层是将每个注意力头组合起来生成embedding吗?(事实上我也不知道对模型结构我有多少理解了有多少没理解,请问我该如何比较全面的了解模型结构呢,就是模型训练过程和使用时各个结构的作用和使用方法?)
embedding_size等于hidden_size时,为什么还要多此一举加个mapping层?显存太多了? 请问 embedding_size==hidden_size时,例如加载已有的electra_base,用bert4keras该怎么加载?bert4keras里面用到的load_weight_from_checkpoint()里面时用mapping一层一层读的,但是没有embedding-mapping层报错了。
embedding_size等于hidden_size时,为什么还要多此一举加个mapping层?显存太多了?
我认为我家在electra_base的问题是在models.py中这两个地方出现了差错, transformer = MODEL(configs) transformer.build(configs) 前一句用的是构建了ELECTRA的结构,是有Embedding-Mapping层的,后一句build()中,有一句outputs = self.prepare_embeddings(outputs) 这里的prepare_embeddings()调用的是BERT类中的函数,在这个函数中没有为hidden_size==embedding_size的函数设置Embedding_mapping层。因此在load_weights_from_checkpoint()的时候,遍历了electra的variable_mapping,在这里的layer=self.layers[layer]出现了keyError。 (我用的是bert4keras-0.6.4版本)
怎么隔了半年又冒出这个问题...
Embedding-Mapping 是用来对齐维度的,如果hidden_size==embedding_size,这个操作就是多此一举,浪费算力,这是非常显然成立的事情。所以hidden_size==embedding_size时不会存在Embedding-Mapping层,加载权重时会自动将它排除在外,所以也不会报错。
另外,任何时刻都只推荐用最新版bert4keras,0.6.4这么老的版本,还是尽早同步到最新版吧。不排除旧版本确实有“雷”。
另外 def variable_mapping(self): """映射到官方BERT权重格式 """ mapping = { 'Embedding-Token': ['bert/embeddings/word_embeddings'], 'Embedding-Segment': ['bert/embeddings/token_type_embeddings'], 'Embedding-Position': ['bert/embeddings/position_embeddings'], 'Embedding-Norm': [ 'bert/embeddings/LayerNorm/beta', 'bert/embeddings/LayerNorm/gamma', ], 'Embedding-Mapping': [#!!!!!!!!!!!!!!!!!!!!! 'bert/encoder/embedding_hidden_mapping_in/kernel', 'bert/encoder/embedding_hidden_mapping_in/bias', ], 'Pooler-Dense': [ 'bert/pooler/dense/kernel', 'bert/pooler/dense/bias', ], 'NSP-Proba': [ 'cls/seq_relationship/output_weights', 'cls/seq_relationship/output_bias', ], 'MLM-Dense': [ 'cls/predictions/transform/dense/kernel', 'cls/predictions/transform/dense/bias', ], 'MLM-Norm': [ 'cls/predictions/transform/LayerNorm/beta', 'cls/predictions/transform/LayerNorm/gamma', ], 'MLM-Proba': ['cls/predictions/output_bias'], }
在embedding_size==hidden_size时,prepare_embedding就缺少了Embedding-Mapping层,这是为什么