Matthew Stewart作者陈丹、林亦霖校对于腾凯 编辑车前子翻译

一文读懂神经网络(附解读&案例)

本文的知识将提供一个强有力的基础,带你入门神经网络的性能,应用于深度学习应用。

“你的大脑并不产生思想。你的思想塑造了神经网络。”——Deepak Chopra

引文

J. Nocedal y S. Wright, “Numerical optimization”, Springer, 1999

TLDR: J. Bullinaria, “Learning with Momentum, Conjugate Gradient Learning”, 2015

作为阐明神经网络背后的理论以及如何设计和实现神经网络系列文章的第一篇,本文力求向更广泛的受众群体详细、深入的介绍神经网络,使对神经网络的工作几乎一无所知,或相对熟悉但可能还没有完全掌握的读者都能从中获益。我将在这篇文章中介绍神经网络的动机和基础知识。在以后的文章中将对神经网络深度学习的设计和优化进行更深入的讨论。

本系列教程大部分基于哈佛和斯坦福的计算机科学及数据科学系的课程。

本系列教程中所有(全连接)机器学习的代码都在我的神经网络Github存储库中,通过以下链接就可以找到。

https://github.com/mrdragonbear/Neural-Networks

不论你之前对神经网络有多少了解,都希望你能愉快的看完这篇文章并学到一点知识。现在我们开始吧!

神经网络的动机

没有训练过的神经网络就像刚出生的婴儿:他们对于世界还一无所知(就白板理论而言),只有通过与世界的接触,如获得后验知识,才能慢慢改变他们的无知。算法则是通过数据感受世界——我们通过基于相关数据集训练神经网络来改变它的无知。在这个过程中我们评价的方法是监测神经网络产生的错误。

在深入神经网络的世界前,了解神经网络背后的动机,并理解它们的工作原理是很重要的。为此我们先简要介绍一下logistic回归。

回归是针对定量响应变量(出租车乘客数量,自行车租赁数量)建模并预测的方法,如岭回归、LASSO等。当响应变量是分类变量,这个问题就不再叫做回归问题,而被称为分类问题

我们来考虑一个二分类问题。目标是基于一系列预测变量X,将每一个观测分到定义为Y的类别(如某一级别或集群)中。

如我们可能会根据病人的特征预测其是否有心脏病。这里的响应变量是分类变量的,只有有限个结局,更明确的说,只有两个结局,因为响应变量是二分类的(是/否)。

这里实际有很多特征,但现在我们只使用MaxHR。

为了做出预测,我们使用logistic回归。Logistic回归通过估计患者在给定X值时患心脏病的可能性P(y=1),来解决这个问题。

Logistic回归通过logistic函数来对P(y=1)建模:

这样,模型就能用S型曲线预测P(y=1),这也是logistic函数的基本形状。β0控制曲线右移或左移c=-β0/β1,而β1控制S型曲线的陡峭度。

注意,如果β1是正数, P(y=1)预测值随着X取值由小到大而从0到1变化,如果β1是负数,二者关系则相反。

作图总结如下:

既然我们明白了怎么控制logistic回归曲线,我们就可以通过调整一些变量来得到我们想要的曲线。

我们可以改变β0来移动曲线的偏移量。

我们可以调整β1来改变曲线的梯度

手工做这些事情太无聊了,而且你也很难调整到理想的取值。为解决这个问题我们用一个损失函数来量化基于目前参数产生残差的水平。然后寻找能够最小化损失函数参数值。

因此神经网络参数与网络生成的错误有关,当参数改变时,错误也会改变。我们用于调整参数的优化函数叫做梯度下降,这在寻找函数最小值时非常有用。我们希望能最小化错误,这也被叫做损失函数目标函数

那么以上这些内容有什么意义,和神经网络又有什么关联呢?实际上我们所做的与神经网络算法所做的本质是相同的。

我们在刚刚的模型中仅使用了一个特征,在神经网络中,我们可以使用多个特征。对于每一个特征都可以设置权重和误差项,这两部分结合起来就是回归参数。根据预测结果是连续变量或分类变量,公式可能略有差异。

当我们讨论神经网络权重时,实际讨论的是传入函数的回归参数。传入函数的结果传递给激活函数,由激活函数决定这个结果是否足够“点燃”神经节点。在下一篇文章中,我将更详细地讨论不同种类的激活函数

现在我们建立了一个由多个logistic回归和四个特征组成的简单神经网络

为了开始更新和优化参数,我们需要从任意的值公式开始,我们将在每次更新后评估损失函数并执行梯度下降

