机器学习\深度学习面试八股记录

机器学习\深度学习面试八股记录

本文记录总结了博主在面试中遇到的常见八股拷打,供大家参考。不出意外本文会持续更新,欢迎大家关注和指点。打了*的是频繁出现,且我认为多数方向和项目都会涉及到的考点。

监督式学习和无监督式学习

监督式学习(Supervised Learning)是一种使用带标签的数据来训练模型的学习方法。每个训练样本由特征和对应的标签组成,模型的目标是学习特征与标签之间的映射关系,从而能够对新数据进行比较准确的预测。常见的算法有支持向量机SVM、深度学习神经网络等。

无监督式学习是一种无需已标注数据,可自动对输入数据进行分类或分群的机器学习方法。常见的算法有K-means聚类算法、GAN对抗网络等。

前馈神经网络FNN

前馈神经网络FNN是最早的人工神经网络之一,它由三部分组成:

1、输入层:接受外部输入数据。每个节点代表一个输入特征。

2、隐藏层:由一个或多个层组成,每层包含若干神经元(节点),负责执行特征提取和数据变换。隐藏层的数量和每层神经元的数量由程序员指定,是模型的超参数。

3、输出层:生成最终的输出结果。输出层的节点数由程序员指定,取决于任务目标。例如,回归问题里输出层的节点只有一个,而分类问题里输出层的节点数目等于分类类别的数目。

FNN隐藏层每个神经元的净输入:
z = ∑ i = 1 n w i x i + b z = \sum_{i=1}^n w_i x_i + b z=i=1nwixi+b
a = ϕ ( z ) a = \phi(z) a=ϕ(z)
大致结构:
在这里插入图片描述

卷积神经网络CNN

简介

卷积神经网络(CNN)是最基础的神经网络之一,具有局部连接、权重共享等特点,广泛运用于图像检测、图像生成等情景,是CV领域最常用的神经网络之一。

卷积神经网络一般由卷积层、池化层和全连接层组成。

卷积层:通过卷积操作提取图像的局部特征。

池化层:也被称作汇聚层,通过减少特征图的大小来减少计算量和防止过拟合。常用的池化方法有最大池化(选取池化窗口的最大值为池化结果)、平均池化(选取池化窗口内所有值的平均值为池化结果)。

全连接层:将卷积层、池化层提取出的特征进行映射和输出,结构和FNN中的全连接层类似。

卷积层结构如下:
在这里插入图片描述

卷积的计算方式:
在这里插入图片描述

循环神经网络RNN

简介

循环神经网络(RNN)是一中具有短期记忆功能,用于处理序列数据的神经网络,常用于自然语言处理、时间序列预测(如天气预报)等情景。RNN和FNN结构类似,都由输入层、隐藏层、输出层组成。但不同的是,RNN的隐藏层连接了延迟器(上下文单元)。这些延时器保存了隐藏层最近一次或几次的活性值。RNN层的活性值(隐状态)为:
h t = σ ( W h h h t − 1 + W x h x t + b h ) h_t = \sigma(W_{hh} h_{t-1} + W_{xh} x_t + b_h) ht=σ(Whhht1+Wxhxt+bh)
在这里插入图片描述

*常见激活函数

Sigmoid函数:Sigmoid 函数将输入映射到 0 和 1 之间,常用于输出层的二分类问题。
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
Tanh函数:Tanh 函数将输入映射到 -1 和 1 之间,通常用于隐藏层。
tanh ( x ) = e x − e − x e x + e − x \text{tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex
Relu函数:ReLU 函数是最常用的激活函数之一,它将负值部分映射为 0,正值部分保持不变。
ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)
SoftMax函数:Softmax 函数将一组实数转换为概率分布,常用于多分类问题的输出层。
softmax ( x i ) = e x i ∑ j e x j \text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} softmax(xi)=jexjexi

*常见损失函数

均方误差MSE:MSE 是回归问题中最常用的损失函数之一,衡量预测值与真实值之间的平均平方误差。
MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2
交叉熵损失函数:交叉熵损失是分类问题中最常用的损失函数之一,用于衡量两个概率分布之间的差异,特别是预测概率分布与真实分布之间的差异。
Binary Cross-Entropy = − 1 n ∑ i = 1 n [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] \text{Binary Cross-Entropy} = - \frac{1}{n} \sum_{i=1}^{n} \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] Binary Cross-Entropy=n1i=1n[yilog(y^i)+(1yi)log(1y^i)]
Categorical Cross-Entropy = − ∑ i = 1 n ∑ c = 1 C y i , c log ⁡ ( y ^ i , c ) \text{Categorical Cross-Entropy} = - \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c}) Categorical Cross-Entropy=i=1nc=1Cyi,clog(y^i,c)

*常见优化算法

