阿里云面经之实习一面

阿里云一面

  • 1、自我介绍
  • 2、DNN、CNN和RNN的区别?

一开始深度学习是全连接的DNN,反映出来的缺点是参数量爆炸。另外图像固有的局部信息没有得到充分应用,如眼睛、鼻子等。DNN还有一个问题是,无法对时间序列上的变化进行建模。然而样本出现的顺序对自然语言处理等应用尤为重要。

CNN将图像中的概念和网络技术结合在一起,对于CNN来说,上层神经元和下层神经元不是完全连接在一起的,而是通过卷积核作为媒介,同一个卷积核在图像中所有位置是共享的,图像通过卷积之后的仍然保持着原来的相对位置关系。CNN模型限制了参数数量,挖掘了局部特征。

普通的DNN或者CNN中,每层的神经元信号只能向上一层传播,样本处理在任何时候相互独立,因此叫做前向传播网络。而在RNN中,神经元的输出在下一个时间戳直接作用到自己本身。既,第i个神经元在第m时刻的输入,除了第i-1个神经元在m时刻的输出外,还有第i个神经元在m-1时刻的输出。所有历史结果作用于输出,达到了时间序列建模的目的。

RNN的深度是时间的深度,同样存在梯度消失(发生在时间轴上)的问题(所有历史共同作用只是一个理想情况)。为了解决这一问题,LSTM应运而生,通过门的开关实现记忆功能,并防止梯度消失(不太明白)。另外还有双向RNN之类的可以接收未来信息。

  • 3、神经网络训练时loss为什么有些时候会爆炸?有些时候会消失?

我解释为loss爆炸有几个原因,(1)有时候有坏数据网络会爆炸;(2)学习率太高,网络不稳定可能会爆炸。

解释loss消失的时候,我说网络输出层的损失肯定跟网络最后几层关联性比较大,和前面几层的关联性比较小,所以网络的loss传到前面梯度就会很小。

面试官最后总结了一句,其实loss的爆炸和消失本质上都是一个原因,就是loss求导的问题。

loss消失,看网上有些回答:

对于sigmoid函数来说,在反向传播时,每过一层,系数大约衰减0.25:

sigmoid(t) = \frac{1}{\left ( 1+e^{-t} \right )},         求导      {sigmoid(t)}' = \frac{e^{-t}}{(1+e^{-t})^{2}}

可以看到,sigmoid导数的最大值是0.25(t=0时)。

还有一些回答:

1、如果用标准化初始化权重,则权重都在0~1之间,求导根据链式法则,连乘导致系数非常非常小。如果初始化的权重比较大,加上激活函数的作用大于1的话,连乘起来梯度会越来越大。(这个回答应该比较标准,重点在于两者的共同性)

2、对于目标函数,通常存在梯度变化很大的一个“悬崖”,在此处求梯度,很容易导致求解不稳定的梯度爆炸现象。

  • 4、怎么解决梯度消失的问题?

我的回答是·1、提高学习率;2、增加skip跳转连接。

网上说解决梯度爆炸问题可以通过:梯度截断,增加正则项,良好的权值初始化方法(如He初始化),BN(防止训练时中间某一层分布发生变化导致梯度的消失或者爆炸)。

解决梯度消失问题可以通过:优化激活函数。

  • 5、kmeans不同损失函数对结果有什么区别?

回答得真的是乱七八糟,因为我真的不知道这是什么?kmeans还有损失函数?

查到一个损失函数是,每个样本点到中心的距离     J(a_{1},a_{2},\cdot \cdot \cdot ,a_{k}) = \frac{1}{2}\sum_{j=1}^{k}\sum_{i=1}^{n}(x_{i}-a_{j})^{2}

求偏导得到中心的更新方式   a_{j} = \frac{1}{n_{i}}\sum_{i=1}^{n_{i}}x_{i}

我觉得这道题提问的本质应该是想问不同损失函数在机器学习过程中带来的影响。找到一篇阿里云云栖号的文章就是讲这个的。

原文地址  https://www.jianshu.com/p/b715888f079b

(1)首先是均方差MSE和平均绝对误差MAE

MSE = \frac{\sum_{i=1}^{n}(y_i-y_i^p)^2}{n},  MAE = \frac{\sum_{i=1}^{n}\left | y_i-y_i^p \right |}{n}

利用均方差更容易求解,但平方绝对误差则对于异常值更稳健。当我们对所有观测值进行处理时,如果利用MSE进行优化则我们会得到所有观测的均值,而使用MAE则能得到所有观测的中值。与均值相比,中值对于异常值的鲁棒性更好,

但MAE也存在一个问题,特别是对于神经网络来说,它的梯度在极值点处会有很大的跃变,即使很小的损失值也会产生很大的误差,这很不利于学习过程。为了解决这个问题,需要在解决极值点的过程中动态减小学习率。而MSE的梯度随着损失函数的减小而减小,这一特性使得它在最后的训练过程中能得到更精确的结果。

在实际训练过程中,如果异常值对于实际业务十分重要需要进行检测,MSE是更好的选择,而如果在异常值极有可能是坏点的情况下MAE则会带来更好的结果。

