图片慢慢上传,看不到图片的请点这里:
常用机器学习算法知识点及其解析,面试官会考的几乎都有
LR:logistic regression 对数几率回归/逻辑回归
sigmoid函数的作用就是用于把输出归一到1和0,也就是把自变量的线性组合进行归一化,映射后的值被认为是属于y=1的概率。
所以对于一个普通的高斯样本需要证明sigmoid复合其概率密度规律。
一开始先引入一个对于某一个y,x符合正态分布的性质:
因此P(y|x)符合正态分布:
所以求:
的话,由贝叶斯:
得到:
然后,由于P(x|y)是高斯的,则上式等于:
如果 σ1=σ0 σ1=σ0,二次项会抵消,我们得到一个简单的线性关系:
由上式进一步可以得到:
就获得
sigmoid
函数:
- 求二分类通用的log-loss函数(只要带入任意y=g(x)函数就可以求出对应log-loss函数)
然后,对于二分类问题,假设y=g(x),有:
- P(y=1|x)=g(x)
- P(y=0|x)=1-g(x)
其最大似然函数:
3.
【因为y要么就是0要么就是1,所以这样的写法是1和2两条式子的简写,所以称为二分类通用】
然后就对3求log,获得:
于是求-l(
θ
)的最小值就可以求得L(
θ
)的最大值。
也就是说,-l(
θ
)+正则项就是loss
然后,可以把g(x)=logistic函数带进去求解,求最小值
求最小值的方法:牛顿法
牛顿法指出,求使f(
θ
)=0的
θ,只需要一开始先固定一个
θ,比如说
θ=0,然后输入其他值使得
θ(t+1)
=
θt-
Δθt
其中一维的情况,
Δ
θ=
f '(
θt
)/
f(
θt
)(多维的情况,
Δ
θ
前面要乘以个hassin矩阵的逆)
所以现在要求使得
-l(
θ
)=0的
θ,也就是让loss等于0
,那么就令
f(
θ
)=
-l(
θ
),带入公式进行求解即可
牛顿法是二阶收敛,而梯度下降则为一阶收敛,所以牛顿法更快。
简单来说,梯度下降是从所处位置选择一个坡度最大的方向走一步,而牛顿法则在选择方向时,不仅考虑坡度,还会考虑坡度的坡度,也就是下一步的坡度是否会变得更大。
几何上来说,牛顿法是用一个二次曲面去拟合当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面
其局限主要在于
1.矩阵的逆计算复杂度为n的立方,当规模很大时,计算量超大,通常改良做法是采用拟牛顿法如BFGS,L-BFGS等
2.如果初始值离局部极小值太远,Taylor展开并不能对原函数进行良好的近似
- 其他优化方法
- BFGS
- L-BFGS
- 优缺点:无需选择学习率α,更快,但是更复杂
通过特征组合进行升维。
左图是一个线性可分的数据集,右图在原始空间中线性不可分,但是在特征转换
后的空间是线性可分的,对应的原始空间中分类边界为一条类椭圆曲线。
可以引入权重的n阶模进行正则化,防止过拟合,并加入先验知识,去除野点和噪声:
实际应用时,由于我们数据的维度可能非常高,L1正则化因为能产生稀疏解,使用的更为广泛一些。
L2用于过拟合
如果是多分类就不能用sigmoid函数,要用Softmax。
Softmax 回归是直接对逻辑回归在多分类的推广,相应的模型也可以叫做多元逻辑回归(Multinomial Logistic Regression)。
模型通过 softmax 函数来对概率建模,具体形式如下:
不互斥的时候,应该用k个LR
代码:
output = sigmoid(train_x * weights)
error = train_y - output
weights = weights + alpha * train_x.transpose() * error
Logistic回归优点:
- 实现简单;
- 分类时计算量非常小,速度很快,存储资源低;
缺点:
- 容易欠拟合,一般准确度不太高
- 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;
LWLR线性回归:linear regression 就是最小二乘法
线性回归才是真正用于回归的,而不像logistic回归是用于分类,其基本思想是用梯度下降法对最小二乘法形式的误差函数J进行最小化:
【前面的1/2只是为了求导的时候更简单而加上的】
当然也可以由已经推导出的公式直接求得参数的解,对于多变量数据集X,如果XTX是满秩的,结果为:
多数情况XTX并不是满秩的正定矩阵,所以会有多个可行解,所以一般会在J中引入正则项以进一步选择输出的模型(L1=稀疏的(特征大于样本常用),L2=防止过拟合的)。
而其优化算法为:
由此可见LWLR与LR不同,LWLR是一个非参数模型,因为每次进行回归计算都要遍历训练样本至少一次。
线性回归优点:
实现简单,计算简单;
缺点:
不能拟合非线性数据;
SVM:
- 找到分割两个样本“正中间”的超平面,几何间隔与样本的误分次数间存在关系:其中的分母就是样本到分类间隔距离,分子中的R是所有样本中的最长向量值
- C表现离群点的重要性(可以理解为权重),越大离群点越重要
- gamma是你选择径向基函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布
原理:
求一个斜率,使得其到两个类别的最近的样本点(支持向量)的距离相同
这种距离应该用几何距离:
所以距离就等于:
1.求几何距离的最小值,
考虑之前得到的目标函数:
2.升次
由于求
的最大值相当于求
的最小值:
所以上述目标函数等价于(w由分母变成分子,从而也有原来的max问题变为min问题,很明显,两者问题等价):
因为现在的目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题。在一定的约束条件下可解。
此外,由于这个问题的特殊结构,还可以通过求解与原问题等价的对偶问题得到原始问题的最优解
【通过拉格朗日对偶性变换到对偶变量的优化问题 】
这就是线性可分条件下支持向量机的对偶算法
【这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。 】
3.采用拉格朗日对偶性转移到对偶问题
通过给每一个约束条件加上一个拉格朗日乘子,定义拉格朗日函数(即通过拉格朗日函数将约束条件融合到目标函数里去,从而我们的问题变成):
然后令
【 容易验证,当某个约束条件不满足时,例如
,那么显然有(只要令即可)。而当所有约束条件都满足时,则最优值为,亦即最初要最小化的量。】
因此,在要求约束条件得到满足的情况下最小化,实际上等价于直接最小化(当然,这里也有约束条件,就是≥0,i=1,…,n),因为如果约束条件没有得到满足
会等于无穷大,自然不会是我们所要求的最小值。
具体写出来,目标函数变成了:
4.转移到对偶问题
如果直接求解,那么一上来便得面对w和b两个参数,而又是不等式约束,这个求解过程不好做。不妨把最小和最大的位置交换一下,变成:
这
交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用d*
来表示。而且有d*
≤p*
,在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。
换言之,之所以从minmax的原始问题p*,转化为maxmin的对偶问题d*,一者因为d*是p*的近似解,二者,转化为对偶问题后,更容易求解。
下面可以先求L 对w、b的极小,再求L对α的极大。
5.d*≤p*的条件——KKT条件(使得非线性规划有最优解的必要条件)
对于一个一般的非线性规划问题,其中,f(x)是需要最小化的函数,h(x)是等式约束,g(x)是不等式约束,p和q分别为等式约束和不等式约束
然后,有凸优化的概念,凸优化就是找到凸集里的一个点x,使得凸函数
即是“最大点”“最凸点”
KKT条件就是:
所以因为原始问题满足KKT条件,已经转化成了对偶问题。而求解这个对偶学习问题,分为3个步骤:首先要让L(w,b,a) 关于 w 和 b 最小化,然后求对α的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。
6.此对偶问题的求解
首先固定α,让L关于w和b最小化,就是对w和b的偏导数都等于0:
然带入得:
然后用SMO算法求对α的极大:
就可以求出α,然后根据这个求出w和b,终得出分离超平面和分类决策函数
7.线性分类函数
对于一个数据点
x
进行分类,实际上是通过把
x
带入到
算出结果然后根据其正负号来进行类别划分的。而前面的推导中我们得到:
因此
分类函数
为:
这里的形式的有趣之处在于,对于新点
x
的预测,只需要计算它与训练数据点的内积即可,因为:
中,非支持向量的红色部分的大于0的,而α又是非负的,所以α等于0
而事实上,只有支持向量的α≠0,也就是说只要跟支持向量做内积就可以
8.线性不可分的情况——进行高维映射
事实上,
大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。在上文中,我们已经了解到了SVM处理线性可分的情况,那对于非线性的数据SVM咋处理呢?
一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。如果用
来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写作这样的形式:
如果我们构造另外一个五维的空间,其中五个坐标的值分别为
那么显然,上面的方程在新的坐标系下可以写作:
于是产生线性方程
也就是说,如果我们做一个映射
就能把样本映射到新的线性可分的空间中。
9.通过核函数在低维空间处理高维维度的内积
但是这样就会有维度爆炸的问题。而且如果遇到无穷维的情况,就根本无从计算了。所以就需要 Kernel 出马了。
将数据非线性映射到特征空间,就是采用
其中,
ϕ
:X->F是从输入空间到某个特征空间的映射
这意味着建立非线性学习器分为两步:
- 首先使用一个非线性映射将数据变换到一个特征空间F,
- 然后在特征空间使用线性学习器分类。
而决策规则就是用测试点和训练点的内积来表示:
计算
〈φ(xi · φ(x)〉
的时候,就可以采用核函数,核函数是:
也就是输入两个高维向量,能直接输出内积,但是,其中φ是从X到内积特征空间F的映射,也就是说核函数只是接受了低维空间的x和z,还有映射关系
φ,就能算出内积。
一般来说,内积为:
又注意到:
二者有很多相似的地方,实际上,我们只要把某几个维度线性缩放一下,然后再加上一个常数维度,具体来说,上面这个式子的计算结果实际上和映射
之后的内积
是相等的,但是第3个式子只需要在低维空间中计算,虽然不能获得映射后的结果,但是能求出相等的内积。
这就是核函数,例如,在刚才的例子中,我们的核函数为:
因此,我们的分类函数为:
其中α:
就很容易解决了(为什么要用高维映射的时候都是核函数,只需要内积结果就可以呢?可以认为是一个巧合)。
10.几种核函数
线性核
特征远大于样本就用线性核,速度最快,特征样本都很大也用这个
这实际上就是原始空间中的内积。其实就相当于没用核函数。
但是只是讲到线性核的时候,就可以作为一个参数使用
,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的
)
。
多项式核
适合处理维度爆炸问题,需要的参数比较多
高斯核/
RBF核/径向基核
这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。
不过,如果
σ
选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似)相当于一个低维的子空间;反过来,如果
σ
选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。
不过,总的来说,通过调控参数
σ
,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。
可以拟合线性核
Sigmoid核函数
K(x,xi)=tanh(κ(x,xi)−δ)
采用Sigmoid函数作为核函数时,支持向量机实现的就是一种多层感知器神经网络,应用SVM方法,隐含层节点数目(它确定神经网络的结构)、隐含层节点对输入节点的权值都是在设计(训练)的过程中自动确定的。而且支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部最小值,也保证了它对于未知样本的良好泛化能力而不会出现过学习现象。
傅立叶核
处理信号问题
11.松弛变量处理 outliers
在我们原来的 SVM 模型里,outlier 的存在有可能造成很大的影响,因为超平面本身就是只有少数几个 support vector 组成的,如果这些 support vector 里又存在 outlier 的话,其影响就很大了。
黑圈圈起来的那个蓝点是一个 outlier,因为有他的存在,分割超平面被挤压了,变成虚线的那样。
更严重的情况是,如果这个 outlier 再往右上移动一些距离的话,我们将无法构造出能将数据分开的超平面来。
原来的约束条件为:
(1表示原来约束分界面到支持向量的距离为1,但是现在约束变小一点,对于某些i,可以小于1,这些i称为松弛变量)
变成了:
其中红色的
称为松弛变量 (slack variable)
,为了防止松弛变量太大,就控制这些松弛变量的总和最小,以便一起优化。
其中C是一个事先确定好的常量,
用于控制目标函数中两项(“寻找 margin 最大的超平面”和“保证数据点偏差量最小”)之间的权重。
算法跟前面一样,得到相同的目标函数,但是其约束不同,阿尔法必须小于C
所以C越大后面的稀疏项带来的影响就越明显,
C代表的是在线性不可分的情况下,对分类错误的惩罚程度。C值越大,分类器就越不愿意允许分类错误(“离群点”)。如果C值太大,分类器就会竭尽全力地在训练数据上少犯错误,而实际上这是不可能/没有意义的,于是就造成过拟合。而C值过小时,分类器就会过于“不在乎”分类错误,于是分类性能就会较差。
因此,在有松弛的情况下outline点也属于支持向量SV,同时,对于不同的支持向量,拉格朗日参数的值也不同
对于远离分类平面的点值为0;对于边缘上的点值在[0, 1/L]之间,其中,L为训练数据集个数,即数据集大小;对于outline数据和内部的数据值为1/L
12.损失函数
上面的outliners的公式中,如何衡量outlinear带来的损失,有几种损失函数:
0-1损失:非凸不好求解
hinge损失:
采用这个损失可以保证稀疏性,才会变成上文所说的形式:
指数损失:
logistic损失:
采用这个几乎就变成了logistic regression,但是对率不能直接转换到支持向量,所以需要更多的样本
13.快速求解SVM的算法——
SMO
它选择凸二次规划的两个变量,其他的变量保持不变,然后根据这两个变量构建一个二次规划问题,这个二次规划关于这两个变量解会更加的接近原始二次规划的解,通过这样的子问题划分可以大大增加整个算法的计算速度,关于这两个变量:
- 其中一个是严重违反KKT条件的一个变量
- 另一个变量是根据自由约束确定,好像是求剩余变量的最大化来确定的。
14.多分类问题
直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该优化就可以实现多分类(计算复杂度很高,实现起来较为困难)
其中某个类为一类,其余n-1个类为另一个类,比如A,B,C,D四个类,第一次A为一个类,{B,C,D}为一个类训练一个分类器,第二次B为一个类,{A,C,D}为另一个类,按这方式共需要训练4个分类器,最后在测试的时候将测试样本经过这4个分类器
f_1(x)
,
f_2(x)
,
f_3(x)
和
f_4(x)
,取其最大值为分类器
(这种方式由于是1对M分类,会存在bias,很不实用)
任意两个类都训练一个分类器,那么n个类就需要n*(n-1)/2个svm分类器。
还是以A,B,C,D为例,那么需要{A,B},{A,C},{A,D},{B,C},{B,D},{C,D}为目标共6个分类器,然后在预测的将测试样本通过这6个分类器之后进行投票选择最终结果。
(性能好,但是需要n*(n-1)/2个分类器代价太大,不过有好像使用循环图来进行改进)
15.总结
SVM它本质上即是一个分类方法,用w^T+b定义分类函数,于是求w、b,为寻最大间隔,引出1/2||w||^2,继而引入拉格朗日因子,化为对拉格朗日乘子a的求解(求解过程中会涉及到一系列最优化或凸二次规划等问题),如此,求w.b与求a等价,而a的求解可以用一种快速学习算法SMO,至于核函数,是为处理非线性情况,若直接映射到高维计算恐维度爆炸,故在低维计算,等效高维表现
。
优点:
可用于线性/非线性分类,也可以用于回归;
低泛化误差;
容易解释;
计算复杂度较低;
缺点:
对参数和核函数的选择比较敏感;
KMeans
半监督聚类算法:
- E步(求期望):一开始选k个类中心,更新类中心
- M步(求极大):对于每个样本点,分配到离他最近的类中心
求类中心的公式:
- 平均类中心
- Minkovski
- 欧氏
- CityBlock
初始类簇中心点的选取
- 最关键的就是注意不要选中离群点
- 常用技术是:多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。
- 选择批次距离尽可能远的K个点
- 层次聚类,有效但是适用数据量小
- Canopy算法进行聚类
优化Kmeans
使用kd树或者ball tree(这个树不懂)
将所有的观测实例构建成一颗kd树,之前每个聚类中心都是需要和每个观测点做依次距离计算,现在这些聚类中心根据kd树只需要计算附近的一个局部区域即可
选择K值:
逐渐增加K,直到类内间距等衡量簇的指标急剧下降
优点:
- 对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k<
- 当簇是密集的且簇与簇之间区别明显时,聚类效果较好。算法尝试找出使平方误差函数值最小的k个划分。
缺点:
- k-平均方法只有在簇的平均值被定义的情况下才能使用,且对有些分类属性的数据不适合。
- 要求用户必须事先给出要生成的簇的数目k。
- 对初值敏感,对于不同的初始值,可能会导致不同的聚类结果。
- 不适合于发现非凸面形状的簇,或者大小差别很大的簇。
- 对于”噪声”和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。
EM
EM用于隐含变量的概率模型的极大似然估计,它一般分为两步:
- 求根据极大似然函数的参数求出后验概率的值(E)
- 根据后验概率的值求极大似然的参数(M)
优化路径:每次只更改一个参数
如果概率模型的变量都是观测变量,那么给定数据之后就可以直接使用极大似然法或者贝叶斯估计模型参数。
但是当模型含有隐含变量的时候就不能简单的用这些方法来估计,EM就是一种含有隐含变量的概率模型参数的极大似然估计法。
应用到的地方:混合高斯模型、K-means
GMM
每个样本都有可能由k个高斯产生,只不过由每个高斯产生的概率不同而已,因此每个样本都有对应的高斯分布(k个中的某一个),此时的隐含变量就是每个样本对应的某个高斯分布。
对i个样本,选择第j个高斯
求最大似然
就会获得第i个样本属于这第j个高斯的概率,就可以获得属于每一个高斯的概率,也就是说,对每个样本,进行了一次最大似然分布计算
把样本归类到概率最大的高斯那里
更具体的计算公式为:
根据样本的分布,计算每个高斯的比重,均值,方差这3个参数
Naive Bayes:
关键:
计算后验概率
假设每个特征独立(Naive)
在样本集里统计对各个类进行对应的特征分布的统计
朴素贝叶斯的思想基础:
- 对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率。
- 哪个最大,就认为此待分类项属于哪个类别。
通俗来说,就好比这么个道理:
- 你在街上看到一个黑人(对于黑人这个分类)
- 我问你你猜这哥们哪里来的,你十有八九猜非洲。
为什么呢?因为黑人中非洲人的比率最高,因为非洲这个特征的先验概率最大,当然人家也可能是美洲人或亚洲人,但在没有其它可用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。
原理:
- 设为一个样本集,而每个a为x的一个特征属性。
- 有类别集合(即label)
- 计算
- 如果,则。(对每个类别的样本,把这些类别归咎到最常带有条件概率最大的特征上)
要计算第3步中的条件概率:
- 通过贝叶斯公式,把P(y|x)转化为P(x|y):,变成在y条件下关于样本的条件概率的问题
- 这个关于样本的条件概率通过统计可以得到:对于每一个类,计算导致这个类的最频繁的特征的次数
- 比如,把所有的1类找出来,然后看在这些1类中,最经常带有的特征是哪个,然后第二经常带有的特征是哪个...
或者换一种表述:
1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。
2、统计得到在各类别下各个特征属性的条件概率估计。即。
3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:
因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:
当特征为连续值的时候:
把特征假定为服从高斯分布:
而
因此只要计算出训练样本中各个类别中此特征项划分的各均值和标准差,代入上述公式即可得到需要的估计值。
当出现了概率为0的情况使得样本最大似然=0怎么办:
Laplace平滑:给分子和分母同时加上一个常数:
可以证明Laplace光滑是满足凸优化的,于是得到最大似然的近似
平滑因子 λ=0 即为最大似然估计,这时会出现在本节开始时提到的0概率问题
而 λ=1 则避免了0概率问题
朴素贝叶斯的优缺点:
对小规模的数据表现很好,适合多分类任务,适合增量式训练。
缺点:
对输入数据的表达形式很敏感。
树模型
分裂节点的选择
树剪枝
如何处理因为噪声和野点的异常分支
- C4.5先剪枝,用一个阈值停止树的构建,但是选择这个阈值是困难的
- CART后剪枝,把被剪掉的子树中最频繁的类标记作为树叶的值
决策树的优点:
计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征;
缺点:
容易过拟合(后续出现了随机森林,减小了过拟合现象);
XGBoost:
实际上xgb一切都是围绕构造loss function来的,一切都是为了替代GBDT使用的,很难并行化的残差计算
改进的地方:
(也可以说是:如何建立一套不基于上一棵树的残差的cost function——通过建立基于复杂度的loss function来实现)
(一部为了达到分布式的优点而进行社会主义大改造而且还顺便优化了性能的史诗)
- 二阶泰勒展开来近似cost(不是loss)
- 通过L2和树模型复杂度衡量项正则化
- 从cost产生了一个近似的loss function
- 通过简单的二项式最优化获得权值
- 并根据loss funtion来分裂子叶(而不是信息熵之类的)
解读——为什么具有良好的效果:
- 最吼的一点:简化cost function,并实现并行化
- 从数学的角度,相当于把树的整个树模型的参数包含了进去loss funtion里,而不是传统中把sigmoid函数跟信息熵两种不同类别的函数进行分而治之
- 从优化的角度,可以看成使用了二阶特性进行求解
而且通过一系列优化提高速度:
- 针对cpu和内存的优化
- 通过MPI等进行分布式调度(因为有loss funtion所以才可以进行这样分布式)
- 实现了基于目标函数的分裂点判别算法。
- 利用了特征的稀疏性。
- 数据事先排序并且以block形式存储,有利于并行计算
感知机Percepton:
通过正负样本的不断惩罚把分界面收敛到最优。
这种算法的基本思想是:
当一个实例点被误分类,即位于分类超平面错误的一侧时,则调整w和b,使分类超平面向该误分类点的一侧移动,以减少该误分类点与超平面的距离,直到超平面越过该误分类点使其被正确分类为止。
需要注意的是,这种感知机学习算法得到的模型参数不是唯一的。
为了得到唯一的分类超平面,需要对分类超平面增加约束条件,线性支持向量机就是这个想法。
原理:
1.对一个随机的线性分界面
,用其与样本间的函数距离求解其loss,其距离为
2.就通过
确定感知机模型中的参数w和b,需要定义一个损失函数并通过将损失函数最小化来求w和b
3.将误分类点的距离相加,并直接省略
获得损失函数:
为什么可以直接省略
?
(1).因为感知机模型是以误分类点为驱动的,最后损失函数的值必然为零,即无误分类点。既然函数距离能判断样本点的分类正确性,我们何必用几何距离呢?实际上我们并不关心lost function具体数值的变化,我们只在乎还有没有误分类点。
(2).去掉
,我们得到的lost function是关于w,b的连续可导线性函数,可以用梯度下降法轻松地进行优化。
求解方法:
可通过随机梯度下降方法求解
对L求w和b的偏导,然后对误分类点带入求解w和b的
梯度,并乘以学习率后更新w和b
当然,也可以通过拉格朗日对偶并通过核技巧求解
跟SVM的区别:
SVM就像是原始的感知机的孙子(不是儿子)
我认为实际上区别在于:
衡量分界面的时候原始的感知机用L1范数(函数距离),SVM用L2范数(几何距离)
由L2范数对分界面的限制带了稳定的分界面,带来的拉格朗日对偶性,核方法,非线性分界面的处理,各种防止过拟合的性能,甚至支持向量的概念都是从这个改动而来的。
L1范数(函数距离)
L2范数(几何距离)
BP神经网络:
误差从后面开始传播,每一层的Loss定义为向量的方差:
对这个方差求偏导,进而更新权值:
一开始让W,b=0【实际上会给一个初始分布】
然后对各层进行更新
可能会梯度消失,因为sigmoid的导数在0时最高=1/4 ,如果把为了求前面的权值而把梯度(也就是导数)进行累乘,每一层的权值一定会比前面一层减小1/4
解决:
- ReLU,不用乘法,在0保持很高,稀疏性
- Xavier
为了让输出值在很多层之后依然保持着良好的分布
,需要保证前向传播和反向传播时每一层的方差一致,应满足:
所以
He initialization
0.5为dropout的时候,方差为1/2,所以在Xavier上除以2
- batch normalization 让每一层网络的输入保持相同的分布
BN给数据带来零均值(加快收敛)和数据去相关(提高数据区分度)
其方法就是进行0均值和加入单位方差
为了避免在sigmoid函数中0均值单位方差把sigmoid两边的摧毁的问题,增加参数gamma,beta
每一步进去的时候用Batch的E和Var作为总体的估计,并进行计算,启发我们大Batch可以带来更精确的BatchNorm跟更好的全局最优解
整个算法就是对mini-batch求均值和方差并进行scale
上诉两个参数对于x的每一维都具有相应的参数,故假设X.shape = [N,D],那么gamma.shape = [D,]
dropout在每一个batch的数据上使用不同的网络,相当于生成了一堆不同的分类器,预测的时候把dropout设为1并进行inferrance,表示把这些不同的分类器esemable起来,因此Dropout的最大作用就是训练子分类器并进行组合预测,降低过拟合和训练成本。
dropout等价于在原始样本中加入部分置0的样本并加以学习,即加入了使dropout层变成0的样本,也就是说,增加了样本的数据稀疏性,同时又增加了样本量。在非线性空间中,数据量少的情况下,用带稀疏性的低维度样本的集合进行训练能达到好的效果,等同于在不同的降维空间中单独学习并训练整体的分类器,类似于树模型。启发我们在数据不充分的情况下,随机把部分数据置零进行训练也可以达到好的效果
大batch size在显存能允许的情况下收敛速度是比较快的但有时的确会有陷入局部最小的情况,达到相同精度需要更多epoch
小batch size引入的随机性会更大些(超大的batch中梯度抵消),有时候能有更好的效果,但是就是收敛速度慢一些甚至不收敛
一般要求是8的倍数
KNN算法的优点:
1、思想简单,理论成熟,既可以用来做分类也可以用来做回归;
2、可用于非线性分类;
3、训练时间复杂度为O(n);
4、准确度高,对数据没有假设,对outlier不敏感;
缺点:
1、计算量大;
2、样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
3、需要大量的内存;
Adaboost
1、训练第一个分类器,样本的权值D为相同的均值。通过一个弱分类器,得到这5个样本(请对应书中的例子来看,依旧是machine learning in action)的分类预测标签。与给出的样本真实标签对比,就可能出现误差(即错误)。如果某个样本预测错误,则它对应的错误值为该样本的权重,如果分类正确,则错误值为0. 最后累加5个样本的错误率之和,记为ε。
4、循环步骤1,2,3来继续训练多个分类器,只是其D值不同而已。
测试过程如下:
输入一个样本到训练好的每个弱分类中,则每个弱分类都对应一个输出标签,然后该标签乘以对应的α,最后求和得到值的符号即为预测标签值。
Boosting算法的优点:
低泛化误差;
容易实现,分类准确率较高,没有太多参数可以调;
缺点:
对outlier比较敏感;
FM(因式分解机)和FFM(领域感知因式分解机)
FM:
基于矩阵分解,把稀疏的特征进行性能合理的二阶组合的机器
通过把二阶组合矩阵分解成两个隐向量矩阵实现(一个权值矩阵分解成两个权值矩阵)
其二阶特征矩阵W分解成:
因此
其中,
vi
是第
i
维特征的隐向量,通过隐向量的
点积表示特征因子的W
与线性模型相比,FM(Factorization Machine)的模型就多了后面特征组合的部分
辅助向量的维度k值的限定,反映了FM模型的表达能力
FFM:
引入特征类别标签,在进行性能合理的二阶组合时,对每个隐向量,先求取其与类别标签矩阵的内积
该类别标签通过引入一列表示类别类型的特征实现
注意:
省略0值
归一化到【0,1】
FM: O(kn
) FFM: O(kn2)
意义:
减少了对两项都有的样本的依赖
线性时间复杂度
适用于稀疏值
减少了人工特征测试的工作量
FTRL:
一个SGD这样的在线训练算法的魔改版,可以产生稀疏解(降低模型体积)并保持很好的精度【并因为每个维度单独更哦学习率,能很好地利用每个样本】
业内常用LR(Logistic Regression)和FM(Factorization Machines)为点击率预估建模。对LR、FM这类模型的参数学习,传统的学习算法是batch learning算法,它无法有效地处理大规模的数据集,也无法有效地处理大规模的在线数据流。这时,有效且高效的online learning算法显得尤为重要。
FTRL是对w每一维分开训练更新的,每一维使用的是不同的学习速率
,也是上面代码中lamda2之前的那一项。与w所有特征维度使用统一的学习速率相比,
这种方法考虑了训练样本本身在不同特征上分布的不均匀性
,如果包含w某一个维度特征的训练样本很少,每一个样本都很珍贵,那么该特征维度对应的训练速率可以独自保持比较大的值,每来一个包含该特征的样本,就可以在该样本的梯度上前进一大步,而不需要与其他特征维度的前进步调强行保持一致。
UBM
通用背景模型
因为每个说话人的数据不足无法覆盖所有的GMM分量,所以采用把所有的训练一个GMM称为UBM,并用每个说话人的特征向量作为单个人的模型,覆盖不到的维度用UBM填补,这样通过比较测试语音的特征向量和个人模型,UBM,就可以比较出个人向量和信道向量的乘积,用LDA降维后可得跟个人向量的相似度。
至于特征向量经过一个发展过程,一开始是高斯的均值,后来是对这个高斯均值进行因子分解SVD:
Gauss=Person*Channel*Loss
然后就出现了把
Channel*Loss作为一个I-vector的方法,用I-vector表征每个个人
对于信道特征,注意到UBM模型的I-vector跟个人都有此特征,所以用LDA等降维方法进行消去
至此,对每个模型和UBM计算cosine距离,即可得最后得分
Active-SVM
在Version space里
所有函数必须升维到线性可分状态,否则影响【怎么升维?】
Duality
对偶性
通过对偶性定义可以把空间转换到样本作为线的空间【version space】,由此距离分界面的距离就变成距离黑色点的距离
所以未标签样本是这样的:
我们想要比较能保持样本的距离的【半径比较大】,所以黑线如果是三角,那么圆圈在A,要么样本在B
复杂的情况中:
会选择最靠近核心的样本:B
标记B后:
即选择最接近现有分界面的样本:
另一种方法:Ratio Margin
对每一个样本,判为+1和-1并进行线性组合,从而发现哪一个组合能取得最大的分界面和样本的距离
【在特征空间就是把所有迷糊样本进行正负例判定,选择能让特征距离最大的集,并把最近的扔出来要求打标】
【在version空间上就是在所有的空白区域画一个圆,并选择具有最大的圆半径的那个】
大多数会采用这种方法,实际上也可以看出如果继续对A圆分割会变成很小的空间
查看一下那个github里面的分解是什么样的
几种优化:
保护负样本的加权ratio margin
基于因子分解的加速
对偶空间里也可以做优化
过滤:
|
群体/个体 |
计算代价 |
适用场景 |
冷启动 |
可解释性 |
实时性 |
user-based |
更依赖于当前用户相近的用户群体的社会化行为 |
适用于用户数较少的场合 |
时效性强,用户个性化兴趣不太显著的场合 |
新加入的物品能很快进入推荐列表 |
弱 |
用户新的行为不一定导致推荐结果的变化 |
item-based |
更侧重用户自身的个体行为 |
适用于物品数较少的场合 |
长尾物品丰富,用户个性化需求强烈的场合 |
新加入的用户能很快得到推荐 |
强 |
用户新的行为一定导致推荐结果的变化 |
技巧:
-
清除作弊、刷单、代购等噪声数据。这些数据的存在会严重影响算法的效果,因此要在第一步的数据清洗中就将这些数据剔除。
-
合理选取训练数据。选取的训练数据的时间窗口不宜过长,当然也不能过短。具体的窗口期数值需要经过多次的实验来确定。同时可以考虑引入时间衰减,因为近期的用户行为更能反映用户接下来的行为动作。
-
尝试不同的相似度计算方法。在实践中,我们采用了一种称作loglikelihood
-
location-based,query(搜索请求)-based,graph-based,实时用户行为
优化器的选择:
梯度下降
用整个数据集的梯度方向更新
SGD
一次只用一个样本点,对于每个样本求它的梯度,然后乘以α来更新θ
缺点是对于损失方程有比较严重的振荡,并且容易收敛到局部最小值
Momentum
为了克服SGD振荡比较严重的问题,Momentum将物理中的动量概念引入到SGD当中,通过积累之前的动量来替代梯度。即:
相较于SGD,Momentum就相当于在从山坡上不停的向下走,当没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。也就是说,在训练的时候,在梯度方向不变的维度上,训练速度变快,梯度方向有所改变的维度上,更新速度变慢,这样就可以加快收敛并减小振荡。
Adagrad
相较于SGD,Adagrad相当于对学习率多加了一个约束,即:
Adagrad的优点是,在训练初期,由于gt较小,所以约束项能够加速训练。而在后期,随着gt的变大,会导致分母不断变大,最终训练提前结束。
Adam
Adam是一个结合了Momentum与Adagrad的产物,它既考虑到了利用动量项来加速训练过程,又考虑到对于学习率的约束。利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。其公式为:
其中:
小结
通过实践证明,Adam结合了Adagrad善于处理稀疏梯度和Momentum善于处理非平稳目标的优点,相较于其他几种优化器效果更好。同时,我们也注意到很多论文中都会引用SGD,Adagrad作为优化函数。但相较于其他方法,在实践中,SGD需要更多的训练时间以及可能会被困到鞍点的缺点,都制约了它在很多真实数据上的表现。
损失函数的选择
我们发现Cross Entropy相比于在线性模型中表现比较好的平方差函数有着比较明显的优势。
其主要原因是在深度学习通过反向传递更新W和b的同时,激活函数Sigmoid的导数在取大部分值时会落入左、右两个饱和区间,造成参数的更新非常缓慢。具体的推导公式如下:
一般的MSE被定义为:
其中y是我们期望的输出,a为神经元的实际输出a=σ(Wx+b)。由于深度学习反向传递的机制,权值W与偏移量b的修正公式被定义为:
因为Sigmoid函数的性质,导致σ′(z)在z取大部分值时会造成饱和现象。
Cross Entropy的公式为:
如果有多个样本,则整个样本集的平均交叉熵为:
其中n表示样本编号,i表示类别编号。 如果用于Logistic分类,则上式可以简化成:
与平方损失函数相比,交叉熵函数有个非常好的特质:
可以看到,由于没有了σ′这一项,这样一来在更新w和b就不会受到饱和性的影响。当误差大的时候,权重更新就快,当误差小的时候,权重的更新就慢。
Wide&Deep Learning
解决了两种性质的协同,通过一个网络比较两者之间哪个更好,谁更好谁积分高谁排前面
性质 |
需要的能力 |
实现方式 |
算法 |
例子 |
Memorization |
从现有的训练数据item或者特征的共现或者相关性 |
共性,局部性 |
LR |
炸鸡跟啤酒经常一起使用(是热门CP) |
Generalization |
相关性的传递 |
新特征组合,多样性 |
DNN+embedding |
吃炸鸡的人也会喜欢汉堡(类似) |
基本架构理解:
实际实现的情况:
- 数据生成:用户浏览的app,如果安装了1,否则就是0.一些基本的特征处理,也在这里做了,比如将app映射到id,将实数特征离散化到0-1.
- 模型训练:详细的模型如下图所示。wide部分是包括用户安装的app和浏览过的app特征组合,而deep部分 使用了32维的向量来表达各个categorical特征,之后组合得到了1200维向量,最后使用logistic回归。模型使用了5000亿样本,每次新来了一组训练数据,模型都要被重新训练,但是都是在上一个模型基础上训练(FTRL)。模型上线之前还会和之前的模型做个对比,保证安全
- 模型服务:模型训练并且验证完了之后,就放到model servers上。每次请求来了,都会从数据库中获取一堆app并获取用户的特征,之后用模型进行排序。为了快速响应,使用分布式的预估。
LSTM:
特长是记忆长期信息【横向那条C的黑线就是一直传递的长程记忆】
|
行为 |
实现方法 |
图例 |
对长程记忆的影响 |
例子 |
忘记门 |
用从上一次的输出和本次的记忆的组合控制久远的记忆中要保留什么 |
sigmoid 变换后点乘 |
|
忘却 |
根据新的主语的性别来替代旧的需要忘记的主语 【选择主语】 |
输入门 |
决定要输入哪些新的值 |
Sigmund变换 后 tanh进行选择 |
|
添加 |
丢弃旧代词的性别信息并添加新的信息 【替代主语】 |
输出门 |
通过现有的状态选择长程记忆里要输出的东西 |
Sigmund变换 后继续tanh变换以进行选择 |
|
瞒报 |
可能这此输入是一个新主语,输出却要求是一个动词,因此要根据主语做词性变化 【根据新的主语输出相关信息】 |
GRU:
- 将忘记门和输入门合成了一个单一的更新门
- 同样还混合了细胞状态和隐藏状态
- 其他一些改动
- 最终的模型比标准的 LSTM 模型要简单
Attention机制:
用于encoder-decoder模型【常用于seq2seq任务】
即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci
每个Ci包含了不同的
源句中单词的 注意力分配的 概率分布
这个概率分布计算出来的效果如下,描绘了生成目标单词时,每个输入单词的权重
其计算的方法:
让每个encoder的输出到后面decoder的输出训练一个神经网络,因此现在
每个解码器输出的词语yt取决于所有输入状态的一个权重组合(通过一个小型神经网络训练得到,训练一个语句转换间源语句的影响力的权重计算网络),而不只是最后一个状态
主题模型:
SVD:
奇异值分解方法:把一个矩阵用几个小得多的矩阵表达
奇异值也可以用来做PCA
NMF:
一种矩阵分解,要求输入矩阵元素非负,目标和 SVD 一样。
LSA:
应用SVD进行文章的简化
U:
一行表示意思相关的一类词,其中每个词的值表示它在这一类中的重要性(即相关性)
E:词和文章间的相关性
V:文章的类别及其重要性
pLSA:
LSA 的一种概率解释方法,不用SVD——要求矩阵元素是非负整数。
通过对文章中的主题和词语的概率成分建模,优化目标是是KL-divergence最小,而不是依赖于最小均方误差等准则
通过EM迭代
LDA:主题模型
按照文档生成的过程,使用贝叶斯估计统计学方法,将文档用多个主题来表示。
LDA就是pLSA 加上 topics 的 Dirichlet 先验分布后得到的 Bayesian model,数学上更漂亮。为什么是 Dirichlet 先验分布,主要是利用了 Dirichlet 和 multinomial 分布的共轭性,方便计算
基于EM和 差分贝叶斯方法
TFIDF:
词频
(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语 来说,它的重要性可表示为:
其中, 是该词 在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和。
逆向文件频率
(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到:
-
其中
- |D|:语料库中的文件总数
- :包含词语的文件数目(即的文件数目)如果该词语不在语料库中,就会导致被除数为零,因此一般情况下使用
为什么用倒数:如果词在各个文档中出现的可能性越少,那么他就越重要,所以使用这个出现的概率的倒数使其变成递增的参数
为什么用log,因为如果数字很大,有可能出现大数问题
然后
-
含义
关键词只在很少的网页中出现,我们通过它就容易锁定搜索目标,它的权重也就应该大。反之如果一个词在大量网页中出现,我们看到它仍然不很清楚要找什么内容,因此它应该小
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
根据每一个词在指定文本中的分数,可以进行排序,得分最高的词就成为文本的主题词
停用词的权重应该是0
文本距离:
获取关键词的TF-IDF权重后,取出top 20个关键词,计算词频【词出现次数/文章长度】,然后计算两个参数的余弦距离【点乘/两个向量长度的积】
时域TF-IDF:
把TF-IDF的时域权重对应起来,处理突发词并进行过滤
决定词语频率的应该为F1共振峰,通过对频域进行高通滤波的方法处理,减少突发【周期】词的TF-IDF
没有时域标签的问题,通过应用DTW算法进行对齐
采用的时间窗口分别为2天,7天,15天分别对应【100点,350点,750点】
性能上升了1%
https://wenku.baidu.com/view/ec54b2514028915f814dc204.html
技巧:
短文本可以不用TF-IDF权重而用bool权重
Word2VEC
什么是word2vec
把词映射到向量空间也是一种对文本进行编码的方式,但比onehot更能表现词之间的关系
可以进行词向量建模,可以回答
king is to queen as father is to ?
这样的问题
映射到向量空间有两种:
Word2Vec有两种模式:
- 适用于小数据集的CBOW
- 适用于大数据集的skip-gram
预测模型通常用最大似然的方法,根据当前已经有的词语和接下来的词语训练分类器
如何构建数据集:
随机组合生成大量的样本,并作为负样本,此方法称为Negative Sampling
python中的dict查询复杂度为O(1)
当采用CBOW模型:
the blown fox jump over the lazy dog.
把连续的词对(the→blown,blown
→the,blown
→fox
)扔进去训练,label为高
同时随机构造大量随机词对
(over
→fox
,fox
→the
)
,label为低
当采用skip-gram模型:
the blown fox jump over the lazy dog.
skip-gram构造目标词汇[dog]到语境[blown,fox]的映射
因此就会构造出dog->blown,dog->fox等映射
直接把训练数据等扔进去tf.nn.nce_loss就能计算loss,等同于计算目标是正确跟错误的二分类器,目标值越真实,概率越大然后用SGD优化即可
一些优化的trick
转化为onehot这件事,在gpu中没有很好的实现,所以用:
with tf.device("/cpu:0"):
- 因为分词的过程一般都会去掉停用词,所以不用在意the之类的词语生成大量的数据对
embedding
只要
满足
- injective(单射函数,X跟Y一一对应)
- structure-preserving(保形性)
即可算是embedding,词语做embedding主要是想在不过多增加维度的同时保存词语间相互的结构
其中,word2vec就是通过训练DNN模型参数的方法训练不同词语(输入向量)对应的输出(最相关的词语)
而模型的权重就保存了词语的embedding关系
CountVectorizer
就是上面提到的LSA等计数模型的最基础版本(或者说,最基础部分),
通过计数来将一个文档转换为向量
降维:
SVD也是这里的:
LDA:线性判别分析
损失函数:
目标是,使得类别内的点距离m越近越好(集中),类别间的点s越远越好
求出的就是这根曲线的斜率wi
PCA
LDA的输入数据是带标签的,而PCA的输入数据是不带标签的,所以PCA是一种unsupervised learning
目标:使得降维后的数据间方差最大/即投影误差最小
其仍然是给出一个权重,然后让样本点投影到上面并求方差最小
特征值分解法求PCA:
求样本的协方差矩阵里最大的M个特征值的特征向量,从而降维,使得降维后的数据的协方差最大化【特征值分解必须是方阵】
ICA
PCA的扩展
目标函数:
样本数据 x 经过参数矩阵 W 线性变换后的结果的L1范数
加入标准正交性约束后,即求这样的优化问题:
用梯度下降等方法求解
区别
PCA认为数据是冗余的,要提取出不相关的特征,因此它找
到这样一组分量表示,使得重构误差最小,即最能代表原事物的特征。
ICA认为数据是其中的独立元素的组合,因此将原始数据降维并提取出相互独立的向量,使得每个分量最大化独立,能够发现一些隐藏因素
SNE
在高维空间相似的数据点,映射到低维空间距离也是相似的。常规的做法是用欧式距离表示这种相似性,而SNE把这种距离关系转换为一种条件概率来表示相似性。
隐含高斯分布假设并建模:
然后把两个类分布的距离用KL距离表示
用重力聚类表示:【同类引力,异类斥力】
低维空间中点
yi yi
的位置是由其他所有点对其作用力的合力所决定的。其中某个点
yj yj
对其作用力是沿着
yi−yj yi−yj
方向的,具体是引力还是斥力占主导就取决于
yj yj
与
yi yi
之间的距离了,其实就与
(pj∣i−qj∣i+pi∣j−qi∣j) (pj∣i−qj∣i+pi∣j−qi∣j)
这一项有关。
t-SNE
在SNE基础上做优化:
1.在上面的分布假设添加对称性:
在原始的SNE中,
也是不相等的,这是不合理的,因此定义对称的概率分布函数如下:
2.解决聚类后数据都堆积在一起的拥挤问题
t分布更适合处理有野点的情况
因此用自由度为1的t分布重新定义概率分布函数
HMM
隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程
主要应用于两种问题
语音解码:
已知概率和可见状态求隐含状态:最大似然,Viterbi
【从前面的开始推断概率并把最大的(昨天天气的概率*今天朋友做这个事的概率*两者的转移概率),因为前天的可能有很多种,取结果最大的那种作为今天的概率】
Viterbi算法就是求解HMM状态转换图上的最短路径(-log(prob),也即是最大概率)
知道几种隐含状态,知道可见状态链,求转换概率
Baum-Welch 鲍姆-韦尔奇比较复杂
PageRank