社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

深度学习图解:神经网络如何工作?

FinTechHi • 4 天前 • 11 次点击  
思考一个问题:既然有这么多机器学习算法,为什么还要选择神经网络?
其中核心原因是神经网络非常强大。它们能够识别传统算法难以处理的复杂数据模式,解决高度复杂的机器学习问题(例如自然语言处理和图像识别),并减少对大量特征工程和人工操作的需求。

神经网络问题基本上可以归结为两个主要类别 -分类,预测给定输入的离散标签(例如:这是一张猫还是狗的照片? 这个电影评论是正面的还是负面的?)或回归,预测给定输入的连续值(例如:天气预报 -明天的温度是多少?)。

继续从一个业务场景开始:建立一个神经网络,根据房屋的某些特征来预测其价格——房屋面积(以平方英尺为单位)、位置(1=市区,2=郊区,3=乡村)、房屋年限以及卧室数量。我们的目标是利用这些特征来预测房价。

首先,假设收集到的数据如下:

接下来,训练一个神经网络模型。训练包括将数据集输入到模型中,模型会学习数据中的模式。根据现有数据预测新房的价格。

神经网络使计算机能够以类似人脑的方式处理数据。它利用层层排列的相互连接的神经元,类似于人脑的结构。下面是一个生物神经元示例:

它接收输入,处理接收到的输入或数据(这种处理简直是神奇的),并生成输出。就像人类的大脑通过接收输入和产生输出来处理数据一样,神经网络的运作方式也类似。

这里的蓝线代表神经元的输入。在房屋定价的背景下,这些输入可以被视为不同的特征变量,而输出则是预测的房价

每个输入都与一个称为权重的常数项相关联。因此,让我们将它们添加到我们的人工神经元中。

这些权重的目的是表明输入项的重要性。权重值越高,表示该输入项在确定房价时被认为越重要。因此,如果房屋年龄的权重高于房屋位置的权重,则意味着房屋年龄比房屋位置更重要。

现在,就像生物神经元中发生的一些魔法一样,这种魔法在人工神经元中也是这样的。

当我们放大时,我们发现这个魔法本质上是 2 个数学步骤。

第1步:先求和

比如上面的例子中,将每个输入乘以其对应的权重,然后将它们相加:

其中公司中的“b” 。这被称为偏差项,它是一个常数值。我们将这个值加到加权和中以完成求和:

从数学上来说:

其中特征用 xᵢ 表示,n = 特征数量

第2步:激活函数


第一步计算出来的结果,是通过所谓的激活函数输入的。

激活函数可以理解为将原始数据转化为有意义的见解的转换器。它们将上一步的总结转化为对我们特定任务有用的输出。

1)二元阶跃函数(Step Function)

是二元分类或早期神经网络中常用的激活函数。如果输入( x)等于或大于 0,函数会输出 1;否则,它会返回 0。

当需要一个明确的决定(例如“是”或“否”)时,这非常方便。例如,根据输入判断这栋房子能卖出去吗?

2)线性函数

它直接给出结果。它只是返回它接收到的任何值。所以,如果我们的和是 5,那么输出也是 5。

3)sigmoid 

此函数可以优雅地将任何输入值压缩到0到1的范围内。为什么它如此出色?因为它非常适合概率类问题。例如,在特定条件下,一套房子售出的可能性是多少?

4)双曲正切函数(tanh)

堪称Sigmoid的“对称升级版”,它通过平移和拉伸,将输出范围扩展到 较大的正输入值徘徊在 1 附近,而较大的负输入值则接近 -1,成为零中心化(zero-centered)的优雅代表。

5)ReLU(Rectified Linear Unit)

ReLU神经网络中最常用的激活函数之一。通俗来说:输入为正时直接输出,输入为负时“整流”为零

6)Leaky ReLU(Leaky Rectified Linear Unit)

它是对常规ReLU的巧妙改进。ReLU将所有负输入设置为零,而Leaky ReLU允许负输入产生一个较小的、非零的常数输出。想象一下,它就像一个微微打开的水龙头,即使大部分时间处于关闭状态,也能让一小滴水(在我们这里是数据)流过。

7)Swish

Swish函数确实是激活函数领域的后起之秀。由Google Brain团队在2017年提出,它凭借自门控(self-gating)特性,在多项任务中击败了ReLU及其变体。

激活函数种类繁多,每个都有其独特的特性(来自DS):

