Deep Learning

【三年面试五年模拟】算法工程师的求职面试秘籍

分类 Classification

将输入数据划分到预定义的有限标签中,输出为预测的类别标签

  • 常用评价指标

    • 准确率
    • 精确率
    • 召回率
    • F1 分数
  • 应用

    • 花卉图像分类
    • 垃圾邮件拦截

回归 Regression

建立数值型随机自变量的模型并进行连续的因变量预测,输出为数值

  • 常用评价指标
    • 均方误差
    • R2 分数
  • 应用
    • 股票价格预测
    • 房价预测

聚类 Clustering

将无标签的数据分成多个类(簇),确保类内样本相似,类间样本相异,其输出是聚类结果(簇划分,簇标签,簇中心等)

  • 常用评价指标
    • 样本紧密度
    • 样本分隔度
  • 应用
    • 用户分群
    • 异常检测

决策 Decision making

通过神经网络理解给定目标,约束条件和可用信息,预测出最佳或满意的动作决策,其输出是一连串的动作

  • 常用评价指标
    • 最终回报
    • 平均奖励
  • 应用
    • 游戏 AI
    • 自动驾驶

概率密度估计 Probability density estimation

使用深度神经网络来估计一个随机变量或一组随机变量的概率密度函数,其输出是数据的概率分布

  • 常用评价指标衡量分布差异
    • 对数似然损失
    • KL 散度
  • 应用
    • 数据生成
    • 样本采样

hpc

GPU 编程与性能优化

CUDA 与 cuDNN

GPU 编程基本原理

特别是如何使用 CUDA 进行并行计算,以及 cuDNN 库在加速深度学习中的应用

内存管理

核函数设计

性能监控与调优

性能优化

掌握一些基本的性能分析工具和方法,比如使用 nvprof 或 TensorFlow Profiler 分析模型运行瓶颈,并实施相应的优化措施。

Machine Learning

K-Nearest Neighbors(KNN)

KNN 算法是一种基本的监督学习方法,用于分类和回归问题。在分类问题中,KNN 算法通过测量不同特征值之间的距离,找出输入实例与训练数据集中最接近的 k 个样本,然后根据这 k 个邻居的类别来预测新实例的类别。对于回归问题,KNN 则是预测新实例的连续值输出。

基本步骤

  1. 选择 K 值

    K 值是算法中的一个超参数,表示考虑最近的邻居数量。选择 K 值时,较小的 K 值会使决策边界更加复杂,可能过拟合;较大的 K 值会简化决策边界,可能欠拟合。

  2. 计算距离

    对于每一个训练样本,计算其与待分类样本之间的距离。常见的距离度量有欧氏距离、曼哈顿距离等。

  3. 找到 K 个最近邻

    从计算出的距离中选出最小的 k 个,这 k 个样本即为待分类样本的最近邻。

  4. 预测类别或值

    对于分类任务,对这 k 个样本的类别进行投票,票数最多的类别作为预测结果。 对于回归任务,通常采用这 k 个样本的目标值的平均值或加权平均值作为预测结果。

优点

  • 算法简单直观,易于理解和实现。
  • 不需要假设数据分布,适用于非线性分类问题。
  • 可以处理多类问题。

缺点

  • 计算成本高,特别是在大数据集上,因为需要计算测试样本与所有训练样本之间的距离。
  • 需要选择合适的距离度量和 K 值。
  • 对于不平衡的数据集,少数类别的预测可能会受到影响。

支持向量机 Support Vector Machine(SVM)

是一种非常强大的监督学习模型,主要用于分类和回归分析。在分类问题中,SVM 寻找一个最优的超平面(在高维空间中可能是一条线、一个平面或一个超平面),该超平面能够最大化地将不同类别的数据分开。这个超平面被称为最大间隔超平面,而那些离超平面最近的训练样本点则被称为支持向量。

SVM 的核心思想在于找到一个决策边界,使得正负两类样本被尽可能远地分开,同时确保边界两侧的样本被正确分类。在非线性情况下,SVM 通过使用核函数(Kernel Function)将低维空间中的数据映射到高维空间,从而在高维空间中找到一个线性的决策边界。

多类分类问题解决策略(如 K 类)

  • 一对一(One-vs-One, OvO)

    在这种策略中,每一对类别都会进行一次二分类,这意味着总共需要训练 C(K, 2) = K(K-1)/2 个 SVM 模型。最终分类时,每个样本都会被 K(K-1)/2 个模型分类,然后根据多数投票原则决定最终类别。

  • 一对多(One-vs-All, OvA)

    也称为 One-vs-Rest。对于 K 类问题,需要训练 K 个 SVM 模型,每个模型区分一类样本和其他所有类别的样本。当分类新的样本时,每个模型都会给出一个决策,样本会被分配给具有最高置信度分值的那类。

  • 多分类 SVM

    这是一种直接将多类分类问题建模的方法,它试图一次性找到一个超平面矩阵来区分所有的 K 类。

  • 逐步二分类 DAGSVM

    Directed Acyclic Graph SVM 策略,这是一个专门设计用于多类分类的 SVM 变体,可以避免传统的投票机制。在逐步二分类(DAGSVM)策略中,构造了一个有向无环图(DAG),其中每个节点代表一个二分类器。DAG 的构建方式是从所有类别中选择两个类别进行比较,胜者(即被分类器认为更有可能的类别)继续与其他类别进行比较,直到确定最终的类别。这种方式确保了每个测试样本只需要通过一系列的二分类器,而不必经历所有可能的二分类器组合,从而避免了简单的多数投票机制。

svm 为什么要转成对偶问题进行求解,为什么对偶问题的解是原问题的解? svm 如何进行多分类,多分类 hinge loss 什么形式?

朴素贝叶斯分类器

朴素贝叶斯分类器是一种基于概率论的分类方法,尤其在文本分类、情感分析、垃圾邮件过滤等领域有着广泛的应用。它基于贝叶斯定理以及特征条件独立的假设,尽管这个假设在现实世界的数据中往往不成立,但朴素贝叶斯分类器在许多情况下仍然表现出良好的性能,尤其是在数据量较大时。

