机器学习使我们能够训练一个可以将数据转换为标签的模型,从而把相似的数据映射到相似或相同的标签。
例如,我们正在为电子邮件构建一个垃圾邮件过滤器。我们有很多电子邮件,其中一些标记为垃圾邮件,另一些标记为正常邮件(INBOX)。我们可以构建一个模型,该模型学习识别垃圾邮件。被标记为垃圾邮件的邮件在某种程度上类似于已经标记为垃圾邮件的邮件。
相似性的概念对于机器学习至关重要。在现实世界中,相似性的概念与某个主题相关,它取决于我们的知识。
另一方面,数学模型定义了相似性的概念。通常,我们将数据表示为多维向量,并测量向量之间的距离。
https://www.quora.com/Why-do-we-use-cosine-similarity-on-Word2Vec-instead-of-Euclidean-distance
特征工程是将我们对现实世界中的某个对象的知识转换为数字表示的过程。我们认为相似的对象转化为数字后的向量也会很靠近。
例如,我们正在估算房价。我们的经验告诉我们,房屋是由卧室的数量,浴室的数量,房龄,房屋面积,位置等来定义的。位于同一社区,具有相同大小和房龄的房屋的价格应该大致相同。我们将对房屋市场的了解转化为表征房屋的数字,并用它来估算房屋的价格。
不幸的是,如上所述,手动特征工程在将我们的知识转换为描述性特征的能力方面存在局限性。
有时,知识的使用仅限于相似性原理,而不是对象的确切相似特征。通常,我们对现实世界的了解要比简单的表格所代表的要复杂得多。它通常是相互联系的概念和图形。
嵌入模型使我们能够获取原始数据,并根据我们的知识自动将其转换为特征。
Word2Vec
Word2Vec可能是最著名的嵌入模型,它为单词建立相似度向量。在这种情况下,我们对世界的了解用文字来进行表示,即文字序列。
虽然数十年来,人们尝试使用手动定义的特征来刻画单词,但收效甚微。这些解决方案通常无法扩展到全部知识,也无法在有限的情况下起作用。
托马斯·米科洛夫(Tomas Mikolov)和他在Google的团队决定建立模型时,一切都改变了,该模型基于众所周知的相似性原理进行工作。在相似上下文中使用的词通常相似。在这种情况下,上下文由附近的单词来定义。
单词序列的图形表示。
我们看到的是,只要牢记这些原则,我们就可以通过在预定义窗口(通常为5个单词)内将每个单词与其相邻单词简单地连接起来,从而在文本中构建图形。
现在我们有了一个基于我们的知识连接起来的真实单词对象的图形。
最简单/最复杂的单词表示
我们仍然无法建立任何模型,因为单词没有以表格或向量表示。
如果我们需要将单词转换为数字,那么有一个简单的解决方案。让我们来看看字典,并为每个单词指定其在字典中的位置。
例如,如果我有三个单词:猫(cat),毛毛虫(caterpillar),小猫(kitten)。
我的向量表示法如下:cat—[1],caterpillar—[2],和kitten—[3]。
不幸的是,这不起作用。通过这样分配数字,我们隐式地引入了单词之间的距离。猫和毛毛虫之间的距离是1,猫和小猫之间的距离是2。这样进行表示就等于,我们说猫比起小猫更像毛毛虫,这与我们的知识是相互矛盾的。
另外一个解决方案也称为独热编码(one-hot encoding):
cat — [1,0,0]
caterpillar — [0,1,0]
kitten — [0,0,1]
该方法表示所有单词都彼此正交。我们没有单词相似性的先入观念。我们将依靠我们的知识图谱(如上所述)和的单词相似性原理来构建嵌入模型。
在现实世界中,字典的大小远远大于3。字典的维数可能是数万到数百万。这些向量不仅不能真正代表我们的相似性概念,而且它们的体积也很大,无法在实际中使用。
建立词嵌入(word embeddings)
我们的知识图谱为我们提供了非常多的边,每条边都可以解释成输入数据作为边的起点,标签为边的终点。我们正在构建一个模型,该模型试图使用被标签包围的单词来预测单词。通常以两种方式完成。我们要么从某个单词的所有邻居来构造单词向量