激活函数
数学表达式
输出范围
优点
缺点
适用场景
Sigmoid
输出可解释为概率;平滑可导
梯度饱和;非零中心;计算成本高
二分类输出层
Tanh
零中心化;梯度比Sigmoid更强
梯度饱和问题仍存在
RNN隐藏层;特征标准化
ReLU
计算高效;缓解梯度消失(正区)
Dead ReLU问题;负区完全抑制
CNN/深层网络隐藏层
Leaky ReLU
解决Dead ReLU;保留负区信息(通常为0.01)
需手动调参;非线性能力较弱
替代ReLU的保守选择
Swish
自门控平滑;无界输出有界梯度;实验性能优于ReLU
计算成本较高(需Sigmoid)
深层CNN/Transformer
Softmax
(概率和=1)
多分类概率归一化;可解释性强
仅用于输出层;数值不稳定(需配合LogSoftmax)
多分类任务输出层

激活函数的特殊之处是它可以根据我们的具体问题进行定制。例如,如果我们要预测连续的数据,比如房价(回归问题),那么整流函数就是一个不错的选择。它只给出正值输出,这与房价不为负值的事实相符。但如果我们要估计概率,比如房屋售出的概率,那么 S 型函数就是我们的首选,它的范围在 0 到 1 之间,正好反映了概率值。

让我们继续选择激活函数作为神经元中的整流函数,因为这似乎对我们的问题最有意义。

这被认为是一个神经网络模型,尽管它是最简单的形式。它只包含一个神经元,但仍然是一个很好的起点。

接下来我们需要弄清楚的是权重和偏差项的值应该是多少。我们知道它们是常数项,但它们的值应该是多少呢?

现在,先假设已经训练了神经网络并获得了最优值。因此,让我们用这些最优值替换这些项。

这就经过训练、随时可以投入使用的神经网络模型。本质上,这意味着我们利用现有数据,用训练中的一个神经元创建了最有效的模型。现在,我们可以通过输入待测房屋的相关特征来预测房价。让我们尝试预测训练数据集中第一套房子的价格。

当我们传入输入时,数据处理的第一部分是求和:

第 2 部分是将这个总和值通过整流函数传递:

本质上,我们的模型将第一套房子的特征作为输入,并根据这些特征预测其价格为 1,036,000 美元。换句话说,它的意思是:“根据这些房屋特征,我预测这套房子的价格为 1,036,000 美元。”

但当我们把它和实际房价175万美元相比时,很遗憾,这个预测值并不太准确。我们差了71.4万美元。

继续把剩余的房屋数据输入到这个简单的模型中,我们将获得以下预测价格:

我们可以看到,预测的价格都非常不准确。这表明我们的模型效率不高,考虑到它不够复杂,这也可以理解。它只由一个神经元组成。就像人脑一样,只有当神经元协作时,它们才能做出更有影响力的决策,并以更高的复杂度处理数据。

让我们退一步思考,是否有更直观的方法来解决这个问题。也许可以通过考虑不同特征之间的相互作用来增强我们的预测。也许两个特征的组合比单个特征更重要?

例如,卧室数量和房屋面积的组合可能很有价值。房间较多的小房子可能会让人感觉拥挤,从而降低对买家的吸引力,最终导致售价降低。

同样,房龄和地理位置的组合也很重要。在城市地区,新房往往价格更高,而在农村地区,买家可能更喜欢老房子的魅力,这可以提升其价值。农村地区的老房子也可能经过了更全面的翻新。此外,地理位置、房屋面积和卧室数量的组合也很有趣。在郊区和农村地区,小房子拥有更多卧室可能并不划算。然而,在城市地区,人们更喜欢靠近市区工作,同时又有足够的空间供家人居住,因此,只要有足够的卧室,他们可能愿意为小房子支付更高的价格。

可能性无穷无尽,考虑所有不同的组合极具挑战性。幸运的是,我们能够利用多个神经元的力量。与生物神经元协作做出更明智的决策类似,人工神经元也能协同工作,实现同样的目标。

让我们通过添加两个神经元来增强我们简单的神经网络的功能。这将创建一个类似蛛网的结构:

在这种情况下,所有输入都被馈送到 3 个神经元中的每一个。由于我们有 3 个神经元的输入,并且我们知道每个输入都与一个权重相关联,因此总共会有 12 个(= 4 * 3)不同的权重。为了区分它们,我们引入一些符号。权重用w_ij表示,其中i是神经元编号,j 是输入。例如,这个突出显示的权重……


