目录
19 卷积层
目标检测数据集处理
处理和加载目标检测数据集。具体步骤如下:
- 数据集下载:通过
d2l.DATA_HUB
下载包含图像和标签的香蕉检测数据集。 - 数据集读取:使用
read_data_bananas
函数读取数据集中的图像和标签。标签包括目标类别标签和边界框坐标。 - 自定义数据集类:创建
BananasDataset
类,用于加载香蕉检测数据集,继承torch.utils.data.Dataset
。 - 数据加载器:定义
load_data_bananas
函数,为训练集和测试集返回数据加载器实例。 - 数据展示:展示包含真实边界框的图像,观察不同角度、大小和位置的香蕉图像。
通过上述步骤,快速构建和测试目标检测模型,理解如何处理和标记数据集中的目标对象。
卷积神经网络中的卷积层操作
- 二维互相关运算:了解卷积层实际上执行的是互相关运算,而非严格的卷积运算。通过
corr2d
函数实现二维互相关运算。 - 卷积层实现:定义
Conv2D
类,实现二维卷积层,卷积核权重和标量偏置作为可训练参数。 - 边缘检测应用:通过卷积核检测图像中的边缘变化,了解卷积核如何通过按元素相乘和求和检测边缘。
- 学习卷积核:构建一个二维卷积层,通过梯度下降算法学习卷积核的权重,使其能够准确地从输入生成预期的输出。
- 特征映射和感受野:了解卷积层的特征映射和感受野的概念,知道如何通过构建更深的网络来检测更广区域的输入特征。
通过实际代码操作和案例分析,掌握了卷积层的实现原理和应用场景,为后续深入学习卷积神经网络打下了坚实的基础。
遇到的问题&解决办法
卷积核学习过程中收敛速度较慢
- 问题描述:在通过梯度下降算法学习卷积核权重时,发现收敛速度较慢,误差下降不明显。
- 解决办法:调整学习率,尝试不同的学习率值,例如将学习率从
3e-2
调整到1e-2
或1e-3
,观察收敛效果。同时,增加训练迭代次数,确保模型有足够的时间进行优化。此外,初始化卷积核权重时,可以使用更合适的初始化方法,如Xavier初始化,提高收敛速度。
理解特征映射和感受野的概念
- 问题描述:对卷积层的特征映射和感受野的概念理解不清,难以直观感受到它们的实际意义。
- 解决办法:通过具体案例和图示辅助理解,结合实际代码操作观察不同卷积层输出的特征映射变化。同时,阅读相关文献和资料,加深对感受野扩展机制的认识,逐步掌握特征映射和感受野的概念。
20 卷积层里的填充和步幅
图像卷积
互相关运算
- 卷积层中的运算实际上是互相关运算,而不是严格的卷积运算。
- 互相关运算通过卷积窗口在输入张量上滑动,进行按元素相乘并求和,得到输出张量。
- 输出张量的大小由输入张量和卷积核的大小决定。
卷积层
- 卷积层对输入和卷积核权重进行互相关运算,并添加偏置后产生输出。
- 卷积层中的两个可训练参数是卷积核权重和标量偏置。
图像中目标的边缘检测
- 通过卷积核检测图像中的边缘,如黑白图像的水平边缘检测。
- 垂直边缘检测可以通过转置输入图像来实现。
卷积核
- 卷积核可以通过训练从数据中学习,而不必手动设计。
- 使用内置的二维卷积层,通过优化损失函数来更新卷积核的权重。
互相关和卷积
- 虽然卷积层实际执行的是互相关运算,但其输出不会受到运算方式的显著影响。
- 互相关运算和卷积运算之间存在严格的数学对应关系。
特征映射和感受野
- 卷积层的输出有时称为特征映射。
- 感受野指的是在前向传播期间可能影响计算的所有元素。
- 深层网络可以扩展感受野,以检测输入特征中更广的区域。
填充和步幅
填充
- 填充是指在输入图像边界填充元素(通常是0),以防止丢失边缘像素信息。
- 填充可以使输出的高度和宽度与输入相同。
- 常用的卷积核大小为奇数,可以保证填充后输入的对称性和简便性。
步幅
- 步幅是指卷积窗口每次滑动的元素数量。
- 增大步幅可以减少输出的高和宽,从而降低计算复杂度。
- 通常,步幅和填充设置为相同的数值,以保持输出的对称性。
填充和步幅的实际应用
- 填充和步幅可以有效地调整数据的维度,常用于控制输出的空间尺寸。
遇到的问题&解决办法
卷积核学习中的梯度更新
描述:
在学习卷积核权重时,如何有效地进行梯度更新是一个挑战,尤其是理解和实现梯度计算和更新步骤。
解决办法:
通过使用内置的二维卷积层(如PyTorch中的nn.Conv2d
),可以简化梯度计算和权重更新过程。学习过程中,使用了平方误差损失函数,通过反向传播计算梯度,并迭代更新卷积核权重。
理解填充和步幅对输出大小的影响
描述:
在实际操作中,填充和步幅设置不当会导致输出尺寸不符合预期,难以预测每层卷积后的输出形状。
解决办法:
通过公式计算和实际编码练习,理解填充和步幅对输出大小的具体影响。掌握基本公式后,通过实践验证(如编写简单的卷积运算函数并测试不同的填充和步幅设置)加深理解。通过具体例子,如设置不同填充和步幅的卷积层,对比输出尺寸,进一步理解这些参数的影响。
卷积运算中的边缘信息丢失
描述:
多层卷积运算后,原始图像的边缘信息可能丢失,影响输出的特征提取效果。
解决办法:
通过使用填充技术,可以有效地保留边缘信息。在多层卷积网络中,适当的填充设置可以确保每一层的输出尺寸与输入相同,防止边缘信息丢失。通过实际例子(如在8x8输入图像上添加填充),验证填充效果,并理解填充在防止边缘信息丢失中的作用。
21 卷积层里的多输入多输出通道
多输入通道
- 概念:当输入数据包含多个通道时,卷积核需要有相同数量的输入通道,以便与输入数据进行有效的互相关运算。例如,对于RGB图像,卷积核需要有三个输入通道(红、绿、蓝)。
- 运算过程:对每个通道分别进行互相关运算,然后将结果相加,得到最终的二维输出。
多输出通道
- 概念:通过增加输出通道,可以提取更多的特征,从而提高模型的表达能力。每个输出通道对应一个独立的卷积核。
- 运算过程:每个输出通道的计算是独立的,通过对所有输入通道的卷积核进行互相关运算,然后将结果叠加在一起,得到多通道输出。
1x1卷积层
- 概念:1x1卷积层使用最小的窗口大小,通过在通道维度上的卷积运算,对输入的每个像素进行线性组合,从而实现跨通道的特征融合。
- 运算过程:对每个像素位置应用一个全连接层,将输入通道数转换为输出通道数。尽管窗口大小为1,1x1卷积层仍然可以在通道维度上实现复杂的特征转换。
遇到的问题&解决办法
多输入通道的卷积核设计
描述:理解多输入通道卷积核的构建和运算过程容易混淆每个通道之间的关系和计算步骤。
解决办法:通过具体示例和逐步讲解,深入理解多输入通道卷积核的运算过程。通过手动计算和验证结果,掌握每个通道的卷积计算和结果叠加的过程。
多输出通道的卷积核实现
描述:在实现多输出通道的卷积核时,容易出现维度不匹配或运算错误。
解决办法:仔细检查卷积核和输入数据的维度,确保每个输出通道的卷积核和输入数据具有相同的通道数。通过构造简单的测试数据,逐步调试和验证,确保运算结果正确。
1x1卷积层的理解和应用
描述:1x1卷积层的实际作用和计算过程较为抽象,不易理解其在通道维度上的特征融合。
解决办法:通过详细的理论讲解和具体的示例,深入理解1x1卷积层的计算过程。结合实际应用场景,理解其在调整通道数和跨通道特征融合中的重要作用。通过示例验证1x1卷积层的运算结果,理解其等效于全连接层的特性。
22 池化层(汇聚层)
最大汇聚层和平均汇聚层
- 概念:汇聚层用于逐渐降低隐藏表示的空间分辨率和聚集信息,减轻卷积层对位置的敏感性,增强模型对平移不变性的鲁棒性。
- 最大汇聚层(Maximum Pooling):在汇聚窗口内选择最大值作为输出。适用于保留显著特征。
- 平均汇聚层(Average Pooling):在汇聚窗口内计算平均值作为输出。适用于平滑特征。
填充和步幅
- 概念:填充和步幅可以改变汇聚层的输出形状。
- 填充(Padding):在输入周围添加额外的边界,以控制输出大小。
- 步幅(Stride):滑动窗口每次移动的步长,控制输出分辨率。
多个通道
- 概念:汇聚层在每个输入通道上单独运算,输出通道数与输入通道数相同。
遇到的问题&解决办法
汇聚层的操作细节理解
描述:理解汇聚层操作细节时,容易混淆最大值和平均值的计算过程。
解决办法:通过具体的示例和代码实现,逐步演示汇聚层的计算过程,理解每个位置的汇聚操作。
填充和步幅的应用
描述:在应用填充和步幅时,容易出现输出形状不符合预期的情况。
解决办法:详细了解填充和步幅的作用,结合示例代码,通过调试和验证,掌握如何通过填充和步幅调整输出形状。
多通道汇聚操作
描述:在处理多通道输入时,容易误认为汇聚层会跨通道操作。
解决办法:通过示例演示多通道汇聚操作,理解每个通道独立计算的原理,确保汇聚层的输出通道数与输入通道数相同。
23 经典卷积神经网络 LeNet
汇聚层(Pooling Layers)
- 定义与功能:汇聚层用于逐渐降低隐藏表示的空间分辨率,聚合信息,使每个神经元对其敏感的感受野(输入)更大。它能够实现全局表示学习,同时保留中间层的卷积特性,减轻卷积层对位置的敏感性。
- 类型:主要有最大汇聚层(Max Pooling)和平均汇聚层(Average Pooling),分别计算汇聚窗口中元素的最大值和平均值。
- 实现方法:通过固定形状的汇聚窗口在输入张量上滑动,计算每个位置的输出。
- 应用场景:用于特征检测和空间降采样,特别适合处理图像中的平移不变性问题。
卷积神经网络(LeNet)
- 结构与组成:LeNet由两个主要部分组成:卷积编码器和全连接层密集块。卷积编码器包含两个卷积层,而全连接层密集块由三个全连接层组成。
- 数据流与处理:输入图像通过卷积层、激活函数和汇聚层的处理,逐渐减少空间分辨率并增加通道数,最后通过全连接层输出分类结果。
- 实现方法:通过PyTorch的nn.Sequential模块,将卷积层、激活函数、汇聚层、全连接层连接起来,形成完整的LeNet模型。
- 训练与评估:使用Fashion-MNIST数据集进行训练和评估,展示了LeNet在处理手写数字识别任务中的高效性能。
遇到的问题&解决办法
理解汇聚层的概念
- 问题:刚开始学习时,理解汇聚层的作用和原理有些困难,特别是在卷积神经网络中的应用。
- 解决办法:通过阅读教材和参考资料,结合代码示例,逐步理解汇聚层的实现和功能。同时,通过实验不同的汇聚窗口大小和步幅,观察对输出结果的影响,进一步加深理解。
LeNet模型的实现
- 问题:在实现LeNet模型时,如何正确连接各个层并理解其数据流是一个挑战。
- 解决办法:仔细研究LeNet的结构图和代码示例,逐步实现每一层的功能,并通过打印每层输出的形状,检查模型的正确性。通过实验调整模型参数,如卷积核大小、步幅等,观察对模型性能的影响。
GPU加速训练
- 问题:在使用GPU加速训练时,遇到如何将数据和模型移动到GPU的问题。
- 解决办法:学习并应用PyTorch中将数据和模型移动到GPU的相关函数,如
.to(device)
方法。通过调整代码实现,使其能够在GPU上正确运行,提高训练速度。
24 深度卷积神经网络 AlexNet
深度卷积神经网络(AlexNet)的发展历史
- 早期卷积神经网络的局限性:LeNet虽然在小数据集上表现良好,但在大数据集上面临性能和可行性问题。当时的机器学习领域被支持向量机等传统方法主导。
- 特征提取的手工设计:传统机器学习方法依赖手工设计的特征提取算法,如SIFT、SURF和HOG等,而神经网络方法则提倡自动学习特征。
- 计算资源的限制:90年代和21世纪初期,计算资源(尤其是GPU)不足以支撑深度CNN的训练。随着NVIDIA等公司的GPU硬件发展,这一局面得以改变。
AlexNet的突破
- 数据的重要性:大规模数据集如ImageNet的出现,为深度学习提供了足够的训练数据,从而显著提高了模型性能。
- 硬件的发展:GPU硬件的发展大大加速了深度学习的训练过程。AlexNet通过在GPU上并行化计算,实现了显著的性能提升。
- 关键技术:AlexNet引入了一些关键技术,如ReLU激活函数、Dropout正则化和数据增强,这些技术在后来的深度学习模型中得到了广泛应用。
AlexNet的模型设计
- 结构:AlexNet比LeNet更深更宽,包含5个卷积层和3个全连接层。它使用较大的卷积窗口(11x11)和更多的卷积通道,以处理更高分辨率的图像。
- 激活函数:使用ReLU激活函数代替了传统的Sigmoid激活函数,使得训练过程更为高效。
- 正则化与数据增强:通过Dropout正则化和数据增强(如图像翻转、裁切和变色)来减少过拟合。
实验和实现
- 模型构建与训练:利用PyTorch构建AlexNet,并使用Fashion-MNIST数据集进行训练。虽然原版AlexNet用于ImageNet数据集,但通过调整图像分辨率,适配到较小的数据集上进行实验。
- 性能评估:模型在训练集和测试集上的表现良好,验证了AlexNet在图像分类任务中的有效性。
遇到的问题&解决办法
数据集处理
问题:Fashion-MNIST数据集的分辨率(28x28像素)远低于ImageNet数据集(224x224像素),直接应用AlexNet可能导致效果不佳。
解决办法:通过将Fashion-MNIST数据集的图像分辨率调整为224x224像素,使得AlexNet的输入尺寸符合预期。同时,利用d2l.load_data_fashion_mnist函数中的resize参数完成这一调整。
模型训练过程中的计算资源问题
问题:深度卷积神经网络的训练过程非常耗时,尤其是在较大的数据集和复杂的模型结构下,可能需要数小时或数天时间完成训练。
解决办法:在本次实验中使用较小的数据集(Fashion-MNIST)进行训练,并采用现代GPU进行加速。为了进一步提高效率,调整学习率和批量大小以适应实际的计算资源。
超参数调整
问题:模型训练过程中的超参数(如学习率、批量大小等)对最终的训练效果有很大影响,需要进行合理的调整。
解决办法:通过实验对比不同超参数设置的效果,选择合适的学习率和批量大小。在本次实验中,使用了较小的学习率(0.01)和适中的批量大小(128)进行训练,取得了较好的效果。
模型过拟合
问题:复杂的模型容易在训练数据上表现良好,但在测试数据上可能出现过拟合现象,导致泛化能力差。
解决办法:通过引入Dropout正则化和数据增强技术(如翻转、裁切和变色),有效减少过拟合,提升模型的泛化能力。在本次实验中,模型在测试集上的准确率接近训练集,表明过拟合问题得到了较好的控制。
25 使用块的网络 VGG
深度神经网络的设计启发
- 块设计理念:神经网络设计逐渐从单个神经元的角度,发展到整个层,再到现在的块设计。块设计使得网络架构更加模块化和可复用。
- VGG网络的贡献:VGG网络引入了通过重复卷积和汇聚层的组合来构建深层网络的概念。这种方法提供了一种简洁而有效的设计模式。
VGG块
- VGG块的结构:一个典型的VGG块包括一系列卷积层,每个卷积层后面跟一个ReLU激活函数,最后是一个最大池化层。卷积层的填充为1,保持输入和输出的分辨率相同,最大池化层的窗口大小为2,步幅为2,用于空间下采样。
VGG网络
- 网络结构:VGG网络由多个VGG块组成,最后连接几个全连接层。具体的结构由超参数
conv_arch
决定,例如VGG-11包含5个卷积块,前两个块各有一个卷积层,后三个块各包含两个卷积层。
训练VGG网络
- 数据准备:使用Fashion-MNIST数据集,调整图像大小为224x224。
- 训练设置:设置学习率、训练轮数和批量大小,并使用GPU加速训练。
遇到的问题&解决办法
计算资源不足:在训练完整的VGG-11网络时,计算资源(特别是GPU内存)不足,导致训练过程非常缓慢。
简化网络结构:为了适应计算资源的限制,将原始VGG网络的通道数减少,构建了一个简化版VGG网络。通过将每层的通道数除以一个比例因子(例如4),显著降低了计算量和内存占用。
调试代码复杂:由于VGG网络的层次较深,调试代码时很难迅速定位问题。
分段调试:将网络的各个模块分开调试,先验证每个模块的正确性,再将其组合到一起。这样可以更快地定位和解决问题。
过拟合:在训练过程中,网络在训练集上的表现明显优于测试集,存在过拟合现象。
增加正则化:使用Dropout层来减少过拟合,同时在训练过程中加入数据增强技术,提高模型的泛化能力。
26 网络中的网络 NiN
传统CNN的局限性
- 传统的卷积神经网络(如LeNet、AlexNet和VGG)通过卷积层与汇聚层提取特征,再通过全连接层进行分类。然而,这种设计可能会在网络前期丢失空间信息。
- 为了改进这一点,NiN提出了在每个像素位置应用多层感知机(MLP)的想法。
NiN块
- NiN块的结构:NiN块开始于一个标准的卷积层,然后是两个 (1 \times 1) 卷积层,后者充当带有ReLU激活函数的逐像素全连接层。第一个卷积层的卷积核大小由用户设定,随后的两个卷积层的卷积核固定为 (1 \times 1)。
NiN模型
- 网络结构:NiN使用多个NiN块,并在每个NiN块后面使用最大汇聚层,汇聚窗口为 (3 \times 3),步幅为2。最后一个NiN块输出通道数等于类别数量,并通过全局平均汇聚层生成对数几率(logits)。
- 取消全连接层:与传统CNN不同,NiN完全取消了全连接层,使用全局平均汇聚层代替。这显著减少了模型参数数量,降低了过拟合的风险。
训练NiN模型
- 数据准备:使用Fashion-MNIST数据集,调整图像大小为224x224。
- 训练设置:设置学习率、训练轮数和批量大小,并使用GPU加速训练。
训练结果
- 在Fashion-MNIST数据集上训练NiN模型,取得了不错的结果。训练准确率为78.6%,测试准确率为79.0%,达到了较高的性能。
遇到的问题&解决办法
高维数据处理:NiN引入了 (1 \times 1) 卷积层,在高维数据上操作,初期对这一概念的理解和实现存在困难。
分解理解复杂概念:通过将NiN块分解为更小的部分,逐步理解 (1 \times 1) 卷积的作用,并在实际代码中实现和验证。
训练时间长:由于网络结构复杂,训练时间较长,导致实验效率降低。
使用小规模数据集调试:在大规模数据集训练前,使用小规模数据集进行调试,以确保模型架构和实现的正确性,减少不必要的计算资源浪费。
模型过拟合:尽管NiN减少了全连接层,仍然存在一定的过拟合现象。
正则化和数据增强:在训练过程中使用Dropout和数据增强技术,进一步减少过拟合,提高模型的泛化能力。
27 含并行连结的网络 GoogLeNet / Inception V3
Inception块的特点
- 结构:由四条并行路径组成,分别使用1x1、3x3和5x5的卷积层以及3x3的最大汇聚层,最后在通道维度上进行连接。
- 优点:通过不同大小的卷积核组合,有效提取图像的不同特征,减少参数量,降低模型复杂度。
GoogLeNet模型架构
- 模块设计:包括5个主要模块,分别使用不同数量的Inception块。每个Inception块的通道数分配经过大量实验优化。
- 全局平均汇聚层:最终输出通过全局平均汇聚层减少维度,避免使用全连接层,降低过拟合风险。
实验结果
- Fashion-MNIST数据集:使用NiN和GoogLeNet分别在Fashion-MNIST数据集上进行训练和测试,展示了它们在小规模数据集上的应用效果。
遇到的问题&解决办法
训练过程中遇到的过拟合问题
- 数据增强:通过旋转、平移、缩放等方式增加训练数据的多样性,减少模型对训练数据的过拟合。
- 正则化方法:引入Dropout层,随机丢弃部分神经元,增加模型的泛化能力。
模型训练速度较慢
- 调整学习率:优化学习率,使模型在训练过程中更快收敛。
- 硬件加速:使用GPU进行加速计算,提高训练速度。
模型复杂度高,难以理解
- 模块化设计:将复杂模型分解为多个模块,每个模块独立设计和优化,便于理解和实现。
- 可视化工具:使用工具对模型结构进行可视化展示,帮助理解每个层的功能和数据流动。
05 刘淇 - 大规模自适应测试中的机器学习问题初探
大规模自适应测试中的机器学习问题初探
面向智能教育的大数据分析
自适应学习:智能教育的核心
智能教育中,自适应学习是关键,通过自然科学的范式研究自适应学习的理论方法与关键技术。
自适应学习的三个核心问题
-
学习者能力诊断
- 诊断学生的能力状态,面对复杂、动态多变的能力状态,如何精准诊断?
-
教学资源知识理解
- 对教学资源和知识进行解析和理解,面对庞大、模态多样的数据规模,如何统一解析?
-
学习策略生成
- 生成个性化的学习策略,如何根据动态学情和知识约束自动适配?
自适应测试背景
计算机化自适应测试 (Computerized Adaptive Testing, CAT)
目标: 高效诊断学生的能力
- 传统纸笔测试 vs. 计算机化自适应测试
- 传统测试:千人一测
- 自适应测试:千人千测
历史背景:
- 1905年,比奈智力测验体现自适应原则
- 1970年代,美国心理统计学家F. Lord提出自适应测试
- 1990年代,GRE考试中首次实施
- 2000年后,我国基础教育质量监测采用CAT技术
自适应测试流程
- 诊断模块
- 使用认知诊断模型 (Cognitive Diagnosis Model, CDM) 估计学生当前能力
- 题库及选题模块
- 根据当前能力估计选择下一道题目
诊断模块
项目反应理论 (Item Response Theory, IRT)
- 关键参数:
- 学生能力
- 试题区分度
- 试题难度
- 试题猜测度
题库模块
从人工标注到多模态题库的智能建设,包括图文识别、公式转写、试题切分、属性标注、难度预估、自动组卷、变形题生成、相似题检索等。
选题模块
目标: 自动选出最适合、最重要的题目给学生作答,以加速能力估计过程,减少需要作答的题目数量。
现有选题策略分类
-
基于信息量/不确定性
- Fisher 信息量
- Kullback-Leibler 信息量
-
基于主动学习
- 使用主动学习策略选择最有价值的无标签样本进行标注
-
基于强化学习
- 使用双层优化方法和强化学习策略优化选题过程
基于信息量的选题策略
- Fisher 信息量
- 衡量一个题目为能力估计带来的信息量,选择信息量最大的题目
- Kullback-Leibler 信息量
- 衡量题目对不同能力之间的区分度,选择KL信息量最大的题目
基于主动学习的选题策略
- 模型无关的选题策略 (MAAT)
- 利用模型期望变化 (Expected Model Change, EMC) 估计选题带来的能力估计变化量
- 使用主动学习方法,在未作答题目中选择信息量最大的题目进行作答
鲁棒能力估计方法
通过集成学习思想,融合多个诊断模型或估计值,提升模型的准确性和鲁棒性。
- 多面特征建模
- 每一轮生成多个能力估计值,利用其均值作为新的能力估计量,确保估计高准确性
- 渐进无偏性
- 估计量具备好的统计性能,满足渐进无偏性、有效性和一致性
实验与验证
- 真实学生数据实验
- 预测学生在测试集试题上的response,验证模型的准确性
- 仿真实验
- 在仿真过程中引入各种扰动,验证鲁棒性,如猜测因素和失误因素
总结
自适应测试结合了认知诊断模型和智能选题策略,通过多模态数据分析和机器学习方法,显著提升了教育测试的效率和准确性。未来的研究将继续探索更先进的模型和算法,以实现更加精准和个性化的教育评估。