深度学习知识查漏补缺

1 梯度下降、反向传播的理解

1.1 最小二乘法的梯度下降解法

首先,我们先来看一下最小二乘法是如何利用梯度下降反向传播算法来求解的(PS:当然,最小二乘法一般都是用理论公式求解的)

假设我们有以下数据点: $\{(1, 2), (2,4), (3,5), (4,4), (5,5)\}$,我们希望拟合一条直线:

通过最小二乘法,找到最优的$k$和$b$。

损失函数:最小二乘法的损失函数为

梯度计算:损失函数对$k$和$b$的梯度为

梯度下降更新规则:通过梯度下降法,逐步更新$k$和$b$

具体步骤

(1)初始化参数

  • 初始值:$k=0.0, b=0.0$
  • 学习率:$η=0.01$
  • 迭代次数:1000次

(2)迭代过程

我们以第一次迭代为例,详细说明每一步的计算。

第一次迭代:

1. 计算预测值:

2. 带入梯度计算公式:

3. 更新参数:

第二次迭代:

1. 计算预测值:

经计算,对于$x=[1,2,3,4,5]$,$\hat y = [1.72,3.04,4.36,5.68,7.0]$。

2. 带入梯度计算公式:

3. 更新参数:

继续迭代:

重复上述过程,直到达到指定的迭代次数(如 1000 次)或损失函数收敛。

可以看到,损失函数是权重的函数,而不是输入数据的函数。 梯度下降是对权重(参数)进行下降,而不是对输入数据

2025-01-07日晚上之所以花时间写下这部分内容,主要就是有一个小小的问题把我困绕了好久,那就是神经网络的损失函数:

我们要使用$\dfrac{\partial J}{\partial \boldsymbol W}$来对权重$\boldsymbol W$进行梯度下降,使得$J$最小,但是我产生的疑惑是,每次批量输进去的图片都不一样,也就是$J$不是一个固定的函数,那要怎么求导呢,其实看了最小二乘的求解过程,我就知道问题所在就是要一次性使用全部的数据!!!

补充:为什么神经网络利用梯度下降进行反向传播时,不像最小二乘一样使用全部的数据来计算呢?

神经网络不一下子把所有数据全都喂进网络,再进行反向传播求解参数,主要有以下几个原因:

  • 内存限制
    • 训练大型神经网络时,数据集通常非常大。一次性将所有数据加载到内存中可能会导致内存不足的问题。
  • 计算效率
    • 现代硬件(如GPU和TPU)在处理大规模矩阵运算时非常高效,但它们在处理单个非常大的矩阵时可能不如处理多个较小的矩阵高效。通过将数据分成小批次,可以更好地利用这些硬件的并行计算能力,提高训练速度。
  • 梯度估计的稳定性
    • 在每次迭代中使用整个数据集来计算梯度,会导致梯度估计非常不稳定,因为每个梯度更新都基于整个数据集的统计特性。这可能导致训练过程波动较大,甚至可能使模型无法收敛。而使用小批次的数据来估计梯度,可以使梯度估计更加稳定,从而有助于更稳定的训练过程。
  • 正则化效果
    • 在小批次训练中,随机梯度下降(SGD)等优化算法引入了噪声,这种噪声有助于防止过拟合,起到一定的正则化效果。而在全量数据训练中,梯度更新过于平滑,可能会使模型过拟合训练数据。
  • 在线学习与实时更新
    • 在某些应用场景中,例如在线学习或实时更新模型,数据是持续到来的。在这种情况下,不可能一次性将所有数据加载到内存中进行处理。分批次处理数据使得模型能够逐步适应新数据,保持其性能。
  • 分布式训练
    • 在分布式训练环境中,数据需要被分割成小块并分发到不同的计算节点上。分批次处理数据使得这种分布式训练成为可能,并且可以有效地利用多台机器的计算资源。

2 dropout层原理和反向传播