贝叶斯定理

朴素贝叶斯分类器的基础是贝叶斯定理,它描述了已知某些条件下,事件 A 发生的概率 P(A|B),可以用以下公式表示:

  • 先验概率 (Prior Probability) 先验概率是指在观察到任何数据或证据之前,基于以往知识或经验对某事件发生概率的估计。它是我们的“先验”信念,反映了我们对某个假设在没有任何新信息情况下的初始信心程度。例如,在投掷一枚硬币的情况下,如果我们没有任何关于这枚硬币是否公平的信息,我们可能会设定正反两面出现的概率都是 50%,这就是一种先验概率。

  • 后验概率 (Posterior Probability) 后验概率是指在观察到某些数据或证据之后,对事件发生概率的更新估计。它是根据先验概率以及新的观测数据,通过应用贝叶斯定理计算得出的。后验概率反映了我们对某个假设的新信念,这种信念是在考虑到所有可用信息后形成的。继续用硬币的例子,如果我们连续投掷硬币十次,其中有九次正面朝上,我们可能会调整我们对硬币公平性的信念,认为硬币可能是偏向正面的,此时我们对硬币偏向正面的概率的估计就是后验概率。

特征条件独立假设

朴素贝叶斯分类器假设所有特征在给定类别的情况下是相互独立的。这意味着,对于分类问题中的每个特征,其取值不会受到其它特征取值的影响,即使在实际中这种独立性可能并不存在。这一假设简化了计算,使得分类器的训练变得相对简单,同时也使得朴素贝叶斯分类器能够处理高维数据。

分类过程

朴素贝叶斯分类器的工作流程通常包括以下步骤:

  • 训练阶段:计算每个类别的先验概率以及每个特征在各类别下的条件概率。
  • 预测阶段:对于一个新的输入样本,计算其属于每个类别的后验概率,然后选择具有最大后验概率的类别作为预测结果。

优点

  • 算法简单,易于实现。
  • 训练速度快,所需的计算资源较少。
  • 在特征条件独立假设下,可以处理高维数据。

缺点

  • 条件独立假设在实际应用中往往是不成立的,这可能会影响分类器的准确性。
  • 对于从未在训练数据中出现过的特征值,朴素贝叶斯分类器会给出 0 的概率,这可能导致分类失败。为了避免这种情况,通常会采用平滑技术,如拉普拉斯平滑。

独立成分分析(ICA)

独立成分分析是一种统计和计算技术,用于估计一组随机变量的潜在因素或成分,这些成分被认为是相互独立的。ICA 的目标是找到一组变换,将混合的观测信号分解成独立的源信号。与主成分分析不同,ICA 关注的是信号的统计独立性,而非方差最大化。ICA 在信号分离、盲源分离等领域有广泛应用。

数据降维

奇异值分解(SVD)

异值分解是一种矩阵分解技术,广泛应用于信号处理、数据压缩、模式识别等多个领域。对于任意一个矩阵 A(m×n),SVD 将其分解为三个矩阵的乘积:UΣV^T,其中 U 是 m×m 的正交矩阵,Σ 是 m×n 的对角矩阵,其对角线上的元素是 A 的奇异值(通常是降序排列的非负实数),V 是 n×n 的正交矩阵。SVD 在数据分析中常用于提取矩阵的主要成分,如降维、数据压缩、特征提取等。

主成分分析(PCA)

主成分分析是一种常用的统计方法,用于识别数据中的模式和结构。PCA 通过正交变换将可能相关的变量转换为一组线性不相关的变量,称为主成分。主成分是原变量的线性组合,第一个主成分具有数据的最大方差,第二个主成分具有次大方差,同时与第一个主成分正交,以此类推。PCA 常用于降维、数据可视化和噪声消除。

线性判别分析(Linear Discriminant Analysis, LDA)

是一种常用的数据分析和分类技术,最初由 R.A. Fisher 提出,因此有时也被称作 Fisher 判别分析。LDA 主要用于寻找最佳的低维空间投影,使得不同类别的样本在该空间中的分离度最大化,同时保持同类样本之间的紧凑性。LDA 经常被用于降维和分类任务,特别是在监督学习的场景下。

LDA 的主要目标

LDA 的主要目标是找到一个投影,使得投影后的数据在不同类别间具有最大的可区分性,同时在同一类别内具有最小的差异性。具体而言,LDA 试图最大化类间散度和最小化类内散度,以此来增强分类效果。

LDA 的步骤

计算类内散度矩阵 Sw 和类间散度矩阵 Sb: 类内散度矩阵 Sw 反映了同一类别内部样本之间的变异程度。 类间散度矩阵 Sb 则反映了不同类别之间中心点的变异程度。 求解特征向量和特征值: 通过求解 Sw 和 Sb 的广义特征值问题,找到能最大化类间差异的投影方向。 选择投影方向: 选择前 k 个最大的特征值对应的特征向量作为投影方向,其中 k 是希望得到的降维后的特征数量。 投影数据: 将原始数据投影到找到的投影方向上,得到降维后的数据。 分类: 降维后的数据可以使用各种分类器进行分类,如线性分类器。

LDA 的应用

LDA 在多个领域都有广泛应用,包括但不限于:

人脸识别:LDA 可以用于提取人脸图像的重要特征,从而在低维空间中进行人脸识别。 生物信息学:在基因表达数据的分析中,LDA 可以帮助识别不同疾病状态的基因表达模式。 市场细分:在市场营销中,LDA 可以用来识别消费者群体的不同特征,帮助进行市场细分。 医学诊断:LDA 可用于诊断疾病,通过分析患者数据来区分健康个体和患病个体。

LDA 与主成分分析(PCA)

方法类似,但 PCA 是一种无监督的降维方法,而 LDA 是有监督的,它利用了类标签信息,这使得 LDA 在分类任务中通常能提供更好的性能。然而,LDA 也有其局限性,比如它假设数据服从高斯分布,且不同类别的协方差矩阵相等,这在某些情况下可能不成立。

