【问题标题】:Simple weighted embedding network简单加权嵌入网络
【发布时间】:2018-04-27 03:31:49
【问题描述】:

我有几个嵌入矩阵,假设 E1 矩阵用于 Glove,E2 用于 Word2vec。

我想构建一个简单的情感分类器,该分类器采用可训练的嵌入加权和。

例如,对于单词“dog”,当学习 x 和 y 时,我想得到 x["dog"]*E1["dog"] + y["dog"]*E2["dog"]参数(注意我想为每个单词学习 x 和 y 我知道我需要以某种方式学习 X 向量和 Y 向量并将合并与“添加”一起使用,但我不知道如何实际做到这一点,我们将不胜感激。

我的网络如下所示:

embd = Sequential()
embd.add(Embedding(topWords + 2, embedding_vecor_length, 
input_length=max_review_len, weights=[embedding_weights],trainable=False))
sent_model = Sequential()
sent_model.add(embd)
sent_model.add(Conv1D(filters, kernel_size, border_mode='valid', 
activation='relu', input_shape=(max_review_len, embedding_vecor_length)))
sent_model.add(Dense(1, activation='sigmoid'))

【问题讨论】:

    标签: deep-learning keras keras-layer


    【解决方案1】:

    我使用 keras 已经有一段时间了。但我会这样做:

    您可能会使用 gensim 库加载 Glove 和 Word2Vec。我假设您知道如何将这些加载到 keras 嵌入层中。如果没有,请告诉我。

    您将在此处将两个嵌入层都设置为不可训练

    对于 XY,您可以像 E1 和 E2 一样创建另外两个嵌入层,而无需提供权重并将它们设置为 trainable,这些将在训练过程中被网络学习。

    您可能也可以使用 Dense 层,但我认为使用嵌入层会更容易。

    对于乘法和加法,有一个如何使用它的示例,取自keras documentation

    import keras
    
    input1 = keras.layers.Input(shape=(16,))
    x1 = keras.layers.Dense(8, activation='relu')(input1)
    input2 = keras.layers.Input(shape=(32,))
    x2 = keras.layers.Dense(8, activation='relu')(input2)
    added = keras.layers.Add()([x1, x2])  # equivalent to added = keras.layers.add([x1, x2])
    
    out = keras.layers.Dense(4)(added)
    model = keras.models.Model(inputs=[input1, input2], outputs=out)
    

    更新:

    例如,对于单词“dog”,我想得到 x["dog"]*E1["dog"] + y["dog"]*E2["dog"] 当 x 和 y 是学习参数时(请注意,我想为每个我知道需要以某种方式学习的单词学习 x 和 y X向量和Y向量并使用“添加”合并,但我不知道 如何实际做到这一点,我们将不胜感激。

    所以,我没有对此进行测试,也是因为我没有数据,代码中可能存在一些错误 - 但总的来说它可能应该是这样的:

    #input
    sequence_input = Input(shape=(max_review_len,), dtype='int32')
    
    # loading your Glove embedding
    layer_E1 = Embedding(w1.shape[0],w1.shape[1],
                                weights=[w1],
                                input_length=max_review_len,
                                trainable=False)
    # loading your Word2Vec embedding
    layer_E2 = Embedding(w2.shape[0],w2.shape[1],
                                weights=[w2],
                                input_length=max_review_len,
                                trainable=False)
    # applying embeddings
    embedded_E1 = layer_E1(sequence_input)
    embedded_E2 = layer_E2(sequence_input)
    
    # creating learnable embedding layer X and Y
    layer_X = Embedding(vocab_size, embedding_vecor_length, input_length=max_review_len)
    layer_Y = Embedding(vocab_size, embedding_vecor_length, input_length=max_review_len)
    
    # your weights X and Y
    embedded_X = layer_X(sequence_input)
    embedded_Y = layer_Y(sequence_input)
    
    # Multiplying X*E1 (x["dog"]*E1["dog"])
    layer_E1_X = keras.layers.Multiply()([embedded_E1, embedded_X])
    # Multiplying Y*E2 (y["dog"]*E2["dog"])
    layer_E2_Y = keras.layers.Multiply()([embedded_E2, embedded_Y])
    
    # merging the results with add
    added = keras.layers.Add()([layer_E1_X, layer_E2_Y])
    
    # …
    # some other layers
    # … 
    
    your_final_output_layer = Dense(1, activation='sigmoid')(previous_layer)
    
    model = Model(sequence_input, your_final_output_layer)
    model.compile(…)
    model.fit(…)
    

    编辑:我忘了应用 X 和 Y 嵌入,我现在添加了。

    (请认为这是一个粗略的想法或大纲,您可能需要更改一些内容)

    这里重要的是维度匹配,因此嵌入 E1 和 E2 应该具有相同的嵌入维度。 embedding_vecor_length 也必须相同才能正常工作。

    代码中的w1w2 被假定为您的glove 和加载了gensim 的word2vec 嵌入。

    所以,我希望这大致是您想要做的。 :)

    【讨论】:

    • 嗨,感谢您的努力 :) 我的一种嵌入网络的开始类似于:model = Sequential() model.add(Embedding(weights=[embedding_weights], trainable=False) )我可以添加我的网络不可训练的预训练嵌入,谢谢你的提问:)所以,我正在使用“Sequential”并且嵌入可能以某种方式获得输入,如果你能帮助我编写一个可训练的向量 x为每个单词学习权重的 dim [1,词汇量] 这可能非常有用,因为我可以完成其余的工作
    • 抱歉删除了我的不小心回复,其实我还需要你的帮助:)
    • 你应该更新你的问题,这可以帮助其他有同样问题的人。我不确定您是否可以将顺序模型用于这种网络。因为您希望将输入同时馈送到 E1 和 E2,所以我认为这可能对顺序模型有问题。请在您的问题中添加一些代码,我可以尝试在没有顺序模型的情况下重写它。
    • “您希望同时将输入输入 E1 和 E2”实际上这可以通过“合并”轻松解决,我有一些代码,我更愿意留在“顺序”模型,如果你告诉我如何为一个嵌入矩阵做这件事,我可以很容易地推广到少数。代码已添加到问题中:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2017-11-28
    • 2010-12-31
    • 2023-03-13
    • 2022-01-08
    • 2020-10-06
    相关资源
    最近更新 更多