梯度下降法

梯度下降法是机器学习里众多优化算法的基础思想,其通过损失函数相对模型每个参数的梯度来更新模型参数,从而优化模型。其公式为:
θ = θ − η ⋅ ∇ θ J ( θ ) \theta = \theta - \eta \cdot \nabla_\theta J(\theta) θ=θηθJ(θ)
其中, θ \theta θ是模型的参数, η \eta η是学习率, ∇ θ J ( θ ) \nabla_\theta J(\theta) θJ(θ)是损失函数相对参数的梯度。

损失函数相对参数的梯度就是损失函数对参数求偏导数,即:
∇ θ J ( θ ) = [ ∂ J ( θ ) ∂ θ 1 , ∂ J ( θ ) ∂ θ 2 , … , ∂ J ( θ ) ∂ θ n ] \nabla_\theta J(\theta) = \left[ \frac{\partial J(\theta)}{\partial \theta_1}, \frac{\partial J(\theta)}{\partial \theta_2}, \dots, \frac{\partial J(\theta)}{\partial \theta_n} \right] θJ(θ)=[θ1J(θ),θ2J(θ),,θnJ(θ)]
在实际的模型训练中,我们一般使用小批量梯度下降法,即选用一个batch数量的样本的梯度来更新参数,其公式为:
θ t + 1 = θ t − η 1 m ∑ i = 1 m ∇ θ J ( θ t ; x i , y i ) \theta_{t+1} = \theta_t - \eta \frac{1}{m} \sum_{i=1}^m \nabla_\theta J(\theta_t; x_i, y_i) θt+1=θtηm1i=1mθJ(θt;xi,yi)
m即batch的大小。

动量法

动量法通过引入动量来保存之前状态的梯度信息,从而加速模型的收敛。其公式为:
v t = γ v t − 1 + η ∇ θ J ( θ t ) v_t = \gamma v_{t-1} + \eta \nabla_\theta J(\theta_t) vt=γvt1+ηθJ(θt)

θ t + 1 = θ t − v t \theta_{t+1} = \theta_t - v_t θt+1=θtvt

其中, v t v_t vt是动量项, γ \gamma γ是动量系数。

AdaGrad(自适应学习率优化算法)

AdaGrad可针对不同的参数动态调整学习率,学习率会随着训练次数的增加而不断减小,有助于模型的后期收敛(也可能导致模型参数过早收敛)。其公式为:
θ t + 1 = θ t − η G t + ϵ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \nabla_\theta J(\theta_t) θt+1=θtGt+ϵ ηθJ(θt)
其中, G t = ∑ i = 1 t ∇ θ J ( θ i ) ⊙ ∇ θ J ( θ i ) G_t = \sum_{i=1}^t \nabla_\theta J(\theta_i) \odot \nabla_\theta J(\theta_i) Gt=i=1tθJ(θi)θJ(θi)是梯度的累积平方和,即该参数所有状态的梯度的平方的和。 ϵ \epsilon ϵ是一个很小的常数,以避免分母为0的情况。

RMSProp

RMSProp 是AdaGrad的改进算法,通过引入指数加权移动平均来控制梯度平方和的累积,避免参数过早收敛。其公式为:
E [ g 2 ] t = ρ E [ g 2 ] t − 1 + ( 1 − ρ ) ∇ θ J ( θ t ) 2 E[g^2]_t = \rho E[g^2]_{t-1} + (1 - \rho) \nabla_\theta J(\theta_t)^2 E[g2]t=ρE[g2]t1+(1ρ)θJ(θt)2

θ t + 1 = θ t − η E [ g 2 ] t + ϵ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \nabla_\theta J(\theta_t) θt+1=θtE[g2]t+ϵ ηθJ(θt)

其中, E [ g 2 ] t E[g^2]_t E[g2]t是梯度平方的指数加权移动平均, ρ \rho ρ是衰减率。

Adam

Adam结合了动量法和RMSProp的优点,通过梯度的一阶矩和二阶矩来动态调整学习率。公式如下:
m t = β 1 m t − 1 + ( 1 − β 1 ) ∇ θ J ( θ t ) m_t = \beta_1 m_{t-1} + (1 - \beta_1) \nabla_\theta J(\theta_t) mt=β1mt1+(1β1)θJ(θt)

v t = β 2 v t − 1 + ( 1 − β 2 ) ∇ θ J ( θ t ) 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) \nabla_\theta J(\theta_t)^2 vt=β2vt1+(1β2)θJ(θt)2

m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} m^t=1β1tmt,v^t=1β2tvt

θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t θt+1=θtv^t +ϵηm^t

其中, m t m_t mt是矩阵的一阶矩, v t v_t vt是矩阵的二阶矩, β 1 \beta_1 β1 β 2 \beta_2 β2是动量项衰减率。

