面试算法简述

文章目录

一、机器学习

从预测值的类型上看,连续变量预测的定量输出称为回归;离散变量预测的定性输出称为分类

生成模式和判别模式的区别:

生成模式: 由数据学得联合概率分布,求出条件概率分布P(Y|X)的预测模型;
常见的生成模型有:朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、限制玻尔兹曼机
判别模式: 由数据学得决策函数或条件概率分布作为预测模型
常见的判别模型有:K近邻、SVM、决策树、感知机、线性判别分析(LDA)、线性回归、传统的神经网络、逻辑斯蒂回归(LR)、boosting、条件随机场(CRF)

感知机:

是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别
具体方法:感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,输入判别模型。
优化方法:随机梯度下降

K-means:

是一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。
kmeans的计算方法如下:

  • 1 随机选取k个中心点
  • 2 遍历所有数据,将每个数据划分到最近的中心点中
  • 3 计算每个聚类的平均值,并作为新的中心点
  • 4 重复2-3,直到这k个中线点不再变化(收敛了),或执行了足够多的迭代

  K值选取: 在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分类贴标签。所以k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k作为最终的集羣数目

k近邻:

K近邻法实际上利用训练集对特征向量空间进行划分,并作为其分类模型(分类回归)
三个基本要素: K值的选择(交叉验证),距离度量(欧氏距离),分类决策函数(多数表决)
实现方法: kd树
具体方法: 给定一个训练集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类。

朴素贝叶斯:

通过已知样本求得先验概率P(Y)和条件概率P(X|Y),对于给定的实例,计算联合概率,进而求出后验概率。
也就是说,它尝试去找到底这个数据是怎么生成的(产生的),然后再进行分类。哪个类别最有可能产生这个信号,就属于那个类别。
基于贝叶斯定理与特征条件独立假设分类方法(多分类)
生成方法: 由训练数据集学习联合概率分布P(X,Y),然后求得后验概率分布P(Y|X)
具体方法: 利用训练数据学习P(X|Y)和P(Y)的估计,得到联合概率分布 P(X,Y) = P(Y)P(X|Y)

极大似然估计:

就是利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值
最大似然估计的核心思想是: 找到参数θ的一个估计值,使得当前样本出现的可能性最大,俗话说是“谁大像谁”。
求最大释然估计值的步骤:

  • 1.写似然函数
  • 2.一般对似然函数取对数,并将对数似然函数整理
  • 3.对数似然函数求导,令导数为0,求得似然方程
  • 4.根据似然方程求解,得到的参数即为所求估计值
逻辑回归(LR):

逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
http://www.cnblogs.com/ModifyRong/p/7739955.html
https://zhuanlan.zhihu.com/p/44591359
是由输入的线性函数表示的输出的对数机率模型
学习策略: 极大似然估计或正则化极大似然估计
学习算法: 梯度下降,拟牛顿法
《面试算法简述》

逻辑回归为什么要用sigmoid?:
逻辑回归模型之所以是sigmoid 的形式,源于我们假设y服从伯努利分布,伯努利分布又属于指数分布族,经过推导,将伯努利分布变成指数分布族的形式后。我们发现伯努利分布的唯一参数Φ与指数分布族中的参数η具有sigmoid函数关系,于是我们转而求η与x的关系,此时,我们又假设η与x具有线性关系。至此,找到了我们要用的模型的样子,也就是逻辑回归。链接:https://www.jianshu.com/p/a8d6b40da0cf

L1和L2的区别

https://blog.csdn.net/jinping_shi/article/details/52433975
L1正则化是指权值向量w ww中各个元素的绝对值之和,通常表示为∣∣w∣∣
L2正则化是指权值向量w ww中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为∣∣w∣∣2
​为什么L1正则化可以产生稀疏模型(L1是怎么让系数等于零的),以及为什么L2正则化可以防止过拟合?

FP(FP-growth)关联算法

