当前位置: 首页 > news >正文

VLN视觉语言导航(3)——神经网络的构建和优化 2.3

这是课上做的笔记,因此很多记得比较急,之后会逐步完善,每节课的逻辑流程写在大纲部分。


预处理

预处理是指对原始数据进行清洗、规范化

数据集的多样化(Diversify your training dataset)——见识广

为了使深度学习模型能够有效地学习和泛化,训练数据集需要具有多样性和代表性。这意味着数据集中应该包含各种各样的例子和实例,这些例子和实例之间存在差异。通过这种方式,模型可以更好地理解和适应新数据或未见过的数据。

类别分布(Class distributions)——类平均

一个类别均衡的数据集比类别不平衡的数据集更具多样性。如果数据集中某一类别的样本数量远多于其他类别,这会导致模型偏向于预测多数类别,而忽视少数类别。例如,在医疗诊断中,如果数据集中健康样本远多于疾病样本,模型可能会更倾向于预测健康状态,从而导致漏诊率增加,产生严重后果。

为了解决类别不平衡问题,可以采用以下方法:

  • 重采样:通过增加少数类样本的数量或减少多数类样本的数量来平衡数据集。
  • 使用合成数据:生成新的少数类样本以增加其数量。
  • 数据清洗:去除重复项和异常值,确保数据质量。

归一化(Normalization)

归一化是一种将特征值缩放到0到1之间的过程。具体操作是先减去每个特征的最小值,然后除以该特征的范围(最大值减去最小值)。归一化适用于不同单位或尺度的特征,使其在相同的范围内进行比较和计算。

标准化(Standardization)

标准化则是将特征值转换为均值为0、方差为1的过程。具体操作是先减去每个特征的平均值,然后除以该特征的标准差。标准化有助于消除不同单位或尺度的影响,使模型更关注特征的相对重要性。此外,标准化还可以使优化过程更加容易和快速。

权重初始化(Weight Initialization)对神经网络激活统计量(Activation Statistics)的影响

初始化权值都是随机的,采用随机正态分布的方式。

对于tanh和sigmoid,权重的初始化

tanh与sigmoid的问题——不管你输入多大或多小,输出都被“压缩”到一个很小的范围里

W = 0.01 * np.random.randn(Din, Dout)
  • 权重是从标准正态分布中随机生成的
  • 然后乘以 0.01,变成非常小的数

为什么激活值趋于零就效果不好呢

1. 梯度消失问题

  • 当使用像Sigmoid或Tanh这样的激活函数时,如果输入的值很小(接近于0),那么输出的激活值也会非常接近于0或者-1到1之间的某个值。在这种情况下,激活函数的导数(即梯度)会变得非常小。
  • 在反向传播过程中,这些小的梯度会被逐层传递,并且每经过一层都会进一步缩小(因为它们与权重相乘)。
    (求导会乘以权重,权值很小因此梯度会消失,无法更新(更新量太小了))

2. 信息丢失

  • 如果所有激活值都接近于0,那么无论输入数据如何变化,神经元的响应几乎不变,这大大限制了网络区分不同输入的能力。
  • 第一层裁判都说“嗯……”(输出接近0),第二层裁判是根据第一层的“意见”来判断的。
    但第一层声音太小了,第二层听不清,只能也说:“嗯……好像差不多……”

权值乘以0.05(过大)

权值过大或过小都会导致进入tanhh和sigmoid函数的死去,这个区域的导数趋于0,导致信号反向传播根本无法有效更新(补偿太小),而且映射到下一层也集中于-1,1,而不是分布于-1到1之间。

Xavier/Glorot初始化——确保每一层的输入和输出具有相同的方差

Xavier/Glorot初始化:适用于Tanh和Sigmoid激活函数,该方法根据输入和输出单元的数量调整权重的方差,确保每一层的输入信号保持适当的尺度。

每一层的方差都近似。

对于Relu,权重的初始化

Relu有什么好处?

  1. 不会压缩正数!

    • 如果输入是 5,输出就是 5
    • 如果输入是 100,输出就是 100
    • 👉 声音不会被压小,信息可以“大声”传下去!
  2. 稀疏性 & 激活选择

    • 有些神经元输出 0(沉默),有些输出很大(喊话)
    • 👉 网络只对“重要特征”做出强烈反应,效率更高
  3. 解决梯度消失

    • 在正区间,ReLU 的梯度是 1(不变)
    • 反向传播时,梯度不会越传越小
    • 👉 网络能正常“学习改进”

Relu的问题

