深度学习批次(batch)、迭代(iteration)、周期(epoch)、前向传播(forward propagation)、反向传播(backward propagation)、学习率(learning rate)概念解释

虽然现在应该是已经熟练掌握这些基础概念的时候,但是我是鱼的记忆,上一秒的事情,下一秒就忘了,除非是重要的人的重要的事情,呜呜呜呜,我这个破脑子.

还是写一下吧,直接GPT出来的(人类之光,欢呼~).

以前写过一次,贴一下链接:深度学习模型训练的过程理解(训练集、验证集、测试集、batch、iteration、epoch、单步预测、多步预测、kernels、学习率)

 

批次(Batch)

  • 概念:在训练深度学习模型时,我们通常不会一次性使用所有的数据进行训练,而是将数据集分成小的批次。每个批次包含一定数量的数据样本,这些样本会被同时送入网络进行处理。
  • 作用:使用批次可以有效管理内存资源,同时利用并行计算提高效率。此外,批次训练还有助于模型的泛化性能。

迭代(Iteration)

  • 概念:迭代是指完成一个批次数据的单次训练过程,包括前向传播和反向传播。
  • 作用:每次迭代,模型都会根据批次数据计算损失,然后更新一次参数,以期望减少损失。

周期(Epoch)

  • 概念:一个周期指的是整个训练数据集被遍历一次的过程。这意味着所有的数据样本都已经用于训练模型,分成若干批次逐个处理。
  • 作用:多个周期的训练可以确保模型有足够的机会学习数据集中的特征,通常需要多个周期的训练来达到较好的学习效果。

前向传播(Forward Propagation)

  • 概念:前向传播是指数据从输入层通过隐藏层最终到达输出层的过程,在这一过程中,每一层的节点(神经元)会根据输入数据和当前层的参数(权重和偏置)计算出输出。
  • 作用:前向传播的目的是为了得到预测结果,即根据当前的模型参数对输入数据进行预测。

反向传播(Backward Propagation)

  • 概念:反向传播是一种用于训练深度学习模型的算法,它通过计算损失函数相对于模型参数的梯度来更新模型的参数。这一过程从输出层开始,逆向通过每一层传播,直至输入层。
  • 作用:反向传播的目的是最小化损失函数,即调整模型参数使得模型预测值尽可能接近真实值。

通过这些概念的学习和理解,可以对深度学习的训练过程有一个较为清晰的认识,为深入学习深度学习算法和模型奠定基础。

 

示例:

通过一个简化的例子来说明这些概念是如何在深度学习训练中一起工作的。

假设我们有一个深度学习任务:使用一个简单的神经网络来识别手写数字(比如,MNIST数据集)。这个数据集包含成千上万的手写数字图片,每张图片都标记有相应的数字(0到9)。我们的目标是训练一个模型,使其能够准确识别出新图片中的数字。

步骤 1: 准备数据并分批

首先,我们将整个数据集分成小的批次。假设我们有60000张图片用于训练,我们可以将这些图片分成大小为100的批次,这样就有600个批次。每个批次包含100张图片及其标签。

步骤 2: 开始训练

我们现在开始进行模型的训练,通常训练会持续多个周期(Epochs)。

第一个周期(Epoch 1)

  1. 迭代(Iteration):
    • 选取第一个批次的100张图片及其标签。
  2. 前向传播(Forward Propagation):
    • 图片数据被送入神经网络。
    • 网络通过其当前参数(权重和偏置)计算预测结果。
  3. 计算损失:
    • 使用损失函数(比如,交叉熵损失)来评估预测结果与真实标签之间的差异。
  4. 反向传播(Backward Propagation):
    • 根据损失函数计算相对于每个参数的梯度。
    • 使用这些梯度来更新网络的参数,以减少损失。
  5. 重复以上步骤:
    • 对剩余的所有批次重复进行前向传播、计算损失、反向传播和参数更新。

完成所有600个批次后,我们就完成了一个训练周期(Epoch)。在这个过程中,每个批次的数据都用于更新模型,以期望模型对数据集有更好的泛化能力。

接下来的周期(Epoch 2, 3, ...)

  • 重复上述过程,每个周期遍历一次整个数据集(所有600个批次)。
  • 每个周期结束后,模型的性能通常会有所提高,因为它反复通过数据集学习并调整其参数。

总结

通过多个周期的训练,模型逐步学习识别手写数字的能力。每个周期都包括多次迭代,每次迭代都涉及一个批次的数据,进行前向传播以计算预测结果,计算损失,然后进行反向传播以更新模型参数。这个循环过程使得模型不断接近于目标,最终能够准确识别未见过的手写数字图片。

 

结束,撒花✿✿ヽ(°▽°)ノ✿.

 

现在是2024年3月27日,16:44,对昨天发的内容再做一些补充,用C/C++写了一些伪代码,帮助理解:

/*
假设60000张图片用于训练,batch=100,iteration=50,epoch=30
如果有60000张图片,每个批次(batch)包含100张图片,则整个数据集可以分成600个批次
每遍历这600个批次一次称为一个周期(epoch)
迭代(iteration)的数量应该是指在一个epoch中需要完成的批次数量,这里由于有60000张图片,每个批次100张,所以应该是600次迭代(即600个批次)完成一个epoch
*/

int n=60000; // 总图片数量
int batch=100; // 每批次的图片数量
int epoch=30; // 总周期数

