BIGO 计算机视觉BIGO面经总结

  • MobileNets V1 与 MobileNets V2
    MobileNets V1:

    1. 深度可分离卷积,kernel_size x kernel_size + 1 x 1 x C_out
    2. 两个全局超参数来平衡延迟性和准确性;
      (1)宽度乘数:对一个给定的层,输入通道数变成,输出通道数变成。
      (2)分辨率乘数:将其应用于输入图像,缩放输入图片大小

    MobileNets V2:

    1. 引入残差结构,先升维再降维,增强梯度的传播
    2. 去掉 Narrow layer(low dimension or depth) 后的 ReLU,保留特征多样性,增强网络的表达能力(Linear Bottlenecks)
    3. 网络为全卷积的,使得模型可以适应不同尺寸的图像;使用 RELU6(最高输出为 6)激活函数,使得模型在低精度计算下具有更强的鲁棒性
image.png
  • python 2 与 python 3 的区别
  1. print:在 Python 2 中,print 是一条语句,而 Python3 中作为函数存在
# py2
print("hello")  # 等价 print  ("hello")

#py3
print("hello")
前者是把 ("hello")当作一个整体,
而后者 print()是个函数,接收字符串作为参数。
  1. 编码:Python2 的默认编码是 asscii,Python 3 默认采用了 UTF-8 作为默认编码

  2. 字符串:在 Python2 中,字符串有两个类型,一个是 unicode,一个是 str,前者表示文本字符串,后者表示字节序列;在 Python3 中两者做了严格区分,分别用 str 表示字符串,byte 表示字节序列

  3. True 和 False:True 和 False,在python 2中,是两个全局变量的名字,可以被修改,而在python 3中,变为关键字,用于指向两个固定对象,不允许被重新赋值

  • “==”的实现机制
    ==是值比较

  • 多任务学习中每部分损失函数的权重确定

    1. 损失合并:为多个任务定义单个损失函数。虽然单个任务有定义明确的损失函数,但多个任务会带来多个损失。直接将所有的损失相加。发现,当一个任务趋同于好的结果时,其他任务看起来相当糟糕。造成这个现象的原因很简单,因为损失的规模是如此的不同,以至于一个任务主导了整个损失,而其余的任务没有机会影响共享层的学习过程。
      一个快速解决办法是用一个加权和替代损失的直接相加和,使所有的损失对共享层的影响大致相同

    2. 调整学习速率:选择较高的学习率会导致其中一个任务的dying Relu,而使用较低的学习率会导致另一个任务的收敛缓慢。那我们该怎么办?我们可以让每个特定于任务的子网调整为单独的学习速率,并将共享子网调整为另一个速率。

    3. 使用评估作为特征:一旦我们通过了创建预测多个任务的 NN 的第一个阶段,我们可能会将某个任务的评估作为另一个任务的结果

  • BN 针对的是哪个维度:通道维度
    BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

    对于CNN来说,特征是(N,H,W,C),我们需要把数据变成 (NHW,C)。

image.png
  • 训练的时候为什么要分成训练集、验证集


    image.png

    训练集是用来训练模型内参数的数据集;
    验证集用于调整超参数, 根据几组模型验证集上的表现 决定哪组超参数拥有最好的性能, 同时用来监控模型是否发生过拟合。
    测试集用来评价模型泛化能力, 即之前模型使用验证集确定了超参数, 最后使用一个从没有见过的新数据集来判断这个模型是否工作。

  • BN在训练和测试的时候分别是怎么操作的

    1. 在训练过程中,只能计算当前batch样本上的均值和方差;
    2. 在训练结束时候,网络的mean和std就固定住了。因为测试时计算batch的均值方差不适合,因此会直接拿训练过程中对整个样本空间估算的mean和var来使用(对训练过程中每个batch的mean,var做指数加权平均来将batch上的mean和var近似成整个样本空间上的mean和var)。
  • 空洞卷积(Dilated / Atrous Convolution)
    空洞卷积广泛应用于语义分割与目标检测等任务中。
    对于普通的卷积层,其为了减少网络的参数量,卷积核通常旋转较小的 1 x 1,3 x 3 感受野大小。小卷积核使得网络提取特征时的感受野区域有限,但是增大感受野的区域又会增加网络的参数量和计算代价。

    空洞卷积的提出较好地解决了这个问题,空洞卷积在普通卷积的感受野上增加了一个 dilation rate 参数,用于控制感受野区域的采样步长。

    当 dilation rate 为1时,空洞卷积退化为普通的卷积;
    当 dilation rate 为2时,感受野每两个单元采样一个点。

    空洞卷积感受野计算:F = F + (F -1)(r - 1),K 为原始卷积核大小,r 为空洞卷积参数空洞率
    然后带入到标准卷积输出大小计算公式就能得到通过空洞卷积后的规模:N = (W - F + 2P) / S + 1