如果relu的输入是负数,那么输出就是0,那么导数也是0,那也无法进行反向传播更新

因此提出了leaky Relu和Exponential Linear Unit (ELU)或Swish

允许一部分负输出通过,使得负区间存在梯度,方便反向传播更新。

其中 α 是一个超参数。ELU不仅解决了死亡ReLU问题,还具有更好的统计特性

其中 σ(x) 是Sigmoid函数。Swish在许多任务中表现出色,并且不容易出现死亡神经元的问题。

Kaiming / MSRA 初始化:确保每一层的输入和输出具有相同的方差

假设输入是标准正态分布,经过 ReLU 后:

  • 一半数据是正的,保留
  • 一半是负的,变成 0
  • 所以输出的方差 ≈ 原始方差的一半

为了补偿这个“损失”,我们必须把权重的方差翻倍

前面推导过程和Xavier是一样的,只看最后一部分:

一言蔽之,权重初始化方案的本质目的就是让传话的音量不减少或过大。




内部协变量偏移

训练一个深层神经网络。每当你根据损失函数的梯度更新第一层的权重时,这将改变第一层输出的数据分布,进而改变了第二层的输入分布。然后,当你再次更新第二层的权重时,这一层的输出分布也会改变,继续影响到第三层的输入分布,依此类推。这就导致了所谓的“内部协变量偏移”。

如果不干预就会偏移到饱和区然后下一次就更新不了了。

批归一化

批归一化通过在每个小批次的数据上进行标准化处理(即调整均值至接近0,方差接近1),试图减少这种由于权重更新引起的数据分布变化。这样做可以带来几个好处:

  • 稳定层输入:通过保持每层输入数据分布的稳定性,减少了因为输入分布变化而导致的训练不稳定问题。
  • 加速训练:使得训练过程更加高效,允许使用更高的学习率。
  • 减轻对初始化的依赖:一定程度上减少了对权重初始化方法(如Xavier和Kaiming初始化)的依赖性。

上一层输出 → [BN: 标准化 → γ缩放 → β平移] → 激活函数 → 下一层
  • 标准化:是为了稳定训练,防止分布漂移、进入饱和区。
  • γ 和 β:是为了保留网络的表达能力
  • “我先把你规范好,防止你乱来;
    但我给你两个自由参数(γ, β),让你自己决定要不要、怎么偏离这个规范。”

为什么给与γ和β两个自由度就可以学习复杂的模式?

因此它能自动学习什么样的输入适合喂给下一层网络。




如何解决过拟合问题?——正则化技术

1. 过度依赖部分神经元怎么办——Dropout

为什么这么做?

想象一下你正在学习一项新技能,比如骑自行车。如果你总是依赖同一只手来保持平衡,那么另一只手就得不到锻炼,一旦那只常用的手受伤了,你就很难继续骑行。同样,在神经网络中,如果某些神经元总是起主导作用,导致模型过于依赖少数几个神经元,容易过拟合。

怎么做?

Dropout就是一种让神经网络中的某些神经元“休息”的方法。在训练过程中,它会随机地将一些神经元的输出设置为0(即“丢弃”这些神经元),这样做的概率由一个称为dropout rate的超参数决定。例如,如果dropout rate是0.5,那么每次前向传播时,每个神经元都有50%的概率被丢弃。

有什么好处?
  • 提高稳定性:通过随机丢弃神经元,迫使网络学会不依赖于任何特定的神经元或神经元组合,从而提高了模型的泛化能力。
  • 减少过拟合:由于每次迭代都使用不同的神经元子集进行训练,这相当于对多个较小的网络进行训练,然后将它们的结果平均起来,从而减少了过拟合的风险。
  • 简化计算:死神经元不用计算。

2. 样本过少怎么办——Data Augmentation

为什么这么做?

假设你要训练一个识别猫和狗的模型,但你的训练数据集中只有少量的猫和狗的照片。如果模型只看到这些有限的例子,它可能会记住具体的细节而不是学习到猫和狗的本质特征,导致在遇到新的、略有不同的猫和狗照片时表现不佳。这也是过拟合的问题。

怎么做?

Data Augmentation是一种通过变换原始数据来增加训练数据量的技术。对于图像数据,常见的变换包括翻转、旋转、裁剪、缩放、混叠(mixup)、添加噪声等。例如,你可以将一张猫的照片水平翻转、稍微旋转一下角度、裁剪出不同部分,甚至将两张图片混合在一起,生成新的训练样本。

