《百面机器学习》阅读笔记

2020-10-06

特征工程、模型评估、机器学习、神经网络。

特征工程


  1. 为什么需要做归一化?答:归一化到相同数值区间之后,更新速度更为一致,容易更快地通过梯度下降找到最优解。主要方法包括线性归一化、零均值归一化。(适用于梯度下降求解的方法,对于决策树之类的不适用)

  2. 类别特征怎么处理?答:序号编码(保留偏序关系)、独热编码(0 0 0 1 0 0)、二进制编码(允许多位为1,hash)。

  3. 什么是组合特征?答:一阶离散特征组合成高阶,提高复杂关系的拟合能力。

  4. 文本表示模型?

    • 词袋模型:是将文章以词为单位切分开,忽略词的出现顺序,将文章表示成一个长向量,每一维代表一个单词,该维的权重表示重要程度。常用TF-IDF来计算权重。
    • N-gram:指有些词组不能拆开,那么由这n个词组成的词组(N-gram)也作为一个单独的特征放到向量表示中,构成N-gram模型。
    • TF-IDF:TF(t,d)单词t在文档d中出现的概率,IDF(t)逆文档概率。TF-IDF=TF×IDF。IDF(t) = log(文章总数/(包含单词t的文章总数+1))
    • Topic:将具有相同主题的词或词组映射到同一维度上,映射到的这一维度表示某个主题。
    • 词嵌入:向量化。
  5. Word2vec?

    • COBW根据上下文出现的词语来预测当前词的生成概率,Skip-gram根据当前词来预测上下文中各词的生成概率。图中w(t)即当前词,w(t-2)、w(t-1)、w(t+1)、w(t+2)即上下文中出现的词,所谓的滑动窗口大小就是上下文取词个数,为2。

    • 模型结构:输入层+映射层+输出层。

    • 输入层是one-hot编码的上下文词,如果词汇表中单词总数为N,则输入层的词表示即为N维one-hot向量。

    • 映射层(隐含层)有个K隐含单元,即我们要得到的K维词嵌入向量,这里就是K个隐含单元。映射层的值由输入层的N维向量和N×K维权重矩阵计算得到。
      注:CBOW模型需要将输入词计算的隐含单元值求和,比Skip-gram多这一部分。

    • 输出层向量的值由隐含层的K维向量和K×N维向量计算得到,输出也是N维向量。但是这里的输出向量并不能保证所有维度加起来为1(one-hot编码加起来就为1),要通过Softmax激活函数进行归一化。

    • 训练的目标是使得语料库中所有单词的整体生成概率最大化。可以用反向传播,沿梯度更优的方向更新权重,但是由于Softmax存在归一化项,推导出来的迭代公式需要对词汇表中所有单词进行遍历(毕竟是维词向量),所以每次迭代过程非常缓慢。有Hierarchical Softmax和Negative Sampling两种改进方法。

    • 得到训练出来的各词对应的向量:训练得到的维度为N×K和K×N的矩阵,可以选择任意一个作为N个词的K维词向量。

模型评估


  1. Precision、Recall、F1、Accuracy、ROC、AUC
  2. 余弦距离(相对差异)、欧氏距离(数值绝对差异)。距离公理(正定、对称、三角不等式)
  3. Holdout 7/3验证、K-fold交叉验证(分词k份,k-1份训练,1份验证,最后k次取平均,经常取10折)、自助验证(n次有放回的随机抽样,抽出过的训练,没抽出过的验证,极限趋向于0.368)
  4. 超参数调优:网格搜索(复杂度高,通常先广度范围+长步长找大范围,再缩小找精确最优值)、随机搜索(比网格快一些)、贝叶斯优化(学习目标函数形状)
  5. 过拟合(数据增广、降低模型复杂度、加正则项、集成学习)、欠拟合(添加新特征、增加模型复杂度、减少正则化系数)

机器学习


SVM

若训练集中不存在两个点在同一位置,则存在一组参数$\{\alpha_1,…,\alpha_m,b\}$以及参数$\gamma$使得该SVM的训练误差为0。训练误差为0的SVM分类器一定存在。加入松弛变量的SVM的训练误差可以为0吗?答案是,并不一定能得到训练误差为0的模型。如果使用SMO算法来训练一个加入松弛变量的线性SVM模型,则我们的优化目标改变了,并不再是使训练误差最小。当C取0时,w也取0时即可达到优化目标。

逻辑回归、线性回归

