神经网络学习报告

作为人工智能领域的核心技术,神经网络与深度学习已经渗透到了我们生活的方方面面,从大模型对话到计算机视觉应用,背后都离不开神经网络的支撑。这段时间我系统学习了神经网络的基础内容,从最基础的线性模型到核心的 BP 误差反传算法,整理了这份学习报告。

一、神经网络学习的基础认知

神经网络是人工智能的重要分支,它借鉴了人脑神经元的分级处理机制,通过多层的特征组合来实现对数据的学习。高层的特征是低层特征的组合,从低层到高层的特征表示越来越抽象,越来越能表现语义或者意图,这也是神经网络能够处理复杂任务的核心原理。

从发展历程来看,神经网络领域的发展经历了多个阶段:

  • 创始期:1943 年,McCulloch 和 Pitts 提出了最早的神经网络数学模型,开启了这一领域的研究;1949 年 Hebb 规则的提出,为神经元的学习提供了理论基础。

  • 初步发展:1958 年 Rosenblatt 提出感知机和联想学习,1960 年 Widrow 和 Hoff 提出 ADALINE 学习算法,让神经网络的初步应用成为可能。

  • 停滞期:1969 年 Minsky 在《Perceptron》中提出了 XOR 问题,暴露了单层感知机的线性局限,直接导致了神经网络领域的第一次寒冬。

  • 复兴期:1982 年 Hopfield 网络解决了 TSP 问题,1986 年 Rumelhart 和 McClelland 提出了 BP 算法,让多层网络的训练成为可能,同时 RBFN、Boltzmann 机等新型网络不断涌现,领域迎来了复兴。

  • 爆发期:2006 年 Hinton 提出深度学习,加上大数据和算力的爆发,神经网络进入了爆发式发展阶段,从语音识别、图像识别,到 AlphaGo、大模型,再到现在的具身智能,神经网络的应用不断突破。

在这里插入图片描述

整个神经网络的学习,遵循着从基础到进阶的脉络:先掌握基础的线性模型与神经元概念,再深入浅层神经网络与 BP 算法,之后再学习深度学习的原理,最后到应用与前沿发展。这也是我这次学习的核心路径,从最基础的内容入手,逐步搭建起神经网络的知识体系。

二、入门基石:线性模型与神经元基础

所有复杂的神经网络,都是从最基础的线性模型演化而来的,这部分是入门的核心基石。

2.1 线性回归:最基础的预测模型

线性回归是我们接触的第一个监督学习模型,它的目标是找到变量之间的线性依赖关系,比如我们要根据房屋的面积、房龄来预测房价,就可以用这个模型来解决。

对于 n 维的输入,线性模型的形式为:
y=hθ(x)=θ⊤xy=h_{\theta}(x)=\theta ^{\top }xy=hθ(x)=θx
其中 θ 是我们要学习的参数,x 是输入的特征。

为了找到最优的参数 θ,我们构造了均方误差的代价函数,用来衡量预测值和真实值的差距:
J(θ)=12∑i=1N(y(i)−hθ(x(i)))2J(\theta)=\frac{1}{2} \sum_{i=1}^{N}(y^{(i)}-h_{\theta}(x^{(i)}))^{2}J(θ)=21i=1N(y(i)hθ(x(i)))2

对于这个简单的二次型代价函数,我们可以直接求解解析解,一步就能得到最优的参数:
θ=(X⊤X)−1X⊤y\theta=\left(X^{\top} X\right)^{-1} X^{\top} yθ=(XX)1Xy
这个方法在低维的情况下非常高效,但是当维度升高之后,矩阵求逆的成本会急剧上升,这时候就需要迭代的优化方法了。

2.2 线性分类:从预测到分类

当我们要解决分类问题的时候,比如区分苹果的好坏,线性回归就不够用了,因为我们需要输出 0-1 之间的概率,来表示样本属于某一类的可能性。

这时候我们引入了 Sigmoid 函数,它可以把任意的线性输出映射到 (0,1) 的概率空间:
y=11+e−zy=\frac{1}{1+e^{-z}}y=1+ez1
这个函数有一个非常好的性质,它的导数可以用自身来表示:y′=y(1−y)y'=y(1-y)y=y(1y),这为后续的梯度计算提供了极大的方便。

在这里插入图片描述

对于多分类的问题,我们就需要用到 Softmax 回归,它可以把多个线性输出转化为和为 1 的概率分布,这样我们就可以得到样本属于每一类的概率。对应的代价函数就是交叉熵损失,这也是现在分类任务里最常用的损失函数:
l(y,y^)=−∑j=1Kyjlogy^jl(y, \hat{y})=-\sum_{j=1}^{K} y_{j} log \hat{y}_{j}l(y,y^)=j=1Kyjlogy^j