将数据存储在一种称为FP树的紧凑数据结构中。FP代表频繁模式(Frequent Pattern)。一棵FP树看上去与计算机科学中的其他树结构类似,但是它通过链接(link)来连接相似元素,被连起来的元素项可以看成一个链表。
支持度: 指某频繁项集在整个数据集中的比例。假设数据集有 10 条记录,包含{‘鸡蛋’, ‘面包’}的有 5 条记录,那么{‘鸡蛋’, ‘面包’}的支持度就是 5/10 = 0.5。
置信度: 是针对某个关联规则定义的。有关联规则如{‘鸡蛋’, ‘面包’} -> {‘牛奶’},它的置信度计算公式为{‘鸡蛋’, ‘面包’, ‘牛奶’}的支持度/{‘鸡蛋’, ‘面包’}的支持度。假设{‘鸡蛋’, ‘面包’, ‘牛奶’}的支持度为 0.45,{‘鸡蛋’, ‘面包’}的支持度为 0.5,则{‘鸡蛋’, ‘面包’} -> {‘牛奶’}的置信度为 0.45 / 0.5 = 0.9。
停止条件:支持度或者置信度小于某个阈值

支持向量机(SVM):

定义在特征空间上的间隔最大的线性分类器
历史模型:线性可分支持向量机,线性支持向量机,非线性支持向量机
常用核函数: 多项式核函数,高斯核函数,字符串核函数
损失函数: 合页损失
推导:https://blog.csdn.net/sinat_30353259/article/details/80991273
目标函数:
《面试算法简述》

决策树:

描述对实例进行分类的树形结构。(分类回归)
组成: 决策树由结点和有向边组成,结点有两种类型,内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类。
具体方法: 学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型
步骤:特征选择,决策树的生成,决策树的修剪
算法实现:
ID3:选择信息增益最大的作为特征,不能剪枝,容易过拟合
C4.5:选择信息增益比最大的作为特征(因为信息增益偏向于选择取值较多的特征)
CART:回归模型(利用平方误差最小选取切分变量和切分点)
分类模型(选择基尼指数最小作为特征)
剪枝: 预剪枝和后剪枝

bagging

有放回采样,各基分类器无强依赖,可以并行训练,各个个体都进行单独学习,最终投票
bagging能够提高弱分类器性能的原因是降低了方差
算法实现: 随机森林,基于决策树基分类器(随机样本,随机特征)

随机森林:

顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。
随机森林的生成方法:

  • 1.从样本集中通过重采样的方式随机选择n个样本
  • 2.假设样本中的特征数量为a,再从这些特征中,随机选择k个特征,用建立决策树的方式选择最佳分割点,构建决策树树
  • 3.重复m次,产生m棵决策树
  • 4.多数投票机制来进行预测
boosting

训练基分类器时采用串行方式,各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的加权得到最终结果。
boosting能够提升弱分类器性能的原因是降低了偏差
算法实现: adaboost
具体做法:

  • 1.针对训练集修改权值,提高被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。
  • 2.弱分类器的组合,采取加权多数表决的方法。针对弱分类器修改权值,加大分类误 差率小的弱分类器的权值,使其在表决中起较大作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小作用

Gradient Boosting: 根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,然后将训练好的弱分类器以累加的形 式结合到现有模型中。
Gradient boosted 是一类boosting的技术,不同于Adaboost加大误分样本权重的策略,它每次迭代加的是上一轮梯度更新值:
《面试算法简述》

梯度提升和梯度下降的区别:

相同点: 每一轮迭代中,都利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新
梯度提升: 模型并不需要进行参数化表示,而直接定义在函数空间中,大大扩展使用模型的种类
梯度下降: 模型是以参数化表示,从而模型的更新等价于参数的更新。

GBDT

首先gbdt 是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。针对一般损失函数优化困难问题,利用损失函数的负梯度在当前模型的值作为残差的近似值进行求解。
采用决策树作为弱分类器的Gradient Boosting算法被称为GBDT
损失函数:残差
https://blog.csdn.net/tinkle181129/article/details/79681702

XGBoost:

采用最大化这个差值作为准则来进行决策树的构建,通过遍历所有特征的取值,寻找使得损失函数前后相差最大时对应的分裂方式。是GBDT的工程实现
https://blog.csdn.net/v_july_v/article/details/81410574
核心思想:

  • 1、不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。
  • 2、当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数
  • 3、最后只需要将每棵树对应的分数加起来就是该样本的预测值。

在决策树构建节点加入正则项
https://blog.csdn.net/qq_28031525/article/details/70207918

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

