代码之家  ›  专栏  ›  技术社区  ›  Mehran

如何在Keras中训练只有嵌入层且没有标签的模型

  •  0
  • Mehran  · 技术社区  · 7 年前

    我有一些没有标签的文字。只是一堆文本文件。我想训练一个嵌入层,将单词映射到嵌入向量。到目前为止,我看到的大多数例子如下:

    from keras.models import Sequential
    from keras.layers import Embedding, Flatten, Dense
    
    model = Sequential()
    model.add(Embedding(max_words, embedding_dim, input_length=maxlen))
    model.add(Flatten())
    model.add(Dense(32, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.summary()
    model.compile(optimizer='rmsprop',
        loss='binary_crossentropy',
        metrics=['acc'])
    model.fit(x_train, y_train,
        epochs=10,
        batch_size=32,
        validation_data=(x_val, y_val))
    

    他们都假设嵌入层是一个更大模型的一部分,该模型试图预测一个标签。但在我的例子中,我没有标签。我不想把任何东西分类。我只想训练从单词(更精确地说是整数)到嵌入向量的映射。但是 fit 模型方法,要求 x_train y_train (如上所示)。

    如何仅使用嵌入层而不使用标签来训练模型?

    [更新]

    根据我从@daniel m_¶ller得到的答案,Keras中的嵌入层正在实现一个有监督的算法,因此没有标签就无法进行培训。最初,我认为它是word2vec的变体,因此不需要对标签进行培训。显然,情况并非如此。就我个人而言,我最终使用了 FastText 与喀拉斯或巨蟒无关。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Daniel Möller    7 年前

    在没有标签/目标的情况下这样做有意义吗?

    如果没有目标,您的模型将如何决定向量中的哪些值对任何事物都有好处?

    所有嵌入件都经过专门的“培训”。没有目的就没有目标,没有目标就没有培训。

    如果你真的想在没有任何目的/目标的矢量中转换单词,你有两个选择:

    • 制作一个热编码向量。你可以用角膜 to_categorical 功能。
    • 使用预训练的嵌入。有一些可用的工具,如手套、谷歌的嵌入工具等(所有这些工具都是为了某种目的而在某个地点进行培训的)。

    一种基于聊天的非常天真的方法,考虑到单词的距离

    警告:我对word2vec一无所知,但我将尝试演示如何添加一些简单的单词距离嵌入规则,以及如何使用虚拟的“标签”来满足Keras的培训方式。

    from keras.layers import Input, Embedding, Subtract, Lambda
    import keras.backend as K
    from keras.models import Model
    
    input1 = Input((1,)) #word1
    input2 = Input((1,)) #word2
    
    embeddingLayer = Embedding(...params...)
    
    word1 = embeddingLayer(input1)
    word2 = embeddingLayer(input2)
    
    #naive distance rule, subtract, expect zero difference
    word_distance = Subtract()([word1,word2])
    
    #reduce all dimensions to a single dimension
    word_distance = Lambda(lambda x: K.mean(x, axis=-1))(word_distance)
    
    model = Model([input1,input2], word_distance)
    

    现在,我们的模型直接输出一个单词距离,我们的标签将是“零”,它们不是用于监督培训的真正标签,但它们是模型的预期结果,是KERA工作所必需的。

    我们可以有作为损失函数的 mae (平均绝对误差)或 mse 例如(均方误差)。

    model.compile(optimizer='adam', loss='mse')
    

    以单词2为单词1的训练:

    xTrain = entireText
    xTrain1 = entireText[:-1]
    xTrain2 = entireText[1:]
    yTrain = np.zeros((len(xTrain1),))
    
    model.fit([xTrain1,xTrain2], yTrain, .... more params.... ) 
    

    尽管对于word2vec的实际操作,这可能是完全错误的,但它显示了以下要点:

    • 嵌入层没有特殊的属性,它们只是可训练的查找表。
    • 创建嵌入的规则应该由模型和预期的输出定义。
    • Keras模型将需要“目标”,即使这些目标不是“标签”,而是一个预期结果的数学技巧。