【逻辑回归和线性回归的区别】为什么逻辑回归名字叫回归但是处理的却是分类任务?答:Logistic回归是通过log函数将线性回归方程转为0到1之间的概率值,再以阈值threshold(默认是0.5)将概率值低于0.5的概率值转为0,高于等于0.5的概率值转为1,这就是为什么logistic回归可以解决分类的问题。而线性回归中实际上求解的是$y’=\theta^Tx$,是对我们假设的真实关系$y=\theta^Tx+\epsilon$的一个近似,其中$\epsilon$代表误差项,我们使用这个近似项来处理回归问题。还有一个很大的区别是,逻辑回归中的因变量是离散的,线性回归中的因变量是连续的。两者都使用了极大似然估计来对训练样本进行建模。线性回归使用最小二乘法,逻辑回归使用如下似然函数。都可以用梯度下降的方法进行求解。

降维

主成分分析PCA、线性判别LDA

非监督

K-Mean聚类、高斯混合GMM、自组织映射神经网络SOM、聚类评估

概率图

联合概率分布、概率图表示、生成式与判别式模型、马尔科夫模型主题模型pLSA+LDA

优化算法

  1. 有监督的二分类损失函数:0-1损失、Hinge损失、Logistic损失、交叉熵损失
  2. 凸函数 & 凸优化
  3. 经典优化方法:直接法、迭代法
  4. 随机梯度下降:随机梯度下降、小批量梯度下降
  5. 优化的梯度下降方法:动量(Momentum)、AdaGrad、Adam、Nesterov Accelerated Gradient、AdaDelta、RMSProp、AdaMax、Nadam
  6. L1、L2正则化,稀疏性

为什么L1正则化产生稀疏解?答:①解空间形状,L2正则项约束后的解空间是圆形,而L1正则项约束的解空间是多边形。显然,多边形的解空间更容易在尖角处与等高线碰撞出稀疏解;②函数叠加,观察最小值,L1的最小值在零点处取得,对应的w是0,产生了稀疏性。L2只有减小w的作用,对解空间的稀疏性没有贡献;③贝叶斯先验,L1正则化相当于对模型参数w引入了拉普拉斯先验,L2正则化相当于引入了高斯先验,而拉普拉斯先验使参数为0的可能性更大。

采样

作用、常见采样方法、高斯分布采样、马尔科夫蒙特卡洛采样、贝叶斯网络采样、不均衡样本集重采样

偏差与方差

集成学习

Boosting:Boosting方法训练基分类器时采用串行的方式,各个基分类器之间有依赖。其基本思想是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的结果的加权得到最终结果。

Bagging:Bagging是Bootstrap Aggregating的简称,意思就是再抽样,然后在每个样本上训练出来的模型取平均。Bagging方法在训练过程中,各基分类器之间无强依赖,可以进行并行训练。为了让基分类器之间相互独立,将训练集分为若干子集。由于个体之间存在差异性,最终做出的判断不会完全一致。在最终做决策时,每个个体单独作出判断,再通过投票的方式作出最后的集体决策。Bagging的主要好处是集成后的分类器的方差,比基分类器的方差小,所采用的基分类器最好是本身对样本分布较为敏感的(即所谓不稳定的分类器),这样Bagging才能有用武之地。线性分类器或者K近邻都是较为稳定的分类器,本身方差就不大,所以用他们做基分类器Bagging并不能在原有基分类器的基础上获得更好的表现,甚至可能因为Bagging的采样,导致它们在训练中更难收敛,从而增大了集成分类器的偏差。

基分类器的错误率要大于集成分类器,基分类器的错误是偏差和方差两种错误之和偏差主要是由于分类器的表达能力有限导致的系统性误差,表现在训练误差不收敛。Boosting方法通过逐步聚焦于基分类器分错的样本,减小集成分类器的偏差。方差是由于分类器对于样本分布过于敏感,导致在训练样本数较少时,产生过拟合。Bagging方法则是采取分而治之的策略,通过对训练样本多次采样,训练多个不同模型进行综合,来减小集成分类器的方差。用简单多数投票方法来集成结果,超过半数基分类器出错的概率会随着基分类器的数量增加而下降

集成学习一般可以分为以下3个步骤:

  • 找到误差相互独立的基分类器。
  • 训练基分类器。
  • 合并基分类器的结果。合并基分类器的方法有voting和stacking两种。stacking是用串行的方式,把前一个基分类器的结果输出到下一个分类器,将所有基分类器的输出结果相加作为最终的输出(或用更复杂的方法,将各基分类器的输出作为特征,用逻辑回归作为融合模型进行最后的结果预测)。一般voting的方式更多一点。

