如何使用bert做word embedding

调研目的:如何使用第三方库快速对数据进行预训练,得到embedding

 知乎一: 请问如何用nlp预训练模型做word embedding ,如bert怎么提取出embedding?

作者(香港大学)马东什么:
  不同预训练模型的embedding机制不一样,word2vec glove fasttext 都是直接查词得到embedding,bert 直接取最后一层的输出,elmo更灵活了 可以取embedding和lstm层的输出的平均 concat或者顶层lstm的输出。提取出embedding之后 将这些embedding与其它特征concat即可

作者Sirius:
  主流的BERT包,经典的是google-research/bert;另外,这个也很好用huggingface/transformers,是从pytorch-pretrained-bert进化过来的。BERT Word Embeddings Tutorial(英文)

作者天生smile
  超出我的理解能力,解释了源码。项目太复杂:实体识别NER、金融图谱塔建、seq2seq。但bert的没有代码。

作者风吹草地
  pytorch-pretrained-bert简单使用,没有训练,直接输入一句话,得到这句话的embedding。

作者iterate7
   bert进行embedding。BertModel.from_pretrained也是拿训练好的

作者captainqxy
  使用transformers从头训练Bert。pytorch版

 知乎二: 为什么 Bert 的三个 Embedding 可以进行相加?

Token Embedding、Segment Embedding、Position Embedding的意义我已经清楚了,但是这三个向量为什么可以相加呢?相加后向量的大小和方向就变了,语义不就变了吗?

调研结果:

我的目的是为知识追踪的Question进行预训练,得到Question的embedding,充分表达Question的语义。我的训练集像NLP一样,一句句话。因为我的词不是中文,没有已经训练好的参数。只能从头开始训练。而且训练中文的bert模型都是几十层的,我这个小型数据集是不适合的。结果:手写实现一层Transformer的encoder。
理解了Transformer的话,其实就那几个部分。不必使用人家的第三方函数库。

不过走NLP方向,肯定也要熟悉怎么使用第三方库。
TensorFlow的话可以使用bert4keras苏剑林大神的,他还有自己的qq群
pytorch的话,就上面参考资料。

实验结果

知识追踪的语料,虽然是序列是question id,就好比人说的每句话,我们从序列中,希望的到question与Question之间的某些关系,相似的question的embedding距离较近。结果表明,训练的loss一直不降,维持在5~7左右。而且训练好的embedding还没skip-gram的好。经分析和推断
(1)question序列中,较远的题目没有很强的联系。
(2)question序列中,没有位置关系,因为他是从无向图graph中取样的。无向图取样比较随意。Q1-C1-Q2-C1-Q3-C1-Q2(元路径Q-C-Q的局限性)
(3)question之间的联系并没有中文中“我”跟“爱”的联系强。skip-gram就只用判断2个question是否相似。skip-gram有负样本,不用计算softmax。
(4)bert是预测mask掉的词,gpt是预测下一个词,哪个形式好呢?

你可能感兴趣的:(知识追踪,深度学习)