AI基础知识
基础模型与训练
- Layer Normalization和Batch Normalization的区别是什么?
Batch顾名思义是对一个batch进行操作。假设我们有10行3列的数据,即我们的batchsize = 10,每一行数据有三个特征,假设这三个特征是【身高、体重、年龄】。那么BN是针对每一列(特征)进行缩放,例如算出【身高】的均值与方差,再对身高这一列的10个数据进行缩放。体重和年龄同理。这是一种“列缩放”。而layer方向相反,它针对的是每一行进行缩放。即只看一笔数据,算出这笔所有特征的均值与方差再缩放。这是一种“行缩放”。为啥BN不适合NLP 是因为NLP模型训练里的每次输入的句子都是多个句子,并且长度不一,那么 针对每一句的缩放才更加合理,才能表达每个句子之间代表不同的语义表示,这样让模型更加能捕捉句子之间的上下语义关系。
- 平均池化和最大池化的应用场景?
当map中的信息都应该有所贡献的时候用avgpool,例如图像分割中常用global avgpool来获取全局上下文关系,再例如224*224图像分类将最后的7*7map进行avgpool而不是maxpool,是因为网络深层的高级语义信息一般来说都能帮助分类器分类。反之为了减少无用信息的影响时用maxpool,比如网络浅层常常见到maxpool,因为开始几层对图像而言包含较多的无关信息。另外avgpool与maxpool输出值会有不同的幅度区间,有些时候会遇到maxpool输出值幅度波动大,此时可以加一些归一化操作。
- 标准化与归一化的区别是?
标准化是一种最为常见的量纲化处理方式。其计算公式为:(X-Mean)/ Std。让数据的平均值变成0,标准差变为1。归一化的目的是让数据压缩在[0,1]范围内,其中也包括0和1;其计算公式为(X - Min)/ (Max - Min)。
一般情况下,如果对输出结果范围有要求,用归一化。如果数据较为稳定,不存在极端的最大最小值,用归一化。如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。机器学习中,标准化是更常用的手段,归一化的应用场景是有限的。标准化更好保持了样本间距。当样本中有异常点时,归一化有可能将正常的样本“挤”到一起去。比如三个样本,某个特征的值为1,2,10000,假设10000这个值是异常值,用归一化的方法后,正常的1,2就会被“挤”到一起去。如果不幸的是1和2的分类标签还是相反的,那么,当我们用梯度下降来做分类模型训练时,模型会需要更长的时间收敛,因为将样本分开需要更大的努力!而标准化在这方面就做得很好,至少它不会将样本“挤到一起”。标准化更符合统计学假设。对一个数值特征来说,很大可能它是服从正态分布的。标准化其实是基于这个隐含假设,只不过是略施小技,将这个正态分布调整为均值为0,方差为1的标准正态分布而已。
- 什么是L1、L2正则化?分别有什么应用场景?
L1正则的规范化目标是造成参数的稀疏化,就是争取达到让大量参数值取得0值的效果,而L2正则的规范化目标是有效减小原始参数值的大小。
- 如果学习率设置得太低或太高会发生什么?
当学习率太低时,模型的训练将进展得非常缓慢,因为只对权重进行最小的更新。它需要多次更新才能达到最小值。如果非常小可能最终的梯度可能不会跳出局部最小值,导致训练的结果并不是最优解。如果学习率设置得太高,由于权重的急剧更新,这将导致损失函数出现不希望的发散行为。可能导致模型无法收敛,甚至发散(网络无法训练)。
- 如何在网络中初始化权值?
一般情况下都使用随机初始化权值。不能将所有权重初始化为0,因为这将使您的模型类似于线性模型。所有的神经元和每一层都执行相同的操作,给出相同的输出,使深层网络无用。随机初始化所有权重通过将权重初始化为非常接近0的值来随机分配权重。由于每个神经元执行不同的计算,它使模型具有更好的准确性。
- 深度学习中Epoch、Batch和Iteration的区别是什么?
- Epoch —— 表示整个数据集的一次迭代(训练数据的所有内容)。
- Batch——指的是因为不能一次性将整个数据集传递给神经网络,所以我们将数据集分成几个批处理进行处理,每一批称为Batch。
- Iteration——如果我们有10,000张图像作为数据,Batch大小为200。那么一个Epoch 应该运行50次Iteration(10,000除以50)。
- 什么是残差连接?
残差连接的核心思想是引入一个“快捷连接”(shortcut connection)或“跳跃连接”(skip connection),允许数据绕过一些层直接传播。这样,网络中的一部分可以直接学习到输入与输出之间的残差(即差异),而不是直接学习到映射本身。具体来说,如果我们希望学习的目标映射是 H(x),我们让网络学习残差映射 F(x)=H(x)−x。因此,原始的目标映射可以表示为 F(x)+x。
- 什么是学习率调度器(Learning Rate Scheduler)?
学习率调度器用于动态地调整学习率。在训练深度学习模型时,通常需要随着训练的进行逐渐减小学习率,以避免过拟合,并提高模型的泛化能力。PyTorch提供了多种学习率调度器,如StepLR、ExponentialLR、CosineAnnealingLR等。这些调度器可以根据预定的策略调整学习率。
- 解释一下Batch_size的大小对模型训练的影响
在合理范围内,增大Batch_size的好处:
- 提高了内存利用率以及大矩阵乘法的并行化效率;
- 跑完一次epoch(全数据集)所需要的迭代次数减少,对相同的数据量,处理的速度比小的Batch_size要更快;
- 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
盲目增大Batch_size,Batch_size过大的坏处:
- 提高了内存利用率,但是内存容量可能撑不住;
- 跑完一次epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加,从而对参数的修正也就显得更加缓慢;
- Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化(会影响随机性的引入)。
attention
- attention是怎么输入一个序列输出一个序列的?
知乎:Vision Transformer 超详细解读 (原理分析+代码解读) (一)
- attention的qkv分别有什么作用?
q:to match others; k:to be matched; v:information to be extracted.
Q、K来自Transformer Encoder的输出,所以可以看做句子(Sequence)/图片(image)的内容信息(content,比如句意是:"我有一只猫",图片内容是:"有几辆车,几个人等等")。V表达了一种诉求:希望得到什么,可以看做引导信息(guide)。通过Multi-Head Self-attention结合在一起的过程就相当于是把我们需要的内容信息指导表达出来。
- self-attention layer相比RNN有什么优势?
主要:RNN和self-attention的本质区别是,RNN必须把最左边的输入存入Memory里面然后一路带到最右边才能被最后的输出考虑,有这种序列的信息;而对于Self-attention的每一个Vector对于所有的输入都是一视同仁的,产生这种“天涯若比邻“的效果。而且self-attention layer可以并行计算。另外,Self-Attention每一个Vector考虑了整个input sequence,而RNN只考虑了前面的Vecctor,但其实如果是双向的RNN的话,也可以认为RNN的每一个Vector考虑了全部的input sequence。
参考:RNN和self-attention的联系 论文:Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention 这篇论文就考虑了self-attention加上什么机制就变成了RNN。
- 为什么要使用多头注意力?
自注意力机制的缺陷就是:模型在对当前位置的信息进行编码时,会过度的将注意力集中于自身的位置,因此作者提出了通过多头注意力机制来解决这一问题。同时,使用多头注意力机制还能够给予注意力层的输出包含有不同子空间中的编码表示信息,从而增强模型的表达能力。而且从一组Multi-head Self-attention的解果来看,两组query和key分别更关注global的信息和local的信息。在论文中,作者使用了hh=8个并行的自注意力模块(8个头)来构建一个注意力层,并且对于每个自注意力模块都限定了dk=dv=dmodel/h=64。「从这里其实可以发现,论文中所使用的多头注意力机制其实就是将一个大的高维单头拆分成了h个多头」。
另外,多头注意力是否有降低噪声的用意?因为如果只进行一次,噪声可能较大,进行多次取均值则更稳定。
- 为什么Position embedding和text embedding是直接相加而不是concatenate?加起来以后表示位置的Position embedding不就混到text embedding里面去了吗?不就很难被找到以表示位置信息了吗?

- self-attention在处理图片时与CNN有什么联系和区别?
self-attention是一种复杂化的CNN,在做CNN的时候是只考虑感受野里面的资讯,而感受野的范围和大小是由人决定的。但是self-attention由attention找到相关的pixel,就好像是感受野的范围和大小是自动被学出来的,所以CNN可以看做是self-attention的特例。既然self-attention是更广义的CNN,则这个模型更加flexible。而我们认为,一个模型越flexible,训练它所需要的数据量就越多,所以在训练self-attention模型时就需要更多的数据,这一点在下面介绍的论文ViT中有印证,它需要的数据集是有3亿张图片的JFT-300,而如果不使用这么多数据而只使用ImageNet,则性能不如CNN。