2019年招行FinTech训练营面经

2019年招行FinTech训练营面经

昨天参加了招商银行2019FinTech精英训练营的面试环节,进入这个环节需要参加由招行举办的线上竞赛,我选的第五题。面试官问了两个专业的问题,现在总结一下。

问题一:解释一下梯度消失于梯度爆炸

这个问题可以从三个方面阐述:

一. 梯度消失和梯度爆炸

梯度消失:
梯度消失的根源—–深度神经网络和反向传播。

1.目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。
2.假设损失函数的数据空间是下图这样的,我们最优的权值就是为了寻找下图中的最小值点,对于这种数学寻找最小值问题,采用梯度下降的方法再适合不过了。
3.两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。
4.梯度消失与梯度爆炸其实是一种情况
2019年招行FinTech训练营面经_第1张图片

梯度爆炸:
梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。

对激活函数进行求导,如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失
梯度爆炸的表现:
2019年招行FinTech训练营面经_第2张图片
结果为输出的每一步的损失函数的值,损失值在指数型地增加,nan(not a number)表示无穷大的数或者无意义的数

从激活角度来说:

比如使用sigmoid激活函数作为损失函数,梯度消失就会很明显了,因为其梯度是不可能超过0.25的

解决方案

方案1-预训练加微调

Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。

方案2-梯度剪切、正则

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
权重正则化(weithts regularization)比较常见的是L1正则,和L2正则,L1正则化和L2正则化可以看做是损失函数的惩罚项。正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:
在这里插入图片描述
其中,α是指正则项系数,因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。

方案3-relu、leakrelu、elu等激活函数

如果激活函数的导数为1(relu函数的导数在正数部分是恒等于1的),那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度
在这里插入图片描述

relu的主要贡献在于:-- 解决了梯度消失、爆炸的问题
– 计算方便,计算速度快
– 加速了网络的训练
缺点:-- 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
– 输出不是以0为中心的
leakrelu就是为了解决relu的0区间带来的影响,其数学表达为:leakrelu=max(k∗x,x) 其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来
elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:
在这里插入图片描述

方案4-batchnorm

反向传播中,经过每一层的梯度会乘以该层的权重,举个简单例子:
正向传播中在这里插入图片描述 那么反向传播中, 在这里插入图片描述在这里插入图片描述
反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。

方案5-残差结构

使用残差结构解决了增加深度带来的副作用(退化问题),这样能够通过单纯地增加网络深度,来提高网络性能。
实现了即使加深网络深度,也不会导致的梯度消失或者梯度爆炸的影响,可以详细的看一下残差网络的结构及性能。

问题二:Python垃圾回收机制

这个问题我也是从来没听过,挺偏的:(

Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。

在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。

1.导致引用计数+1的情况
1、对象被创建,例如a=23
2、对象被引用,例如b=a
3、对象被作为参数,传入到一个函数中,例如func(a)
4、对象作为一个元素,存储在容器中,例如list1=[a,a]
2.导致引用计数-1的情况
1、对象的别名被显式销毁,例如del a
2、对象的别名被赋予新的对象,例如a=24
3、一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
4、对象所在的容器被销毁,或从容器中删除对象
有三种情况会触发垃圾回收:

垃圾回收后的对象会放在gc.garbage列表里面,gc.collect()会返回不可达的对象数目

1、调用gc.collect()
2、当gc模块的计数器达到阀值的时候。
3、程序退出的时候

你可能感兴趣的:(2019年招行FinTech训练营面经)