计算机视觉方向面试宝典总结

学习目标:

马上快答辩了,实在是无心学习,闲来无事,就整理一下,去年找工作以来总结的一些我认为面试常考的东西吧,希望能对今年找工作的你,有所帮助。首先说一下我的研究方向是计算机视觉,我的目标是算法工程师,这里面就很多了,大家根据自己的意愿来吧。

学习内容:

我直接放这里哈

if __name__ == "__main__":
    """
    机器学习类别不平衡问题处理方法: 行欺诈问题,客户流失问题,电力盗窃以及罕见疾病识别,预测结果往往倾向于类别较多的观测数据
    1.采样 
        a.过采样:增加少数样本的数量(复制)
        b.降采样:随机删除多数样本(集成学习)
            -->反例划分为若干个集合供不同学习器使用,这样对每个学习器来看都进行了欠采样,但在全局来看却不会丢失重要信息。
            
    2.阈值移动:  许多模型的输出类别是基于阈值的,例如逻辑回归中小于0.5的为反例,大于则为正例。
                在数据不平衡时,默认的阈值会导致模型输出倾向于类别数据多的类别。
                
    3.调整代价函数或者权重: focal loss 带权重的交叉熵   
    
    优化器:SGD/Momentum/Adagrad/Adam
        SGD: nn.SGD(net.parameters(), lr=0.001, momentum=0.95),SGD为随机梯度下降,每次迭代计算mini_batch数据的梯度,然后对参数经行更新。
        Mimentum: 参考物理学中的动量,前几次的梯度也会参与当前的计算中,但是前几轮的梯度叠加在当前计算中会有一定的衰减
        Adagrad: 在训练过程中自动变更学习的速率, 设置一个全局的学习速率,而实际的学习率与以往的参数模和的开方成反比
        Adam: 利用梯度的一阶矩和二阶矩动态调整每个参数的学习率,经过偏置校正后,学习率都有个确定的范围,是的参数较为平稳。
    
    L1损失函数不可导怎么办:
    当损失函数不可导,梯度下降不再有效,可以使用坐标轴下降法,梯度下降是沿着当前点的负梯度方向进行参数更新,而坐标轴下降法是沿着坐标轴的方向。
    假设有m个特征个数,坐标轴下降法进参数更新的时候,先固定m-1个值,然后再求另外一个的局部最优解,从而避免损失函数不可导问题。
    
    Sift特征提取和匹配的具体步骤:
        A.生成高斯差分金字塔, 
        B.尺度空间构建, 
        C.空间极值点检测, 
        D.稳定关键点的精确定位, 
        E.稳定关键点方向信息分配,
        F.关键点描述,特征点匹配
    
    PCA原理:高维空间投影到低维空间,通过协方差来比较是否有效
    
    SVM: 寻找一个超平面把数据分开
    
    给你一些数据分类:
        1. 特征维度较多:选择SVM   
        2. 样本数量较多选择:逻辑回归     
        3. 缺失值较多:决策树
    
    Sigmoid/Relu:
        Sigmoid: 导数只有在0的附近时有较好的激活性,而在正负饱和区域的梯度趋向于0,从而产生梯度弥散的现象
        ReLU:relu在大于0的部分梯度为常数,所以不会有梯度弥散现象。Relu的导数计算的更快。
             在负半区的导数为0,所以神经元激活值为负时,梯度为0,此神经元不参与训练,具有稀疏性
        ReLU:在0点处不可导 / 反向传播赋值0或者1
    
    LSTM:输入门/遗忘门/输出门
    GRU: 重置门/更新门
    
    目标检测算法分为:
        1. anchor free: 
            CenterNet CornerNet(检测)
        2. anchor base: 
            SSD、YOLOv2-v5、RCNN/SSPNet/Fast RCNN/Faster RCNN/Mask RCNN(定位+分类)
    anchor base
        1. one-stage:直接回归物体的类别概率和位置坐标(无region proposal),时间快,准确率低。(滑动方式产生anchor)
           Yolo算法一共有三个版本,YoloV1可以算作anchor-free类;YoloV2开始引入anchor,YoloV3也使用了anchor。
    
        2. two-stage: 先用算法生成一些列候选框,然后在精修候选框,然后在分类。(RPN产生region proposal)
           RCNN: SS(聚类/边缘检测算子) + CNN + (SVM/Bounding box regression)
           SPPNet: 直接将整幅图片输入SPP + CNN + (SVM/Box回归)
           Fast RCNN: (RoI pooling layer) + CNN + (Softmax/Box回归)
           Faster RCNN: Fast RCNN + RPN
           
    yolo系列是直接当做一个回归问题 / RCNN系列当做一个分类+回归问题
           
    SSD 对小目标效果差:
        reason: 小目标对应的anchor少,data augmentation涨粉很快,是因为crop把小目标变成了大目标
        
    SS(anchor): 纹理/颜色/聚类
    
    yolov3/v4: 
        diffrience
            1. backbone: yolov3 采用darknet53/ yolov4 CSPdarknet 采用了加强的,
               就是加了一个pspnet中的特征金字塔池化,增大感受野spp,三个不同size的pooling做一个concatenate,PANet结构
            2. 激活函数,v3用的leaky relu/v4 mish,在负值的部分并不是完全的截断,允许比较小的负梯度流入,从而保证信息流动
            3. loss不同、v3用的是ciou,iou尺度不敏感 scale不敏感
            4. data preprocess: mosaic
            5. 学习率调整,v4使用余弦退火学习
    
    标签平滑(label smooth):
        在训练样本中,我们并不能保证所有sample都标注正确,如果某个样本标注错误,就可能产生负面印象,
        如果我们有办法“告诉”模型,样本的标签不一定正确,那么训练出来的模型对于少量的样本错误就会有“免疫力”
        采用随机化的标签作为训练数据时,损失函数有1-ε的概率与上面的式子相同,比如说告诉模型只有0.95概率是那个标签
    
    BatchNormalization: 将每一层的输入数据分布规范到服从(0, 1), 0均值, 1方差分布,
    步骤:
        1. 求样本均值
        2. 求样本方差
        3. 数据标准化处理
        4. 平移放缩
    优势: 
        1. 不仅仅极大提升了训练速度,收敛过程大大加快;
        2. 还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;
        3. 另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。
        4. 增加了激活含函数使用的类型
        
    过拟合:训练集上表现很好,测试集上表现很差
    解决方法-1. 数据量不足(扩充数据-剪切平移反转-gan网络生成样本)
            2. 模型复杂(模型剪枝-删除某些神经元-减少网络层数) 
            3. l1正则化/l2正则化
            4. 集成学习
            5. earlystop/dropout
            
    欠拟合:训练集、测试集效果都很差
    解决方法-1. 加入新特征
            2. 减少正则化
            3. 增加模型的复杂度
    
    梯度消失/梯度爆炸 --> 链式法则、梯度反向传播
        变现--> (1.权重不更新 2.模型不稳定/损失函数显著变化 3.训练过程出现NaN)
        梯度消失/梯度爆炸——解决方案:
            1. 调整学习率
            2. 调整网络模型
            3. 调整激活函数
            4. gate门(LSTM/GRU——逻辑门-阈值)
            5. 合理初始化权重
            6. 预训练-finetune
            7. BN
            8. 残差网络
            
    model.train(): 启用BN和Dropout
        如果模型中有BN层(Batch Normalization)和Dropout,在训练时添加model.train()。
        model.train()-->
                    BN: model.train()能够保证BN层能够用到每一批数据的均值和方差。
                    Dropout:model.train()是随机取一部分网络连接来训练更新参数。
    
    model.eval():不启用 Batch Normalization 和 Dropout。
        如果模型中有BN层(Batch Normalization)和Dropout,在测试时添加model.eval()。
        model.eval()-->
                BN: model.eval()是保证BN层能够用全部训练数据的均值和方差,即测试过程中要保证BN层的均值和方差不变。
                Dropout: model.eval()是利用到了所有网络连接,即不进行随机舍弃神经元。
    
    gan系列:
        DCGAN: deep convalution深度卷积网络——生成器是深度神经网络(利用噪声生成图片)
        CGAN: condition给正太分布的随机数加上标签(利用enbedding层将正整数转化成向量*输入的正太分布的随机数=有标签的随机数)  
        ACGAN: DCGAN + CGAN    
        COGAN: 两个生成模型+两个生成模型 
        CycleGAN: 图像风格转化 
        SRGAN: 图像分辨率提升
        
    gan网络判别器的损失函数:
        交叉熵:衡量两个概率分布之间的差异
        公式: -1/N [yi*log(pi) + (1-yi)*log(1-pi)]
             yi—— 表示样本i的label,正类为1 ,负类为0
             pi—— 表示样本i预测为正类的概率

        判别器的损失函数:
            KL散度:衡量两个分布的距离或者相似程度
    
            JS散度:KL散度是不对称的,对于同一个距离,观察方式不同,获取的loss不同,整体的loss趋向于某个特定的方向,这个容易造成GAN模式坍塌,
            生成数据的多样性不足,JS散度在KL散度的基础上进行了修正,保证了距离的对称性。
        
            Wasserstein Loss(地球移动距离):JS散度存在一个严重的问题:两个分布没有重叠时,JS散度为零,而在训练初期,JS散度是有非常大的可能为零的,
            这个距离的直观含义是,将分布r移动到分布g所需要的距离,所以即使是两个分布没有重叠,这个loss也是有值的。
        
            Hinge loss:Hinge loss 是对地球移动距离的一种拓展,Hinge loss 最初是SVM中的概念,其基本思想是让正例和负例之间的距离尽量大,
            后来在Geometric GAN中,被迁移到GAN,对于D来说,只有当D(x) < 1 的正向样本,以及D(G(z)) > -1的负样本才会对结果产生影响也就是说,
            只有一些没有被合理区分的样本,才会对梯度产生影响这种方法可以使训练更加稳定
        
            实际上,无论KL散度还是JS散度,在直接用作loss时,都是难以训练的:由于分布只能通过取样计算,这个loss在每次迭代时都几乎为零
            GAN的训练方法,能够巧妙的解决这个问题:
    
            先训练D,再训练G,二者相互对抗,直到收敛
    
        注意生成器是没有用到标签,判别器告诉他,他有多相似
    
    少样本训练问题:
        1. fine-tune, 大多数预训练模型拥有很多好的表达能力,在小数据上微调就能达到不错的效果
        2. 孪生网络, 少样本学习,类别很多,样本很少,比如说有1000个类,每个类只有5个样本
        3. 数据增强 / 正则化 / 加惩罚系数
        4. 半监督学习
    
    Transformer中的attention和CV中的attention:
        Transformer中的attention: 
            通过目标之间相互计算特征相似度来显示获取(强调的是关系)内积、余弦相似度等等的的确确是计算相似度的,越相似结果越大。
        CV中的attention:
            CV中的SEnet, CBAM指重要性,通过卷积层/全连接层隐式得到(强调的是重要性)通过神经网络完成的(学习得到),即学习得到,可解释性差
    
    Transformer优势:
        优势:卷积是局部信息的提取,CNN需要更大的感受野,所以要不断的增大感受野,堆叠很多层,Transformer可以感受到全局(全局建模能力)
        劣势:计算量爆炸、训练缓慢
    
    为什么transformer能在NLP/CV/ASR任务中大火:
        这儿先说明一下什么是空间分辨率,什么是高维语义信息:
            空间分辨率是依赖于输入图片的尺寸、分辨率,尺寸越大,能看到的细节信息也就越多。高维语义信息是指某一个块图像所代表语义(猫、狗或者某个像素)。
            
        CV领域空间分辨率和高维语义信息的矛盾:
            CNN中的卷积核尺寸一般是3x3或者5x5,其能覆盖的区域非常有限,只看这个小区域是没办法分清这是一条狗还是一只猫的。
            为了能看到更多的语义信息,就需要对特征进行池化操作,降低其尺寸和分辨率(增加感受野)。
            比如左上角的信息如果想跟右下角的信息产生交互,就只能通过池化操作和加深网络的深度,
            通过层层传递的机制,实现信息交互。当空间分辨率下降比较厉害后,细节损失变大,模型的性能也会随之下降。
            所以对于CNN结构而言,空间分辨率和高维语义信息就是,鱼和熊掌,不可兼得。
        
        NLP邻域空间分辨率和高维语义信息的矛盾:
            对于ASR任务(语音识别),由于RNN、LSTM结构的引入,可以不进行池化操作,也能让第1帧的数据跟第10帧的数据进行交互。
            但是第1帧的信息需要经过第2~9帧之后,才能遇到第10帧,他们之间的距离就是10,这个过程中不可避免的会带来信息的遗忘和淡化。
            所以循环神经网络的结构只能一定程度上的缓解问题,不能解决问题。
    
        对于transformer而言:
        softmax(Q*kT/d)*V从注意力公式就可以看到,第1帧如果期望跟第10帧数据进行交互,只需要进行一个向量乘积即可,不需要池化操作,也不需要2~9帧的中间商赚差价。
        这就是为什么,transformer结构中,任意两帧之间的距离是一个常数。
        这也是为什么transformer结构在提出之后,可以在ASR、CV、NLP各个领域中进行霸榜,因为它从根本上解决了空间分辨率和高维语义信息不兼容的矛盾。
    
    """

猜你喜欢

转载自blog.csdn.net/CharmsLUO/article/details/124689232