非常暴露问题的一场面试,把我薄弱的基础和最近浮躁的学习状态揭露无疑。
直接上题目(附上相关的知识点以便以后复习):
-
介绍一下自己
-
你说你用过LSTM模型,请讲一下计算遗忘门的时候,总共有多少需要学习的参数:
思路:矩阵 X < t > X^{<t>} X<t> 的形状是 ( n x , m ) (n_x, m) (nx,m), a < t > a^{<t>} a<t>的形状是 ( n a , m ) (n_a, m) (na,m),因此stack以后的矩阵 [ a < t − 1 > , X < t > ] [a^{<t-1>}, X^{<t>}] [a<t−1>,X<t>] 的形状是 ( n x + n a , m ) (n_x+n_a, m) (nx+na,m)。由于 c < t > c^{<t>} c<t>与 a < t > a^{<t>} a<t>同形状,因此 W f W_f Wf的形状为 ( n a , n x + n a ) (n_a, n_x+n_a) (na,nx+na),要估计的参数数为 n a × ( n x + n a + 1 ) n_a \times (n_x+n_a + 1) na×(nx+na+1) (1 for bias) -
你刚才介绍了马尔可夫蒙特卡洛方法的原理,那你应该比较熟悉马尔可夫链的概念,请讲一下隐马尔可夫模型中状态转移矩阵的作用 (内心os: 什么,那是什么…一脸懵逼… 回来以后翻了《统计学习方法》才知道他在问的是什么)
思路: 状态转移矩阵由一系列概率构成,矩阵大小是N × \times ×N (N是所有可能的状态总数), a i j a_{ij} aij表示时刻 t 处于状态 q i q_i qi的条件下在时刻 t+1 转移到状态 q j q_j qj的概率。 在前向和后向算法的计算中都涉及到状态转移矩阵。
-
关于蛋白质结构这方面了解多吗,用过结构分析的软件吗?
讲了本科和蛋白质结构分析扯不上边的毕设,第二个问题的回答直接诚实又粗暴:没有
-
对python熟悉吗,python2 和python3里的
map()
函数有什么区别?思路: python2里
map()
函数直接返回一个list,python3里返回一个迭代器对象(iterable) -
讲一下python里generator的概念。 (内心os: 听说过这个概念但从来没有好好查过。后悔没有好好从基础学起,一上来就用python做数据分析,做ML,果然是不可取的)
思路:数据量很大时,一次性生成所有数据的list的空间代价比较大,generator可以一边循环一边推算,它的
.next()
方法推算出后一个元素。创建generator的方法:用()取代列表生成式的[]; 用
yield()
函数参考
https://blog.csdn.net/wxyangid/article/details/79514040 -
用过Batchnorm吗,我们为什么要使用Batchnorm? Batchnorm是针对哪一个维度做的normalization?
思路: 可以用来解决梯度消失和梯度爆炸的问题(此处面试官附加了一个问题,什么是梯度消失和梯度爆炸,参考:https://blog.csdn.net/qq_25737169/article/details/78847691 ),使训练出来的网络泛化性能更好。 随后我想起NG的课堂作业上,BN的代码中给的axis = 3,input的shape是 (m, n_H, n_W, n_C),小心翼翼地回答到:Batchnorm是在channel维度上做的… 在面试官耐心又无奈地指导下,知道了BN是对一个batch做的normalization(不然怎么叫BatchNorm呢),而且对每个channel各自做(原来axis=3的含义是这样的)。面到这基本就已经凉了
-
给你一个可以生成(1到7) 7个数的随机数生成器,每个数的概率都是1/7,不限方法,你怎么用它来造出一个能生成(1到10)是个数的随机数生成器?
思路: 想了半天绞尽脑汁说 使用这个随机数生成器n次,n要尽可能大,根据中心极限定理,这n次的平均值会服从一个均值和方差都已知的正态分布,通过曲线下面积把分布分成10等份,对应9个平均值取值的分界点… (面试官说这算是一个近似解法,而且操作上不现实,并且提示更好的答案只需要取两次,我还是没想到)
接下来是正解,用到了下采样: 取两次随机数,第一次记为a,第二次记为b,那么 7 a + b 7a+b 7a+b 可以涵盖从(8到56) 的所有整数,且每个取值的概率都是相等的, 接下来只要随意地运用下采样方法就行,比如把所有不在 $(10, 50] $ 这个区间的结果舍弃,即如果出现不在这个区间的情况就重新采样,随后这个40个取值就可以分成10份… -
甩来一张纸,写一下快排吧(内心os: 补刀! 真的是补刀!原来这一行所有的岗位都需要面算法是真的)
思路:
# 所有left与right比较都带=号, 所有与pivot的比较都不带=号
def quicksort(A, start, end):
if not A or start >= end:
return
left = start
right = end
pivot = A[(left+right)//2]
while left <= right:
while (left <= right) and A[left] < pivot:
left += 1
while (left <= right) and A[right] > pivot:
right -= 1
if left <= right:
A[left], A[right] = A[right], A[left]
left += 1
right -= 1
quicksort(A, start, right)
quicksort(A, left, end)
总结: 要进军深度领域,不仅要继续向前学习更加复杂的模型,更要回过头去把理论基础和对工具的使用好好掌握一下,另外,需要好好学习数据结构和算法。