PCA: 目的是找到数据中的主成分,利用这些主成分表征原始数据,从而达到降维的目的
最大方差理论,pca的目标是最大化投影方差,让数据在主轴上投影的方差最大(找到一个投影方向,使其方差最大)
步骤:

  • 1、对样本数据进行中心化处理
  • 2、求样本协方差
  • 3、对协方差矩阵进行特征值分解,将特征值从大到小排列
  • 4、取特征值前d大对应的特征向量w1,w2,…wd,通过以下映射将n维样本映射到d维

LDA(线性判别分析): 为了分类服务,找到一个投影方向w,使得投影后的样本尽可能按照原始类别分开
**思想:**最大化类间距离,最小化类内距离(对数据做了很强的假设)

LDA(隐含狄利克雷分布):

是一种主题模型,,它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题(分布)出来后,便可以根据主题(分布)进行主题聚类或文本分类。同时,它是一种典型的词袋模型,即一篇文档是由一组词构成,词与词之间没有先后顺序的关系。
LDA生成文档的过程中,先从dirichlet先验中“随机”抽取出主题分布,然后从主题分布中“随机”抽取出主题,最后从确定后的主题对应的词分布中“随机”抽取出词。
生成过程: 假定语料库中共有M篇文章,每篇文章下的Topic的主题分布是一个从参数为α的Dirichlet先验分布中采样得到的Multinomial(多项式)分布,每个Topic下的词分布是一个从参数为β的Dirichlet先验分布中采样得到的Multinomial分布。
对于某篇文章中的第n个词,首先从该文章中出现的每个主题的Multinomial分布(主题分布)中选择或采样一个主题,然后再在这个主题对应的词的Multinomial分布(词分布)中选择或采样一个词。不断重复这个随机生成过程,直到M篇文章全部生成完成。

EM算法:

最大化目标函数时,先固定一个变量是整体函数变为凸优化函数,求导得到最值,然后利用最优参数更新被固定的变量,进入下一个循环。要设置停止条件,比如参数值的差少于某阈值
根据极大似然估计算出模型的参数,根据估计模型得出最大概率值,再次估计模型参数这样循环迭代
**损失函数:**对数损失函数
**学习策略:**极大似然估计

动态规划

将复杂的问题分解成一系列相对简单的子问题,只解决一次子问题并存储它的解决方案(solution),下一次遇到同样的子问题时无需重新计算它的解决方案,而是简单地查找先前计算的解决方案,从而节省计算时间。动态规划适用于有最优子结构(Optimal Substructure)和重叠子问题(Overlapping Subproblems)性质的问题。

图模型发展史:

《面试算法简述》
https://www.zhihu.com/question/35866596/answer/236886066

隐马尔可夫模型(HMM):

关于时序的概率模型,描述一个隐藏的马尔可夫链随机生成不可观测的状态 随机序列,再由各个状态生成一个观测而产生观测随机序列的过程(生成模型:由隐藏的马尔科夫链生成观测序列的过程)
公式: λ=(A,B,π) λ:隐马尔可夫模型,π:初始状态概率向量,A:状态概率转移矩阵,B:观测概率矩阵

概率计算问题: 已知模型的所有参数,计算观测序列Y出现的概率。可使用前向和后向算法求解
预测问题: 已知模型所有参数和观测序列Y,计算最大最可能的隐状态序列X。动态规划-维特比算法
应用:序列标注
学习问题: 已知观测序列Y,求解使得该观测序列概率最大的模型参数,包括隐状态序列、隐状之间的转移概率分布以及从隐状态到观测状态的概率分布。Baum-Welch算法(EM算法在HMM实现过程)

条件随机场(CRF):

给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,特点是假设输出随机变量构成马尔可夫随机场。
https://www.cnblogs.com/shixiangwan/p/8983274.html

LSTM+CRF

CRF是全局范围内统计归一化的条件状态转移概率矩阵,再预测出一条指定的sample的每个token的label;LSTM(RNNs,不区分here)是依靠神经网络的超强非线性拟合能力,在训练时将samples通过复杂到让你窒息的高阶高纬度异度空间的非线性变换,学习出一个模型,然后再预测出一条指定的sample的每个token的label。
那就把CRF接到LSTM上面,把LSTM在timestep上把每一个hiddenstate的tensor输入给CRF,让LSTM负责在CRF的特征限定下,依照新的loss function,学习出一套新的非线性变换空间。

