深入浅出神经网络:从基础原理到高级应用

第5章 神经网络

文章的最后还有例题哦。如果你觉得这篇文章有帮助,别忘了关注B站帅小柏点赞、评论和分享是对我最大的支持。

5.1 神经元模型

神经网络的基本单元是神经元模型。神经元模拟了生物神经元的行为,通过接收输入信号,进行加权求和,然后经过激活函数输出结果。
在这里插入图片描述

数学上,一个简单的神经元可以表示为:

y = f ( ∑ i = 1 n w i x i + b ) y = f\left(\sum_{i=1}^{n} w_i x_i + b\right) y=f(i=1nwixi+b)

其中, w i w_i wi是输入 x i x_i xi的权重, b b b是偏置, f f f是激活函数。
在这里插入图片描述

常见的激活函数包括Sigmoid函数、Tanh函数和ReLU函数,它们分别定义为:

Sigmoid ( x ) = 1 1 + e − x \text{Sigmoid}(x) = \frac{1}{1 + e^{-x}} Sigmoid(x)=1+ex1

Tanh ( x ) = tanh ⁡ ( x ) = e x − e − x e x + e − x \text{Tanh}(x) = \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} Tanh(x)=tanh(x)=ex+exexex

ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)

这些激活函数各有特点,Sigmoid和Tanh函数压缩输入到固定范围内,但容易导致梯度消失问题;ReLU函数则通过简单的线性变换解决了梯度消失问题,但可能导致“死ReLU”现象。

重点说一下Signmoid函数:

Sigmoid函数是一种常用的激活函数,尤其在神经网络中。它的数学形式为:

f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+ex1

特点

  1. 输出范围:Sigmoid函数的输出值范围在0到1之间。
  2. 非线性:即使输入是线性的,Sigmoid函数的输出也是非线性的,这使得它能够捕捉数据中的复杂模式。
  3. 平滑性:Sigmoid函数是光滑的,有助于优化算法(如梯度下降)进行有效的训练。
  4. 梯度:Sigmoid的导数可以通过它的输出值计算:

f ′ ( x ) = f ( x ) ⋅ ( 1 − f ( x ) ) f'(x) = f(x) \cdot (1 - f(x)) f(x)=f(x)(1f(x))

Sigmoid函数及其导数的求导过程:

Sigmoid 函数的形式为:
f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+ex1
我们需要对其求导。首先,采用链式法则,Sigmoid函数可以表示为:
f ( x ) = ( 1 + e − x ) − 1 f(x) = (1 + e^{-x})^{-1} f(x)=(1+ex)1
对其求导:
f ′ ( x ) = − 1 ⋅ ( 1 + e − x ) − 2 ⋅ d d x ( 1 + e − x ) f'(x) = -1 \cdot (1 + e^{-x})^{-2} \cdot \frac{d}{dx}(1 + e^{-x}) f(x)=1(1+ex)2dxd(1+ex)
接着,计算 (\frac{d}{dx}(1 + e^{-x})):
d d x ( 1 + e − x ) = 0 + ( − e − x ) = − e − x \frac{d}{dx}(1 + e^{-x}) = 0 + (-e^{-x}) = -e^{-x} dxd(1+ex)=0+(ex)=ex
代入回去:
f ′ ( x ) = − 1 ⋅ ( 1 + e − x ) − 2 ⋅ ( − e − x ) f'(x) = -1 \cdot (1 + e^{-x})^{-2} \cdot (-e^{-x}) f(x)=1(1+ex)2(ex)
这可以简化为:
f ′ ( x ) = e − x ( 1 + e − x ) 2 f'(x) = \frac{e^{-x}}{(1 + e^{-x})^2} f(x)=(1+ex)2ex
观察后可以发现:
f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+ex1
1 − f ( x ) = e − x 1 + e − x 1 - f(x) = \frac{e^{-x}}{1 + e^{-x}} 1f(x)=1+exex
因此,Sigmoid函数的导数可以表达为:
f ′ ( x ) = f ( x ) ⋅ ( 1 − f ( x ) ) f'(x) = f(x) \cdot (1 - f(x)) f(x)=f(x)(1f(x))
注:
f ′ ( 0.5 ) = f ( 0.5 ) ⋅ ( 1 − f ( 0.5 ) ) ≈ 0.622 ⋅ ( 1 − 0.622 ) = 0.622 ⋅ 0.378 ≈ 0.235 f'(0.5) = f(0.5) \cdot (1 - f(0.5)) \approx 0.622 \cdot (1 - 0.622) = 0.622 \cdot 0.378 \approx 0.235 f(0.5)=f(0.5)(1f(0.5))0.622(10.622)=0.6220.3780.235