在这里插入图片描述

2.3 梯度下降:通用的优化方法

不管是回归还是分类,当维度升高之后,解析解就不再适用了,这时候梯度下降法就成了核心的优化方法。

它的思路很简单:我们沿着代价函数梯度的反方向,逐步调整参数,这样每一步都能让代价函数变小,直到收敛到最小值。这个思路也是后续所有神经网络优化方法的基础,不管多复杂的网络,最终都是用类似的思路来调整参数的。

2.4 神经元:神经网络的最小单元

讲完线性模型,我们就可以引入神经元的概念了,这是神经网络的最小单元,它完全借鉴了生物神经元的工作机制。

生物神经元会接收多个上游神经元的输入,把这些输入整合起来,如果整合的结果超过了阈值,神经元就会激活,向下游神经元输出信号。

在这里插入图片描述

对应的人工神经元 M-P 模型,就是对这个机制的数学模拟:
p=∑j=1nwjxj−θyi=f(pi)p=\sum_{j=1}^{n} w_{j} x_{j}-\theta \quad y_{i}=f\left(p_{i}\right)p=j=1nwjxjθyi=f(pi)
输入 x 经过加权求和,减去阈值,再经过激活函数 f,就得到了神经元的输出。而感知机,就是由这样的神经元组成的单层网络,它可以解决线性可分的分类问题。

三、突破线性局限:多层感知机与 XOR 问题

单层的感知机虽然简单,但是它有一个无法回避的局限:只能处理线性可分的问题,最典型的就是 XOR(异或)问题,这也是当年让神经网络陷入停滞的核心问题。

3.1 XOR 问题:单层感知机的局限

XOR 问题的输入输出非常简单:

x1 x2 y
0 0 0
0 1 1
1 0 1
1 1 0

我们把这四个样本点画出来:

在这里插入图片描述

可以看到,这四个点是线性不可分的,不管我们怎么画直线,都没法把两类点完全分开,这就意味着单层的感知机,不管怎么调整参数,都没法解决这个问题。

3.2 多层感知机:引入隐藏层突破局限

那怎么解决这个问题呢?答案就是在输入层和输出层之间,加入隐藏层,构建多层感知机!

我们加入一层隐藏层,里面有两个神经元,这两个神经元会先对输入做线性变换,得到两个新的特征,然后输出层再对这两个特征做分类,这样我们就可以得到非线性的分类边界了。

比如我们设置一组参数,隐藏层的两个神经元会分别得到两个线性的分界,然后输出层把这两个分界组合起来,就得到了如下的分类区域:

在这里插入图片描述

可以看到,通过两层的线性变换加激活,我们就得到了非线性的分类边界,完美解决了 XOR 问题!

而且有定理证明:只要隐藏层的节点足够多,三层的前馈网络就可以逼近任意的连续函数,这就是多层感知机的万能逼近能力,这也是神经网络能够处理复杂任务的核心保障。

四、核心学习算法:误差反传(BP)算法详解

有了多层的网络,那怎么训练它呢?也就是怎么调整每一层的权值,让网络的输出越来越准确?这时候 BP(误差反传)算法就登场了,它是多层神经网络训练的核心算法,也是整个神经网络领域的里程碑。

BP 算法的核心思想非常清晰:正向传播计算输出,反向传播传递误差,用梯度下降法调整权值

4.1 网络结构与前向传播

我们要训练的是全连接的多层前馈网络,结构如下:

在这里插入图片描述

输入数据从输入层进入,逐层计算每一层的输出,这就是前向传播的过程:

对于第 l 层,我们先计算该层的线性输出 z,然后经过激活函数得到该层的输出 a:
z[l]=W[l]a[l−1]z^{[l]}=W^{[l]} a^{[l-1]}z[l]=W[l]a[l1]
a[l]=σ(z[l])a^{[l]}=\sigma(z^{[l]})a[l]=σ(z[l])
这样一直计算到输出层,我们就得到了网络的预测输出,然后就可以计算预测值和真实标签的误差了。

4.2 反向传播:误差的传递与权值更新

接下来就是核心的反向传播了,我们要把误差从输出层往输入层传递,计算每个权值对应的梯度,然后调整权值,这里的核心就是链式求导法则。

