Zero-Shot Learning 指南

2020-10-30 10:21:39 浏览数 (1)

深度学习迫切需要的人类大脑功能。

作者:Andre Ye 编译:McGL

深度学习有一个大问题: 它需要吞噬大量的数据,然后才能很好地泛化而变得实用。这实际上是深度学习的局限性之一,限制了它在数据不丰富或难以获得的许多领域的应用。

相比之下,人类虽然在人机智能大战中处于劣势,但只需几个训练例子就能学会复杂的概念。一个不知道什么是猫或狗的婴儿看到一些猫和狗的图像后,可以学会分类后。即使我们学习更复杂的概念,我们也能够用一个小的数据集学会大部分。

这个属性使教授人类概念变得很费力,虽然是可能实现的。一个四年级的学生可以通过几十道题和一个好老师来掌握基本代数的原理。深度学习需要一个精心设计的架构,成千上万(如果不是更多的话)以特殊格式编码的痛苦的问题和答案,以及几天的计算时间。

也许关于人类大脑的一些更有趣的事情是,我们可以轻松地处理成百上千的类别。想想你周围环境中的所有物体——你的电脑、你电脑上的应用程序、这些应用程序的功能、数十种颜色、你同事的名字,以及所有英语单词。

此外,即使你以前从未见过这些概念,你也能够识别它们。考虑下面的例子(希望你以前没有见过) : 把它们分类。类的实际名称并不重要——如果你愿意,可以称它们为 zookhizonk。

这与新物种的命名过程非常相似。如果一个科学家发现了几只秃鹰,他或她可以简单地给这个物种命名——“秃鹰”——它们的特征是相似的: 翼展6-7英尺,深褐色或白色的尾巴,白色的头,明亮的黄色眼睛。尽管他或她事先并不知道什么是“秃鹰”。

我们不需要在概念上添加名称来识别它们; 名称是任意的,只是一种快速获得想法的方式。类似地,我们可以按照我们喜欢的任何名称对这些抽象形状进行分类,只要这些名称代表一个更广泛的概念(在本例中,两个方块代表“ Zonkizonk” ,三个方块代表“ Bonkibonk”)。

零次学习(Zero-shot learning)是将人类识别以前未见过的概念的能力带给机器的一种努力。显然,这是迈向真正的人工智能和构建更像人类思维的算法的关键一步,同时在类别太多、数据有限或者获取成本高昂的问题上,这也是非常实用的。

在一个深度学习还没有解决的问题日益涉及复杂的和类似人类的认知的世界里,zero-shot learning 是一个答案。

类似地,one-shot 或 few-shot learning 指的是只给出一个或几个来自那个类别的训练样本就能理解整个类别,就像双头 Siamese 网络一样。

一个简单而有效的 zero-shot learning 方法是“Embarrassingly Simple Zero-Shot Learning”(ESZSL) ,它创造性地使用矩阵分解和非监督式学习来生成一个模型,结果惊人的好。理解它可以直观地了解很多其他 zero-shot learning 技术。

