Py学习  »  机器学习算法

粉丝福利,免费送书啦-《百面深度学习:算法工程师带你去面试》

深度学习与NLP • 3 年前 • 350 次点击  


各大厂的秋招在即,相信面试算法岗的童鞋已经摩拳擦掌,跃跃欲试。小编特别精选出5道AI经典面试题送给大家,皆选自畅销书《百面深度学习:算法工程师带你去面试》,望在刷题之路上助你一臂之力!


本次携手人民邮电出版社给大家免费送上5本《百面深度学习:算法工程师带你去面试》。绝对真实有效,绝对真实有效。

参数方式:

    1、转发本文到朋友圈集赞。

    2、消息栏回复:朋友圈集赞截图+“百面深度学习送书”+集赞具体数量。

    3、8月9号24点截止,根据集赞具体数量排序,top-5送书哈。



需要朋友也可自行购买:


问题1:卷积层的输出尺寸、参数量和计算量。

假设一个卷积层的输入特征图的尺寸为 ,卷积核大小为 ,步长为 ,则输出特征图的尺寸 如何计算?如果输 入特征图的通道数为 ,输出特征图的通道数为 ,在不考虑偏置项 (bias)的情况下,卷积层的参数量和计算量是多少?


难度级:★★☆☆☆


分析与解答

 ■ 输出尺寸

假设在卷积核的滑动过程中,我们对输入特征图的左右两侧分别进行了 列填充,上下两侧分别进行了 行填充,填充后的特征图尺寸为 , 则输出特征图的尺寸为

上述公式在步长 时,可能会出现非整数情况,此时,很多深度学习框架会采取向下取整的方式,放弃输入特征图的一部分边界数据,使得最终的输出特征图的尺寸为

例如,Caffe和PyTorch会放弃输入特征图的左侧和上侧的一部分数据, 使得卷积核滑动窗恰好能到达最右下角的点。

有些深度学习框架(如TensorFlow、Keras)在做卷积运算时无法显式指定输入特征图的边界填充尺寸(当然可以在做卷积之前手动填充),只能选择以下几种预先定义好的填充模式。

● 若选择padding=same 模式,则会在输入特征图的左右两侧一共填充 列,上下两侧一共填充 行,最终的输出特征图的尺寸为

例如在TensorFlow中,如果 为偶数,则在输入特征图的左右两侧或上下两侧填充相等数目的列 / 行;如果为奇数,会让右侧 / 下侧比左侧 /上侧多填充一列/行。

●  若选择padding=valid模式,则不会对输入特征图进行边界填充, 而是直接放弃右侧和下侧卷积核无法滑动到的区域,此时输出特征图的尺寸为

 ■ 参数量

卷积层的参数量,主要取决于每个卷积核的参数量以及卷积核的个数。在这里,每个卷积核含有 个参数,而卷积核的个数即输出特征图的通道个数 ,因此参数总量为

 ■ 计算量

卷积层的计算量,由卷积核在每个滑动窗内的计算量以及整体的滑动次数决定。在每个滑动窗内,卷积操作的计算量大约为 ,而卷积核的滑动次数即输出特征图的数据个数,也就是 ,因此整体的计算量为

一般情况下,有 ,因此上式可以近似简写为


问题2:在循环神经网络中如何使用Dropout?


难度级:★★★☆☆


分析与解答

首先思考,Dropout是否可以直接应用在循环神经网络中呢?经典的Dropout方法会在训练过程中将网络中的神经元随机地丢弃。然而,循环神经网络具有记忆功能,其神经元的状态包含了之前时刻的状态信息,如果直接用Dropout删除一些神经元,会导致循环神经网络的记忆能力减退。另外,有实验表明,如果在循环神经网络不同时刻间的连接层中加入噪声,则噪声会随着序列长度的增加而不断放大,并最终淹没重要的信号信息。

在循环神经网络中,连接层可以分为两种类型:一种是从t时刻的输入一直到t时刻的输出之间的连接,称为前馈连接;另一种是从t时刻到t+1时刻之间的连接,称为循环连接。如果要将Dropout用在循环神经网络上,一个较为直观的思路就是,只将Dropout用在前馈连接上,而不用在循环连接上。注意,这里Dropout随机丢弃的是连接,而不是神经元。

然而,只在前馈连接中应用Dropout对于过拟合问题的缓解效果并不太理想,这是因为循环神经网络中的大量参数其实是在循环连接中的。因此,参考文献提出了基于变分推理的Dropout方法,即对于同一个序列,在其所有时刻的循环连接上采用相同的丢弃方法,也就是 说不同时刻丢弃的连接是相同的。实验结果表明,这种Dropout在语言模型和情感分析中会获得较好的效果。