拉普拉斯特征映射(Laplacian Eigenmaps)

是一种非线性降维技术,由 Belkin 和 Niyogi 在 2003 年提出,主要用于在保持数据局部结构的同时,将高维数据嵌入到低维空间中。Laplacian Eigenmaps 的核心思想是利用数据点之间的相似性来构建一个图,然后在图上找到最优的低维表示,这种表示能够尽可能地保持原数据点间的局部距离不变。

拉普拉斯特征映射的基本步骤:

构建邻接矩阵:首先,为数据集中的每个点 i 找到其最近的 k 个邻居,然后构建邻接矩阵 W,其中 W(i,j) > 0 如果点 j 是点 i 的邻居,否则 W(i,j) = 0。W(i,j)的具体值可以是点 i 和点 j 之间的相似性度量,比如高斯核函数。 构建度矩阵:度矩阵 D 是一个对角矩阵,其中 D(i,i)等于第 i 个点的度,即邻接矩阵 W 中第 i 行元素之和。 构建拉普拉斯矩阵:拉普拉斯矩阵 L 定义为 L = D - W。这是图拉普拉斯算子的一种形式,它捕获了图的连通性和拓扑性质。 求解特征值问题:寻找拉普拉斯矩阵 L 的特征向量和特征值。最小的几个非零特征值对应的特征向量提供了数据点在低维空间中的坐标。 数据点的低维表示:将数据点映射到低维空间中,使用最小的几个非零特征值对应的特征向量作为坐标轴。这些特征向量捕捉了数据集的内在几何结构,使得数据点在低维空间中的相对位置保持了它们在高维空间中的局部关系。 应用场景: 数据可视化:Laplacian Eigenmaps 可以用于将高维数据可视化,通过降维将数据投影到二维或三维空间,以便于人类观察和理解。 聚类分析:通过在低维嵌入空间中应用聚类算法,可以发现数据的潜在结构和簇。 图像处理:在图像分析和识别中,可以利用 Laplacian Eigenmaps 来提取图像的关键特征。

与其它降维技术的对比:

与 PCA(主成分分析)相比,Laplacian Eigenmaps 更关注数据的局部结构,而 PCA 则关注全局的方差最大化。PCA 是一种线性降维技术,而 Laplacian Eigenmaps 能够处理非线性数据集,这对于复杂数据结构特别有用。

总的来说,Laplacian Eigenmaps 是一种强有力的非线性降维工具,特别适用于保持数据的局部连通性和拓扑结构,使其成为分析高维数据集的有效手段。

LLE

KPCA

ISOMAP

决策树(Decision Trees)

决策树是一种用于分类和回归的机器学习算法。它通过构建一棵树形结构,其中内部节点表示特征上的测试,分支表示测试结果,而叶子节点表示类别或数值。决策树通过递归地分割数据集,每次分割都选择最优的特征和分割点,以最大程度地减少不纯度(如基尼不纯度或熵)。决策树易于理解和解释,可以处理数值和分类数据,但容易过拟合,通常需要剪枝技术来控制复杂度。

决策树对连续值和离散值特征是否会重复利用作为分割特征?

ID3 算法的局限性

只处理离散属性:ID3 算法只能处理离散属性,无法直接处理连续属性。 信息增益偏好:ID3 使用信息增益作为分裂标准,这导致它偏好具有更多值的属性,即使这些属性可能并不提供更多的分类信息。 缺失值处理:ID3 算法没有提供处理缺失值的有效机制。 过拟合问题:ID3 算法容易过拟合,因为它总是尽可能深地生长树,直到所有叶子节点都是纯的。

C4.5 的改进

处理连续属性:C4.5 可以处理连续属性,通过寻找最佳的切分点将连续属性转化为二元离散属性。 使用增益率:C4.5 使用增益率(Gain Ratio)代替信息增益作为分裂属性的选择标准。增益率考虑了信息增益与属性的熵的比率,从而避免了信息增益偏好的问题。 处理缺失值:C4.5 提供了一种处理缺失值的方法,允许在不知道完整信息的情况下仍能进行分类。 剪枝策略:C4.5 引入了剪枝技术,以防止过拟合。它使用两种剪枝方法:悲观剪枝(使用一个用户定义的阈值来决定是否剪枝)和错误估计剪枝(基于树的错误率来决定是否剪枝)。 生成规则集:C4.5 不仅生成决策树,还可以从决策树中导出一套规则,这使得模型更容易被理解和解释。 处理多类分类:C4.5 可以很好地处理多类分类问题,而不仅仅是二分类。

CART 算法的特点:

二叉树结构:CART 生成的决策树是二叉树,每个非叶节点都有两个子节点,这使得树的结构更加简单,易于理解和实现。 变量选择:对于分类树,CART 使用基尼不纯度(Gini Impurity)作为特征选择的标准;对于回归树,则使用平方误差(Mean Squared Error)来评估分裂的质量。 可处理连续和离散变量:CART 能够自动处理连续和离散变量,对于连续变量,它会找到最佳的分割点来创建二元分裂。 缺失值处理:CART 提供了处理缺失值的策略,例如使用替代值或者通过预测缺失值的可能性来分配样本到不同的分支。 剪枝策略:CART 采用成本复杂性剪枝(Cost Complexity Pruning)来防止过拟合,这是一种后剪枝方法,通过在树的复杂性和拟合数据的误差之间寻找平衡点来简化决策树。

BP 神经网络(Backpropagation Neural Networks)

BP 神经网络是人工神经网络的一种,通过前向传播计算输出,再通过反向传播调整权重,以最小化网络输出与期望输出之间的误差。BP 算法使用梯度下降法更新权重,使网络能够学习复杂的非线性映射。神经网络可以处理大量输入和输出,具有很强的学习能力,但训练时间可能较长,且可能遇到局部最优解的问题。

随机森林(Random Forests)