Adaboost采取了Boosting的思想,对分类正确的样本降低了权重,对分类错误的样本升高或者保持权重不变。在最后进行模型融合的过程中,也根据错误率对基分类器进行加权融合
另一个非常流行的是梯度提升决策树(GDBT),思想是每一棵树学的是之前所有树结论和的残差,这个残差是一个加预测值后能得真实值的累加量。比如预测年龄,真实年龄是25岁,第一棵树预测22岁,则第二棵树将年龄设为3岁去学习。使用残差继续学习,就是GBDT中的Gradient Boosted所表达的意思。

决策树:决策树可以较为方便地将样本的权重整合到训练过程中,而不需要使用过采样的方法来调整样本权重。决策树的表达能力泛化能力,可以通过调节树的层数来做折中。数据样本的扰动对于决策树的影响较大,因此不同子样本集合生成的决策树基分类器随机性较大,这样的“不稳定学习器”更适合作为基分类器。此外,在决策树节点分裂的时候,随机地选择一个特征子集,从中找出最优分类属性,很好地引入了随机性。其中很著名的算法是基于决策树基分类器的随机森林。ID3最大信息增益、C4.5最大信息增益比、CART树最大基尼指数。三种决策树的构造准则、前后剪枝。

梯度提升决策树GBDT

梯度提升决策树(Gradient Boosting Decision Tree,GBDT)是Boosting算法中非常流行的模型。Gradient Boosting是Boosting中的一大类算法,基本思想是根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,然后将训练好的弱分类器以累加的形式结合到现有模型中。采用决策树为弱分类器的Gradient Boosting算法被称为GBDT,有时也称MART(Multiple Additive Regression Tree)。GBDT中使用的决策树通常为CART树

梯度提升和梯度下降的区别和联系?

GBDT的优点和局限性?

  • 优点:
    • 预测阶段的计算速度快,树与树之间可并行计算
    • 在分布稠密的数据集上,泛化能力和表达能力都很好。
    • 采用决策树作为弱分类器使得GBDT模型具有较好的解释性鲁棒性,能够自动发现特征间的高阶关系,也不需要对数据进行特殊的预处理如归一化等。
  • 局限:
    • GBDT在高维稀疏的数据集上,表现不如支持向量机或神经网络。
    • GBDT在处理文本分类特征问题上,相对于其他模型优势不如在处理数值特征时明显。
    • 训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提升训练速度。

XGBoost与GBDT的联系和区别?

  • GBDT是机器学习算法,XGBoost是该算法的工程实现
  • 在使用CART作为基分类器时,XGBoost就显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,提高模型的泛化能力。
  • GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
  • 传统的GBDT使用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器。
  • 传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样
  • 传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值的处理策略。

神经网络


前向神经网络

  1. 如果只使用一个隐藏层,需要多少隐节点能够实现包含$n$元输入的任意布尔函数?答:$2^{n-1}$个隐节点。
  2. 考虑多隐层的情况,实现包含$n$元输入的任意布尔函数最少需要多少个网络节点和网络层?
    答:一个隐藏层即可计算异或函数。$n$元异或函数需要包括$3(n-1)$个节点(包括最终输出节点)。可以发现,多隐层结构可以将隐节点的数目从指数级$O(2^{n-1})$直接减少至线性级$O(3(n-1))$。需要的最少网络层数为$2\log_2N$(向上取整)。

激活函数

Sigmoid、Tanh、ReLU

  1. Sigmoid和Tanh激活函数为什么会导致梯度消失的现象?答:因为它们的导数f’(z)在z很大或者很小的时候都会趋近于0,造成梯度消失的情况。
  2. ReLU系列激活函数相对于Sigmoid和Tanh激活函数的优点是什么?它们有什么局限性以及如何改进?答:优点:从计算的角度上,Sigmoid和Tanh激活函数都需要计算指数函数复杂度高,而ReLU只需要一个阈值即可得到激活值。ReLU的非饱和性可以有效解决梯度消失的问题,提供相对宽的激活边界。ReLU的单侧抑制提供了网络的稀疏表达能力。局限:其训练过程中会导致神经元死亡。函数$f(z)=\max(0,z)$导致负梯度在经过ReLU单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际训练中,如果学习率设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。从而有人推出了LReLU。

反向传播

在网络训练中,前向传播最终产生一个标量损失函数,反向传播算法则将损失函数的信息沿网络层向后传播用以计算梯度,达到优化网络参数的目的。

损失函数:平方误差(更适合输出为连续,并且最后一层不含Sigmoid或Softmax激活函数的神经网络)、交叉熵误差(更适合二分类多分类的场景)。

