从线性回归到神经网络
介绍
深度学习是一个非常时髦的术语。主要原因是,相关技术最近显示出了令人难以置信的能力,能够在从图像识别到文本翻译等各种各样的问题上产生真正好的、甚至是最先进的结果。站在这种不断发展的技术面前,由于可用数据和计算机能力的增加,对于外行来说,有时很难真正了解“幕后发生了什么”。深度学习是什么?神经网络是如何工作的?
通过这篇文章,我们希望能够帮助您消除大多数与主题相关的困惑或疑问,并为正确(即使是最基本的)理解和一些深刻的直觉留出空间。
为此,我们将尝试给出一些简单的关键来理解什么是深度学习,尤其是神经网络是如何工作的。我们会用例子,插图,类比之类的东西尽可能地让你的理解变得简单。我们在这里的目标是尽可能清楚地说明主要的指导方针,而不是用一些技术细节来阻碍读者的理解(尽管如此,这可能非常有趣)。特别是,我们将从简单的问题转向更困难的问题,以便在此过程中展示神经网络如何自然地(至少在精神上)扩展一些众所周知的技术。很明显,在我们的过程中,我们将不得不做一些简化或者省略一些细节。
这篇文章的目的主要是给读者一个简单的概览和一些直观的理解,让读者能够理解机器学习,深度学习和神经网络的主要思想,之后大部分的部分都不需要先进的数学背景。
大纲
在第一部分中,我们给出了机器学习的定义,并用线性回归的基本示例展示了机器学习技术如何旨在从数据中提取知识。
在第二部分中,我们表明问题通常比真正简单的线性回归更难,并且需要一些更先进的机器学习技术。我们介绍的事实是,具有更好预测能力的更高级模型通常会以模型优化或可解释性方面的一些更高难度为代价,然后简要讨论这两个问题。
最后,我们看到对于一些非常复杂的问题,我们可以选择将(部分或全部)可解释性降低到具有更好预测能力的设计模型。我们介绍深度学习,尤其是神经网络。神经网络可以被看作是我们的初始线性回归示例的自然延伸,并讨论了反向传播算法。
基本机器学习
什么是机器学习?
亚瑟·塞缪尔是计算机游戏和人工智能领域的先驱,他将机器学习(ML)定义为研究领域,使计算机无需明确编程即可学习。换句话说,无论我们的算法的目的是什么,实现这一目标的规则都没有明确地编程,而是基于一些有用的数据由计算机“学习”(我们将在稍后回到这个词)。这与经典算法有很大不同。
在经典算法中,规则被明确地给予计算机以执行任务。在机器学习算法中,定义一系列可能规则的模型(参数化或非参数化)被提供给计算机以及一大堆数据和基于这些数据在可能的规则中找到更好规则的策略(优化)。在下一段中,我们将在一个最基本的机器学习模型中显示所有这些元素:线性回归。
简单的线性回归
线性回归是我们能想到的机器学习算法最简单的例子之一。让我们看看它完全符合我们上面给出的描述。假设您有两组关于房屋的数据有两个属性:size (用s表示)和price (用p表示)。现在,假设你想要一个程序,它以房子的size 作为参数,并返回一个price ,即这个房子的估计价格。第一种选择是明确规划规则。在这种情况下,它意味着我们必须明确定义函数f,使得p = f(s)。换句话说,我们必须明确地将价格作为一个明确定义的大小函数。但是我们可能不知道这个函数是什么,或者我们可能只是对它有一个模糊的想法。如果是这样,我们可以依靠数据以机器学习(ML)方式构建我们的规则。然后,我们首先定义一组规则:在这个例子中,我们假设线性规则表示price 和size 之间的联系。因此,我们现在假设f具有f(s)= as + b的形式,其中a和b未指定的参数(自由度)需要基于可用数据并遵循给定策略来定义。传统上,对于线性回归,这种策略非常简单,包括选择a和b,最小化真实输出和预测输出之间的平方误差之和。这可以在线性回归情况下以分析方式完成(我们可以找到封闭形式的解决方案)。但我们会发现事情并不总是那么容易。然而,我们可以注意到在这个例子中我们有三个提到的部分:一个(参数化)模型,一些数据和一个优化策略(一种找到最佳参数的方法)。我们将在本文讨论的更高级的方法中再次遇到这个triptych (模型/数据/优化)。
非参数化模型
前一个线性回归的例子是参数化模型的例子,其中a和b是参数。在本文档中,我们将主要处理这类模型,因为我们想展示向(高度)参数化的神经网络的转换。然而,我们应该记住,也存在非参数化模型。尽管如此,triptych还是保持原样。模型仍然定义了一组可能的函数,并且这些函数之间的选择是基于给定优化策略(大多数情况下是最小化误差)下的可用数据完成的。
高级机器学习
问题往往变得更难
当然,问题不能总是用线性回归这样简单的方法解决,在大多数情况下,我们必须构建更复杂的模型。有些问题甚至不适合线性回归建议的特定框架(即:采取一些实际输入并返回实际输出)。然而,无论我们选择何种方法,我们总能恢复基础的模型/数据/优化。
例如,假设您有一些关于客户正在使用您的某项服务的用途的数据,并且您希望工具根据这些数据预测客户端是否会流失。在此示例中,要预测的输出不是实际值而是二进制值(二元分类问题),因此,我们面临分类问题而不是回归问题。然后,输出预测应该是0和1之间的流失概率,并且具有无界输出的线性回归应该例如通过在线性输出之上应用专用非线性函数而变成逻辑回归。
另一个例子是考虑客户细分问题。假设您有一些关于客户的数据,并且您希望在这些数据中展示集群以获得客户细分。这里的问题不再是监督问题。实际上,我们不想学习某些输入和给定输出(监督)之间的映射,但我们在未标记数据中寻找一些结构(无监督)。
即使我们不打算提供有关各种机器学习算法的详细信息,我们也可以给出以下要点:更高级的模型旨在表达数据中更复杂的结构,但它可能以某些困难为代价优化或解释模型。我们此后讨论这两点。
优化
一旦定义了模型,就必须对其进行优化以使数据“足够”以捕获数据中的相关一般结构,同时忽略不相关的特定“噪声”(我们稍后将讨论“过度拟合”的概念)实际上,正如前文所述,模型定义了空间(可能“实例”的空间),且我们需要在该空间中找到关于所选度量的最佳点(一种评估该空间中每个点的质量的方法)。
首先,对于非常简单的方法,我们可以面对一个类似于二次优化的问题。这里我们指的是有可能找到问题的封闭解的情况(我们知道如何用数学表示问题的解)。线性回归显然就是这样一种方法。我们可以得到一个封闭解,这一点非常吸引人,但也反映了模型所定义的空间的简单性,以及在数据中捕捉复杂结构的能力。
线性导数的二次最小化。用解析的方法求最小值是很简单的:我们只需要求一个线性函数的0。
然后,优化问题可以是非二次但是凸的。非二次优化问题通常不能以分析方式解决,并且大多数时候需要迭代方法。这些迭代方法背后的主要思想是从空间的给定点开始 - 我们的模型描述的空间中一个点是模型的一个实例,例如具有特定参数 - 并尝试改进此解决方案迭代通过迭代选择,在每次迭代中,在我们的空间中向最佳方向迈出一小步(取决于我们如何定义“最佳”的概念)。这些迭代方法可以采用不同的形状,例如各种梯度下降变量,EM算法等,但最后基本思想是相同的:我们找不到直接的解决方案,所以我们从一个给定的点开始,逐步进行每一次迭代,朝着改进当前解决方案的方向迈出一小步。有关梯度下降的说明,请参见下图。对于这样的迭代方法,空间的凸性是一个非常重要的属性,确保无论选择的起点如何,我们都将达到全局最优点(我们将获得的模型实例对于定义的优化问题将是最好的)。
凸最小化。找到最小值并不简单,需要迭代方法(因为导数不再是线性的)。在这里,我们使用梯度下降。然而,凸性确保迭代方法将达到全局最小值。
最后,模型定义的空间可以是非凸的,然后我们面临非凸优化问题。在这种情况下,非线性将再次强制使用迭代方法。然而,非凸性使得我们不再确定迭代过程将在整个空间上达到最佳可能点。换句话说,我们获得的最佳(模型实例)高度取决于我们选择的起点。这显然是我们可能遇到的最优化问题的最坏情况,以及一些更先进的模型在数据内表达复杂结构的高能力的明显缺点。
非凸最小化。找到最小值需要迭代方法(此处为梯度下降),但非凸性使得有可能达到局部最小值而不是全局最小值,具体取决于起点。
过度拟合
在机器学习中,一般来说,在处理优化过程时,我们需要非常小心过度拟合。当模型不仅学习了我们想要的有趣的一般特征而且还学习了一些特定的不需要的噪声时,我们说该模型会过度拟合数据。换句话说,过度拟合是指优化过程导致模型实例过于接近训练数据,因此,这不会很好地泛化为新的看不见的数据。下图很好地说明了过度拟合的现象。
从左到右:欠拟合,拟合和过度拟合。在同一组数据上,我们拟合不同程度的多项式函数。我们可以看到1次多项式函数的自由度不够,而20次多项式函数的自由度太多。
模型的参数数量与可用于训练的数据数量之间的比率会对过度拟合风险产生影响。如果与参数的数量相比没有足够的数据,则在某种意义上,存在用于学习不期望的噪声的空间。但是,如果数据的数量足够大,它将具有正则化效果,并将强制参数仅学习一般特征(参见下图)。在拟合神经网络时,参数的数量可能非常高,因此过度拟合的风险也很高。
从左到右:拟合5次多项式函数,10,30和100点。我们可以看到更多的点具有正则化效应:对于100个点,拟合曲线看起来像2次多项式函数。
我们应该注意到,规范参数/约束参数以关注一般特征的另一种方法是引入显式规则。我们不会在本文中提供任何有关此内容的详细信息,但它在机器学习中是一个非常重要的概念:误差函数(我们希望优化)通常包含regularisers执行所需的关注的主要特征和降低噪音的潜在影响。
模型可解释性
模型的可解释性是一个不容忽视的大问题,有时是决定选择一个模型而不是另一个模型的决定性因素。
通过模型的“可解释性”,我们的意思是,一旦模型优化,就能理解为什么某些输入会产生一些输出。让我们以前一部分的线性回归为例(p = f(s)= as + b,其中s是房屋的大小,p是其价格)。一旦我们根据数据优化了参数a和b,我们就可以完全解释我们获得的内容。事实上,我们可以说,为了猜测新房的价格,我们有一个b单位的基本价格我们添加了每个房屋大小的units of money t。同样,线性回归的完全可解释性来自其过于简单化以及在建模方面的一些限制。相反,有些模型非常强大,但可解释性较小(如果有的话)。但是,模型的性能与其可解释性之间不一定存在直接联系。例如,已知SVM在许多问题上表现良好,并且它们的可解释性也很好。
可解释性的重要性
请注意,随着机器学习在我们的日常生活中占据越来越重要的位置,可解释性问题正变得越来越重要,在未来也会越来越重要。机器学习模型将帮助人类完成一些(可能很重要的)任务(在健康、金融、驾驶……方面),我们有时希望能够理解模型返回的结果是如何获得的。例如,一个智能键盘在输入信息时可以显示下一个最可能出现的单词,这并不一定要能被理解:我们只是想让它更高效。然而,可以在准确的基础上更好地解释预测疾病存在与否的模型:在这种情况下,我们不仅对结果感兴趣,而且我们想要理解其背后的“逻辑”。
因此,可解释性对于模型来说是非常吸引人的特征。然而,有时需要通过建立一些非常复杂的模型来交换一些(如果不是全部)可解释性以获得更大的预测能力:这正是在下一节中讨论的神经网络的情况下所做的。
深度学习
我们在说啥啊?
对Google的快速搜索为我们提供了“深度学习”的定义:“深度学习方法的集合是旨在对数据进行高度抽象建模的更广泛的机器学习方法家族的一部分”。在这里,我们应该明白,深度学习包括建立非常复杂的模型,权衡可解释性和预测能力。
神经网络属于深度学习方法。它们是高度参数化的复杂函数,我们尝试优化(我们搜索最佳参数)以拟合我们的数据。如果我们想要在极端情况下进行说明,我们可以说神经网络是线性回归的非常复杂的“进化”,设计成能够在数据中建模复杂的结构。
让我们考虑一下回归或分类问题。在这两种情况下,我们都有一些输入,用(i1,i2,...,in)表示,我们想找到这些输入的函数,很好地解释观察到的相应输出,用(o1,o2,...,om表示)。换句话说,就像我们的线性回归示例一样,我们正在寻找一个函数f,使得(o1,o2,...,om)很好地近似为f(i1,i2,...,in)。神经网络建模背后的想法是建立高度参数化的非常灵活的函数,对于人来说,不作任何先验的感知,而在学习阶段成形。让我们试着在一个简单的神经网络上说明这一点。
基本的Forward神经网络
在本小节中,我们将介绍基本的Forward 神经网络。它将使我们有机会介绍一些关于神经网络的基本术语,并清楚地看到它们如何被视为线性回归的自然延伸。
然后,让我们再次考虑我们的房屋定价示例,但这次有2个输入可用(让我们表示这些输入i1和i2)
所以我们想学习函数f,使得f(i1,i2)是o1的一个很好的估计。然后我们可以建议以下第一个模型:
其中w11和w12只是权重/系数。在继续之前,我们应该注意到,在这里,模型中没有常数项。但是,我们可以通过设置f1(i1,i2)= w11 * i1 + w12 * i2 + c来引入这给项。为了缩短一些符号,我们不会在下面写出这样的常量术语,但读者应该记住,它们总是可以添加(并且通常是)。
这种模型是多输入的线性回归模型(也称为多元线性回归),可以表示如下。
多元性回归的“网络”图形表示(模型f1)
在这种情况下,该模型易于理解和拟合,但有一个很大的缺点:没有非线性!这显然不尊重我们的非线性假设。为了引入非线性,让我们在之前的模型中进行一些修改,并提出以下建议。
其中a(.)是一个称为“激活函数”的函数,它是非线性的。然后,我们可以注意到w11 * i1 + w12 * i2仍然是线性的,但是当我们使这个值通过非线性函数时,整体结果不再是线性的,因此,这个模型比我们的假设更接近以前的模型。该模型可表示如下。
f2模型的“网络”图形表示。如果激活函数 a是逻辑函数,则它定义了众所周知的逻辑回归模型。
请注意,如果我们选择所谓的“逻辑函数”作为激活函数,我们将这种方式定义为一种称为“逻辑回归”的模型,该模型可以适用于某些二元分类问题(实际上逻辑函数输出0到1之间的数字)然后可以看作是两个类别之一的概率)。
然而,即使该模型优于多线性模型,它仍然过于简单,不能处理输入和输出之间假定的潜在复杂关系。我们可以通过以下方法进一步丰富模型。首先我们可以认为a(w11 * i1 + w12 * i2)不再是最终输出,而是我们函数的一个新的中间特征,称为l1。其次,我们可以考虑以相同的方式构建几个(在我们的示例中为3个)这样的特征,但可能具有不同的权重和不同的激活函数:l1 = a11(w11 * i1 + w12 * i2),l2 = a12(w21 * i1 + w22 * i2)和l3 = a13(w31 * i1 + w32 * i2),其中a只是激活函数而w是权重。最后,我们可以认为我们的最终输出是基于具有相同“template”的这些中间特征构建的:a2(v1 * l1 + v2 * l2 + v3 * l3)。如果我们汇总了所有的部分,那么我们得到:
我们应该主要记住a是非线性激活函数,而w和v是权重。在下图中,我们以与之前的模型相同的方式给出了该模型的网络图形表示。
f3模型的“网络”图形表示。这里我们有一个神经网络,有2个条目,1个隐藏层,3个隐藏节点/神经元和1个输出。
该最后一种模型是基本前馈神经网络,其具有2个输入(i1和i2),1个隐藏层,带有3个隐藏神经元(其输出是l1、l2和l3)和1个最终输出。我们可以决定在l和最终输出之间添加另一个中间“隐藏”层,就像我们在输入和输出之间添加这些l一样:这样我们就有了一个具有两个隐藏层的神经网络。或者我们也可以选择保留一个隐含层,但是里面有更多的神经元(例如,5个而不是3个)。因此,我们有不同的方法来丰富/使模型复杂化,从而使权重的数量增加。
最后,让我们注意一些重要的事情。首先,在数学描述这些网络的过程中,我们可以(并且我们总是这样做!)用矩阵符号编写所有以前的方程式:它使所有这些对于大型架构来说更加清晰。但是,在这里,我们的示例足够小,不能使用矩阵表示法,因此,我们可以避免使用这些表示法的读者可能不放心。其次,所有神经网络都不适合上述模板:有不同类型的架构(我们将在下一段中对它进行一些说明),但前馈神经网络实际上是第一个要理解的基本架构。第三,一旦定义,模型仍然需要拟合(权重应该根据数据进行调整,以最小化某些误差函数,就像线性回归那样),这是一项非常困难的优化任务。
不同的需求,不同的架构
正如我们在前一段中所看到的,神经网络是通过其参数高度可调的函数模板,需要对其进行优化以拟合数据。但是,根据问题的性质和要建模的数据,我们可能希望使用不同类型的templates。这些不同类型的templates称为不同的“架构”。例如,上面讨论的基本Forward 神经网络(也称为多层感知器)是第一个基本架构。众所周知的架构中,还有循环神经网络(RNN) -它表示一些连续数据的递归函数其中t时刻的输出取决于t时刻的输入和t-1 -时刻的前一个输出- 和卷积神经网络(CNN) - 表示对输入的数学卷积运算,并且在一些基于图像的问题(例如图像识别)中显示出良好的属性。
在所有正在进行的研究工作中,总有更多的架构是根据要建模的问题来设想的。显然,我们不能描述所有这些类型的体系结构(这完全超出了本文的范围),但这里最重要的是,神经网络的体系结构应该始终被看作是一个可能函数的空间,在这个空间中,优化网络的参数等价于在这个空间中找到最好的函数(基于最优性准则)。因此,选择正确的架构当然很重要。
为什么这是个好主意?
在使神经网络如此有效和流行的原因中,我们可以提到以下三个。首先,在许多领域中可用的数据量总是不断增加,这使得合理地使用这些高度参数化的模型。请注意,模型的参数也称为“自由度”,模型中的许多自由度需要许多数据来调整/校准这个模型。就像你在线性方程组中无法承受未知数多于方程一样,你在网络中需要的数据多于参数(事实上,多得多更好)。其次,与智能优化技术相结合的计算能力(始终是更大)使得能够用如此多的参数在非常大规模的模型上进行训练。在大型模型中,可能有数百万个参数需要优化,并且需要最少的计算能力才能在合理的时间内实现优化过程。最后,正如我们刚才所说的,优化过程是一项艰巨的任务,而优化技术,如众所周知的“反向传播”,非常适合基于计算机的优化框架,是神经网络成功的主要解释之一。
神经网络很难优化
什么是反向传播呢?在回答这个问题之前,让我们简要讨论一下我们在处理神经网络时需要面对的优化问题。我们在选择的“体系结构”所描述的函数空间中寻找最好的函数(用于最小化某些预定义误差度量的参数)。由于构成该“体系结构”的非线性激活函数,以及模型定义的参数化函数的整体复杂性,我们面临的最小化问题是非线性的、非凸的。
优化问题的非线性要求使用前面描述的迭代方法。因此,其思想是:随机设置网络的初始权值(给定一些精心选择的分布),然后对所有这些参数应用梯度下降法迭代改进(减少)误差度量。用另一种方式说它的意思是:通过网络与你的数据,观察结果,比较模型输出的结果和真正的预期结果,然后改变一点网络中的权重,使结果稍微接近真实价值(通过梯度下降方法),重复这个过程。
让我们举个例子来说明。考虑前面介绍的简单forward 神经网络(包含2个输入,1个隐藏层,3个隐藏神经元和1个输出)。假设该神经网络的权值在给定时间处于某种状态(见下图)。然后,我们可以为数据集中的每个输入计算具有当前权重的预测输出。
在步骤开始时,神经网络将其权重设置为某些值。然后我们可以为所有输入(i1,i2)计算forward 路径 。
么一个权重w在某种意义上“+_w”(increase)或“-_w”(decrease),其中_w为正表示权重增加多少,为负表示减少多少。
现在,为了实现梯度下降的一个步骤,我们应当独立地向我们自己询问:什么动作将降低这种权重的增加和降低之间的误差。
一旦实现了forward 计算,就可以计算与每个输入相关的误差。总误差是每个输入数据的各个误差的总和。对于每个权重,我们可以指定(在图形上的括号之间)相对于该权重的总误差的导数的相反符号。 粗略地说,对于每个权重,这些值回答了这个问题:如果我们假设所有其他权重都是固定的,那么我们是应该增加还是减少这个权重来降低总误差?
一旦它已经为每一个权重完成后,我们可以将标有梯度下降一步,所有的权重标记为“ +α_ w ^ ”更新成W ← W + α_ W * STEP_SIZE,而标有“-α_ w^“更新为w ← w- α_w * step_size(见下图)。请注意,step_size定义了每次迭代时权重的变化,并且可以在训练时间内进化。一旦完成该步骤,我们就可以重新开始一次新的迭代,直到权重无法再改进为止。
最后,我们可以应用梯度下降步骤。我们在这个例子中考虑 了步长为0.1。然后更新权重(图中详细说明了两个例子)然后我们可以重新开始,直到权重不再被改进。
即使我们不提供更多关于它的细节,我们也应该提到,对于大多数迭代优化过程来说,没有什么可以确保我们在迭代结束时网络的状态(关于误差)比初始状态更好(特别是因为步长可能太大,或者因为我们计算每个权重的更新值,假设其他所有权重都是固定的,但我们同时更新所有权重)。
反向传播作为“逐层”梯度下降
我们刚刚描述了神经网络上的梯度下降过程。然而,为了能够对权值进行这些“小移动”,我们仍然需要计算误差项对网络中每个权值的导数(我们需要知道每个权值是增加还是减少)。它需要针对每个权重计算由网络表示的函数的导数。这是一项非常重要的任务,除非我们利用网络的分层结构来帮助我们。反向传播算法在于使用这种特定的分层结构来使导数的计算有效。为了这,我们依赖的事实是,关于给定层权重的导数可以表示为两种情况的函数:第一,相对于下一级权重的导数,第二,在 forward pass中取神经元的值。网络中导数的这种特殊表达式直接来源于复合函数(f(g(x)) ' = f ' (g(x))*g ' (x))的数学导数。然后,进行高效的导数计算。我们从计算forward pass(我们提供输入并运行计算直到输出)。然后我们返回相反的方向,首先根据最后一层的权重计算误差的导数。基于这些计算,我们可以计算相对于前一层的导数,依此类推,返回到第一层。换句话说,我们“反向传播”网络中的导数计算。这种算法技术使优化过程更容易处理。
局部最小值和过度拟合风险
通过神经网络的优化过程获得的解决方案的质量很大程度上受到底层优化问题的非凸性以及由于模型中的大量参数导致的过度拟合风险的影响。
由于优化问题的高度复杂性,迭代方法几乎不可能导致全局最优。所面临的优化问题的非凸性带来了在迭代过程中保持陷入局部最小值的巨大风险。出于这个原因(并且还解决计算约束),也可以使用随机梯度下降(SGD)。SGD包括不使用整个训练数据集来进行权重更新(通过梯度下降),而是连续使用不同批次的数据,以使优化过程有点嘈杂并有机会克服。
此外,在拟合/训练神经网络时,我们必须特别注意过度拟合的风险。为了避免过度拟合,我们可以减少网络参数的数量,获取更多数据或使用explicit regularisers。
最后
在这篇文章中,我们试图给读者一些关于神经网络的直觉。为此,我们从机器学习及其简单模型的概念转变为基于神经网络的深度学习的更具体概念。在此过程中,我们遇到了与机器学习相关的各种概念,例如迭代优化,过度拟合风险等。正如我们在介绍中所提到的,这里的目的根本不是要深入探讨问题的每一部分,而是要大致了解“why”,“what”和“how”。
主要内容如下:
- 机器学习是一门研究领域,它使计算机无需明确编程即可学习。
- 机器学习依赖于triptych模型/数据/优化。
- 在设置更复杂的模型时,主要有两点需要注意:如何优化以及如何解释?
- 粗略地说,当使用深度学习和神经网络时,我们通过建立非常复杂的模型而放弃了可解释性以获得更大的预测能力。
- 神经网络所取得的成功主要来自于可用数据和计算能力的不断增加以及非常有效的反向传播理念,这使得优化过程更易于处理。
总而言之,神经网络是非常强大的工具。他们已经展示了他们在大量现代问题上表现出色的能力。但是,它们不是能够解决任何问题的神奇工具。这项工作的真正智能部分仍然掌握在人类手中,以正确的方式知道在何处以及如何使用这些模型。