随机森林是一种集成学习方法,通过构建多个决策树并将它们的预测结果进行投票来改进预测性能。随机森林在构建每棵树时,不仅随机选择样本,还随机选择特征,这样可以减少过拟合风险并提高模型的泛化能力。随机森林能够处理高维数据,对于异常值和缺失值具有较好的鲁棒性。

随机森林与 GBDT,解释、比较异同、哪种方法单棵决策树的深度更大?

判别式模型 vs 生成式模型

判别式模型(Discriminative Models)

直接学习输入特征和输出标签之间的映射关系,目标是最小化预测错误。例如,BP 神经网络、支持向量机都属于判别式模型的范畴,它们直接学习如何将输入映射到输出。

生成式模型(Generative Models)

试图学习数据和标签的联合分布,通常用于估计类条件概率。例如,朴素贝叶斯分类器就是一种生成式模型,它估计了给定类别的条件下特征的概率分布。

NLP

TF-IDF(Term Frequency-Inverse Document Frequency)

是一种用于信息检索和文本挖掘的统计方法,它评估一个词对一个文档集合或语料库中的某篇文档的重要程度。TF-IDF 由两部分组成:词频(TF)和逆文档频率(IDF)。词频是指一个词在文档中出现的频率,而逆文档频率则反映了一个词在整个文档集合中的罕见程度。

文本分类中,从含有兼类可分为多标签分类和单标签分类

距离算法

1. 欧几里得距离(Euclidean Distance)

欧几里得距离是最直观的距离度量方式,它计算的是两个点在多维空间中的直线距离。在二维空间中,如果点 A 的坐标是((x_1, y_1)),点 B 的坐标是((x_2, y_2)),那么它们之间的欧几里得距离为:

[ d_{AB} = ]

推广到 n 维空间,如果有两个 n 维向量( = (a_1, a_2, ..., a_n))和( = (b_1, b_2, ..., b_n)),它们之间的欧几里得距离为:

[ d*{AB} = ]

2. 曼哈顿距离(Manhattan Distance)

曼哈顿距离,也称为城市街区距离或 L1 距离,它衡量的是两点在坐标轴上的绝对距离之和。在 n 维空间中,两个向量()和()之间的曼哈顿距离为:

[ d*{AB} = ^{n}|a_i - b_i| ]

曼哈顿距离在网格布局或出租车行驶路径计算中很有用,因为它忽略了两点之间的直线距离,只考虑沿坐标轴方向的移动。

3. Canberra 距离

Canberra 距离是一种用于非负向量的度量,它在计算距离时考虑了分母,使得距离受向量元素值的影响更大。两个非负向量()和()之间的 Canberra 距离定义为:

[ d*{AB} = ^{n} ]

Canberra 距离在处理稀疏数据时特别有用,因为它可以更好地处理零值。

4. 切比雪夫距离(Chebyshev Distance)

切比雪夫距离,也称为棋盘距离或 L∞ 距离,它衡量的是两个点在任一坐标轴上的最大绝对差值。在 n 维空间中,两个向量()和()之间的切比雪夫距离为:

[ d*{AB} = (|a_i - b_i|) ]

切比雪夫距离在某些应用场景中特别有用,比如在国际象棋中计算棋子移动的最短步数。

每种距离度量都有其特点和适用场景,选择合适的距离算法对于数据的分析和建模至关重要。例如,欧几里得距离适用于测量连续空间中的相似性,而曼哈顿距离和切比雪夫距离可能在某些特殊的空间布局或数据结构中更有优势。

梯度算子

梯度算子是数字图像处理和计算机视觉领域中用于边缘检测和特征提取的重要工具。梯度算子能够突出图像中的边缘和纹理,通过计算图像像素强度的局部变化来检测边界。以下是几种常用的梯度算子模板:

1. Sobel 算子

Sobel 算子是使用最广泛的边缘检测算子之一,它通过计算图像在水平和垂直方向上的梯度来检测边缘。Sobel 算子由两个 3x3 的卷积核构成:

  • 水平方向梯度算子:

  • 垂直方向梯度算子:

Sobel 算子对图像进行卷积操作后,可以得到水平和垂直方向上的梯度分量,最后通过合并这两个分量来获得边缘强度。

2. Prewitt 算子

Prewitt 算子与 Sobel 算子类似,也使用两个 3x3 的卷积核来检测水平和垂直方向上的梯度,但 Prewitt 算子的权重分布较为均匀:

  • 水平方向梯度算子:

  • 垂直方向梯度算子:

3. Roberts 交叉算子

Roberts 交叉算子使用 2x2 的小型卷积核,可以快速计算图像的梯度:

  • 水平方向梯度算子:

  • 垂直方向梯度算子:

Roberts 算子对噪声敏感,但在计算速度上有优势。

4. Laplacian 算子

Laplacian 算子不是直接检测梯度,而是检测二阶导数,用于检测边缘的拐点。一个常用的 Laplacian 算子模板是:

5. LoG 算子

全称为 Laplacian of Gaussian 算子,是一种在图像处理和计算机视觉中用于边缘检测和特征提取的算法。LoG 算子结合了高斯平滑滤波器(Gaussian filter)和拉普拉斯算子(Laplacian operator),其主要目的是在抑制噪声的同时检测图像中的边缘和其他显著特征。

工作原理:

  1. 高斯平滑
    • 首先,LoG 算子使用高斯滤波器对图像进行平滑处理。高斯滤波器通过应用一个高斯分布的权重矩阵(核)来对每个像素及其邻域进行加权平均,从而减少图像中的高频噪声。
  2. 拉普拉斯算子
    • 接着,经过高斯平滑后的图像会被进一步应用拉普拉斯算子。拉普拉斯算子是一个二阶微分算子,它对图像的亮度变化进行二次导数计算,能够突出图像中的突变区域,如边缘。
  3. LoG 滤波器
    • 将上述两个步骤合在一起,LoG 算子实际上是计算高斯平滑后的图像的拉普拉斯变换。数学上,LoG 算子定义为高斯函数的拉普拉斯变换,表达式为: [ ^2 g(x,y,) = g(x,y,) + g(x,y,) ] 其中 (g(x,y,)) 是二维高斯函数,() 是标准差,决定了高斯核的宽度。

