神经网络与语言哲学

为什么维特根斯坦的理论仍然是所有现代自然语言处理的基础

单词的矢量表示可能是人工智能历史上最美丽,最浪漫的想法之一。 语言哲学是哲学的一个分支,探讨语言与现实之间的关系以及如何使语音有意义和易于理解。 单词的向量表示是现代自然语言处理(NLP)中非常具体的方法。 从某种意义上讲,这是路德维希·维特根斯坦(Ludwig Wittgenstein)的理论的经验证据,路德维希·维特根斯坦是上个世纪最相关的哲学家之一。 对于维特根斯坦来说,单词的使用是社交语言游戏的一种举措,这种游戏是由相互了解的社区成员玩的。 单词的含义仅取决于其在上下文中的用处;它与现实世界中的对象并不一一对应。

对于我们使用“含义”一词的一大类情况,可以将其定义为该词含义是其在语言中的使用

当然,理解单词的确切含义非常困难。 有许多方面需要考虑:

  • 这个词可能指的是哪个对象;
  • 这是什么话语?
  • 是否为惯用语;
  • 各种意义的阴影;
  • 等等。

最后,所有这些方面都归结为一件事:知道如何使用该词。

含义的概念以及为什么有序字符集在语言中具有确定的含义,这不仅是一个哲学问题,而且可能是与NLP合作的AI专家必须处理的最大问题。 对于说俄语的人来说,“狗”是“动物”是很明显的,它看起来更像是“猫”而不是“海豚”,但是对于系统的解决方案来说,这绝非易事。

稍微纠正维特根斯坦的理论后,我们可以说狗看起来像猫,因为它们经常出现在相同的环境中:与“家”和“花园”两个词相关的狗和猫可能比“海”这些词相关。和“海洋”。 正是这种直觉成为Word2Vec的基础, Word2Vec是单词向量表示的最著名和最成功的实现之一。 如今,机器还远远不能真正理解长篇文章和段落,但毫无疑问,单词的向量表示法是过去十年中使我们朝这个方向迈出最大一步的唯一方法。

从BoW到Word2Vec


在许多计算机问题中,第一个问题是以数字形式显示数据。 单词和句子可能是这种形式中最难以想象的。 在我们的设置中,从字典中选择D个单词,并且可以为每个单词分配一个数字索引i

数十年来,一直采用经典方法将每个单词表示为位置i以外的所有零的D维数字矢量。 例如,考虑一个包含三个单词的字典:“ dog”,“ cat”和“ dolphin”(D = 3)。 每个单词都可以表示为三维向量:“ dog”对应于[1,0,0],“ cat”对应于[0,1,0],“ dolphin”对应于[0,0,1]。 可以将文档表示为D维向量,其中每个元素都对文档中第i个单词的出现次数进行计数。 此模型称为词袋(BoW),并且已经使用了数十年。

尽管BoW在90年代取得了成功,但它缺少单词唯一有趣的功能:单词的含义。 我们知道,两个非常不同的词即使在拼写观点上完全不同,也可以具有相似的含义。 “猫”和“狗”都是家畜,“王”和“女王”彼此接近,“苹果”和“香烟”完全无关。 我们知道这一点,但是在BoW模型中,所有这些词在向量空间中的距离都相同:1。

同样的问题也适用于文档:使用BoW,我们可以得出结论,仅当文档包含相同单词多次时,它们才是相似的。 Word2Vec来了,它把机器学习的术语引入了维特根斯坦60年前在其哲学研究中讨论的许多哲学问题。

在大小为D的词典中,该单词由其索引标识,目标是针对N << D计算每个单词的N维向量表示。 理想情况下,我们希望它是一个密集的向量,表示语义的某些语义特定方面。 例如,理想情况下,我们希望“狗”和“猫”具有相似的表示,并且“苹果”和“香烟”在向量空间中相距甚远。

我们想对向量执行一些基本的代数运算,例如+−= 。 我希望向量“演员”和“女演员”之间的距离与“王子”和“公主”之间的距离基本一致。 尽管这些结果是乌托邦式的,但实验表明Word2Vec向量具有非常接近这些特性的特性。