*过拟合

概念

过拟合指模型在训练数据集上的表现很好,但在测试集或验证集上的表现很差。其原因可能为模型的复杂度过高,模型的训练数据不足,训练数据中的噪声过多等。

解决方法

(1)简化模型结构,比如减少神经网络的层数或减少神经网络层的神经元数目,选用更简单的神经网络算法等。

(2)引入正则化方法。

(3)增加训练数据。

欠拟合

概念

欠拟合指模型没有对训练数据充分学习,从而在训练集、测试集、验证集上均表现不佳。其原因可能有:模型过于简单,输入数据缺失比较关键的特征,训练时间不足,正则化过强等。

解决方法

(1)增加模型的复杂度,如增加神经网络层数或神经网络层的神经元数目,选用更复杂的神经网络算法等。

(2)提取、增加更有效的特征。

(3)增加训练时间。

(4)降低正则化强度。

*梯度消失

概念

在反向传播的过程中,梯度会随着传播层数的增加而减小,并最终趋近于0,使得更前面的神经网络层的参数无法得到有效更新。

现象

损失函数保持不变或者变化非常缓慢。

解决方案

(1)使用ReLu激活函数:ReLu激活函数( x = max(x,0) )的导数在整数部分始终为0,使得反向传播时不会出现梯度消失的问题。

(2)引入残差连接:残差连接指的是神经网络层输出时,将输出端的值(激活函数激活后的结果)与输入端的值(x)相加后再输出。反向传播时,直接加到输出端的输入端部分的导数始终为1,避免了梯度消失的问题。

(3)引入批量归一化:通过对每一层激活后的值进行归一化处理,缓解梯度消失的问题。

梯度爆炸

概念

在反向传播中,当梯度大于1或者权重非常大时,梯度可能随着向前传播的层数增多而变得非常大,以至于溢出,出现梯度爆炸的现象。

现象

模型训练时的损失函数出现NAN或者发生显著的波动。

解决方案

(1)梯度裁剪:将梯度值限制在一个比较合理的范围。

(2)正则化

(3)引入批量归一化:通过对每一层激活后的值进行归一化处理,缓解梯度爆炸的问题。

(4)减少神经网络的层数。

批量归一化

原理

批量归一化(Batch Normalization, 简称BN)指对每一个神经网络层激活后的输出进行归一化处理,其公式为:
BN ( x i ) = γ x i − μ B σ B 2 + ϵ + β \text{BN}(x_i) = \gamma \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} + \beta BN(xi)=γσB2+ϵ xiμB+β
其中, μ B \mu_B μB 是该批次内输入的均值。 σ B 2 \sigma_B^2 σB2 是该批次内输入的方差。 ϵ \epsilon ϵ 是一个小的常数,用于防止除零错误。 x ^ ( i ) \hat{x}^{(i)} x^(i) 是归一化后的输出。 γ \gamma γ β \beta β是可学习的放缩和平移参数。

BN使每个神经网络层激活后的大部分输出从梯度饱和区域重新拉回到正态分布,从而解决了激活值大部分分布在饱和区域而使得神经网络在后续训练中对多数输入不敏感的问题。引入放缩参数和平移参数是为了给BN后的输出添加一定的非线性,保留非线性函数对未知数据的较好拟合效果。

作用

(1)加速训练:BN使神经网络层得到的输入稳定在一定范围内,从而加速了神经网络参数的收敛速度,减少训练时间。

(2)缓解过拟合:BN的过程引入了一定噪声,起到了一定的正则化作用,有助于缓解过拟合。

*正则化

概念

正则化是机器学习中通过引入惩罚项来提高模型的泛化能力,防止模型过拟合的技术。常见的正则化方法有:L1正则化,L2正则化,Dropout函数等。

L1正则化

L1正则化是将模型所有参数的绝对值之和添加到损失函数中,公式为:

L1 Regularization = λ ∑ i ∣ w i ∣ \text{L1 Regularization} = \lambda \sum_{i} |w_i| L1 Regularization=λiwi

L2正则化

L2正则化是将模型所有参数的平方的和添加到损失函数,公式为:
L2 Regularization = λ ∑ i w i 2 \text{L2 Regularization} = \lambda \sum_{i} w_i^2 L2 Regularization=λiwi2

*最小二乘法

最小二乘法是通过令误差的平方和最小化来找到最佳模型的一种优化数学建模的方法。其大致过程为:

(1)求出所有数据的误差平方和SSE,即预测值和真实值的差值的平方和。

(2)让SSE分别对模型的每个参数求偏导数,并令偏导数的值等于0,从而得到参数偏导数为0的方程式组成的方程组。

(3)解方程组,得到每个参数的解,从而找到最优模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值