引言
神经网络是机器学习领域中最具影响力和应用广泛的技术之一,其灵感来源于人类大脑神经系统的结构和功能。作为人工智能的核心技术之一,神经网络在图像识别、语音处理、自然语言理解等领域取得了令人瞩目的成就。本读书笔记将深入浅出地讲解神经网络的基本概念、工作原理、主要知识点以及实际应用,帮助读者全面理解这一重要技术。
神经网络的基本概念
什么是神经网络
神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应[35]。从本质上讲,神经网络是一种模拟人脑工作方式的计算模型,由许多称为"神经元"的基本单元组成,这些神经元通过连接(称为"权重")相互连接,形成层次结构[20]。
人类大脑中的神经元数量级约为10的11次方(大约1000亿个),每个神经元又通过神经突触与大约1000个其它神经元相连,形成一个高度复杂高度灵活的动态网络。人工神经网络的灵感来源于人类的大脑,虽然这种比较并不完美,但其中有很多相似的地方[21]。
神经元模型
神经元是神经网络的基本计算单元,也被称作节点(node)或者单元(unit)。它可以接受来自其他神经元的输入或者是外部的数据,然后计算一个输出。每个输入值都有一个权重,这些权重决定了输入对输出的影响程度[10]。
一个简单的神经元模型可以表示为:
复制
输出 = 激活函数( (输入1 × 权重1) + (输入2 × 权重2) + ... + 偏置 )其中,偏置是一个可学习的参数,它可以看作是一个"旋钮",用于调整神经元的激活阈值。权重和偏置都是可以通过训练过程调整的参数,它们共同决定了神经元的输出[21]。
网络结构
神经网络通常由多层神经元组成,包括:
输入层:接收外部输入数据隐藏层:处理输入数据的中间层,可以有多个隐藏层输出层:产生最终输出结果神经网络的基本结构可以简单地表示为:
复制
输入层 → 隐藏层 → 隐藏层 → ... → 输出层在神经网络中,每个神经元通过权重与下一层的神经元相连,形成一个复杂的网络结构。这种结构使得神经网络能够学习和表示复杂的输入-输出映射关系[21]。
神经网络的工作原理
神经元的计算过程
神经元的计算过程可以分为以下两个主要步骤:
线性组合:将输入与对应的权重相乘,然后将这些乘积相加,再加上偏置。这个过程可以表示为:复制线性组合 = (输入1 × 权重1) + (输入2 × 权重2) + ... + 偏置激活函数:将线性组合的结果通过一个非线性函数,产生最终的输出。这个过程可以表示为:复制输出 = 激活函数(线性组合)激活函数的作用是引入非线性,使得神经网络能够学习和表示复杂的模式。常见的激活函数包括sigmoid函数、ReLU函数等[21]。
神经网络的前向传播
神经网络的前向传播是指从输入层开始,经过一系列隐藏层,最终到达输出层的过程。在前向传播过程中,每个神经元的输出都是其输入的线性组合经过激活函数后的结果。
假设我们有一个简单的神经网络,包含一个输入层、一个隐藏层和一个输出层。输入层有2个神经元,隐藏层有3个神经元,输出层有1个神经元。那么,前向传播的过程可以表示为:
输入层接收输入数据:x1, x2隐藏层的每个神经元计算其输入的线性组合:复制a1 = w11*x1 + w12*x2 + b1 a2 = w21*x1 + w22*x2 + b2 a3 = w31*x1 + w32*x2 + b3其中,w表示权重,b表示偏置。隐藏层的每个神经元将线性组合的结果通过激活函数,产生输出:复制o1 = f(a1) o2 = f(a2) o3 = f(a3)输出层计算其输入的线性组合:复制z = v1*o1 + v2*o2 + v3*o3 + c其中,v表示权重,c表示偏置。输出层将线性组合的结果通过激活函数,产生最终输出:复制output = g(z)通过这种前向传播的方式,神经网络可以将输入数据映射到输出结果[46]。
神经网络的训练过程
神经网络的训练过程是指通过调整网络的参数(权重和偏置),使得网络的输出尽可能接近期望的输出。这个过程通常包括以下步骤:
初始化参数:为权重和偏置赋予初始值,通常使用随机初始化。前向传播:将输入数据通过网络,计算输出结果。计算损失:将网络的输出与期望的输出进行比较,计算损失值。反向传播:计算损失对每个参数的梯度,将误差从输出层反向传播到输入层。参数更新:根据梯度和学习率,更新参数的值。重复:重复上述步骤,直到损失值足够小或者达到预定的训练次数。神经网络的训练过程可以类比为一个优化问题,目标是最小化损失函数。通过不断调整参数,神经网络可以学习输入数据的特征,从而实现对新数据的准确预测[46]。
神经网络的训练算法:BP算法
BP算法的基本原理
BP(Back Propagation)算法是一种经典的神经网络训练算法,它通过反向传播误差来调整网络中的权重和偏置,以此达到优化网络性能的目的[24]。
BP算法的基本思想是:
前向传播:将输入数据通过网络,计算输出结果。误差计算:计算网络输出与期望输出之间的误差。反向传播:将误差从输出层反向传播到输入层,计算每个参数对误差的贡献(梯度)。参数更新:根据梯度和学习率,更新参数的值。BP算法的核心在于使用链式法则来计算损失函数关于各层权重的梯度,这是神经网络参数优化的基础[45]。
BP算法的数学推导
假设我们有一个简单的神经网络,包含一个输入层、一个隐藏层和一个输出层。输入层有2个神经元,隐藏层有3个神经元,输出层有1个神经元。我们使用均方误差作为损失函数:
复制
C = 0.5*(o_L - y)^2其中,o_L是网络的输出,y是期望的输出。
前向传播
前向传播的过程可以表示为:
输入层接收输入数据:x1, x2隐藏层的每个神经元计算其输入的线性组合:复制a1 = w11*x1 + w12*x2 + b1 a2 = w21*x1 + w22*x2 + b2 a3 = w31*x1 + w32*x2 + b3隐藏层的每个神经元将线性组合的结果通过激活函数,产生输出:复制o1 = f(a1) o2 = f(a2) o3 = f(a3)输出层计算其输入的线性组合:复制z = v1*o1 + v2*o2 + v3*o3 + c输出层将线性组合的结果通过激活函数,产生最终输出:复制o_L = g(z)反向传播
反向传播的过程包括计算损失函数对每个参数的偏导数:
计算输出层的误差:复制δ_L = (o_L - y) * g(z)计算隐藏层的误差:复制δ_l = (W_{l+1}^T * δ_{l+1}) * f(a_l)其中,W_{l+1}是当前层到下一层的权重矩阵,δ_{l+1}是下一层的误差向量,f是激活函数的导数。计算权重的梯度:复制∂C/∂W_l = δ_l * o_{l-1}^T其中,o_{l-1}是前一层的输出向量。更新权重:复制W_l = W_l - η * ∂C/∂W_l其中,η是学习率。通过这种方式,BP算法可以计算损失函数对每个参数的梯度,并根据梯度更新参数的值,从而优化网络的性能[46]。
BP算法的训练过程
神经网络的训练过程可以分为以下几个步骤:
初始化参数:为权重和偏置赋予初始值,通常使用随机初始化。遍历所有训练样本:前向传播:将输入数据通过网络,计算输出结果。计算输出层的误差:根据损失函数和网络输出计算误差。反向传播误差:将误差从输出层反向传播到输入层,计算每个参数对误差的贡献。更新参数:根据梯度和学习率,更新参数的值。重复:重复上述步骤,直到损失值足够小或者达到预定的训练次数。在实际应用中,通常使用小批量样本(Mini-batch)来更新参数,而不是使用单个样本或者全部样本。小批量样本的大小通常在几十到几百之间,这可以平衡计算效率和模型泛化能力[46]。
神经网络中的关键组件
激活函数
激活函数是神经网络模型中最关键的组件之一。它决定了神经元的输出是否被激活,以及激活的强度。常见的激活函数包括:
Sigmoid函数:复制f(x) = 1 / (1 + e^{-x})Sigmoid函数将输入映射到(0,1)之间,常用于二分类问题的输出层。但它存在梯度消失的问题,即当输入远离0时,导数接近0,这会导致训练困难。Tanh函数:复制f(x) = (e^{x} - e^{-x}) / (e^{x} + e^{-x})Tanh函数将输入映射到(-1,1)之间,常用于隐藏层。它比Sigmoid函数对称,但仍然存在梯度消失的问题。ReLU函数(Rectified Linear Unit):复制f(x) = max(0, x)ReLU函数在x>0时输出x,x≤0时输出0。它计算简单,收敛速度快,是目前最常用的激活函数之一。但它存在"死亡神经元"的问题,即当权重更新不当导致神经元总是输出0时,该神经元对训练不再有贡献。Leaky ReLU函数:复制f(x) = x, x > 0 f(x) = αx, x ≤ 0 (其中α是一个很小的正数,如0.01)Leaky ReLU是对ReLU的改进,它在x≤0时输出αx而不是0,可以避免"死亡神经元"的问题。softmax函数:复制f_i(x) = e^{x_i} / Σ_{j} e^{x_j}softmax函数常用于多分类问题的输出层,它可以将实数向量映射到概率分布上[40]。激活函数的作用是引入非线性,使得神经网络能够学习和表示复杂的模式。不同的激活函数有不同的特点和适用场景,选择合适的激活函数对于神经网络的性能至关重要[40]。
损失函数
损失函数是衡量神经网络模型的输出结果与真实结果之间差距的指标,损失函数的效果直接关系到模型最终收敛的程度和性能。常见的损失函数包括:
均方误差(MSE):复制C = 0.5*Σ(y_i - o_i)^2均方误差常用于回归问题,它计算预测值与真实值之间的平方差的平均值。交叉熵损失:复制C = -Σ[y_i*log(o_i) + (1-y_i)*log(1-o_i)]交叉熵损失常用于二分类问题,它可以避免sigmoid函数输出接近0或1时的梯度消失问题。softmax交叉熵损失:复制C = -Σy_i*log(o_i)softmax交叉熵损失常用于多分类问题,它是softmax函数和交叉熵损失的结合。选择合适的损失函数对于神经网络的训练和性能至关重要,不同的问题和数据集可能需要不同的损失函数[42]。
优化器
优化器是用于更新神经网络参数的算法,它决定了如何根据梯度调整权重和偏置。常见的优化器包括:
随机梯度下降(SGD):SGD是神经网络训练中最基本的优化器,它根据损失函数对参数的梯度来更新参数:复制W = W - η*∇C其中,η是学习率,∇C是损失函数对参数的梯度。动量优化器:动量优化器在SGD的基础上引入了动量项,可以加速收敛并跳出局部最小值:复制v = β*v + (1-β)*∇C W = W - η*v其中,β是动量系数,通常取0.9或0.99。Adam优化器:Adam优化器结合了动量和自适应学习率的思想,可以根据参数的更新历史自动调整学习率:复制m = β1*m + (1-β1)*∇C v = β2*v + (1-β2)*(∇C)^2 m_hat = m / (1-β1^t) v_hat = v / (1-β2^t) W = W - η*m_hat / sqrt(v_hat + ε)其中,β1和β2是衰减率,通常分别取0.9和0.999,ε是一个很小的正数,用于避免除以零。不同的优化器有不同的特点和适用场景,选择合适的优化器可以显著提高神经网络的训练效率和性能[40]。
神经网络的优化与挑战
全局最小与局部极小
在神经网络的训练过程中,损失函数可能有多个局部最小值,而全局最小值是损失函数的最小值。神经网络的训练目标是找到全局最小值或者接近全局最小值的参数配置。
然而,由于神经网络的复杂性,找到全局最小值通常是不可能的。因此,神经网络的训练通常会陷入局部最小值。为了减少局部最小值的影响,可以采取以下措施:
随机初始化:使用随机的初始参数,增加找到全局最小值的机会。正则化:使用L1正则化或L2正则化来限制参数的大小,减少过拟合的风险。优化算法:使用带有动量或者自适应学习率的优化算法,如Adam,可以更容易地跳出局部最小值。增加训练数据:使用更多的训练数据可以减少过拟合的风险,提高模型的泛化能力。局部最小值是神经网络训练中的一个常见挑战,了解和应对这一挑战对于提高神经网络的性能至关重要[8]。
过拟合与正则化
过拟合是指神经网络在训练数据上表现很好,但在测试数据上表现不佳的现象。过拟合的主要原因是模型过于复杂,记住了训练数据中的噪声和细节,而不是学习了数据的内在规律。
为了减少过拟合的风险,可以采取以下正则化技术:
L1正则化:在损失函数中添加参数绝对值的和,可以产生稀疏的权重矩阵:复制C = 原始损失 + λ*Σ|w|L2正则化:在损失函数中添加参数平方的和,可以防止参数过大:复制C = 原始损失 + λ*Σw^2Dropout:在训练过程中随机丢弃一些神经元,迫使网络学习更 robust 的特征:复制在前向传播过程中,以一定的概率p随机设置一些神经元的输出为0早停:在验证集上的性能开始下降时停止训练,避免过度拟合训练数据。正则化技术是减少过拟合风险的重要手段,选择合适的正则化技术可以显著提高神经网络的泛化能力[21]。
神经网络的训练技巧
为了提高神经网络的训练效率和性能,可以采取以下技巧:
学习率调整:使用适当的学习率,或者使用学习率调度器根据训练过程动态调整学习率。批归一化:在每个小批量数据上归一化激活值,可以加速训练并提高模型的泛化能力。数据增强:通过旋转、缩放、裁剪等变换增加训练数据的多样性,减少过拟合的风险。预训练与微调:使用在大型数据集上预训练的模型作为起点,然后在目标任务上进行微调,可以提高模型的性能。模型集成:使用多个模型的预测结果进行集成,可以进一步提高模型的性能和稳定性。这些训练技巧是提高神经网络性能的重要手段,了解和应用这些技巧可以显著提高神经网络的训练效率和性能[46]。
神经网络的类型与应用
常见神经网络类型
除了基本的前馈神经网络外,还有许多其他类型的神经网络,每种神经网络都有其特定的结构和应用场景:
卷积神经网络(CNN):CNN通过卷积操作和池化操作处理图像数据,能够有效地提取图像的特征。CNN在图像识别、图像分类等领域有广泛的应用[60]。循环神经网络(RNN):RNN通过共享参数处理序列数据,能够捕捉序列中的时序关系。RNN在自然语言处理、语音识别等领域有广泛的应用[6]。长短时记忆网络(LSTM):LSTM是RNN的一种变体,通过记忆单元和门控机制解决了RNN的长时依赖问题。LSTM在时间序列预测、机器翻译等领域有广泛的应用。自注意力机制(Self-attention):自注意力机制通过计算序列中不同位置之间的相关性,可以更有效地捕捉长距离依赖关系。自注意力机制是Transformer模型的核心组件,在自然语言处理领域有广泛的应用。生成对抗网络(GAN):GAN由生成器和判别器组成,生成器生成样本,判别器区分真实样本和生成样本。GAN在图像生成、数据增强等领域有广泛的应用。强化学习(Reinforcement Learning):强化学习通过智能体与环境的交互学习最优策略,不需要监督信号。强化学习在游戏AI、机器人控制等领域有广泛的应用。不同的神经网络类型适用于不同的应用场景,了解这些神经网络类型的特点和应用场景对于选择合适的模型至关重要[8]。
神经网络在图像识别中的应用
图像识别是神经网络应用最广泛的领域之一,神经网络在图像分类、目标检测、图像分割等任务中取得了显著的成就。
图像分类:图像分类是将图像分为预定义的类别,如识别图像中的物体是猫还是狗。CNN在图像分类任务中表现优异,通过卷积操作和池化操作提取图像的特征,然后通过全连接层进行分类。目标检测:目标检测是在图像中定位和识别物体,如在图像中找到所有的人脸并标注出来。目标检测通常使用两阶段或三阶段的检测器,如Faster R-CNN、YOLO等。图像分割:图像分割是将图像中的每个像素分配到一个类别,如将图像中的道路、车辆、行人等区域分开。图像分割通常使用FCN(全卷积网络)、U-Net等模型。神经网络在图像识别中的应用极大地推动了计算机视觉的发展,使得机器能够像人类一样理解和解释图像[66]。
神经网络在语音识别中的应用
语音识别是将语音转换为文本的过程,神经网络在语音识别中也取得了显著的成就。
语音特征提取:语音特征提取是从语音信号中提取有意义的特征,如MFCC(梅尔频率倒谱系数)、 LPC(线性预测编码)等。CNN可以用于提取语音的高级特征。语音识别:语音识别是将语音转换为文本的过程,通常使用CTC(连接时序分类)模型或者注意力机制模型。LSTM或Transformer通常用于建模时序数据。语音合成:语音合成是将文本转换为语音的过程,神经网络可以用于生成自然的语音。Tacotron和WaveNet是常用的语音合成模型。神经网络在语音识别中的应用极大地提高了语音识别的准确率和自然度,使得机器能够理解和生成人类语言[67]。
神经网络在自然语言处理中的应用
自然语言处理是使机器能够理解和生成人类语言的领域,神经网络在自然语言处理中也取得了显著的成就。
词嵌入:词嵌入是将词映射到连续的向量空间,如Word2Vec、GloVe等。词嵌入可以捕捉词之间的语义关系。机器翻译:机器翻译是将一种语言翻译成另一种语言的过程,神经机器翻译(NMT)使用序列到序列模型,通常使用LSTM或Transformer。文本分类:文本分类是将文本分为预定义的类别,如情感分析、新闻分类等。文本分类通常使用CNN、RNN或Transformer。问答系统:问答系统是回答用户问题的系统,如智能音箱、聊天机器人等。问答系统通常使用注意力机制来理解问题和上下文。神经网络在自然语言处理中的应用极大地提高了机器理解和生成人类语言的能力,使得机器能够与人类进行更自然的交流[69]。
神经网络在其他领域的应用
除了图像识别、语音识别和自然语言处理外,神经网络在许多其他领域也有广泛的应用:
医疗健康:神经网络可以用于医学图像分析、疾病预测、药物发现等。例如,CNN可以用于分析X光片、MRI等医学图像,辅助医生诊断疾病。金融分析:神经网络可以用于股票预测、风险评估、欺诈检测等。例如,LSTM可以用于分析股票价格的时间序列数据,预测未来的走势。自动驾驶:神经网络可以用于目标检测、场景理解、决策控制等。例如,CNN可以用于分析摄像头拍摄的图像,识别道路、车辆、行人等。游戏AI:神经网络可以用于游戏中的决策制定、对手模拟等。例如,强化学习可以用于训练游戏AI,使其能够学习最优策略。推荐系统:神经网络可以用于个性化推荐、协同过滤等。例如,神经协同过滤可以同时考虑用户和物品的特征,提供更准确的推荐。神经网络在各个领域的应用极大地推动了人工智能的发展,使得机器能够解决越来越复杂的问题[69]。
神经网络的未来发展趋势
深度学习的进展
深度学习是神经网络的一个分支,它使用多层神经网络学习数据的特征表示。深度学习在近年来取得了显著的进展:
模型规模扩大:模型的规模不断扩大,从VGGNet、ResNet到GPT-3、GPT-4等巨型模型。更大的模型通常具有更强的表达能力和更好的性能,但也需要更多的计算资源和数据。模型架构创新:模型架构不断创新,如残差网络(ResNet)、注意力机制(Attention)、变压器(Transformer)等。这些创新极大地提高了模型的性能和效率。训练技术进步:训练技术不断进步,如迁移学习、数据增强、模型集成等。这些技术使得训练大型模型变得更加高效和有效。硬件加速:专用硬件如GPU、TPU等极大地加速了神经网络的训练和推理,使得训练大型模型变得更加可行。深度学习的进展极大地推动了人工智能的发展,使得机器能够解决越来越复杂的问题[39]。
自监督学习与少样本学习
自监督学习和少样本学习是当前神经网络研究的热点方向:
自监督学习:自监督学习是利用数据本身的结构作为监督信号,不需要人工标注的标签。自监督学习可以通过解决 pretext 任务来学习数据的特征表示,如图像旋转、词预测等。少样本学习:少样本学习是在只有少量样本的情况下学习新任务,如1-shot learning、few-shot learning等。少样本学习通常结合元学习(meta-learning)技术,使模型能够快速适应新任务。自监督学习和少样本学习极大地减少了对大量标注数据的依赖,使得机器学习变得更加高效和实用[60]。
神经网络的可解释性与伦理问题
神经网络的可解释性和伦理问题是当前研究的另一个重要方向:
可解释性:神经网络通常被视为"黑盒"模型,其内部机制难以解释。提高神经网络的可解释性对于建立用户信任和确保模型的可靠性至关重要。常见的可解释性技术包括可视化中间特征、关注权重、生成对抗样本等。伦理问题:神经网络在应用中可能引发一系列伦理问题,如隐私保护、算法偏见、责任归属等。确保神经网络的公平性、透明性和伦理性对于其在社会中的广泛应用至关重要。神经网络的可解释性和伦理问题的研究对于推动神经网络的健康发展和广泛应用具有重要意义[69]。
总结
神经网络作为一种模拟人脑神经系统的计算模型,已经成为机器学习领域的重要技术之一。从基本的神经元模型到复杂的深度学习架构,神经网络在图像识别、语音识别、自然语言处理等领域取得了显著的成就。
神经网络的基本原理包括神经元模型、前向传播和反向传播算法。通过调整权重和偏置,神经网络可以学习输入数据的特征,从而实现对新数据的准确预测。BP算法是神经网络训练的核心算法,它通过反向传播误差来调整网络参数,使得网络的输出尽可能接近期望的输出。
神经网络中的关键组件包括激活函数、损失函数和优化器。激活函数引入非线性,使得神经网络能够学习和表示复杂的模式;损失函数衡量网络输出与真实输出之间的差距;优化器用于更新网络参数,使得损失函数最小化。
神经网络的优化与挑战包括全局最小与局部极小、过拟合与正则化以及各种训练技巧。了解这些挑战并采取适当的措施可以显著提高神经网络的性能和泛化能力。
神经网络的类型与应用非常广泛,包括卷积神经网络、循环神经网络、自注意力机制等不同的网络类型,以及图像识别、语音识别、自然语言处理等不同的应用领域。神经网络在医疗健康、金融分析、自动驾驶、游戏AI、推荐系统等领域的应用也极大地推动了人工智能的发展。
神经网络的未来发展趋势包括深度学习的进展、自监督学习与少样本学习以及神经网络的可解释性与伦理问题。这些研究方向将进一步提高神经网络的性能、效率和可解释性,推动人工智能的健康发展。
随着计算能力的提升和算法的创新,神经网络将继续在各个领域发挥重要作用,为人类社会带来更多的便利和价值。
参考资料
[6] 机器学习(周志华)课后习题——第五章——神经网络 - 知乎专栏. https://zhuanlan.zhihu.com/p/47616848.
[8] 周志华《机器学习》“西瓜书”+"南瓜书"笔记:第5章神经网络 - 知乎专栏. https://zhuanlan.zhihu.com/p/499365825.
[10] 一文了解神经网络的基本原理 - 知乎专栏. https://zhuanlan.zhihu.com/p/68624851.
[20] 通俗理解神经网络BP传播算法. https://zhuanlan.zhihu.com/p/24801814.
[21] 解密神经网络:理解神经网络的工作原理!. https://zhuanlan.zhihu.com/p/26749814230.
[24] 神经网络BP反向传播算法原理和详细推导流程 - CSDN博客. https://blog.csdn.net/qq_32865355/article/details/80260212.
[35] 机器学习-周志华-第5章神经网络 - 知乎专栏. https://zhuanlan.zhihu.com/p/191617243.
[39] 神经网络初探之激活函数、损失函数、优化器原创 - CSDN博客. https://blog.csdn.net/weixin_44111292/article/details/105850146.
[40] 神经网络基础:激活函数损失函数与优化器_解释 - CSDN博客. https://blog.csdn.net/2301_76268839/article/details/136984679.
[42] 简单理解神经网络中常用数学函数——损失函数 - 知乎专栏. https://zhuanlan.zhihu.com/p/690742462.
[45] 神经网络BP反向传播算法原理和详细推导流程转载 - CSDN博客. https://blog.csdn.net/liuweiyuxiang/article/details/100056963.
[46] 神经网络,BP算法的理解与推导 - 知乎专栏. https://zhuanlan.zhihu.com/p/45190898.
[60] BP神经网络原理与Python实现源码解析. https://zhuanlan.zhihu.com/p/30187353.
[66] 一切皆是映射:神经网络在图像识别中的应用案例原创 - CSDN博客. https://blog.csdn.net/2401_85133351/article/details/140089051.
[67] 详解卷积神经网络(CNN)在语音识别中的应用 - 博客园. https://www.cnblogs.com/qcloud1001/p/7941158.html.
[69] 从实验室到现实世界:前馈神经网络的多样化应用. https://zhuanlan.zhihu.com/p/679287152.