首先我们定义误差项 δ,用来表示每一层的误差:

  1. 输出层的误差:对于输出层,我们可以直接得到预测和真实的误差,所以输出层的误差项就是误差乘以激活函数的导数:
    δi[L]=ai(1−ai)ei\delta_{i}^{[L]}=a_{i}(1-a_{i}) e_{i}δi[L]=ai(1ai)ei
    对应的权值更新量就是:
    Δwij[L]=α⋅δi[L]⋅aj[L−1]\Delta w_{i j}^{[L]}=\alpha \cdot \delta_{i}^{[L]} \cdot a_{j}^{[L-1]}Δwij[L]=αδi[L]aj[L1]
    其中 α 是学习率,用来控制每次更新的步长。

  2. 隐藏层的误差:对于隐藏层,我们没法直接得到它的误差,但是我们可以把后一层的误差反传回来!隐藏层的误差项,是后一层的误差项加权求和,再乘以当前层激活函数的导数:
    δi[l]=[∑j=1mwji[l+1]δj[l+1]](ai[l])′\delta_{i}^{[l]}=\left[\sum_{j=1}^{m} w_{j i}^{[l+1]} \delta_{j}^{[l+1]}\right]\left(a_{i}^{[l]}\right)'δi[l]=[j=1mwji[l+1]δj[l+1]](ai[l])
    这样我们就可以从后往前,一层一层计算所有层的误差项,然后更新所有的权值。

在这里插入图片描述

整个 BP 算法的完整步骤就是:

  1. 初始化所有的权值为较小的随机非零值

  2. 输入训练样本,前向传播计算网络的输出

  3. 计算输出的误差,如果误差小于阈值,训练结束

  4. 否则从输出层开始,反向计算每一层的误差项

  5. 根据误差项更新每一层的权值,回到步骤 2 继续迭代

4.3 BP 算法的优缺点

BP 算法的出现,让多层网络的训练成为可能,它的优点非常突出:

  • 学习完全自主,不需要手动设计特征,网络可以自动从数据中学习特征

  • 可以逼近任意的非线性函数,能够处理非常复杂的任务

但是它也存在一些局限:

  • 基于梯度下降的优化,可能会收敛到局部最优,而不是全局最优

  • 收敛速度比较慢,尤其是早期的深层网络,很容易出现梯度消失的问题

  • 学习率的选择比较敏感,太大容易导致训练震荡,太小则收敛太慢

  • 网络的结构设计,比如隐藏层的层数、节点数,没有统一的标准,需要依靠经验调整

不过即使有这些问题,BP 算法依然是神经网络的基础,现在我们用到的所有深度学习算法,本质上都是在 BP 算法的基础上改进而来的。

五、实践落地:从理论到代码实现

学习神经网络,光看理论是远远不够的,必须要动手实践,才能真正把理论吃透。在学习的过程中,我用 PyTorch 框架,基于 Fashion-MNIST 数据集实现了一个简单的多层感知机,把之前学的理论都落地了一遍。

5.1 实践环境与数据集

首先是环境的搭建,我用了 Anaconda 来管理 Python 环境,安装了 Python 3.10 和 PyTorch 2.4.1,用 VS Code 作为开发工具,这也是入门阶段非常友好的环境配置。

我选择的数据集是 Fashion-MNIST,这是一个非常适合入门的图像数据集,它包含了 10 类服饰的灰度图片,6 万张训练集,1 万张测试集,大小和经典的 MNIST 手写数字数据集完全一致,但是任务更有挑战性,不会太简单。

5.2 数据加载与网络实现

首先是数据的加载,用 PyTorch 的 torchvision 就可以非常方便的加载这个数据集:

def load_data_fashion_mnist(batch_size, resize=None):
    trans = [transforms.ToTensor()]
    if resize:
        trans = transforms.Compose(trans)
    mnist_train = torchvision.datasets.FashionMNIST(
        root="../data", train=True, transform=trans, download=True)
    mnist_test = torchvision.datasets.FashionMNIST(
        root="../data", train=False, transform=trans, download=True)
    return (data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers()),
            data.DataLoader(mnist_test, batch_size, shuffle=False, num_workers=get_dataloader_workers()))

然后就是网络的定义和训练,PyTorch 已经帮我们自动实现了反向传播的过程,我们只需要定义前向的计算就可以了,不过如果手动实现 BP 的话,也能更清楚的理解误差反传的过程。通过这个实践,我把之前学的线性模型、激活函数、梯度下降、BP 算法这些内容都串了起来,对整个训练过程的理解也深刻了很多。

六、学习总结

这段时间的学习,让我对神经网络的基础有了系统的理解,从最基础的线性模型,到神经元的概念,到多层感知机突破线性局限,再到核心的 BP 算法的推导与实现,整个学习的过程是从简单到复杂,从理论到实践,一步步搭建起了神经网络的基础体系。

我觉得神经网络的学习,一定不能只停留在调包的层面,必须要把基础的算法推导搞清楚,比如 BP 算法的反向传播过程,只有理解了这些基础的原理,才能在后续学习更复杂的深度学习模型的时候,更快的理解各种优化方法和网络结构的设计思路。同时,一定要配合实践,动手写代码,把理论用起来,这样才能真正的把知识内化,而不是停留在看懂的层面。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