5.2 感知机与多层网络

感知机是最简单的神经网络,由一个或多个神经元构成,它只能解决线性可分的问题。
感知机:两层神经元组成。
在这里插入图片描述

感知机的输出可以表示为:

y = sign ( ∑ i = 1 n w i x i + b ) y = \text{sign}\left(\sum_{i=1}^{n} w_i x_i + b\right) y=sign(i=1nwixi+b)

感知机的局限在于它仅能解决线性可分的问题。为了解决非线性问题,我们引入了多层感知机(MLP)。多层感知机通过引入隐藏层解决了非线性问题。一个两层感知机有输入层、隐藏层和输出层。其数学表示为:

h j = f ( ∑ i = 1 n w i j x i + b j ) h_j = f\left(\sum_{i=1}^{n} w_{ij} x_i + b_j\right) hj=f(i=1nwijxi+bj)

y k = g ( ∑ j = 1 m v j k h j + c k ) y_k = g\left(\sum_{j=1}^{m} v_{jk} h_j + c_k\right) yk=g(j=1mvjkhj+ck)

其中, w i j w_{ij} wij v j k v_{jk} vjk分别是输入层到隐藏层和隐藏层到输出层的权重, b j b_j bj c k c_k ck是偏置项, f f f g g g是激活函数。多层感知机的强大在于其能够通过多个隐藏层的组合,逼近任意复杂的函数。

5.3 误差逆传播算法

误差逆传播算法是训练多层神经网络的核心算法。其目标是通过最小化损失函数来调整网络的权重和偏置。常见的损失函数是均方误差(MSE),定义为:

E = 1 2 ∑ k = 1 K ( y k − t k ) 2 E = \frac{1}{2}\sum_{k=1}^{K} (y_k - t_k)^2 E=21k=1K(yktk)2

其中, y k y_k yk是网络的输出, t k t_k tk是目标值。反向传播通过链式求导法则计算损失函数相对于每个权重的梯度,然后使用梯度下降法更新权重:

w i j : = w i j − η ∂ E ∂ w i j w_{ij} := w_{ij} - \eta \frac{\partial E}{\partial w_{ij}} wij:=wijηwijE

其中, η \eta η是学习率。

详细来说,反向传播算法分为以下几个步骤:

  1. 前向传播:计算每层神经元的输入和输出。
  2. 计算误差:使用损失函数计算输出层的误差。
  3. 反向传播:根据输出层的误差,利用链式求导法则逐层计算每层的误差。
  4. 更新权重:根据计算出的误差和梯度,调整每个权重和偏置。

梯度计算的关键在于链式法则。对于隐藏层的每个权重 w i j w_{ij} wij,其梯度可以表示为:

∂ E ∂ w i j = ∂ E ∂ y k ⋅ ∂ y k ∂ h j ⋅ ∂ h j ∂ w i j \frac{\partial E}{\partial w_{ij}} = \frac{\partial E}{\partial y_k} \cdot \frac{\partial y_k}{\partial h_j} \cdot \frac{\partial h_j}{\partial w_{ij}} wijE=ykEhjykwijhj

通过这种方式,网络能够逐层调整权重,使得损失函数逐渐减小,逼近最优解。

当然,继续补全和详细解释剩下的部分。

5.4 全局最小与局部极小

