我在多个网页上有大量关于我有兴趣出售给客户的产品的文本数据。我尝试使用在Wikipedia上受过训练的预训练快速文本词嵌入,但是对于分类任务而言,这没有给我带来很好的效果。可能是因为网站上的文本数据包含许多技术细节,其与Wikipedia中的文本数据不同。因此,我希望以预训练的快速文本词嵌入为基础,进行某种词嵌入的转移学习。
我更喜欢使用Keras训练单词嵌入的解决方案。
我知道嵌入有trainable = True选项,不确定如何使用它。
Embedding(voc_size, emb_dim, weights=[embedding_matrix], input_length, trainable=True)
为此Keras或Gensim建议使用哪个框架,为什么?
答案 0 :(得分:2)
我建议您使用gensim的fastText实现来训练自己的单词嵌入。这比您自己的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
(默认行为)的嵌入层。 Unsafe value used in a resource URL context with Angular 2。
答案 1 :(得分:1)
在Keras中,任何具有参数的层都可以训练或不训练。 当您只想训练层的子集(仅完全连接等)以避免参数爆炸时,此标志很有用。
设置为 trainable = true 时:
在嵌入层的情况下,您可以将此层初始化为默认的嵌入矩阵(例如,gensim Gooogle300Negative)。
当您在此层中激活可训练对象时,您将考虑给Keras进行菜谱调整以进行嵌入。这也意味着必须优化更多的参数。
在某些情况下,由于所涉及的成本或由于要节省成本,没有兴趣修改初始嵌入。
编辑: 该任务对应于Keras内部的Tensorflow。但是,该原理并不取决于框架,而仅取决于理论。 当定义trainable = false时,表示不应更新权重。
这意味着中间层只能计算相对于输入的梯度,因为其中一个权重是无用的(只是计算权重,就不会获得任何结果,并且不会出现可训练标志)。他们根据入口进行计算,因为梯度必须继续传播。
第一层还具有输入是您的数据的特殊性,因此没有必要继续传播,因此,如果trainable = false,则您无需执行任何操作。
在Tensorflow中,可训练标志将变量添加或不添加到GraphKeys.TRAINABLE_VARIABLES集合中,这样就可以不考虑它们。 https://www.tensorflow.org/api_docs/python/tf/trainable_variables