机器学习面试八股7




111GAN 网络的思想
GAN 用一个生成模型和一个判别模型,判别模型用于判断给定的图片是不是真实的图片,生成
模型自己生成一张图片和想要的图片很像,开始时两个模型都没有训练,然后两个模型一起进
行对抗训练,生成模型产生图片去欺骗判别模型,判别模型去判别真假,最终两个模型在训练
过程中,能力越来越强最终达到稳态。
1121*1 的卷积作用
实现跨通道的交互和信息整合,
实现卷积核通道数的降维和升维,
实现多个 feature map 的线性组合,而且可是实现与全连接层的等价效果。
113 怎么提升网络的泛化能力
从数据上提升性能:收集更多的数据,对数据做缩放和变换,特征组合和重新定义问题。
从算法调优上提升性能:用可靠的模型诊断工具对模型进行诊断,权重的初始化,用小的随机
数初始化权重。对学习率进行调节 ,尝试选择合适的激活函数,调整网络的拓扑结构,调节
batch 和 epoch 的大小,添加正则化的方法,尝试使用其它的优化方法,使用 early stopping。
114 什么是 seq2seq model
Seq2seq 属 于 encoder-decoder 结 构 的 一 种 , 利 用 两 个 RNN, 一 个 作 为 encoder 一 个 作 为
decoder。Encoder 负责将输入序列压缩成指定长度的向量,这个向量可以看作这段序列的语
义,而 decoder 负责根据语义向量生成指定的序列。
115 神经网络为啥用交叉熵
通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置 n 个输出节点,
一般情况下,最后一个输出层的节点个数与分类任务的目标数相等。假设最后的节点数为
N,那么对于每一个样例,神经网络可以得到一个 N 维的数组作为输出结果,数组中每一
个维度会对应一个类别。在最理想的情况下,如果一个样本属于 k,那么这个类别所对应
的的输出节点的输出值应该为 1,而其他节点的输出都为 0,即[0,0,1,0,….0,0],这个数组也
就是样本的 Label,是神经网络最期望的输出结果,交叉熵就是用来判定实际的输出与期望
的输出的接近程度。均方误差较为平缓,有可能收敛较慢
116 注意力公式
Soft attention、global attention、动态 attention ,Hard attention ,静态 attention
117 论文 flow 情况
谈谈自己投稿的论文,论文投稿级别,论文内容,用到的方法,对比方法等
118 推导 LSTM 正向传播和单向传播过程
链接
119DNN(深度神经网络)的梯度更新方式
120 深度模型压缩方法
链接
• 参数修剪和共享(针对模型参数的冗余性)3 类:模型量化和二进制化、参数共享、结
构化矩阵
• 低秩因子分解(使用矩阵/张量分解来估计深度学习模型的信息参数)
• 转移/紧凑卷积滤波器(特殊的结构卷积滤波器来降低存储和计算复杂度)
• 知识蒸馏(学习一个蒸馏模型,训练一个更紧凑的神经网络来重现一个更大的网络的输
出)
• 知识蒸馏是对模型的能力进行迁移,根据迁移的方法不同可以简单分为基于目标蒸馏
(也称为 Soft-target 蒸馏或 Logits 方法蒸馏)和基于特征蒸馏的算法两个大的方向,下面我
们对其进行介绍。
一般来说,参数修剪和共享,低秩分解和知识蒸馏方法可以用于全连接层和卷积层的
CNN,但另一方面,使用转移/紧凑型卷积核的方法仅支持卷积层。
基于参数修剪/共享、低秩分解的模型可以从预训练模型或者从头开始训练,因此灵活而有
效。然而转移/紧凑的卷积核和知识蒸馏模型只能支持从零开始训练。
121 模型压缩效果评价指标有哪些?
运行效率、参数压缩率、准确率
122 模型优化加速方法
模型优化加速能够提升网络的计算效率,具体包括:
Op-level 的快速算法:FFT Conv2d (7x7, 9x9), Winograd Conv2d (3x3, 5x5) 等;
Layer-level 的快速算法:Sparse-block net [1] 等;
优化工具与库:TensorRT (Nvidia), Tensor Comprehension (Facebook) 和 Distiller (Intel) 等;
123 压缩和加速方法如何选择?
1)对于在线计算内存存储有限的应用场景或设备,可以选择参数共享和参数剪枝方法,
特别是二值量化权值和激活、结构化剪枝。其他方法虽然能够有效的压缩模型中的权值参
数,但无法减小计算中隐藏的内存大小(如特征图)。
2)如果在应用中用到的紧性模型需要利用预训练模型,那么参数剪枝、参数共享以及低
秩分解将成为首要考虑的方法。相反地,若不需要借助预训练模型,则可以考虑紧性滤波
设计及知识蒸馏方法。
3)若需要一次性端对端训练得到压缩与加速后模型,可以利用基于紧性滤波设计的深度
神经网络压缩与加速方法。
4)一般情况下,参数剪枝,特别是非结构化剪枝,能大大压缩模型大小,且不容易丢失
分类精度。对于需要稳定的模型分类的应用,非结构化剪枝成为首要选择。
5)若采用的数据集较小时,可以考虑知识蒸馏方法。对于小样本的数据集,学生网络能
够很好地迁移教师模型的知识,提高学生网络的判别性。
6)主流的5个深度神经网络压缩与加速算法相互之间是正交的,可以结合不同技术进行
进一步的压缩与加速。如:韩松等人结合了参数剪枝和参数共享;温伟等人以及 Alvarez 等
人结合了参数剪枝和低秩分解。此外对于特定的应用场景,如目标检测,可以对卷积层和
全连接层使用不同的压缩与加速技术分别处理。
GPU 加速的地方(指的是使用 GPU 的地方)
124 用过哪些 Optimizer,效果如何
优化算法是不断迭代模型参数以降低模型损失函数的值
1)SGD;2)Momentum;3)Nesterov;4)Adagrad;5)Adadelta;6)RMSprop;7)
Adam;8)Adamax;9)Nadam。
(1)对于稀疏数据,尽量使用学习率可自适应的算法,不用手动调节,而且最好采用默认
参数。
(2)SGD 通常训练时间最长,但是在好的初始化和学习率调度方案下,结果往往更可靠。
但 SGD 容易困在鞍点,这个缺点也不能忽略。
(3)如果在意收敛的速度,并且需要训练比较深比较复杂的网络时,推荐使用学习率自适
应的优化方法。
(4)Adagrad,Adadelta 和 RMSprop 是比较相近的算法,表现都差不多。
(5)在能使用带动量的 RMSprop 或者 Adam 的地方,使用 Nadam 往往能取得更好的效果。
125Depthwise 卷积与 Pointwise 卷积
Depthwise(DW) 卷 积 与 Pointwise(PW) 卷 积 , 合 起 来 被 称 作 Depthwise Separable
Convolution(参见 Google 的 Xception),该结构和常规卷积操作类似,可用来提取特征,但
相比于常规卷积操作,其参数量和运算成本较低。所以在一些轻量级网络中会碰到这种结
构如 MobileNet。
Depthwise Separable Convolution 是将一个完整的卷积运算分解为两步进行,即 Depthwise
Convolution 与 Pointwise Convolution。
Depthwise Convolution 的一个卷积核负责一个通道,一个通道只被一个卷积核卷积。上面
所提到的常规卷积每个卷积核是同时操作输入图片的每个通道。Depthwise Convolution 完
成后的 Feature map 数量与输入层的通道数相同,无法扩展 Feature map。而且这种运算对
输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的
feature 信 息 。 因 此 需 要 Pointwise Convolution 来 将 这 些 Feature map 进 行 组 合 生 成 新 的
Feature map。
126Pointwise Convolution
Pointwise Convolution 的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M 为
上一层的通道数。所以这里的卷积运算会将上一步的 map 在深度方向上进行加权组合,生
成新的 Feature map。有几个卷积核就有几个输出 Feature map。如下图所示。
127Hash 表处理冲突的方法
开放定址法
链地址法 :将所有 Hash 地址相同的记录都链接在同一链表中
再 Hash 法 :同时构造多个不同的 Hash 函数,当产生冲突时,计算另一个 Hash 函数地址直到
不再发生冲突为止
建立公共溢出区:将 Hash 表分为基本表和溢出表,若是与基本表发生冲突,都放入溢出表
Apriori 原理:如果一个项集是频繁的,则它的所有子集一定也是频繁的;相反,如果项集
是非频繁的,则它的所有超集也一定是非频繁的。
加盐 hash:就是一个随机生成的字符串。我们将盐与原始密码连接(concat)在一起(放
在前面或后面都可以),然后将 concat 后的字符串加密。采用这种方式加密密码,查表法
就不灵了(因为盐是随机生成的)
128 中缀表达式转后缀表达式
转换过程需要用到栈,具体过程如下:
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注
意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇
到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入
到栈中。有一点需要注意,只有在遇到" ) “的情况下我们才弹出” ( “,其他情况我们都不
会弹出” ( "。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出,并输出。
129 大顶堆怎么插入、删除
插入: 需要先将要插入的结点 x 放在最底层的最右边,,此时需要找到新插入节点的父节点,
对堆进行自下而上的调整(从小到大)使其变成一个大顶堆。 时间:O(logn)。 “结点上
浮”
删除:将堆的最后一个元素填充到删除元素的位置,然后调整堆结构构造出新的大顶堆 ,并
下调到合适位置,最后把该叶子删除。 “结点下沉”
130 堆栈区别
堆和栈的区别:
一、堆栈空间分配区别:
1)、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈;
2)、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS
回收,分配方式倒是类似于链表。
二、堆栈缓存方式区别:
1)、栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放;
2)、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为
孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
堆:内存中,存储的是引用数据类型,引用数据类型无法确定大小,堆实际上是一个在内
存中使用到内存中零散空间的链表结构的存储空间,堆的大小由引用类型的大小直接决定
引用类型的大小的变化直接影响到堆的变化
栈:是内存中存储值类型的,大小为 2M,超出则会报错,内存溢出
三、堆栈数据结构区别:
堆(数据结构):堆可以被看成是一棵树,如:堆排序;
栈(数据结构):一种先进后出的数据结构。
特点:先进后出