近年来关注深度学习算法面试的用户越来越多,小编整理了关于12个不容错过的深度学习面试问题(Part 1),基于深度学习的目标检测算法面试必备(RCNN~YOLOv5),深度学习面试习题总结(1)(持续更新中),深度学习面试要点总结(面试题)??,供您参考
编译:McGL公众号:PyVision年前是跳槽的淡季,但却是寻找新机会的一个很好的时机。因为大多数人都等着发了年终奖再走,或者单纯的懒过完年再说。所以年前竞争其实远没有年后激烈。早准备早收offer。下面的问题包含了batch 等几乎每个AI面试必问的内容,从面试官的角度帮你补充弹药库。Enjoy12个不容错过的深度学习面试问题(Part 2) 3) Deep Learning Interview questions you should not be missed (Part 1) by JP Tech 事实上,并不是所有的面试都需要问所有这些问题,这取决于应聘者以前的经验和项目。 通过大量的面试,特别是对学生的面试,我收集了深度学习中12个最令人兴奋的面试问题,今天将在这篇文章中与大家分享。 我希望能收到你们的许多评论。 好了,不再啰嗦,开始吧。1. 展示Batch 的意义这被认为是一个非常好的问题,因为它涵盖了候选人在使用神经网络模型时需要知道的大部分知识。 你可以用不同的方式回答,但需要阐明以下主要观点:Batch 是训练神经网络模型的一种有效方法。 该方法的目标是将features normalize为0均值且标准方差为1。 所以相反的非0均值现象意味着它是如何影响模型训练的: 首先,可以理解的是,非0均值是一种数据不是围绕0分布的现象,但是数据的大部分值都大于0,或者小于0。 结合高方差问题,数据变得非常大或非常小。 这个问题在训练深层神经网络时很常见。 特征没有在稳定的区间内(从小到大)分布的事实将影响网络的优化过程。 众所周知,优化神经网络需要使用导数计算。 假设一个简单的层计算公式是 y = (Wx + b) ,y 对 w 的导数看起来像 dy = dWx。 因此,x 的值直接影响导数的值(当然,神经网络模型中梯度的概念不可能这么简单,但理论上,x 会影响导数)。 因此,如果 x 带来不稳定的变化,导数可能太大或太小,导致不稳定的模型学习。 这也意味着在使用Batch 时,我们可以在训练期间使用更高的学习率。Batch 可以帮助我们避免 x 值经过非线性激活函数后陷入饱和的现象。 因此,它可以确保没有激活太高或太低。 不使用BN时,权重很可能永远无法学习,使用后则可以正常学习。 这有助于我们减少对参数初始值的依赖。Batch 还作为一种正则化的形式,有助于最小化过拟合。 使用batch ,我们不需要再用太多的 dropout,这是有意义的,因为我们不需要再担心drop网络时丢失太多的信息。 但是将两种技术结合使用仍然是明智的。2. 介绍偏差(bias)和方差(variance)的概念和trade-off?什么是偏差? 可以理解,偏差是当前模型的平均预测和我们需要预测的实际结果之间的差异。 一个高偏差的模型表明它不太注重训练数据。 这使得模型过于简单,在训练和测试中都不能达到很好的准确率。 这种现象也被称为欠拟合()。方差可以简单的理解为数据点上模型输出的分布(或聚类)。 方差越大,模型越有可能密切关注训练数据,而不能在从未遇到的数据上泛化。 结果表明,该模型在训练数据集上取得了很好的效果,但在测试数据集上效果很差。 这就是过拟合()现象。这两个概念之间的相互关系可以从下图中看出:在上面的图表中,圆的中心是一个模型,它完美的预测了准确的值。 事实上,你从来没有找到过这么好的模型。 当我们离圆心越来越远时,我们的预测就会越来越差。我们可以改变模型,这样我们就可以尽可能地增加模型猜测命中圆心的次数。 偏差和方差值之间的平衡是必要的。 如果我们的模型过于简单,只有很少的参数,那么它可能有很高的偏差和低方差。另一方面,如果我们的模型有大量的参数,那么它将有高的方差和低的偏差。 这是我们在设计算法时计算模型复杂度的基础。3. 假设深度学习模型已经找到了1000万个人脸向量。 如何通过查询快速找到新面孔。这个问题是关于深度学习算法在实践中的应用,关键是数据的索引方法。 这是将One Shot Learning应用于人脸识别问题的最后一步,也是使这个应用易于在实践中部署的最重要的一步。基本上,这个问题,你应该首先概述One Shot Learning人脸识别方法。 它可以简单的理解为将每个人脸转换成一个向量,而新的人脸识别就是寻找最接近(最相似)输入人脸的向量。 通常,人们会使用一个自定义损失为triplet loss的深度学习模型。然而,随着开头提到的图像数量的增加,计算每个身份标识到1000万个向量的距离并不是一个聪明的解决方案,会使系统变得很慢。 为了使查询更加方便,需要考虑在真实向量空间上对数据进行索引的方法。这些方法的主要思想是将数据划分为便于查询新数据的结构(可能类似于树结构)。 当新数据可用时,在树中查询有助于快速找到距离最近的向量。有几种方法可以用于这一目的,如Locality Sensitive Hashing — LSH, Nearest Neighbors Oh Yeah — Annoy Indexing, Faiss…4. 在分类问题上,准确率指标是否完全可靠? 你通常使用哪些指标来评估你的模型?对于一个分类问题,有许多不同的评价方法。 在准确率方面,公式简单地采用正确预测数据点数除以总数据的方法。 这听起来很合理,但是在现实中,对于不平衡的数据问题,这个数量是不够明显的。 假设我们正在构建一个网络攻击的预测模型(假设攻击请求约占1 / 100000个请求)。如果模型预测所有请求都是正常的,那么准确率也高达99.9999% ,而这个数字在分类模型中常常是不可靠的。 上面的准确率计算通常向我们显示有多少百分比的数据被正确预测,但不能说明每一类的详细分类表现。 相反,我们可以使用混淆矩阵(Confusion matrix)。 基本上,混淆矩阵显示了有多少数据点实际上属于一个类别,并被预测属于一个类别。 它的形式如下:除了表达对应于定义分类的每个阈值的True Positive 和 False Positive指数的变化,我们还有一个名为ROC (Receiver Operating )的图表。 以 ROC 为例,我们可以知道这个模型是否有效。一个理想的 ROC 是橙色线越接近左上角(即,True Positive越高,False Positive越低)越好。
整体框架目标检测算法主要包括:【两阶段】目标检测算法、【多阶段】目标检测算法、【单阶段】目标检测算法什么是两阶段目标检测算法,与单阶段目标检测有什么区别?两阶段目标检测算法因需要进行两阶段的处理:1)候选区域的获取,2)候选区域分类和回归,也称为基于区域(Region-based)的方。与单阶段目标检测算法的区别:通过联合解码同时获取候选区域、类别什么是多阶段目标检测算法?【两阶段】和【多阶段】目标检测算法统称级联目标检测算法,【多阶段】目标检测算法通过多次重复进行步骤:1)候选区域的获取,2)候选区域分类和回归,反复修正候选区域根据是否属于锚框分为:1、Anchor-Free:(注意)2、Anchor-based:-v5PP-YOLOSSD主要考虑问题1、准确性2、实时性3、多尺度4、标签方案5、目标重叠6、模型训练7、重复编码8、数据增强9、样本不平衡两阶段目标检测算法RCNN1、模型通过【选择性搜索算法】获取潜在的候选区域2、截取原图每个候选区域并resize输入到模型中进行特征抽取3、使用SVM进行分类,以及进行bounding box 回归存在问题:重复编码:由于候选区域存在重叠,模型需要重复进行重叠区域的特征图提取,计算冗余模型训练:由于特征抽取模型和区域的分类回归模型分开训练,无法进行端到端的模型训练,训练过程需要提取每个包含重叠区域的候选区域特征并保存用于分类和回归训练实时性差:重复编码导致实时性不佳,【选择性搜索算法】耗时严重Fast-RCNN考虑到RCNN的缺点,Fast-RCNN来了!1、模型依旧通过【选择性搜索算法】获取潜在的候选区域2、将原图通过特征抽取模型进行一次的共享特征图提取,避免了重复编码3、在特征图中找到每一个候选区域对应的区域并截取【区域特征图】,ROI pooling层中将每个【区域特征图】池化到统一大小4、分别进行softmax分类(使用softmax代替了RCNN里面的多个SVM分类器)和bbox回归主要优点:1、可以进行端到端模型训练2、不需要存储中间特征向量用于SVM分类和回归模型训练3、使用更高效的SPPnet特征提取网络存在问题:实时性差:选择性搜索获取候选区域耗时,主要通过贪婪算法合并低级特征超像素,单张图片耗时接近2s,且无法使用GPU加速Faster R-CNN使用RPN网络代替Fast RCNN使用的选择性搜索进行候选区域的提取,相当于Faster R-CNN=RPN+Fast RCNN,且RPN和Fast RCNN共享卷积层。1、多尺度目标:通过RPN网络候选区域,并使用不同大小和长宽比的anchors来解决多尺度问题2、通过计算anchors与真实框的交并比IOU,并通过阈值建立正负样本3、样本不平衡:每批次随机采样256个anchors进行边框回归训练,并尽可能保证正负样本数相同,避免负样本过多导致的梯度统治问题论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks多阶段目标检测算法Cascade R-CNN通过分析Faster RCNN在目标候选区域的位置修正能力, 如下图基于单个检测器的可优化性但优化的程度有限,通过多次将预测区域作为候选区域进行修正,使得输出的预测区域与真实标签区域的IOU逐级递增主要优点:1、准确性:碾压各种单双阶段目标检测算法,采用RoIAlign取代、多尺度:通过FPN网络集成多尺度特征图,利用归一化尺度偏差方法缓解不同尺度对Loss的影响程度3、实时性:去除了Fater RCNN的全连接层,取而代之采用FCN网络,相比Fater RCNN,具有更少的模型参数和计算时间主要不足:单阶段目标检测算法编码方式1、基于中心坐标方案1通过计算IOU或者长宽比阈值筛选每个anchor位置对应的target,可能过滤比较极端的target,但缓解目标重叠情况下的编码重叠问题通过对应anchor找到中心坐标位置(x,y)方案2通过iou最大值计算每个target对应的anchor位置,保证每个target至少对应一个,目标少的情况下但容易造成目标稀疏编码,通过对应target找到中心坐标位置(x,y),YOLOv5中通过中心坐标结合四舍五入进行多中心坐标映射缓解目标稀疏问题方案3同时利用方案1和方案2,保证每个target至少对应一个anchor区域YOLOv1虽然是单阶段目标检测开山之作,但真正的鼻祖应该是Faster RCNN的RPN主要优点:1、快2、采用全局特征进行推理,由于利用全局上下文信息,相比于滑动窗口和建议框方法,对背景的判断更准确3、泛化性,训练好的模型在新的领域或者不期望的输入情况下依然具有较好的效果主要不足:1、准确性:与Faster RCNN相比,correcct反映了YOLOv1准确率较低,反映了召回率较高,但总体性能F1较低,虽然loss采用长宽平方根进行回归,试图降低大目标对loss的主导地位,但小目标的微小偏差对IOU的影响更严重,导致小目标定位不准2、目标重叠:虽然通过每个S*S的网格点设置了2个预测框用于回归训练,但是每个网格点设置了一种类别,无法解决不同类别目标重叠率较大,导致映射到相同网格点上的问题3、多尺度:由于模型只是简单使用下采样获得的粗糙特征,很难将其推广到具有新的或不同寻常的宽高比或配置的对象4、实时性:虽然与Faster RCNN相比,速度很快,但还可以更快,主要是由于v1中使用了全连接网络,不是全卷积网络 全连接层参数=+=2x10^8SSD通过使用FCN全卷积神经网络,并利用不同尺度的特征图进行目标检测,在速度和精度都得到了极大提升主要优点1、实时性:相比YOlOv1更快,因为去除了全连接层2、标签方案:通过预测类别置信度和相对固定尺度集合的先验框的偏差,能够有效均衡不同尺度对loss的影响程度3、多尺度:通过使用多个特征图和对应不同尺度的锚框进行多尺度目标预测4、数据增强:通过随机裁剪的方式进行数据增强提高模型的鲁棒性4、样本不平衡:通过困难样本挖掘,采用负样本中置信度最高的先验框进行训练,并设置正负样本比例为1:3,使得模型训练收敛更快主要不足1、通过人工先验设置的不同尺度的锚框无法适应真实的目标框的尺度分布2、使用的多个特征图由于高分辨率的特征图不能有效地结合高层特征YOLOv2针对YOLOv1在解决多尺度和实时性方面的不足,提出了YOLOv2主要优点:1、更好,1)Batch :使得性能极大提升;2)Higher :使预训练分类任务分辨率与目标检测的分辨率一致;3) With Anchor Boxes:使用全卷积神经网络预测偏差,而非具体的坐标,模型更容易收敛;4)Dimension Clusters:通过聚类算法设置锚框的尺度,获得更好的先验框,缓解了不同尺度对loss的影响变化;5)Fine-Grained Features:通过简单相加融合了低层的图像特征;6)Multi-Scale Training:通过使用全卷积网络使得模型支持多种尺度图像的输入并轮流进行训练2、更快,构建Darknet-19代替VGG-16作为backbone具有更好的性能主要不足1、多尺度:在模型维度只是简单融合底层特征,在输入维度进行多尺度图像分辨率的输入训练,不能克服模型本身感受野导致的多尺度误差RetinaNet论文:Focal Loss for Dense Object Detection主要优点1、多尺度:借鉴FPN网络通过自下而上、自上而下的特征提取网络,并通过无代价的横向连接构建增强特征提取网络,利用不同尺度的特征图检测不同大小的目标,利用了底层高分率的特征图有效的提高了模型对小尺度目标的检测精度2、样本不平衡:引入Focal Loss用于候选框的【类别预测】,克服正负样本不平衡的影响及加大困难样本的权重主要不足1、实时性:网络使用ResNet-101作为主干特征提取网络,检测效率略微不足YOLOv3论文:YOLOv3: An 主要优点1、实时性:相比RetinaNet,YOLOv3通过牺牲检测精度,使用Darknet主干特征提取网络而不是Resnet101,从而获取更快的检测速度2、多尺度:相比于YOLOv1-v2,与RetinaNet采用相同的FPN网络作为增强特征提取网络得到更高的检测精度3、目标重叠:通过使用逻辑回归和二分类交叉熵损失函数进行类别预测,将每个候选框进行多标签分类,解决单个检测框可能同时包含多个目标的可能主要不足1、准确率:主要因为Darknet的特征提取不够强,未进行精细化结构模型设计YOLOv4论文:YOLOv4: Optimal Speed and Accuracy of Object Detection鉴于YOLOv3的缺点,YOLOv5进行了Darknet53主干特征提取网络等一系列改进主要优点1、实时性:借鉴CSPNet网络结构将Darknet53改进为使模型参数和计算时间更短2、多尺度:颈部分别引入PAN和SPP网络结构作为增强特征提取网络,能够有效多尺度特征,相比于引入FPN网络准确度更高3、数据增强:引入Mosaic数据增强,在使用BN的时候可以有效降低batch_size的影响4、模型训练,采用IOU:GIoU,DIoU,CIoU作为目标框的回归,与YOLOv3使用的平方差损失相比具有更高的检测精度YOLOv5为了进一步提升YOLOv4的检测速度,YOLOv5采用了更轻量的网络结构主要优点1、多尺度:使用FPN增强特征提取网络代替PAN,使模型更简单,速度更快2、目标重叠:使用四舍五入的方法进行临近位置查找,使目标映射到周围的多个中心网格点主要不足1、通过长宽比筛选并过滤了大小和长宽比较极端的真实目标框,而这些恰恰在真实检测任务极为重要,和重点解决的检测问题
最近面试了下腾讯、美团、阿里、搜狗、今日头条等,主要做NLP、ML、DL,把面试中出现的深度学习相关的一些问题记录在这里,持续更新。1 推导反向传播算法答:easy,请见RNN Part 2.5-神经网络反向传播算法推导 介绍了反向传播算法四个基本方程推导2 Relu激活函数在零点是否可导?答:在零点不可导,Relu的函数曲线如下图所示这里需要复习一些数学概念,可导和连续连续:设函数 在点 的某一邻域内有定义,如果函数 当 时的极限存在,且,则称函数在点处连续.这里需要注意左极限等于右极限等于函数值,即 ,显然Relu函数是连续的在零点。但是不可导。可导:设函数 在点 的某一邻域内有定义,则当自变量 在 处取得增量 时,相应的y取增量 ;如果 时 极限存在,则称 在点 处可导,并称这个极限为函数 在点处的倒数,记为 然而左导数和右导数并不相等,因而函数在该处不可导,实际上,如果函数导数存在,当且仅当其左右导数均相等。 而Relu左导数等于0,右导数等于1,因此不可导。3 Relu在零点不可导,那么在反向传播中怎么处理?答:caffe源码~/caffe/src/caffe/layers/relu_layer.cpp倒数第十行代码: bottom_diff[i] = top_diff[i] * ((bottom_data[i] > 0)+ negative_slope * (bottom_data[i] <= 0)); 这句话就是说间断点的求导按左导数来计算。也就是默认情况下(negative_slope=0),间断点处的导数认为是0.作者:江东子弟CC链接: 如何处理神经网络中的过拟合问题?答:有多种方法进行处理L1/L2正则化 stop各种方法本身以及为什么他们能够解决过拟合问题,需要牢记5 Relu激活函数的优缺点?答:优点包括:解决了梯度消失、爆炸的问题计算方便,计算速度快,求导方便加速网络训练缺点包括:由于负数部分恒为0,会导致一些神经元无法激活输出不是以0为中心6. Dropout在训练的过程中会随机去掉神经元,那么在编码过程中是怎么处理的呢?答:在前向传播中,当计算出 之后,根据keep_prob参数来生成该层的矩阵来决定是否保留和扔掉神经元,如果保留 ,那么 ;如果不保留 ,那么 。因此在编码中不需要改变网络结构,只需要每次计算完之后完成以下操作d3 = np.random.rand(a3.shape[0],a3.shape[1]) < keep-prob这样得到的d3就是全是0或者1的元素的矩阵,0表示隐藏掉对应的神经元,1表示保留。假如keep-prob=0.8,那么整体上可以看作 中元素等于1的概率是0.8,等于0的概率是0.2。A3 = np.multiply(A3, d3)7. dropout的训练过程需要做rescale,这个过程是什么样子的呢?答:请见神经网络正则化(2):dropout正则化,其中介绍了完整的正向传播和反向传播过程,其中在每次传播中都要做rescale ,在 有平均20%的元素归零的情况下,为了不影响 的期望值,我们用 来修正或者弥补所需要的20%,也就是保持 的期望值不变,代码如下所示:A3 = A3 / keep_prob而在后向传播中,需要dA1/keep_prob dA1 = dA1 / keep_prob # Step 2: Scale the value of neurons that haven't been shut down这样在预测的时候就不需要dropout了8. dropout方法在预测过程中需要如何处理?答:在训练过程中做了scale,那么在预测过程中就不需要做dropout,设置keep_prob = 1即可8. softmax的公式是什么?实际使用中会有什么问题?如何解决?答:首先计算带权输入然后对带权输入进行归一化操作在实际使用中,由于每项在计算的时候,如果 过大会导致数值上溢。解决方法是给分子分母同时除以 ,这时候 ,那么每一项都会小于等于1,因此解决了数值上溢的问题,总结如下: 9. CNN中padding的作用是什么?答:filter在按照步长移动时候,可能会不够,因此需要填充,例如输入数据是(1,5,5,1), filters是(1,2,2,1),strides是(1,2,2,1), 那么5%2不等于0,因此多出来一列和一行,这时候就需要填充了;在中是向右填充用最右边一列,向下填充用最下边一行。例如下面的例子中对a进行了填充,得到的结果为(1,6,6,1)a = [[0.0,0,0,0,1], [0,1,-1,0,1], [0,-1,2,1,1], [0,0,2,-1,1], [0,0,2,-1,1]] [[0.0,0,0,0,1,1], [0,1,-1,0,1,1], [0,-1,2,1,1,1], [0,0,2,-1,1,1], [0,0,2,-1,1,1], [0,0,2,-1,1,1]]10. 梯度消失和梯度爆炸的问题是如何产生的?如何解决?答:第一个问题相对简单,由于反向传播过程中,前面网络权重的偏导数的计算是逐渐从后往前累乘的,如果使用 激活函数的话,由于导数小于一,因此累乘会逐渐变小,导致梯度消失,前面的网络层权重更新变慢;如果权重 本身比较大,累乘会导致前面网络的参数偏导数变大,产生数值上溢。因为 sigmoid 导数最大为1/4,故只有当abs(w)>4时才可能出现梯度爆炸,因此最普遍发生的是梯度消失问题。解决方法通常包括使用ReLU等激活函数,梯度只会为0或者1,每层的网络都可以得到相同的更新速度采用LSTM进行梯度裁剪(clip), 如果梯度值大于某个阈值,我们就进行梯度裁剪,限制在一个范围内使用正则化,这样会限制参数 的大小,从而防止梯度爆炸设计网络层数更少的网络进行模型训练batch . 语言模型中,Bert为什么在masked language model中采用了80%、10%、10%的策略?答:如果训练的时候100%都是Mask,那么在fine-tune的时候,所有的词时候已知的,不存在[Mask],那么模型就只知道根据其他词的信息来预测当前词,而不会直接利用这个词本身的信息,会凭空损失一部分信息,对下游任务不利。还有 10% random token 是因为如果都用原 token,模型在预训练时可能会偷懒,不去建模单词间的依赖关系,直接照抄当前词[MASK] 是以一种显式的方式告诉模型『这个词我不告诉你,你自己从上下文里猜』,从而防止信息泄露。如果 [MASK] 以外的部分全部都用原 token,模型会学到『如果当前词是 [MASK],就根据其他词的信息推断这个词;如果当前词是一个正常的单词,就直接抄输入』。这样一来,在 finetune 阶段,所有词都是正常单词,模型就照抄所有词,不提取单词间的依赖关系了。以一定的概率填入 random token,就是让模型时刻堤防着,在任意 token 的位置都需要把当前 token 的信息和上下文推断出的信息相结合。这样一来,在 finetune 阶段的正常句子上,模型也会同时提取这两方面的信息,因为它不知道它所看到的『正常单词』到底有没有被动过手脚的。(鸣谢 @Towser )12. Bert现有的问题有哪些?答:Bert模型过于庞大,参数太多,无论是feature-based approach还是fine-tune approach都很慢;而且因为表示是上下文相关的,上线的应用需要实时处理,时间消耗太大;Bert给出来的中文模型中,是以字为基本单位的,很多需要词向量的应用无法直接使用;同时该模型无法识别很多生僻词,都是UNK;Bert模型作为自回归模型,由于模型结构的问题,无法给出句子概率值12. 非平衡数据集的处理方法有哪些?答:采用更好的评价指标,例如F1、AUC曲线等,而不是Recall、Precision进行过采样,随机重复少类别的样本来增加它的数量;进行欠采样,随机对多类别样本降采样通过在已有数据上添加噪声来生成新的数据修改损失函数,添加新的惩罚项,使得小样本的类别被判断错误的损失增大,迫使模型重视小样本的数据使用组合/集成方法解决样本不均衡,在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果;13. CRF与HMM模型的区别?答:大的不同点是linear-CRF模型是判别模型,而HMM是生成模型,即linear-CRF模型要优化求解的是条件概率P(y|x),则HMM要求解的是联合分布P(x,y)。第二,linear-CRF是利用最大熵模型的思路去建立条件概率模型,对于观测序列并没有做马尔科夫假设。而HMM是在对观测序列做了马尔科夫假设的前提下建立联合分布的模型。14. 交叉熵损失与KL散度的区别?答:KL散度是相对熵(relative entropy),用来衡量两个概率分布之间的差异,对于两个概率分布 ,其中 是真实概率分布,而 是数据计算得到的概率分布,其相对熵的计算公式为 当且仅当 时,其值为0;其中前半部分 是交叉熵。或者说相对熵等于交叉熵减去数据真实分布的熵。由于真实的概率分布是固定的,因此公式(5)中的后半部分是常数,所以优化交叉熵损失也等效于优化相对熵损失。15. 为什么LSTM相比RNN能够解决long-range 的问题?答:需要对BPTT进行分析,请见习翔宇:RNN/LSTM BPTT详细推导以及梯度消失问题分析
这篇文章会经常更新1.Softmax函数与交叉熵在Logistic 二分类问题中,我们可以使用sigmoid函数将输入Wx+b映射到(0,1)区间中,从而得到属于某个类别的概率。将这个问题进行泛化,推广到多分类问题中,我们可以使用softmax函数,对输出的值归一化为概率值这里假设在进入softmax函数之前,已经有模型输出C值,其中C是要预测的类别数,模型可以是全连接网络的输出aa,其输出个数为C,即输出为: 所以对每个样本,它属于类别i的概率为: 通过上式可以保证 ,即属于各个类别的概率和为1对softmax函数进行求导,即求: ,第i项的输出对第j项输入的偏导。代入softmax函数表达式,可以得到: 求导规则:对于 ,导数为: 所以在我们这个例子中, 上面两个式子只是代表直接进行替换,而非真的等式。 ,(即g(x)= 对 进行求导),要分情况讨论:如果i=j,则求导结果为 如果i≠j,则求导结果为0再来看 对 求导,结果为 所以,当i=j时:(其中,为了方便,令 ) 当i≠j时: 标红下,这俩公式很重要:Loss function对数似然函数机器学习里面,对模型的训练都是对Loss function进行优化,在分类问题中,我们一般使用最大似然估计(Maximum )来构造损失函数。对于输入的x,其对应的类标签为t,我们的目标是找到这样的θ使得p(t|x)最大。在二分类的问题中,我们有: 其中,y=f(x)y=f(x)是模型预测的概率值,t是样本对应的类标签,将问题泛化为更一般的情况,多分类问题,此时t是one-hot编码,例如[0,0,0,1,0,0],此时中间那个1对应真正的标签: 由于连乘可能导致最终结果接近0的问题,一般对似然函数取对数的负数,变成最小化对数似然函数。 交叉熵说交叉熵之前先介绍相对熵,相对熵又称为KL散度(Kullback-Leibler ),用来衡量两个分布之间的距离,记为 这里H(p)是p的熵。假设有两个分布p和q,它们在给定样本集上的相对熵定义为: 从这里可以看出,交叉熵和相对熵相差了H(p),而当p已知的时候,H(p)是个常数,所以交叉熵和相对熵在这里是等价的,反映了分布p和q之间的相似程度。关于熵与交叉熵等概念回到我们多分类的问题上,真实的类标签可以看作是分布,对某个样本属于哪个类别可以用One-hot的编码方式,是一个维度为C的向量,比如在5个类别的分类中,[0, 1, 0, 0, 0]表示该样本属于第二个类,其概率值为1。我们把真实的类标签分布记为p,该分布中,ti=1当i属于它的真实类别c。同时,分类模型经过softmax函数之后,也是一个概率分布,因为 ,所以我们把模型的输出的分布记为q,它也是一个维度为CC的向量,如[0.1, 0.8, 0.05, 0.05, 0]。 对一个样本来说,真实类标签分布与模型预测的类标签分布可以用交叉熵来表示: 最终,对所有的样本n,我们有以下loss function: 其中 是样本k属于类别i的概率, 是模型对样本k预测为属于类别i的概率。 当i=j时: 当i≠j时: 所以,将求导结果代入上式: 参考:Softmax函数与交叉熵神经网络训练中的梯度消失与梯度爆炸层数比较多的神经网络模型在训练时也是会出现一些问题的,其中就包括梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)。梯度消失问题和梯度爆炸问题一般随着网络层数的增加会变得越来越明显。例如,对于下图所示的含有3个隐藏层的神经网络,梯度消失问题发生时,接近于输出层的hidden layer 3等的权值更新相对正常,但前面的hidden layer 1的权值更新会变得很慢,导致前面的层权值几乎不变,仍接近于初始化的权值,这就导致hidden layer 1相当于只是一个映射层,对所有的输入做了一个同一映射,这是此深层网络的学习就等价于只有后几层的浅层网络的学习了。而这种问题为何会产生呢?以下图的反向传播为例(假设每一层只有一个神经元且对于每一层,其中为sigmoid函数)可以推导出而sigmoid的导数如下图可见,的最大值为,而我们初始化的网络权值通常都小于1,因此,因此对于上面的链式求导,层数越多,求导结果越小,因而导致梯度消失的情况出现。这样,梯度爆炸问题的出现原因就显而易见了,即,也就是比较大的情况。但对于使用sigmoid激活函数来说,这种情况比较少。因为的大小也与有关(),除非该层的输入值在一直一个比较小的范围内。其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑用ReLU激活函数取代sigmoid激活函数。另外,LSTM的结构设计也可以改善RNN中的梯度消失问题。参考:神经网络训练中的梯度消失与梯度爆炸3 Batchnorm原理Batchnorm是归一化的一种手段,极限来说,这种方式会减小图像之间的绝对差异,突出相对差异,加快训练速度,如果我们每一个batch输入的数据都具有不同的分布,显然会给网络的训练带来困难。另一方面,数据经过一层层网络计算后,其数据分布也在发生着变化,会给下一层的网络学习带来困难。batchnorm就是为了解决这个分布变化问题。BatchNorm就是对神经网络的每一层进行归一化,假设将每一层输出后的数据都归一化到0均值,1方差,满足正太分布,但是,此时有一个问题,每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。但是如果稍作修改,加入可训练的参数做归一化,那就是BatchNorm实现的了算法流程:输入:一个batch的样本: ,和超参数 输出: 之所以称之为batchnorm是因为所norm的数据是一个batch的,假设输入数据是 输出是 ,batchnorm的步骤如下:1.先求出此次批量数据x的均值: 2.求出此次batch的方差: 3.接下来就是对x做归一化,得到: 4.最重要的一步,引入缩放和平移变量 ,计算归一化后的值 之前也说过如果直接做归一化不做其他处理,神经网络是学不到任何东西的,但是加入这两个参数后,事情就不一样了,先考虑特殊情况下,如果γ和β分别等于此batch的标准差和均值,那么 不就还原到归一化前的x了吗,也即是缩放平移到了归一化前的分布,相当于batchnorm没有起作用,β和γ分别称之为 平移参数和缩放参数 。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。batchnorm是在输入值和激活函数之间进行的,每次训练给一个批量,然后计算批量的均值方差,但是在测试的时候可不是这样,测试的时候每次只输入一张图片,这怎么计算批量的均值和方差,于是,在训练的时候实现计算好mean var测试的时候直接拿来用就可以了,不用计算均值和方差。后续待更新..............................
如果以上内容没有帮到您,欢迎电话联系我们,或者联系在线客服咨询
只要一个电话
我们免费为您回电