使用自动编码器进行成对文本相似性
Using autoencoder for pairwise text similarity
我有一个仅包含 500 个样本的数据集。数据集有三列
- 句子 1
- 句子 2
- 0 或 1(表示相似性)。
我的任务是训练一个编码器,它将两个句子作为输入,returns如果句子相似则为 1,否则为 0。
我使用预训练的 word2vec 嵌入来提取特征。我的模型只达到了 50% 的准确率。
sent_in = Input(shape=(150, ))
sent_emb = Embedding(input_dim=vocab_size, output_dim=300, weights=[E],)(sent_in)
conv1 = Conv1D(32, 5, activation='relu', padding='same')(sent_emb)
pool1 = MaxPooling1D(2)(conv1)
conv2 = Conv1D(64, 5, activation='relu', padding='same')(pool1)
pool2 = MaxPooling1D(2)(conv2)
conv3 = Conv1D(128, 5, activation='relu', padding='same')(pool2)
flat1 = Flatten()(conv3)
sent_in2 = Input(shape=(150, ))
sent_emb2 = Embedding(input_dim=vocab_size, output_dim=300, weights=[E],)(sent_in2)
conv4 = Conv1D(32, 5, activation='relu', padding='same')(sent_emb2)
pool3 = MaxPooling1D(2)(conv4)
conv5 = Conv1D(64, 5, activation='relu', padding='same')(pool3)
pool4 = MaxPooling1D(2)(conv5)
conv6 = Conv1D(128, 5, activation='relu', padding='same')(pool4)
flat2 = Flatten()(conv6)
concatenated = concatenate([flat1, flat2])
dense1 = Dense(32, activation='relu')(concatenated)
out = Dense(1, activation='sigmoid')(dense1)
model = Model(inputs=[sent_in,sent_in2], outputs=out)
model.summary()
我的网络如下图所示
问题:
1) 每个自动编码器都必须有一个编码器和一个解码器吗?
2) 如何提高准确率?
1) Must every autoencoder have an encoder and a decoder?
是的,这是必须的。如果您打算将编码器和解码器作为单独的神经网络进行训练,您可能很快就会面临这样的问题,即我们不知道编码(压缩的特征集)应该是什么的基本事实。
没有标签说输入特征应该对应于这个特定的编码。
因此,不可能训练我们的编码器!没有编码器,我们就没有编码,因此我们没有解码器的输入特征!
这使得我们的解码器也无法训练!
2) How can I improve my accuracy?
好吧,我认为这里已经回答了这个问题:
下面的解释也可以提供帮助:
自动编码器对卷积神经网络分类任务准确性的影响
可以合理地说,较小的编码尺寸会导致较低的精度,并且当
encoded size 达到一定数量,因为 较小的 encoded size 意味着更多的损失 在图像数据中,这意味着
重组后的图像与原始数据的差异更大。此外,即使编码尺寸很大
够了,图像数据还是有损失的。因此,精度仍然低于原始精度和精度
在箱形图中停止增加。当 auto-encoders 使用足够大的编码大小进行训练时,
两种情况下的准确率约为 92%。与以原始数据为输入的 CNN 相比,
99%的准确率,自编码器造成的准确率损失不算太大
这是基于研究论文。
我有一个仅包含 500 个样本的数据集。数据集有三列
- 句子 1
- 句子 2
- 0 或 1(表示相似性)。
我的任务是训练一个编码器,它将两个句子作为输入,returns如果句子相似则为 1,否则为 0。
我使用预训练的 word2vec 嵌入来提取特征。我的模型只达到了 50% 的准确率。
sent_in = Input(shape=(150, ))
sent_emb = Embedding(input_dim=vocab_size, output_dim=300, weights=[E],)(sent_in)
conv1 = Conv1D(32, 5, activation='relu', padding='same')(sent_emb)
pool1 = MaxPooling1D(2)(conv1)
conv2 = Conv1D(64, 5, activation='relu', padding='same')(pool1)
pool2 = MaxPooling1D(2)(conv2)
conv3 = Conv1D(128, 5, activation='relu', padding='same')(pool2)
flat1 = Flatten()(conv3)
sent_in2 = Input(shape=(150, ))
sent_emb2 = Embedding(input_dim=vocab_size, output_dim=300, weights=[E],)(sent_in2)
conv4 = Conv1D(32, 5, activation='relu', padding='same')(sent_emb2)
pool3 = MaxPooling1D(2)(conv4)
conv5 = Conv1D(64, 5, activation='relu', padding='same')(pool3)
pool4 = MaxPooling1D(2)(conv5)
conv6 = Conv1D(128, 5, activation='relu', padding='same')(pool4)
flat2 = Flatten()(conv6)
concatenated = concatenate([flat1, flat2])
dense1 = Dense(32, activation='relu')(concatenated)
out = Dense(1, activation='sigmoid')(dense1)
model = Model(inputs=[sent_in,sent_in2], outputs=out)
model.summary()
我的网络如下图所示
问题:
1) 每个自动编码器都必须有一个编码器和一个解码器吗?
2) 如何提高准确率?
1) Must every autoencoder have an encoder and a decoder?
是的,这是必须的。如果您打算将编码器和解码器作为单独的神经网络进行训练,您可能很快就会面临这样的问题,即我们不知道编码(压缩的特征集)应该是什么的基本事实。 没有标签说输入特征应该对应于这个特定的编码。 因此,不可能训练我们的编码器!没有编码器,我们就没有编码,因此我们没有解码器的输入特征! 这使得我们的解码器也无法训练!
2) How can I improve my accuracy?
好吧,我认为这里已经回答了这个问题:
下面的解释也可以提供帮助:
自动编码器对卷积神经网络分类任务准确性的影响
可以合理地说,较小的编码尺寸会导致较低的精度,并且当 encoded size 达到一定数量,因为 较小的 encoded size 意味着更多的损失 在图像数据中,这意味着 重组后的图像与原始数据的差异更大。此外,即使编码尺寸很大 够了,图像数据还是有损失的。因此,精度仍然低于原始精度和精度 在箱形图中停止增加。当 auto-encoders 使用足够大的编码大小进行训练时, 两种情况下的准确率约为 92%。与以原始数据为输入的 CNN 相比, 99%的准确率,自编码器造成的准确率损失不算太大
这是基于研究论文。