我们探索神经网络如何发挥作用,以建立对深度学习的直观理解
如今,深度学习已成为热门话题。 但是,什么使它与众不同并使它与机器学习的其他方面区分开? 这是一个很深的问题(对双关语)。 为了甚至开始回答它,我们将需要学习神经网络的基础知识。
神经网络是深度学习的主力军。 尽管它们看起来像黑匣子,但内心深处(对不起,我将阻止可怕的双关语),他们正在尝试与其他模型一样完成相同的任务-做出良好的预测。
在本文中,我们将探讨简单神经网络的来龙去脉。 最后,希望您(和我)将对神经网络的工作方式有更深入,更直观的理解。
30,000英尺的视图
让我们从一个高层次的概述开始,以便我们知道我们正在使用什么。 神经网络是神经元的多层网络(下图中的蓝色和洋红色节点),用于对事物进行分类,进行预测等。下图是一个简单的神经网络的示意图,其中具有五个输入,五个输出和两个神经元的隐藏层。
从左边开始,我们有:
- 模型的输入层为橙色。
- 我们的蓝色神经元的第一个隐藏层。
- 我们在洋红色中隐藏的第二层神经元。
- 我们模型的输出层(也称为预测)为绿色。
连接点的箭头显示了所有神经元如何相互连接,以及数据如何从输入层一直传递到输出层。
稍后,我们将逐步计算每个输出值。 我们还将观察神经网络如何使用称为反向传播的过程从错误中学习。
获取我们的装备
但是首先让我们了解一下。 神经网络到底想做什么? 与其他任何模型一样,它正在尝试做出良好的预测。 我们有一组输入和一组目标值,并且我们试图获得与这些目标值尽可能接近的预测。
忘了我上面绘制的神经网络的更复杂外观的图片,然后专注于下面的这个简单的图片。
这是通过神经网络表示的单特征逻辑回归(我们只给模型一个X变量)(如果您需要对逻辑回归进行复习,我在这里写过)。 要查看它们之间的关系,我们可以使用神经网络颜色代码重写逻辑回归方程。
让我们检查一下每个元素:
- X(橙色)是我们的输入,这是我们赋予模型以计算预测的唯一特征。
- B1(绿松石色,又称蓝绿色)是逻辑回归的估计斜率参数-B1告诉我们Log_Odds随着X的变化而变化了多少。 请注意,B1位于绿松石线上,该绿松石线将输入X连接到隐藏层1中的蓝色神经元。
- B0(蓝色)是偏差-与回归的截距项非常相似。 关键区别在于在神经网络中,每个神经元都有其自己的偏差项(而在回归中,模型具有一个奇异的拦截项)。
- 蓝色神经元还包括一个S型激活函数(由蓝色圆圈内的曲线表示)。 记住,Sigmoid函数是我们用来从对数奇数到概率的函数(在我的前一篇文章中用control -f搜索" Sigmoid")。
- 最后,通过将S形函数应用于量(B1 * X + B0)来获得预测概率。
还不错吧? 因此,让我们回顾一下。 一个超简单的神经网络仅包含以下组件:
- 一个连接(尽管在实践中,通常会有多个连接,每个连接都有自己的权重,进入特定的神经元),权重"在其中生活",可以转换您的输入(使用B1)并将其提供给神经元 。
- 包含附加项(B0)和激活函数(在我们的情况下为S型)的神经元。
而这两个对象是神经网络的基本构建块。 更复杂的神经网络只是具有更多隐藏层的模型,这意味着更多的神经元和神经元之间的更多连接。 而这种更为复杂的连接网络(以及权重和偏差)使神经网络可以"学习"隐藏在数据中的复杂关系。
现在让我们添加一点复杂性
现在我们有了基本的框架,让我们回到稍微复杂的神经网络,看看它如何从输入到输出。 这里再次供参考:
第一隐藏层由两个神经元组成。 因此,要将所有五个输入连接到隐藏层1中的神经元,我们需要十个连接。 下一个图像(下图)仅显示输入1和隐藏层1之间的连接。
请注意我们对存在于连接中的权重的表示法-W1,1表示存在于输入1和神经元1之间的连接权重,W1,2表示存在于输入1和神经元2之间的连接权重。 我要遵循的是Wa,b表示输入a(或神经元a)和神经元b之间的连接权重。
现在,我们计算隐藏层1中每个神经元的输出(称为激活)。 为此,我们使用以下公式(W表示重量,In表示输入)。
Z1 = W1 * In1 + W2 * In2 + W3 * In3 + W4 * In4 + W5 * In5 + Bias_Neuron1
神经元1激活= Sigmoid(Z1)
我们可以使用矩阵数学来总结此计算(请记住我们的表示法规则-例如,W4,2表示输入4和神经元2之间的连接中存在的权重):
对于神经网络的任何一层,其中前一层的深度为m个元素,而当前层的深度为n个元素,这可以概括为:
[W] @ [X] + [Bias] = [Z]
其中[W]是您的权重的n×m矩阵(前一层和当前层之间的连接),[X]是您的m×1矩阵,是开始输入或来自前一层的激活,[Bias]是您的 n×1的神经元偏差矩阵,[Z]是n×1的中间输出矩阵。 在前面的公式中,我遵循Python表示法,并使用@表示矩阵乘法。 一旦有了[Z],就可以对[Z]的每个元素应用激活函数(在本例中为S型),这将为我们提供当前层的神经元输出(激活)。
最后,在继续进行操作之前,让我们将这些元素中的每一个直观地映射回我们的神经网络图上,以将所有元素捆绑在一起([Bias]嵌入在蓝色神经元中)。
通过重复计算[Z]并将激活函数应用于每个连续层,我们可以从输入移至输出。 此过程称为前向传播。 现在我们知道了输出的计算方式,是时候开始评估输出的质量并训练我们的神经网络了。
神经网络学习的时间
这将是一篇很长的文章,所以现在可以喝杯咖啡休息一下。 还在我这儿? 太棒了! 现在我们知道了神经网络的输出值是如何计算的,现在该训练它了。
高层神经网络的训练过程类似于许多其他数据科学模型的训练过程-定义成本函数并使用梯度下降优化将其最小化。
首先,让我们考虑一下我们可以利用哪些杠杆来最小化成本函数。 在传统的线性或逻辑回归中,我们正在寻找最小化成本函数的β系数(B0,B1,B2等)。 对于神经网络,我们正在做相同的事情,但是规模更大,更复杂。
在传统回归中,我们可以单独更改任何特定的beta,而不会影响其他beta系数。 因此,通过对每个β系数应用较小的单独变化,并测量其对成本函数的影响,相对容易地找出我们需要朝哪个方向降低和最终使成本函数最小化。
在神经网络中,更改任何一个连接的权重(或神经元的偏置)会对所有其他神经元及其后续层中的激活产生回响效果。
那是因为神经网络中的每个神经元就像它自己的小模型。 例如,如果我们想要五特征逻辑回归,则可以通过神经网络(如左侧的神经网络)仅使用单个神经元来表达它!
因此,神经网络的每个隐藏层基本上都是模型的堆栈(该层中的每个神经元的行为都像其自己的模型一样),其输出会馈送至更下游的更多模型(神经网络的每个连续的隐藏层都包含更多的神经元) 。
成本函数
因此,鉴于所有这些复杂性,我们该怎么办? 其实还不错。 让我们逐步进行。 首先,让我明确说明我们的目标。 给定一组训练输入(我们的功能)和结果(我们试图预测的目标):
我们想要找到一组权重(请记住,神经网络中任意两个元素之间的每条连接线都具有权重)和偏差(每个神经元都具有偏差)可以使我们的成本函数最小化-其中,成本函数近似于 错误的,我们的预测与目标结果有关。
为了训练我们的神经网络,我们将使用均方误差(MSE)作为代价函数:
MSE =总和[(预测-实际)2] *(1 / num_observations)
模型的MSE平均告诉我们我们有多错,但是有一个转折-通过对预测的误差求平方,然后对它们进行平均,我们对那些偏离很小的预测的惩罚要严重得多。 线性回归和逻辑回归的成本函数以非常相似的方式运行。
好的,很酷,我们有一个成本函数要最小化。 是时候触发梯度下降了吗?
并不是那么快-要使用梯度下降,我们需要知道我们的成本函数的梯度,即指向最大陡度方向的向量(我们想在梯度的相反方向上反复采取步骤,最终达到最小 )。
除了在神经网络中,我们还有很多相互联系的可变权重和偏差。 我们将如何计算所有梯度? 在下一节中,我们将了解反向传播如何帮助我们解决这个问题。
梯度下降快速回顾
函数的梯度是向量,向量的元素是其相对于每个参数的偏导数。 例如,如果我们试图通过仅两个可变参数B0和B1最小化成本函数C(B0,B1),则梯度将为:
C(B0,B1)的梯度= [[dC / dB0],[dC / dB1]]
因此,梯度的每个元素都告诉我们,如果对特定参数进行小的更改,则成本函数将如何更改-因此,我们知道要调整的内容以及调整的幅度。 总而言之,我们可以按照以下步骤迈向最低标准:
- 计算"当前位置"的梯度(使用当前参数值计算梯度)。
- 修改每个参数的量应与它的渐变元素成比例,并且方向与其渐变元素相反。 例如,如果我们的成本函数相对于B0的偏导数为正但很小,而相对于B1的偏导数为负且很大,那么我们要小幅减少B0并大幅度增加B1到 降低我们的成本函数。
- 使用新的调整后的参数值重新计算梯度,并重复前面的步骤,直到达到最小值。
反向传播
对于详细的数学知识,我将参考这本出色的教科书(在线和免费!)(如果您想更深入地了解神经网络,请务必查看一下)。 取而代之的是,我们将尽最大努力对反向传播的工作方式和原因建立直观的了解。
请记住,正向传播是通过神经网络(从输入到最终输出或预测)前进的过程。 反向传播是相反的。 除了代替信号,我们还在模型中向后移动误差。
当我试图了解反向传播过程时,一些简单的可视化效果大有帮助。 下面是我对一个简单的神经网络的心理印象,因为它正从输入传播到输出。 该过程可以归纳为以下步骤:
- 输入被馈送到神经元的蓝色层,并通过每个神经元中的权重,偏差和S形曲线进行修改以得到激活。 例如:Activation_1 = Sigmoid(Bias_1 + W1 * Input_1)
- 来自蓝色层的激活1和激活2被馈送到品红色神经元中,洋红色神经元使用它们来产生最终的输出激活。
正向传播的目的是为每个连续的隐藏层计算每个神经元的激活,直到我们到达输出。
现在,我们将其反转。 如果遵循红色箭头(如下图所示),您会注意到我们现在从洋红色神经元的输出开始。 那就是我们用来进行预测的输出激活,以及模型中误差的最终来源。 然后,我们使用与正向传播信号时所用的权重和连接相同的权重和连接,在模型中向后移动此错误(因此,除了激活1,现在我们有了Error1-归因于顶部蓝色神经元的错误)。
还记得我们说过的正向传播的目标是逐层计算神经元激活,直到获得输出? 现在,我们可以用类似的方式陈述反向传播的目标:
我们要计算可归因于每个神经元的误差(我将这个误差量称为神经元的误差,因为一遍又一遍地说"归因"是没有意思的),从最接近输出的层开始一直到起点,我们的模型层。
那么,为什么我们要关心每个神经元的错误呢? 请记住,神经网络的两个构建块是将信号传递到特定神经元(每个连接中都有权重)和神经元本身(带有偏差)的连接。 整个网络中的这些权重和偏差也是我们调整以更改模型所作的预测的表盘。
这部分非常重要:
特定神经元的误差(相对于所有其他神经元的误差)的大小与该神经元的输出(也称为激活)对我们的成本函数的影响成正比。
因此,每个神经元的误差代表了成本函数相对于该神经元输入的偏导数的代表。 这具有直觉上的意义-如果特定神经元的错误比所有其他神经元的错误大得多,那么调整有问题的神经元的权重和偏差将比对模型中的任何其他神经元产生更大的影响。
关于每个权重和偏差的偏导数是构成我们成本函数的梯度向量的各个元素。 因此,基本上,反向传播使我们能够计算归因于每个神经元的误差,进而使我们能够计算偏导数和最终的梯度,从而可以利用梯度下降。 欢呼!
一个有益的类比—责备游戏
有很多东西需要消化,因此希望这个比喻会有所帮助。 几乎每个人在他或她生命中的某个时刻都有一个可怕的同事-总是出问题的人,当事情出错时总是把同事或下属丢在公共汽车下。
好的神经元通过反向传播是责备游戏的主人。 当错误传回特定神经元时,该神经元将快速有效地将手指指向上游错误者(最容易引起错误的上游同事)(例如,第4层神经元会将手指指向第3层神经元, 第2层神经元的第3层神经元,依此类推)。
又由于神经元无法直接观察其他神经元的错误,每个神经元又如何知道应该归咎于谁呢? 他们只是从最高频率和最频繁激活的角度看谁发出了最多的信号。 就像在现实生活中一样,懒惰的人会无罪责备地滑行(低激活和不频繁的激活),而承担最大工作量的神经元则会受到责备,并改变其体重和偏见。 愤世嫉俗,是的,但对于使我们达到最佳的权重和偏差(使成本函数最小化)也非常有效。 左侧是神经元如何在总线下相互抛掷的视图。
简而言之,就是反向传播过程背后的直觉。 我认为,这是反向传播的三个关键要点:
- 这是将错误逐层移回,并将错误的正确量分配给神经网络中每个神经元的过程。
- 归因于特定神经元的错误,可以很好地近似于改变该神经元的权重(从通往神经元的连接)和偏见如何影响成本函数。
- 当向后看时,活跃的神经元(非懒惰神经元)是由于反向传播过程而受到指责和调整的神经元。
总结
如果您已经在这里阅读了所有内容,那么您会感激和钦佩(为您的坚持不懈)。
我们从一个问题开始,"什么使深度学习变得特别?",我现在将尝试回答这个问题(主要是从基本神经网络的角度出发,而不是从其更高级的表亲(如CNN,RNN等)的角度出发)。 以我的拙见,以下方面使神经网络变得特别:
- 每个神经元都是具有自己的偏差以及一组传入特征和权重的自己的微型模型。
- 每个单独的模型/神经元都馈入该模型所有隐藏层中的许多其他单独的神经元。 因此,我们最终以总和大于其各部分的方式将模型插入到其他模型中。 这使神经网络能够拟合我们数据的所有细节和缺点,包括非线性部分(但要提防过度拟合-绝对要考虑正则化,以防止模型在遇到新数据和过采样数据时表现不佳)。
- 许多互连模型方法的多功能性以及反向传播过程能够有效,最佳地设置每个模型的权重和偏差的能力,使神经网络能够以许多其他算法无法做到的方式从数据中稳健地"学习"数据。
作者注意:神经网络和深度学习是极其复杂的主题。 我仍在早期学习它们的过程中。 写这个博客的目的不仅在于增进我自己的理解,还在于帮助读者。 我期待您的所有评论,建议和反馈。 干杯!
(本文翻译自Tony Yiu的文章《Understanding Neural Networks》,参考:
https://towardsdatascience.com/understanding-neural-networks-19020b758230)
本文暂时没有评论,来添加一个吧(●'◡'●)