有什么好处?
  • 增加多样性:通过引入各种变换,数据增强增加了训练数据的多样性,使模型能够看到更多样化的例子,从而更好地学习到类别的一般特征。
  • 提高泛化能力:模型在训练过程中接触到更多的变化,有助于其在面对新数据时做出更准确的预测,从而提高泛化能力。
  • 解决类别不平衡问题:在某些情况下,训练数据集中可能存在类别不平衡的问题,即某些类别的样本数量远少于其他类别。通过数据增强,可以为那些样本较少的类别生成额外的训练样本,从而改善模型在这类数据上的性能。

迁移学习——会骑自行车就会骑摩托车

怎么做?

转移学习的基本思想是利用一个已经在大量数据上训练好的模型作为起点,然后在这个基础上进行微调,以适应新的任务。这个预训练的模型通常是在一个大型、多样化的数据集上训练的,它学会了一些通用的特征表示。例如,在图像识别任务中,预训练模型可能是在ImageNet这样的大规模数据集上训练的,它能够识别各种物体的基本形状和纹理。

有什么好处?
  • 节省时间和计算资源:不需要从零开始训练一个新模型,可以大大减少训练时间和计算资源的消耗。
  • 提高性能:预训练模型已经学会了很多有用的特征,这些特征可以直接用于新任务,从而提高模型的性能。
  • 适用于小数据集:当新任务的数据集较小或标注成本较高时,转移学习可以帮助模型更好地泛化,避免过拟合。

什么时候用呢?

新数据集较小且与原数据集有相似特性

在这种情况下,你可以直接使用预训练模型提取的特征,并在其基础上训练一个简单的线性分类器。这是因为预训练模型已经很好地捕捉到了输入数据的基本特征,而新任务与原任务又有一定的相关性,所以只需要对最后的分类层进行调整即可。

大型且与原数据集相似的数据集

如果新数据集较大且与原数据集有相似特性,那么可以对整个预训练模型进行微调。这意味着不仅要更新最后一层的参数,还要更新前面各层的参数。由于数据集较大,有足够的信息来调整模型的各个部分,使其更好地适应新任务。

小型但与原数据集不同的数据集

当新数据集较小但与原数据集差异较大时,可以在预训练模型的某一层之前截断网络,并在此基础上训练一个新的线性分类器。这样做的原因是,尽管新任务与原任务差异较大,但预训练模型的前几层仍然能够提取一些通用的特征,这些特征对于新任务也是有用的。

大型且与原数据集差异较大的数据集

如果新数据集较大且与原数据集差异较大,那么可以考虑从头开始训练一个新的模型,或者使用预训练模型的权重作为初始化。在这种情况下,预训练模型的特征可能不太适用于新任务,但它的权重可以作为一个良好的起点,帮助新模型更快地收敛到最优解。

http://www.lryc.cn/news/625146.html

相关文章:

  • qsort函数使用及其模拟实现
  • Android Cutout(屏幕挖孔)详解
  • SpringBoot--Spring MVC 拦截器注入与 new 的区别
  • gdb的load命令和传给opeocd的monitor flash write_image erase命令的区别
  • 优秀开发者的重要认知能力无法被AI替代
  • 在win10/11下Node.js安装配置教程
  • Ai Agent 项目
  • 项目延期的主要原因分析,以及应对策略
  • 摔倒检测数据集:1w+图像,yolo标注
  • 深度学习-计算机视觉-微调 Fine-tune
  • 【完整源码+数据集+部署教程】织物缺陷检测系统源码和数据集:改进yolo11-RevCol
  • STL库——string(类函数学习)
  • steal tsoding‘s pastebeam code as go server
  • CMake指令:查找文件(find_file)、查找目录(find_path)、查找库文件(find_library)
  • npm设置了镜像 pnpm还需要设置镜像吗
  • Esp32基础(③旋转编码器)
  • wait / notify、单例模式
  • 在openEuler系统中如何查看文件夹下每个文件的大小
  • AVB(Android Verified Boot)中vbmeta结构浅析
  • C/C++ 中 str、str、*str 在指针语境下的具体含义(以 char* str 为例):
  • Android输入框文字不垂直居中
  • Linux下的软件编程——IPC机制
  • Java发送企业微信通知
  • Vue2篇——第五章 Vue.js 自定义指令与插槽核心
  • (第十八期)图像标签的三个常用属性:width、height、border
  • minio安装和配置
  • 【DL学习笔记】交叉熵损失函数详解
  • 之前说的要写的TCP高性能服务器,今天来了
  • 给linux的root磁盘扩容
  • Ansible 部署LNMP