(2)Huber损失——平滑平均绝对误差

Huber损失函数克服了MAE和MSE的缺点,不仅可以保持损失函数具有连续的导数,同时可以利用MSE梯度随误差减小的特性来得到更精确的最小值,也对异常值具有更好的鲁棒性。

而Huber损失函数的良好表现得益于精心训练的超参数δ。

(3)Log-Cosh损失函数

Log-Cosh损失函数是一种比L2更为平滑的损失函数,利用双曲余弦来计算预测误差

 

其中,双曲余弦函数长这样

\cosh (x)=\frac{e^{x}+e^{-x}}{2},是一个大于1的函数,所以log大于0.

可以在拥有MSE优点的同时也不会受到异常值的太多影响。它拥有Huber的所有优点,并且在每一个点都是二次可导的。二次可导在很多机器学习模型中是十分必要的。

但是Log-cosh损失并不是完美无缺的,它还是会在很大误差的情况下梯度和hessian变成了常数。

(4)分位数损失函数

预测出一个取值区间而不是一个个具体的取值点

90%的预测值起上下边界分别是用γ值为0.95和0.05计算得到的。

  • 6、给你一个1T的int型数据,和一个8G的电脑,你怎么找出这些数据中的中位数?

我的回答有点傻,说了快速排序的方法,没考虑内存,因为也不知道该怎么回答。

正确答案搜了一下,大概是(1)把int型的0~2^{32}-1种数分为几个区段,一个区段负责一个范围的计数;(2)遍历一遍数组,每遍历到一个数,它属于哪个区间就往哪个区段计数加一;(3)从前往后累加,如果一旦超过0.5T,记下到前一个区段为止的数量n;(4)删掉所有内存,为这个区段的每一个数创造一个计数空间,再次遍历数组,按时从前往后累加,若到某一个数n+m>=0.5T,则该数为中位数。(当然如果数字不重复的话就更快,但是一个T不可能不重复)

原文  https://blog.csdn.net/weixin_30723433/article/details/96788227


突然想到快速排序有更好地思路,也许没有那么快,像上面那个方法只需要遍历两次,但是简单有效。

(1)还是随机挑一个数,遍历数组对大于和小于这个数的数字计数,哪一边超过0.5T说明,中位数位于这个区间,一次少一半。O(log_{2}n)

(2)每次处理完之后遍历数组,把中位数所在的区间留下,其它删掉,记下另外一边的数量。

(3)循环直到,中位数所在区间小于8个G了,然后就快乐的快速排序了。

时间复杂度稍微有点高,大概是O(2nlog_{2}n),最前面那个2是因为排序时需要遍历一遍数组(虽然会逐步小于n),筛选区间时需要还遍历一遍数组。


  • 7、树的深度搜索和广度搜索用的什么数据结构?

栈先进后出,适合从根部一直找到叶节点再从叶节点开始取值。

队列先进先出,适合从同一层的节点加进去再从头一个一个取。

  • 8、问你现在处理的最多的数据大概有多少?

60000的COCO数据那样,接着问给你多一千万倍的数据,还是现在这个硬件,你怎么处理?

我回答的是集成学习的方式,用多个弱分类器构建强分类器。但这是基于有多几台电脑的情况。或者得一遍一遍训练,得到多个模型。

说明训练出来得到分类结果之后,怎么进行最后的集成?

我回答了三种方式:(1)投票机制。每个分类器给一个结果进行投票;(2)每个分类器对每个类的概率进行加和;(3)按照每个分类器对验证集的验证精度,对每个分类器制定一个权重,最后将结果按权相加。

网上的专业答案(感觉很有道理):

(1)渐进式训练,迁移学习等;

(2)抽取小样本,对算法做快速地抽查、看到结果在前后的变化(相对于模型技巧,做一个数据大小的敏感性分析。或许,对于你的随机小样本,有一个天然的边际效应递减分水岭。越过这个关口,继续增加的数据规模带来的好处微乎其微。)

(3)python中pandas可以流式处理数据(不太明白):转数据类型,字符唯一值映射什么的。

  • 9、检测流程是什么?

数据输入网络,提取特征,如果是两分支的话,会有一个区域提取的环节,之后是全连接层的分类回归。

接着问,提取特征提取的是什么特征?怎么提取特征?

这段回答得乱七八糟,好像一直不明白面试官在说什么,一直被打断。

我的回答大概是提取抽象的本质特性,通过神经元乘以权重。

网上搜了一下答案,大概也是设计卷积核呀什么的,把RGB的信息叠加滤波成为特征量。

  • 10、手撕代码

给你一个数组[2,1,3,0,0,1,2]

每个位置上面的数代表到了这个位置最多可以走几步,求从第一个能不能走到最后一个?

我刚开始用了递归的方法,每次传该数下一步的位置开始的数组。后来让我分析时间复杂度,我发现时间复杂度有点高,应该有O(n^{2})。其实递归会带来很多重复计算,比如2可以走3,也可以走1再走3,3这里就重复计算了。

我问面试官可不可以用辅助数组解决这个重复问题,他说优先考虑时间优先,辅助空间都可以用。这个之后再自己编编看。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章