为什么平方损失不适合最后一层含有Sigmoid或Softmax激活函数的神经网络?答:平方误差损失函数相对于输出层的导数其中激活函数的导数的那一项$f’(z^{(L)})$,当激活函数为sigmoid的时候,如果$z^{(L)}$绝对值比较大,函数梯度会趋于饱和,从而使得基于梯度的学习速度非常缓慢。而交叉熵损失函数对于输出层的导数是线性的,不会存在学习速度过慢的问题。

循环神经网络

在网络训练中,前向传播最终产生一个标量损失函数,反向传播算法则将损失函数的信息沿网络层向后传播用以计算梯度,达到优化网络参数的目的。

梯度爆炸

梯度爆炸的问题可以通过梯度裁剪来缓解,即当梯度的范式大于某个给定值时,对梯度进行等比收缩梯度消失问题相对棘手,需要对模型本身进行改进。深度残差网络是对前馈神经网络的改进,通过残差学习的方式缓解了梯度消失的现象;对于循环神经网络来说,LSTM及其变种GRU等模型通过加入门控机制,很大程度上弥补了梯度消失所带来的损失。

在循环神经网络中使用ReLU作为激活函数,需要对矩阵W的初值做一定限制,否则十分容易引发数值问题。而在卷积神经网络中一般不会出现严重的数值问题。只有当W的取值在单位矩阵附近时才能取得比较好的效果,因此需要将W初始化为单位矩阵,在一些应用中取得了与LSTM相似的结果,并且学习速度比LSTM更快,是一个小trick。

LSTM

LSTM输入门控制当前计算的新状态以多大程度更新到记忆单元中;遗忘门控制前一步记忆单元中的信息有多大程度被遗忘掉;输出门控制当前的输出有多大程度上取决于当前的记忆单元。与传统的循环神经网络不同的是,从上一个记忆单元的状态到当前的状态的转移不一定完全取决于激活函数计算得到的状态,还由输入门和遗忘门来共同控制

为什么遗忘门、输入门和输出门使用Sigmoid,生成候选记忆用Tanh作为激活函数?答:这两个激活函数都是饱和的,即在输入达到一定值时输出不再明显变化。如果用非饱和激活函数如ReLU,则难以实现门控效果。
Sigmoid函数输出在0~1之间,符合门控的物理定义;Tanh函数输出在-1~1之间,与大多数场景下特征分布是0中心吻合。此外,Tanh函数在输入为0附近相比Sigmoid函数有更大的梯度,通常使模型收敛更快。

Seq2Seq

在Seq2Seq模型中,当前输出词由当前隐状态以及上一个输出词决定,即:

核心思想是,通过深度神经网络将一个作为输入的序列映射为一个作为输出的序列,这一过程由编码输入解码输出两个环节构成。在经典的实现中,编码器和解码器各由一个循环神经网络构成,既可以选择传统循环神经网络也可以使用LSTM、GRU等。Seq2Seq模型中,两个循环神经网络是共同训练的。Seq2Seq模型最核心的部分是其解码部分。最基础的解码方法是贪心法,即选取一种度量标准后,每次都在当前状态下选择最佳的一个结果,直到结束。贪心法的计算代价低,适合作为基准结果与其他方法相比较。贪心法获得的是一个局部最优解,由于实际问题的复杂性,该方法往往并不能取得最好的结果。

集束搜索是常见的改进算法,它时一种启发式算法。该方法会保存beam size个当前的较佳选择,然后解码时每一步根据保存的结果进行下一步扩展和排序,接着选择前beam size个进行保存,循环迭代,直到结束时选择最佳的一个作为解码的结果。实际应用中beam size取8~12为佳。除了集束搜索,解码时使用堆叠的RNN、增加Dropout机制、与解码器之间建立残差连接等,均是常见的改进措施。此外,解码时还可以采用记忆网络等,从外界获取知识。

实际使用中,随着输入序列的增长,模型的性能会显著下降。因为编码时输入序列的全部信息压缩到了一个向量表示中,随着序列增长,句子越前面的词的信息丢失就越严重。将源语言句子逆序输入,或者重复输入两遍来训练模型,可以得到一定的性能提升。使用LSTM也能够一定程度上缓解这个问题,但在实践中过长的序列仍然难以有很好的表现。同时,Seq2Seq模型的输出序列中,常常会损失部分输入序列的信息,这是因为在解码时,当前词及对应的源语言词的上下文信息位置信息在解码过程中丢失了。