HMM和CRF的区别
  • 1.HMM是生成模型,CRF是判别模型
  • 2.HMM是概率有向图,CRF是概率无向图
  • 3.HMM求解过程可能是局部最优,CRF可以全局最优
  • 4.CRF概率归一化较合理,HMM则会导致label bias 问题
    《面试算法简述》
HMM 、 MEMM和CRF之间的区别

HMM -> MEMM(最大熵马尔可夫模型MEMM): HMM模型中存在两个假设:一是输出观察值之间严格独立,二是状态的转移过程中当前状态只与前一状态有关。但实际上序列标注问题不仅和单个词相关,而且和观察序列的长度,单词的上下文,等等相关。MEMM解决了HMM输出独立性假设的问题。因为HMM只限定在了观测与状态之间的依赖,而MEMM引入自定义特征函数,不仅可以表达观测之间的依赖,还可表示当前观测与前后多个状态之间的复杂依赖。
MEMM -> CRF: CRF不仅解决了HMM输出独立性假设的问题,还解决了MEMM的标注偏置问题,MEMM容易陷入局部最优是因为只在局部做归一化,而CRF统计了全局概率,在做归一化时考虑了数据在全局的分布,而不是仅仅在局部归一化,这样就解决了MEMM中的标记偏置的问题。使得序列标注的解码变得最优解。
HMM、MEMM属于有向图,所以考虑了x与y的影响,但没讲x当做整体考虑进去(这点问题应该只有HMM)。CRF属于无向图,没有这种依赖性,克服此问题。

最大熵的思想: 当你要猜一个概率分布时,如果你对这个分布一无所知,那就猜熵最大的均匀分布,如果你对这个分布知道一些情况,那么,就猜满足这些情况的熵最大的分布。

交叉熵损失函数:
《面试算法简述》
交叉熵的单个样本损失函数也可以简化:
《面试算法简述》
softmax损失函数:
《面试算法简述》

二、深度学习

神经网络训练过程的本质是学习数据分布。

Batch Normalization(BN):

批量归一化是针对每一批数据,在网络的每一层输入之前增加归一化处理(均值为0,标准差为1),将所有批量数据强制在统一的数据分布下,

标准化和归一化的区别:

标准化(normalization): 将数据按比例缩放,使之落入一个小的特定区间
归一化: 将数据统一映射到[0,1]区间上。
归一化方法: 线性函数归一化,零均值归一化(映射到均值为0,标准差为1的分布上)
好处: 1、提升模型的收敛速度;2、提升模型的精度

Dropout:

以一定概率随机“临时丢弃神经元节点,相当于每次迭代都在训练不同结构的神经网络
对于任意神经元,每次训练中都与一组随机挑选的不同的神经元集合共同进行优化,这个过程会减弱全体神经元之间的联合适应性,减少过拟合的风险,增强泛化能力

cnn做文本分类:

《面试算法简述》

  • 第一层为输入层,是一个NxK的矩阵,N是文章总单词总数,K是每个词对应训练好的K维词向量。
  • 第二层为卷积层,卷积核为hxK
  • 第三层为池化层,采用最大池化,平均池化等。
  • 第四层为全连接层,softmax激活函数
残差网络(Residual Network,ResNet):

跳层,最终模型为H(X)=F(x)+x,学习F(x)=H(x)-x残差
目的: 解决或缓解深层的神经网络训练中的梯度消失问题
残差网络(RestNet): 残差连接是让前面某层的输出作为后面某层的输入,从而在序列网络中有效地创造了一条捷径
残差连接解决了困扰所有大规模深度学习模型的两个共性问题:梯度消失和表示瓶颈

梯度消失和梯度爆炸产生的原因:

卷积神经网络: 误差在传播的过程中,涉及到非常多的参数和导数的连乘,这时误差很容易产生消失或膨胀,影响对该层参数的学习
解决方法:

  • 1、设计特殊的网络结构,使用残差网络
  • 2、Dropout
  • 3、利用正则化
  • 4、改进训练算法

**梯度消失解决方法:**Relu激活函数

循环神经网络(RNN):

