深度学习在一些传统方法难以处理的领域有了很大的进展。这种成功是由于改变了传统机器学习的几个出发点,使其在应用于非结构化数据时性能很好。如今深度学习模型可以玩游戏,检测癌症,和人类交谈,自动驾驶。
深度学习变得强大的同时也需要很大的代价。进行深度学习需要大量的数据、昂贵的硬件、甚至更昂贵的精英工程人才。
在Cloudera Fast Forward实验室,我们对能解决这些问题的创新特别兴奋。我们最新的研究报告深入探讨了多任务学习,一种允许机器学习模型同时从多个任务中学习的方法。其中的一个好处就是可以减少训练数据需求。
在本文中,我们将讲述迁移学习,这是一种可以将知识从一项任务迁移到另一项任务的相关技术。迁移学习允许你从相关问题中转移知识而不是针对问题开发一个完全定制的解决方案,这能帮助你更轻松地解决特定问题。通过迁移这些知识,你可以减少很多开支,接下来看一下该方法如何有效地解决上述问题。
为什么深度学习不同于其他方法
迁移学习不是一种新技术,也不是专门针对深度学习的,但考虑到最近深度学习的进展,它是一种令人兴奋的新技术。首先,有必要说明深度学习与传统机器学习的不同之处。
深度学习是在较低的抽象层次上进行的
机器学习是机器自动学习函数权重的一种方式。
确定函数如何从提供的输入产生输出是比较困难的。如果对函数没有任何限制,那么可能性是无穷无尽的。为了简化这个任务,我们通常在功能上强加某种类型的结构——基于我们正在解决的问题的类型或者简单的尝试和误差。这种结构定义了一种机器学习模型。
理论上,结构是无限的,但在实践中,大多数机器学习用例都可以通过应用少数的结构来解决:线性模型、树的集合和支持向量机。数据科学家的工作就是从这一小部分可能的结构中选择正确的结构使用。
这些模型可以作为黑盒对象从各种成熟的机器学习库中获得,并且只需要几行代码就可以训练出来。例如,可以使用Python的scikit-learn来训练一个随机森林模型,如下所示:
clf = RandomForestClassifier()
clf.fit(past_data, labels)
predictions = clf.predict(future_data)
或R中的线性回归模型:
linearModel <- lm(y ~ X, data=pastData)
predictions <- predict(linearModel, futureData)
虽然深度学习是在较低的层次上进行的,但并不是在有限的模型结构中进行选择的,而是允许实践者加上自己设计的模型结构。构建块是可以认为是基本数据转换的模块。这意味着在应用深度学习时,我们需要打开黑盒子,而不是通过算法固定地实现。
这样以来就允许开发者构建更强大的模型,从另一个角度来看这也为模型构建添加了一个全新的维度。尽管大量的深度学习研究报告、实用指南被发表,但要有效地组织这些转变可能是一个困难的过程。
考虑一个极其简单的卷积神经网络图像分类器,它在流行的深度学习库PyTorch中定义:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.conv2_drop = nn.Dropout2d()
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, 10)
def forward(self, x):
x = F.relu(F.max_pool2d(self.conv1(x), 2))
x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
x = x.view(-1, 320)
x = F.relu(self.fc1(x))
x = F.dropout(x, training=self.training)
x = self.fc2(x)
return F.log_softmax(x, dim=1)
因为我们使用的是低级的构建块,所以我们可以更改模型的单个组件(例如F.relu,F.sigmoid)。这为我们提供了可能会产生不同结果的全新模型体系结构,而这种可能性是无限的。
深度学习尚未被充分理解
即使给定一个固定的神经网络架构,训练也是非常困难的。首先,深度学习损失函数不是一般的凸函数,这意味着训练不一定会产生最好的解决方案。其次,深度学习仍然是非常新的,它的许多组成部分还没有被很好地理解。例如,批处理归一化最近受到了关注,因为一些模型中它似乎对良好结果至关重要,但专家们无法就原因达成一致。研究员阿里·拉希米在最近的一次机器学习会议上把深度学习比作炼金术引起了一些争议。
自动特征工程
深度学习中增加的复杂性使一种称为表示学习的技术得以实现,这就是为什么神经网络经常被称为“自动特征工程”。总之,我们以这样一种方式构建模型而不需要从数据集中人工设计有用的特征,这样它们就可以学习任何必要的、对手头任务有用的特征。将特征工程放到模型上是非常强大的,但是需要大量数据和大量计算能力的模型成本。
你能做什么
与其他机器学习方法相比,深度学习显得很复杂,以至于它似乎难以融入你的业务。对于资源有限的组织来说,这种感觉更加强烈。
对于真正需要投入大量资源进行开发的组织,可能确实需要雇佣专家并购买专门的硬件。但在很多情况下,这是不必要的。有很多方法可以在不进行巨额投资的情况下有效地应用它,这就是迁移学习的由来。
转移学习是使知识从一种机器学习模式迁移到另一种机器学习模式的技术。这些模型可能是多年来对模型结构的研究、对庞大数据集的训练以及多年的计算时间进行优化的结果。通过迁移学习,你可以不用付出任何代价就能从这项工作中获得好处。
什么是转移学习?
大多数机器学习任务从零知识开始,这意味着模型的结构和参数开始是随机猜测的。
例如:检测猫模型是通过猜测开始训练的,它通过聚集它所见过的许多不同的猫的共同模式,逐渐了解猫是什么。
在这种情况下,模型学到的所有东西都来自所给出的数据。但这是解决问题的唯一方法吗?在某些情况下,好像是。
检测猫的模型在不相关的应用程序中可能是无用的,比如诈骗检测。它只知道如何理解猫的图片,而不是信用卡交易。
但在其他情况下,两个系统之间好像能够在任务之间共享信息。
猫检测器在相关任务中很有用,比如猫的面部定位。检测器应该已经知道如何检测猫的胡须、鼻子和眼睛——所有这些东西在定位猫的脸时都很有用。
这就是转移学习的本质:采用一个已经学会如何很好地完成一项任务的模型,并将部分知识迁移到相关任务。
当我们检查自己的学习经验时,也证明着迁移学习的正确性;我们定期会迁移过去学到的技能,以便更快地学习新的技能。例如,一个已经学会扔棒球的人不需要完全重新学习扔球的技巧来学习如何扔足球。这些事情是内在相关的,做好其中一件事的能力自然会转化为做好另一件事的能力。
在机器学习领域,没有比过去五年的计算机视觉领域更好的例子了。一开始训练模型是很少见的。相反,我们从一个预先训练好的模型开始,这个模型已经知道如何分类简单的物体,比如猫、狗和雨伞。学习对图像进行分类的模型首先要学习检测一般图像特征,如边缘、形状、文本和面孔。
预训练模型具有这些基本技能。通过在新数据集上添加层或重新训练,可以稍微修改预先训练的分类模型,将这些昂贵的基本技能迁移到新的专门化中,这就是迁移学习。
迁移学习需要更少的训练数据
当你在一个新的与猫相关的任务中再次用你的猫检测模型时,你的模型已经有了“认识一百万只猫的智慧”,这意味着你不需要使用几乎同样多的图片来训练新的任务。
通过迁移学习的模型泛化能力更好
迁移学习提高了泛化能力,或者提高了模型在未经训练的数据上表现良好的能力。这是因为预先训练的模型是有目的地训练任务,这些任务迫使模型学习在相关上下文中有用的通用特性。当模型迁移到一个新的任务时,很难对新的训练数据进行过度拟合,因为模型只能从一个非常一般的知识库中增量地学习。建立一个泛化能力好的模型是机器学习中最困难也是最重要的部分之一。
迁移学习训练过程并不那么脆弱
从一个预先训练好的模型开始有助于克服训练一个复杂模型的、令人沮丧的、脆弱的和混乱的过程。迁移学习将可训练参数的数量减少了100%,使训练更稳定,更容易调试。
转移学习使深度学习更容易
最后,迁移学习使深度学习更容易进行,因为不需要自己成为专家来获得专家级别的结果。比如流行的图像分类模型Resnet-50。
这个特定的架构是如何选择的?这是多年来各种深度学习专家的研究和实验的结果。在这个复杂的结构中有2500万个权重,如果没有对模型的每个组件的广泛了解,从头优化这些权重几乎是不可能的。幸运的是,通过迁移学习,可以重用复杂的结构和优化的权重,大大降低了深入学习的门槛。
结论
迁移学习是一种知识(权重)共享技术,它减少了构建深度学习模型所需的训练数据、计算能力和工程人才的数量。而且,由于深度学习能够比传统机器学习提供显著的改进,因此迁移学习是一个必不可少的工具。
原文链接
本文为云栖社区原创内容,未经允许不得转载。