1.分类评价标准,准确率、精确率、召回率、F1
精确率P = TP/(TP+FP)也叫查准率
召回率R = TP/(TP+FN)也叫查全率
F1 = 2*P*R/(P+R)
我们希望精确率和召回率都很高,但实际上是矛盾的,上述两个指标是矛盾体,无法做到双高。因此,选择合适的阈值点,就需要根据实际问题需求,比如我们想要很高的精确率,就要牺牲掉一些召回率。想要得到很高的召回率,就要牺牲掉一些精准率。但通常情况下,我们可以根据他们之间的平衡点,定义一个新的指标:F1分数(F1-Score)。F1分数同时考虑精确率和召回率,让两者同时达到最高,取得平衡。(一)准确率是指分类正确的样本占总样本个数的比例,但是存在明显的缺陷,当不同类别的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素,可以使用更为有效的平均准确率(每个类别下的样本准确率的算术平均)作为模型评估的指标。(二)精确率是指在所有预测为正的样本中,确实为正的比例,召回率是指本身为正的样本中,被预测为正的比例。精确率和召回率既是矛盾又统一的两个指标,为了评估一个模型的好坏,不仅要看不同模型的精确率和召回率,而且最好绘制出模型的P-R曲线,除此之外,F1 score和ROC曲线也能综合的反映一个排序模型的性能,F1 score是精确率和召回率的调和平均值,定义为F1 = (2*P*R)/(P+R)
真正率(TPR)和假正率(FPR)
真正率(TPR) = TP/(TP+FN)
假正率(FPR) = FP/(FP+TN)
TPR和FPR分别基于实际表现1、0出发的,也就是说在实际的正样本和负样本中来观察相关概率问题,因此无论样本是否均衡,都不会被影响,能避免样本不平衡的问题,这就是为什么用TPR和FPR作为ROC、AUC指标的原因。
ROC横坐标为假正率(FPR),纵坐标为真正率(TPR),ROC曲线的横坐标为假阳性率(FPR),纵坐标为真阳性率(TPR),FPR=FP/N,TPR=TP/P,P代表真实的正样本的数量,N是真实的负样本的数量,TP是P个正样本中被分类器预测为正样本的个数,FP是N个负样本中被分类器预测为正样本的个数。AUC指的是ROC曲线下的面积大小,该值能够量化的反映基于ROC曲线衡量出的模型性能,ROC曲线能在样本不均匀的测试集中保持形状基本不变,而P-R曲线会发生明显的变化,ROC曲线则能够更加稳定的反映模型本身的好坏。
AUC表示ROC曲线下的面积,用于判断模型的优劣,比如连接对角线的面积刚好是0.5,对角线的含义也就是随机判断预测结果,正负样本覆盖应该都是50%,另外ROC曲线越陡越好,所以理想值是1,即正方形,所以AUC的值一般是0.5和1之间的
2.L1和L2正则化
L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择,L1范数:向量中各个元素绝对值之和
L2正则化可以防止过拟合,L2范数:向量中各个元素平方和的开二次方根
降低过拟合程度:正则化之所以能降低过拟合的原因在于,正则化是结构风险最小化的一种策略实现,给Loss function加上正则化项,能使得新得到的优化目标函数h=f+normal需要在f和normal中做一个权衡,如果还像原来只优化的情况下,那可能得到一组比较复杂,使得正则项normal比较大,那么h就不是最优的,因此可以看出加正则项能让解更加简单,通过降低模型复杂度,得到更小的泛化误差,降低过拟合程度
L1正则化和L2正则化:L1正则化就是在Loss function后加正则项为L1范数,加上L1范数容易得到稀疏解(0比较多),L2正则化就是在loss function后面加正则化为L2范数的平方,加上L2正则相比于L1来说,得到的解比较平滑,但是同样能够保证解中接近于0(但不是等于0,所以相对平滑)的维度比较多,降低模型复杂度。因为把参数加到了损失函数里,可以在梯度下降时让参数变得更小,防止模型能够拟合特别复杂的函数。
3.梯度消失与梯度爆炸的解决方案
梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因 为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑一下三种方案解 决:
ReLu的问题是什么?
爆炸梯度(通过梯度裁剪来解决)
死亡ReLu — 激活为0时不进行学习(通过加参数的ReLu解决)
激活值的均值和方差不是0和1。(通过从激活中减去约0.5来部分解决这个问题。在fastai的视频力有个更好的解释)
(2)用Batch Normalization或者Layer Normalization
BN是对同一batch内的数据的同一纬度做归一化,因此有多少维度就有多少个均值 和 方差;而LN则是对单个样本的所有维度来做归一化,因此一个batch中就有 batch_size 个均值和方差。
(3)LSTM的结构设计也可以改善RNN中的梯度消失问题。
(4)残差网络
4. 深度学习优化器
深度学习优化器:梯度下降最常见的三种变形 BGD,SGD,MBGD
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度
BGD缺点:由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。Batch gradient descent 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。
缺点是SGD的噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。所以虽然训练速度快,但是准确度下降,并不是全局最优。虽然包含一定的随机性,但是从期望上来看,它是等于正确的导数的。
缺点:
SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。
BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。
当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。
MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
缺点:
对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。)
SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。
Momentum:可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。
Adagrad:Adagrad 的优点是减少了学习率的手动调节
缺点:它的缺点是分母会不断积累,这样学习率就会收缩并最终会变得非常小。
RMSprop:RMSprop 与 Adadelta 的第一种形式相同:(使用的是指数加权平均,旨在消除梯度下降中的摆动,与Momentum的效果一样,某一维度的导数比较大,则指数加权平均就大,某一维度的导数比较小,则其指数加权平均就小,这样就保证了各维度导数都在一个量级,进而减少了摆动。允许使用一个更大的学习率η)
Adam:除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:
4. Adam optimiser的局限性是什么?
虽然使用Adam进行训练有助于快速收敛,但结果模型的泛化性能往往不如使用SGD进行动量训练时的泛化性能。另一个问题是,即使Adam有自适应学习率,当使用良好的学习率计划时,它的性能也会提高。特别是在训练的早期,使用较低的学习率来避免发散是有益的。这是因为在一开始,模型的权值是随机的,因此得到的梯度不是很可靠。如果学习率太大,可能会导致模型采取太大的步骤,而没有确定合适的权重。当模型克服了这些初始稳定性问题后,可以提高学习速度,加快收敛速度。这个过程被称为学习率热身,其中一个版本在论文“Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour”中有描述。
5.AdamW和Adam有什么不同?
AdamW是Adam在权重上使用了L2正则化,这样小的权重泛化性能更好。
4.训练数据不足会带来什么问题?如何缓解数据量不足带来的问题
回答:训练数据不足带来的问题主要表现在过拟合方面,处理方法大致分为两类,(一) 是基于模型的方法,主要是采用降低过拟合的措施,包括简化模型(如将非线性模型简 化为线性模型)、添加约束项以缩小假设空间(如L1/L2正则项)、集成学习、Dropout 超参数等;(二)是基于数据的方法,主要通过数据扩充,即根据一些先验知识,在保 持特定信息的前提下,对原始数据进行适当变换以达到扩充数据集的效果。通用的数据 扩充方法有SMOTE算法、上采样技术、生成式对抗网络模型生成新样本
SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添 加到数据集中,具体如下图所示,算法流程如下。
(1)对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集中所有样本 的距离,得到其k近邻。
(2)根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本 x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn。
(3)对于每一个随机选出的近邻xn,分别与原样本按照如下的公式构建新的样本。
5.比较Bagging和Boosting的异同
二者都是集成学习算法,都是将多个弱学习器组合成强学习器的方法。
(1)Bagging:对数据进行自助采样法,从原始数据集中每一轮有放回地抽取训练集, 对结果进行简单投票法,
随机森林是Bagging的一个扩展变体,随机森林在以决策树为基学习器构建Bagging 集成的基础上,进一步在决策树的训练过程中映入了随机属性选择。具体来说,传统的 决策树在选择划分属性时在当前节点选择一个最优属性;而在随机森林中对基决策树的 每个节点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个 子集中选择一个最优属性用于划分。在很多例子中表现功能强大,进一步使泛化性能提 升,被称为 ‘代表集成学习技术水平的方法’。 随机森林在Bagging的基础上做了修 改
从样本集中用Bootstrap采样选出n个样本;
从所有属性中随机选择k个属性,选择最佳分割属性作为节点建立CART决策树;
重复以上两个步骤m次,即建立了m棵CART决策树
这m棵CART决策树形成随机森林,通过投票表决结果,决定数据属于哪一类
从原始数据集中每一轮有放回地抽取训练集,训练得到k个弱学习器,将这k个弱学习 器以投票的方式得到最终的分类结果。
(2)Boosting:每一轮根据上一轮的分类结果动态调整每个样本在分类器中的权重, 训练得到k个弱分类器,他们都有各自的权重,通过加权组合的方式得到最终的分类结 果。
GBDT回归和XGBoost
7.集成学习算法
集成学习 (ensemble learning)通过构建并结合多个学习器来完成学习任务。先产生一组"个体学习器" (individual learner),再用某种策略将它们结合起来。集成算法包括很多种包括Bagging,随机森林,Boosting 以及其他更加高效的集成算法。
集成学习主要分为两类:
平均方法:例如随机森林, Bagging methods。在平均方法中,系统分别去建立多个基分类器,分类器之间没有任何联系。然后在分类或者回归阶段,各个分类器根据测试数据给出自己的答案,然后系统根据各个分类器给出的结果去综合出最后的结果,比如可以使投票的形式。
提升方法:例如梯度提升决策树GBDT,AdaBoost。在提升方法中,系统模型在训练过程中会先后建立一系列分类器,这些分类器单个可能是弱分类器,但是组合起来就成为一个强分类器。
平均方法通常比其任何一个基分类器效果好因为尝试去降低模型的方差,而提升方法尝试去降低模型的偏差。
方差和偏差的来源
我们机器学习的模型,必不可少地对数据非常依赖。然而,如果你不知道数据服从一个什么样的分布,或者你没有办法拿到所有可能的数据(肯定拿不到所有的),那么我们训练出来的模型和真实模型之间,就会存在不一致。这种不一致表现在两个方面。
真实模型根本就没有包含在我们训练模型的模型空间中。比如本来是非线性模型,你非要拿线性模型去拟合数据,那么不论你怎么调整模型参数去选择模型,结果也是不对的。这就是偏差的来源。表现为模型不正确。
不管真实模型在不在我们训练模型的空间中,由于我们不能拿到所有可能的数据,如果拿到的数据不是那么具有代表性,那么不同的数据训练出来的模型参数就会不同。然后用这个模型去做预测,结果也就会和真实值之间有差异。这就是方差的来源。表现为模型不稳定。
避免偏差的话,首先我们需要尽量选择正确的模型, 我们还要慎重选择数据集的大小, 我们还要正确选择模型的复杂度
平均的方法采用多个分类器集体表决,就算其中一个分类器偏差较大,整体不会受其影响,偏差较小;然后,集体表决意味着模型泛化能力比较强,其分类能力相对于其中的每一个单一分类器是稳定的,所以相当于降低了方差。
提升的方法通过构造一系列的弱分类器对相同的训练数据集的重要性区别对待达到对训练数据的精确拟合,因此是降低了偏差。
8.文本分类有哪些方法
机器学习:朴素贝叶斯,支持向量机,K近邻,决策树
深度学习:CNN,RNN,FastText,LDA,LSTM
FastText模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率
序列中的词和词组组成特征向量(加和),特征向量通过线性变换映射到中间层,中间层再映射到标签
FastText在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数
FastText模型架构和word2vec中的cbow模型很类似,不同之处在于,FastText预测标签,而cbow模型预测中间词
FastText方法不同与word2vec方法,引入了两类特征并进行embedding。其中n-gram颗粒度是词与词之间,n-char是单个词之间。两类特征的存储均通过计算hash值的方法实现。
n-gram示例: who am I? n-gram设置为2
n-gram特征有,who, who am, am, am I, I
n-char示例: where, n=3, 设置起止符<, >
n-char特征有,
FastText词向量和word2vec对比:
FastText = word2vec中cbow + h-softmax的灵活使用
模型的输出层:word2vec的输出层,对应的是每一个term,计算某term的概率最大;而FastText 的输出层对应的是分类的label。不过不管输出层对应的是什么内容,起对应的vector都不会被保留和使用;
模型的输入层:word2vec的输入层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容;两者本质的不同,体现在 h-softmax的使用。 Word2vec的目的是得到词向量,该词向量 最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,但最终都被抛弃,不会使用。FastText 则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)。
7梯度消失与梯度爆炸的解决方案
梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑一下三种方案解决:
BN是对同一batch内的数据的同一纬度做归一化,因此有多少维度就有多少个均值和 方差;而LN则是对单个样本的所有维度来做归一化,因此一个batch中就有batch_size 个均值和方差。
(3)LSTM的结构设计也可以改善RNN中的梯度消失问题。
(4)残差网络
1. Word2vec的两种方式CBOW(Continuous Bag-of-Words 与Skip-Gram两种模型
具体是怎么实现的
CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。
Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。
Skip-Gram要好于CBOW。因为Skip-Gram本身是通过多种周围词的正确性来约束中心词。
word2vec主要的实现方式有两种,分别为 Hierarchical(分层) Softmax 和 Negative sampling。他们和 CBOW 、 skip-gram 两两结合,共可以组成4种不同的模型。
Word2vec 的训练trick:Hierarchical softmax 只是 softmax 的一种近似形式而 negative sampling 也是从其他方法借鉴而来。为什么要用训练技巧呢? 如我们刚提到的,Word2vec 本质上是一个语言模型,它的输出节点数是 V 个,对应了 V 个词语,本质上是一个多分类问题,但实际当中,词语的个数非常非常多,会给计算造成很大困难,所以需要用技巧来加速训练。
hierarchical softmax:本质是把 N 分类问题变成 log(N)次二分类
思想是根据类别的频率构造霍夫曼树来代替标准softmax,通过分层softmax可以将复杂度从N降低到logN
negative sampling:本质是预测总体类别的一个子集
采样方式:
子采样,去掉高频词。可以降低词典大小,以及提升低频次的表示精度
负例采样
cbow的对周围词的调整是统一的:求出的gradient的值会同样的作用到每个周围词的词向量当中去。
可以看到,cbow预测行为的次数跟整个文本的词数几乎是相等的(每次预测行为才会进行一次backpropgation, 而往往这也是最耗时的部分),复杂度大概是O(V);
而skip-gram是用中心词来预测周围的词。在skip-gram中,会利用周围的词的预测结果情况,使用GradientDecent来不断的调整中心词的词向量,最终所有的文本遍历完毕之后,也就得到了文本所有词的词向量。
可以看出,skip-gram进行预测的次数是要多于cbow的:因为每个词在作为中心词时,都要使用周围词进行预测一次。这样相当于比cbow的方法多进行了K次(假设K为窗口大小),因此时间的复杂度为O(KV),训练时间要比cbow要长。
但是在skip-gram当中,每个词都要收到周围的词的影响,每个词在作为中心词的时候,都要进行K次的预测、调整。因此, 当数据量较少,或者词为生僻词出现次数较少时, 这种多次的调整会使得词向量相对的更加准确。因为尽管cbow从另外一个角度来说,某个词也是会受到多次周围词的影响(多次将其包含在内的窗口移动),进行词向量的跳帧,但是他的调整是跟周围的词一起调整的,grad的值会平均分到该词上, 相当于该生僻词没有收到专门的训练,它只是沾了周围词的光而已。
一:Word2vec的Hierarchical Softmax原理
使用霍夫曼树有什么好处呢?首先,由于是二叉树,之前计算量为V,现在变成了log2V。第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。
(1) 首先,对于从输入层到隐藏层的映射,没有采取神经网络的线性变换加激活函数的方法,而是采用简单的对所有输入词向量求和并取平均的方法
(2)然后在输出层构建哈夫曼树,用词语词频来构建哈夫曼树,为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射
(3) 其中,根节点的词向量对应我们的投影后的词向量,而所有叶子节点就类似于之前神经网络softmax输出层的神经元,叶子节点的个数就是词汇表的大小。在霍夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名为"Hierarchical Softmax"。
(4) 如何“沿着霍夫曼树一步步完成”呢?在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数
(5)每一个要走的结点输入都是对应我们的投影后的词向量,损失函数就是把所有经过的结点采用sigmoid函数计算后的概率连成,使它概率最大,那就计算每个经过的结点的梯度,采用随机梯度上升法,把计算的每个梯度加和,在反代回去改变词向量,使用随机梯度上升
二:Word2Vec的负采样原理
使用所谓的“负采样”(negative sampling)来改进优化对象,这将造成每一个训练的样本只会对模型权重的很小一个比例的更新。在训练神经网络时,每当接受一个训练样本,然后调整所有神经单元权重参数,来使神经网络预测更加准确。换句话说,每个训练样本都将会调整所有神经网络中的参数。
我们词汇表的大小决定了我们skip-gram 神经网络将会有一个非常大的权重参数,并且所有的权重参数会随着数十亿训练样本不断调整。
negative sampling 每次让一个训练样本仅仅更新一小部分的权重参数,从而降低梯度下降过程中的计算量。negative sampling 的想法也很直接 ,将随机选择一小部分的 negative words,比如选 10个 negative words 来更新对应的权重参数。使用 一元模型分布 (unigram distribution) 来选择 negative words,一个单词被选作 negative sample 的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words,比如我们有一个训练样本,中心词是w,它周围上下文共有2c个词,记为context(w)。由于这个中心词w,的确和context(w)相关存在,因此它是一个真实的正例。通过Negative Sampling采样,我们得到neg个和w不同的中心词wi,i=1,2,..neg,这样context(w)和wi就组成了neg个并不真实存在的负例。利用这一个正例和neg个负例,我们进行二元逻辑回归(sigmoid),得到负采样对应每个词wi对应的模型参数θi,和每个词的词向量。使用随机梯度上升
每一个词的Q会跟整个序列中的每一个K计算得分,然后基于得分再分配特征
位置信息表达:在self-attention中每个词都会考虑整个序列的加权,所以其出现位置并不会对结果产生什么影响,相当于放哪儿都无所谓,但是这跟实际有些不符合了,我们希望模型能对位置有额外的认识,所以加入了位置信息表达
transformer中的attention为什么scaled?为什么scaled是维度的根号
假设向量q和k的各个分量是互相独立的随机变量,均值为0,方差是1,那么点积q.k的均值为0,方差为dk,方差越大也就说明点积的数量级越大(以越大的概率取大值),为了消除这种影响,将点积缩小根号dk
将模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。多次attention综合的结果至少能够起到增强模型的作用,也可以类比CNN中同时使用多个卷积核的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。
LSTM 中梯度的传播有很多条路径,[公式] 这条路径上只有逐元素相乘和相加的操作,梯度流最稳定;但是其他路径(例如 [公式] )上梯度流与普通 RNN 类似,照样会发生相同的权重矩阵反复连乘。LSTM 通过改善一条路径上的梯度问题拯救了总体的远距离梯度
如果前面的输入比较集中(小sigma),则sigmoid函数值大概率为0.5,导数值大概率为0.25,此时梯度都会衰减,但是乘以0.5衰减得慢一些;
如果前面的输入比较分散(大sigma),则sigmoid函数值大概率为0或1,导数值大概率为0,梯度乘以函数值基本上要么完整保留要么完全消失,梯度乘以导数值则只会消失了。
所以,在RNN中,每乘以一次sigmoid的导数值都会让后向传播的梯度衰减一次,需要靠全连接层的矩阵拉回来,但是如果拉得过头了又会导致梯度爆炸,而如果sigmoid前面的方差大的话还会导致梯度直接消失,全连接层救都救不回来;在LSTM中,每乘以一次sigmoid的函数值都可以让后向传播的梯度保留或者衰减消失,非常灵活,而且前后两个hidden cell可以走forget gate这条捷径直达,不需要经过全连接层,而全连接层是梯度爆炸的根源,因此在这条路径上LSTM不需要担心梯度爆炸的问题。
不过cell这条路径不爆炸不代表别的路径不爆炸,比如从hidden cell经过output gate到hidden state中间就又有全连接层,而这一步hidden state又会接到下一步hidden cell,所以这条路径上存在全连接层的串联,有可能会导致梯度爆炸。
Attention从数学角度来形容是一个变量query到变量一系列(key-value)对的映射,从公式上描述是根据query和key计算values的加权求和的机制。
在计算attention时主要分为三步:
(1)第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;
(2)第二步一般是使用一个softmax函数对这些权重进行归一化;
(3)最后将权重和相应的键值value进行加权求和得到最后的attention。
目前在NLP研究中,key和value常常都是同一个,即key=value。
具体:
HMM模型有5个基本组成:观测序列、状态序列、状态初始概率、状态转移概率和状态发射概率。分词属于HMM的预测问题,即已知观测序列、状态初始概率、状态转移概率和状态发射概率的条件下,求状态序列。结巴分词已经内置了训练好的状态初始概率、状态转移概率和状态发射概率。
句子会作为观测序列,当有新句子进来时,具体做法为:先通过Viterbi算法求出概率最大的状态序列,然后基于状态序列输出分词结果(每个字的状态为B、M、E、S之一)。
HMM的四种算法
EM算法: 只有观测序列,无状态序列时来学习模型参数,即Baum-Welch算法
维特比算法: 用动态规划解决HMM的预测问题,不是参数估计
和Beam-Search的算法类似,不同之处在于维特比算法一定能找到最优值,Beam-Search的算法不一定找到最优值
前向后向:用来算概率
极大似然估计:即观测序列和相应的状态序列都存在时的监督学习算法,用来估计参数
命名实体识别是用条件随机场做的
其主要思想来自HMM,也是一种用来标记和切分序列化数据的统计模型,不同的是,条件随机场是在给定观察的标记序列下,计算整个标记序列的联合概率,而HMM是在给定当前状态下,定义下一个状态的分布
在CRF中定义一个特征函数集合,然后使用这个特征函数集合为标注序列进行打分,通常特征函数取值为0或1,表示不符合这条规则约束,其中Tk(Yi-1,Yi,i)叫转移函数,依赖于当前和前一个位置,表示从标注序列中位置i-1的标记Yi-1转移到位置i上的标记Yi的概率,其中Sl(Yi,X,i)依赖当前位置,表示标记序列在位置i上为标记Yi的概率,最后也是利用Viterbi算法计算,相较于HMM,CRF能够捕捉全局的信息,能够灵活的特征设计
二:当数据维数很高的时候,我们可以用PCA降维,但是降维前通常我们要对数据进行标准化,为什么要这样做?这有什么好处?
PCA(主成分分析)所对应的数学理论是SVD(矩阵的奇异值分解)。而奇异值分解本身是完全不需要对矩阵中的元素做标准化或者去中心化的。
但是对于机器学习,我们通常会对矩阵(也就是数据)的每一列先进行标准化。
PCA通常是用于高维数据的降维,它可以将原来高维的数据投影到某个低维的空间上并使得其方差尽量大。如果数据其中某一特征(矩阵的某一列)的数值特别大,那么它在整个误差计算的比重上就很大,那么可以想象在投影到低维空间之后,为了使低秩分解逼近原数据,整个投影会去努力逼近最大的那一个特征,而忽略数值比较小的特征。因为在建模前我们并不知道每个特征的重要性,这很可能导致了大量的信息缺失。为了“公平”起见,防止过分捕捉某些数值大的特征,我们会对每个特征先进行标准化处理,使得它们的大小都在相同的范围内,然后再进行PCA。
此外,从计算的角度讲,PCA前对数据标准化还有另外一个好处。因为PCA通常是数值近似分解,而非求特征值、奇异值得到解析解,所以当我们使用梯度下降等算法进行PCA的时候,我们最好先要对数据进行标准化,这是有利于梯度下降法的收敛。
三:PCA 降维方法中,求出 n个特征向量后,为什么要选取最大的k个(k 最大方差理论:方差越大,信息量就越大。协方差矩阵的每一个特征向量就是一个投影面,每一个特征向量所对应的特征值就是原始特征投影到这个投影面之后的方差。由于投影过去之后,我们要尽可能保证信息不丢失,所以要选择具有较大方差的投影面对原始特征进行投影,也就是选择具有较大特征值的特征向量。然后将原始特征投影在这些特征向量上,投影后的值就是新的特征值。每一个投影面生成一个新的特征,k个投影面就生成k个新特征。 PCA降维的目的,就是为了在尽量保证“信息量不丢失”的情况下,对原始特征进行降维,也就是尽可能将原始特征往具有最大信息量的维度上进行投影。将原特征投影到这些维度上,使降维后信息量损失最小。 方差: 当样本平衡时,分类器的决策规则为若(y/1-y)>1,即y>0.5,则预测为正例 当样本不平衡时,记m+为正例样本数量,m-为反例样本数量,m为所有样本数量,分类器决策规则变为:若(y/1-y)>(m+/m-),即y>(m+/m),则预测为正例 这种类别不平衡学习的策略也叫“再缩放(rescaling)或再平衡(reblance)” 10. L1和L2范数 是做特征选择看可以使用L1,L2范数,具体如下: L1范数具有系数解的特性,但是要注意的是,L1没有选到的特征不代表不重要,原因是两个高相关性的特征可能只保留一个。如果需要确定哪个特征重要,再通过交叉验证。为什么L1,L2范数可以防止过拟合呢?在代价函数后面加上正则项,L1即是lasso回归,L2是岭回归但是它为什么能防止过拟合呢?奥卡姆剃刀原理:能很好的拟合数据且模型简单,模型参数在更新时,l2正则项可使参数的绝对值趋于0,使得部分参数为0,降低了模型的复杂度(模型的复杂度由参数决定),从而防止了过拟合。提高模型的泛化能力, L1范数用于特征选择,L2范数可以约束模型参数,抑制过拟合,增强泛化性能, L1范数是指 w向量中各个元素绝对值之和,用于特征选择,L2范数 是指向量各元素的平方和然后求平方根,用于 防止过拟合,提升模型的泛化能力 首先构建决策树:谁来当根节点?挨个计算每个特征属性下的信息增益,选择信息增益最大的属性最为第一个划分结点 (1)首先计算什么都不做之下的系统的信息熵(计算label的熵值), (2)然后挨个计算按照特征属性里具体的值创建分支并计算分了以后的信息熵(比如选择第一个属性当作根结点,按照第一个属性的具体值创建完分支划分完之后,计算每个分支下label的熵值,然后每个分支通过计算本身是有概率的(按照这个特征属性列的类别个数去计算概率),通过每个分支的label熵值乘以这个分支的概率值,再把所有计算的分支加起来就是选择这个属性特征下计算的系统信息熵), (3)用系统熵挨个减去按照属性划分了之后的信息熵,得到的便是信息增益,选择信息增益最大的那个特征属于当作根节点的判断条件,信息增益最大代表选择该属性去划分时候会使得系统划分的更加准确更纯一些 算法:ID3(信息增益) 缺点:某些属性特征里的具体值有很多类,而按照这个分里面的样本个数又都比较小,这样计算下来的信息增益就很大,那它就会被选为根节点,但是这个属性很有可能和分类label关系并不大,就导致最后分类效果并不好,信息增益准则对那些属性的取值比较多的属性有所偏好,也就是说,采用信息增益作为判定方法,会倾向于去选择属性取值比较多的属性 C4.5(信息增益率) 其中分母是计算这个属性在整个样本中的的熵(信息熵和熵不是同一个东西) 增益率准则对属性取值较少的时候会有偏好,为了解决这个问题,C4.5并不是直接选择增益率最大的属性作为划分属性,而是之前先通过一遍筛选,先把信息增益低于平均水平的属性剔除掉也就是信息增益率高于平均水平的属性删除掉,之后从剩下的属性中选择信息增益率最高的,这样的话,相当于两方面都得到了兼顾。 CART(Gini系数) 剪枝策略:决策树高度太高也就是分支太多,会学到一些噪音点,容易过拟合,在测试集上表现不好,策略: (1)预剪枝:在构建决策树的过程时,提前停止,比如设置一个mini_sample=10,当结点里的样本小于mini_sample就不分了,进行剪枝,在每一次实际对结点进行进一步划分之前,先采用验证集的数据来验证如果划分是否能提高划分的准确性。如果不能,就把结点标记为叶结点并退出进一步划分;如果可以就继续递归生成节点。 (2)后剪枝:决策树构建好后,然后才开始裁剪,计算分支叶结点的熵,如果加起来大于这些分支叶结点的熵,那就可以剪去分支叶结点了,后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来泛化性能提升,则将该子树替换为叶结点。就是对想要进行剪枝的结点进行验证集数据的准确性比较,如果剪枝能带来准确性的提高,那么就剪枝,否则保留。然后去判断其它需要考虑剪枝的结点。后剪枝决策树通常比预剪枝决策树保留了更多的分支;后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树;后剪枝决策树训练时间开销比未剪枝决策树和预剪枝决策树都要大的多 10. 比较Bagging和Boosting的异同 二者都是集成学习算法,都是将多个弱学习器组合成强学习器的方法。 Bagging:从原始数据集中每一轮有放回地抽取训练集,训练得到k个弱学习器,将这k个弱学习器以投票的方式得到最终的分类结果。 Boosting:每一轮根据上一轮的分类结果动态调整每个样本在分类器中的权重,训练得到k个弱分类器,他们都有各自的权重,通过加权组合的方式得到最终的分类结果。 26. 军民航空域动态管理协同决策子系统:2840420条数据和对应的2840420条标签数据,将总的数据集拆分为训练集2808420条据,验证集12000条数据,测试集20000条数据。并且每一个数据集中民航飞机和无人机的数据各占一半。准确率99.0%,精确率98.4%,召回率:98.9% 27. 军民航飞行情报报文智能转换系统:40000条数据,飞行任务:谁谁谁去哪里做什么,进行什么任务:label: RVA(飞行员训练),RVU(其他任务),RVX(国家领导人出行),RVT(活动保障任务),准确率90%, 28. 民航报文纠错:150多万条数据,FPL是纠错前的,AFTN是正确的报文,计算数据样本出现的频次,小于5的认为它是错误的,对照AFTN和管制员一起来找出它对应的正确的航线报文,有22000多条,总共单词有2000多个 9. LR为什么用极大似然估计,损失函数为什么是log损失函数(交叉熵) 因为我们想要让每一个样本的预测都要得到最大的概率,即将所有的样本预测后的概率进行相乘都最大,也就是极大似然函数。Log Loss 在使用似然函数最大化时,其形式是进行连乘,但是为了便于处理,一般会套上log,这样便可以将连乘转化为求和,由于log函数是单调递增函数,因此不会改变优化结果。因此log类型的损失函数也是一种常见的损失函数.‘ 节点的形态数 = 卡特兰数 = (2n!)/(n!*n!*(n+1))=f(n)=C(2n,n)/n+1 EM算法: 只有观测序列,无状态序列时来学习模型参数,即Baum-Welch算法 维特比算法: 用动态规划解决HMM的预测问题,不是参数估计 前向后向:用来算概率 极大似然估计:即观测序列和相应的状态序列都存在时的监督学习算法,用来估计参数 LR在线性回归的实数范围输出值上施加sigmoid函数将值收敛到0~1范围, 其目标函数也因此从差平方和函数变为对数损失函数, 以提供最优化所需导数(sigmoid函数是softmax函数的二元特例, 其导数均为函数值的f*(1-f)形式)。请注意, LR往往是解决二元0/1分类问题的, 只是它和线性回归耦合太紧, 不自觉也冠了个回归的名字(马甲无处不在). 若要求多元分类,就要把sigmoid换成大名鼎鼎的softmax了。逻辑回归和线性回归首先都是广义的线性回归,其次经典线性模型的优化目标函数是最小二乘法(损失函数是所有预测值和真实值的残差平方和最小),而逻辑回归则是似然函数,另外线性回归在整个实数域范围内进行预测,敏感度一致,而分类范围,需要在[0,1]。逻辑回归就是一种减小预测范围,将预测值限定为[0,1]间的一种回归模型,因而对于这类问题来说,逻辑回归的鲁棒性比线性回归的要好。线性回归是根据样本X各个维度的Xi的线性叠加(线性叠加的权重系数wi就是模型的参数)来得到预测值的Y,然后最小化所有的样本预测值Y与真实值y'的误差来求得模型参数。我们看到这里的模型的值Y是样本X各个维度的Xi的线性叠加,是线性的。逻辑回归的模型 是一个非线性模型,sigmoid函数,又称逻辑回归函数。但是它本质上又是一个线性回归模型,因为除去sigmoid映射函数关系,其他的步骤,算法都是线性回归的。可以说,逻辑回归,都是以线性回归为理论支持的。 实体[人类,城市,商品],关系[小明居住在上海,小明买了一箱可口可乐,小明经常喝碳酸饮料] α :文档中生成的主题密度,β:真主题内生成的词密度 Q 来自decoder,K、V来自encoder 我们可以这样来看待Attention机制:有输入数据Source,我们将Source中的构成元素想象成是由一系列的 典型生成模型:朴素贝叶斯法和隐马尔科夫模型 判别模型:k近邻、感知机、决策树、逻辑斯蒂回归、最大熵模型、支持向量机、提升方法和条件随机场。 word2vec得出的词向量其实就是训练后的一个神经网络的隐层的权重矩阵,在经过CBOW或者Skip-Gram模型的训练之后,词义相近的词语就会获得更为接近的权重,因此可以用向量的距离来衡量词的相似度。因为word2vec是有前提假设的,它假设了“具有相同上下文的中心词具有可替换性”,因为word2vec是有前提假设的,它假设了“具有相同上下文的中心词具有可替换性” 举个例子:苹果是甜的,西瓜是甜的,在你word2vec训练完后,取独热编码输入的隐含层得到的词向量的时候,这两句话的label都是一样的,即使在其他句子里,大概率它们都是能互换的,回到训练过程,作为样本输入的时候,它们计算的Loss和贡献的梯度差不多,那天然的最后训练完取词向量的时候这俩向量很相似 神经网络在反向传播的过程中,每一层的梯度的计算都要乘以上层传过来的梯度,要是每一层的梯度值都比较小,那么在反向传播的过程中越传播梯度越小,就会导致梯度消失。 神经网络在反向传播的过程中,每一层的梯度的计算都要用本层的数据(特征图)乘以上层传过来的梯度得到本层的梯度。那么就更好理解了,本层的数据被归一化限制在均值为零,那么相乘的时候就不会发生梯度爆炸。 BN与LN的区别在于: LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差; BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。 所以,LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。 LN用于RNN效果比较明显,但是在CNN上,不如BN。 使用霍夫曼树有什么好处呢?首先,由于是二叉树,之前计算量为V,现在变成了log2V。第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。 (1) 首先,对于从输入层到隐藏层的映射,没有采取神经网络的线性变换加激活函数的方法,而是采用简单的对所有输入词向量求和并取平均的方法 (2)然后在输出层构建哈夫曼树,用词语词频来构建哈夫曼树,为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射 (3) 其中,根节点的词向量对应我们的投影后的词向量,而所有叶子节点就类似于之前神经网络softmax输出层的神经元,叶子节点的个数就是词汇表的大小。在霍夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名为"Hierarchical Softmax"。 (4) 如何“沿着霍夫曼树一步步完成”呢?在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数 (5)每一个要走的结点输入都是对应我们的投影后的词向量,损失函数就是把所有经过的结点采用sigmoid函数计算后的概率连成,使它概率最大,那就计算每个经过的结点的梯度,采用随机梯度上升法,把计算的每个梯度加和,在反代回去改变词向量 使用所谓的“负采样”(negative sampling)来改进优化对象,这将造成每一个训练的样本只会更对模型权重的很小一个比例的更新。在训练神经网络时,每当接受一个训练样本,然后调整所有神经单元权重参数,来使神经网络预测更加准确。换句话说,每个训练样本都将会调整所有神经网络中的参数。 我们词汇表的大小决定了我们skip-gram 神经网络将会有一个非常大的权重参数,并且所有的权重参数会随着数十亿训练样本不断调整。 negative sampling 每次让一个训练样本仅仅更新一小部分的权重参数,从而降低梯度下降过程中的计算量。negative sampling 的想法也很直接 ,将随机选择一小部分的 negative words,比如选 10个 negative words 来更新对应的权重参数。使用 一元模型分布 (unigram distribution) 来选择 negative words,一个单词被选作 negative sample 的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words,以下这个公式就是计算频次的 比如我们有一个训练样本,中心词是w,它周围上下文共有2c个词,记为context(w)。由于这个中心词w,的确和context(w)相关存在,因此它是一个真实的正例。通过Negative Sampling采样,我们得到neg个和w不同的中心词wi,i=1,2,..neg,这样context(w)和wi就组成了neg个并不真实存在的负例。利用这一个正例和neg个负例,我们进行二元逻辑回归(sigmoid),得到负采样对应每个词wi对应的模型参数θi,和每个词的词向量。 梯度消失产生的主要原因有:一是使用了深层网络,二是采用了不合适的激活函数。 (1)目前优化神经网络的方法都是基于BP,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。其中将误差从末层往前传递的过程需要链式法则(Chain Rule)的帮助。而链式法则是一个连乘的形式,所以当层数越深的时候,梯度将以指数形式传播。梯度消失问题一般随着网络层数的增加会变得越来越明显。在根据损失函数计算的误差通过梯度反向传播的方式对深度网络权值进行更新时,得到的梯度值接近0,也就是梯度消失。 (2)计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显,原因如果使用sigmoid作为激活函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。 解决方法: (1)pre-training+fine-tunning 此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。 (2) 选择relu等梯度大部分落在常数上的激活函数 relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失的问题。 (3)batch normalization BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失的问题,或者可以理解为BN将输出从饱和区拉到了非饱和区。一种解决方法是在sigmoid层之前加入Batch Normalization层,即进行批规范化处理(BN),就是对每个神经元的输出进行规范化,使得均值为 0,方差为 1,之后再进入激活函数。但是每一层规范化后,输出就以极大的概率落在靠近中心的区间,这个区域sigmoid的梯度变化很大,也就不存在梯度消失的问题,但是又比较笔直,近似于线性。于是BN引入了新的参数进行学习,对规范化后的输出做一次线性映射,同时对参数进行学习,提高输出落在非线性区间的概率, 使得sigmoid 函数梯度小和线性表达之间做了一个平衡。 (4) 残差网络的捷径(shortcut) 相比较于之前的网络结构,残差网络中有很多跨层连接结构(shortcut),这样的结构在反向传播时多了反向传播的路径,可以一定程度上解决梯度消失的问题。 (5)LSTM的“门(gate)”结构 LSTM全称是长短期记忆网络(long-short term memory networks),LSTM的结构设计可以改善RNN中的梯度消失的问题。主要原因在于LSTM内部复杂的“门”(gates),LSTM通过它内部的“门”可以在更新的时候“记住”前几次训练的”残留记忆“。 过拟合:在机器学习模型训练或者深度学习模型训练的过程中,会出现模型在训练集上表现能力好,但是在测试集上表现欠佳,这种现象就是过拟合,常常主要原因是由于数据集中存在噪音数据或者训练样本维度太少或者训练集数量太少导致的。 解决方案: 增强训练样本集; 增加样本集的维度; 如果模型复杂度太高,和训练样本集的数量级不匹配,此时需要降低模型复杂度; 正则化,尽可能减少参数; 添加Dropout 应用场景:空管系统背景民航飞行情报报文航线纠错 行业现状:利用深度学习对飞行情报航线纠错很少 难题:包括前期数据的收集以及错误样本的校对工作,选取深度学习模型适用于纠错,以及最后保证纠错的准确率 思路和方法:花了大量时间和管制员一起分析整理数据,收集错误的样本以及校正后的样本数据,前期对深度学习了解不深,我选用的是LSTM去一个一个预测出正确的航迹点,不仅时间上花费很多而且准确率只有72%,后来通过学习了解到这种纠错的,输入是序列和输出是序列的模型,用Seq2Seq很适合,后来选用这个模型后不仅降低了纠错时间还增加纠错准确率到92%左右 主流解决方案:机器学习模型、集成模型 交叉熵公式: MSE(均方误差): 如果使用平方差损失,在进行梯度下降计算的时候会出现梯度消失。如果使用sigmoid激活函数,进行梯队计算的时候,会涉及到sigmoid函数的导数。 保持sigmoid激活函数不变,交叉熵损失函数可以很好的解决上面的问题。最终梯度与sigmoid的导数无关(计算过程中抵消掉了)。 logistic回归和softmax回归使用交叉熵而不用欧氏距离是因为前者的目标函数是凸函数,可以求得全局极小值点;用欧氏距离则无法保证。 神经网络中对分类问题使用交叉熵而不用欧氏距离是因为前者一般情况下可以收敛到更好的局部极小值点处,即一般情况下在精度上更好一些。 首先构建决策树:谁来当根节点?挨个计算每个特征属性下的信息增益,选择信息增益最大的属性最为第一个划分结点 算法:ID3(信息增益) 缺点:某些属性特征里的具体值有很多类,而按照这个分里面的样本个数又都比较小,这样计算下来的信息增益就很大,那它就会被选为根节点,但是这个属性很有可能和分类label关系并不大,就导致最后分类效果并不好,信息增益准则对那些属性的取值比较多的属性有所偏好,也就是说,采用信息增益作为判定方法,会倾向于去选择属性取值比较多的属性 C4.5(信息增益率) 其中分母是计算这个属性在整个样本中的的熵(信息熵和熵不是同一个东西) 增益率准则对属性取值较少的时候会有偏好,为了解决这个问题,C4.5并不是直接选择增益率最大的属性作为划分属性,而是之前先通过一遍筛选,先把信息增益低于平均水平的属性剔除掉,之后从剩下的属性中选择信息增益率最高的,这样的话,相当于两方面都得到了兼顾。 CART(Gini系数) 剪枝策略:决策树高度太高也就是分支太多,会学到一些噪音点,容易过拟合,在测试集上表现不好,策略: (1)预剪枝:在构建决策树的过程时,提前停止,比如设置一个mini_sample=10,当结点里的样本小于mini_sample就不分了,进行剪枝,在每一次实际对结点进行进一步划分之前,先采用验证集的数据来验证如果划分是否能提高划分的准确性。如果不能,就把结点标记为叶结点并退出进一步划分;如果可以就继续递归生成节点。 (2)后剪枝:决策树构建好后,然后才开始裁剪,计算分支叶结点的熵,如果加起来大于这些分支叶结点的熵,那就可以剪去分支叶结点了,后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来泛化性能提升,则将该子树替换为叶结点。就是对想要进行剪枝的结点进行验证集数据的准确性比较,如果剪枝能带来准确性的提高,那么就剪枝,否则保留。然后去判断其它需要考虑剪枝的结点。后剪枝决策树通常比预剪枝决策树保留了更多的分支;后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树;后剪枝决策树训练时间开销比未剪枝决策树和预剪枝决策树都要大的多 (一)规则分词: 1.1 正向最大匹配法(Maximum Match method,MM法) 1.2 逆向最大匹配法(Reverse Maximum Match method,MM法) 1.3 双向最大匹配法(Bi-direction Match method) 如果正反向分词结果词数不同,则取分词数量较少的那个,如果分词结果数相同,就说明没有歧义,可返回任何一个,分词结果不同,返回其中单字较少的那个 (二)统计分词: 基于统计的分词一般要做两个操作 2.1 语言模型 通俗来讲语言模型就是用来计算句子概率的模型,那么如何对给定句子 s = w1w2…wl,如何计算P(s)? 可以应用链式规则,分解P(s): N元模型 令c(w1,w2,…wn)表示n元组w1w2…wn在训练语料库中出现的次数 文本越长的文本序列出现的次数可能越少,为了防止分母为0,一般在n元模型中需要配合相应的平滑算法,比如拉普拉斯平滑(+1) 2.2 隐马尔科夫模型(HMM) 隐马尔可夫模型是将分词作为字在字串中的序列标注任务来实现的,其基本思路是每个字在构造一个特定的词语时都占据着一个确定的构词位置(即词位),现规定每个字最多只有四个构词位置:即B(词首)、M(词中)、E(词尾)和S(单独成词) 2.3 条件随机场(CRF) 2.4 神经网络分词算法 HMM模型有5个基本组成:观测序列、状态序列、状态初始概率、状态转移概率和状态发射概率。分词属于HMM的预测问题,即已知观测序列、状态初始概率、状态转移概率和状态发射概率的条件下,求状态序列。结巴分词已经内置了训练好的状态初始概率、状态转移概率和状态发射概率。 句子会作为观测序列,当有新句子进来时,具体做法为:先通过Viterbi算法求出概率最大的状态序列,然后基于状态序列输出分词结果(每个字的状态为B、M、E、S之一)。 利用HMM模型进行分词,主要是将分词问题视为一个序列标注(sequence labeling)问题,其中,句子为观测序列,分词结果为状态序列。首先通过语料训练出HMM相关的模型,然后利用Viterbi算法进行求解,最终得到最优的状态序列,然后再根据状态序列,输出分词结果。 序列标注,就是将输入句子和分词结果当作两个序列,句子为观测序列,分词结果为状态序列,当完成状态序列的标注,也就得到了分词结果。 以“去北京大学玩”为例,我们知道“去北京大学玩”的分词结果是“去 / 北京大学 / 玩”。对于分词状态,由于jieba分词中使用的是4-tag,因此我们以4-tag进行计算。4-tag,也就是每个字处在词语中的4种可能状态,B、M、E、S,分别表示Begin(这个字处于词的开始位置)、Middle(这个字处于词的中间位置)、End(这个字处于词的结束位置)、Single(这个字是单字成词)。具体如下图所示,“去”和“玩”都是单字成词,因此状态就是S,“北京大学”是多字组合成的词,因此“北”、“京”、“大”、“学”分别位于“北京大学”中的B、M、M、E。 (3)基于Viterbi算法的词性标注; Viterbi算法实际上是用动态规划求解HMM模型预测问题,即用动态规划求概率路径最大(最优路径)。这时候,一条路径对应着一个状态序列。 根据动态规划原理,最优路径具有这样的特性:如果最优路径在时刻t通过结点 i∗t ,那么这一路径从结点 i∗t 到终点 i∗T 的部分路径,对于从 i∗t 到 i∗T 的所有可能的部分路径来说,必须是最优的。因为假如不是这样,那么从 i∗t 到 i∗T 就有另一条更好的部分路径存在,如果把它和从 i∗t 到达 i∗T 的部分路径连接起来,就会形成一条比原来的路径更优的路径,这是矛盾的。依据这个原理,我们只需要从时刻t=1开始,递推地计算在时刻t状态i的各条部分路径的最大概率,直至得到时刻t=T状态为i的各条路径的最大概率。时刻t=T的最大概率就是最优路径的概率 P∗ ,最优路径的终结点 i∗T 也同时得到。之后,为了找出最优路径的各个结点,从终结点 i∗T 开始,由后向前逐步求得结点 i∗T−1,...,i∗1 ,最终得到最优路径 I∗=(i∗1,i∗2,...,i∗T) 。 (4)分别基于tfidf和textrank模型抽取关键词; jieba系统框架 (1)分词 (2)词性标注 1.首先基于正则表达式进行汉字判断 2.若符合上面的正则表达式,则判定为汉字,然后基于前缀词典构建有向无环图,再基于有向无环图计算最大概率路径,同时在前缀词典中找出它所分出的词性,若在词典中未找到,则赋予词性为“x”(代表未知),当然,若在这个过程中,设置使用HMM,且待标注词为未登录词,则会通过HMM方式进行词性标注 (3)关键词抽取(TF-IDF和TextRank提取关键词) 其中,分词有三种模式,默认是精确模式, (1)精确模式,试图将句子最精确地切开,适合文本分析; (2)全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义; (3)搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词; 什么是索引,实现索引的算法,怎么实现的利用索引来查询? 要建立索引,其实就是为了构建一种数据结构,可以在上面应用一种高效的查询算法,最终提高数据的查询速度。索引的本质:索引是数据结构 实现索引的算法: (1) 顺序查找 数据结构:有序或无序队列 复杂度:O(n) (2) 二分查找 数据结构:有序数组 复杂度:O(logn) (3) 二叉排序树查找 数据结构:数据结构:二叉排序树 复杂度:O(log2N) (4) 哈希表 数据结构:数据结构:哈希表 时间复杂度:几乎是O(1) (5) 分块查找 (6) 平衡多路搜索树B树(B-tree)二叉树,它的搜索时间复杂度为O(log2N),所以它的搜索效率和树的深度有关,如果要提高查询速度,那么就要降低树的深度。要降低树的深度,很自然的方法就是采用多叉树,再结合平衡二叉树的思想,我们可以构建一个平衡多叉树结构,然后就可以在上面构建平衡多路查找算法,提高大数据量下的搜索效率。 其实B-Tree有许多变种,其中最常见的是B+Tree,比如MySQL就普遍使用B+Tree实现其索引结构。B-Tree相比,B+Tree有以下不同点: 每个节点的指针上限为2d而不是2d+1; 内节点不存储data,只存储key; 叶子节点不存储指针; 索引使用策略及优化 MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Queryoptimization) 索引优化策略: 最左前缀匹配原则,上面讲到了 主键外检一定要建索引 对 where,on,group by,order by 中出现的列使用索引 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0 对较小的数据列使用索引,这样会使索引文件更小,同时内存中也可以装载更多的索引键 索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’); 为较长的字符串使用前缀索引 尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可 不要过多创建索引, 权衡索引个数与DML之间关系,DML也就是插入、删除数据操作。这里需要权衡一个问题,建立索引的目的是为了提高查询效率的,但建立的索引过多,会影响插入、删除数据的速度,因为我们修改的表数据,索引也需要进行调整重建 对于like查询,”%”不要放在前面。 SELECT * FROMhoudunwangWHEREunameLIKE'后盾%' -- 走索引 SELECT * FROMhoudunwangWHEREunameLIKE "%后盾%" -- 不走索引 查询where条件数据类型不匹配也无法使用索引 字符串与数字比较不使用索引; CREATE TABLEa(achar(10)); EXPLAIN SELECT * FROMaWHEREa="1" – 走索引 EXPLAIN SELECT * FROM a WHERE a=1 – 不走索引 正则表达式不使用索引,这应该很好理解,所以为什么在SQL中很难看到regexp关键字的原因 7.什么是梯度下降 8.分类算法 (1)fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点: 1、fastText在保持高精度的情况下加快了训练速度和测试速度 2、fastText不需要预训练好的词向量,fastText会自己训练词向量 3、fastText两个重要的优化:Hierarchical Softmax、N-gram word2vec与 FastText 对比: (1)fasttext是 word2vec 中 cbow + h-softmax 的灵活运用。灵活体现在两方面: 输入层:word2vec是窗口内的词term;fasttext是整个句子的内容,包括term,也包括 n-gram的内容。 输出层:word2vec对应的是每一个term,计算某term的概率最大;fasttext 的输出层对应的是分类的label。 (2)两者本质的不同,体现在 h-softmax的使用: word2vec 目的是得到词向量,该词向量最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,但最终都被抛弃,不会使用。 fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个) 9. LR为什么用极大似然估计,损失函数为什么是log损失函数(交叉熵) 因为我们想要让每一个样本的预测都要得到最大的概率,即将所有的样本预测后的概率进行相乘都最大,也就是极大似然函数。Log Loss 在使用似然函数最大化时,其形式是进行连乘,但是为了便于处理,一般会套上log,这样便可以将连乘转化为求和,由于log函数是单调递增函数,因此不会改变优化结果。因此log类型的损失函数也是一种常见的损失函数. 10. LSTM原理 11. LSTM里的激活函数sigmoid能换成其他的吗 不能,因为sigmoid表示阀门,输出是在0~1之间,其他函数不能表达这个意思 12. Sigmoid函数是饱和的吗,哪些是非饱和函数 Sigmoid是饱和的,所谓sigmoid函数的饱和区,是指图1中左下角和右上角的平缓区域。相对于第1小节提到的sigmoid函数的两种应用,饱和区(平缓区域)会带来以下问题: a、 梯度消失问题(平缓区梯度几乎为0),这个问题对于sigmoid函数的两种应用都是存在的; b、 对于输入x,输出y的区分度不高 非饱和函数:Relu函数