循环神经网络梯度是连乘形式的,组成一个nxn维雅可比矩阵,由于预测误差是沿着神经网络的每一层反向传播,因此当雅可比矩阵的最大特征值大于1时,随着离输出越来越远,每层的梯度大小会呈指数增长,,导致梯度爆炸;反之,若雅可比矩阵的最大特征值小于1,梯度的大小会呈指数缩小,产生梯度消失(《百面机器学习p239 》)
解决方法:

  • 1、梯度爆炸问题可以通过梯度裁剪,当梯度的范式大于某个给定值时,对梯度进行等比收缩。
  • 2、梯度消失问题,需要对模型本身改进,例如:LSTM

目的: 用来建模序列化数据,通过神经元串行起来处理序列化数据。由于每个神经元能用它的内部变量保存之前输入的序列信息,因此整个序列被浓缩成抽象表示,并可以据此进行分类或生成新的序列

LSTM(长短期记忆模型):

long short term memory,即我们所称呼的LSTM,是为了解决长期依赖问题而专门设计出来的,可以对价值的信息进行长期记忆,从而减少循环神经网络的学习难度
**结构:**输入门,遗忘门,输出门,记忆单元

  • 输入门:控制当前计算的新状态以多大程度更新到记忆单元
  • 遗忘门:控制前一步记忆单元中的信息有多大程度被遗忘掉
  • 输出门:控制当前的输出有多大程度上取决于当前的记忆单元
  • 激活函数:门都是用sigmoid,记忆单元使用Tanh,饱和激活函数,输入达到一定值的情况下,输出没有明显变化。而不用Relu,是因为Relu是非饱和激活函数,很难实现门控
    《面试算法简述》
Seq2Seq(序列到序列模型):

通过深度神经网络将一个作为输入的序列映射为一个作为输出的序列,这一过程由编码输入与编码输出两个环节构成。编码器和解码器可以用RNN或LSTM。在seq2seq模型中,两个循环神经网络是共同训练的。
对比理解: 就像复习考试问题,将学到的历史归纳总结成知识体系这是编码过程;考试时,将高度抽象的知识应用到系列问题便是解码过程。
解码部分: 基础算法是贪心法,改进之后用集束搜索。
RNN和LSTM存在的问题:

  • 1、时间片 t的计算依赖t-1时刻的计算结果,这样限制了模型的并行能力;
  • 2、顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。
fine-tuning(微调):

给一个预训练模型,基于此模型进行微调
优点: 不用从头计算,省去大量计算资源和计算时间,提高了计算效率,甚至准确率
场景: 数据集相似,自己构建的正确率太低,数据集数量太少,计算资源太少

**注意力机制(attention):**是一种思想
强化学习: 由环境、机器人、状态、动作、奖励组成。

  • 动作:所有可能做出的动作的集合
  • 状态:所有状态的集合
  • 奖励:机器人可能收到的奖励,一般一个实数
  • 算法实现:Q-Learning、策略梯度、演员评判家算法

IDCNN(膨胀卷积): dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息
《面试算法简述》

神经网络为什么需要隐藏层?

反向传播
每层隐藏层在做的事就是将数据变成另一种 格式/模式/ feature representation

为什么使用交叉熵作为损失函数?

https://blog.csdn.net/liweibin1994/article/details/79510237
https://juejin.im/post/5b40a5156fb9a04faf478a45
https://juejin.im/post/5b28bd26f265da59bb0cc8f6
交叉熵公式:
《面试算法简述》
对权重w求导得
《面试算法简述》
《面试算法简述》

为什么使用batch_size?

Batch 的选择,首先决定的是下降的方向。一是解决内存加载问题,而是找到更好的极值点
https://www.zhihu.com/question/32673260/answer/71137399

为什么要使用embedding嵌入层?

嵌入层embedding 的可以通过索引对该句子进行编码得到向量,在训练神经网络的过程中,每个嵌入向量都会得到更新,就会发现原来的词与词,通过向量高维的映射得到相似性。
https://spaces.ac.cn/archives/4122
word2vec也有嵌入层
https://blog.csdn.net/u010412858/article/details/77848878

梯度下降方法

