今日头条推荐系统算法岗日常实习面试经验
时间:2019年3月27日 地点:校内视频面试
一面
深度学习基础
-
Adam的原理、公式 (没答上来)
找了一个简书的讲解,挺好的,有需要的同学可以移步简单认识Adam优化器
-
Dropout的原理 (为什么训练时有dropout测试时没有dropout,这样会发生scale的偏移吗)
答:不会,因为训练时dropout机制会把dropout_rate = p的输出乘以1/(1-p)
-
Batch Normalization的原理
答:在mini_batch上进行而不是在整个数据集上进行。在训练集上有BN测试集上没有BN,这样不会发生数值上的偏移,道理类似dropout,即记录下训练集上的BN参数(均值、标准差、\beta、\gamma)作为网络参数的一部分。
-
为什么要用ReLU替代tanh/sigmoid/softmax
答:ReLU求导的值要么是0要么是1,不会引起梯度消失或梯度爆炸
-
ResNet
答:通过x + f(x)的结果,让深层网络获得不差于浅层网络的学习能力,从而允许网络变得更深
算法题
-
给定数组nums和整数target,求最少用nums中的整数多少次,使得这些数之和为target。比如给定nums = [3, 5, 12], target = 13, 答案为3 (13 = 3 + 5 + 5)
答:BFS求最少的组合(我答得太啰嗦了,面试官就没让写代码)
标准答案是动态规划,其实是动态规划里面很经典的问题,当时没想起来(汗)
附动态规划的题解
class Solution {
public int coinChange(int[] nums, int target) {
int[] dp = new int[target + 1];
Arrays.fill(dp, 0x3f3f3f3f);
dp[0] = 0;
Arrays.sort(nums);
int i = 0;
for (i = 1; i <= target; ++i) {
for (int c: nums) {
if (i >= c) {
dp[i] = Math.min(dp[i], dp[i-c] + 1);
} else {
break;
}
}
}
return dp[target] == 0x3f3f3f3f? -1: dp[target];
}
}
结果是面试官换了一道题
-
给定一个Y形链表和Y头部两个头指针,求第一个汇合点
答:用两个指针r1, r2从两个头指针开始遍历(不妨记两个头指针为l1, l2),计算从l1, l2出发Y形链表的长度len1, len2. 不妨设len1 < len2, 则先将l2移动(len2 - len1)次,再将l1, l2同步移动,直到l1 == l2.
二面
-
矩阵求逆是如何操作的?【答:高斯消元】描述过程?【答:左边一个A,右边一个I,消消消,消到左边的A变成I,右边的I就变成了A的逆矩阵】为什么可以这样算?如何证明?
答:高斯消元由矩阵行变换组成,矩阵行变换等价于左乘另外一个系数矩阵,所以当左边的A变到I,A就左乘了A的逆矩阵,同时右边的I也左乘了A的逆矩阵得到A的逆矩阵。这就是高斯消元法的原理。(马后炮分析,面试的时候没答上来,是面试官提示的) -
一个负载均衡里面产生的数学问题:现在有两台服务器A和B,后台算法是A和B都有1/2的概率被访问,如果访问的服务器宕机,则会以1/2的概率继续请求两个服务器。现在服务器B宕机了,求平均访问的次数?
答:这是一个随机变量求期望的问题。记平均访问的次数为p,
p = 1/2 * 1 + (1/2)^2 * 2 + (1/2)^3 * 3 + … + (1/2)^n * n + …
令q = 1/2 * p = (1/2)^2 * 1 + (1/2)^3 * 2 + … + (1/2)^n * (n-1) + …
故p = 2 (p - q) = 2 * [1/2 + (1/2)^2 + (1/2)^3 + …] = 2 * (1/2)/[1 - (1/2)] = 2
-
merge两个有序数组,写代码,写测试用例,