2.1 dropout 的概念

深度神经网络结构的过拟合是指:在训练集上的正确率很高, 但在测试集上的准确率很低。为了缓解网络过拟合的问题,其中一种常见的办法是使用 dropout 函数。

dropout 是指在深度网络的训练中,以一定的概率随机地 “临时丢弃” 一部分神经元节点,具体来讲,dropout作用于每份小批量训练数据,由于其随机丢弃部分神经元的机制, 相当于每次迭代都在训练不同结构的神经网络。

dropout 前网络结构示意 dropout 后网络结构示意

2.2 dropout 的作用

dropout 最直接的作用就是可以提升模型的泛化能力,提高模型的健壮性,提高通用性。

通俗的理解:

假设某公司存在一个职能稳定,合理分工团队。因为某些不可避免的原因,该团队的成员每天都有 50% 概率不能参与工作。为了完成任务,需要其他同事加班完成缺席员工任务。一段时间后, 该团队的成员普遍学会了其他同事的相关工作技能。于是,该团队拥有了更好的泛化能力。

2.3 训练过程中的 dropout

为了定义 dropout,我们需要一个随机数生成函数rand(),每一次调用都会重新生成一个0~1之间的小数:

假设每一次 dropout 都以$0<p<1$的概率随机丢弃一个节点,则 dropout 函数的定义为:

将通过的信号被放大$\dfrac{1}{1-p}$倍,保证总体信号强度不变 (加班)。

dropout函数是逐个元素处理的, 并不需要写成向量的形式,但为了方便编程实现,这里将其进行改编成向量的形式:考虑一个输入向量$\boldsymbol x$,同时定义一个随机掩码函数和一个随机掩码向量$\boldsymbol m$:

dropout函数可用向量运算表示为:

2.4 测试过程中的 dropout

训练完成后,恢复完整的网络结构:

2.5 反向传播

考虑一个输入向量$\boldsymbol x$,经丢弃概率为$p$的dropout函数变换后得到向量$\boldsymbol d$,往前 forward 传播得到误差值 error (标量 e ),求在训练过程中 e 对 $\boldsymbol x$ 的梯度:

求梯度:

其中:

故有:

向量$\dfrac{\text{d} e}{\text{d}d_i}$由上游负责计算,是已知的。

dropout函数详解及反向传播中的梯度求导 - CSDN

dropout正则化的反向传播的代码实现 - 知乎

3 卷积层为什么不使用dropout

卷积层为什么不使用dropout? - 知乎

4 卷积核梯度计算

【PyTorch】卷积层、池化层梯度计算 - CSDN

卷积核梯度计算的推导及实现 - 渐渐弃坑的文章 - 知乎

5 池化层的反向传播

MaxPooling和AvgPooling的求导过程 - CSDN
池化层的反向传播 - CSDN
33.7.13 池化层的反向传播 - bilibili

6 请问训练数据包含负数能用relu激活函数吗

卷积神经网络训练图像的时候,像素值都是大于0的,那么激活函数relu还有什么作用呢?- 知乎

深度学习中,图片的预处理为什么要减去图片的平均值,在什么情况下要选择这种预处理方式? - 知乎

7 从零构建神经网络-不使用框架

如何自己从零实现一个神经网络? - 知乎

8 如何自定义激活函数

Pytorch 学习笔记-自定义激活函数 - CSDN

9 关于激活函数的问题

由dead relu引发的思考——正则化算法漫谈

为什么不用绝对值作为神经网络的激活函数? - 知乎

【分享】 激活函数ReLU的理解与总结

ReLU的作用 - sylvia的文章 - 知乎

【转载】激活函数总结(一)

关于RELU激活函数造成神经元不可逆死亡的思考. - RICH双子的文章 - 知乎

Dynamic ReLU激活函数 - CSDN

10 其他问题

  • Copyrights © 2015-2025 wjh
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信