应用:

  • LoG 算子常被用于边缘检测和图像特征点检测,特别是在尺度空间理论中,它可以用来检测图像中的关键点,这些点可能对应于角点、边缘交叉点或其他重要的图像特征。

  • 由于 LoG 算子的输出可能包含大量的零过零点(zero-crossings),这些点被认为是潜在的边缘或特征位置。因此,在实际应用中,通常会对 LoG 响应进行阈值处理,只保留那些超过一定阈值的零过零点作为有效的特征点。

实现:

  • 在实践中,LoG 算子可以通过卷积操作实现,即将图像与预定义的 LoG 核进行卷积。LoG 核是高斯核和拉普拉斯算子的离散近似,其形状取决于选择的()值。

  • 为了简化计算,有时会先应用高斯核,再单独应用拉普拉斯算子,尽管这在数学上不完全等同于 LoG 算子,但可以达到类似的效果,这种方法被称为 DoG(Difference of Gaussians)算子,是 LoG 的一个近似版本,常用于尺度不变特征变换(SIFT)等算法中。

LoG 算子因其在抑制噪声和定位边缘及特征点方面的有效性,在图像处理领域有着广泛的应用。

色彩模型

是用来描述颜色的一种数学表示方法,它们按照不同的用途和目的对颜色进行分类和编码。你提到的色彩模型可以大致分为两大类:面向硬件设备的色彩模型和面向视觉感知的色彩模型。

面向硬件设备的彩色模型

这类模型主要用于设备的颜色表示,它们的设计是为了与特定类型的硬件或色彩再现过程兼容。

RGB 模型(Red, Green, Blue):

RGB 模型是基于加色法原理的色彩模型,通常用于显示设备如电视、电脑显示器和手机屏幕。在 RGB 模型中,红、绿、蓝三种颜色的光以不同的强度混合,可以产生广泛的色彩范围。

CMYK 模型(Cyan, Magenta, Yellow, Key/Black):

CMYK 模型是基于减色法原理的色彩模型,主要用于印刷行业。在印刷过程中,青色、洋红色、黄色和黑色油墨以不同比例混合,可以复制出各种色彩。

YCrCb 模型(Luminance/Chrominance):

YCrCb 模型是一种用于视频系统的色彩模型,其中 Y 代表亮度(Luminance),Cr 和 Cb 分别代表红色和蓝色的色差(Chrominance)。这种模型被用于数字电视和图像压缩中,如 JPEG 2000 和 H.26x 系列视频编码标准。

面向视觉感知的彩色模型

这类模型的设计更贴近人类视觉系统对颜色的感知方式,通常用于色彩管理和色彩选择界面。

HSI 模型(Hue, Saturation, Intensity):

HSI 模型将颜色分为色调(Hue)、饱和度(Saturation)和强度(Intensity)三个组成部分。色调描述了颜色的基本类型,饱和度表示颜色的纯度,强度则是颜色的亮度。

HSV 模型(Hue, Saturation, Value):

HSV 模型与 HSI 模型类似,但将强度(Intensity)替换为价值(Value)。价值表示颜色的明暗程度,而色调和饱和度的定义与 HSI 模型相同。

HSB 模型(Hue, Saturation, Brightness):

HSB 模型实际上与 HSV 模型是相同的,只是将“Value”称为“Brightness”。在某些软件中,如 Adobe Photoshop,使用 HSB 来表示 HSV 模型。

Computer Network

网络字节流

参考连接

  • 网络字节流是指网络传输时先后到达的字节
  • 网络字节序编码是大端序(高位在低地址)
    • 数值 0x01020304 在大端机器内存中地址排列为:[0x01,0x02,0x03,0x04]

HTTP

  • http 中的 get、post 区别,是怎么做的

图像数据集 Image Dataset

数据集建立

数据增强

  • AutoAugment:搜索最优图像处理操作组合

  • RandAugment:已有图像处理集合,确定操作次数 N 和操作幅度 M

  • 分类任务

    • Mixup:按比例混合图像和标签
    • Cutout:图像掩码
    • CutMix:图像掩码混合
  • 目标检测任务

    • Mosaic:图像合成
  • 语义分割任务

    • Copy-Paste:分割结果粘贴到另一张图

数据预处理

  • 数据增强

    旋转、平移、缩放、翻转、随机色调(H)、饱和度(S)、明度(V)调整、等

  • 数据归一化 Normalization

    • Min-Max 归一化
    • Z-Score 归一化
    • RobustScaler 归一化
  • One-Hot 编码

数据类别不平衡问题

  • 采样比例
  • 数据生成

数据结构 Data Structure

数组

  • 用连续内存存储数据
  • 读写操作复杂度 O(1)

字符串

  • 用连续内存存储字符

链表

  • 由指针把若干个节点连接成链状结构

  • 节点之间用指针链接
  • 除根节点之外每个节点只有一个父节点,根节点没有父节点
  • 叶子节点没有子节点

二叉树

  • 每个节点最多只能有两个子节点

二叉搜索树

  • 若其左子树不为NULL,则左子树上所有节点的值都根节点的值
  • 若其右子树不为NULL,则右子树上所有节点的值都根节点的值
  • 其左右子树也分别是二叉搜索树
  • 查询复杂度

  • 最大堆:根节点的值最大
  • 最小堆:根节点的值最小

  • 先进后出

队列

  • 先进先出

多线程

异常处理

算法

排序

算法 时间复杂度 稳定性
冒泡排序
选择排序 ×
归并排序
快速排序 ×
堆排序 ×

查找

  • 二分查找

动态规划

计算机视觉 Computer Vision

