fastnlp / fastNLP

fastNLP: A Modularized and Extensible NLP Framework. Currently still in incubation.
https://gitee.com/fastnlp/fastNLP
Apache License 2.0
3.06k stars 450 forks source link

以BertEmbedding为基础进行上层应用训练,训练中更新bert参数的问题。 #269

Closed Reply1999 closed 4 years ago

Reply1999 commented 4 years ago

首先感谢你们的代码!

我现在想直接利用from fastNLP.embeddings import BertEmbedding来读入BertEmbedding模型,然后根据你们的教程搭建一个vocab,初始化self.embed = BertEmbedding(vocab, model_dir_or_name="en-base-uncased"),进而输入一个句子的中每个词在vocab中对应的index得到对应的embedding向量,然后在此基础上进行后续的语言应用的建模。

简单来讲,使用方式是否如同pytorch提供的nn.Embedding一样,有什么需要注意的吗?因为我利用上述方式简单搭建了一个baseline,但是并不能很好的收敛。

还望不吝赐教,谢谢!

xuyige commented 4 years ago

我们在tutorial里面提供了BertEmbedding的一个简要例子,见 https://fastnlp.readthedocs.io/zh/latest/tutorials/tutorial_3_embedding.html#part-v-bert-embedding

简单来说使用方式与torch.nn.Embedding类似,输入为[batch, seq_len]的LongTensor,输出为[batch, seq_len, embed_dim]的FloatTensor,如果include_cls_sep参数为True(默认为False)的话输出为[batch, seq_len + 2, embed_dim]

另外不能很好收敛可能有多种情况,除了BERT不适合对应任务以外,可能还有学习率过大、没有采用warmup等原因。

Reply1999 commented 4 years ago

感谢你们快速而细致的回复!

另外,BertEmbedding一定要从pre-trained里面选择一个配置参数进行初始化吗?有没有可能随机初始化进行训练,因为预训练好的参数可能存在数据取值范围与其他模块的初始化参数不匹配的问题,或者能否对pre-trained的权值进行一下处理?有什么需要注意的地方和约束吗?

xuyige commented 4 years ago

由于随机初始化的参数可能需要训练很久才会在下游任务当中收敛,因此在一般情况下我们不建议采用随机初始化进行训练。一般来说,其他模块如果是随机初始化的话,在下游任务数据集上进行微调时会与BERT互相适应,如果其他模块也是pre-train的话可能才需要一个变换来使得两者的结果可以被投影到同一个空间内。 一般来说,BERT的超参与优化方式可能与传统的LSTM有一点点区别,比如AdamW+warmup,学习率在2e-5, 3e-5, 5e-5这个数量级,等等,具体可以参照相关论文或者技术博客

logoutAgain commented 4 years ago

我们在tutorial里面提供了BertEmbedding的一个简要例子,见 https://fastnlp.readthedocs.io/zh/latest/tutorials/tutorial_3_embedding.html#part-v-bert-embedding

简单来说使用方式与torch.nn.Embedding类似,输入为[batch, seq_len]的LongTensor,输出为[batch, seq_len, embed_dim]的FloatTensor,如果include_cls_sep参数为True(默认为False)的话输出为[batch, seq_len + 2, embed_dim]

另外不能很好收敛可能有多种情况,除了BERT不适合对应任务以外,可能还有学习率过大、没有采用warmup等原因。

请问fastnlp中的BertEmbedding提供的是预训练后的embedding层的embedding还是经过上下文transformer后的各层的output?(因为看到能设置layers)或者是我对layer理解有误?

xuyige commented 4 years ago

我们在tutorial里面提供了BertEmbedding的一个简要例子,见 https://fastnlp.readthedocs.io/zh/latest/tutorials/tutorial_3_embedding.html#part-v-bert-embedding 简单来说使用方式与torch.nn.Embedding类似,输入为[batch, seq_len]的LongTensor,输出为[batch, seq_len, embed_dim]的FloatTensor,如果include_cls_sep参数为True(默认为False)的话输出为[batch, seq_len + 2, embed_dim] 另外不能很好收敛可能有多种情况,除了BERT不适合对应任务以外,可能还有学习率过大、没有采用warmup等原因。

请问fastnlp中的BertEmbedding提供的是预训练后的embedding层的embedding还是经过上下文transformer后的各层的output?(因为看到能设置layers)或者是我对layer理解有误?

经过transformers后各层的output,在BertEmbedding当中我们不支持【仅仅通过了embedding层的embedding】

logoutAgain commented 4 years ago

我们在tutorial里面提供了BertEmbedding的一个简要例子,见 https://fastnlp.readthedocs.io/zh/latest/tutorials/tutorial_3_embedding.html#part-v-bert-embedding 简单来说使用方式与torch.nn.Embedding类似,输入为[batch, seq_len]的LongTensor,输出为[batch, seq_len, embed_dim]的FloatTensor,如果include_cls_sep参数为True(默认为False)的话输出为[batch, seq_len + 2, embed_dim] 另外不能很好收敛可能有多种情况,除了BERT不适合对应任务以外,可能还有学习率过大、没有采用warmup等原因。

请问fastnlp中的BertEmbedding提供的是预训练后的embedding层的embedding还是经过上下文transformer后的各层的output?(因为看到能设置layers)或者是我对layer理解有误?

经过transformers后各层的output,在BertEmbedding当中我们不支持【仅仅通过了embedding层的embedding】

thx~~