在训练神经网络的过程中,我们希望找到损失函数的全局最小值,但由于损失函数通常是非凸的,我们可能会陷入局部极小值。解决这一问题的方法包括初始化权重的多次尝试、使用动量(Momentum)方法、以及更复杂的优化算法如Adam优化器。

局部最小值是在某一区域内,函数的取值达到了最小,但是如果将这个区域扩展到定义域上来,那么这个局部最小值就不一定是最小的。

全局最小值,是在定义域内,函数值最小。全局最小一定是局部最小值,但“局部极小 ” 不一定是“全局最小 ”。因此我们的目标是找到 “ 全局最小 ”。

可能存在多个局部极小值,但却只会有一个全局最小值

在这里插入图片描述

动量方法通过引入动量项来加速梯度下降,并减少震荡,其更新规则为:

v t + 1 = γ v t + η ∂ E ∂ w i j v_{t+1} = \gamma v_t + \eta \frac{\partial E}{\partial w_{ij}} vt+1=γvt+ηwijE
w i j : = w i j − v t + 1 w_{ij} := w_{ij} - v_{t+1} wij:=wijvt+1

其中, γ \gamma γ是动量系数,通常设为0.9。动量方法通过保留先前梯度更新的方向,使得参数在正确方向上前进得更快。

Adam优化器结合了动量法和RMSProp方法,通过自适应调整学习率,加速收敛并降低震荡。其更新规则为:

m t = β 1 m t − 1 + ( 1 − β 1 ) ∇ E m_t = \beta_1 m_{t-1} + (1 - \beta_1) \nabla E mt=β1mt1+(1β1)E
v t = β 2 v t − 1 + ( 1 − β 2 ) ( ∇ E ) 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) (\nabla E)^2 vt=β2vt1+(1β2)(E)2
m ^ t = m t 1 − β 1 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t} m^t=1β1tmt
v ^ t = v t 1 − β 2 t \hat{v}_t = \frac{v_t}{1 - \beta_2^t} v^t=1β2tvt
w = w − η m ^ t v ^ t + ϵ w = w - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} w=wηv^t +ϵm^t

其中, β 1 \beta_1 β1 β 2 \beta_2 β2是超参数,常设为0.9和0.999, ϵ \epsilon ϵ是一个极小值防止分母为零。

5.5 其他常见神经网络

除了多层感知机,还有许多其他类型的神经网络。

  1. 卷积神经网络(CNN)
    卷积神经网络专注于处理图像数据,通过卷积层提取特征。卷积操作可以表示为:

    ( I ∗ K ) ( x , y ) = ∑ i = 0 m − 1 ∑ j = 0 n − 1 I ( x + i , y + j ) K ( i , j ) (I * K)(x, y) = \sum_{i=0}^{m-1}\sum_{j=0}^{n-1} I(x+i, y+j) K(i, j) (IK)(x,y)=i=0m1j=0n1I(x+i,y+j)K(i,j)

    其中, I I I是输入图像, K K K是卷积核。卷积层通过滑动窗口操作提取局部特征,并通过池化层(如最大池化)进一步减少特征图的尺寸。典型的CNN架构包括卷积层、池化层、全连接层等。

  2. 循环神经网络(RNN)
    循环神经网络用于处理序列数据,通过隐藏层之间的循环连接捕捉时间序列关系。其更新公式为:

    h t = f ( W h h h t − 1 + W x h x t + b h ) h_t = f(W_{hh} h_{t-1} + W_{xh} x_t + b_h) ht=f(Whhht1+Wxhxt+bh)
    y t = g ( W h y h t + b y ) y_t = g(W_{hy} h_t + b_y) yt=g(Whyht+by)

    其中, W h h W_{hh} Whh, W x h W_{xh} Wxh, W h y W_{hy} Why是权重矩阵, h t h_t ht是隐藏状态, x t x_t xt是输入, y t y_t yt是输出。RNN在处理长序列时可能会遇到梯度消失或爆炸问题,常用的变种有长短期记忆网络(LSTM)和门控循环单元(GRU),它们通过引入门机制有效地缓解了这些问题。

  3. 生成对抗网络(GAN)
    生成对抗网络由生成器和判别器组成。生成器通过噪声生成假数据,判别器则用于区分真实数据和假数据。训练过程是一个零和博弈,两个网络互相竞争,使得生成器生成的数据越来越真实。GAN的损失函数为:

    min ⁡ G max ⁡ D V ( D , G ) = E x ∼ p d a t a ( x ) [ log ⁡ D ( x ) ] + E z ∼ p z ( z ) [ log ⁡ ( 1 − D ( G ( z ) ) ) ] \min_G \max_D V(D, G) = \mathbb{E}_{x \sim p_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log(1 - D(G(z)))] GminDmaxV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]

    其中, D D D是判别器, G G G是生成器, x x x是真实数据, z z z是噪声。

  4. 自编码器(Autoencoder)
    自编码器用于数据降维和特征学习,由编码器和解码器组成。编码器将输入数据压缩到低维表示,解码器则将低维表示重构为原始数据。自编码器的目标是最小化重构误差:

    L ( x , x ^ ) = ∣ ∣ x − x ^ ∣ ∣ 2 L(x, \hat{x}) = ||x - \hat{x}||^2 L(x,x^)=∣∣xx^2

    其中, x x x是输入数据, x ^ \hat{x} x^是重构数据。常见的变种有稀疏自编码器、去噪自编码器和变分自编码器(VAE)。