在 SUN 数据集(https://groups.csail.mit.edu/vision/SUN/)上,ESZSL 得到了超过65% 的准确率,这个数据集包含了数以万计的在训练过程中从未见过的类的目标。深度总结可以查看论文(http://proceedings.mlr.press/v37/romera-paredes15.pdf)的方法在合成和真实数据集上的结果。

从根本上讲,ESZSL 是一个线性模型。给定一个输入矩阵 X 的形状(行数,特征数)和一个权重矩阵的形状(特征数,类数),线性组合输出将是形状(行数,类数)。

ESZSL 的目标是求出权重矩阵 W 的值。

一个相当复杂的模型必须完成的两个步骤:

  • 通过映射特征空间(输入 X)到一个维度为 a 的属性空间来解释输入,属性可以是一个图像是否有四只脚,是否是棕色的等等。每个属性的含义需要由模型决定。
  • 将属性空间中的知识组合成输出。例如,如果图像有四只脚并且是棕色的,则输出为狗。

这两个目的可以用矩阵来表示。

  • V 的形状是(特征的数量, a)。当 X 乘以V,结果的形状是(行数,a现在每一行都由学习到的属性表示。这非常类似于神经网络层中的连接(没有偏置和激活)。
  • S 的形状是(a,类别数量)。当 V 乘以 S,结果的形状是(行数,类数)。这个乘法结合了从属性空间学到的知识来生成输出。这就像是神经网络的输出层。

然后我们可以把模型写成:

上标代表矩阵的形状。r 是数据集中的行数,f 是特征数,a 是在中间层学习的属性数,c 是类别的数量。

结果表明,pipeline的后半部分 —— S,即某些学习到的属性和类之间的关系 —— 可以通过非监督式学习方法如 PCA,或者更复杂的流形学习技术如局部线性嵌入和 t-SNE 来找到。

  1. 在训练输入数据 X 上训练一个降维算法(PCA,LLE,等等)转成维度 a。
  2. 生成的数据应该具有形状(r, a),其中 r 是行的数量,a 是学习到的属性的数量。把这个矩阵叫做 M。
  3. 分配大小为(a, c)的矩阵 S,其中 c 是类别的数量。
  4. 对于每个唯一的类,在 M 中找到标签匹配这个类的行。然后每行计算学习到的属性 a 的平均值再把这些信息填入S。

这里,E[(a,b) ,(c,d)]表示期望值或平均值。结果是(a c)/2,(b d)/2。“ A1”和“ A2”表示属性1和属性2。

这是一种非常简单和优雅的推导 S 的方法,因为它使用了无监督的特征提取方法,这对 zero-shot learning 很有用,因为它不能接触到测试中可能出现的任何标签。在 zero-shot learning 算法中使用聚类也是有意义的,因为新类的识别是一个非常复杂的聚类任务。

然后,训练和预测过程如下:

  • 在训练期间,用无监督方法从数据集X train 和y train 中计算S。然后,使用标准的优化方法(例如梯度下降法)来计算V,以最小化模型的预测损失。
  • 在测试过程中,生成两个数据集,X test-train & y test-train 及X test & y test。前者是测试集的一部分,并有标签; 这允许 S 整合不包含训练集的测试集。后者,没有标签给到算法。使用上面描述的无监督方法,从X test-train and 及y test-train 数据集中计算S。 因为 V(将输入转换为属性空间)已经计算完毕,所以至此模型已经完成。

即使是这个“非常简单的”的 zero-shot learning 方法,也可能有点难以理解。让我们以 MNIST 数据集为例讲解,数据集由从0到9的手写数字组成。

  1. 我们用从0到4的数字训练模型,然后让它识别测试集中的数字5-9。
  2. 从训练集中计算 S , 然后找到 V。
  3. 形成 test-train 组,这是测试集中的一个少量数字的抽样(数字5到9)。由此,计算出一个更新的 S。输出将对应于从5到9的数字,而不是从0到4(在训练集上计算时)
  4. 在模型中运行测试集的其余部分,并使用更新的 S and 及来自训练的 V

注意,测试集中 S 的计算有点可疑,如果你非常严格的话,你可能会反对它是真正的 zero-shot,因为预测 S 的一部分依赖于标签。或者,有人可能会说这是必要的,而且在整个训练和测试过程中,负责编码输入的所有工作的 V 始终保持不变。无论你站在哪一边,这都是一个很好的了解 zero-shot 算法背后的思想的机会。然而,一般来说,zero-shot learning 方法会遵循三种学习范式之一:

  • 从属性中学习。类伴随着一个结构化的描述,例如,“白色的头“和“黄色的嘴“描述一个秃鹰。这允许算法将输入分解为描述类的元素,即使它没有看到该类的任何显式示例
  • 从文字描述中学习。类会附带一个文本的自然语言描述,就像一本词典或者一个百科全书的单词入口。这允许模型在仅给定类描述的情况下解释输入并将其映射到类。
  • 独立学习。类被嵌入到一个连续的空间中,zero-shot 分类器解释嵌入的位置以确定输出。这就是 ESZSL 遵循的范式; 由于不需要每个类的属性或文本描述,这种方法更符合 zero-shot learning 的目标,但是可能表现得更差。

Zero-shot learning 在图像分类、语义分割、图像生成、目标检测、自然语言处理以及其他更具体的用例(如语言翻译)中有着广泛的应用。该领域的研究数量每年都在迅速增长,其中大部分是对传统深度学习方法的创造性突破 —— 毕竟,困难的任务需要更多的创新。

谢谢阅读!

来源:https://medium.com/@andre_ye/what-the-human-brain-has-that-deep-learning-desperately-needs-a-guide-to-zero-shot-learning-2e296741ce51

0 人点赞