【三年面试五年模拟】算法工程师的求职面试秘籍 > 从 ReLU 到 GELU,一文概览神经网络的激活函数

  • https://github.com/DWCTOD/interview/blob/master/detail/%E4%BD%9C%E4%B8%9A%E5%B8%AE%20%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E5%B7%A5%E7%A8%8B%E5%B8%88%20%E9%9D%A2%E7%BB%8F%EF%BC%882020%E5%B1%8A%EF%BC%89.md

  • https://github.com/GYee/CV_interviews_Q-A

图像处理与计算机视觉基础

基本概念

原理

图像预处理

特征提取

对象检测

图像分类

图像分割

OpenCV 库

读写图像

图像滤波

几何变换

特征检测与描述

深度学习基础

梯度下降

滑动平均

模型微调(Fine-tuning)

基础模块

池化层 Pooling Layer

归一化层 Normalization Layer

  • BN,Batch Normalization
  • IN,Instance Normalization
  • LN,Layer Normalization
  • GN,Group Normalization

BN 是怎么做,作用是什么

激活层

  1. 常见激活函数

    • Sigmoid
    • Tanh
    • ReLU
    • LeakyReLU
    • SoftPlus
    • ELU
    • SELU,自归一化
    • Swish,类 Sigmoid 作为开关
    • GELU
    • GLU
  2. 特性

    • 梯度消失 存在偏导过小
    • 梯度爆炸 偏导累乘过大
    • 梯度裁剪
    • 输出均值为 0 能避免每次权重只能往单一反向变化
    • ReLU 计算复杂度低
    • ReLU 的负半轴为输出值增加稀疏性,减少计算量,但同时会让一些神经元不能更新
    • SoftPlus,ReLU 的平滑

全连接层 Linear

嵌入层 Embedding

卷积层 Convolution

  • 特征

    • 局部感知、权值共享、平移不变、多核
  • 1×1 卷积

    • 特征增强
    • 特征融合
    • 改变通道数
    • 分类
  • 空洞卷积

  • 分组卷积

转置卷积层 Transpose Convolution

优化模块

残差结构 Residual Connection

将输入与层输出相加

  • 优势

    • 缓解梯度消失,增加网络深度
    • 保留信息,特征重用

空间金字塔池化(Spatial Pyramid Pooling,SPP)

空洞空间金字塔池化(Atrous Spatial Pyramid Pooling,ASPP)

HDC

可变形卷积 Deformable Convolution

可分离卷积 Separable Convolution

Transformer

  • 模块结构

    • 多头自注意力机制(Multi-Head Self-Attention Mechanism)
    • 前馈神经网络(Feed-Forward Neural Network)
    • 层归一化(Layer Normalization)
    • 残差连接(Residual Connections)
  • Self-Attention

  • 除以的原因

    • 矩阵计算导致的元素值整体偏大,从而引发梯度消失
    • 计算后的数据平方差为,除以,将分布的方差纠正回接近 1
  • 并行化的体现

    • 序列计算多头注意力
  • 影响计算量的因素

    • 序列长度:点积、矩阵乘
    • 头数量
  • 优势

    • 并行处理整个序列
    • 长距离依赖
  • 缺点

    • 计算量大
    • 超参调优
    • 超长序列处理能力

Cross-Attention

Convolutional Attention

  • SENet -CBAM

基础模型

前馈神经网络

卷积神经网络(CNN)

循环神经网络(RNN)

长短时记忆网络(LSTM)

Inception

模型调优

模型优化

正则化

  • L1 正则化
  • L2 正则化

损失函数

已知 softmax 输出概率序列与实际分布概率序列,计算两者交叉熵

超参数调整

在深度学习中,超参数(Hyperparameters)是指在训练开始前设置的模型参数,不是通过训练学习得到的。超参数的选择对模型性能有很大的影响,不同的超参数设置可能导致显著不同的训练结果。

优化器选择

  • SGD
  • AdaGrad
  • RMSProp
  • Adam

学习率衰减

LR 中的连续值特征是如何处理的 为什么 LR 要先对数据进行归一化处理 LR 用了 sigmoid 函数,那么 LR 是线性模型还是非线性模型,为什么

  • 线性
  • 分段
  • 余弦
  • WarmUp
  • 周期性

缩放法则 Scaling-Law

在 AI 领域中,描述模型性能如何随着模型规模(如参数数量、训练数据量、计算资源等)变化而变化的一组经验法则

  • 应用

    1. 设计更大规模的模型

      指导研究人员如何设计和训练更大规模的模型,以实现更高的性能

    2. 优化资源分配

      如确定是否应增加模型参数数量、增加训练数据量,还是增加计算资源,以实现最优的性能提升

    3. 预测性能

      根据现有模型的性能和缩放法则,可以预测更大规模模型的性能

常见模型评估指标

准确率

召回率

F1 分数

浮点数运算次数 FLOPs

帧每秒 FPS

深度学习框架

训练范式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 加载数据
dataloader = DataLoader()

# 加载模型
model = MyModel()

# 损失函数
criterion = nn.CrossEntropyLoss()

# 优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 学习率衰减策略