https://blog.csdn.net/google19890102/article/details/69942970
批梯度下降: 在执行每次更新时,在整个数据集上计算所有的梯度
特点:批梯度下降法的速度会很慢,同时,批梯度下降法无法处理超出内存容量限制的数据集。
随机梯度下降: 根据每一条训练样本x(i)和标签y(i)更新参数
特点:通常SGD的运行速度更快,同时,可以用于在线学习。SGD以高方差频繁地更新,导致目标函数出现如图1所示的剧烈波动。
小批量梯度下降: 在每次更新时使用n个小批量训练样本
特点:

  • 1、减少参数更新的方差,这样可以得到更加稳定的收敛结果;
  • 2、可以利用最新的深度学习库中高度优化的矩阵优化方法,高效地求解每个小批量数据的梯度。
梯度下降优化算法

动量法(momentum): 是一种帮助SGD在相关方向上加速并抑制摇摆的一种方法。
特点:从本质上说,动量法,就像我们从山上推下一个球,球在滚下来的过程中累积动量,变得越来越快
Nesterov加速梯度下降法(Nesterov accelerated gradient,NAG): 是一种能够给动量项这样的预知能力的方法。
特点:这个具有预见性的更新防止我们前进得太快,同时增强了算法的响应能力,这一点在很多的任务中对于RNN的性能提升有着重要的意义。
Adagrad: 是这样的一种基于梯度的优化算法:让学习率适应参数,对于出现次数较少的特征,我们对其采用更大的学习率,对于出现次数较多的特征,我们对其采用较小的学习率。
特点:Adagrad非常适合处理稀疏数据。
Adadelta: 是Adagrad的一种扩展算法,以处理Adagrad学习速率单调递减的问题。不是计算所有的梯度平方,Adadelta将计算计算历史梯度的窗口大小限制为一个固定值w。
RMSprop: 将学习率分解成一个平方梯度的指数衰减的平均。
自适应矩估计Adaptive Moment Estimation,Adam): 是另一种自适应学习率的算法,Adam对每一个参数都计算自适应的学习率。除了像Adadelta和RMSprop一样存储一个指数衰减的历史平方梯度的平均vt,Adam同时还保存一个历史梯度的指数衰减均值mt,类似于动量

三、自然语言处理(NLP)

word2vec:

目前有两种训练模型(CBOW和Skip-gram),两种加速算法(Negative Sample与Hierarchical Softmax)
https://www.zhihu.com/question/44832436
CBOW流程:

  • 1、输入层:上下文单词的onehot. {假设单词向量空间dim为V,上下文单词个数为C}
  • 2、隐藏层:所有onehot分别乘以共享的输入权重矩阵W. {VN矩阵,N为自己设定的数,初始化权重矩阵W},所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1N.
  • 3、乘以输出权重矩阵W’ {N*V},(W‘也为初始化,是为了保证最终得到的向量跟单词向量的维度一致)
  • 4、得到向量 {1*V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维斗代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)
  • 5、与true label的onehot做比较,误差越小越好
  • 6、假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table应该为矩阵W。即,任何一个单词的one-hot表示乘以这个矩阵都将得到自己的word embedding。

架构: skip-gram(慢、对罕见字有利)vs CBOW(快)
训练算法: 分层softmax(对罕见字有利)vs 负采样(对常见词和低纬向量有利)
欠采样频繁词: 可以提高结果的准确性和速度(适用范围1e-3到1e-5)
文本(window)大小: skip-gram通常在10附近,CBOW通常在5附近

word2vev怎么避免维度灾难?
设词典中词语数量为V,隐藏节点数为N,当V远远小于N时,完成word2vec对词向量的降维。
http://kyonhuang.top/Word2vec-intro/

FastTEXT:

之前用fastText做过短文本分类,效果异常的好,f1值达到0.995,所以特地学习了一下。fastText 的结构其实和 CBOW 模型差不多,只不过前者的输入除了词的embedding,还有一些n-gram特征。其原理很简单,就是对这些输入的向量取平均,线性激活后,全连接到输出层,再用 softmax 归一化每个类别的概率。一开始很难相信这么简单的结构能取得如此好的分类效果,而且速度还超级快。
经过分析和参考了一些资料,我认为分类效果好的原因有这么几个:

  • 1、除了词的embedding,还使用了word n-gram特征,这使得句子中的词序信息能被捕捉到;
  • 2、词向量本身就蕴含了这么一种规律:两个词的向量距离越近,含义越相似。因此,在对输入的向量取平均时,就是意味着将输入文档的词向量累加起来并归一化,这可以将一个文档映射成空间中的一个向量,所以用这个向量来区分不同的文档是合理的。当用了softmax后,就相当于对输出空间划定了一些决策边界,用来进行分类;
  • 3、输入文本较短,所以效果好;要是长文本,效果会变差。因为长文本本身包含了太多的信息,词向量经过平均后,失去了区分度(可通过大数定律或样本均值的方差来理解)。

