简单介绍一下RNN、LSTM、GRU?他们的区别和联系是什么?
RNN即Recurrent Neural Networks、循环神经网络,本质是一个全连接网络,但是因为当前时刻受历史时刻的影响。
RNN出现梯度消失和梯度爆炸主要体现在长句子中,因为在后向传播BP求导时,当前t时刻隐层输出的梯度包含了所有后续时刻激活函数导数的乘积,所以如果t越小、句子越长,就会出现问题。如果激活函数的导数特别小,累乘就会更小,则会出现梯度消失问题;反之,则是梯度爆炸问题。RNN 所谓梯度消失的真正含义是,梯度被近距离梯度主导,导致模型难以学到远距离的依赖关系。LSTM即Long Short Term Memory、长短时记忆模块,是对RNN存在的梯度消失、梯度爆炸问题的一种优化模型。
GRU即Gated Recurrent Unit、门控循环单元,相当于是LSTM的一种变种,将三个门变成了两个门,本质区别不是很大,而且哪个更好用大概率是看实验结果。
LSTM的三个门的作用:输入门决定何时让输入进入细胞单元;遗忘门决定何时应该记住前一时刻的信息;输出门决定何时让记忆流入下一时刻;
LSTM是怎么解决梯度消失的问题的?
LSTM并不能解决梯度消失的问题,只是提高模型学习远距离依赖关系的能力。
CEC的出现:RNN产生梯度消失的原因是因为 累乘因子 < 1 造成的,那如果让累乘因子等于1就可以了,所以出现了CEC(constant error carousel)模块,即Whh固定为一个常数单元矩阵, 激活函数e(x)=x。但是肉眼可见的发现,这是线性模型,模型的表达能力减弱。
不带forget bias的LSTM的出现:输入门、输出门的出现是为了将模型变为非线性,并可以调整不同时序的输出对模型后续动作的影响。而且c(t)的偏差会无损的传到c(t-1),这条路上的梯度会无损的传到前一时刻,类似于残差网络中的ResNet.
forget bias的出现:后续有一系列的针对LSTM的优化,foget门的出现、peephole的加入等,一般初始化时,forget bias都会设置为1。
LSTM增加了更多回传梯度的路径,只要一条路径没有梯度消失,那么梯度消失的问题就得到了改善。
还有哪些其它的解决梯度消失或梯度爆炸的方法?
- 梯度裁剪gradient clipping,当BP时的梯度小于某个阈值或大于某个阈值时 ,直接裁剪,防止太小的梯度累乘带来的梯度消失或太大的梯度累乘带来的梯度爆炸。
- 改变激活函数,例如减少使用sigmoid、tanh这类激活函数,改成使用Relu、LeakRelu等,参考 算法面试问题二(激活函数相关) 。
- 残差结构,类似于CEC的模块,跨层的连接结构能让梯度无损的进行后向传播。
- Batch Normalization,相当于对每一层的输入做了一个规范化,强行把这个输入拉回标准正态分布N~(0,1)。这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数的大变化,进而梯度变大,避免产生梯度消失问题。而且梯度变化大 意味着学习收敛速度快,加快模型的训练速度。
linux下debug的方法
log
输出log永远是最简单快捷的调试方式,可以快速定位bug,通过设置日志级别控制日志的输出详略程度,结合一些文本分析工具awk/sed/grep可以快速在大量日志中找到错误信息。
strace
是一个用来跟踪系统调用的简易工具。它最简单的用途就是跟踪一个程序整个生命周期里所有的系统调用,并把调用参数和返回值以文本的方式输出。Strace还可以跟踪发给进程的信号。支持attach正在运行的进程 strace -p <pid>, 当多线程环境下,需要跟踪某个线程的系统调用,可以先ps -efL|grep <Process Name> 查找出该进程下的线程,然后调用starace –p <pid>进行分析。
pstack
用来跟踪进程栈,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方;
gdb
经典的调试工具,功能很强大,注意此时编译的时候应该使用-g选项,并用-Og进行优化。多线程下可以attach到进程来调试
决策树,GBDT,XGBOOST、随机森林关系跟区别
即个体学习器之间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表就是Boosting,后者的代表是Bagging和“随机森林”(Random Forest)
- 1、决策树
- 2、随机森林:
1)随机森林是一个典型的多个决策树的组合分类器。- 3、GBDT(Gradient Boosting Decision Tree,梯度提升树)和xgboost(extremeGradientBoosting)
1)GBDT是以决策树(CART)为基学习器的GB算法,是迭代树,而不是分类树。
2)Xgboost相比于GBDT来说,更加有效应用了数值优化,最重要是对损失函数(预测值和真实值的误差)变得更复杂。目标函数依然是所有树的预测值相加等于预测值。损失函数引入了一阶导数,二阶导数。
除此之外,xgboost工具支持并行