# 训练num_epochs
for epoch in range(num_epochs):
# 遍历完整数据集
for inputs, labels in dataloader:
# 梯度置零
optimizer.zero_grad()
# 模型推理
outputs = model(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 累加梯度
loss.backward()
# 梯度更新
optimizer.step()

评估范式

1
2
3
4
5
6
7
# 设置模型评估模式
model.eval()
# 取消梯度更新
with torch.no_grad():
for inputs, labels in test_dataloader:
outputs = model(inputs)
# 计算准确率或其他指标

PyTorch

Tensor

  • 存储

    • 头信息区(Tensor):tensor 的形状(size)、步长(stride)、数据类型(type)等
    • 存储区(Storage):数据
  • stride 属性

    指定维度中一个元素到下一个元素的步长

  • 维度变换

    类型 方法 描述
    维度顺序 permute 指定维度重排,返回共享存储区的 tensor
    transpose 交换维度,返回共享存储区的 tensor
    形状变换 view 返回共享存储区 tensor,要求存储连续,否则调用 contiguous
    contiguous 开辟新的存储区构建连续 tensor
    reshape 若连续则返回原 tensor,否则创建新 tensor
    广播 broadcast_to
    冗余维度 squeeze 压缩维度
    unsqueeze 展开维度
    扩展维度 expand 扩展大小为 1 的维度
    repeat 按照指定维度重复 tensor
    展平维度 flatten
    ravel
    维度剪裁 narrow
    维度展开 unfold
  • 张量乘法

    方法 应用
    torch.matmul() 多维矩阵相乘
    torch.mm() 2 维矩阵相乘
    torch.bmm() 批矩阵相乘
    torch.dot() 点积
    torch.mv() 矩阵向量相乘
    torch.einsum() 复杂张量运算 torch.einsum('ij,jk->ik', a, b)
  • 张量合并与拆分

    • stack 扩展维度拼接
    • cat 根据维度拼接
    • split 按大小分
    • chunk 按块分

nn.Module

模块基类

nn.Sequential

线性模块容器

  • 计算图
  • 环境搭建
  • 数据加载
  • 模型定义
  • 训练
  • 验证
  • 保存
  • 加载模型

PytorchLightning

逻辑思维与项目经验

逻辑思维

准备通过解决实际问题来展示你的逻辑思维能力和数据分析洞察力,可以是以往项目中的案例分析。

团队合作与挑战接受度

思考并准备实例说明你如何在团队中有效沟通、协作解决问题,以及面对技术挑战时的态度和解决策略。

计算机视觉 Computer Vision

【三年面试五年模拟】算法工程师的求职面试秘籍 > 从 ReLU 到 GELU,一文概览神经网络的激活函数

  • https://github.com/DWCTOD/interview/blob/master/detail/%E4%BD%9C%E4%B8%9A%E5%B8%AE%20%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E5%B7%A5%E7%A8%8B%E5%B8%88%20%E9%9D%A2%E7%BB%8F%EF%BC%882020%E5%B1%8A%EF%BC%89.md

  • https://github.com/GYee/CV_interviews_Q-A

图像处理与计算机视觉基础

基本概念

原理

图像预处理

特征提取

对象检测

图像分类

图像分割

OpenCV 库

读写图像

图像滤波

几何变换

特征检测与描述

深度学习基础

梯度下降

滑动平均

模型微调(Fine-tuning)

基础模块

池化层 Pooling Layer

归一化层 Normalization Layer

  • BN,Batch Normalization
  • IN,Instance Normalization
  • LN,Layer Normalization
  • GN,Group Normalization

BN 是怎么做,作用是什么

激活层

  1. 常见激活函数

    • Sigmoid
    • Tanh
    • ReLU
    • LeakyReLU
    • SoftPlus
    • ELU
    • SELU,自归一化
    • Swish,类 Sigmoid 作为开关
    • GELU
    • GLU
  2. 特性

    • 梯度消失 存在偏导过小
    • 梯度爆炸 偏导累乘过大
    • 梯度裁剪
    • 输出均值为 0 能避免每次权重只能往单一反向变化
    • ReLU 计算复杂度低
    • ReLU 的负半轴为输出值增加稀疏性,减少计算量,但同时会让一些神经元不能更新
    • SoftPlus,ReLU 的平滑

全连接层 Linear

嵌入层 Embedding

卷积层 Convolution

  • 特征

    • 局部感知、权值共享、平移不变、多核
  • 1×1 卷积

    • 特征增强
    • 特征融合
    • 改变通道数
    • 分类
  • 空洞卷积

  • 分组卷积

转置卷积层 Transpose Convolution

上采样

  1. 插值
  2. 反卷积
  3. PixelShuffle

优化模块

残差结构 Residual Connection

将输入与层输出相加

  • 优势

    • 缓解梯度消失,增加网络深度
    • 保留信息,特征重用

空间金字塔池化(Spatial Pyramid Pooling,SPP)

空洞空间金字塔池化(Atrous Spatial Pyramid Pooling,ASPP)

HDC

可变形卷积 Deformable Convolution

可分离卷积 Separable Convolution

Transformer

  • 模块结构

    • 多头自注意力机制(Multi-Head Self-Attention Mechanism)
    • 前馈神经网络(Feed-Forward Neural Network)
    • 层归一化(Layer Normalization)
    • 残差连接(Residual Connections)
  • Self-Attention

  • 除以的原因

    • 矩阵计算导致的元素值整体偏大,从而引发梯度消失
    • 计算后的数据平方差为,除以,将分布的方差纠正回接近 1
  • 并行化的体现

    • 序列计算多头注意力
  • 影响计算量的因素

    • 序列长度:点积、矩阵乘
    • 头数量
  • 优势

    • 并行处理整个序列
    • 长距离依赖
  • 缺点

    • 计算量大
    • 超参调优
    • 超长序列处理能力

Cross-Attention

Convolutional Attention

  • SENet -CBAM

基础模型

前馈神经网络

卷积神经网络(CNN)

循环神经网络(RNN)

长短时记忆网络(LSTM)

模型调优

模型优化

正则化

  • L1 正则化
  • L2 正则化

损失函数

已知 softmax 输出概率序列与实际分布概率序列,计算两者交叉熵

超参数调整

在深度学习中,超参数(Hyperparameters)是指在训练开始前设置的模型参数,不是通过训练学习得到的。超参数的选择对模型性能有很大的影响,不同的超参数设置可能导致显著不同的训练结果。

优化器选择

  • SGD
  • AdaGrad
  • RMSProp
  • Adam

学习率衰减

LR 中的连续值特征是如何处理的 为什么 LR 要先对数据进行归一化处理 LR 用了 sigmoid 函数,那么 LR 是线性模型还是非线性模型,为什么

  • 线性
  • 分段
  • 余弦
  • WarmUp
  • 周期性

缩放法则 Scaling-Law

在 AI 领域中,描述模型性能如何随着模型规模(如参数数量、训练数据量、计算资源等)变化而变化的一组经验法则

  • 应用

    1. 设计更大规模的模型

      指导研究人员如何设计和训练更大规模的模型,以实现更高的性能

    2. 优化资源分配

      如确定是否应增加模型参数数量、增加训练数据量,还是增加计算资源,以实现最优的性能提升

    3. 预测性能

      根据现有模型的性能和缩放法则,可以预测更大规模模型的性能

常见模型评估指标

准确率

召回率

F1 分数

浮点数运算次数 FLOPs

帧每秒 FPS

深度学习框架

训练范式

PyTorch

Tensor

  • 存储

    • 头信息区(Tensor):tensor 的形状(size)、步长(stride)、数据类型(type)等
    • 存储区(Storage):数据
  • stride 属性

    指定维度中一个元素到下一个元素的步长

  • view 方法

    返回共享存储区的 tensor

  • 计算图

  • 环境搭建

  • 数据加载

  • 模型定义

  • 训练

  • 验证

  • 保存

  • 加载模型

PytorchLightning

逻辑思维与项目经验

逻辑思维

准备通过解决实际问题来展示你的逻辑思维能力和数据分析洞察力,可以是以往项目中的案例分析。

团队合作与挑战接受度

思考并准备实例说明你如何在团队中有效沟通、协作解决问题,以及面对技术挑战时的态度和解决策略。

BiFormer

  • Paper: BiFormer: Vision Transformer with Bi-Level Routing Attention

  • Authors: Lei Zhu, Xinjiang Wang, Zhanghan Ke, Wayne Zhang, Rynson Lau

  • Code: GitHub

  • Framework: BiFormer

Transformer

优势

  • long-range dependency
  • inductive-bias-free
  • high parallelism

劣势

  • 计算量大

  • 内存占用大

  • 现有方案:引入稀疏性

    • 局部窗口
    • 轴向注意力
    • 空洞注意力
  • 存在问题

    • 筛选 key/value 时没有区分 query

Bi-level Routing Attention (BRA)

Sparsity

  • 利用稀疏性来节省计算量和内存,同时只包含 GPU 友好的稠密矩阵乘法

Query-aware

  • 为各个 Query 筛选语义最相关的 Key-Value 对

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# input: features (H, W, C). Assume H==W.
# output: features (H, W, C).
# S: square root of number of regions.
# k: number of regions to attend.

# patchify input (H, W, C) -> (Sˆ2, HW/Sˆ2, C)
x = patchify(input, patch_size=H//S)

# linear projection of query, key, value
query, key, value = linear_qkv(x).chunk(3, dim=-1)

# regional query and key (Sˆ2, C)
query_r, key_r = query.mean(dim=1), key.mean(dim=1)

# adjacency matrix for regional graph (Sˆ2, Sˆ2)
A_r = mm(query_r, key_r.transpose(-1, -2))
# compute index matrix of routed regions (Sˆ2, K)
I_r = topk(A_r, k).index
# gather key-value pairs
key_g = gather(key, I_r)
# (Sˆ2, kHW/Sˆ2, C)
value_g = gather(value, I_r)
# (Sˆ2, kHW/Sˆ2, C)
# token-to-token attention
A = bmm(query, key_g.transpose(-2, -1))
A = softmax(A, dim=-1)
output = bmm(A, value_g) + dwconv(value)
# recover to (H, W, C) shape
output = unpatchify(output, patch_size=H//S)

leetcode-host

编程题:

逆时针打印数组 (剑指 offer 和 leetcode54 都有的常见题,常为顺时针打印数组) 给先序遍历重构二叉树 (例如输入为 124XXX3XX,X 表示空,无叶子节点) 有随机数 0-2 0-3 0-4 构建 100 的随机数 (使用 0-3 和 0-4 构建 20 与 0-4 构建的 5 形成 100 的随机数)

智力题:

49 个人中至少几个人生日是同一月 两个人只握一次手,一共握了 45 次,问一共几个人(10 人)

编程题:

数组合并(leetcode88)【简单】 区间合并,也叫线段合并(leetcode56)【中等】 以上内容+能否完全覆盖,题目为: 单个线段[2,6]可称为完全覆盖[4,6],现有两组线段 AB,每组中有一定数目的线段,判断 A 组能否完全覆盖 B 组 例如:

            [[1, 3], [2, 6]]

            [[1, 4], [4, 5]]

            True

            [[1, 2], [4, 7]]

            [[2, 5], [6, 7]]

            False

非递归中序遍历

重建二叉树

根据前序和中序遍历,返回后序遍历

用两个队列实现一个栈

解法:一个队列放入,一个队列输出。因为栈是后入先出,所以把 q1 的元素依次删除并插入 q2,再删除最后一个元素。然后 q1 赋值为 q2,q2 初始化为空,这样才能不断删除。

问题 1:交叉熵公式

解答:交叉熵公式如下:

这里公式定义,x、y 都是表示概率分布。其中 x 是正确的概率分布,而 y 是我们预测出来的概率分布,这个公式算出来的结果,表示 y 与正确答案 x 之间的错误程度(即:y 错得有多离谱),结果值越小,表示 y 越准确,与 x 越接近。

问题 3:对后验概率估计的思考

解答:对于很多条件概率问题,可以等价于求后验概率问题。

问题 4:针对归一化问题的数据线性排序思考

解答:基数排序是一种针对该问题很好的解决方式,往往因为其平均复杂度为被忽略其线性。

问题 5:带有容错的最长公共子串如何实现(动态规划问题)

解答: 暂时还没想到。

问题 6:剑指 Offer 原题,螺旋遍历

解答:主要找规律找出循环条件:并且

https://github.com/DWCTOD/interview/blob/master/detail/%E4%BD%9C%E4%B8%9A%E5%B8%AE%20%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E5%B7%A5%E7%A8%8B%E5%B8%88%20%E9%9D%A2%E7%BB%8F%EF%BC%882020%E5%B1%8A%EF%BC%89.md

第一题 leetcode29 题 第二题: 给定 n,用 1 到 n 作为二叉搜索树的节点值,返回 n 个点所能组成的二叉搜索树的个数 如 n=3

大数乘法

https://www.nowcoder.com/discuss/353156289771544576

p