总结

神经网络是深度学习的核心,理解其基础构造和训练方法对于掌握现代人工智能技术至关重要。通过以上各章节的详细讲解,我们从神经元模型、感知机、多层网络、误差逆传播算法,到全局最小与局部极小问题,以及不同类型的神经网络,一步步深入了解其原理和应用。希望这些内容能够帮助你更好地理解神经网络的复杂性和强大潜力。

例题

1. 具有10个隐层结点的单隐层网络在处理输入维度为6维的三分类任务时 (有3个输出层结点),网络中共有____ (填写一个整数) 个参数

为了计算该网络中的参数总数,我们需要考虑输入层、隐层和输出层之间的连接权重以及各层的偏置。

  1. 输入层到隐层:

    • 输入层有6个结点,隐层有10个结点。
    • 每个输入结点与每个隐层结点相连,共有 (6 \times 10 = 60) 个权重。
    • 隐层有10个偏置项。
  2. 隐层到输出层:

    • 隐层有10个结点,输出层有3个结点。
    • 每个隐层结点与每个输出结点相连,共有 (10 \times 3 = 30) 个权重。
    • 输出层有3个偏置项。

因此,网络中总共有:

60   ( 输入到隐层的权重 ) + 10   ( 隐层偏置 ) + 30   ( 隐层到输出的权重 ) + 3   ( 输出层偏置 ) = 103 60 \, (\text{输入到隐层的权重}) + 10 \, (\text{隐层偏置}) + 30 \, (\text{隐层到输出的权重}) + 3 \, (\text{输出层偏置}) = 103 60(输入到隐层的权重)+10(隐层偏置)+30(隐层到输出的权重)+3(输出层偏置)=103

易错点:输入层的6不加
所以,总共有 103 个参数。

2. 考虑一个有1个输入结点、1个隐层结点、1个输出结点构成的神经网络,该网络输入到隐层的权重与隐层到输出的权重共享,即该神经网络的前馈表达式为6.9.1.png
,其中σ(x)为Sigmoid激活函数。考虑由两个样本组成的数据集D={(0,0.5),(1,0.25)},神经网络初始化参数为w=-1,b=-1,使用平方损失作为损失函数 (总损失为所有样本的平方和损失,不除以2)。则该神经网络在初始化下的损失为____ (保留3位小数)
0.079

步骤解析:

