我是不是很好地理解词嵌入的使用,例如逻辑回归?

Posted

技术标签:

【中文标题】我是不是很好地理解词嵌入的使用,例如逻辑回归?【英文标题】:Do I understand well the use of word embedding for instance with logistic regression?我是否很好地理解词嵌入的使用,例如逻辑回归? 【发布时间】:2018-11-12 13:46:17 【问题描述】:

我想知道我是否正确理解了在自然语言处理中使用世界嵌入的想法。我想告诉你我是如何看待它的,并询问我的解释是否正确。

假设我们要预测句子是正面的还是负面的。我们将使用在维度等于 100 的非常大的文本语料库上准备的预训练词嵌入。这意味着对于每个词,我们有 100 个值。我们的文件是这样的:

...
    new -0.68538535 -0.08992791 0.8066535 other 97 values ... 
    man -0.6401568 -0.05007627 0.65864474 ...
    many 0.18335487 -0.10728102 0.468635 ...
    doesnt 0.0694685 -0.4131108 0.0052553082 ...
...

显然我们有测试和训练集。我们将使用 sklearn 模型来拟合和预测结果。我们的火车是这样的:

1 This is positive and very amazing sentence.
0 I feel very sad.

并且测试集包含如下句子:

In my opinion people are amazing.

我主要对输入数据的预处理有疑问。我想知道是否应该这样做:

我们对所有句子进行例如标记化、去除停用词、小写等。所以对于我们的示例,我们得到:

'this', 'is', 'positive', 'very', 'amazing', 'sentence'
'i', 'feel', 'very', 'sad'

'in', 'my', 'opinion', 'people', 'amazing'

我们使用pad_sequences:

1,2,3,4,5,6
7,8,4,9

10,11,12,13,5

此外,我们检查训练集和测试集中最长句子的长度。假设在我们的例子中,最大长度等于 10。我们需要所有向量的长度相同,因此我们用零填充剩余的字段。

1,2,3,4,5,0,0,0,0,0
6,7,4,8,0,0,0,0,0,0

10,11,12,13,5,0,0,0,0,0

现在最大的疑问 - 我们将来自词嵌入 word2vec 文件的值分配给来自训练集和测试集的准备向量中的所有词。

我们的词嵌入 word2vec 文件如下所示:

...
    in -0.039903056 0.46479827 0.2576446 ...
    ...
    opinion 0.237968 0.17199863 -0.23182874...
    ...
    people 0.2037858 -0.29881874 0.12108547 ...
    ...
    amazing 0.20736384 0.22415389 0.09953516 ...
    ...
    my 0.46468195 -0.35753986 0.6069699 ...
...

例如对于'in', 'my', 'opinion', 'people', 'amazing' 等于10,11,12,13,5,0,0,0,0,0,我们得到如下表: [-0.039903056 0.46479827 0.2576446 ...],[0.46468195 -0.35753986 0.6069699 ...],[0.237968 0.17199863 -0.23182874...],[0.2037858 -0.29881874 0.12108547 ...],[0.20736384 0.22415389 0.09953516 ...],0,0,0,0

最后我们的火车组是这样的:

x             y
1 [0.237968 0.17199863 -0.23182874...],[next 100 values],[next 100 values],[...],[...],0,0,0,0,0,
0 [...],[...],[...],[...],[...],[...],[...],0,0,0
1 [...],[...],[...],[...],[...],0,0,0,0,0
 ...

而测试集是这样看的:

                   y
[100 values],[...],[...],[...],0,0,0,0,0,0
 ...

在最后一步中,我们使用例如 sklearn 模型来训练我们的模型:

 LogisticRegression().fit(values from y column of train set, values from x column of train set)

然后我们预测数据:

 LogisticRegression().predict(values from y column of test set)

上面我用最让我怀疑的指定步骤描述了整个过程。我请你指出我在推理和解释中所犯的错误。我想确保我理解正确。预先感谢您的帮助。

【问题讨论】:

您首先将特征(不同的唯一词)排列成列(可能是按字母顺序),就像一袋词,然后为每个样本填充相应的列。这样,您最终不会得到所有填充的 0,但会根据它们在该列中不存在的特征中的位置出现一些。 【参考方案1】:

逻辑回归接受 X 输入的平面 2d 矩阵,但您正试图向其中输入一个奇怪的坚固结构 - 它不起作用。

我会建议一个更简单的解决方案 - 只需使用句子中每个单词的平均嵌入作为逻辑回归的输入。在这种情况下,此输入将具有规则的形状并且相对较小。如果你想改进这个公式,你可以使这个平均加权(例如通过 TF-IDF)。

如果您想将句子建模为嵌入序列,您需要一个比逻辑回归更复杂的模型 - 例如一个循环神经网络。

【讨论】:

但我知道,例如对于循环神经网络、卷积神经网络或长短期记忆网络,我提出的方法是正确的,这是解决此类问题的最有效方法之一? 大约是的,但是您应该使用 100 维零向量来填充,而不是用标量零填充,以便 NN 的每个输入只是一个矩形矩阵。是的,循环神经网络(LSTM 只是其中的一种)是解决此类问题的最佳方法之一。但是,平均嵌入的逻辑回归已经可以为您提供不错的分类质量(尤其是在您的训练数据不是很大的情况下)。 但是在逻辑回归的情况下,您的意思是例如示例中的句子,例如 [(-0.039903056 + 0.46479827 + 0.2576446 + ...)/100,(0.46468195 + -0.35753986 +0.6069699 +...)/100,(0.237968 + 0.17199863 + -0.23182874+ ...)/100,(0.2037858 + -0.29881874 + 0.12108547 + ...)/100,(0.20736384 + 0.22415389 + 0.09953516 + ...)/100,[(0+0+0+...)/100,(0+0+0+...)/100,(0+0+0+...)/100,(0+0+0+...)/100,(0+0+0+...)/100]?火车组的一条线看起来像这样1 0,32321, 0,62123, -0,2132, 0.20736384, 0.22415389, 0.09953516, 0, 0, 0, 0? 不,我的意思是相反的:第一个输入将是一个 100 维向量,其坐标类似于 [(-0.039+0.237+0.207+...+0+0)/10, (0.464-0.357+0.171+...+0+0)/10, ...]。也许您希望它被标准化(例如,使其 L2 范数等于 1)。

以上是关于我是不是很好地理解词嵌入的使用,例如逻辑回归?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习笔记:大话线性回归

遵循统一的机器学习框架理解逻辑回归

决策树算法实例讲解

逻辑回归原理

逻辑回归算法-通俗易懂易实现

个人对逻辑回归的理解