整理一下这两天碰到的问题吧。
- 对 dropout 的理解
训练深度神经网络时,总会遇到两大问题:容易过拟合、费时。dropout可以有效缓解过拟合的发生,在一定程度上起到正则化的作用。
dropout:在前向传播时,让某个神经元的激活值以一定的概率 P 停止工作,这样可以使模型泛化性增强,因为它不会太依赖某些局部的特征。
取平均的作用:dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
减少神经元之间的依赖性: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。
Dropout为什么需要进行缩放:因为我们训练的时候会随机的丢弃一些神经元,但是预测的时候就没办法随机丢弃了。如果丢弃一些神经元,这会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出a有时候输出b,结果不稳定,这是实际系统不能接受的,用户可能认为模型预测不准。那么一种”补偿“的方案就是每个神经元的权重都乘以一个p,这样在“总体上”使得测试数据和训练数据是大致一样的。比如一个神经元的输出是x,那么在训练的时候它有p的概率参与训练,(1-p)的概率丢弃,那么它输出的期望是px+(1-p)0=px。因此测试的时候把这个神经元的权重乘以p可以得到同样的期望。
- resNet 的理解:
增加了short cut,随着网络深度加深,只学习残差。
为什么resnet能解决梯度消失和梯度爆炸。
-
梯度消失和梯度爆炸的原因:梯度消失:因为通常神经网络所用的激活函数是sigmoid函数,这个函数有个特点,就是能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是f′(x)=f(x)(1−f(x))f′(x)=f(x)(1−f(x))。因此两个0到1之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新,这就是梯度消失。
梯度爆炸:由于初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。 -
faster rcnn:
NMS:非极大值抑制。对proposal进行NMS。
NMS的C++实现。
- softmax:
把一些输入映射为0-1之间的实数,并且归一化保证和为1,作为多分类的概率。
-
逻辑回归和线性回归的区别
-
sogmoid函数的公式、函数图像、导数公式。
-
L1 和 L2的区别,分别在什么时候选择 L1 和 L2:
相同点:都用于避免过拟合
不同点:L1可以让一部分特征的系数缩小到0,从而间接实现特征选择。所以L1适用于特征之间有关联的情况。L2让所有特征的系数都缩小,但是不会减为0,它会使优化求解稳定快速。所以L2适用于特征之间没有关联的情况。
- 平滑 L1 损失函数:
- 为什么Faster Rcnn 比 Fast Rcnn快。
Faster R-CNN相比于Fast R-CNN做的改进则是利用RPN来产生候选区域(也即通过RPN产生的Region Proposal映射到feature map中再作为RoI池化层的输
- C++:虚函数、纯虚函数
- C++ main函数执行前,函数执行了哪些操作:
入口函数对运行库和程序运行环境进行初始化,包括堆,I/O,线程,全局变量构造(constructor)等。
执行MAIN完毕,返回入口函数,进行清理工作,包括全局变量析构,堆销毁,关闭I/O等,然后进行系统调用介绍进程。
- 优先队列的底层实现:堆。
- 堆的实现。
- Boost 和 bagging
- KL距离
算法题:
- 寻找最大的K个数
- 求最长递增序列
- 字符串原地反转
- 句子的反转(反转单词顺序)
- 快排
差不多就这些了吧。momenta 昨天电话面的,貌似已经挂了。ε=(´ο`*)))唉