前言
随着ChatGpt的出现,使得人工智能这一领域变得非常火爆,本文主要介绍人工智能技术的底层基石-神经网络。
在介绍神经网络之前,有必要对人工智能这一领域的基础概念做一下简单的介绍。
人工智能基础概念
人工智(Artificial Intelligence)
是让各类机器载体上模拟并拥有类似生物思考的能力,比如让机器可以进行感知、学习、识别、推理等行为。
人工智能涉及的领域主要包括:计算机视觉(Computer Vision,CV)
、自然语言处理(Natural Language Processing,NLP)
、语音识别(Voice Recognition)
、语音生成(Text to Speech,TTS)
、知识图谱(Knowledge Graph)
等。
以自然语言处理(NLP)为例子:怎么让计算机能够像人的大脑一样处理语言?
作为人类,理解对话中的语意甚至是高阶语意都是洒洒水的事情。但是让计算机也拥有这种能力确是千难万难。 但是,让计算机能够像人一样思考异常困难,如果只是让计算机拥有和人类简单对话的能力,就有道可循了。
那么如何做呢?这就引出了本章内容的主角–神经网络
。
什么是神经网络
那到底什么是神经网络呢?我们看看文心一言是怎么回答的。
从回答中得知,神经网络是一种模仿生物神经网络的结构和功能的模型。其中也包含了一些概念,比如:神经元、输入层、隐藏层、输出层等。下文会一一的对这些概念做介绍。
废话不多说,直接上菜。
神经元
在人脑中,
神经元或神经细胞
是构成大脑、脊髓和周围神经系统的基本单元.
神经元
通过在树突接收神经信号,经过细胞体的处理和集成,然后通过轴突传递神经信号到其他神经元或效应器,从而完成神经系统内的信息传递和处理,这也是神经网络中神经元词汇的由来。
直接下结论:
- 机器学习中的神经元是对人脑的神经细胞的一种模仿。
- 机器学习中的神经元本质是一个函数的组合,包括了
输入
、加权
、求和操作
、激活函数
(可以理解为函数的功能种类,比如:交通工具的种类(比如:能在路上跑的汽车,天上飞的飞机等)等。
这个函数接收输入参数(
数据量可以很大,具体数量由与和其建立连接的上层神经元数量有关
),对输入数据进行加权处理,最终由激活函数进行非线性映射
,生成神经元的输出,这个输出值作为下一层与其连接的神经元的输入(如果后续没有神经元连接,那么这个输出值,就是这条神经链路上的最终输出值
)
为了更容易理解专业词汇的具体含义,我们具体的举一个例子–如何让计算机识别一个(0-9)的手写数字。
上面几个手写的数字,人脑可以很轻易的看出来这些数字是什么,但是让计算机去识别,却是非常困难的。
计算机在处理图像时通常只能看到一些低级的视觉特征,如像素值、边缘等,缺乏对图像高级语义信息的理解能力。
那么怎么让计算机能够识别数字呢?
具体做法是把这张手写字迹的图表示为一个(28*28=784)组成784个像素点的灰度。对于每一个像素,都给他赋一个从0到1的值。一个像素点越黑,他就越接近0;一个像素点越白,他就越接近1
我们会把这个784个向量输入给神经网络的第一层,尽管有了这些向量数据,但是只靠这些数据远远不能让计算机正确识别书数字。
我们必须根据这784个向量,通过某种计算规则去识别转化从而得到正确的结论。对应上述对神经网络的定义,这个某种计算规则
就是隐藏层
,计算机输出结果
(这里要求0-9共十个数字,即输出的最后一层有十个神经元)就是神经网络的输出层
。
- 隐藏层是不固定的,隐层的层数,神经元数量、激活函数(
上文已经说过,神经元本质就是函数,我的理解为:激活函数本身就是神经元本身,神经元(函数)输出数据作为与其连接的下一层神经元的过程叫做激活(就是函数执行了,执行后输出了结果)等
)的选择等因素都会对神经网络的性能和学习能力产生影响。- 隐藏层的存在使得神经网络具有强大的表达能力,能够处理复杂的
非线性关系
(为什么是非线性,后续会介绍),并从输入数据中自动提取有用的特征(特征:我的理解就是符合权重参数和偏执参数的程度).
本例子中,我们在输入层和中间层之间,加入两个隐藏层(Hidden Layer) 。每一个隐层有16个神经元,然后让每层的每一个神经元都和上一层的所有神经元都相连,就形成了如图的网状结构。
如果两层之间,每层的每一个神经元都和另一层的所有神经元都相连,那么便称之为 “全连接层”(Fully Connected Layer)。除此之外,还有卷积层、池化层、循环层、嵌入层和规范化层等(这些在后续的文章中会介绍)。
- 图中每条都代表了一个权重,一共有78416+1616+16*10=12960个权重参数!
- 图中除了输入层784神经元外,有42个神经元,所以一共有42个偏置参数。
- 上述的这12960+42个参数,在最开始都是随机初始化的,最终他们是神经网络在训练过程中,由模型自动学习得到的,
而不是人为设置的
。对于这些参数,我们称之为“模型参数(Model Parameters) ”。
ok,通过例子,我们对输入层(784个向量)、隐藏层、输出层(0-9的输出)、偏置参数、激活函数(神经元选择的执行函数)、加权等概念。
那么计算机识别手写数字的大致过程就是:
- 每一个神经元都是一个非线性的激活函数,输入值是输入的向量或者上一层神经网络中所有神经元所代表的数字(0~1)的加权和,对该加权和进行偏置的调节后送给激活函数,产生一个0~1的输出。
- 整个神经网络由784+16+16+10=826个神经元构成,共有13002个模型参数,整个函数输入一个784维向量,输出一个10维向量。
这个函数极为复杂,把他看成一个能够输出理想值的函数黑箱就行
。
上述对神经网络的基本概念做了一些解释,并且举了一个入门的例子,但是神经网络是如何进行学习的?
神经网络训练方法
前向传播
看一下ChatGpt3.5的解释:
ChatGpt3.5是免费使用的,但是国内是无法直接访问的,需要科学上网
总结一下ChatGpt3.5给出的答案:
前向传播:在前向传播中,输入数据通过神经网络的多个层(包括输入层、隐藏层和输出层)按照预定的权重和偏置进行计算,从输入层传递到输出层,最终得到神经网络的预测结果。
梯度下降
真正想让机器自己学习,就必须解决怎么让机器自己配置参数(权重/偏置)。单纯的让机器自己配置参数只是其中的第一步,在机器参数配置后,怎么衡量输出结果的优劣程度也是一个非常重要的问题。
损失函数
用来评估模型的好坏或者优劣。模型预测值和期望值之间的差距越小,说明模型越好。
损失函数(Loss Function) ,也称为目标函数、成本函数或目标损失函数,是在监督式学习中用来度量模型预测值与真实标签之间差异的函数。
损失函数有很多种,例如:
- 平方损失函数(Quadratic Loss Function) :预测值与真实值的差的平方的二分之一。这个函数不适用于分类问题,而适用于预测的输出值是一个实数值的任务中
- 交叉熵损失函数(Cross-Entropy Loss Function): 一种用于测量两个概率分布之间差异的数学函数,常常用于分类任务中,特别是在神经网络中作为损失函数。
在确定好训练模型、数据集和损失函数后,下一步就要开始具体的进行神经网路的训练了,我们训练的目的其实就是让损失函数最小化,只有这样,模型输出的值才会越符合我们的预期。
怎么最小化损失?
损失函数的最小化其实就是一个函数求解最小值的数学问题(在这里,不需要知道他到底是怎么求解的,因为这涉及到大量的数学知识,我们只需要知道他是怎么做的即可)。
如上图的一个曲面。随机初始化参数的情况下,小球可能会出现在曲面的任何地方,那么如何让小球在初始位置(不是初始在最低点的情况下)慢慢的移动到凹陷的最低点里面去呢?
在这个三维空间里,假定i、j是x、y轴对应的单位向量,球现在正落在的位置上。只要找到一个向量,沿着这个方向,函数的值上升最快。这就是在坐标的梯度。
那到底什么是梯度,什么又是梯度下降?看一下ChatGpt的回答:
通过回答,我们大致能知道梯度
就是函数在某一点的位置变化率最快的方向,沿着梯度的正方向走,我们称之为梯度上升(Gradient Ascent) ,此时函数值上升最快,沿着梯度的反方向走,我们称之为梯度下降(Gradient Descent) ,此时函数值下降最快。
那么想让损失函数最小,就要沿着梯度下降的方向去挪移,直至挪移到凹陷处最低点(注意:这个最低点只是局部最低点,并非是全局的最地点)。
从上面曲面例子其实都可以看出,每到一个点,就算出该点的梯度,并且沿着梯度的反方向,走一段与梯度大小成正比的距离,从而到一个新的点;
重复上述过程,最终,我们就会找到一个函数的极小值点,此时梯度就会收敛于0。我们不一定会找到整个函数的最小值,此时我们称自己收敛于局部最优而非全局最优;反复的去做梯度下降就是我们寻找一个多元函数的极小值点的套路!
如果把13002个参数作为一个列向量,那么他的负梯度也是一个13002维的列向量。负梯度主要作用就是告诉我们,在这个13002维的空间里,怎么去调节每一个参数,才可以让损失下降的最快。
负梯度向量中,一个元素数字越大,说明更改这个元素对应的参数,性价比越高。
把全部的模型参数合起来写作,因此梯度下降的过程可以写作:
为模型第t次迭代时的参数值,为学习率,为每一次迭代时,所输入给模型并且用于计算平均损失的训练样本的数量。传统的机器学习算法中,整个训练集中的所有样本都会被用来计算模型参数的梯度,并根据梯度来更新模型参数,因此的值就是训练集的大小。
总而言之:梯度可以算出一个多元函数沿着哪个方向下降最快,从而指导我们去给模型做调参。梯度中元素的值越大,我们沿着那个元素对应的方向走的越多,循环往复就可以找到一个多元函数的极小值点了。
和。是人为设置的,不属于模型可以去学习的那13002个模型参数的范畴。这样的参数叫做超参数。
超参数(Hyperparameters),是在机器学习算法中需要手动设置的参数,用于控制模型的学习过程和性能。与模型参数不同,超参数的值不能通过训练数据自动学习得到,而需要在训练之前由人工设置。 超参数的选择会影响模型的性能和训练速度,合理的超参数选择对于获得良好的模型性能非常重要。
:超参数的批次大小:指在模型的一次参数更新中使用的样本数量
- 批大小的选择会直接影响模型的训练速度和内存占用。较大的批大小可以加速训练过程,因为可以利用硬件的并行性进行计算,但可能会占用更多的内存。较小的批大小则可以减小内存占用,但可能导致计算效率较低。合适的批大小通常需要根据具体的任务和硬件资源进行选择,常见的取值范围通常在几十到几千之间。
:超参数的学习率:用于控制模型在每一轮训练中对权重进行更新的步伐大小。具体来说,学习率决定了在梯度下降优化算法中,每次更新权重时权重的变化量。
左边是参数向量,右边是梯度向量,以梯度的倍数去调节左边的参数。这个倍数其实就是学习率。它可以是恒定的,可以衰减,也可以自动调整。
反向传播(Backpropagation,BP)
总结一下:
反向传播(Backpropagation) 用于计算神经网络中各层权重和偏置的梯度,从而实现模型参数的更新。它是前向传播的逆过程,通过计算损失函数对神经网络输出的梯度,逐层向后传播,从输出层到输入层,计算每一层的梯度,并用于更新模型参数。
反向传播可能会出现的问题
梯度消失
梯度消失问题(Gradient Vanishing) 是指在深度神经网络中,反向传播算法中计算的梯度在网络的较深层逐渐变得非常小,甚至趋近于零,从而导致这些层的权重更新变得非常缓慢或停止更新,使得这些层的参数无法得到有效的训练。
梯度消失产生的原因
-
梯度消失问题:通常出现在具有多层的深度神经网络中,特别是在使用激活函数为Sigmoid或Tanh等饱和激活函数时,因为这些函数在输入较大或较小的情况下会饱和并导致梯度变得非常小。(当输入接近1时,Sigmoid函数的输出值会接近于1,导数趋近于0。于是在反向传播过程中,梯度的乘积会趋近于零。)(为了缓解梯度消失问题,深度神经网络中常常使用其他类型的激活函数,如ReLU)
-
深度神经网络中,梯度是通过链式法则进行反向传播的。每一层的梯度都需要与前一层的梯度相乘,然后再传递到前一层,依此类推,直到传递到网络的输入层。如果网络层数较多,那么在反向传播过程中会经过多次连续的乘法操作,从而可能导致梯度的值指数级地减小,最终趋近于零,即梯度消失)。
梯度爆炸
是指在深度神经网络中,反向传播算法中计算的梯度在网络的较深层逐渐变得非常大,从而导致梯度爆炸。
一般缓解梯度问题通常使用的是归一化(Normalization)
方式,其本质核心是将对激活函数的输入值进行调整,避免其过大或过小而导致的梯度消失。
在神经网络中,常见的归一化方法包括:
- 批标准化(Batch Normalization,简称BN) :批标准化是一种在训练过程中对网络层的输入进行归一化的方法。它通过在每个批次中对输入数据进行规范化,使其均值为0、方差为1,从而加速网络的收敛过程,降低网络对初始化和学习率的敏感性,同时也有一定的正则化效果。
- 层标准化(Layer Normalization) :层标准化是一种对网络层的输出进行归一化的方法,与批标准化不同,它在每层中对所有样本的输出进行规范化,而不是对每个批次进行规范化。层标准化在处理序列数据等不适合批处理的情况下,可以作为替代方案使用。
- 组标准化(Group Normalization) :组标准化是一种介于批标准化和层标准化之间的方法,它将输入数据分成多个小组,然后对每个小组内的样本进行归一化,从而减小小组之间的相关性,提高网络的学习能力。
结语
神经网络是人工智能展现强大功能的核心,本章只是广而泛的介绍了神经网络的基础知识,后续会继续的介绍神经网络的分类。以及当下火热的ChatGpt相关知识和实战分享。
本文参考:
【官方双语】深度学习之神经网络的结构 Part 1 ver 2.0_哔哩哔哩_bilibili
【官方双语】深度学习之梯度下降法 Part 2 ver 0.9 beta_哔哩哔哩_bilibili
【官方双语】深度学习之反向传播算法 上/下 Part 3 ver 0.9 beta_哔哩哔哩_bilibili
如果觉得我总结的不错,记得给个赞撒!