出现问题:如果使用fasttext结果出现NaN,安装pip install fasttext-win,原先的删除

负采样:

对于给定的词w,如何生成它的负采样集合NEG(w)呢?已知一个词w,它的上下文是context(w),那么词w就是一个正例,其他词就是一个负例。
如何选择negative words: 一个单词被选作negative sample的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words。
注意: 在论文中,作者指出指出对于小规模数据集,选择5-20个negative words会比较好,对于大规模数据集可以仅选择2-5个negative words。.

BERT:

BERT模型实际上是一个语言编码器,把输入的句子或者段落转换为特征向量。
两大亮点:

  • 1、双向的transformer,利用masked模型实现双向
  • 2、提出两种预训练方法,masked模型和下一个句子预测方法

训练流程:

  • 1、输入表示:可以对单个句子或一对文本句子,输入嵌入为token embedding,segmentation embedding,position embedding的求和
  • 2、masked语言模型:如cbow预测当前单词,不过只取了15%的样本(每个batchsize只有15%的词被遮盖的原因,是性能开销。双向编码器比单项编码器训练要慢)
  • 3、预测下一个句子:预训练一个二分类的模型,来学习句子之间的关系。预测下一个句子的方法对学习句子之间关系很有帮助。
    训练方法: 正样本和负样本比例是1:1,50%的句子是正样本,随机选择50%的句子作为负样本。
  • 4、预训练阶段参数
  • 5、微调:微调阶段根据不同任务使用不同网络模型。
    https://zhuanlan.zhihu.com/p/46997268

自然语言理解(NLU):
以语言学为基础,融合逻辑学、心理学和计算机科学等学科,试图解决以下问题:语言究竟是怎样组织起来传输信息的?人又是怎样从一连串的语言符号中获取信息的?换种表达就是,通过语法、语义、语用的分析,获取自然语言的语义表示。
方法:基于规则理解,基于机器学习理解,基于深度学习理解
多轮对话:

TensorTlow:
Variable和get_Variable区别:
使用tf.Variable时,如果检测到命名冲突,系统会自己处理。使用tf.get_variable()时,系统不会处理冲突,而会报错
实质区别:
由于tf.Variable() 每次都在创建新对象,所有reuse=True 和它并没有什么关系。对于get_variable(),来说,如果已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建一个新的。

四、聊天机器人:

rasa框架搭建聊天机器人
https://github.com/howl-anderson/WeatherBot

User Interface: 负责提供用户 UI ,方便用户使用,Rasa Core 支持和多种即时通讯软件(IM)的整合,Rasa Core 提供了一种称之为 Channel 的特性来方便接入 API。
Diaglog Manager:负责管理整个对话的流程,它会主动调用NLU 来解析用户的意图和提取相关的实体,在需要执行业务动作的时候会调用Action Server执行具体的业务动作。
NLU:负责理解用户的意图和提取相关的实体。
Action Server:负责执行自定义 Action (通常都是具体的业务动作,在本项目中是请求远程服务器以查询天气情况)。

五、知识图谱

知识图谱构建流程:
一、构建知识图结构
	1、读取文件,获得实体,实体之间的关系
	2、创建节点,为每个标签(实体),都创建图节点(用neo4j图数据库)
	3、创建节点属性,即每个实体的通用属性
	4、执行创建实体图的操作
	5、执行创建实体和实体之间的关系边
二、抽取问题意图
	1、数据处理,把原来实体库放到列表中
	2、为每个实体都构造一个ctree
	3、把输入的问题,分别用实体tree去匹配,匹配失败,用相似度计算找相近词
	4、列常出问问题的关键词集合
	5、预测意图(用朴素贝叶斯,TF-IDF进行意图预测)
	6、构建问题的可能组合规则,用预测的意图结合匹配到的tree搜索答案,并返回结果
点赞