Word2Vec不会直接从中学习视图,而是在没有老师的情况下将其作为分类的副产品接收。 NLP单词语料库的平均数据集由一组句子组成; 句子中的每个单词都出现在周围单词的上下文中。 分类器的目的是通过将上下文词作为输入来预测目标词。 对于句子“棕色的狗在花园里玩”,[模型上的棕色,狗在花园里]作为输入提供给模型,她应该预测单词“狗”。 这项任务被认为是没有老师的学习,因为不需要在语料库上标注外部真理:如果您有一组句子,则始终可以自动创建正面和负面的例子。 以“在花园里玩的棕色狗”为正面示例,我们可以创建许多否定模式,例如“在花园里玩的棕色飞机”或“在花园里玩的棕色葡萄”,用数据集中的随机单词替换目标单词“狗”。

现在维特根斯坦理论的应用已经非常清楚:上下文对于单词的向量表示至关重要,因为在他的理论中将含义附加到单词上很重要。 如果两个词具有相似的含义,则它们将具有相似的表示形式(在N维空间中只有一小段距离),因为它们经常出现在相似的上下文中。 因此,“猫”和“狗”最终将具有接近的向量,因为它们经常出现在相同的上下文中:模型对它们使用类似的向量表示形式很有用,因为这是她可以做的最方便的事情,在根据上下文预测两个单词时获得更好的结果。

原始文章提供了两种不同的体系结构:CBOW和Skip-gram。 在这两种情况下,都将口头表达与特定的分类任务一起进行授课,以提供最佳的单词矢量表达,从而最大化模型性能。


图1. CBOW和Skip-gram架构的比较

CBOW代表连续词袋,其任务是在考虑上下文的​​情况下猜测一个词作为输入。 输入和输出表示为D维向量,这些向量在具有共同权重的N维空间中投影。 我们仅在寻找投影权重。 实际上,单词的向量表示是D×N矩阵,其中每一行代表一个词典单词。 将所有上下文词投影到一个位置,并将它们的向量表示平均。 因此,单词顺序不影响结果。

跳过语法做同样的事情,反之亦然:它试图以目标词作为输入来预测上下文词C。 预测几个上下文词的任务可以重新定义为一组独立的二元分类问题,现在的目标是预测上下文词的存在(或不存在)。

通常,Skip-gram需要花费更多的时间进行训练,并且通常会获得略微更好的结果,但是像往常一样,不同的应用程序有不同的要求,并且很难预先预测哪些应用程序将显示最佳结果。 尽管该概念很简单,但是由于优化权重所需的数据量和处理能力,学习这种体系结构确实是一场噩梦。 幸运的是,在Internet上,您可以找到一些经过预训练的单词向量表示形式,并且只需几行Python代码就可以研究向量空间(最有趣的)。

可能的改进:GloVe和fastText


在最近的经典Word2Vec上,已经提出了许多可能的改进。 最有趣和最常用的两个是GloVe(斯坦福大学)和fastText(由Facebook开发)。 他们试图识别并克服原始算法的局限性。

最初的科学文章中 ,GloVe的作者强调指出,在单独的本地环境下进行模型训练不能充分利用全球语料库统计信息。 克服此限制的第一步是创建一个全局矩阵X ,其中每个元素i,j都在单词i的上下文中计算对单词j的引用次数。 本文档的第二个重要思想是要理解仅靠概率不足以可靠地预测值,并且还需要一个共现矩阵,可以从中直接提取值的某些方面。

考虑两个特别有趣的单词i和j。 为了具体起见,假设我们对热力学状态的概念感兴趣,为此我们可以取i = j = 。 这些单词之间的关系可以通过使用不同的发音单词k研究它们共同出现的概率之比来研究。 对于与冰相关但与蒸汽无关的单词k,例如k = [固体,物质状态],我们预计Pik / Pjk之比将更大。 类似地,对于与蒸汽相关但与冰无关的单词k,例如k = ,比率应较小。 对于诸如“水”或“时尚”之类的词,它们与冰和蒸汽同等相关,或者与它们无关,则该比率应接近于1。

该概率比成为研究单词的向量表示的起点。 我们希望能够计算出与特定函数F结合的矢量使其在矢量表示空间中保持恒定。