第一步:隐层计算

  1. 线性组合计算

    对于每个神经元,计算输入的加权和。假设权重 (w_1) 和偏置 (b_1) 分别为 -1,输入 (x_1) 为 0。

    z = w 1 × x 1 + b 1 = − 1 × 0 + ( − 1 ) = − 1 z = w_1 \times x_1 + b_1 = -1 \times 0 + (-1) = -1 z=w1×x1+b1=1×0+(1)=1

  2. 激活函数

    使用 sigmoid 激活函数来计算神经元的输出:

    σ ( z ) = 1 1 + e − z = 1 1 + e 1 ≈ 0.2689 \sigma(z) = \frac{1}{1 + e^{-z}} = \frac{1}{1 + e^1} \approx 0.2689 σ(z)=1+ez1=1+e110.2689

第二步:输出层计算

  1. 线性组合计算

    将隐层输出作为输入传递给输出层。假设输出层的权重 (w_2) 和偏置 (b_2) 分别为 -1。

    o = w 2 × σ ( z ) + b 2 = − 1 × 0.2689 + ( − 1 ) = − 1.2689 o = w_2 \times \sigma(z) + b_2 = -1 \times 0.2689 + (-1) = -1.2689 o=w2×σ(z)+b2=1×0.2689+(1)=1.2689

  2. 激活函数

    使用相同的 sigmoid 激活函数来计算输出层的输出:

    σ ( o ) = 1 1 + e − o = 1 1 + e 1.2689 ≈ 0.2190 \sigma(o) = \frac{1}{1 + e^{-o}} = \frac{1}{1 + e^{1.2689}} \approx 0.2190 σ(o)=1+eo1=1+e1.268910.2190

第三步:损失计算

使用平方损失(均方误差)来计算输出与真实值之间的差异。假设真实值为 0.5。

  1. 平方损失函数

    L = ( 预测值 − 真实值 ) 2 = ( 0.2190 − 0.5 ) 2 = 0.079 L = (\text{预测值} - \text{真实值})^2 = (0.2190 - 0.5)^2 = 0.079 L=(预测值真实值)2=(0.21900.5)2=0.079

这就是从输入到输出以及计算损失的详细步骤。这些步骤展示了如何通过一个简单的神经网络进行前向传播并计算损失。这个过程可以扩展到更复杂的网络结构和更大的样本集。

对于样本 ((0, 0.5)):

  1. 隐层计算:

    z = ( − 1 × 0 ) + ( − 1 ) = − 1 z = (-1 \times 0) + (-1) = -1 z=(1×0)+(1)=1

    σ ( z ) = 1 1 + e 1 ≈ 0.2689 \sigma(z) = \frac{1}{1 + e^1} \approx 0.2689 σ(z)=1+e110.2689

  2. 输出层计算:

    o = ( − 1 × 0.2689 ) + ( − 1 ) = − 1.2689 o = (-1 \times 0.2689) + (-1) = -1.2689 o=(1×0.2689)+(1)=1.2689

    σ ( o ) = 1 1 + e 1.2689 ≈ 0.2190 \sigma(o) = \frac{1}{1 + e^{1.2689}} \approx 0.2190 σ(o)=1+e1.268910.2190

  3. 平方损失:

    ( 0.2190 − 0.5 ) 2 = 0.079 (0.2190 - 0.5)^2 = 0.079 (0.21900.5)2=0.079

对于样本 ((1, 0.25)):

  1. 隐层计算:

    z = ( − 1 × 1 ) + ( − 1 ) = − 2 z = (-1 \times 1) + (-1) = -2 z=(1×1)+(1)=2

    σ ( z ) = 1 1 + e 2 ≈ 0.1192 \sigma(z) = \frac{1}{1 + e^2} \approx 0.1192 σ(z)=1+e210.1192

  2. 输出层计算:

    o = ( − 1 × 0.1192 ) + ( − 1 ) = − 1.1192 o = (-1 \times 0.1192) + (-1) = -1.1192 o=(1×0.1192)+(1)=1.1192

    σ ( o ) = 1 1 + e 1.1192 ≈ 0.2462 \sigma(o) = \frac{1}{1 + e^{1.1192}} \approx 0.2462 σ(o)=1+e1.119210.2462

  3. 平方损失:

    ( 0.2462 − 0.25 ) 2 = 0.000014 (0.2462 - 0.25)^2 = 0.000014 (0.24620.25)2=0.000014

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅小柏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值