Attention

注意力机制使得解码时每一步可以有针对性地关注与当前有关的编码结果,从而减小解码器输出表示的学习难度,也更容易学习到长期的依赖关系。

Seq2Seq中加入注意力机制也是为了解决过长序列的问题,在注意力机制中,仍然可以用普通的循环神经网络对输入序列进行解码,得到隐状态$h_1,h_2,…,h_T$。但在解码时,每一个输出词都依赖于前一个隐状态以及输入序列每一个对应的隐状态。

其中$c_i$为语境向量,是输入序列全部隐状态$h_1,h_2,…,h_T$的加权和

其中注意力权重参数$\alpha_{ij}$并不是一个固定权重,而是由另一个神经网络计算得到

神经网络$a$根据上一个时间步的输出序列隐状态$s_{i-1}$和当前时间步的输入序列隐状态$h_j$,计算出一个$x_j,y_j$对齐的值$e_{ij}$,再归一化得到权重$\alpha_{ij}$。一个直观的解释是,在生成一个输出词时,会考虑每一个输入词和当前输出词的对齐关系,对齐越好的词,会有越大的权重,对生成当前输出词的影响也就越大。

训练技巧

  1. 解决过拟合的方法有:数据集增强、参数范数惩罚/正则化、模型集成等;其中Dropout是模型集成方法中最高效与常用的技巧。同时,深度神经网络的训练中涉及诸多手调参数,如学习率、权重衰减系数、Dropout比例等,这些参数的选择会显著影响模型最终的训练效果。批量归一化(Batch Normalization,BN)方法有效规避了这些复杂参数对网络训练产生的影响,在加速训练收敛的同时也提升了网络的泛化能力
  2. 神经网络训练时是否可以将全部参数初始化为0?答:不能。
    考虑全连接的深度神经网络,同一层的神经元都是同构的,拥有相同的输入和输出,如果再将参数全部初始化为相同的值,那么无论前向传播还是反向传播的取值都是相同的。学习过程将永远无法打破这种对称性,最终同一个网络层中的各个参数仍然是相同的。
  3. Dropout抑制过拟合的工作原理:Dropout随机丢弃部分神经元的机制,相当于每次迭代都在训练不同结构的神经网络。类比于Bagging方法,Dropout可以被认为是一种实用的大规模深度神经网络的模型集成算法。这是由于传统意义上的Bagging涉及多个模型的同时训练与测试评估,当网络与参数规模庞大时,这种集成方式需要消耗大量的运算时间与空间。Dropout在小批量级别上的操作,提供了一种轻量级的Bagging集成近似,能够实现指数级数量神经网络的训练与评测。对于包含N个神经元节点的网络,在Dropout的作用下可以看作$2^N$个模型的集成。这$2^N$个模型可认为是原始网络的子网络,它们共享部分权重,并且具有相同的网络层数,而模型整体的参数数目不变,大大简化了运算。对于任意神经元,每次训练中都与一组随机挑选的不同的神经元集合共同进行优化,这个过程为减弱全体神经元之间的联合适应性,减少过拟合的风险,增强泛化能力。
  4. 批量归一化的基本动机与原理:神经网络训练过程的本质是学习数据分布,如果训练数据与测试数据的分布不同将会大大降低网络的泛化能力,因此我们需要在训练开始前对所有输入数据进行归一化处理。然而随着网络训练的进行,每个隐层的参数变化使得后一层的输入发生变化,从而每一批训练数据的分布也随之变化,致使网络在每次迭代中都需要拟合不同的数据分布,增大训练的复杂度以及过拟合的风险。
    批量归一化方法是针对每一批数据,在网络每一层输入之间增加归一化处理(均值为0,标准差为1),将所有批数据强制性在同一的数据分布下。可以看作在每一层输入和上一层输出之间加入了一个新的计算层,对数据的分布进行了额外的约束,从而增强模型的泛化能力。但是批量归一化同时也降低了模型的拟合能力,归一化之后的输入分被强制为0均值和1标准差。在具体的应用中,是会加入变换重构以及其他可学习参数的。

其他

深度卷积网络、深度残差网络

参考文献:本文部分内容参考自蓝白绛

本文来源:「想飞的小菜鸡」的个人网站 vodkazy.cn

版权声明:本文为「想飞的小菜鸡」的原创文章,采用 BY-NC-SA 许可协议,转载请附上原文出处链接及本声明。

原文链接:https://vodkazy.cn/2020/10/06/《百面机器学习》阅读笔记

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者,更多文章请访问想飞的小菜鸡