图2. GloVe模型中单词向量表示的最常用公式

可以通过替换指数和固定偏移量来简化函数F和对单词k的依赖关系,该函数通过最小二乘法J给出使误差最小化的功能:


图3.计算GloVe模型中单词的矢量表示的最终功能

函数f是一个计数函数,它不试图负担非常频繁且罕见的匹配,而bibj是补偿以恢复该函数的对称性。 在文章的最后几段中,表明了该模型的训练与经典的Skip-gram模型的训练并没有太大不同,尽管在经验测试中,GloVe优于两个Word2Vec的实现。

另一方面, fastText纠正了Word2Vec的一个完全不同的缺点:如果模型训练从对一个D维向量的直接编码开始,则单词的内部结构将被忽略。 fastText提供了研究N-gram字符并将单词表示为N-gram矢量的总和的功能,而不是直接对学习言语表示的单词编码进行编码。 例如,在N = 3的情况下,单词“花”被编码为6种不同的3克[<fl,flo,low,Debt,wer,er>]加上特殊序列<flower>。 请注意如何使用尖括号指示单词的开头和结尾。 因此,一个单词由其在单词词典中的索引以及该单词包含的一组N-gram表示,并使用哈希函数映射为整数。 通过这种简单的改进,您可以在单词之间拆分N-gram表示形式,并计算不在学习案例中的单词的矢量表示形式。

实验和可能的应用


正如我们已经说过的,要使用这些向量表示形式,您只需要几行Python代码。 我使用了50维GloVe模型和Wikipedia 模型进行了一些实验,该模型使用了Wikipedia句子中的60亿个单词,使用了300维FastText模型,使用了Common Crawl (给出了6000亿个令牌)。 本部分提供了两个实验结果的链接,仅是为了证明概念并对该主题有一个总体了解。

首先,我想检查单词的一些基本相似性,这是其向量表示的最简单但重要的特征。 不出所料,与“ dog”一词最相似的词是“ cat”(0.92),“ dogs”(0.85),“ horse”(0.79),“ puppy”(0.78)和“ pet”(0.77)。 注意,复数形式具有与单数几乎相同的含义。 再说一遍,对我们来说这很琐碎,但是对于汽车来说,这完全不是事实。 现在是食物:“披萨”的最相似词是“三明治”(0.87),“三明治”(0.86),“小吃”(0.81),“烘焙食品”(0.79),“薯条”(0.79)和“汉堡”( 0.78)。 这是有道理的,结果令人满意,并且模型表现良好。

下一步是在向量空间中执行一些基本计算,并检查模型是否正确获取了一些重要属性。 实际上,作为计算+-向量的结果,结果是“女演员”(0.94),并且由于计算+- ,获得了单词“国王”(0.86)。 一般而言,如果值为a:b=c:d ,则应将单词d设为d=b-a+c 。 进入下一个层次,无法想象这些矢量运算甚至如何描述地理方面:我们知道罗马是意大利的首都,因为柏林是德国的首都,实际上+-= (0.88)+-= (0.83)

现在是有趣的部分。 遵循相同的想法,我们将尝试增加和减少概念。 例如,意大利人在美国相当于比萨饼? +-= (0.60) ,然后是 (0.59) 。 自从我搬到荷兰以来,我总是说这个国家是三样东西的混合物:一点点美国的资本主义,瑞典的冷漠和生活质量,最后一点点那不勒斯的丰富 。 通过稍微改变原始定理,去除一点瑞士精度,我们得出荷兰(0.68),这是++- :说实话,这确实令人印象深刻。


图4.对所有荷兰读者:称赞一下,好吗?

可以在此处此处找到很好的实用资源,以使用这些预训练的矢量表示形式。 Gensim是一个简单而完整的Python库,带有一些现成的代数和相似函数。 这些预先训练的矢量表示可以多种(且有用的)方式使用,例如,以改善情绪分析器或语言模型的性能。 无论执行什么任务,与直接编码相比,使用N维向量将显着提高模型的效率。 当然,在特定区域进行矢量表示的训练将进一步改善结果,但这可能需要过多的精力和时间。

Source: https://habr.com/ru/post/zh-CN435984/


All Articles