我们首先要做的是设置随机选择的权重。在我们的心脏数据中,随机权重很可能表现得很糟糕,模型会因此给出错误的答案。

然后我们通过惩罚表现不佳的网络来“训练”网络

然而,仅仅告诉计算机它的性能是好是坏并没有什么帮助。你需要告诉它如何改变这些权重才能提高模型的性能。

我们已经知道如何告诉计算机网络的预测性能良好,这只需要看看我们的损失函数。但是现在这个过程更复杂了,因为我们有5个权重要处理。首先我只考虑一个权重,因为这个过程对于所有的权重都是类似的。

理想情况下,我们需要知道能够让ℒ(w)达到最小值的w。

为了找到ℒ(w)的最优点,我们可以将ℒ(w)相对于权重w求微分,并使其为0。

然后我们需要找到一个满足这个等式的w,但有时候这个问题没有显式解。

一个更灵活的方法是选择任意一个起点,并确定在哪一个方向上减少损失(当前情况下是选择向左还是向右)。具体来说,我们可以计算出函数在这一点上的斜率。如果斜率为负,则向右移动;如果斜率为正,则向左移动。然后重复此过程,直到收敛

如果步长与斜率成正比,就可以避免错过最小值。

如何执行这样不断更新的过程呢?这是使用一种称为梯度下降的方法完成的,这在前面已经简单地提到过。

梯度下降

梯度下降是求函数最小值的一种迭代方法。有各种的梯度下降方法,我将在后面的文章中详细讨论这些内容。这篇博客介绍了更新权重的不同方法。现在,我们将继续使用普通的梯度下降算法,有时也被称为delta规则

我们知道要朝着导数的相反方向前进(因为我们正试图“远离”误差),并且希望步长与导数成比例。步长由一个称为学习速率的参数λ控制。我们的新权重是旧权重和新步长相加之和,其中步长是从损失函数派生出来的,这就表明相关参数在影响学习率方面有多重要(因此是导数)。

学习率越大,导数权重就越大,这样算法的每次迭代步长都较大。学习率较小,导数权重也较小,因此每次迭代步长较小。

如果步长太小,算法收敛时间会很长,如果步长太大,算法会不断错过最优参数。显然,在建立神经网络时,学习率是一个重要的参数

梯度下降需要考虑以下几个问题:

  •  我们仍然需要推导导数

  • 我们需要知道学习率是多少或如何设置。

  • 我们需要避免局部极小值。

  • 最后,完整的损失函数包括所有单个“误差”的总和。这可以是数十万个像上面例子一样的函数。

现在导数的推导是用自动微分法来完成的,所以这对我们来说不是问题。然而,决定学习率是一个重要而复杂的问题,我将在后面的教程中讨论。

对于神经网络来说,局部最小值是一个非常棘手的问题,因为神经网络的公式并不能保证我们能达到全局最小值。

陷入局部最小值意味着我们仅对参数进行了局部优化,但在损失函数表面的某个点可能存在更优解。神经网络损失曲面可以有许多这样的局部最优,这对于网络优化是有问题的。例如,请参见下面所示的损失面。

我们如何解决这个问题呢?一个建议是使用批量和随机梯度下降。这个想法听起来很复杂,但其实很简单——使用一批(一个子集)数据,而不是使用整个数据集,这样在每次迭代过程中损失函数的曲面都会部分变形。

对于每次迭代k,可以使用以下损失(似然)函数来推导导数

这是完整损失函数的近似值。我们可以用一个例子来说明这一点。首先,我们从完整损失(似然)函数曲面开始,随机分配的网络权重为我们提供初始值。

 然后我们选择一批数据,可能是整个数据集的10%,并构建一个新的损失函数曲面。

然后我们对这个批数据执行梯度下降并更新。

现在我们在一个新的位置。从完整数据集选择一个新的随机子集,然后再次构造损失函数曲面。

然后在这批数据上执行梯度下降和更新。

使用新数据重复以上过程。

执行更新。

这个过程重复多次迭代。

直到网络开始收敛至全局最小值。

现在我们的工具包中有足够的知识来构建我们的第一个神经网络

人工神经网络(Artificial Neural Network,ANN)

我们已经了解了logistic回归是如何工作的、如何评估网络的性能、以及如何更新网络以提高性能,现在我们就可以着手构建一个神经网络了。

首先,我想让大家理解为什么神经网络被称为神经网络。你可能听说过,这是因为它们模仿神经元的结构,即大脑中的细胞。神经元的结构看起来比神经网络复杂得多,但功能相似。

 真正的神经元的工作方式涉及到电位的积累,当超过特定值时,会导致突触前神经元放电穿过轴突并刺激突触后神经元

