65个机器学习面试问题 2024
机器学习和计算机视觉工程职位的技术面试问题集合。
最近新增:2024年自然语言处理(NLP)面试问题
准备资源
- 机器学习工程师面试课程
- 模拟机器学习面试:通过与顶级科技公司和初创公司的机器学习工程师进行练习,为下次面试做好准备。
- 统计学全书:统计推断简明教程 作者:Larry Wasserman
- 机器学习 作者:Tom Mitchell
- 设计机器学习系统:面向生产的迭代过程 作者:Chip Huyen
问题
1) 偏差和方差之间的权衡是什么?
如果我们的模型过于简单,参数很少,那么它可能会有高偏差和低方差。另一方面,如果我们的模型有大量参数,那么它会有高方差和低偏差。因此,我们需要在不过拟合和欠拟合数据的情况下找到正确/良好的平衡。
2) 什么是梯度下降?
梯度下降是一种优化算法,用于找到使成本函数(cost)最小化的函数(f)参数(系数)的值。
当参数无法通过分析方法(如线性代数)计算,必须通过优化算法搜索时,梯度下降最为适用。
3) 解释过拟合和欠拟合,以及如何解决这些问题?
机器学习/深度学习模型本质上是学习给定输入(称为训练特征)和目标输出(称为标签)之间的关系。无论学习到的关系(函数)质量如何,其在测试集(不同于训练输入的数据集合)上的表现都需要进行调查。
大多数机器学习/深度学习模型都有可训练参数,这些参数将被学习以建立输入-输出关系。根据每个模型的参数数量,可以将它们从更灵活(参数更多)到更不灵活(参数更少)进行排序。
当模型的灵活性(其参数数量)不足以捕捉训练数据集中的潜在模式时,就会出现欠拟合问题。另一方面,当模型对潜在模式过于灵活时,就会出现过拟合问题。在后一种情况下,人们说模型"记住了"训练数据。
欠拟合的一个例子是用一阶多项式(简单直线)来估计二阶多项式(二次函数)。同样,用10阶多项式来估计直线将是过拟合的一个例子。
4) 你如何对抗维度灾难?
- 特征选择(手动或通过统计方法)
- 主成分分析(PCA)
- 多维缩放
- 局部线性嵌入
5) 什么是正则化,我们为什么使用它,并给出一些常见方法的例子?
正则化是一种抑制学习更复杂或灵活模型的技术,以避免过拟合的风险。 例子:
- 岭回归(L2范数)
- Lasso回归(L1范数) 岭回归的明显缺点是模型可解释性。它会将最不重要的预测变量的系数缩小到接近零,但永远不会使它们完全为零。换句话说,最终模型将包括所有预测变量。然而,在Lasso回归的情况下,当调优参数λ足够大时,L1惩罚会强制某些系数估计恰好等于零。因此,Lasso方法也执行变量选择,被认为产生稀疏模型。
6) 解释主成分分析(PCA)?
主成分分析(PCA)是机器学习中用于降低数据集特征数量同时保留尽可能多信息的降维技术。它通过识别数据变化最大的方向(主成分),并将数据沿这些方向投影到低维子空间来实现。
7) 为什么ReLU在神经网络中比Sigmoid更好且更常用?
- 计算效率: 由于ReLU是一个简单的阈值,前向和后向传播将更快。
- 减少梯度消失的可能性: ReLU对于正值的梯度为1,对于负值的梯度为0,而Sigmoid激活函数在输入稍高或稍低时很快饱和(梯度接近0),导致梯度消失。
- 稀疏性: 当ReLU的输入为负时会产生稀疏性。这意味着较少的神经元被激活(稀疏激活),网络更轻量。
8) 给定(一维)CNN每层的步长S和核大小,创建一个函数来计算网络中特定节点的感受野。这只是找出实际连接到CNN中一个神经元的输入节点数量。
感受野是输入中用于生成输出的操作过程中定义的空间部分。
考虑大小为k的CNN滤波器,特定层的感受野只是滤波器使用的输入数量,在这种情况下为k,乘以不被卷积滤波器减少的输入维度a。这导致感受野为k*a。
更直观地说,在32x32x3大小的图像的情况下,使用5x5滤波器的CNN,相应的感受野将是滤波器大小5乘以输入体积的深度(RGB颜色),即颜色维度。这样就得到了5x5x3维的感受野。
9) 在图像/矩阵上实现连通组件。
10) 用C++实现稀疏矩阵类。
11) 创建一个函数来计算积分图像,并创建另一个函数从积分图像中获取区域和。
12) 在尝试从噪声样本中估计平面时,你如何去除异常值?
随机样本一致性(RANSAC)是一种迭代方法,用于从包含异常值的观测数据集中估计数学模型的参数,其中异常值不会对估计值产生影响。
13) 基于内容的图像检索(CBIR)是如何工作的?
基于内容的图像检索是使用图像来收集其内容元数据的概念。与当前基于图像关联关键词的检索方法相比,此技术通过计算机视觉技术生成元数据,提取在查询步骤中使用的相关信息。有多种可能的方法,从特征检测以检索关键词,到使用CNN提取密集特征,这些特征将与已知的关键词分布相关联。
使用后一种方法时,我们不太关注图像上显示的内容,而更关注已知图像生成的元数据与已知标签和/或标签列表在这个元数据空间中投影的相似性。
14) 图像配准是如何工作的?稀疏与密集光流等。
15) 描述卷积是如何工作的。如果输入是灰度图像与RGB图像,会有什么不同?什么决定了下一层的形状?
在卷积神经网络(CNN)中,卷积操作通过一个称为核或滤波器的小矩阵应用于输入图像。核以小步长(称为步幅)在图像上滑动,与图像的相应元素进行逐元素乘法,然后求和结果。这个操作的输出称为特征图。
当输入是RGB(或超过3个通道)时,滑动窗口将是一个滑动立方体。下一层的形状由核大小、核数量、步幅、填充和扩张决定。
16) 请详细说明如何从物体各个角度拍摄的图像和深度传感器测量创建物体的3D模型。
有两种流行的3D重建方法:
- 运动结构(SfM)
- 多视角立体视觉(MVS)
SfM更适合创建大型场景的模型,而MVS更适合创建小物体的模型。
17) 仅使用基本算术运算实现SQRT(const double & x),不使用任何特殊函数。
可以使用泰勒级数来近似sqrt(x):
18) 反转位串。
如果你使用Python 3:
data = b'\xAD\xDE\xDE\xC0'
my_data = bytearray(data)
my_data.reverse()
19) 尽可能高效地实现非极大值抑制。
非极大值抑制(NMS)是一种用于消除给定图像中同一物体多次检测的技术。 为了解决这个问题,首先根据边界框的分数进行排序(N LogN)。从分数最高的框开始,移除重叠度量(IoU)大于某个阈值的框(N^2)。
为了优化这个解决方案,你可以使用特殊的数据结构(如R树或KD树)来查询重叠的框(N LogN)。
20) 原地反转链表。
21) 什么是数据归一化,为什么我们需要它?
数据归一化是一个非常重要的预处理步骤,用于将值重新缩放到特定范围内,以确保在反向传播期间更好的收敛。通常,它归结为减去每个数据点的均值并除以其标准差。如果我们不这样做,那么一些特征(那些具有高幅度的特征)在代价函数中的权重会更大(如果一个高幅度特征变化1%,那么这个变化是相当大的,但对于较小的特征来说,这种变化并不显著)。数据归一化使所有特征的权重相等。
22) 为什么我们对图像使用卷积而不是全连接层?
首先,卷积保留、编码并实际使用图像的空间信息。如果我们只使用全连接层,我们就没有相对空间信息。其次,卷积神经网络(CNN)具有部分内置的平移不变性,因为每个卷积核都作为其自身的滤波器/特征检测器。
23) 是什么使CNN具有平移不变性?
如上所述,每个卷积核都作为其自身的滤波器/特征检测器。所以假设你在做物体检测,物体在图像中的位置并不重要,因为我们无论如何都会以滑动窗口的方式在整个图像上应用卷积。
24) 为什么在分类CNN中使用最大池化?
最大池化使你能够减少计算量,因为池化后的特征图更小。你不会损失太多语义信息,因为你取的是最大激活值。还有一种理论认为,最大池化在一定程度上为CNN提供了更多的平移不变性。
25) 为什么分割CNN通常具有编码器-解码器风格/结构?
编码器CNN基本上可以被认为是一个特征提取网络,而解码器使用这些信息通过"解码"特征并上采样到原始图像大小来预测图像分割。
26) 残差网络的重要性是什么?
残差连接的主要作用是允许直接访问前面层的特征。这使得信息在整个网络中的传播变得更加容易。一篇非常有趣的论文展示了使用局部跳跃连接如何给网络一种集成多路径结构,为特征提供多条路径在整个网络中传播。
27) 什么是批量归一化,它为什么有效?[来源]
训练深度神经网络的复杂性在于,由于前层参数的变化,每一层输入的分布在训练过程中会发生变化。因此,我们的想法是将每一层的输入归一化,使其具有零均值和单位标准差的输出激活。这是对每个层的每个小批量单独进行的,即计算该小批量的均值和方差,然后进行归一化。这类似于网络输入的标准化方式。这有什么帮助?我们知道规范化网络的输入有助于学习。但网络只是一系列层,其中一层的输出成为下一层的输入。这意味着我们可以将神经网络中的任何层视为较小的后续网络的第一层。从一系列相互馈送的神经网络的角度来看,我们在应用激活函数之前对一层的输出进行归一化,然后将其输入到下一层(子网络)。
28) 为什么要使用许多小的卷积核(如3x3)而不是几个大的卷积核?[来源]
这在VGGNet论文中有很好的解释。有两个原因:首先,你可以使用几个小核而不是几个大核来获得相同的感受野并捕获更多的空间上下文,但使用小核时使用的参数和计算量更少。其次,因为使用小核时你将使用更多的滤波器,你将能够使用更多的激活函数,从而学习到更具辨别性的映射函数。
29) 为什么我们需要验证集和测试集?它们之间有什么区别?[来源]
在训练模型时,我们将可用数据分为三个独立的集合:
- 训练数据集用于拟合模型的参数。然而,我们在训练集上获得的准确性并不可靠,无法预测模型在新样本上的准确性。
- 验证数据集用于衡量模型在训练数据集之外的样本上的表现。在验证数据上计算的指标可用于调整模型的超参数。然而,每次我们评估验证数据并根据这些分数做出决策时,我们都会将验证数据的信息泄露到我们的模型中。评估次数越多,泄露的信息就越多。因此,我们最终可能会过拟合验证数据,而验证分数再次无法可靠地预测模型在实际应用中的行为。
- 测试数据集用于衡量模型在以前未见过的样本上的表现。它应该只在我们使用验证集调整参数后使用一次。
因此,如果我们省略测试集而只使用验证集,验证分数将不能很好地估计模型的泛化能力。
30) 什么是分层交叉验证,我们什么时候应该使用它?[来源]
交叉验证是一种在训练集和验证集之间划分数据的技术。在典型的交叉验证中,这种划分是随机进行的。但在分层交叉验证中,划分保持了训练集和验证集中类别的比例。
例如,如果我们有一个数据集,其中A类占10%,B类占90%,并且我们使用分层交叉验证,我们将在训练集和验证集中保持相同的比例。相比之下,如果我们使用简单的交叉验证,在最坏的情况下,我们可能会发现验证集中没有A类的样本。
分层交叉验证可以应用于以下场景:
- 在具有多个类别的数据集上。数据集越小,类别越不平衡,使用分层交叉验证就越重要。
- 在具有不同分布数据的数据集上。例如,在自动驾驶的数据集中,我们可能有白天和夜间拍摄的图像。如果我们不确保这两种类型都存在于训练集和验证集中,我们将会遇到泛化问题。
31) 为什么集成通常比单个模型有更高的分数?[来源]
集成是将多个模型组合以创建单一预测的方法。制作更好预测的关键思想是模型应该犯不同的错误。这样,一个模型的错误将被其他模型的正确猜测所补偿,从而集成的分数将更高。
我们需要多样化的模型来创建集成。可以通过以下方式实现多样性:
- 使用不同的机器学习算法。例如,你可以结合逻辑回归、k近邻和决策树。
- 使用数据的不同子集进行训练。这被称为bagging。
- 给训练集的每个样本不同的权重。如果这是迭代进行的,根据集成的错误来加权样本,这被称为boosting。 许多数据科学竞赛的获胜解决方案都是集成。然而,在实际的机器学习项目中,工程师需要在执行时间和准确性之间找到平衡。
32) 什么是不平衡数据集?你能列举一些处理它的方法吗?[来源]
不平衡数据集是指目标类别比例不同的数据集。例如,一个需要检测某种疾病的医学图像数据集通常会有更多的负样本than正样本—比如说,98%的图像没有疾病,2%的图像有疾病。
有不同的选择来处理不平衡数据集:
- 过采样或欠采样。我们可以使用其他分布而不是从训练数据集中均匀采样,这样模型看到的就是一个更平衡的数据集。
- 数据增强。我们可以通过以受控方式修改现有数据来增加较少类别的数据。在示例数据集中,我们可以翻转有疾病的图像,或以疾病仍然可见的方式向图像副本添加噪声。
- 使用适当的指标。在示例数据集中,如果我们有一个总是做出负预测的模型,它将达到98%的精确度。还有其他指标,如精确率、召回率和F值,可以在使用不平衡数据集时更好地描述模型的准确性。
33) 你能解释一下监督学习、无监督学习和强化学习之间的差异吗?[来源]
在监督学习中,我们训练一个模型来学习输入数据和输出数据之间的关系。我们需要有标记的数据才能进行监督学习。
在无监督学习中,我们只有未标记的数据。模型学习数据的表示。当我们有大量未标记数据和少量标记数据时,无监督学习经常用于初始化模型参数。我们首先训练一个无监督模型,然后使用该模型的权重来训练监督模型。
在强化学习中,模型有一些输入数据和依赖于模型输出的奖励。模型学习一个最大化奖励的策略。强化学习已成功应用于战略游戏,如围棋,甚至经典的雅达利视频游戏。
34) 什么是数据增强?你能给一些例子吗?[来源]
数据增强是一种通过修改现有数据来合成新数据的技术,其方式是目标不变,或以已知方式改变。
计算机视觉是数据增强非常有用的领域之一。我们可以对图像进行许多修改:
- 调整大小
- 水平或垂直翻转
- 旋转
- 添加噪声
- 变形
- 修改颜色 每个问题都需要定制的数据增强流程。例如,在OCR中,进行翻转将改变文本并不会有益处;但是,调整大小和小角度旋转可能会有帮助。
35) 什么是图灵测试?[来源]
图灵测试是一种测试机器匹配人类智能水平能力的方法。使用一台机器来挑战人类智能,当它通过测试时,就被认为是智能的。然而,一台机器可能被视为智能,而不需要充分了解人类以模仿人类。
36) 什么是精确率?
精确率(也称为正预测值)是检索到的实例中相关实例的比例。 精确率 = 真正例 / (真正例 + 假正例) [来源]
37) 什么是召回率?
召回率(也称为敏感度)是已检索到的相关实例占相关实例总数的比例。 召回率 = 真正例 / (真正例 + 假负例) [来源]
38) 定义F1值。[来源]
它是精确率和召回率的加权平均值。它同时考虑了假正例和假负例。它用于衡量模型的性能。 F1值 = 2 * (精确率 * 召回率) / (精确率 + 召回率)
39) 什么是成本函数?
成本函数是一个标量函数,用于量化神经网络的误差因素。成本函数越低,神经网络的性能越好。例如:使用MNIST数据集来分类图像,输入图像是数字2,但神经网络错误地将其预测为3。
40) 列举不同的激活神经元或函数。
- 线性神经元
- 二元阈值神经元
- 随机二元神经元
- Sigmoid神经元
- Tanh函数
- 修正线性单元(ReLU)
41) 定义学习率。
学习率是一个超参数,用于控制我们根据损失梯度调整网络权重的程度。
42) 什么是动量(关于神经网络优化)?
动量让优化算法记住上一步的结果,并将其中的一部分添加到当前步骤中。这样,即使算法陷入平坦区域或小的局部最小值,也能摆脱并继续朝真正的最小值前进。
43) 批量梯度下降和随机梯度下降有什么区别?
批量梯度下降使用整个数据集计算梯度。这对于凸函数或相对平滑的误差流形很有效。在这种情况下,我们会直接朝最优解(局部或全局)移动。此外,给定一个退火学习率,批量梯度下降最终会找到其吸引盆地中的最小值。
随机梯度下降(SGD)使用单个样本计算梯度。SGD适用于具有许多局部最大值/最小值的误差流形。在这种情况下,使用较少样本计算的较为嘈杂的梯度往往会将模型从局部最小值推出,进入可能更优的区域。
44) 轮次(Epoch)、批次(Batch)和迭代(Iteration)的区别。
- 轮次:所有训练样本的一次前向传播和一次反向传播
- 批次:一次传递(前向和反向)中一起处理的样本
- 迭代:训练样本数 / 批次大小
45) 什么是梯度消失?
随着我们添加越来越多的隐藏层,反向传播在将信息传递到较低层时变得越来越不有效。实际上,当信息向后传递时,梯度开始消失,相对于网络权重变得很小。
46) 什么是dropout?
Dropout是防止神经网络过拟合的简单方法。它是指在神经网络中丢弃一些单元。这类似于自然繁殖过程,大自然通过结合不同的基因(丢弃其他基因)而不是加强它们的共适应来产生后代。
47) 定义LSTM。
长短期记忆(Long Short Term Memory)- 专门设计用于解决长期依赖问题,通过维护一个状态来决定记住什么和遗忘什么。
48) 列出LSTM的关键组件。
- 门(遗忘门、记忆门、更新门和读取门)
- tanh(x)(值在-1到1之间)
- Sigmoid(x)(值在0到1之间)
49) 列出RNN的变体。
- LSTM:长短期记忆
- GRU:门控循环单元
- 端到端网络
- 记忆网络
50) 什么是自编码器,列举几个应用。
自编码器基本上用于学习给定数据的压缩形式。几个应用包括:
- 数据去噪
- 降维
- 图像重建
- 图像着色
51) GAN的组成部分是什么?
- 生成器
- 判别器
52) 提升(boosting)和装袋(bagging)有什么区别?
提升和装袋都是集成技术,它们将多个弱学习器(分类器/回归器,其性能仅略优于随机猜测)结合(通过平均或最大投票)创建一个能够做出准确预测的强学习器。装袋意味着你对数据集进行有放回的bootstrap抽样,每个样本训练一个(可能是弱的)学习器。另一方面,提升使用所有数据来训练每个学习器,但被前面的学习器错误分类的实例会被赋予更高的权重,以便后续的学习器在训练时更加关注这些实例。
53) 解释ROC曲线的工作原理。
ROC曲线是一种图形表示,用于对比不同阈值下的真正例率和假正例率。它通常用作模型敏感性(真正例)与误报率或触发假警报概率(假正例)之间权衡的代理。
54) 第一类错误和第二类错误有什么区别?
第一类错误是假阳性,而第二类错误是假阴性。简而言之,第一类错误意味着声称发生了某事而实际上并没有发生,而第二类错误意味着你声称什么都没发生而实际上发生了某事。 一个巧妙的方式来理解这一点是,将第一类错误想象成告诉一个男人他怀孕了,而第二类错误是告诉一个怀孕的女人她没有怀孕。
55) 生成模型和判别模型有什么区别?
生成模型将学习数据的类别,而判别模型只会学习不同数据类别之间的区别。在分类任务中,判别模型通常会优于生成模型。
56) 基于实例的学习与基于模型的学习。
-
基于实例的学习:系统通过记住例子,然后使用相似度度量来泛化到新的案例。
-
基于模型的学习:从一组例子中泛化的另一种方法是构建这些例子的模型,然后使用该模型进行预测。这被称为基于模型的学习。
57) 何时使用标签编码(Label Encoding)和独热编码(One Hot Encoding)?
这个问题通常取决于你的数据集和你想应用的模型。但在选择正确的编码技术时,仍有几点需要注意:
我们使用独热编码当:
- 类别特征不是有序的(如上面提到的国家)
- 类别特征的数量较少,因此可以有效地应用独热编码
我们使用标签编码当:
- 类别特征是有序的(如幼儿园、小学、中学、高中)
- 类别的数量非常多,因为独热编码可能导致高内存消耗
58) LDA和PCA用于降维有什么区别?
LDA和PCA都是线性变换技术:LDA是有监督的,而PCA是无监督的 - PCA忽略类别标签。
我们可以将PCA想象为一种寻找最大方差方向的技术。与PCA相比,LDA试图找到一个最大化类别可分性的特征子空间。
59) 什么是t-SNE?
t-分布随机邻居嵌入(t-SNE)是一种无监督的非线性技术,主要用于数据探索和高维数据的可视化。简单来说,t-SNE可以让你对高维空间中数据的排列有一个感觉或直观认识。
60) t-SNE和PCA用于降维有什么区别?
首先需要注意的是,PCA是在1933年开发的,而t-SNE是在2008年开发的。自1933年以来,数据科学领域发生了巨大变化,主要体现在计算能力和数据规模方面。其次,PCA是一种线性降维技术,旨在最大化方差并保留大的成对距离。换句话说,不同的事物最终会相距很远。这在处理非线性流形结构时可能会导致较差的可视化效果。可以将流形结构理解为任何几何形状,如圆柱体、球体、曲线等。
t-SNE与PCA的不同之处在于,它只保留小的成对距离或局部相似性,而PCA关注保留大的成对距离以最大化方差。
61) 什么是UMAP?
UMAP(统一流形近似和投影)是一种新颖的用于降维的流形学习技术。UMAP基于黎曼几何和代数拓扑的理论框架构建。其结果是一种实用的可扩展算法,可应用于现实世界的数据。
62) t-SNE和UMAP在降维方面有什么区别?
与t-SNE相比,UMAP输出的最大区别在于局部结构和全局结构之间的平衡 - UMAP通常更善于在最终投影中保留全局结构。这意味着簇间关系可能比t-SNE更有意义。然而,重要的是要注意,由于UMAP和t-SNE在将高维数据投影到低维时都必然会扭曲数据的高维形状,低维中的任何给定轴或距离仍然不能像PCA等技术那样直接解释。
63) 随机数生成器是如何工作的,例如Python中的rand()函数?
它基于种子生成伪随机数,有一些著名的算法,请参阅以下链接获取更多相关信息。 [来源]
64) 假设我们想要在相同的数据上评估'n'个不同机器学习模型的性能,为什么以下划分机制是不正确的:
def get_splits():
df = pd.DataFrame(...)
rnd = np.random.rand(len(df))
train = df[ rnd < 0.8 ]
valid = df[ rnd >= 0.8 & rnd < 0.9 ]
test = df[ rnd >= 0.9 ]
return train, valid, test
#模型1
from sklearn.tree import DecisionTreeClassifier
train, valid, test = get_splits()
...
#模型2
from sklearn.linear_model import LogisticRegression
train, valid, test = get_splits()
...
rand()函数每次运行时都会对数据进行不同的排序,所以如果我们再次运行划分机制,我们得到的80%的行将与第一次运行时得到的不同。这带来了一个问题,因为我们需要在相同的测试集上比较我们模型的性能。为了确保可重现和一致的采样,我们必须提前设置随机种子或在数据划分后存储数据。另外,我们也可以简单地设置sklearn的train_test_split()函数中的'random_state'参数,以便在不同的执行中获得相同的训练、验证和测试集。
65) 贝叶斯统计与频率主义统计有什么区别?[来源]
频率主义统计是一个框架,专注于使用样本统计量估计总体参数,并提供点估计和置信区间。
另一方面,贝叶斯统计是一个使用先验知识和信息来更新对参数或假设的信念的框架,并为参数提供概率分布。
主要区别在于贝叶斯统计将先验知识和信念纳入分析,而频率主义统计则不会。
66) LSTM和Transformers的基本区别是什么?[来源]
LSTM(长短期记忆)模型由RNN单元组成,旨在更有效地跨时间步长存储和操作信息。相比之下,Transformer模型包含一堆编码器和解码器层,每层由自注意力和前馈神经网络组件组成。
66) 什么是RCNN?[来源]
循环卷积模型是一种专门设计用于使用图像序列(更常见的也称为视频)进行预测的模型。这些模型用于计算机视觉中的目标检测任务。RCNN方法结合了区域提议技术和卷积神经网络(CNN),以识别和定位图像中的对象。
贡献
欢迎贡献。
- 复刻仓库。
- 提交你的问题或答案。
- 开放拉取请求。