我认为AI类似于建造一艘火箭船。你需要一个巨大的发动机和大量的燃料。如果你有一个大型发动机却只有很少的燃料,火箭船就无法进入正确轨道。或者,如果你有一个小型发动机和一吨的燃料,你甚至不能让火箭船起飞。要建造一艘火箭,你需要一个巨大的发动机和大量的燃料。
与深度学习做一个类比,也就是说火箭发动机是深度学习模型,燃料就是我们让这些算法学习的大量数据 -——吴恩达(Andrew Ng)
最近深度学习技术越发流行与普及,在诸如语言翻译,玩策略游戏和自动驾驶汽车等需要数百万个数据点的任务中达到了令人惊叹的水平。使用深度学习来解决问题的一个常见障碍是训练模型所需的数据量。对数据量有这么大的需求是因为机器需要学习模型中存在的大量参数。
以下是这些模型中一些参数数量的例子:
深度学习只不过是大型神经网络,它们可以被认为是一个流程图,其中学习数据被输入,形成的推理/知识从另一方输出。你也可以打破神经网络,把它分开,并从任何你喜欢的地方得出推理。这可能没有什么意义,即便如此,但你可以做,例如 Google DeepDream 。
有趣的是,在所需的数据量和模型的大小之间存在几乎线性的关系。基本原因是,你的模型应该足够大才能捕获你数据中潜在的关系(例如图像中的纹理和形状,文本中的语法和语音中的音素)以及问题的细节(例如类别的数量)。模型的前几层捕获输入信息中不同部分之间的高层关系(如边缘和模式)。后面的层级捕获有助于做出最终决定的信息;这些信息通常是有助于模型在理想输出中做出区分。因此,如果问题的复杂度较高(如图像分类),那么参数的数量和所需的数据量也会非常大。
当处理与你领域特定相关的问题时,通常不可能找到构建此大小的模型所需的数据量。然而,在一个任务上训练的捕获数据类型中的模型(然而,在一个任务上被训练的已经掌握了数据中关系的模型),可以很容易地被再次用于同一领域中的不同问题。 这种技术被称作迁移学习( Transfer Learning )。
迁徙学习就像没有人想要保留的最好的秘密。 行业内的每个人都知道,但门外汉都不知道。
参考深度学习的主要论文 Awesome - Most Cited Deep Learning Papers
超过50%的论文使用了某种形式的迁移学习或预训练。迁移学习变得越来越适用于有限资源(数据和计算)的人,但不幸的是,这种技术并没有足够社会化,就像它应该的那样。最需要它的人却至今还不知道它。
如果深度学习是圣杯,数据是锁住圣杯的大门,那么迁移学习就是钥匙。
通过迁移学习,我们可以采用预训练模型,该训练模型是在大量现成的数据集上训练的(在完全不同的任务上训练,它们具有相同的输入但是输出不同)。然后尝试找到输出可重复使用特征的层。我们使用该层的输出作为输入特征来训练需要较少参数的更小的网络。在已经学习到预训练模型中那些数据的模式后,这个较小的网络只需要学习对于你所需要的特定问题的关系即可。通过这种方式训练的检测猫的模型, 可以重现梵高风格的画作 。
使用迁徙学习的另一个主要优点是模型泛化得很好。较大的模型往往过度拟合(对数据的建模过度概括了数据表达的潜在现象本身)数据,并且当在未遭遇过的数据上测试时,也并不会表现很好。由于迁移学习允许模型接受不同类型的数据,其学习对于世界的基础规则的能力更好。
试着把过拟合看作记忆而不是学习。- James Faghmous
让我们假设你想结束蓝黑与白金连衣裙的辩论。你开始收集已经被经验验证证的蓝黑色礼服和白金色礼服的图片。要建立一个像上面提到的准确的模型(有1.4亿参数!!),为训练这个模型,你将需要找到120万张图像,这是一个不可能的任务。所以你会尝试一下迁移学习。
计算使用迁移学习训练此问题所需的参数数量:
参数数量=((输入规模)+1)*((输出规模)+1)=(2048+1)*(1+1)≈4098个参数
我们看到参数数量从1.4*10^8减少到4*10^3,这是5个数量级 !! 所以收集少于一百个图像的衣服应该不是难事!
如果你不耐烦,不能等到找到衣服的实际颜色,那就向下滚动到底部,看看如何自己建立衣服的模型。
在这个简单示例中我们有72篇电影评论
62个没有赋予情绪,这些会被用来预训练模型
8个被赋予了情绪,这些被用来训练模型
2个被赋予了情绪,这些被用来测试模型
由于我们只有8个已标注的句子(这些句子都包含感情)我们首先预训练模型来预测上下文。如果我们仅在8个句子上训练模型,它会有50%的准确率(50%和掷硬币来预测时一样好的)。
为了解决这个问题,我们会使用迁移学习,首先用62个句子来训练模型。然后我们使用第一个模型的一部分并训练其上的情绪分类器。训练8个句子并测试剩余的2个句子会产生100%的准确率。
我们会训练一个神经网络以使它能建模词与词之间的关系。我们处理一个在句子中见到的词,并预测那些出现在同一个句子里的词。在下面的代码中,嵌入一个大小为词汇量X嵌入尺寸的矩阵,嵌入尺寸(embedding_size)指的是单个词的向量表示(Vector Representation)(在这里我们用4作为尺寸)。
我们将训练该图使得在类似上下文中出现的词应该获得相似的向量表示。我们将通过删除停止词并将其标记化来预处理这些句子。我们每次传递一个单词,并尝试最小化其自身的向量与周围单词的向量距离,并增加与不在其上下文中的几个随机单词的距离。
现在我们将尝试预测句子的情绪。我们有10(8训练+2测试)句子标记为正和负。由于先前的模型已经有学过所有单词的向量,而向量具有数字化表示文字上下文的属性,这将使预测情绪更容易。
我们并不直接使用句子,我们将句子的向量设置为其所有字的平均值(在实际任务中,我们其实将使用类似LSTM神经网络的东西,译者注:LSTM:Long Short-Term Memory)。句子向量将作为输入被传递,输出将为正或负的得分。在它们之间我们将使用一个隐藏层,然后在我们已标记的句子上训练模型。正如你所看到的,只有10个例子,用这个模型我们已经实现了100%的测试精度。
虽然这是一个简单示例,我们可以看到,通过使用迁移学习,获得了非常显著的精度提高,从50% - > 100%。要查看整个示例和代码,请点击这里:
https://gist.github.com/prats226/9fffe8ba08e378e3d027610921c51a78
即使构建模型需要较少的数据,它需要更多的专业知识来使其工作。如果你看上面的例子,仅仅算算硬编码参数的数量,想象一下需要在模型能工作之前不得不摆弄搞定它们(就知道这事有多麻烦了)。这使得转移学习的实际使用很困难。
一些迁移学习的麻烦事列在下面:
找到一个很大的数据集进行预训练
决定采用哪种模型进行预训练
很难调试出两个模型中的哪个没有正常工作
不知道还需要有多少数据才能把这个模型训练好
很难决定到哪里需要停止使用预训练模型
决定预训练模型之上的模型里需要用多少层和多少参数
如何承载混合模型
当有更多的数据或更好的技术时,如何更新预训练模型
找到一个数据科学家很难。找到能明白什么是数据科学家的人一样难。—— Krzysztof Zawadzki
在亲身经历了这些问题后,我们开始通过构建一个易于使用的基于云的深度学习服务来解决这些问题,其中的算法采用迁移学习。它包含一组已经在数百万个参数上训练过的预训练模型。您上传自己的数据(或搜索互联网数据),它选择最佳模型用于您的任务,在现有预训练模型之上创建一个新的NanoNet,使得NanoNet适应您的数据。
1. 选择你想做的类别
2. 一键搜索互联网并建立模型
3. 解答蓝裙vs金裙的谜题(一旦模型建好,我们会提供给你一个易用的互联网接口来上传测试图片和一个与语言无关的(language agnostic)API)
原文链接:https://medium.com/nanonets/nanonets-how-to-use-deep-learning-when-you-have-limited-data-f68c0b512cab#.xpzxrczh9