深度学习在现代 AI(人工智能)和机器学习中发挥着关键作用。它使用一系列分层结构的“神经元”来分解数据并提取我们需要的输出。
我们描述的这些神经元层复合体称为神经网络,或 ANN(人工神经网络)。
正如您可能已经猜到的那样,这种神经元结构类似于我们大脑中的神经元如何帮助我们作为人类学习。这个类比并不完美,但深度学习的一些想法实际上是从人类大脑的运作方式中借来的。
上图是神经网络的可视化。图片中的蓝色圆圈分别代表一个神经元。垂直排列的神经元是层。连接神经元的线是在处理数据中发挥重要作用的连接。
对深度学习、机器学习和人工智能之间的区别产生误解是很常见的。尽管有时这些术语可以互换使用,但深度学习实际上描述了一种训练机器学习模型的特定方式,使其成为更大的机器学习世界的一部分。机器学习(一种允许算法弄清楚如何预测输出的方法)本身就是人工智能的一个子集。一般来说,任何为非人类事物提供人类事物的方式的事物都属于人工智能。
我们将分解深度学习所采用的方法,以允许机器从数据中收集见解。这篇文章将以涵盖这种机器学习方法的本质的方式来讨论神经网络。一些数学将被提出,但它会被解释并且它在深度学习中的地位将是合理的。
神经网络概述
正如我们所讨论的,深度学习是一种训练计算机根据特定指定输入预测输出的方法。这是通过将输入数据通过“神经元”层传递来完成的,每个“神经元”都操纵数据并将其传递。
神经元(在深度学习的意义上)是保存数值的实体,这些数值会影响数据的传递和输出方式。有时这些神经元也称为节点。
当数据通过网络向前移动时,每个神经元,实际上,每一层都对输入做自己的事情。
网络从输入层开始,输入层存储网络需要对其进行预测的输入。神经网络中的层将输入作为数值列表读取,称为向量或张量。唯一的区别是向量是一维列表(数量的单个列表),但是,张量也可以是多维的并排列为网格。
输入向量中的每个值对应于输入层中的一个神经元。向量中的这些值称为分量。
例如,如果神经网络的任务是处理灰度图像的计算机视觉(分析视觉效果以进行预测),那么输入图像将被展平为向量。该层中的每个神经元将代表一个值在 0 到 255 之间的像素(这是灰度图像通常的存储方式)。
在输入层之后,数据由中间层的神经元进行处理。输入和输出之间的这些层通常也称为“隐藏层”。他们对数据进行一些数学运算并传递处理后的输入。稍后我们将详细介绍这些操作。
目前,重要的是要了解神经网络的大部分处理是在隐藏层中完成的。也可以有尽可能多的隐藏层和尽可能多的神经元。
隐藏层将处理后的数据输入输出层(最后一层),输出层可以表示不同的事物,具体取决于正在制作的模型的类型。可能有一个神经元可以预测某个数值,这将被称为“回归”模型。或者输出中可能有多个神经元,每个神经元代表输入属于某个类别的概率——这将是一个典型的“分类”模型。
但是神经网络是如何达到能够做出如此复杂预测的状态的呢?它如何知道要对向量输入进行什么数学运算,以便逐步将其变形为我们想要的输出?
这是神经网络从我们人类那里得到启发的另一个地方:神经网络从数据中的数千个示例中学习。输入值,通常称为“特征”,被输入随机网络。网络的内部旋钮和刻度盘在开始时是任意的,因此深度学习模型表现不佳。我们告诉神经网络正确的答案,它会辨别它有多接近。根据这一点,它会自我调整以表现得更好。我们称这个过程为“训练”,当我们重复它时,神经网络就变成了经过训练的机器学习模型。
内部工作原理:权重、偏差、激活函数
网络使用的神经元的数值称为激活。网络中的神经元激活取决于各种因素。这些包括它连接到的先前神经元的激活、链接神经元之间的权重、偏差和激活函数。
让我们分解这些。
那么,是什么真正将我们选择的神经元与输入中的其他神经元联系起来呢?我们用线条来形象化它,但线条是什么意思?
对于要与另一个神经元连接的神经元,第一个神经元的激活应该影响下一个神经元的激活。还需要有一个与影响激活的两个神经元之间的连接相关的唯一权重。
神经元之间连接含义的高级视图
现在,在下面的神经网络中取下面的神经元:
x1, x2, x3… xn是输入层中神经元的激活。它们还表示输入向量中的不同分量(向量的项)。因此,层中的每个激活都是表示该层的向量的一个分量。
在下一层,激活a的神经元连接到前一层的所有神经元。这种配置称为密集层(其中一层的神经元都连接到前一层的神经元)。密集层是神经网络中使用的主要层类型之一。
正如我们之前提到的,神经元之间的每个连接都需要对应于权重。
上图中的三角形代表权重。但是先前神经元的激活和连接的权重实际上如何影响下一个神经元?
权重乘以前一层中相应神经元的输入激活。所有这些产品加起来就是为了激活下一层的单个神经元。在所有这些之上还需要添加一个偏差值。
在线性代数意义上,这些单个神经元的计算是输入向量和权重向量之间的点积。除了我们在顶部添加的额外偏差之外。
点积被视为输出单个数字的两个向量的乘积。取点积时,将一个向量的所有分量与另一个向量中的匹配分量相乘。通过将所有结果相加,输出是一个数字。
我们重复这个过程,找到点积并添加一个偏差来获得第二层神经元的值。现在,如果我们将结果排列在一个代表我们正在计算的层的向量中,我们就有效地对输入向量执行了线性变换。这是另一个取自线性代数的术语。线性变换是我们将一个向量映射(或变换)到另一个向量的地方。
我们转换输入向量的方法是将其与权重矩阵相乘。哇,矩阵?还记得我们讨论过张量吗?好吧,矩阵是二维张量(称为二阶张量)。它们排列为网格(或列表列表)。整个输入层对隐藏层中单个神经元的权重可以用向量表示。隐藏层中的每个神经元都有多个权重向量,我们可以将它们堆叠起来形成一个矩阵。
矩阵可以被认为是一组转换向量的指令。一个独特的矩阵将以它自己的特殊方式转换一个向量。在向量空间(平面)中可视化,矩阵将以相同的方式操纵(或变换)向量。例如,无论向量空间的位置如何,一个特定的矩阵总是将向量旋转某个角度。
输入层的线性变换为我们提供了下一层的向量
我们执行的仅有的两个操作是乘法和加法,它们是线性的。如果将我们所做的数学绘制成图表,我们会看到直线。没有任何复杂的操作会为操作的可视化添加任何曲率。这就是我们称变换为线性的原因。
因此,我们对向量空间中的线性向量进行了变换——线性变换。当从一层到下一层时,数据(作为向量)只是由一个唯一的权重矩阵转换。
实际上,计算神经元激活的过程(取输入向量和权重向量的点积)可以用一些非常可怕的符号和数学来表示。
'sigma' 符号用于求和运算。这些类型的操作使我们能够表示在一个序列中的表达式相加。sigma 下方的i告诉我们索引变量,每次我们将另一个表达式添加到总和时,该变量都会增加。顶部的n是i的最大值,之后我们需要停止增加。对于我在编程界的朋友来说,把求和想象成一个“for循环”。
在表达式中,w表示特定神经元连接的权重,x是来自输入向量的值。
sigma右边的公式是我们需要根据我们的索引变量相加的表达式。在这种情况下,对于n 个神经元中的每个第i个x,我们将其乘以第i个w。我们总结了所有这些重量输入产品。最后,添加了一个偏差 ( B )。
因此,这个求和公式只是我们之前经历的扩展表达式的浓缩版本,我们将每个神经元乘以相应的权重并在最后添加一个偏差。
但是可能会出现一个问题,如果每一层都只代表一个线性变换,那么就不需要多层了。多个线性变换可以很容易地调整为两个神经元之间的单个变换。
这就是激活函数的用武之地。它们是用来混合的,特别是,它们为模型添加了非线性,这有助于我们计算更复杂的数据。有几种激活函数都有助于不同类型的操作。
我们刚才进行的激活计算也经过激活函数。
为了对整个层表达这一点,我们可以在线性变换周围放置一个激活函数。通过这种方式,我们知道将激活函数应用于结果向量的每个单个分量。
开发人员为他们认为有用的不同层指定激活函数。
有时我们希望通过尝试使用线性变换估计数值数据来创建以线性方式进行预测的模型。这些被称为线性回归模型,当进行几何解释时,它们使用直线对数据进行建模。当输入和输出之间有明确的关系时(例如当输入增加时输出以恒定速率增加),我们知道使用这种类型的模型。在这些情况下,我们不会向层添加激活函数。但是,如果数值数据是非线性的,并且它的图形涉及一些曲线(非线性方面),那么我们确实会使用这些激活函数。如果数据根本不是数字的,而我们正在处理分类模型,那么我们也不会使用激活函数。
用于分类模型的激活函数之一称为softmax。这会调整最后一层以表示输入属于某个类的概率,其中每个神经元代表这些类。开发人员通常将此激活设置为神经网络的最后一层,以对输入进行分类。
另一种流行的激活函数称为sigmoid,将神经元的激活压缩为 0 到 1 之间的数字。
我们不打算在这篇文章中详细介绍。这些功能可能非常复杂,但您无需完全理解这些功能即可构建自己的深度学习模型。需要明确的是,激活函数用于捕获不遵循线性、明显模式的数据。
重要的是要理解两个神经元之间的单一连接是微不足道的,但连接最终如何形成更大的图景才是最重要的。
培训:评估、调整、再试一次
到目前为止,我们已经讨论了神经网络的工作原理——但它的训练方式也非常重要。
最初,网络是完全随机的。因此,当它第一次尝试预测数据集中输入的输出时,是没有希望的。
然后,网络做了一些惊人的事情;它衡量它有多糟糕。这称为计算“损失”,有时也称为“成本”。这是使用数学函数计算的,该函数测量其输出(预测)与标签(正确输出)的接近程度。
如果我们正在构建一个线性回归模型(我们使用线性图预测某些输入的输出),那么我们将看到正确的输出与我们的模型相差多远。
然后,未经训练的模型会做一些可以说更酷的事情。它有所改善。调整网络中的权重和偏差。网络计算所谓的损失函数相对于所有权重的“梯度”。梯度是函数值随着输入的微小变化而发生的变化。如果这种变化在损失函数中为负值,则意味着损失正在下降,我们正朝着正确的方向前进。最终,通过改变权重并查看对函数的影响,我们可以达到损失函数的最低值和最高准确率。
神经网络查看当它增加和减少某个权重的值时会发生什么。
负责在损失函数中找到最低点的算法称为梯度下降。但是我们应该如何找到损失函数相对于网络中所有权重的梯度呢?这是通过称为反向传播的过程完成的,该过程通过网络返回以找到需要更改哪些权重和偏差以减少损失。
反向传播和梯度下降是负责神经网络学习过程的惊人算法。然而,它们背后的数学变得相当复杂。解释将成为它自己的一个帖子。同样,仅仅开发神经网络,这些信息并不是必需的,你只需要掌握反向传播和梯度下降的目的。
本质上,当网络反向传播时,看看某些权重对神经网络的性能有什么影响。它计算损失相对于权重的梯度。梯度下降使用反向传播的梯度导航到达损失函数底部的方法。
一旦反向传播,网络已经选择了某些权重来改变
梯度下降本身描述了一种找到函数最小值的方法。但是有一些特殊的梯度下降算法可以定位最小值。这些被称为优化器函数。他们需要调整一个称为“学习率”的超参数。
超参数是负责网络训练过程的参数的值。学习率描述了神经网络如何改变权重和偏差以最小化损失。如果它采取大块的步骤和大的变化,那么学习率就会很高。另一方面,如果有微小的渐进步骤,则学习率会降低。优化器功能会调整学习率,以确保我们不会在网络中进行太小或太大的更改。
在此之后,神经网络尝试通过传播数据来预测另一个输入的输出。
这种模型评估,然后自我修复,最后再次尝试的方法是神经网络改进的方式;这本质上是训练计算机驾驶汽车的过程。
一旦这些计算损失、反向传播和传播的过程重复了足够多的时间,我们就会得到一个准确的深度学习模型。
概括
在这个解释器中,我们已经看到深度学习模型使用神经网络对输入进行预测。网络由分层排列的神经元组成。从输入开始,每一层都会转换数据。最终,这些处理过的数据被移交给输出层,它代表了我们需要的答案。
通过训练过程,神经网络调整其内部变量,负责处理和转换数据的操作。随着它不断做出预测和尝试获得收益,它的准确性会提高。
希望这篇文章有助于您理解深度学习和神经网络。深度学习是当今许多人工智能技术的基础。一旦你开始掌握深度学习神经网络背后的基本思想,你甚至可以开始构建自己的模型来解决现实世界的问题。