问题汇总
关于BN 学习的参数,当时回答的是 gamma和beta(rescale和 shift)。面试官指出还有scale,不知道是不是指rescale?
各种秋招提前批都在开始,大佬们都开始收割offer了,神仙打架的算法啊。自己非科班出身,错过了春招实习,明年6月毕业,想着能踏踏实实的去做一份实习转正,就投了两份简历,超级幸运的是都收到了面试的电话。
第一家是之前实习的公司dev部门,面试的小姐姐还在车上,简单的聊了
- 深度学习的发展(经典网络的发展,优缺点)
- 各种网络的应用(目标检测和分割),
- 语音方向(了解很少,卒(´Д` )。
- 上过的深度学习的课程和项目经验
第二家是自己特别特别心仪的公司,投递简历20分钟就收到了hr小姐姐的反馈,hr小姐姐沟通地也超级赞,真的受宠若惊。- 自我介绍
- GAN网络介绍
- cv基础知识:(bn、relu、bagging和boosting)
- 算法:求子集(无重复,递归)& 求子集(有重复,先枚举不重复的数字,枚举每个数出现个数0-k)
Bagging 和Boosting
https://zhuanlan.zhihu.com/p/34534004
两者都属于集成学习,由多个弱分类器组合。每个弱分类器都采用相同的方法训练。
bagging
Bagging | Boosting | |
---|---|---|
训练 | 每次从原始数据集中等概率有放回选择样本,训练得到基分类器。 | 每次抽样的样本分布都不一样。每次迭代都根据之前的结果,增加被错误分类的样本权重。不断学习和提升 |
并行训练 | 串行训练 | |
分类 | 投票表决,每个分类器权重一样 | 投票表决,加权平均,好的分类器权重大 |
应用 | 随机森林(Random Forest) | GBDT,XGBoost,LightGBM |
适用场景 | 解决过拟合问题,建立m个不同的分类器,以到达防止过拟合问题,使模型更准确。 | 单个模型的性能较差,进行boosting,不断改正错误使模型更准确。 |
BN(batch normalization)
-
归一化:统一在0-1之间的统计概率分布。输入信号归一化,样本的输入信号均值接近于0,均方差相比很小。
-
为什么要归一化?
-
引入归一化,后续数据处理方便,加快网络的收敛速度。
-
神经元的激活接近于0或接近于1会保护,梯度为0。避免神经元饱和。保证输出数据中数值较小的值不会被吞食。
-
同一量纲,样本数据的评价标准不一致,需要对其量纲化,统一评价标准
-
神经网络中,经过 $ \sigma(WX+b) $ 矩阵乘法和非线性运算,数据分布可能改变,多层运算后,数据分布变化越来越大,在中间层进行归一化。
-
-
BN:破坏了原来的数据分布。
x ^ i = x i + μ β σ β 2 + ϵ \hat x_i = \frac{x_i + \mu_{\beta}}{\sqrt{\sigma_{\beta}^2} + \epsilon} x^i=σβ2+ϵxi+μβ
重构,对经过上面归一化处理得到的数据进行重构,得到
y i = γ x ^ i + β y_i = \gamma \hat x_i + \beta yi=γx^i+β
其中, γ , β \gamma, \beta γ,β 为rescale和shift,两个可学习参数。 -
BN适用场景:
- 在CNN中,BN在激活函数之前,解决收敛速度慢,梯度爆炸问题。
- 一般也可以加入BN来加快训练速度,提高模型精度。
- 依赖mini-batch,一般batch size比较大,且数据分布较为接近。
- 需要统计mini-batch的一阶(均值)和二阶统计量(方差),不适合动态的网络结构和RNN网络(weight normalization)。
- 基于mini-batch的数据计算均值和方差,不是基于整个训练集,进行梯度计算引入噪声。不适合对噪声敏感的强化学习和生成模型(GAN、VAE)。
ReLU(激活函数)
https://www.zhihu.com/question/29021768
f ( x ) = m a x ( 0 , x ) f(x) = max(0,x) f(x)=max(0,x),经过非线性的activation,传入下一层,非线性激活函数的叠加,使得神经网络可以获取复杂的特征。
作为激活函数,ReLU易于计算,分段线性满足非线性。
当输入大于0,没有饱和区的导数为0的情况,输出值可以无限;导数为1,反向传播时一定程度解决梯度消失。
单侧抑制,小于零的神经元dead。
初始化:he初始化。(MSRA initialization)
缺点:不是zero-centered;<0部分,神经元某些神经元永远不会被激活,相应的参数永远不更新(注意参数初始化,learning rate)
求子集(有重复元素)
输入:[2,1,2,2]
输出:[2],[1],[1,2],[2,2],[1,2,2],[2,2,2],[2,1,2,2]
利用set去重之后,运行效率会低。
-
枚举不同的数字,枚举到数x时,求出x的个数,
-
枚举集合中放入0,1,2,…,k个x,k+1种情况。
-
枚举完最后一个数字,选定了一个集合,集合加入答案中。
复杂度分析:
不同子集最多有 2 n 2^n 2n,存储答案需要 O ( n ) O(n) O(n),时间复杂度, O ( n 2 n ) O(n2^n) O(n2n)
class Solution{
public:
vector<vector<int>> ans;
vector<int> path;
vector<vector<int>> subsetWithDup(vector<int> &nums){
sort(nums.begin(),nums.end());
dfs(0,nums);
return ans;
}
void dfs(int u, vector<int> &nums){
if(u == nums.size()){
ans.push_back(path);
return;
}
int k = u;
while(k<nums.size()&&nums[k]==nums[u]) k++;
dfs(k,nums);
for(int i=u;i<k;i++){
path.push_back(nums[i]);
dfs(k,nums);
}
path.erase(path.end()-(k-u),path.end());
}
};
总结反思
面试的是自己特 别心仪的公司,投递简历20分钟就收到了hr小姐姐的反馈,hr小姐姐沟通地也超级赞,真的受宠若惊。因为之前下午的面试有点受打击,晚上自我介绍都磕磕巴巴,特别巧的是这几天在读的论文可能还是这个组发的,所以心都要从嗓子眼跳出来了。之后要开始更多的面试,所以针对这次特别特别重要的面试,总结了一下主要的问题:
- 深度学习基础不扎实。
- 面试官很耐心的指出无论做什么方向,基础的知识都要很扎实,
- 学习不能停下来,在学习的时候也要问一问为什么呢,这样之后才可以灵活的运用。
- 算法相关要多准备
- 刷题的同时要能清楚的说出解题思路和分析过程
- 在实际项目中高效的算法很有用
- 面试时要自信,不能怕出错,多沟通,及时反馈问题和疑问。
- 自己在面试的过程中,信号不太好,所以有的时候面试官和我互相没听见对方说什么,所以还是要多沟通一些
- 面试时间很短,但收获还是很多