深度学习面试高频题:算法工程师亲身经历总结
深度学习面试高频题算法工程师亲身经历总结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 * gammastep5divar np.sum(dxhat*xmu, axis0)dxmu1 dxhat * ivar #注意这是xmu的一个支路step4dsqrtvar -1. /(sqrtvar**2) * divardvar 0.5 * 1. /np.sqrt(vareps) * dsqrtvarstep3dsq 1. /N * np.ones((N,D)) * dvardxmu2 2 * xmu * dsq #注意这是xmu的第二个支路step2dx1 (dxmu1 dxmu2) 注意这是x的一个支路step1dmu -1 * np.sum(dxmu1dxmu2, axis0)dx2 1. /N * np.ones((N,D)) * dmu 注意这是x的第二个支路step0 done!dx dx1 dx2return dx, dgamma, dbetaBatch Norm即批规范化目的是为了解决每批数据训练时的不规则分布给训练造成的困难对批数据进行规范化还可以在梯度反传时解决梯度消失的问题。Batchnorm也是一种正则的方式可以代替其他正则方式如dropout但通过这样的正则化也消融了数据之间的许多差异信息。2. batchnorm的几个参数可学习的参数有哪些第四步加了两个参数γ和β分别叫做缩放参数和平移参数通过选择不同的γ和β可以让隐藏单元有不同的分布。这里面的γ和β可以从你的模型中学习可以用梯度下降Adam等算法进行更新。3. Batch Normalization的作用神经网络在训练的时候随着网络层数的加深,激活函数的输入值的整体分布逐渐往激活函数的取值区间上下限靠近,从而导致在反向传播时低层的神经网络的梯度消失。而BatchNormalization的作用是通过规范化的手段,将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题。①不仅仅极大提升了训练速度收敛过程大大加快②还能增加分类效果一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式所以不用Dropout也能达到相当的效果③另外调参过程也简单多了对于初始化要求没那么高而且可以使用大的学习率等。4. BN层怎么实现1.计算样本均值。2.计算样本方差。3.样本数据标准化处理。4.进行平移和缩放处理。引入了γ和β两个参数。来训练γ和β两个参数。引入了这个可学习重构参数γ、β让我们的网络可以学习恢复出原始网络所要学习的特征分布。5.BN一般用在网络的哪个部分啊先卷积再BNBatch normalization 的 batch 是批数据, 把数据分成小批小批进行 stochastic gradient descent. 而且在每批数据进行前向传递 forward propagation 的时候, 对每一层都进行 normalization 的处理6.BN为什么要重构恢复出原始的某一层所学到的特征的。因此我们引入了这个可学习重构参数γ、β让我们的网络可以学习恢复出原始网络所要学习的特征分布。7.BN层反向传播怎么求导反向传播反向传播需要计算三个梯度值分别是\frac{\partial \ell}{\partial x_{i}}, \frac{\partial \ell}{\partial y}, \frac{\partial \ell}{\partial \beta}\frac{\partial \ell}{\partial x_{i}}, \frac{\partial \ell}{\partial y}, \frac{\partial \ell}{\partial \beta} 定义\frac{\partial \ell}{\partial y_{i}}\frac{\partial \ell}{\partial y_{i}} 为从上一层传递过来的残差。 \begin{aligned}计算 \frac{\partial \ell}{\partial Y} : \quad \frac{\partial \ell}{\partial \gamma}\sum_{i1}^{m} \frac{\partial \ell}{\partial y_{i}} \cdot \overline{x_{i}} . \ \text { 计算 } \frac{\partial \ell}{\partial \beta}: \frac{\partial \ell}{\partial \beta}\sum_{i1}^{m} \frac{\partial \ell}{\partial y_{i}} \ \text { 下面计算 } \frac{\partial \ell}{\partial x_{i}} . \end{aligned} \begin{aligned}计算 \frac{\partial \ell}{\partial Y} : \quad \frac{\partial \ell}{\partial \gamma}\sum_{i1}^{m} \frac{\partial \ell}{\partial y_{i}} \cdot \overline{x_{i}} . \ \text { 计算 } \frac{\partial \ell}{\partial \beta}: \frac{\partial \ell}{\partial \beta}\sum_{i1}^{m} \frac{\partial \ell}{\partial y_{i}} \ \text { 下面计算 } \frac{\partial \ell}{\partial x_{i}} . \end{aligned} 观察缩放和移位与归一化公式可以看到从xi到yi的链式计算过程上式三个加号对应三条链式计算。8. batchnorm训练时和测试时的区别训练阶段首先计算均值和方差每次训练给一个批量计算批量的均值方差然后归一化然后缩放和平移。测试阶段每次只输入一张图片这怎么计算批量的均值和方差于是就有了代码中下面两行在训练的时候实现计算好mean、 var测试的时候直接拿来用就可以了不用计算均值和方差。9.先加BN还是激活有什么区别先激活目前在实践上倾向于把BN放在ReLU后面。也有评测表明BN放ReLU后面效果更好。二、基础卷积神经网络1.CNN的经典模型LeNetAlexNetVGGGoogLeNetResNetDenseNet2.对CNN的理解CNN 数据输入层 (Input Layer) {[卷积计算层CONV Layer )ReLU激励层 (ReLU Layer)] 池化层 (Pooling Layer ) 全连接层 (FC Layer) 。3.CNN和传统的全连接神经网络有什么区别在全连接神经网络中每相邻两层之间的节点都有边相连于是会将每一层的全连接层中的节点组织成一列这样方便显示连接结构。而对于卷积神经网络相邻两层之间只有部分节点相连为了展示每一层神经元的维度一般会将每一层卷积层的节点组织成一个三维矩阵。全连接神经网络和卷积神经网络的唯一区别就是神经网络相邻两层的连接方式。4.讲一下CNN每个层及作用卷积层用它来进行特征提取池化层对输入的特征图进行压缩一方面使特征图变小简化网络计算复杂度一方面进行特征压缩提取主要特征激活函数是用来加入非线性因素的因为线性模型的表达能力不够。全连接层fully connected layersFC在整个卷积神经网络中起到“分类器”的作用。全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。5.为什么神经网络使用卷积层-共享参数局部连接使用卷积层的前提条件是什么-数据分布一致6.resnet相比于之前的卷积神经网络模型中最大的改进点是什么解决了什么问题跳跃连接(residual block)和瓶颈层。resnet本身是一种拟合残差的结果让网络学习任务更简单可以有效地解决梯度弥散的问题。Resnet为啥能解决梯度消失怎么做的能推导吗由于每做一次卷积包括对应的激活操作都会浪费掉一些信息比如卷积核参数的随机性盲目性、激活函数的抑制作用等等。这时ResNet中的shortcut相当于把以前处理过的信息直接再拿到现在一并处理起到了减损的效果。7.resnet第二个版本做了哪些改进Resnet性能最好的变体是哪个结构是怎么样的原理是什么Resnetv21、相比于原始的网络结构先激活的网络中f是恒等变换这使得模型优化更加容易。2、使用了先激活输入的网络能够减少网络过拟合。Resnet性能最好的变体是Resnext。ResNeXt可以说是基于Resnet与Inception Split Transfrom Concat而搞出的产物结构简单、易懂又足够强大。Inception网络使用了一种split-transform-merge思想即先将输入切分到不同的低维度中然后做一个特征映射最后将结果融合到一起。但模型的泛化性不好针对不同的任务需要设计的东西太多。ResNeXt提出了一个基数cardinatity的概念用于作为模型复杂度的另外一个度量。基数cardinatity指的是一个block中所具有的相同分支的数目。与 ResNet 相比相同的参数个数结果更好一个 101 层的 ResNeXt 网络和 200 层的 ResNet 准确度差不多但是计算量只有后者的一半。ResNet的特点 引入跳跃连接有效地解决了网络过深时候梯度消失的问题使得设计更深层次的网络变得可行。8.简述InceptionV1到V4的网络、区别、改进Inceptionv1的核心就是把googlenet的某一些大的卷积层换成11, 33, 55的小卷积这样能够大大的减小权值参数数量。inception V2在输入的时候增加了batch_normal所以他的论文名字也是叫batch_normal加了这个以后训练起来收敛更快学习起来自然更高效可以减少dropout的使用。inception V3把googlenet里一些77的卷积变成了17和71的两层串联33的也一样变成了13和31这样加速了计算还增加了网络的非线性减小过拟合的概率。另外网络的输入从224改成了299.inception v4实际上是把原来的inception加上了resnet的方法从一个节点能够跳过一些节点直接连入之后的一些节点并且残差也跟着过去一个。另外就是V4把一个先11再33那步换成了先33再11.论文说引入resnet不是用来提高深度进而提高准确度的只是用来提高速度的。9. DenseNet为什么比ResNet有更强的表达能力DenseNet在增加深度的同时加宽每一个DenseBlock的网络宽度能够增加网络识别特征的能力而且由于DenseBlock的横向结构类似 Inception block的结构使得需要计算的参数量大大降低。三、损失函数1.说一下smooth L1 Loss,并阐述使用smooth L1 Loss的优点\operatorname{smooth}{L}}(x)\left{\begin{array}{ll}0.5 x^{2} \text { if }|x|1 \ |x|-0.5 \text { otherwise }\end{array}\right.\operatorname{smooth{LLR的损失函数为交叉熵损失函数。}}(x)\left{\begin{array}{ll}0.5 x^{2} \text { if }|x|1 \ |x|-0.5 \text { otherwise }\end{array}\right. Smooth L1的优点①相比于L1损失函数可以收敛得更快。②相比于L2损失函数对离群点、异常值不敏感梯度变化相对更小训练时不容易跑飞。2. L1_loss和L2_loss的区别平均绝对误差(L1 Loss): 平均绝对误差Mean Absolute Error,MAE) 是指模型预测值f(x)和真实值y之间距离的平均值其公式如下M A E\frac{\sum_{n1}^{n}\left|f\left(x_{i}\right)-y_{i}\right|}{n}M A E\frac{\sum_{n1}^{n}\left|f\left(x_{i}\right)-y_{i}\right|}{n} 均方误差MSE (L2 Loss):均方误差Mean Square Error,MSE是模型预测值f(x) 与真实样本值y 之间差值平方的平均值其公式如下M S E\frac{\sum_{i1}^{n}\left(f_{x_{i}}-y_{i}\right)^{2}}{n}M S E\frac{\sum_{i1}^{n}\left(f_{x_{i}}-y_{i}\right)^{2}}{n} 3.为何分类问题用交叉熵而不用平方损失啥是交叉熵L-[y \log \hat{y}(1-y) \log (1-\hat{y})]L-[y \log \hat{y}(1-y) \log (1-\hat{y})] 1.用平方误差损失函数误差增大参数的梯度会增大但是当误差很大时参数的梯度就会又减小了。2.使用交叉熵损失是函数误差越大参数的梯度也越大能够快速收敛。分类中为什么交叉熵损失函数比均方误差损失函数更常用交叉熵损失函数关于输入权重的梯度表达式与预测值与真实值的误差成正比且不含激活函数的梯度而均方误差损失函数关于输入权重的梯度表达式中则含有由于常用的sigmoid/tanh等激活函数存在梯度饱和区使得MSE对权重的梯度会很小参数w调整的慢训练也慢而交叉熵损失函数则不会出现此问题其参数w会根据误差调整训练更快效果更好。4.一张图片多个类别怎么设计损失函数多标签分类问题多标签分类怎么解决从损失函数角度考虑分类问题名称 输出层使用激活函数 对应的损失函数二分类 sigmoid函数 二分类交叉熵损失函数binary_crossentropy多分类 Softmax函数 多类别交叉熵损失函数categorical_crossentropy多标签分类 sigmoid函数 二分类交叉熵损失函数binary_crossentropy(多标签问题与二分类问题关系在上文已经讨论过了方法是计算一个样本各个标签的损失输出层采用sigmoid函数然后取平均值。把一个多标签问题转化为了在每个标签上的二分类问题。)5. LR的损失函数它的导数是啥加了正则化之后它的导数又是啥Logistic regression 逻辑回归是当前业界比较常用的机器学习方法。Logistic回归虽然名字里带“回归”但是它实际上是一种分类方法主要用于两分类问题利用Logistic函数或称为Sigmoid函数自变量取值范围为(-INF, INF)自变量的取值范围为(0,1)函数形式为g(z)\frac{1}{1e^{-z}}g(z)\frac{1}{1e^{-z}大家好我是资深AI讲师与学习规划师。专注计算机视觉教学与算法研发过去三年我帮超过2500名有Python 基础的入门者从像素是什么到独立跑通CV项目。今天这篇长文完全按零基础实战体系撰写从图像本质到经典算法、再到OpenCV工具链和完整项目一条龙给你讲透可直接复现的CV专业指南。适合人群大学生、转行者、开发者只要会Python基础就能跟上。读完你就能掌握图像处理4大经典算法并拥有一个可直接写进简历的实战项目为方便大家学习 这里给大家整理了一份系统学习资料包 需要的同学 根据下图指示自取就可以