CV/NLP算法面试题汇总

目录

 

什么是正则化?解释一下

度量两个分布的距离的方法

LSTM比普通RNN优势在哪

数据降维的办法

过拟合是什么,如何处理

传统语音增强算法接触过哪些?

反向传播推导

softmax、sigmoid和ReLU的优劣

梯度消失问题和损失函数有关吗?

衡量两个字符串之间距离的方法

给定一个query和一个doc,能想到哪些衡量相关性的方法

判断一个整数是不是回文数


什么是正则化?解释一下

参考:https://charlesliuyx.github.io/2017/10/03/%E3%80%90%E7%9B%B4%E8%A7%82%E8%AF%A6%E8%A7%A3%E3%80%91%E4%BB%80%E4%B9%88%E6%98%AF%E6%AD%A3%E5%88%99%E5%8C%96/

正则化是为了防止过拟合, 进而增强泛化能力。用白话文转义,泛化误差(generalization error)= 测试误差(test error),其实就是使用训练数据训练的模型在测试集上的表现(或说性能 performance)好不好。规则化就是说给需要训练的目标函数加上一些规则(限制),让他们不要自我膨胀。正则化,看起来,挺不好理解的,追其根源,还是“正则”这两字在中文中实在没有一个直观的对应,如果能翻译成规则化,更好理解。

度量两个分布的距离的方法

衡量两个向量之间距离的方法:L1, L2, cosine,或者深度学习里训练MLP作为距离函数,注意normalization

参考:https://my.oschina.net/hunglish/blog/787596

欧式距离、哈曼顿距离、切比雪夫距离、闵可夫斯基距离。

LSTM比普通RNN优势在哪

LSTM只能避免RNN的梯度消失(gradient vanishing),但是不能对抗梯度爆炸问题(Exploding Gradient)。

梯度膨胀(gradient explosion)不是个严重的问题,一般靠裁剪后的优化算法即可解决,比如gradient clipping(如果梯度的范数大于某个给定值,将梯度同比收缩)。
梯度剪裁的方法一般有两种:

1.一种是当梯度的某个维度绝对值大于某个上限的时候,就剪裁为上限。
2.另一种是梯度的L2范数大于上限后,让梯度除以范数,避免过大。

数据降维的办法

主要的方法是线性映射和非线性映射方法两大类。

参考:https://blog.csdn.net/yujianmin1990/article/details/48223001

LDA方法简介
  LDA核心思想:往线性判别超平面的法向量上投影,使得区分度最大(高内聚,低耦合)。
  具体内容见之前博客-“线性判别函数”的Fisher线性判别准则:http://blog.csdn.net/yujianmin1990/article/details/48007589
  LDA优缺点:
  优点:1)简单易于理解
  缺点:2)计算较为复杂
  PCA in Spark:http://blog.selfup.cn/1243.html

过拟合是什么,如何处理

参考:https://zhuanlan.zhihu.com/p/38947625

过拟合,就是模型在训练集和测试集上的表现有差异。一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。其常见原因是训练集数据量不够大或特征中存在噪声。模型是通过对训练集的数据有记忆性而达到了虚高的拟合结果。

处理过拟合方法:

验证:交叉验证(Cross-Validation),K折交叉验证又是最常用的一种。

抑制:Dropout

1. 随机删除处于隐蔽层(Hidden Layer)的神经元,删除比例由人为设定。

2. 通过重复执行随机删除神经元,形成不同结构的神经网络后,取各个网络结果的均值,达到正则化的效果。

抑制:正则化(Regularization)

正则化(regularization),是指在线性代数理论中,不适定问题通常是由一组线性代数方程定义的,而且这组方程组通常来源于有着很大的条件数的不适定反问题。大条件数意味着舍入误差或其它误差会严重地影响问题的结果。正则化可以有效地减少特征共线性、过滤噪音并抑制过拟合。其原理是加入新的偏差来惩罚较大的权重参数。

J(θ)=(Predy-y)2+[θ12+...+θn2]

J(θ)=(Predy-y)2+[|θ1|+...+|θn|]

公式中括号中的部分分别为L2、L1范数,也就是我们用来调整损失函数、惩罚较大的权重参数的部分。在Python中使用L2范数的方式与使用Dropout非常相似,可以在训练模型时直接加入定义好的L2范数。

交叉验证(Cross-Validation)

传统语音增强算法接触过哪些?

语音增强主要包括三个方面:语音降噪、语音分离和语音解混响(可以包含回声消除)问题。根据接收信号的通道个数不同又分为单通道和多通道(特别强调二麦情况,因为与人类双耳对应)等不同情况。基本的算法都是从混合信号和干净信号建立的接收信号模型出发,考虑空间(spatial)、时间(temporal)和谱特性(spectra)三个维度的信息和信号处理问题;当然空间信息需要对应多麦克风情况,单麦克风没有spatial信息可以利用。

反向传播推导