人类拥有数十亿个相互连接的神经元,它们能产生极其复杂的放电模式。与我们使用最先进的神经网络所能做的相比,人脑的功能是不可思议的。因此,我们很可能不会很快看到神经网络能够模仿人脑的功能。

我们可以画一张神经图,把神经网络中的神经元结构和人工神经元进行类比。

来源

考虑到人脑的能力,很明显人工神经网络的能力范围是无限的——特别是当我们开始把它们与传感器、执行器以及互联网的丰富信息联系起来的时候——这就解释了神经网络在世界上的普及,尽管现在还处于相对初级的发展阶段。

毕竟,还原论者可能会争辩,人类只是通过神经系统的各个部分与传感器和执行器相连的神经网络的集合。

现在假设我们有多个特证。每个特征都通过一个称为仿射变换的东西传递,这个变换基本上是一个加法(或减法)和/或乘法。这形成了一个类似回归方程的东西。当多层感知器中的多个节点在一个节点上会聚时,仿射变换就变得很重要。

然后我们通过激活函数传递这个结果,这给了我们某种形式的概率。这个概率决定了神经元是否会激发——结果可以纳入到损失函数中,以评估算法的性能。

从现在开始,我将把仿射和激活模块抽象为一个模块。但是,我们要明白仿射变换是来自上游节点的输出的合并,然后将总和输出传递给一个激活函数,该函数通过评估概率来确定它是否是足以激发神经元

现在我们可以回到第一个例子来使用心脏病数据。我们可以取两个logistic回归并将它们合并在一起。单个logistic回归如下:

当我们连接这两个网络时,由于自由度的增加,我们获得的网络具有更大的灵活性。

这很好地说明了神经网络的功能,我们能够将多个函数串联在一起(求和),这样就有了大量的函数(来自大量神经元),从而产生高度非线性函数。有了足够多的神经元,就可以产生任意复杂的连续功能。

这是一个非常简单的神经网络的例子,然而,我们还是遇到了一个问题,即使网络如此简单,又该如何更新权重值呢?

我们需要能够计算损失函数对这些权重导数。为了解未知的权重w1、w2和w3,我们需要使用反向传播。

反向传播 

反向传播是神经网络学习的核心机制。它是告诉网络在预测过程中是否出错的信使。反向传播的发现是整个神经网络研究中最重要的里程碑之一。

传播就是在特定的方向或通过特定的媒介传递某种东西(例如光、声音)。当我们讨论神经网络背景下的反向传播时,我们讨论的是信息的传输,这个信息与神经网络在猜测数据时产生的误差有关。

在预测过程中,神经网络通过网络的节点向前传播信号,直到到达作出决定的输出层。然后,网络反向传播有关此预测的误差的信息,以便更改每个参数

反向传播是计算网络中每个参数导数的方法,这是进行梯度下降所必需的。这是一个反向传播和梯度下降的重要区别,因为二者很容易混淆。我们首先执行反向传播,以获得执行梯度下降所需的信息。

你可能已经注意到我们仍然需要计算导数。计算机不能区分,但是我们可以建立一个函数库来实现这一点,而不需要网络设计者的参与,它为我们抽象化了这个过程,这被称为自动微分。下面是一个例子。

我们可以像这样手工完成,然后根据不同网络体系结构和不同节点更改它。

或者,我们可以编写一个与体系结构有内部链接的函数库,这样当网络体系结构更新时,过程就会被抽象并自动更新。

如果你真的想理解这个抽象的自动微分过程有多实用,尝试用六个节点组成一个多层神经网络,然后编写代码来实现反向传播(如果有人有耐心和勇气这么做,向你致敬)。

更复杂的网络

对于大多数应用来说,有两个节点的网络并不是特别有用。通常,我们使用神经网络来近似传统方法难以描述的复杂函数。

神经网络是特殊的,因为它们遵循所谓的普遍近似定理。这个定理表明,在一个神经网络中,给定无限多个神经元,就可以精确地表示任意一个复杂的连续函数。这是一句相当深刻的话,因为它意味着只要有足够的计算能力,我们基本上可以近似任何函数。

显然,在实践中,这个想法有几个问题。首先,我们受到现有数据的限制,这限制了我们预测类别或估计值的潜在准确性。其次,我们受到计算能力的限制。设计一个远远超过世界上最强大的超级计算机能力的网络是相当容易的。

解决这个问题的方法是设计一个网络体系结构,这样我们就能够使用相对较少的计算能力,以最少的数据实现高精度。

更令人印象深刻的是,一个隐藏层足以表示任意精度的函数近似值。

