深度学习面试宝典:30个必考知识点详解

张开发
2026/5/4 19:52:44 15 分钟阅读
深度学习面试宝典:30个必考知识点详解
深度学习面试宝典30个必考知识点详解params_grad evaluate_gradient(loss_function, data, params)params params - learning_rate * params_grad优点1一次迭代是对所有样本进行计算此时利用矩阵进行操作实现了并行。2由全数据集确定的方向能够更好地代表样本总体从而更准确地朝向极值所在的方向。当目标函数为凸函数时BGD一定能够得到全局最优。缺点1当样本数目 m 很大时每迭代一步都需要对所有样本计算训练过程会很慢。2不能投入新数据实时更新模型。②随机梯度下降SGD随机梯度下降法求梯度时选取一个样本j来求梯度。\theta_{j}:w_{j}\alpha\left(y_{i}-\theta_{i}^{T} x_{i}\right) x_{j}\theta_{j}:w_{j}\alpha\left(y_{i}-\theta_{i}^{T} x_{i}\right) x_{j} 写成伪代码如下for i in range(nb_epochs):np.random.shuffle(data)for example in data:params_grad evaluate_gradient(loss_function , example ,params)params params - learning_rate * params_grad优点1由于不是在全部训练数据上的损失函数而是在每轮迭代中随机优化某一条训练数据上的损失函数这样每一轮参数的更新速度大大加快。缺点1准确度下降。由于即使在目标函数为强凸函数的情况下SGD仍旧无法做到线性收敛。2可能会收敛到局部最优由于单个样本并不能代表全体样本的趋势。3不易于并行实现。SGD 因为更新比较频繁会造成 cost function 有严重的震荡。③小批量梯度下降算法mini-batch GD小批量梯度下降法是是对于m个样本我们采用x个样子来迭代1xm。一般可以取x10当然根据样本的数据可以调整这个x的值。\theta\theta-\eta \cdot \nabla_{\theta} J\left(\theta ; x^{(i: in)} ; y^{(i: in)}\right)\theta\theta-\eta \cdot \nabla_{\theta} J\left(\theta ; x^{(i: in)} ; y^{(i: in)}\right) 伪代码如下for i in range(nb_epochs):np.random.shuffle(data)for batch in get_batches(data, batch_size50):params_grad evaluate_gradient(loss_function, batch, params)params params - learning_rate * params_grad优点1通过矩阵运算每次在一个batch上优化神经网络参数并不会比单个数据慢太多。2每次使用一个batch可以大大减小收敛所需要的迭代次数同时可以使收敛到的结果更加接近梯度下降的效果。(比如上例中的30W设置batch_size100时需要迭代3000次远小于SGD的30W次)3可实现并行化。缺点(解释1)1.不过 Mini-batch gradient descent 不能保证很好的收敛性learning rate 如果选择的太小收敛速度会很慢如果太大loss function 就会在极小值处不停地震荡甚至偏离。有一种措施是先设定大一点的学习率当两次迭代之间的变化低于某个阈值后就减小 learning rate不过这个阈值的设定需要提前写好这样的话就不能够适应数据集的特点。对于非凸函数还要避免陷于局部极小值处或者鞍点处因为鞍点周围的error是一样的所有维度的梯度都接近于0SGD 很容易被困在这里。会在鞍点或者局部最小点震荡跳动因为在此点处如果是训练集全集带入即BGD则优化会停止不动如果是mini-batch或者SGD每次找到的梯度都是不同的就会发生震荡来回跳动。2.SGD对所有参数更新时应用同样的 learning rate如果我们的数据是稀疏的我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。缺点(解释2)1batch_size的不当选择可能会带来一些问题。batcha_size的选择带来的影响在合理地范围内增大batch_size的好处a. 内存利用率提高了大矩阵乘法的并行化效率提高。b. 跑完一次 epoch全数据集所需的迭代次数减少对于相同数据量的处理速度进一步加快。c. 在一定范围内一般来说 Batch_Size 越大其确定的下降方向越准引起训练震荡越小。2盲目增大batch_size的坏处a. 内存利用率提高了但是内存容量可能撑不住了。b. 跑完一次 epoch全数据集所需的迭代次数减少要想达到相同的精度其所花费的时间大大增加了从而对参数的修正也就显得更加缓慢。c. Batch_Size 增大到一定程度其确定的下降方向已经基本不再变化。2.梯度下降算法改进①动量梯度下降法MomentumMomentum 通过加入 γ*vt−1 可以加速 SGD 并且抑制震荡。momentum即动量它模拟的是物体运动时的惯性即更新的时候在一定程度上保留之前更新的方向同时利用当前batch的梯度微调最终的更新方向。这样一来可以在一定程度上增加稳定性从而学习地更快并且还有一定摆脱局部最优的能力。动量法做的很简单相信之前的梯度。如果梯度方向不变就越发更新的快反之减弱当前梯度。r一般为0.9。\begin{aligned} v_{t} \gamma v_{t-1}\eta \nabla_{\theta} J(\theta) \ \theta \theta-v_{t} \end{aligned}\begin{aligned} v_{t} \gamma v_{t-1}\eta \nabla_{\theta} J(\theta) \ \theta \theta-v_{t} \end{aligned} 缺点这种情况相当于小球从山上滚下来时是在盲目地沿着坡滚如果它能具备一些先知例如快要上坡时就知道需要减速了的话适应性会更好。②Nesterov accelerated gradient法NAG用 θ−γv_t−1 来近似当做参数下一步会变成的值则在计算梯度时不是在当前位置而是未来的位置上。仍然是动量法只是它要求这个下降更加智能。这个算法就可以对低频的参数做较大的更新对高频的做较小的更新也因此对于稀疏的数据它的表现很好很好地提高了 SGD 的鲁棒性。\begin{aligned} v_{t} \gamma v_{t-1}\eta \nabla_{\theta} J\left(\theta-\gamma v_{t-1}\right) \ \theta \theta-v_{t} \end{aligned}\begin{aligned} v_{t} \gamma v_{t-1}\eta \nabla_{\theta} J\left(\theta-\gamma v_{t-1}\right) \ \theta \theta-v_{t} \end{aligned} esterov 的好处就是当梯度方向快要改变的时候它提前获得了该信息从而减弱了这个过程再次减少了无用的迭代。超参数设定值: 一般 γ 仍取值 0.9 左右。③Adagrad这个算法就可以对低频的参数做较大的更新对高频的做较小的更新也因此对于稀疏的数据它的表现很好很好地提高了 SGD 的鲁棒性例如识别 Youtube 视频里面的猫训练 GloVe word embeddings因为它们都是需要在低频的特征上有更大的更新。梯度更新规则:\theta_{t1, i}\theta_{t, i}-\frac{\eta}{\sqrt{G_{t, i i}\epsilon}} \cdot g_{t, i}\theta_{t1, i}\theta_{t, i}-\frac{\eta}{\sqrt{G_{t, i i}\epsilon}} \cdot g_{t, i} 其中g为t时刻参数θ_i的梯度g_{t, i}\nabla_{\theta} J\left(\theta_{i}\right)g_{t, i}\nabla_{\theta} J\left(\theta_{i}\right) 如果是普通的 SGD 那么 θ_i 在每一时刻的梯度更新公式为\theta_{t1, i}\theta_{t, i}-\eta \cdot g_{t, i}\theta_{t1, i}\theta_{t, i}-\eta \cdot g_{t, i} 但这里的learning rate η也随t和i而变\theta_{t1, i}\theta_{t, i}-\frac{\eta}{\sqrt{G_{t, i i}\epsilon}} \cdot g_{t, i}\theta_{t1, i}\theta_{t, i}-\frac{\eta}{\sqrt{G_{t, i i}\epsilon}} \cdot g_{t, i} 其中 Gt 是个对角矩阵 (i,i) 元素就是 t 时刻参数 θi 的梯度平方和。Adagrad 的优点是减少了学习率的手动调节。超参数设定值一般η选取0.01。缺点它的缺点是分母会不断积累这样学习率就会收缩并最终会变得非常小。④Adadelta这个算法是对 Adagrad 的改进和Adagrad相比就是分母的 G 换成了过去的梯度平方的衰减平均值指数衰减平均值\Delta \theta_{t}-\frac{\eta}{\sqrt{E\left[g^{2}\right]{t}\epsilon}} g\right]}\Delta \theta_{t}-\frac{\eta}{\sqrt{E\left[g^{2{t}\epsilon}} g{R M S[g]} 这个分母相当于梯度的均方根 root mean squared (RMS)在数据统计分析中将所有值平方求和求其均值再开平方就得到均方根值 所以可以用 RMS 简写\Delta \theta_{t}-\frac{\eta{t}} g{R M S[g]}\Delta \theta_{t}-\frac{\eta{t}} g\right]} 其中 E 的计算公式如下t 时刻的依赖于前一时刻的平均和当前的梯度E\left[g^{2{t}\gamma E\left[g^{2}\right]\right]}(1-\gamma) g_{t}^{2}E\left[g^{2{t}\gamma E\left[g^{2}\right]-\frac{R M S[\Delta \theta]}(1-\gamma) g_{t}^{2} 梯度更新规则:此外还将学习率η换成了RMS[Δθ]这样的话我们甚至都不需要提前设定学习率了\Delta \theta_{t{t-1}}{R M S[g]-\frac{R M S[\Delta \theta]}} g_{t} \ \theta_{t1}\theta_{t}\Delta \theta_{t}\Delta \theta_{t{t-1}}{R M S[g]\right]}} g_{t} \ \theta_{t1}\theta_{t}\Delta \theta_{t} 超参数设定值: γ 一般设定为 0.9⑤RMSpropRMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的。梯度更新规则:RMSprop 与 Adadelta 的第一种形式相同使用的是指数加权平均旨在消除梯度下降中的摆动与Momentum的效果一样某一维度的导数比较大则指数加权平均就大某一维度的导数比较小则其指数加权平均就小这样就保证了各维度导数都在一个量级进而减少了摆动允许使用一个更大的学习率η。E\left[g^{2{t}0.9 E\left[g^{2}\right]\right]}0.1 g_{t}^{2} \ \theta_{t1}\theta_{t}-\frac{\eta}{\sqrt{E\left[g^{2{t}\epsilon}} g\right]}E\left[g^{2{t}0.9 E\left[g^{2}\right]\right]}0.1 g_{t}^{2} \ \theta_{t1}\theta_{t}-\frac{\eta}{\sqrt{E\left[g^{2{t}\epsilon}} g} 超参数设定值:Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001。⑥AdamAdaptive Moment EstimationAdam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率即 alpha更新所有的权重学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。这个算法是另一种计算每个参数的自适应学习率的方法相当于 RMSprop Momentum。除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值m_{t}\beta_{1} m_{t-1}\left(1-\beta_{1}\right) g_{t} \ v_{t}\beta_{2} v_{t-1}\left(1-\beta_{2}\right) g_{t}^{2}m_{t}\beta_{1} m_{t-1}\left(1-\beta_{1}\right) g_{t} \ v_{t}\beta_{2} v_{t-1}\left(1-\beta_{2}\right) g_{t}^{2} 如果mt和vt被初始化为0向量那它们就会向0偏置所以做了偏差校正通过计算偏差校正后的mt和vt来抵消这些偏差\hat{m{t}\frac{m}}{1-\beta_{1}^{t}} \ \hat{v{t}\frac{v}}{1-\beta_{2}^{t}}\hat{m{t}\frac{m}}{1-\beta_{1}^{t}} \ \hat{v{t}\frac{v}}{1-\beta_{2}^{t}} 梯度更新规则:\theta_{t1}\theta_{t}-\frac{\eta}{\sqrt{\hat{v{t}}\epsilon} \hat{m}}\theta_{t1}\theta_{t}-\frac{\eta}{\sqrt{\hat{v{t}}\epsilon} \hat{m}超参数设定值:建议 β1 0.9β2 0.999ϵ 10e−8。实践表明Adam 比其他适应性学习方法效果要好。Adam和 SGD区别Adam Adaptive Momentum顾名思义Adam集成了SGD的一阶动量和RMSProp的二阶动量。3.牛顿法利用二阶导数收敛速度快但对目标函数有严格要求必须有连续的一、二阶偏导数计算量大。利用牛顿法求解目标函数的最小值其实是转化成求使目标函数的一阶导为0的参数值。这一转换的理论依据是函数的极值点处的一阶导数为0.其迭代过程是在当前位置x0求该函数的切线该切线和x轴的交点x1作为新的x0,重复这个过程直到交点和函数的零点重合。此时的参数值就是使得目标函数取得极值的参数值。简述梯度下降法和牛顿法的优缺点梯度下降法和牛顿法区别1.牛顿法是通过求解目标函数的一阶导数为0时的参数进而求出目标函数最小值时的参数。①收敛速度很快。②海森矩阵的逆在迭代过程中不断减小可以起到逐步减小步长的效果。③缺点海森矩阵的逆计算复杂代价比较大因此有了拟牛顿法。2.梯度下降法是通过梯度方向和步长直接求解目标函数的最小值时的参数。越接近最优值时步长应该不断减小否则会在最优值附近来回震荡。Batch Normalization1.批标准化(Batch Normalization)可以理解为是一种数据预处理技术使得每层网络的输入都服从010均值1方差分布如果不进行BN那么每次输入的数据分布不一致网络训练精度自然也受影响。前向公式前向传播代码def batchnorm_forward(x, gamma, beta, eps):N, D x.shape为了后向传播求导方便这里都是分步进行的step1: 计算均值mu 1./N * np.sum(x, axis 0)step2: 减均值xmu x - mustep3: 计算方差sq xmu ** 2var 1./N * np.sum(sq, axis 0)step4: 计算x^的分母项sqrtvar np.sqrt(var eps)ivar 1./sqrtvarstep5: normalization-x^xhat xmu * ivarstep6: scale and shiftgammax gamma * xhatout gammax beta存储中间变量cache (xhat,gamma,xmu,ivar,sqrtvar,var,eps)return out, cache后向传播代码def batchnorm_backward(dout, cache):解压中间变量xhat,gamma,xmu,ivar,sqrtvar,var,eps cacheN,D dout.shapestep6dbeta np.sum(dout, axis0)dgammax doutdgamma np.sum(dgammax*xhat, axis0)dxhat dgammax * gamma包含大模型学习路线图、核心知识点笔记、CV面试题合集...只针对真正想学的同学扫码备注领资料即可大家好我是资深AI讲师与学习规划师。专注计算机视觉教学与算法研发过去三年我帮超过2500名有Python 基础的入门者从像素是什么到独立跑通CV项目。今天这篇长文完全按零基础实战体系撰写从图像本质到经典算法、再到OpenCV工具链和完整项目一条龙给你讲透可直接复现的CV专业指南。适合人群大学生、转行者、开发者只要会Python基础就能跟上。读完你就能掌握图像处理4大经典算法并拥有一个可直接写进简历的实战项目为方便大家学习 这里给大家整理了一份系统学习资料包 需要的同学 根据下图指示自取就可以

更多文章