Python 如何在网页上训练我自己的自定义单词嵌入?
我在多个网页上有大量关于我想向客户销售的产品的文本数据。我尝试使用在维基百科上训练过的预先训练过的fasttext单词嵌入,但在分类任务中并没有给我带来好的结果。可能是因为网站上的文本数据包含很多技术细节,并且与维基百科中的文本数据不同。所以我想做一些单词嵌入的迁移学习,以预先训练好的快速文本单词嵌入为基础 如何使用Keras在这些网页上训练自己的自定义单词嵌入? 如何使用fasttext预先训练的嵌入和训练初始化自定义单词嵌入?这个初始化真的有助于更好地嵌入单词吗? 我更喜欢使用Keras来训练单词嵌入的解决方案。 我知道嵌入有trainable=True选项,但不确定如何使用它Python 如何在网页上训练我自己的自定义单词嵌入?,python,tensorflow,keras,deep-learning,nlp,Python,Tensorflow,Keras,Deep Learning,Nlp,我在多个网页上有大量关于我想向客户销售的产品的文本数据。我尝试使用在维基百科上训练过的预先训练过的fasttext单词嵌入,但在分类任务中并没有给我带来好的结果。可能是因为网站上的文本数据包含很多技术细节,并且与维基百科中的文本数据不同。所以我想做一些单词嵌入的迁移学习,以预先训练好的快速文本单词嵌入为基础 如何使用Keras在这些网页上训练自己的自定义单词嵌入? 如何使用fasttext预先训练的嵌入和训练初始化自定义单词嵌入?这个初始化真的有助于更好地嵌入单词吗? 我更喜欢使用Keras来训
Embedding(voc_size, emb_dim, weights=[embedding_matrix], input_length, trainable=True)
该Keras或Gensim推荐哪种框架?为什么
要仅进行训练,必须在嵌入层中将可训练标志设置为True。但他会从一开始就训练-
为了初始化矩阵,你可以使用你所考虑的,你有
这里举一个例子:
哪里
谷歌使用了300个否定词,也只使用了
它们是从原始矩阵中使用的。在嵌入构造函数类权重=[…]中使用权重参数。这个矩阵的大小应该是嵌入的字数x维数。
在Keras中,任何具有参数的层都可以训练或不训练。
当您仅希望训练仅完全连接的层子集等以避免参数爆炸时,此标志非常有用
当设置为可培训=真时:
如果该层位于网络的中间,则仅传播该层。
输入梯度,但不更正任何权重。
如果该层是网络的第一层,则不会传播任何梯度。
例如,在嵌入层的情况下,您可以将该层初始化为默认嵌入矩阵gensim Gooogle300Negative
当你激活这个层中的可训练的时候,你会为Keras提供点阵布兰奇来调整你的嵌入。这也意味着必须优化更多的参数
在某些情况下,由于涉及成本或需要保存,对修改初始嵌入没有兴趣
编辑:
该任务对应于Keras内部的Tensorflow。但这一原则并不取决于框架,而只取决于理论。
定义trainable=false时,表示不应更新权重
这意味着中间层必须只计算相对于输入的梯度,因为其中一个权重是无用的,仅当它们被计算时,什么也得不到,并且可训练标志将不存在。因为梯度必须继续传播,所以它们相对于入口进行计算
第一层还具有特殊性,即输入是您的数据,因此无需继续传播,因此如果trainable=false,则无需执行任何操作
在Tensorflow中,可训练标志将变量添加或不添加到GraphKeys.trainable_VARIABLES集合中,这样就可以考虑它们,也可以不考虑它们
要仅进行训练,必须在嵌入层中将可训练标志设置为True。但他会从一开始就训练-
为了初始化矩阵,你可以使用你所考虑的,你有
这里举一个例子:
哪里
谷歌使用了300个否定词,也只使用了
它们是从原始矩阵中使用的。在嵌入构造函数类权重=[…]中使用权重参数。这个矩阵的大小应该是嵌入的字数x维数。
在Keras中,任何具有参数的层都可以训练或不训练。
当您仅希望训练仅完全连接的层子集等以避免参数爆炸时,此标志非常有用
当设置为可培训=真时:
如果该层位于网络的中间,则仅传播该层。
输入梯度,但不更正任何权重。
如果该层是网络的第一层,则不会传播任何梯度。
例如,在嵌入层的情况下,您可以将该层初始化为默认嵌入矩阵gensim Gooogle300Negative
当你激活这个层中的可训练的时候,你会为Keras提供点阵布兰奇来调整你的嵌入。这也意味着必须优化更多的参数
在某些情况下,由于涉及成本或需要保存,对修改初始嵌入没有兴趣
编辑:
该任务对应于Keras内部的Tensorflow。但这一原则并不取决于框架,而只取决于理论。
定义trainable=false时,表示不应更新权重
这意味着中间层必须只进行校准
计算相对于输入的梯度,因为其中一个权重是无用的,仅当它们被计算时,不会获得任何结果,并且不存在可训练标志。因为梯度必须继续传播,所以它们相对于入口进行计算
第一层还具有特殊性,即输入是您的数据,因此无需继续传播,因此如果trainable=false,则无需执行任何操作
在Tensorflow中,可训练标志将变量添加或不添加到GraphKeys.trainable_VARIABLES集合中,这样就可以考虑它们,也可以不考虑它们 我建议您使用fastText的gensim实现来训练您自己的单词嵌入。这应该比您自己的Keras实现更简单、更快。您可以从加载预训练模型开始,然后使用自己的数据继续训练
from gensim.models import FastText
model = FastText.load_fasttext_format('cc.en.300.bin')
data = [['Hello', 'world'], ...] # Your own training data, a list of sentences
model.build_vocab(data, update=True)
model.train(sentences=data,
total_examples=model.corpus_count,
epochs=5)
编辑:如果您想在Keras中实现您自己的模型,您确实可以使用嵌入层trainable=True,这是您建议的默认行为 我建议您使用fastText的gensim实现来训练您自己的单词嵌入。这应该比您自己的Keras实现更简单、更快。您可以从加载预训练模型开始,然后使用自己的数据继续训练
from gensim.models import FastText
model = FastText.load_fasttext_format('cc.en.300.bin')
data = [['Hello', 'world'], ...] # Your own training data, a list of sentences
model.build_vocab(data, update=True)
model.train(sentences=data,
total_examples=model.corpus_count,
epochs=5)
编辑:如果您想在Keras中实现您自己的模型,您确实可以使用嵌入层trainable=True,这是您建议的默认行为 +1那么这段代码实际上是在根据新的训练数据更新预训练的fasttext嵌入的权重?是的。如果你有很多数据,你也可以尝试从头开始训练你自己的模型。你的意思是说,除非我使用tensorlfow开发自己的实现,否则Keras在默认情况下没有用于训练自定义单词嵌入的类似功能吗?为什么EmbeddedinTrainable=True不起作用?Keras也可以使用您建议的嵌入层。但是,您需要对数据进行更多的预处理,因为您不能像在Gensim中那样只传入一个单词列表。您需要将每个单词编码为整数索引。此外,您需要创建共享相同上下文以及随机对的单词对,然后在嵌入层的顶部创建一个分类器来区分差异。我曾尝试用Keras和Gensim来训练我自己的嵌入,Gensim的实现速度更快,实际上在我的例子中也提供了更好的嵌入。我认为这在line model.build_vocabdata,update=True中有所涉及。但我自己并没有尝试过,我只是尝试从头开始训练。+1所以这段代码实际上是在根据新的训练数据更新预训练的fasttext嵌入的权重?是的,没错。如果你有很多数据,你也可以尝试从头开始训练你自己的模型。你的意思是说,除非我使用tensorlfow开发自己的实现,否则Keras在默认情况下没有用于训练自定义单词嵌入的类似功能吗?为什么EmbeddedinTrainable=True不起作用?Keras也可以使用您建议的嵌入层。但是,您需要对数据进行更多的预处理,因为您不能像在Gensim中那样只传入一个单词列表。您需要将每个单词编码为整数索引。此外,您需要创建共享相同上下文以及随机对的单词对,然后在嵌入层的顶部创建一个分类器来区分差异。我曾尝试用Keras和Gensim来训练我自己的嵌入,Gensim的实现速度更快,实际上在我的例子中也提供了更好的嵌入。我认为这在line model.build_vocabdata,update=True中有所涉及。但我自己并没有试过,我只是从零开始训练。当你设置为可训练的=真的时,你能详细说明下面的内容吗?如果这个层在网络的中间,这只会传播输入梯度,但不能纠正任何重量。如果该层是网络的第一层,则不会传播任何梯度。是否有任何keras文档支持此规则?我已更新了答案。如果你注意到在这两种情况下的行为是相同的,第一层永远不会传播到输入,这是无用的,也是计算一个永远不会被使用的导数的成本。当你设置为可训练=真时,你可以详细说明下面的内容:如果该层在网络的中间,那么只传播输入梯度,但不纠正任何权重。如果该层是网络的第一层,则不会传播任何梯度。是否有任何keras文档支持此规则?我已更新了答案。如果您注意到这两种情况下的行为是相同的,那么第一层永远不会传播到输入端,这是无用的,并且在计算一个永远不会使用的导数时会产生成本。