int iteration=n/batch; // 每个epoch中的迭代次数,这里是600


for(int e=1;e<=epoch;e++){ // 遍历每个epoch
    for(int i=1;i<=iteration;i++){ // 在每个epoch中遍历所有迭代
        // 假设每个迭代处理一个批次
        for(int j=(i-1)*batch+1;j<=i*batch;j++){ // 处理每个批次中的图片
            // 对于实际应用,这里将是对batch中的每张图片进行操作
            // 假设操作包含在这些函数中
            Forward_Propagation(); //进行前向传播
            calculate_Loss(); //计算损失
            Backward_Propagation(); //进行反向传播
        }
    }
}

/*
模型将遍历整个数据集30次(即30个epoch)
每个epoch包含600次迭代,每次迭代处理100张图片的一个批次
在每次迭代中,对每个批次进行前向传播、计算损失和反向传播

这里的关键点在于理解:
Epoch:完整地遍历训练数据集一次。
Iteration:表示一个批次的前向和反向传播过程,整个数据集被分成多个批次进行迭代。
Batch size:每次迭代输入模型的样本数量。
每次循环中处理一个batch的数据,经过前向传播、损失计算和反向传播,以此方式逐步更新模型参数,整个过程重复进行指定的epoch次数,以期望达到最优化模型参数。
*/

 

Tips:

关于iteration、batch以及数据数量n:

在设计深度学习训练循环时,通常只需明确指定两个:'batch_size'、'n(总样本数量)',以及'iteration(每个epoch中的迭代次数)'。第三个值可以从前两个值中计算得出。

iteration = n / batch_size,以确保每个epoch都能遍历整个数据集。

如果'iteration'不等于'n/batch_size'会发生什么?

1.'iteration'大于'n/batch_size':

如果设置的'iteration'数量大于根据'n'和'batch_size'计算出来的值,这意味着在一个epoch内,我们希望迭代的次数超过了一次遍历整个数据集所需的迭代次数。在实际操作中,这可能导致数据集的一部分被重复使用于同一个epoch中,因为标准的做法是在每个epoch结束时打乱数据顺序。如果数据没有被适当地打乱,这种重复可能会导致模型过拟合到这些重复的样本上。

2.'iteration'小于'n/batch_size':

如果设置的'iteration'数量小于由'n'和'batch_size'计算出来的值,这意味着我们在每个epoch结束前就停止了迭代。换句话说,每个epoch并没有遍历整个数据集。这样做可能导致模型训练不充分,因为并不是所有的数据都用于训练,可能会导致模型性能不佳。

 

在实际应用中,正确地设置'iteration'是确保每个epoch都能遍历整个数据集的关键,通常不需要手动设置'iteration',因为它可以根据总样本数'n'和每批样本数'batch_size'自动计算得出。大多数深度学习框架会自动处理这个过程,确保每个epoch能够处理所有的数据。

最好的做法是明确指定'batch_size'和整个数据集的大小'n',让'iteration'隐式地通过这两个值来确定,这样可以避免上述问题,确保训练过程的有效性和高效性。

 

一个小细节:

如果batch_size不能整除n,那取余的那些数据是怎么操作的?

batch_size不能整除n(数据集的总样本数)时,最后一个批次(batch)的大小将小于batch_size。这种情况下的处理方式主要有以下几种:

  1. 使用小批次(Smaller Batch):

    • 最简单的处理方法就是让最后一个批次小于其他批次。这意味着如果你有60000个样本,batch_size设为100,那么通常你会有600个批次,每个批次100个样本。但如果有60200个样本,最后一个批次将只有200个样本。大多数深度学习框架会自动处理这种情况,不需要手动干预。
  2. 丢弃多余的样本(Discard Remainder):

    • 另一种方法是简单地丢弃不能完整形成一个批次的剩余样本。这意味着在上述的例子中,最后200个样本将不被用于训练。这种方法简单,但会导致数据的浪费。
  3. 数据填充(Padding)或生成额外样本:

    • 对于某些任务(特别是自然语言处理任务),如果最后一个批次小于batch_size,可以通过添加额外的“填充”样本来增加批次的大小。这些填充样本通常会在训练过程中被特殊处理(比如忽略)。在其他任务中,也可以通过复制已有样本或使用数据增强生成额外的样本来填满最后一个批次。
  4. 权重调整(Weighted Loss):

    • 如果使用小批次会影响训练稳定性或结果,可以考虑对最后一个批次的损失进行权重调整,使其在梯度更新时与其他批次等效。这种方法较少见,实现也较为复杂。
  5. 累积梯度(Gradient Accumulation):

    • 在某些情况下,如果因硬件资源限制而无法增加batch_size,可以考虑使用累积梯度技术。这不是直接针对不能整除的问题,但是它允许你通过多次迭代较小的批次来模拟较大批次的效果。这种技术可以间接帮助处理最后一个小批次对训练稳定性的影响。

大多数情况下,直接使用小批次是最常见也是最简单的方法,因为它既能利用所有的数据,又不需要复杂的处理逻辑。大多数现代深度学习框架都能自动处理这种情况。

 

结束,去给小导打工去了,来活了,呜呜呜。

 

关于学习率,单独写了一篇,贴一下链接,这样更完整一些:深度学习学习率(Learning Rate)lr理解

结束,继续看代码了。

 

 

 

posted @ 2024-03-26 20:44  ZERO-  阅读(92)  评论(0编辑  收藏  举报