此外,Krueger等人根据Dropout思路提出了一种Zoneout结构, 用之前时间步上的激活值代替Dropout中置0 的做法,这样能够让网 络更容易保存过去的信息。另外,有研究结果表明,Dropout可以应用在普通循环神经网络、长短期记忆网络、门控循环单元等网络中的任何门控单元或隐藏状态向量中 。


问题3:如何从神经网络的角度理解矩阵分解算法?


难度级:★★☆☆☆


分析与解答

矩阵分解算法是 Simon Funk 在 2006 年的 Netflix 推荐算法设计大赛中提出的一种经典的协同过滤算法,其基本思想是将用户和物品的评分矩阵分解为低维稠密的向量,而分解过程的优化目标是使用户和物品对应向量的内积逼近实际评分,数学形式化为

(11-1)

其中, 分别表示用户u对物品i的实际评分和预测评分, 为系统的全局偏差, 分别为用户u和物品i的特有偏差, 则为表示用户u和物品i的低维稠密向量。作为一种经典的协同过滤算法,矩阵分解从上述的最初形式不断发展,产生诸如 SVD++、概率矩阵分解等诸多变种,应用范围也扩展到点击、购买等隐式反馈数据上。这里仅以式(11-1)所示的基本形式为例,从以下几个方面以神经网络的角度解释矩阵分解算法。

(1)输入输出:输入即为用户和物品的编号,输出为对应用户给物品的打分。

(2)优化目标:在评分这类显式反馈数据集上,矩阵分解通常采用均方根误差(Root Mean Square Error)作为损失函数。此外,考虑到用户和物品的数量,以及所选低维稠密向量的维数,矩阵分解的参数空间较大,因而通常会加入 正则项以防止过拟合,具体为

(11-2)

(3)网络结构:矩阵分解的网络结构相对简单,如图11.2所示。图中红色为模型的输入(用户和物品的编号),绿色为可训练的模型参考,黄色为模型输出(评分)。模型大致流程是,先通过用户或物品的 编号查询得到用户或物品的嵌入表示(embedding),而后通过嵌入表 示的内积运算得到一个标量值,再与各类偏置相加,最终得到评分。对 于用户和物品的特有偏置,可以视为一维的嵌入表示。

图 11.2 矩阵分解的神经网络模型

(4)训练方法:同一般的神经网络一样,常用训练算法是批量梯度下降形式的反向传播算法。

(5)超参数:除了控制正则项的超参数 外,低维稠密向量v和w的维数也直接决定了模型的表达能力。这些超参数的选取方法一般也与其 他机器学习模型相同,即选择在验证集上结果最好的一组取值。

可以看到,从神经网格的角度来看,矩阵分解是一种内部没有非线性单元的相对简单的模型。所以,如果考虑增加模型的表达能力的话,可以通过增加多层感知单元等方法,将矩阵分解扩展为一个更一般的用于协同过滤任务的神经网络模型。

值得一提的是,除了显式反馈数据外,矩阵分解算法也可以处理隐式反馈数据,但在优化目标和训练方法等方面有所不同。例如,考虑到隐式反馈未必代表用户对物品的喜好(如在直播节目推送时,用户可能由于习惯原因而更倾向于停留在某个频道;又如在购物时,用户可能出于价格、送货范围等限制而不选择某物品),一般不能简单地拟合隐式反馈中的 0/1,而是要对训练目标做出一些调整,如引入置信度的概念或 采用排序损失函数等。另外,在某些场景下,隐式数据的数据规模使得反向传播算法效率较低,需要一些更高效的训练算法(如参考文献中的交替最小二乘法)。


问题4:评价点击率预估模型时,线下AUC的提高一定可以保证线上点击率的提高吗?


难度级:★★☆☆☆


分析与解答

虽然 AUC 表示了模型对正样本评分高于负样本的概率(也即将任意正样本排在任意负样本之前的概率),但线下 AUC 的提高并不总是意味着线上点击率的提高。造成这种不一致现象的一个根本原因是,线下的 AUC 评估往往是将所有样本混杂在一起进行的,这就破坏了原始 数据中天然存在的一些模型无法改变的维度信息。所谓的维度信息,在不同的推荐场景下可能有所不同,但一般包括用户维度、时间维度、设备维度等。举例来说,对于用户维度,线下 AUC 的提高可能是将一部分用户的正样本排到了另一部分用户的负样本之前导致的。例如数据中有两组用户A和 B,记用户组A的正负样本集分别为 ,B组用户的正 负样本集分别为 。若当前模型对于样本的排序为 , 而改进后的模型将 交换了位置,即变成 。这样, 从 AUC 的概率意义可知,改进后的模型在整体数据集上的 AUC 将获 得提高(提高的幅度取决于这 4 组样本的相对大小),但线上实验的点 击率不会发生变化,因为对于各组用户而言,他们看到的推荐排序结果 仍然是相同的。换言之,B组的用户并不能“穿越”去点击A组的负样本,因而将 这一组样本提升到 前没有任何意义。