那么,如果一层已经足够,为什么人们要使用多层神经网络呢?

具有多个隐藏层的神经结构

答案很简单。只有一层的网络需要一个非常宽的神经结构,因为浅网络比深网络需要(指数级别)更宽的宽度。此外,浅网络更容易过拟合

这就是深度学习领域(深度指神经网络的多个层次)出现和发展的原因,深度学习机器学习和大多数涉及数据分类和预测的领域占据着当代研究文献的主导地位。

总结

本文讨论了神经网络的动机和背景,并概述了怎样训练神经网络。我们讨论了损失函数、错误传播、激活函数和网络体系结构。下图对所讨论的所有概念以及它们是如何相互关联的进行了很好的总结。

本文的知识将提供一个强有力的基础,我们可以在以后的文章中进一步讨论如何提高神经网络的性能,并将其用于深度学习应用。

原文标题:

Introduction to Neural Networks

原文链接:

https://towardsdatascience.com/simple-introduction-to-neural-networks-ac1d7c3d7a2c

THU数据派
THU数据派

THU数据派"基于清华,放眼世界",以扎实的理工功底闯荡“数据江湖”。发布全球大数据资讯,定期组织线下活动,分享前沿产业动态。了解清华大数据,敬请关注姐妹号“数据派THU”。

入门深度学习其他智能领域神经网络
7
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

数据科学技术

数据科学,又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域中的理论和技术,包括应用数学、统计、模式识别、机器学习、数据可视化、数据仓库以及高性能计算。数据科学通过运用各种相关的数据来帮助非专业人士理解问题。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

学习率技术

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

导数技术

导数(Derivative)是微积分中的重要基础概念。当函数y=f(x)的自变量x在一点x_0上产生一个增量Δx时,函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限a如果存在,a即为在x0处的导数,记作f'(x_0) 或 df(x_0)/dx。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

梯度下降技术

梯度下降是用于查找函数最小值的一阶迭代优化算法。 要使用梯度下降找到函数的局部最小值,可以采用与当前点的函数梯度(或近似梯度)的负值成比例的步骤。 如果采取的步骤与梯度的正值成比例,则接近该函数的局部最大值,被称为梯度上升。

随机梯度下降技术

梯度下降(Gradient Descent)是遵循成本函数的梯度来最小化一个函数的过程。这个过程涉及到对成本形式以及其衍生形式的认知,使得我们可以从已知的给定点朝既定方向移动。比如向下朝最小值移动。 在机器学习中,我们可以利用随机梯度下降的方法来最小化训练模型中的误差,即每次迭代时完成一次评估和更新。 这种优化算法的工作原理是模型每看到一个训练实例,就对其作出预测,并重复迭代该过程到一定的次数。这个流程可以用于找出能导致训练数据最小误差的模型的系数。

目标函数技术

目标函数f(x)就是用设计变量来表示的所追求的目标形式,所以目标函数就是设计变量的函数,是一个标量。从工程意义讲,目标函数是系统的性能标准,比如,一个结构的最轻重量、最低造价、最合理形式;一件产品的最短生产时间、最小能量消耗;一个实验的最佳配方等等,建立目标函数的过程就是寻找设计变量与目标的关系的过程,目标函数和设计变量的关系可用曲线、曲面或超曲面表示。

分类问题技术

分类问题是数据挖掘处理的一个重要组成部分,在机器学习领域,分类问题通常被认为属于监督式学习(supervised learning),也就是说,分类问题的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。根据类别的数量还可以进一步将分类问题划分为二元分类(binary classification)和多元分类(multiclass classification)。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

神经元技术

(人工)神经元是一个类比于生物神经元的数学计算模型,是神经网络的基本组成单元。 对于生物神经网络,每个神经元与其他神经元相连,当它“兴奋”时会向相连的神经元发送化学物质,从而改变这些神经元的电位;神经元的“兴奋”由其电位决定,当它的电位超过一个“阈值”(threshold)便会被激活,亦即“兴奋”。 目前最常见的神经元模型是基于1943年 Warren McCulloch 和 Walter Pitts提出的“M-P 神经元模型”。 在这个模型中,神经元通过带权重的连接接处理来自n个其他神经元的输入信号,其总输入值将与神经元的阈值进行比较,最后通过“激活函数”(activation function)产生神经元的输出。

仿射变换技术

仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。 一个对向量平移,与旋转放大缩小的仿射映射为 上式在齐次坐标上,等价于下面的式子 在分形的研究里,收缩平移仿射映射可以制造制具有自相似性的分形

推荐文章
暂无评论
暂无评论~