参考:https://blog.csdn.net/u014313009/article/details/51039334

反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是:
(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程;
(2)由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
(3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。
推导:1)计算最后一层神经网络产生的错误 2)由后往前,计算每一层神经网络产生的错误 3)计算权重的梯度 4)计算偏置的梯度

softmax、sigmoid和ReLU的优劣

激活函数概念:在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function。

激活函数的作用:为了增加神经网络模型的非线性。

如上图所示,sigmoid函数也叫 Logistic 函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。

RELU特点:输入信号 <0 时,输出都是0,>0 的情况下,输出等于输入

Relu优点:(1)relu函数在大于0的部分梯度为常数,所以不会产生梯度弥散现象.。而对于sigmod函数,在正负饱和区的梯度都接近于0,可能会导致梯度消失现象。

(2)Relu函数的导数计算更快,所以使用梯度下降时比Sigmod收敛起来要快很多。

Relu缺点:Relu死亡问题。当 x 是小于 0 的时候,那么从此所以流过这个神经元的梯度将都变成 0;这个时候这个 ReLU 单元在训练中将死亡(也就是参数无法更新),这也导致了数据多样化的丢失(因为数据一旦使得梯度为 0,也就说明这些数据已不起作用)。

Sigmod优点:具有很好的解释性,将线性函数的组合输出为0,1之间的概率。

Sigmod缺点:(1)激活函数计算量大,反向传播求梯度时,求导涉及除法。

(2)反向传播时,在饱和区两边导数容易为0,即容易出现梯度消失的情况,从而无法完成深层网络的训练。

梯度消失问题和损失函数有关吗?

梯度消失爆炸的解决方案主要包括以下几个部分。

- 预训练加微调
- 梯度剪切、权重正则(针对梯度爆炸)
- 使用不同的激活函数
- 使用batchnorm
- 使用残差结构
- 使用LSTM网络

两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下,下面分别从这两个角度分析梯度消失和爆炸的原因。

1、从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足,另外多说一句,Hinton提出capsule的原因就是为了彻底抛弃反向传播,如果真能大范围普及,那真是一个革命。
2、提到计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了,原因看下图,左图是sigmoid的损失函数图,右边是其导数的图像,如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。

衡量两个字符串之间距离的方法

参考:https://blog.csdn.net/shijing_0214/article/details/53100992

余弦相似性(cosine similarity)

欧氏距离(Euclidean distance)

编辑距离(edit distance)

海明距离(hamming distance)

海明距离用于表示两个等长字符串对应位置不同字符的总个数,也即把一个字符串换成另一个字符串所需要的替换操作次数。根据定义,可以把海明距离理解为编辑距离的一种特殊情况,即只计算等长情况下替换操作的编辑次数。举个例子来讲,字符串“bob”与“pom”的海明距离为2,因为需要至少两次的替换操作两个字符串才能一致。海明距离较常用与二进制串上的操作,如对编码进行检错与纠错。在计算长字符串的相似性时可以 通过hash函数将字符串映射成定长二进制串再利用海明距离来计算相似性。
海明距离的计算比较简单,通过一个循环来比较对应位置的字符是否相同即可。


给定一个query和一个doc,能想到哪些衡量相关性的方法

答了bag of words, LSTM encode, CNN encode, bi-directional attention等等);面试官最后提到一种match-CNN说楼主可以面试完研究一下

判断一个整数是不是回文数

将整个数取反后看和原来的数是否相同。

class Solution {  
public:  
    bool isPalindrome(int x) {  
        if (x<0)  
            return false;  
        long long int sum =0;  
        long long int origin = x;  
        while(x)  
        {  
            int num = x %10;  
            sum = sum*10 + num;  
            x/=10;  
        }  
        if(sum == origin)  
            return true;  
        else  
            return false;  
    }  
}; 

根据回文数的特点,我们只需要判断左边一半和翻转后的右边一半是否相等即可

class Solution {
public:
    bool isPalindrome(int x) {
        // 负数肯定不是,以及首尾不对称的非0数
        if(x < 0 || (x % 10 == 0 && x != 0))
            return false;

        int rev = 0;
        while ( x > rev){
            rev = rev * 10 + x % 10; //将低位一半的数取反。
            x = int (x / 10);
        }
        //有rev >= x, 奇数情况下需要除去10
        return x == rev || x == int(rev/10); 
    }
};

类似与采用两个指针。在循环体中,不断地比较第i位和倒数第i位,直到遇到最中间的1个数字(输入为奇数个数字)或者遇到最中间的2个数字(输入为偶数个数字)时结束。

bool isPalindrome(int x) {  
  if (x < 0) return false;  
  int div = 1;  
  while (x / div >= 10) {  
    div *= 10;  
  }          
  while (x != 0) {  
    int l = x / div;  
    int r = x % 10;  
    if (l != r) return false;  
    x = (x % div) / 10;  //去掉两边的数
    div /= 100;  
  }  
  return true;  
}  

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值