所有输入都被馈送到 3 个神经元中的每一个。由于每个输入有 4 个特征,且每个输入特征都与一个独立的权重相关联,因此,总权重数

i :目标神经元的编号( i  )

j :输入特征的编号( j  )


将权重组织为矩阵形式(行=神经元,列=输入特征),每个神经元的输入是所有特征值的加权和。

比如第1个神经元的输出 =  为第个神经元的偏置项)


标记w₁₂,因为它是第一个神经元的第二个输入:

标 w₃₄,是第三个神经元的第四个输入。类似地,所有权重的标签如下:

这些权重可以取任意值,在训练过程中确定。

假设神经网络训练过程确定只有卧室和尺寸特征与神经元 1 相关,而其他两个特征不予考虑,那么进入第一个神经元的位置和年龄的权重将为 0。同样,假设只有卧室、尺寸和位置对第二个神经元很重要,而年龄被忽略,因此进入第二个神经元的年龄的权重为 0。同时,第三个神经元只将位置和年龄视为重要特征,而卧室和尺寸的权重为 0。最终的神经网络看起来会像这样:

同样,训练过程也会产生最优偏差值。为了让图表更易读,我们先删除权重为 0 的输入:

一个特殊点:这里有 3 个输出。然而只想要一个输出,也就是预测价格。因此,需要找到一种方法将 3 个神经元的输出合并成一个。为此,我们在前面添加一个神经元。

结构与之前相同,但不是将 4 个特征作为输入送入神经元,而是将之前神经元的输出用作新神经元的输入。每一层都有编号,输入层通常标记为 0。最后一层称为输出层,而位于输入层和输出层之间的任何层都被视为隐藏层。

记住,每个输入都对应一个权重。因此,即使是新神经元的这些输入也会有权重,这些权重也可以在训练过程中估算出来。新的偏差也将在训练过程中确定。因此,新的神经网络(假设它已经完全训练)将具有以下最优值:

在本例中,将所有激活函数设置为等于整流函数。前面提过可以根据要解决的问题灵活地选择不同的激活函数。


注意:通常,同一层具有相同的激活功能。

用所有最优的偏差和权重值训练了我们的神经网络。现在是时候测试一下它,看看它在预测房价方面表现如何了。让我们再次将第一栋房子的特征传递到这个神经网络中。

我们将通过强调每一步激活的输入和神经元来阐明这一过程:

第1个神经单元:

第2个神经单元:


第3个神经单元:


最后,使用隐藏层的输出并将它们传递到输出层,最终神经元:

这就是我们使用神经网络获得输出的方法。这个传递输入以获得输出的过程称为前向传播 。我们将对其余房屋重复相同的过程:

将这些新的预测价格与仅具有一个神经元的神经网络所做的旧预测价格进行比较。

仅从肉眼观察,新的预测结果似乎比旧的预测结果更好。但是,如果我们想找到一个数字来量化我们的预测与实际值的偏差,该怎么办呢?

这时成本函数就派上用场了。成本函数告诉我们预测结果与实际价格的偏差。根据预测的类型,我们可以使用不同的成本函数。但对于这个问题,我们将使用一个叫做均方误差 (MSE) 的函数。MSE 可以让我们 a) 衡量预测结果与实际价格的偏差;b) 比较不同模型的预测结果。

它计算预测房价与实际房价之差的平方的平均值。数学上来说

其中,通常将实际价格表示为“y”,将预测价格表示为“y^”。

评价目标是最小化 MSE。MSE 越接近 0,我们的模型预测价格的效果就越好。

因此,利用这个公式,我们可以计算出旧的单神经元模型的 MSE:

说明我们的第一个模型相当糟糕。新模型的 MSE:

仍然很糟糕,但至少比以前的 MSE 好一点。但我们可以考虑创建一个更好的模型。

一种方法是在现有层中添加更多神经元,以提高预测能力。像这样:


在隐藏层中添加了第4个神经元,或者我们可以添加一个全新的隐藏层:


增加了第二个隐藏层,其中包含 3 个神经元,或者可以在不同的层放置不同的激活函数:

可能性无穷无尽。我们可以调整神经网络的复杂度以满足特定需求。这些不同的可能性被称为神经网络架构。我们可以自定义层数、每层的神经元数量以及激活函数,以适应我们试图解决的数据和问题,使其根据需要变得简单或复杂。

本文由本公众号翻译编辑,原文地址为:

https://medium.com/@shreya.rao/list/deep-learning-illustrated-ae6c27de1640


 

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/184081
 
11 次点击