神经网络
什么是神经网络
2010年以前,聊天的时候提到神经网络,多数人应该会联想到大脑中的神经网络而非机器学习中的。机器学习中的神经网络很大程度上借鉴了人体的神经网络,比方说人体的神经网络由神经元构成,机器学习的同样也是由神经元构成,因此我们可以这么描述机器学习的神经网络:
- 神经网络是一种计算模型,灵感来源于人脑的神经系统。它由大量的人工神经元(也称为神经元或节点)以及连接这些神经元的权重组成。这些神经元之间的连接形成了一个复杂的网络结构,可以用于进行模式识别、分类、回归等任务。
一般而言,常见的神经网络长这样,其中每个点都是一个神经元:
那么问题来了,什么是神经元?
什么是神经元
神经元的功能还是很简单的,接收一组输入,进行一些运算后输出。具体而言,可以用下面的公式以及图来表示:
y
=
f
(
∑
i
=
1
n
ω
i
x
i
−
θ
)
y = f(\sum_{i=1}^n \omega_ix_i-\theta)
y=f(i=1∑nωixi−θ)
有没有觉得这个公式很眼熟?
我们在机器学习实战这本书的逻辑回归见过这个公式了,这个公式的实际意义可以这么理解:接受一组特征,将特征加权求和后减去阈值,然后根据最后所得的符号判断是正类还是负类。
同样的,这里也有sigmoid函数,用于将输出结果约束到0-1之间
感知机
什么是感知机
感知机由两层神经元组成,一层接受外界的输入,被称为输入层;一层接受输入层的输出并生成最终的结果,被称为输出层。同时,感知机作为一种二元分类器,只能输出±1(或者说0/1)也就是说,感知机的整体结构大概如下:
在我的理解里,这张图跟再前面的那张图没有什么明显的不同之处,输入层的神经元似乎什么都没有做(如果忽略预处理的话,同时权重参数可以被整合到输出层中),或与也是因为这个,书上才说感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元。
感知机的结果错了怎么办
感知机的具体调整公式如下:
ω
i
=
ω
i
+
△
ω
i
\omega_i = \omega_i + \triangle \omega_i
ωi=ωi+△ωi
△
ω
i
=
η
(
y
−
y
^
)
x
i
\triangle \omega_i = \eta (y-\hat{y})x_i
△ωi=η(y−y^)xi
其中x为输入的向量,y为数据标签(即x对应的值),
y
^
\hat{y}
y^为预测值,可以看到
ω
i
\omega_i
ωi向准确率更高的地方走了一小步,其中
η
\eta
η是用来控制步长的变量。
总之就是逐步调整误差,直至结果完全正确,当然如果没有办法达到完全正确的结果(比方说用感知机去做异或),那么就会振荡。
多层网络
前面我们提到了有时候结果会振荡,是因为感知机无法达到完全正确的结果,那么原因是什么呢?
感知机实际上是这样一种东西:通过线性运算得到的结果对输入的事物进行分类。因此感知机只能解决线性可分的问题,对于线性不可分的问题(比如异或)则无能为力。此时,便需要多层神经网络来进行处理了。已知与或非都是线性可分的问题可以通过一个感知机解决,而异或显然可以通过与或非的组合来实现,那么我们可以用如下的神经网络来求解异或:
为什么这个多层网络可以求解异或呢?我们可以这么看,图中的ABC、ABD、CDE构成了三个感知机(此处只是这么理解,实际上神经网络应该当作一个整体更好一些),假设AB的输入分别为a,b;CD的输出值分别为(¬a ∧ b) 和 (a ∧¬b),,那么E只需要进行或运算便可以得到异或的最终结果。这就是我理解的多层网络为什么可以解决非线性问题的来源。
此外还有一些内容同样很重要,如图有五个神经元,其中AB位于输入层,E位于输出层,CD处于两层之间叫做隐含层,需要注意的是,隐含层也具有激活函数。
推广一下,如下图,每层神经元与下一层全连接,同层/跨层之间不连接的神经网络结构通常称为“多层前馈神经网络”
由于输入层一般只是负责接收参数,并没有什么功能,因此如上图这种网络通常看错是三层网络。
最后,根据前面的公式我们可以知道,神经网络学习的东西实质上就是指神经元之间的权重以及每个功能神经元的阈值。因此如何调整权重与阈值无疑是本章的重中之重。
反向传播算法
反向传播算法的过程太过复杂,仅仅以图文的方式无法很好的呈现,因此此处只做简要介绍,想要理解详细过程的话可以参见这个链接:5分钟了解反向传播算法
反向传播算法与前向传播相对应,前向传播用于计算出预测值y;而反向传播算法用于根据预测值y更新神经元之间的权重。更新方法可以理解为:
- 用预测值与真实值去计算损失函数
- 用链式求导法则计算每个权重的梯度方向
- 用1 2中计算出来的损失函数与梯度方向去更新权重
其实关键点就是第二步的用链式求导法则去计算梯度,其他的步骤跟梯度下降算法一致
全局最优与局部最优
神经网络实质上可以视作拟合函数的一个过程,而函数难免有局部最小值,例如这样:
只有E才是全局最小,然而梯度下降算法只会沿着梯度下降的方向去走,不会跳出局部最小,因此便有了以下几种方法:
- 多组不同参数初始化多个网络,训练结束后取其中效果最好的一组。这样的原理是因为相当于从函数的不同位置开始搜索最小值,能提高找到全局最优解的概率。
- 模拟退火,每次都有一定概率接受比当前更差的结果。
- 随机梯度下降
- 遗传算法
深度学习
深度学习就是增加隐层的层数,但是隐层多了就会非常的难以收敛,因为误差扩散太多了,很难把误差修正。由此产生了两种训练方案:
- 无监督逐层训练。意思就是说每次只训练一层,所有层都训练完后再让所有的层一起再进行一次微调。这相当于是,盖房子的时候找最好的木匠,最好的瓦匠等等,然后最后把他们凑在一起商量具体方案。
- 权共享,意思就是说,用相同的权重(卷积核)去处理一次图片来得到最终的结果
小结
神经网络给我的感觉就是大力出奇迹,似乎并没有什么很精妙的地方,只要参数足够多就能够得到一个好的结果,不过话说回来目前很火的大模型好像也是这么一回事。也有可能是因为我还没有开始这方面的研究吧,能支撑这么多人发这么多年的论文,理应有精妙之处。由于这里没有实验可以参考,因此本文没有实验了。