【新智元导读】解决深度学习问题时,使用迁移学习能够很好地减少所需的训练数据量。但是,使用这种方法需要更多的专业知识,比如判断如何调试问题、将哪一层的输出作为输入。本文首先通过一个简单示例(对影评的情感倾向做预测),手把手教你使用迁移学习。然后,文章介绍了一个有用的机器学习 API(也即作者本人公司的产品)——NanoNets,它包含一组训练含有数百万个参数的预训练模型,上传你自己的数据(或搜索网络数据),它会选择适用于你任务的最佳模型,简化你使用迁移学习训练模型的过程。
近来深度学习大受欢迎,在诸如语言翻译、玩策略游戏和自动驾驶汽车方面都达到了非常高的水平。使用深度学习的一大常见的壁垒是训练模型所需的数据。由于机器需要学习的模型含有大量的参数,所需要的训练数据也因此骤增。
下面是几个例子:
使用深度学习的一大常见的壁垒是训练模型所需的数据,VGGNet 有 1.4亿参数,谷歌GNMT的参数更是高达 3.8亿个。由此所需要的训练数据也是极其巨大的。
深度学习就是堆叠在一起的积木
深度学习只不过是大型的神经网络,你可以把它视为一个流程图,输入数据,输出推理(或者说知识)。你也可以把神经网络拆开来,从任何你喜欢的地方得到推理。你甚至可以什么推理都不要,照样使用深度学习,谷歌的 DeepDream 就是一例。
模型体积 ∝ 数据量 ∝ 问题复杂度
模型大小和所需训练数据的量之间几乎是呈线性相关。简单说就是你的模型需要足够大,能够准确反映你数据中的关系(比如图像数据的纹理和形状,语音数据的语法和发音),以及问题的具体情况(比如有多少分类)。模型的最初几层捕捉输入中不同部分的高层抽象(比如边缘和纹样)。模型的后几层则捕捉有助于最终决策的信息,一般是有助于区分鉴别输出结果的信息。因此,如果问题很复杂(比如图像分类),参数就会很多,所需的训练数据也非常大。
迁移学习:业界保守得最好的秘密
处理你具体专业领域的问题时,要找到构建模型所需要的数据一般是不可能的。但是,在一类问题上训练过的模型可以在相同领域的另一个问题上再次使用。这也就是我们所说的迁移学习。
有句话说得好,迁移学习就是机器学习业界保守得最好的秘密,业内人都知道,但圈外没一个人清楚。
在深度学习顶级论文当中,超过 50% 都使用了某种形式的迁移学习或预训练。迁移学习在资源有限(包括数据和计算力)的人群中得到了越来越广泛的应用,可惜这一概念却没有得到相应的推广。那些最需要迁移学习的人往往不知道迁移学习。
如果说深度学习是深藏高阁中的圣杯而数据是看守,那么迁移学习就是解锁的钥匙。
有了迁移学习,我们就有了一个预训练模型,这个模型已经用现有数据集训练过(处理完全不同的任务,输入完全相同但输出不同)。然后,寻找那些输出可以重复使用特征的层。再将这些层的输出作为输入特征,训练一个体积更小的网络,这个网络所需的参数也更少。这个较小的网络已经从预训练模型中学会了数据中的模式,现在只需要学习特定问题的关系就行了。使用这种方法,一个被训练用于识别猫脸的模型,就可以被用于生成梵高的画作。
使用转移学习的另一个主要优点是模型泛化得很好。较大的模型往往会发生数据过拟合,使用模型没有见过的数据时性能就不行了。 由于转移学习让模型看到不同类型的数据,模型在学习有关世界的基础规则方面表现就更好。
利用迁移学习减少数据
以前有一个很火的争论:一条裙子是蓝黑相间还是白金相间。现在要解决这个问题,你开始收集各种蓝黑裙子和白金裙子的图片。要自己建立一个像正文一开始提到的那样准确的模型(1.4 亿参数!)并且训练这个模型,你可能需要找到 120万张图像,这可是声势浩大的任务。因此,你转而尝试迁移学习。
使用转移学习计算训练此问题所需的参数数量:
参数数量= [尺寸(输入)+ 1] * [尺寸(输出)+ 1]
= [2048 + 1] * [1 + 1] ≈ 4098个参数
我们看到参数数量从1.4 * 10^8减少到4 * 10^3,这整整少了 5个数量级。所以,我们收集不到 100 张裙子的图像就行了。
下面我将手把手教你利用迁移学习分析数据。
当然,你也可以向下滚动到底部,直接看如何建立衣服的模型。
迁移学习实用举例:情感分析
在这个示例中,我们有72条电影评论
因为我们只有8个带标记的句子,我们首先预训练模型只进行上下文预测。 如果我们训练一个只有8个句子的模型,它会给出50%的准确性——而50%跟翻硬币来预测是一样的。
为了解决这个问题,我们使用转移学习,首先使用62个句子来预训练模型。然后,我们使用第一个模型的一部分,并在上面训练情感分类器,对8个句子进行训练。最后,在剩余的2个句子上进行测试时,可获得100%的准确性。
第一步
我们训练一个网络来模拟词之间的关系。我们输入一个句子中的词,并尝试预测与这个词处在同一句话中的其他词。在代码中,嵌入矩阵具有词汇大小x embedding_size,里面存储了每个单词的向量表示(这里使用大小4)。
第二步
我们训练这个图,使在类似上下文中出现的词获得相似的向量表示。预处理这些句子时,我们会删除终止词,并将每个词都转为标记。我们每次输入一个单词,并尝试将这个词与周围单词的距离向量最小化,并增加这个词与不在其上下文中的几个随机单词的距离。
第三步
现在我们尝试预测句子的情绪。 我们有10个(8个训练+2个测试)句子标记为正和负。 由于先前的模型已经具有针对所有单词学习的向量,并且向量具有数字表示单词的上下文的属性,这将使预测情绪更为容易。
将句子的向量设置为该句子所含有单词数量的平均值(在实际任务中,我们将使用类似LSTM的东西)。句子向量将作为输入在模型中传递,输出将为正或负的得分。在标签句子之间我们使用一个隐藏层训练模型。如代码所示,在只有10个例子的情况下,我们使用该模型实现了100%的测试精度。
虽然这是一个示例,我们也可以看到使用迁移学习后,精度有了从 50% 到 100%的显著提升。
要查看整个示例和代码,可以访问这里:
https://gist.github.com/prats226/9fffe8ba08e378e3d027610921c51a78
使用迁移学习的难点
虽然迁移学习在构建模型时需要较少的数据,使用这种方法需要更多的专业知识来使其发挥效用。看上面的例子,只是计算硬编码参数的数量,就可以想象要调试它们直到模型工作有多麻烦了。因此,在实际中使用迁移学习是十分困难的。
迁移学习的一些问题如下:
在亲自体验了这些问题后,我们开始通过构建一个易于使用的基于云的深度学习服务来解决这些问题。我们最终开发了一个机器学习 API,它包含一组训练含有数百万个参数的预训练模型。上传你自己的数据(或搜索网络数据),它会选择适用于你任务的最佳模型,在现有预训练模型之上创建一个新的NanoNet,并将NanoNet 与你的数据进行配适。
现在来看分类蓝黑色裙子和白金色裙子的问题。
访问 www.nanonets.ai,构建你自己的 NanoNets。
首先分类选项
然后使用 NanoNets 自带的搜索引擎,构建模型(你也可以上传你自己的图像)。
最后,一旦模型准备好,系统会反馈给你一个易于使用的网络界面上传测试图像,以及一个任何语言都可以使用的 API——蓝黑裙子和白金裙子的问题就解决了。
原文地址:https://medium.com/nanonets/nanonets-how-to-use-deep-learning-when-you-have-limited-data-f68c0b512cab#.vnvcisivv