一些笔记
- 逻辑回归,SVM,决策树都是分类模型,那么面对一个分类问题,应该怎么选择?
- 逻辑回归优点:便利的观测样本概率分数,有高效的工具实现,广泛应用于工业问题,缺点:特征空间大,大量多类特征效果不好
- 支持向量机:能处理大型特征空间,能处理非线性特征之间的相互作用。缺点当观测样本很多时,效率不高,有时候合适的核函数比较难找
- 决策树:优点直观的决策规则,可以处理非线性数据,考虑到了变量间的相互作用。缺点容易过拟合(随机森林克服了这个缺点),无法输出分数只能输出类别
- 选择:数出现据特征多可以选择svm,样本多可以选择LR,如果数据缺失值比较多可以选择决策树
- 常见的优化器及其优缺点
- 梯度下降,包括随机,mini-batch的缺点:1、都容易出现震荡2、学习率很难选择,太小,收敛变慢,太大会阻碍收敛,导致损失函数在最小值附近波动甚至发散3、所有参数都是同一个学习率,我们希望对那些出现频率低的特征更新更快 4、逃不出鞍点,因为鞍点处梯度为0
- momentum:可以累加之前的梯度,如果两次梯度方向一样,可以增强,不一样,则会减弱,减缓震荡
- NAG:遇到山谷不会自动减弱更新的梯度,可能会跳过山谷,所以先根据之前累积的梯度方向模拟下一步的更新值,然后用模拟后位置的梯度与之前累计的梯度和矢量相加
- adagrad:解决参数学习率的问题,引入了二阶动量,也就是梯度平方累加,将二阶动量放在分母的位置,对于训练数据少的特征,对应的参数更新慢,也就是说它累加的梯度平方和小,对应的更新就会变快,为了防止分母为零,加了一个平滑参数
- 缺点:分母随着训练数据增加,会越变越大,导致学习速率越来越小,最终无限小,从而无法有效更新参数
- adadelta:改进ada,二阶动量变为变为之前所有梯度的加权平均
- adam:将动量与adadelta结合,引入了一阶动量与二阶动量,adam是用时间窗口里的累积,随着时间窗口的变化,遇到的数据可能发生巨变,使得二阶时大时小,不是单调变化,后期会引起学习率的震荡,导致无法收敛
- 交叉熵为什么可以做损失函数?
- 信息量:概率小的事件发生了,信息量大,L(x) = -log(p(x))
- 熵:表示所有信息量的期望
- 相对熵:KL散度,队同一个随机变量有两个单独的概率分布,用KL散度衡量这两个分布的差异,KL散度越小,表示分布越接近
- 交叉熵:将KL散度公式变形
p是标签真实分布,q是我们预测的分布,等式的前一部分就是p的熵,后部分就是交叉熵,在机器学习中,我们需要评估label和predicts之间的差距,使用KL散度刚刚好,即,由于KL散度中的前一部分−H(y)不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss
- transformer里面的位置编码
- 之前的编码方式,表格型,句子的长度不同,那么位置编码不一致,无法表示句子之间有什么相似性;正整数范围分配性,句子越长后面的数字越大,这样无法凸显每个位置的真实权重
- transformer里用到了正余弦编码,可以表示相对距离具体参见datawhale的讲解,我还没太看懂
- BN原理参考这里
- 要解决的问题:神经网络随着网络深度的加深,收敛越来越慢,出现梯度消失与爆炸
- 问题出现的原因:神经网络层数深,每一层参数更新会导致上层的数据的分布发生变化,层数越深,高层的输入变化会非常剧烈,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略,而且机器学习领域有个很重要的假设:独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。而分布变化的存在,,不符合独立同分布的假设,因此网络模型很难稳定的去学习
- BN层就是通过一定的手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布。
- 深层神经网络在做非线性变换前的输入值(就是那个y=Wx+B,x是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因
- 所以BN层可以加快收敛速度,防止梯度消失与爆炸,防止过拟合
- 改变数据分布就可以加快收敛
- 使用BN层后网络的输出值不会很大,梯度不会很小,防止梯度消失
- 在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合
- 为什么BN层一般用在线性与卷积之后,而不是非线性后面?
- 因为非线性单元的输出分布形状会在训练过程中变化,归一化无法消除他的方差偏移,相反的,全连接和卷积层的输出一般是一个对称,非稀疏的一个分布,更加类似高斯分布,对他们进行归一化会产生更加稳定的分布
- BN缺点:每次都是在一个batch上计算均值与方差,如果batch太小,计算的均值,方差不足以表示整个数据分布,太大的话会超过内存,需要跑更多epoch,导致训练时间变长。不适用于RNN,
- BN训练测试的区别:训练时候每个batch有自己的均值与方差,测试的时候用全量数据集的均置与方差 参考这里
- LN:同层神经元输入有相同的均值与方差,不同的输入样本有不同的均值与方差,而BN中则针对不同神经元输入计算均值和方差,同一个minibatch中的输入拥有相同的均值和方差
- 各种分类器的适用场景参考这里
- KNN:完全跟着数据走,没有数学模型可言,适用于一个特别容易解释的模型,比如需要向用户揭示原因的推荐算法
- 朴素贝叶斯:需要一个比较容易解释,而且不同维度之间相关项较小的模型,可以高效处理高维数据,但是结果可能不太好
- 决策树:数据分析师需要更好理解数据的时候可以用,但是容易被攻击,这里的攻击是指人为的改变一些特征,使得分类器判断错误。常见于垃圾邮件躲避检测中。因为决策树最终在底层判断是基于单个条件的,攻击者往往只需要改变很少的特征就可以逃过监测
- 随机森林:数据维度相对低(几十维),同时对准确性有较高要求时。因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林
- svm:在小数据集上表现较好,但是核函数选择需要人工
- LR:本质上是一个线性的分类器,所以处理不好特征之间相关的情况
- dropout
- Dropout 在训练时采用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合的风险。而在测试时,应该用整个训练好的模型,因此不需要dropout。测试时对每个神经元的参数要预先乘以1-p,以恢复在训练中该神经元有p的概率被丢弃
- 训练时应该对没有被dropout的神经元权重值做一个invert rescale = 1 / (1 - dropout rate),这样就可以使结果的scale保持不变,而在预测的时候也不用做额外的操作了,更方便一些