同理,对于时间维度,记上午的正负样本分别为 , 下午的正负样本分别为 ,将排序从 变为 带来的 AUC 提升同样是没有意义的,毕竟下午的用 户是无法“穿越”去点击上午的样本的。明白了线下 AUC 与线上点击率不一致的这一层原因后,我们自然 就可以想到解决方法,即按各个维度对样本做聚合,在聚合的各组结果 上分别计算 AUC,而后再按样本量做加权平均。这样就可以消除各个维度之间样本交叉的可能。另外,线下验证集样本的分布、线上与线下特征不一致等也会导致 AUC 变化与点击率变化不一致的现象。


问题5:二阶因子分解机中稀疏特征的嵌入向量的内积是否可以表达任意的特征交叉系数?引入深度神经网络的因子分解机是否提高了因子分解机的表达能力?


难度级:★★★★☆


分析与解答

我们从二阶因子分解机的公式出发:

(11-4)

其中, 是输入向量,它一般只有少数几个分量不为0(稀疏特征),典型的例子是在给定户集合和物品集合时,将用户编号和待推荐物品的编号用独热向量表示出来,并将这两个独热向量并联起来就构成了一个稀疏特征输入向量; 是因子分解机的整体偏置; 中第 个特征分量的一阶系数; 是第 个特征分量的嵌入向量,而第i个特征分量与第j 个特征分量的交叉系数就是 的内积; 都是需要通过训练样本学习得到的参数;是因子分解机的预测输出值。

显然式(11-4)右侧的第三项是用来表达特征分量之间的相互作用。从更一般的意义上讲,我们可以将这个相互作用项写为 为待学习的特征交叉系数,但这种最一般的形式通常没有实用价值。例如,要预测一个特定用户对一个特定物品的喜好度(该物品展示给该用户时发生点击的概率),如果直接去学习 ,那么只能学到在训练样本出现过的 ,物品 >组合的系数 ,这对于在测试集或者是实际生产环境中的推断是没有意义的。因而在二阶因子分解机中,通过训练样本学习的是稀疏特征分量的嵌入向量v,然后用两个特征分量的嵌入向量的内积 来表示它们的特征交叉系数。

现在回到一开始的问题,用嵌入向量的内积来表示特征交叉系数具有任意的表达能力吗?答案是肯定的,即对于任意二阶特征相互作用项 ,存在一组嵌入向量 ,使得 。下面给出具体的证明。

首先,对任意的 维半正定实对称矩阵 ,存在特征分解 ,其中 是一个对角元素大于等于0 的对角矩阵。因此可以构造一个 维矩阵 ,使 ,于是 中的每一个元素 可以表示为 ,其中 分别是矩阵 的第 , 行的 维向量。

现在回到原问题上来,对于任意一组系数 , 可以构造一个 矩阵,使 为一常数。当 足够大时 必为半正定实对称矩阵(这一点请读者自行思考如何证明),因而存在上述分解 。于是, 我们只需让稀疏特征 的嵌入向量 为矩阵 的第 行的 维向量),就有 。此时,稀疏特征的嵌入向量的维度等于原始稀疏特征的维度。

然而在实际应用场景中,稀疏特征的维数往往非常高(比如是所有推荐物品的总个数),而嵌入向量的维数通常远远小于稀疏特征的维数(降低嵌入向量的维数不仅仅是为了减小模型的规模和计算量,更重要的是为了在输入特征十分稀疏的场景下,降低过拟合风险,提升模型的泛化能力)。通过上面的分析可知,较小的嵌入维度以及两两内积的表达方式确实限制了因子分解机的表达能力。针对此问题的一个解决方案是在嵌入向量之间引入非线性运算(比如深度神经网络),这样可以在嵌入向量维数不过高的前提下一定程度地提升模型的整体表达能力。一种比较流行的在因子分解机里引入深度神经网络的模型是深度因子分解机(DeepFM),它在式(11-4)右侧三项的基础上再加入了一个“深度”项,该深度项是由多个稀疏特征域的嵌入向量并联,再经过多层全连接神经网络后得到;这四项的和表示了最终的模型预测结果(如果是 点击率预估的任务,则还需要四项求和之后再经过一个 Sigmoid 函数, 使得输出介于0 到 1 之间)。

————

以上5道题,仅是《百面深度学习》的冰山一角,更为全面的135道算法面试题都在书里,等你挑战!



本次携手人民邮电出版社给大家免费送上5本《百面深度学习:算法工程师带你去面试》。绝对真实有效,绝对真实有效。

参数方式:

    1、转发本文到朋友圈集赞。

    2、消息栏回复: 朋友圈集赞截图+“百面深度学习送书”+集赞具体数量。

    3、8月9号24点截止,根据集赞具体数量排序,top-5送书哈。


没有中奖朋友也可以自行购买:

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/72307
 
350 次点击