image.png
  • 上采样方法都有哪些?
    (1)基于线性插值的上采样:
    最近邻算法,双线性插值算法,双三次插值算法
    (2)基于深度学习的上采样:
    转置卷积,PixelShuffle(亚像素卷积,CVPR2016),PixelShuffle(亚像素卷积,CVPR2016),Meta-Upscale(任意尺度缩放,CVPR2019),CAPAFE(内容关注与核重组,思路新颖,ICCV2019)

    转置卷积(Transposed Convolution 或 Fractionally Strided Convolution,或者反卷积/Deconvolution):并不能恢复成原卷积的输入,通过在输入之间填充大量的padding来实现高宽大于输入高宽的效果,从而实现向上采样的目的。

image.png

只讨论 h = w 的情况:
(1) o + 2p - k 为 s 倍数时:
o = (i -1) * s + k - 2 * p
(2) o + 2p - k 不为 s 倍数时:
a = (o + 2p - k) % s
o = (i - 1) * s + k - 2 * p + a

  • FCN
    (1)FCN对图像进行像素级的分类,从而解决了语义级别的图像分割问题。与经典的CNN在卷积层使用全连接层得到固定长度的特征向量进行分类不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。
    (2)FCN将传统CNN中的全连接层转化成一个个的卷积层。

  • 编程


    image.png
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        dp = [0] * len(nums)
        dp[0] = nums[0]
        for i in range(1,len(nums)):
            if dp[i-1] <= 0:
                dp[i] = nums[i]
            else:
                dp[i] = dp[i-1] + nums[i]
        return max(dp)
image.png
image.png
image.png
class Solution:
    def rearrangeString(self, s: str, k: int) -> str:
        from collections import Counter
        import heapq
        if k <= 1: return s
        c = Counter(s)
        n = len(s)
        heap = [(-v, k) for k, v in c.items()]
        heapq.heapify(heap)
        res = ""
        while heap:
            tmp = []
            for _ in range(k):
                if not heap:return res if len(res) == n else ""
                num, alp = heapq.heappop(heap)
                num += 1
                res += alp
                if num != 0:
                    tmp.append((num, alp))
            for t in tmp:
                heapq.heappush(heap, t)
        return res
  • 评价指标
    准确率,召回率,F1,TPR,FRR
    P-R曲线:横坐标是召回率,纵坐标是准确率
    ROC曲线:横坐标是FPR,纵坐标是TPR。

    AUC是POC曲线下的面积,面积的计算可以通过梯形去插值计算
    image.png

一般情况下,模型评估选择P-R或者ROC没啥区别,但是当正样本的个数严重少于负样本个数时,P-R曲线相比较于ROC曲线能够更加直观的表现模型之间的差异,更加合适。

当正样本比例减小时,ROC曲线变化不明显,但是P-R曲线的纵坐标,即准确率出现了明显的衰减。原因是,当样本严重倾斜时,我们假定召回率不变,那么表现较差的模型必然会召回更多的负样本,那么FP(假正例)就会迅速增加,准确率就会大幅衰减。

  • 数据不平衡怎么办

    1. 从数据角度:
      (1)主动获取:获取更多的少量样本数据
      (2) 算法采样:上采样、下采样、生成合成数据
      (3)数据增强
      (4)改变权重;惩罚因子
    2. 从评价指标:
      (1)谨慎选择AUC作为评价指标
      (2)不要只看Accuracy
  • 梯度消失和梯度爆炸的原因
    使用标准化初始w,那么各个层次的相乘都是0-1之间的小数,而激活函数f的导数也是0-1之间的数,其连乘后,结果会变的很小,导致梯度消失。若我们初始化的w是很大的数,w大到乘以激活函数的导数都大于1,那么连乘后,可能会导致求导的结果很大,形成梯度爆炸。

  • sigmoid和relu区别,为什么现在都用relu而不用sigmoid
image.png
image.png
  • ResNet 优缺点

    1. 优点:使前馈/反馈传播算法顺利进行,结构更加简单;恒等映射增加基本不会降低网络的性能。
    2. 缺点:训练时间长
  • L1,L2正则化的区别
    (1)L1是模型各个参数的绝对值之和;
    (2)L2是模型各个参数的平方和的开方值;
    (3)L1会趋向于产生少量的特征,而其他的特征都是0,产生稀疏权重矩阵;
    (4)L2会选择更多的特征,这些特征都会接近于0。

  • 交叉熵和散度之间的关系


    image.png

参考资料:
https://blog.csdn.net/cui841923894/article/details/82632639
https://www.cnblogs.com/lyr2015/p/8718104.html
https://blog.csdn.net/lujiandong1/article/details/53320174?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
https://www.jianshu.com/p/f86002b7fcc4
https://blog.csdn.net/b876144622/article/details/80009867
https://zhuanlan.zhihu.com/p/95619637
https://blog.csdn.net/qq_36269513/article/details/80420363
https://blog.csdn.net/weixin_42137700/article/details/92760531
https://blog.csdn.net/qq_24502469/article/details/104737427
https://www.sohu.com/a/294959901_114877

你可能感兴趣的:(BIGO 计算机视觉BIGO面经总结)