参考资料:《速通机器学习》北大博士后AI卢菁
因为原文公式全部炸了,难以阅读,故在学习过程中编写了此笔记,精简了原文并添加了一定自己的理解(所以会有很多不严谨的地方),如有错误感谢指出。
共识:
- 在数学推导中,为了方便求导,我们采取以 e e e为底的对数函数。
第一章 数据的量化和特征提取
机器学习是什么呢?通俗地讲,就是机器(计算机)使用模型进行学习,以解决特定任务。模型可以理解为一个数学运算函数。模型的输入是图像等信息(函数的自变量),模型的输出是我们想要的结果(函数的因变量),例如识别图像中的动物是“猫”还是“狗”。函数里的很多参数是未知的,**学习阶段就是通过已知结果的数据来寻找合适的参数,使模型能够给出正确的输出。学习一般被形象地称为训练。**模型训练完成后,我们就可以使用它对未知类别的数据进行预测。
闵可夫斯基距离: d i s m i n k o w s k i ( x , y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p dis_{minkowski}(x,y)=(\sum_{i=1}^n|x_i-y_i|^p)^{\frac{1}{p}} disminkowski(x,y)=(∑i=1n∣xi−yi∣p)p1
欧式距离: p = 2 p=2 p=2的闵可夫斯基距离 d i s e u c l i d e a n ( x , y ) = ( ∑ i = 1 n ∣ x i − y i ∣ 2 ) 1 2 dis_{euclidean}(x,y)=(\sum_{i=1}^n|x_i-y_i|^2)^{\frac{1}{2}} diseuclidean(x,y)=(∑i=1n∣xi−yi∣2)21
曼哈顿距离: p = 1 p=1 p=1的闵可夫斯基距离 d i s m a n h a t t a n ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ dis_{manhattan}(x,y)=\sum_{i=1}^n|x_i-y_i| dismanhattan(x,y)=∑i=1n∣xi−yi∣
切比雪夫距离: l i m p → + ∞ \underset{p\rightarrow+\infty}{lim} p→+∞lim的闵可夫斯基距离, d i s c h e b y s h e v ( x , y ) = M a x i = 1 n ∣ x i − y i ∣ dis_{chebyshev}(x,y)=Max_{i=1}^n|x_i-y_i| dischebyshev(x,y)=Maxi=1n∣xi−yi∣
以上三种距离都有一个缺点,就是容易受特征量纲的影响。例如,用一个2维特征表示人的体重和身高,体重的单位为千克,身高的单位为毫米,如 ( 60 , 1700 ) (60,1700) (60,1700)。此时,体重的数量级远小于身高,这会导致在计算距离时放大身高的作用。
因此我们对所有数据进行归一化,使得各个维度的均值和方差归一至
(
0
,
1
)
(0,1)
(0,1),令
x
i
′
=
x
i
/
σ
i
x_i^{'}=x_i/\sigma_i
xi′=xi/σi其中
σ
i
\sigma_i
σi代表第i
维度的标准差。
余弦相似度 c o s ( x , y ) = x ⋅ y ∣ x ∣ ∣ y ∣ cos(x,y)=\cfrac{x\cdot y}{|x||y|} cos(x,y)=∣x∣∣y∣x⋅y.
余弦相似度和向量的长度无关,它是用来衡量各个维度比例的相似性的。当两个向量各维度的比例相同时,它们的夹角为0,相似度为1。
第二章 线性回归
在企业中,技术人员会将商品的价格、品牌等作为输入来预测商品的销量,甚至通过上市公司的财报、行业信息等来预测公司股票价格的变化。它们的共同点是通过输入来预测输出。在机器学习中,这类业务有一个专门的名字——回归(Regression)。
线性回归与逻辑回归主要区别 线性回归处理的是回归问题,目标是拟合值;而逻辑回归处理分类问题,目标是预测类别。
此处的线性指的是线性代数中的线性变换(矩阵乘法) y ′ = w x + w 0 y^{'}=wx+w_0 y′=wx+w0
2.1 损失函数和梯度下降法
考虑x和y是一维数据时, { x , y } \{x,y\} {x,y}为二维坐标系中的一个点,训练样本在该坐标系中对应于若干散点,每个点都代表一个样本。线性回归希望找到一条合适的直线来尽量多的穿过坐标中的点。
我们选择均方误差MSE: L o s s = 1 N ∑ i = 1 N ( y i ′ − y i ) 2 Loss=\frac{1}{N}\overset{N}{\underset{i=1}{\sum}}(y^{'}_i-y_i)^2 Loss=N1i=1∑N(yi′−yi)2
如果 w 0 w_0 w0 不变,那么 w 和 Loss 是一一对应关系,即一个 w 值对应于唯一的 Loss 值。投影到二维坐标系,横轴为 w,纵轴为 Loss。如图2-3所示,这是一条典型的抛物线(对应于高维空间中的抛物面)此时,问题变为找到一个使 Loss 最小的 w.
w ∗ = a r g w m i n L o s s = a r g w m i n L o s s = 1 N ∑ i = 1 N ( w x i + w 0 − y i ) 2 w^*=\underset{w}{arg}\ min\ Loss=\underset{w}{arg}\ min\ Loss=\frac{1}{N}\overset{N}{\underset{i=1}{\sum}}(wx_i+w_0-y_i)^2 w∗=warg min Loss=warg min Loss=N1i=1∑N(wxi+w0−yi)2
显然在这个简化的例子当中我们能够通过求偏导 ∂ L o s s ∂ w \cfrac{\partial Loss}{\partial w} ∂w∂Loss和 ∂ L o s s ∂ w 0 \cfrac{\partial Loss}{\partial w_0} ∂w0∂Loss来计算出最优解。
但是在实际操作中,我们只能得到一个朴素的结论:如果要得到一个更小的 Loss,就需要先随机初始化 w,再让 w 朝一个特定的方向变化。w 的变化方式如下:
w → w − μ ∂ L o s s ∂ w w\rightarrow w-\mu \cfrac{\partial Loss}{\partial w} w→w−μ∂w∂Loss
w 0 → w 0 − μ ∂ L o s s ∂ w 0 w_0\rightarrow w_0-\mu \cfrac{\partial Loss}{\partial w_0} w0→w0−μ∂w0∂Loss
μ 是一个 (0,1) 之间的常数,用于控制 w 的变化幅度,避免因 w 变化过大而造成震荡。但是,μ 也不宜过小,因为过小的 μ 会使学习时间延长。
在这里, ∂ L o s s ∂ w \cfrac{\partial Loss}{\partial w} ∂w∂Loss就是梯度。w 通过梯度使 Loss 的值不断减小。因此,上述迭代过程也称为梯度下降法。
为了避免过拟合和欠拟合,这就要求模型学习阶段的 Loss 要降低(学会规律),但不能降得过低(把噪声也学会了)。
2.2 训练集与测试集
除了训练集和测试集,还有一个非必需的有效集。有效集是指在训练阶段使用的测试集。例如,有三个学习率 μ 1 、 μ 2 、 μ 3 μ_1、μ_2、μ_3 μ1、μ2、μ3,我们并不知道哪一个是最好的。在训练阶段,分别用学习率 μ 1 、 μ 2 、 μ 3 μ_1、μ_2、μ_3 μ1、μ2、μ3 做实验,每组实验用相同的训练样本进行模型训练,然后用有效集对这三个模型进行评测,将效果最好的模型作为最终结果。有效集常用于在训练阶段寻找合适的超参数。超参数一般是指梯度无法表达的参数,例如学习率。
打个比方:在准备考试时,训练集相当于平时做的练习题,有效集相当于模拟试卷中的题目(用来找寻最佳学习方法),测试集相当于真实的考试题目。当出现过拟合时,训练集的效果好,测试集的效果差,相当于把训练集中的数据都记住了,但没有真正学到东西,考试时题目稍有变化就抓瞎了。
2.3 多项式回归
如果不符合线性回归,那么不管怎么训练效果都会很差。可以考虑多项式回归,但是模型的复杂度不能一昧地提高,高阶次函数的引入会带来输入的轻微变化,导致输出迅速增大,引起震荡。另一方面,当函数的阶次过高时,拟合曲线可能会经过训练样本中所有的点,同时把噪声学到了,导致过拟合。
2.4 线性回归的高级技巧
2.4.1 特征敏感性研究
在训练数据足够多的前提下,可以增加一个满足正态分布的随机输入维度,训练后的结果该输入维度的参数应该接近于0.
2.4.2 损失函数的选择
要求损失函数的导数是存在的
第三章 逻辑回归(上)
相较于线性回归输出一个 ( − ∞ , + ∞ ) (-\infty, +\infty) (−∞,+∞)范围的预测值,逻辑回归输出 [ 0 , 1 ] [0,1] [0,1]的分类概率。
利用sigmoid函数 f ( d ) = 1 1 + e − d f(d)=\cfrac{1}{1+e^{-d}} f(d)=1+e−d1来对输出进行改造,令 y ′ = 1 1 + e − w x − w 0 y^{'}=\cfrac{1}{1+e^{-wx-w_0}} y′=1+e−wx−w01
上述模型就是逻辑回归(Logistic Regression,LR),即加载逻辑函数的线性回归。在这里,d 实际上是一个线性回归,输出概率 y ′ y^{'} y′ 随着 d 的增大而增大且趋近于1;反之, y ′ y^{'} y′随着 d 的减小而减小且趋近于0。这样得到的就是一个二分类模型。
对于多分类问题(每个种类互斥,每个输入只能对应一个种类,区别于多标签分类),一个简单的想法是,我们可以使用多个二分类器,取 k 个分类模型中输出值最大的模型所对应的类别作为多分类结果,不必满足 ∑ y i = 1 \sum y_i = 1 ∑yi=1。
或者每一个种类输出一个 ( − ∞ , + ∞ ) (-\infty, +\infty) (−∞,+∞)范围的预测值 d i d_i di,利用softmax函数有: y k = s o f t m a x ( k , d 1 , ⋯ , d n ) = e d k ∑ i = 1 n e d i y_k=softmax(k,d_1,\cdots,d_n)=\cfrac{e^{d_k}}{\sum^n_{i=1}e^{d_i}} yk=softmax(k,d1,⋯,dn)=∑i=1nediedk,这样得到的结果可以满足 ∑ y i = 1 \sum y_i = 1 ∑yi=1。
我们规定 s o f t m a x ( [ d 1 d 2 ⋮ d V ] ) = 1 ∑ i = 1 V e d i [ e d 1 e d 2 ⋮ e d V ] softmax\left(\left[\begin{matrix}d_1\\ d_2\\ \vdots \\ d_V\end{matrix}\right]\right)=\cfrac{1}{\sum_{i=1}^Ve^{d_i}}\left[\begin{matrix}e^{d_1}\\ e^{d_2}\\ \vdots \\ e^{d_V}\end{matrix}\right] softmax d1d2⋮dV =∑i=1Vedi1 ed1ed2⋮edV
3.1 交叉熵和KL距离
3.1.1 KL距离
在线性回归中,误差函数MSE其实是表示预测值与真实值之间的欧氏距离。然而,欧氏距离并不适合用来度量概率之间的差异。在概率计算中,一般采用KL(Kullback-Leibler)距离来度量不同概率分布之间的差异。在计算离散概率时,KL距离的计算公式如下:
K L ( P , Q ) = ∑ y ∈ Y P ( y ) l o g P ( y ) Q ( y ) KL(P,Q)=\underset{y\in Y}{\sum} P(y)log\cfrac{P(y)}{Q(y)} KL(P,Q)=y∈Y∑P(y)logQ(y)P(y)
其中 Y Y Y表示概率取值范围,例如投骰子时 Y = { 1 , 2 , 3 , 4 , 5 , 6 } Y=\{1,2,3,4,5,6\} Y={1,2,3,4,5,6}。且概率一个满足 ∑ y ∈ Y P ( y ) = 1 ; ∑ y ∈ Y Q ( y ) = 1 \underset{y\in Y}{\sum}P(y)=1;\underset{y\in Y}{\sum}Q(y)=1 y∈Y∑P(y)=1;y∈Y∑Q(y)=1.
对于连续型概率,可以把 ∑ \sum ∑ 替换成 ∫ \int ∫,把 P 和 Q 替换成概率密度。
概率分布的差异越大,KL距离就越大。并且并不满足交换律 K L ( P , Q ) ≠ K L ( Q , P ) KL(P,Q)\neq KL(Q,P) KL(P,Q)=KL(Q,P)
在二分类当中,因为只有两个类别,所以KL距离可以表示成:
K L ( y i , y i ′ ) = y i log y i y i ′ + ( 1 − y i ) log 1 − y i 1 − y i ′ = y i ( log y i − log y i ′ ) + ( 1 − y i ) ( log ( 1 − y i ) − log ( 1 − y i ′ ) ) KL(y_i,y_i^{'})=y_i\log\cfrac{y_i}{y_i^{'}}+(1-y_i)\log\cfrac{1-y_i}{1-y_i^{'}}=y_i(\log y_i-\log y_i^{'})+(1-y_i)(\log(1-y_i)-\log(1-y_i^{'})) KL(yi,yi′)=yilogyi′yi+(1−yi)log1−yi′1−yi=yi(logyi−logyi′)+(1−yi)(log(1−yi)−log(1−yi′))
训练过程中我们可以将常数 y i log y i + ( 1 − y i ) log ( 1 − y i ) y_i\log y_i+(1-y_i)\log(1-y_i) yilogyi+(1−yi)log(1−yi)忽略掉,因此我们推导出了二分类的交叉熵损失函数 L o s s = − y i log y i ′ − ( 1 − y i ) log ( 1 − y i ′ ) Loss=-y_i\log y_i^{'}-(1-y_i)\log (1-y_i^{'}) Loss=−yilogyi′−(1−yi)log(1−yi′)
实际上可以同理推导出n个种类的多分类的交叉熵损失函数为 L = ∑ j ∈ D L j \mathcal{L}=\sum_{j\in D}\mathcal{L}_j L=∑j∈DLj而 L j = − ∑ i = 1 n y i log y i ′ \mathcal{L}_j=-\sum^n_{i=1} y_i\log y_i^{'} Lj=−∑i=1nyilogyi′,训练中 y i y_i yi是该样本是否为该分类取值0或1,而 y i ′ y_i^{'} yi′为预测值取值 [ 0 , 1 ] [0,1] [0,1]。(虽然 L j \mathcal{L}_j Lj没有极小值,但是 L \mathcal{L} L可能有极小值)
3.1.2 梯度下降法
因为逻辑回归就是在线性回归上套了一层逻辑函数,所以逻辑回归是一个复合函数。对复合函数求导,可以采用链式法则。
例如在上面的二分类例子 L o s s = − y i log y i ′ − ( 1 − y i ) log ( 1 − y i ′ ) 其中 y i ′ = s i g m o i d ( d i ) ; d i = w x i + w 0 Loss=-y_i\log y_i^{'}-(1-y_i)\log (1-y_i^{'})其中y_i^{'}=sigmoid(d_i);d_i=wx_i+w_0 Loss=−yilogyi′−(1−yi)log(1−yi′)其中yi′=sigmoid(di);di=wxi+w0中我们就可以使用链式法则计算: ∂ L o s s ∂ w = ∂ L o s s ∂ y i ′ ∂ y i ′ ∂ d i ∂ d i ∂ w \cfrac{\partial Loss}{\partial w}=\cfrac{\partial Loss}{\partial y_i^{'}}\cfrac{\partial y_i^{'}}{\partial d_i}\cfrac{\partial d_i}{\partial w} ∂w∂Loss=∂yi′∂Loss∂di∂yi′∂w∂di
迭代更新直到指定轮数或者损失函数足够小,参数的更新依旧是:
w → w − μ ∂ L o s s ∂ w w\rightarrow w-\mu \cfrac{\partial Loss}{\partial w} w→w−μ∂w∂Loss
w 0 → w 0 − μ ∂ L o s s ∂ w 0 w_0\rightarrow w_0-\mu \cfrac{\partial Loss}{\partial w_0} w0→w0−μ∂w0∂Loss
3.1.3 上采样和下采样
从训练阶段到预测阶段,样本不平衡都会给模型带来负面影响。(在一个简化的场景里想象,所有点都将分类线朝远离它的方向推,如果样本不平衡,则分类线会里某类样本更远,离其它更近甚至导致误分类)
上采样技术:复制P类样本,最终使P类和N类样本的数量相同。
下采样技术:随机抽取部分N类样本作为训练样本,使N类和P类样本的数量大致相同。
第三章 逻辑回归(下)
3.2 线性不可分及其解决方案
如这种情况: Δ ⋅ ⋅ Δ \begin{matrix}\Delta &\cdot\\\cdot &\Delta\end{matrix} Δ⋅⋅Δ无论怎么划直线都无法将三角形和点分开来。这就是线性不可分问题。训练中表现在训练时损失函数总是一个较大的值上(因为总是有错误的分类点,此问题称为异或问题)
为了解决此问题,可以对特征进行扩充。例如使用特征交叉将 ( x , y ) (x,y) (x,y)扩充成 ( x , y , x y ) (x,y,xy) (x,y,xy)
3.3 L1正则和L2正则
逻辑回归的几何含义就是在平面上找到一条分类线 w T x + w 0 = 0 w^T x+w_0=0 wTx+w0=0。值得注意的是,平面上的同一条直线其实可以由无数组方程来表示。例如,下面两个方程对应的是同一条直线。
0.6 x 1 + 0.4 x 2 + 0.2 = 0 0.6x_1+0.4x_2+0.2=0 0.6x1+0.4x2+0.2=0
6 x 1 + 4 x 2 + 2 = 0 6x_1+4x_2+2=0 6x1+4x2+2=0
虽然代表同一条直线,但是带入相同的点 ( 1 , 1 ) (1,1) (1,1),得到的值却不一样,将数据点$ (1,1)$ 代入第一个方程,可得 y ′ = 1 / ( 1 + e − ( 0.6 + 0.4 + 0.2 ) ) ≈ 0.77 y^{'}=1/(1+e^{-(0.6+0.4+0.2)} )≈0.77 y′=1/(1+e−(0.6+0.4+0.2))≈0.77;将数据点 (1,1) 代入第二个方程,可得 y ′ = 1 / ( 1 + e − ( 6 + 4 + 2 ) ) ≈ 1.000 y^{'}=1/(1+e^{-(6+4+2)} )≈1.000 y′=1/(1+e−(6+4+2))≈1.000。
一般来说,我们不希望 w 过大。w 过大主要有以下三个缺点。
-
w 过大会放大 d = w T x + w 0 d=w^T x+w_0 d=wTx+w0(d 趋近于非常大的正数或非常小的负数),这样逻辑回归的预测值将趋近于0或1,模型的输出结果过“硬”,区分度不高。 y ′ y^{'} y′ 挤在0或1附近,几乎没有区分度,从而难以选取分类阈值 θ。
-
w 过大会使逻辑回归进入饱和区域,即 ∂ L o s s ∂ w ≈ 0 \cfrac{∂Loss}{∂w}≈0 ∂w∂Loss≈0,从而使学习变得困难。(因为二分类 w w w大即很坚定的认为样本属于某一类,如果刚好线性可分会导致 ∂ L o s s ∂ w → 0 \cfrac{∂Loss}{∂w} \rightarrow 0 ∂w∂Loss→0且 w w w会一直朝变大的方向)
-
x 的任何轻微变化都会通过乘以 w 而放大。这对输出的影响很大,将导致模型不稳定。
我们可以通过给损失函数增加正则项 λ R e g u l a r i z a t i o n ( w ) λRegularization(w) λRegularization(w)来解决 w w w过大的问题: L ′ = L + λ R e g u l a r i z a t i o n ( w ) \mathcal{L}^{'}=\mathcal{L}+λRegularization(w) L′=L+λRegularization(w)
λ λ λ 是一个超参数( λ > 0 λ>0 λ>0),用于衡量模型对 w w w 大小的在意程度。 λ λ λ 越大,模型越对 w w w 的减小越在意,对分类效果的重视程度越低。 R e g u l a r i z a t i o n ( w ) Regularization(w) Regularization(w) 称为正则项,主要有两种计算方式,需要注意的是,无论是L1正则还是L2正则,都不包含 w 0 w_0 w0 项,因为 w 0 w_0 w0 项不会对输入 x x x 产生影响。具体如下:
- L1正则: R e g u l a r i z a t i o n ( w ) = ∣ w ∣ = ∣ w 1 ∣ + ∣ w 2 ∣ + ⋯ + ∣ w m ∣ Regularization(w)=|w|=|w_1 |+|w_2 |+⋯+|w_m | Regularization(w)=∣w∣=∣w1∣+∣w2∣+⋯+∣wm∣
- L2正则: R e g u l a r i z a t i o n ( w ) = ‖ w ‖ = w 1 2 + w 2 2 + ⋯ + w m 2 Regularization(w)=‖w‖=\sqrt{w_1^2+w_2^2+⋯+w_m^2 } Regularization(w)=‖w‖=w12+w22+⋯+wm2
正则的必要性:当参数可以将训练样本线性可分时(所有训练集都对), w w w会越来越大,因为预测结果越硬( w w w越大, y y y越接近 0 0 0和 1 1 1) L o s s Loss Loss越小。
因此,当我们遇到一个分类任务时,要先判断它是否为平滑任务(x 的任何轻微变化都会通过乘以 w 而放大)。如果是平滑任务,就可以放心大胆地使用正则项,根据经验和数据量酌情设置 λ。如果是非平滑任务,那么连机器学习是否适用都有待商榷。
3.4 分类模型的评价标准
在二分类任务中,两个类别为P(positive)和N(negative):
-
TP 表示真实标签为P、模型预测为P类的样本数量。
-
FP (假阳)表示真实标签为N、模型预测为P类的样本数量。
-
FN (假阴)表示真实标签为P、模型预测为N类的样本数量。
-
TN 表示真实标签为N、模型预测为N类的样本数量。
显然有总样本数: M = T P + F P + T N + F N M=TP+FP+TN+FN M=TP+FP+TN+FN,那么正确率就是 a c c = T P + T N M acc=\cfrac{TP+TN}{M} acc=MTP+TN(正确率就是有多少样本的预测结果和真实结果相同)。
**(注意区分准确率与正确率)**与正确率不同的是为了克服测试样本数量不平衡时重要信息被隐藏的问题,准确率和召回率是一个整体指标,它们都是针对具体一类(P类或N类)的预测情况进行评测的
-
准确率就是 T P T P + F P \cfrac{TP}{TP+FP} TP+FPTP,即预测为P的里面有多少是P。准确率高,说明模型的误判少。
-
召回率就是 T P T P + F N \cfrac{TP}{TP+FN} TP+FNTP,即是P的里面有多少被预测为P。召回率高,说明模型的漏判少。
然而阈值的变化会影响预测结果,进而引起指标的变化。因此,这三个指标不是完全客观的。因此常使用**ROC曲线(Receiver Operating Characteristic Curve,接受者操作特性曲线)和AUC(Area Under Curve,指ROC曲线下方的面积)**对分类模型进行评测。
AUC: 在二分类问题中,我们令有 M P MP MP个样本属于 P P P类,有 M N MN MN个样本属于 N N N类,对每个样本计算得分,我们进行 M P × M N MP\times MN MP×MN次比较,并且希望 P P P类的得分(应该接近1)都高于 N N N类(应该接近0),令H为这么多次比较中 P P P大于 N N N的次数,令 A U C = H M P × M N AUC=\cfrac{H}{MP\times MN} AUC=MP×MNH.
如果所有P类的模型得分均高于所有N类的模型得分,那么 H = M P × M N H=MP×MN H=MP×MN, 即 A U C = 1 AUC=1 AUC=1。此时,我们认为模型是非常好的,因为它可以将预测结果为P类和N类的得分完美地分开。如果 A U C = 0.5 AUC=0.5 AUC=0.5那模型就非常差了,近似于随机猜。(AUC的好处是和阈值无关)
ROC: 在二分类任务中取阈值 θ \theta θ,在 M P MP MP个 P P P类样本中,预测出 m m m个 P P P类样本,所以 m m m越大结果越准确;在 M N MN MN个 N N N类样本中,预测出 n n n个 P P P类样本,所以 n n n越大结果越差。画一个坐标系,横坐标为 n / M N n/MN n/MN,纵坐标为 m / M P m/MP m/MP,每个具体的阈值唯一确定 ( m , n ) (m,n) (m,n)。
∫ 0 1 R O C ( x ) d x = A U C \int_0^1 ROC(x)dx=AUC ∫01ROC(x)dx=AUC 即ROC曲线下方的面积等于AUC(不做证明),我们可以通过ROC曲线来找到一个较为平衡的点使得 m m m足够大而 n n n不够大。
3.5 逻辑回归的特征提升技巧
3.5.1 特征归一化
归一化即把把各维度的特征归一到同一个数量级,计算出每个维度的标准差 σ i \sigma_i σi,令 x i ′ = x i σ i x_i^{'}=\cfrac{x_i}{\sigma_i} xi′=σixi即可以归一化。这样可以避免Loss对不同维度敏感度不同导致的参数震荡,加快了梯度下降迭代收敛速率。
3.6 深入理解损失函数和逻辑函数
在面试人工智能相关岗位时,我们经常会被面试官问一个问题:为什么逻辑回归不能像线性回归一样使用MSE作为损失函数呢?主要原因有以下两个:
- 若将MSE作为逻辑回归的损失函数: L = 1 N ∑ i = 1 N ( y i ′ − y i ) 2 \mathcal{L}=\frac{1}{N}\sum_{i=1}^N(y_i^{'}-y_i)^2 L=N1∑i=1N(yi′−yi)2时,即有 ∂ L ∂ w = 2 N ∑ i = 1 N [ ( y i ′ − y i ) y i ′ ( 1 − y i ′ ) x i ] \cfrac{\partial \mathcal{L}}{\partial w}=\frac{2}{N}\sum_{i=1}^N[(y_i^{'}-y_i)y_i^{'}(1-y_i^{'})x_i] ∂w∂L=N2∑i=1N[(yi′−yi)yi′(1−yi′)xi],注意到这里无论 y i ′ y_i^{'} yi′被预测为趋于0或者1(无论预测对错)都会导致 y i ′ ( 1 − y i ′ ) y_i^{'}(1-y_i^{'}) yi′(1−yi′)非常接近0,导致导数值非常小,导致 w w w更新慢,学习效率低。
- w-MSE 曲线存在局部极小值。w 落在局部最小位置后就不会再更新了,但此时 Loss 仍比较大,模型效果不佳,将发生欠拟合。
那为什么我们要使用KL距离呢,因为KL距离等价于最大似然估计。
为什么使用sigmoid作为逻辑函数,因为其是假设数据符合正态分布,然后使用贝叶斯定理推导出来的。 这也从侧面印证了样本平衡的重要性,否则不满足逻辑函数的前提条件。
第四章 因子分解模型
4.1 基本原理和特征交叉
4.1.1 基本原理
然而,在真实的场景中,直接使用特征交叉会面临以下困难。
一般来说,特征维度有成千上万维,如果人工进行特征交叉,是不太容易把所有需要的交叉特征都找出来的,并且很多交叉特征并不是我们能想象出来的。此外,直接交叉也无法通过学习相似特征。
因此有间接特征交叉,令 w 0 w_0 w0是全局偏差, w i w_i wi是第 i i i个特征的权重, x i x_i xi是第 i i i个特征的值, v i v_i vi和 v j v_j vj是特征 i i i和 j j j的隐向量(隐向量可以慢慢学习出来)。则FM模型的数学表达式为:
y ^ ( x ) = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n < v i , v j > x i x j \hat{y}(x)=w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^n\sum_{j=i+1}^n<v_i,v_j>x_ix_j y^(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑n<vi,vj>xixj
虽然此时还是 O ( n 2 ) O(n^2) O(n2)的,但是我们可以变形后一项,使得其变为 O ( k n ) O(kn) O(kn)其中 k k k为隐向量维度(一般情况下 k < < n k<<n k<<n,因此可以认为是 O ( n ) O(n) O(n)),证明如下:
∑ i = 1 n ∑ j = i + 1 n < v i , v j > x i x j = 1 2 ∑ i = 1 n ∑ j = 1 n < v i , v j > x i x j − 1 2 ∑ i = 1 n < v i , v j > x i 2 = 1 2 ( ∑ i = 1 n ∑ j = 1 n ∑ f = 1 k v i , f v j , f x i x j − ∑ i = 1 n ∑ f = 1 k v i , f 2 x i 2 ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 n v i , f x i ) ( ∑ j = 1 n v j , f x j ) − ∑ i = 1 n v i , f 2 x i 2 ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 n v i , f x i ) 2 − ∑ i = 1 n v i , f 2 x i 2 ) \begin{equation}\begin{split}&\sum_{i=1}^n\sum_{j=i+1}^n<v_i,v_j>x_ix_j\\&=\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n<v_i,v_j>x_ix_j-\frac{1}{2}\sum_{i=1}^n<v_i,v_j>x_i^2 \\&=\frac{1}{2}(\sum_{i=1}^n\sum_{j=1}^n\sum_{f=1}^kv_{i,f}v_{j,f}x_ix_j-\sum_{i=1}^n\sum_{f=1}^kv_{i,f}^2x_i^2) \\&=\frac{1}{2}\sum_{f=1}^k((\sum_{i=1}^nv_{i,f}x_i)(\sum_{j=1}^nv_{j,f}x_j)-\sum_{i=1}^nv_{i,f}^2x_i^2) \\&=\frac{1}{2}\sum_{f=1}^k((\sum_{i=1}^nv_{i,f}x_i)^2-\sum_{i=1}^nv_{i,f}^2x_i^2) \end{split}\end{equation} i=1∑nj=i+1∑n<vi,vj>xixj=21i=1∑nj=1∑n<vi,vj>xixj−21i=1∑n<vi,vj>xi2=21(i=1∑nj=1∑nf=1∑kvi,fvj,fxixj−i=1∑nf=1∑kvi,f2xi2)=21f=1∑k((i=1∑nvi,fxi)(j=1∑nvj,fxj)−i=1∑nvi,f2xi2)=21f=1∑k((i=1∑nvi,fxi)2−i=1∑nvi,f2xi2)
4.1.2 参数学习
还是利用随机梯度下降的方法进行参数学习,但是学习的参数包含了 w , v i , f w,v_{i,f} w,vi,f。其余与先前一致。
4.2 因子分解模型和矩阵分解
就是一个 N × M N\times M N×M的矩阵能够分解为 N × K N\times K N×K和 K × M K\times M K×M的矩阵的积。矩阵分解在理论上是可行的,但实际的应用并不多,其原因在于计算量巨大。例如,有2000万个用户、200万个商品,那么矩阵中就有40万亿个元素——很难分解。
第五章 经典分类模型
5.1 支持向量机
对于二分类,肯定希望所有点离分界线越远越好:
我们令 P 为 1 , N 为 − 1 P为1,N为-1 P为1,N为−1。希望P的内部点 w x + w 0 ≥ 1 wx+w_0\geq1 wx+w0≥1,N的内部点 w x + w 0 ≤ − 1 wx+w_0\leq-1 wx+w0≤−1。
那么可以简化为 y ( w x + w 0 ) ≥ 1 y(wx+w_0)\geq1 y(wx+w0)≥1(为什么以 1 为阈值,在介绍正则时我们解释过代表相同直线的方程 w w w的大小不同而带入得到的是不同大小的值)
不满足上式的数据点称为误差点。因此,可以进一步将数据点分成三类,即内部点、边界点、误差点。误差点有两种:一种是正确误差点,它的分类正确,但位于边界点外(分类正确,但到分类线的距离小于1);另一种是错误误差点,它不仅位于边界点外,而且分类错误。
内部点: y ( w x + w 0 ) > 1 y(w x+w_0 )>1 y(wx+w0)>1,即 ε = 0 ε=0 ε=0。
边界点: y ( w x + w 0 ) = 1 y(w x+w_0 )=1 y(wx+w0)=1,即 ε = 0 ε=0 ε=0。
正确误差点: y ( w x + w 0 ) = 1 − ε y(w x+w_0 )=1-ε y(wx+w0)=1−ε,且 1 > ε > 0 1>ε>0 1>ε>0。
错误误差点: y ( w x + w 0 ) = 1 − ε y(w x+w_0 )=1-ε y(wx+w0)=1−ε,且 ε ≥ 1 ε ≥ 1 ε≥1。
可以看出,ε 越小,分类效果就越好。因此,最小化 ε 也成为优化目标之一。
综上考虑,我们的优化目标为:
m i n ( w ⋅ w + C ∑ i = 1 N ( ϵ ( i ) ) ) min(w\cdot w + C\sum_{i=1}^N(\epsilon(i))) min(w⋅w+Ci=1∑N(ϵ(i)))
C 为超参数,表示我们对“分类正确”的重视程度。
在这里,我们一般不使用梯度下降法,而使用成熟的拉格朗日乘子法。其中的数学计算较为复杂,感兴趣的读者可自行查阅相关资料。
训练好之后预测就是: w T x + w 0 > 0 w^Tx+w_0>0 wTx+w0>0则为1否则为-1。
5.1.1 支持向量机和逻辑回归的比较
从另一个角度看,在进行模型训练时,逻辑回归需要使用全部数据样本来确定分类线。SVM在“看”过所有样本并从中挑出边界点后,只需要利用边界点来确定分类线,而不必关心那些对分类作用不大的内部点。此外,因为SVM只关注边界点,所以它非常鲁棒,当样本中存在异常点(远离其他点的数据点)时,异常点会对逻辑回归造成严重影响,但不会影响SVM。
5.2 核方法
5.2.1 核函数
通过第3章的讨论我们已经知道,升维可以解决线性不可分问题。例如,把输入特征 x 的每个维度和其他维度(包括其自身)进行交叉,使特征从3维升至9维。通过交叉,逻辑回归具备了解决线性不可分问题的能力。然而,其代价是运算量过大。如果原始特征的维度为 m,那么二阶交叉的维度为 C m 2 C_m^2 Cm2
通过对两个低维向量进行数学运算,得到它们投影至高维空间时向量的内积的方法,叫作核方法,相应的算法叫作核函数。
对以下两个向量进行相同的升维操作。
x = [ x 1 , x 2 , x 3 ] T → x ′ = [ x 1 x 1 , x 1 x 2 , x 1 x 3 , x 2 x 1 , x 2 x 2 , x 2 x 3 , x 3 x 1 , x 3 x 2 , x 3 x 3 ] T x=[x_1,x_2,x_3 ]^T→x^{'}=[x_1 x_1,x_1 x_2,x_1 x_3,x_2 x_1,x_2 x_2,x_2 x_3,x_3 x_1,x_3 x_2,x_3 x_3 ]^T x=[x1,x2,x3]T→x′=[x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3]T
z = [ z 1 , z 2 , z 3 ] T → z ′ = [ z 1 z 1 , z 1 z 2 , z 1 z 3 , z 2 z 1 , z 2 z 2 , z 2 z 3 , z 3 z 1 , z 3 z 2 , z 3 z 3 ] T z=[z_1,z_2,z_3 ]^T→z^{'}=[z_1 z_1,z_1 z_2,z_1 z_3,z_2 z_1,z_2 z_2,z_2 z_3,z_3 z_1,z_3 z_2,z_3 z_3 ]^T z=[z1,z2,z3]T→z′=[z1z1,z1z2,z1z3,z2z1,z2z2,z2z3,z3z1,z3z2,z3z3]T
有 < x ′ , z ′ > = ( < x , z > ) 2 <x^{'},z^{'}>=(<x,z>)^2 <x′,z′>=(<x,z>)2,因此不需要真正进行高运算量的升维操作,规定核函数即可获得其内积。
常见核函数:
- 多项式核函数: K ( x , z ) = ( α < x , z > + c ) d K(x,z)=(\alpha <x,z>+c)^d K(x,z)=(α<x,z>+c)d
- 高斯核函数,相当于向量升维至无穷维后的内积: K ( x , z ) = e − ∣ ∣ x − z ∣ ∣ / ( 2 σ 2 ) K(x,z)=e^{-||x-z||/(2\sigma^2)} K(x,z)=e−∣∣x−z∣∣/(2σ2)
5.3 朴素贝叶斯
5.3.1 朴素贝叶斯原理
根据贝叶斯定理和上述独立性假设,有如下推理。
P ( y = 1 │ x ) = ( P ( y = 1 ) P ( x ∣ y = 1 ) ) / ( P ( x ) ) = ( P ( y = 1 ) P ( x 1 ∣ y = 1 ) P ( x 2 ∣ y = 1 ) P ( x 3 ∣ y = 1 ) ) / ( P ( x ) ) P(y=1│x)=(P(y=1)P(x|y=1))/(P(x))=(P(y=1)P(x_1 |y=1)P(x_2 |y=1)P(x_3 |y=1))/(P(x)) P(y=1│x)=(P(y=1)P(x∣y=1))/(P(x))=(P(y=1)P(x1∣y=1)P(x2∣y=1)P(x3∣y=1))/(P(x))
P ( y = 0 │ x ) = ( P ( y = 0 ) P ( x ∣ y = 1 ) ) / ( P ( x ) ) = ( P ( y = 0 ) P ( x 1 ∣ y = 0 ) P ( x 2 ∣ y = 0 ) P ( x 3 ∣ y = 0 ) ) / ( P ( x ) ) P(y=0│x)=(P(y=0)P(x|y=1))/(P(x))=(P(y=0)P(x_1 |y=0)P(x_2 |y=0)P(x_3 |y=0))/(P(x)) P(y=0│x)=(P(y=0)P(x∣y=1))/(P(x))=(P(y=0)P(x1∣y=0)P(x2∣y=0)P(x3∣y=0))/(P(x))
可以通过比较 P ( y = 1 │ x ) P(y=1│x) P(y=1│x) 和 P ( y = 0 │ x ) P(y=0│x) P(y=0│x) 的大小来确定预测的类别,如下式所示。
d = P ( y = 1 │ x ) P ( y = 0 │ x ) = ( P ( x 1 ∣ y = 1 ) P ( x 2 ∣ y = 1 ) P ( x 3 ∣ y = 1 ) P ( y = 1 ) ) ( P ( x 1 ∣ y = 0 ) P ( x 2 ∣ y = 0 ) P ( x 3 ∣ y = 0 ) P ( y = 0 ) ) d=\cfrac{P(y=1│x)}{P(y=0│x)}=\cfrac{(P(x_1 |y=1)P(x_2 |y=1)P(x_3 |y=1)P(y=1))}{(P(x_1 |y=0)P(x_2 |y=0)P(x_3 |y=0)P(y=0))} d=P(y=0│x)P(y=1│x)=(P(x1∣y=0)P(x2∣y=0)P(x3∣y=0)P(y=0))(P(x1∣y=1)P(x2∣y=1)P(x3∣y=1)P(y=1))
当 d>1 时, P ( y = 1 │ x ) > P ( y = 0 │ x ) P(y=1│x)>P(y=0│x) P(y=1│x)>P(y=0│x),x 属于类别 y=1。
当 d<1 时, P ( y = 1 │ x ) < P ( y = 0 │ x ) P(y=1│x)<P(y=0│x) P(y=1│x)<P(y=0│x),x 属于类别 y=0。
如果$ x_2$ 缺失,就直接忽略 P ( x 2 ∣ y = 1 ) 和 P ( x 2 ∣ y = 0 ) P(x_2 |y=1) 和 P(x_2 |y=0) P(x2∣y=1)和P(x2∣y=0),判别公式变为
d = ( P ( y = 1 │ x ) ) / ( P ( y = 0 │ x ) ) = P ( x 1 ∣ y = 1 ) P ( x 3 ∣ y = 1 ) P ( y = 1 ) P ( x 1 ∣ y = 0 ) P ( x 3 ∣ y = 0 ) P ( y = 0 ) d=(P(y=1│x))/(P(y=0│x) )=\cfrac{P(x_1 |y=1)P(x_3 |y=1)P(y=1)}{P(x_1 |y=0)P(x_3 |y=0)P(y=0)} d=(P(y=1│x))/(P(y=0│x))=P(x1∣y=0)P(x3∣y=0)P(y=0)P(x1∣y=1)P(x3∣y=1)P(y=1)
上述分类算法叫作朴素贝叶斯算法。
5.3.2 朴素贝叶斯的参数估计
通过数量比例来估计概率,需要的样本数量相对比较大,如果样本数量不足,就容易出现较大的偏差(例如,在投硬币时,只投1次,出现的是正面,于是估计出现正面的概率为100%,出现反面的概率为0,而这显然是错误的)。因此,可以对上式进行如下改进。
P ( x 1 = 本科│ y = 1 ) = ( c o u n t ( x 1 = 本科 , y = 1 ) + n 1 / c 1 ) / ( c o u n t ( y = 1 ) + n 1 ) P(x_1=本科│y=1)=(count(x_1=本科,y=1)+n_1/c_1 )/(count(y=1)+n_1 ) P(x1=本科│y=1)=(count(x1=本科,y=1)+n1/c1)/(count(y=1)+n1)
即给统计信息一个先验信息, n i n_i ni 由用户自行定义, c i c_i ci 为 x i x_i xi 可取值的数量。当需要估计连续变量 x 2 x_2 x2时,显然无法通过上面的频率来估计。一般认为 P ( x 2 │ y = 1 ) P(x_2│y=1) P(x2│y=1) 符合正态分布。正态分布只有两个参数,即均值 μ μ μ 和方差 σ σ σ。所以,可先估计 P ( x 2 │ y = 1 ) P(x_2│y=1) P(x2│y=1) 的均值 μ 2 μ_2 μ2 和方差 σ 2 σ_2 σ2。
5.4 维数灾难
当特征维度较少时,随着特征维度的增加,分类效果稳步提升。但是,当特征维度增加到一定程度时,继续增加特征维度反而会使分类效果降低。这种现象称为维数灾难。
-
当特征维度为 f f f,训练样本数量为 N N N 时,数据密度为 ρ f = N / 2 f ρ_f=N/2^f ρf=N/2f ,通过上式可以看出,当数据量不变时,随着维度的增加,数据密度以指数级降低,单位空间中的数据点变少,极易发生过拟合,造成维数灾难。因此,在增加数据维度 f f f 时,为了保证 ρ f ρ_f ρf 不变,训练样本数量 N 应成指数级增长。
-
维度过高还会带来数据分布不均匀的问题。
-
维度过高还会导致一个问题,就是欧氏距离失效。这将导致欧氏距离不再具有区分能力。
5.5 经验风险、期望风险和结构风险
经验风险 R e m p ( f ) R_{emp}(f) Remp(f)是指学习完成后模型 f f f 在训练样本上的平均 L o s s Loss Loss
期望风险 R e x p ( f ) R_{exp}(f) Rexp(f)所有可能样本下的平均 L o s s Loss Loss,由于在实际应用中无法获得所有的样本,所以 R e x p ( f ) R_{exp} (f) Rexp(f) 只是一个概念,无法实际计算出来。不过,根据大数定律,当数据量 N 足够大时,经验风险近似于期望风险。
因为我们没法获得所有的可能样本,所以引入结构风险来近似期望风险。
结构风险的第一项仍然为经验风险 R e m p ( f ) R_{emp}(f) Remp(f),第二项 λ J ( f ) λJ(f) λJ(f) 是模型复杂度。 R e m p ( f ) + λ J ( f ) ≈ R e x p ( f ) R_{emp} (f)+ λJ(f)≈R_{exp}(f) Remp(f)+λJ(f)≈Rexp(f) 的意思是经验风险 R e m p ( f ) R_{emp}(f) Remp(f) 和期望风险 R e x p ( f ) R_{exp} (f) Rexp(f) 的差异与模型的复杂度 J ( f ) J(f) J(f) 成正相关。
最小化结构风险和奥卡姆剃刀定律在降低模型复杂度方面的目标是一致的,它们都希望模型越简单越好。
第六章 无监督学习
无监督学习模型,这些模型不需要使用标注数据(也就是说,只需要 x,不需要 y),而是利用数据自身的分布特点、相对位置来完成分类。这类模型称为无监督学习(y 可以理解成监督信号)或自组织模型。
6.1 K-Means聚类
6.1.1 K-Means算法的基本原理
这里使用了一种朴素的思想:如果两个数据点的距离比较近,那么它们的类别就应该是一样的。
在训练数据中随机挑选 K=3 个点作为各个类簇的质心,如图6-3所示。对剩下的数据点,分别计算它们和这3个类簇的质心之间的距离。在这里采用欧氏距离,每个点都将归入与它距离最近的类别。
对每个类别来说,一开始质心都是随机挑选的。现在,每个类别都有了一堆数据。对每一类数据的所有点求平均值,将平均值作为新的质心,会产生 K=3 个新的质心。(这个新产生的质心可能不在原来的样本点当中)
定义损失函数: L o s s = ∑ i = 1 k ∑ ∣ ∣ x j , μ i ∣ ∣ x j ∈ c l u s t e r i Loss=\sum_{i=1}^k\underset{x_j\in cluster_i}{\sum||x_j,\mu_i||} Loss=∑i=1kxj∈clusteri∑∣∣xj,μi∣∣
该损失函数的意义即所有数据点到其被分类到的质心的距离。因为 x j ∈ c l u s t e r i x_j\in cluster_i xj∈clusteri的出现,所以无法直接求解 ∂ L o s s ∂ μ i \cfrac{\partial Loss}{\partial \mu_i} ∂μi∂Loss。所以我们只是重复以下步骤:
- 随机选取 K K K个数据点作为 K K K个质心
- 对数据点进行分类,使训练数据中的每个样本都归入与其距离最近的质心所代表的类别。
- 根据分类结果重新计算
K
K
K个类别分别的质心,再回到第2步,直到下面三点被任意满足一条:
- 没有(或最小数目)对象被重新分配给不同的聚类。
- 没有(或最小数目)聚类中心再发生变化。
- Loss足够小。
另一个值得注意的要点是,K-Means算法是以欧氏距离为基础的。我们在5.4节讨论维数灾难时提到过,当特征维度过高时,欧氏距离就会失效。因此,在使用K-Means算法时,特征维度不宜过高。
6.1.2 改进型K-Means算法
K-Means算法对初始点比较敏感。尽管初始点是随机选取的,但选取不同的初始点会对最终的聚类结果产生影响。上述算法在数据量很大时往往不够经济,花费的时间和计算成本较高。因此,有人提出了K-Means++ 方法,在选择初始点方面对K-Means方法进行了改进,步骤如下:
- 从 N 个数据点中随机选择一个作为类的中心。初始点为 μ 1 μ_1 μ1。
- 计算各数据点到已有的聚类中心的距离,并将各样本归入与其距离最近的聚类中心所在的类别(如果只有初始的一个类别,那么所有样本都归为一个类簇)。
- 选择距离最远的数据点,将其作为新的聚类中心 μ k + 1 μ_{k+1} μk+1
- 重复第2步和第3步,直至获得 K 个聚类中心为止。然后,将这 K 个聚类中心作为初始聚类中心,重新执行前面的K-Means算法流程。
有一种情况是K-Means算法无法解决的,即数据点组成两个同心圆。其原因在于,K-Means算法基于一个假设,即在使用欧氏距离进行度量时,同一类别的数据点彼此接近,而同心圆中的数据分布显然不满足这种假设——前提条件不成立,后面的推理都会失败。
6.1.3 K-Means算法和逻辑回归的结合应用
先使用K-means将样本分类为多个聚簇,再使用逻辑回归在每个聚簇中分类。
6.2 主题模型 LDA
LDA(Latent Dirichlet Allocation)模型用于推测文档的主题分布,可以将一个文档集中每篇文档的主题以概率分布的形式给出。主题分布可以作为文档的特征,用于文本相似度计算或后续的分类任务。不同于文本分类,LDA是无监督模型,不需要标注数据,模型可以自动从文档集中推测文档所属的主题,且主题本身是通过模型学习得到的,不需要人工设定。
6.2.1 LDA模型的原理
P ( 词 ∣ 文档 ) = P (词 ∣ 主题) P (主题 ∣ 文档) P(词 | 文档)=P(词 | 主题)P(主题 | 文档) P(词∣文档)=P(词∣主题)P(主题∣文档)我们简称为: P ( w ∣ d ) = P ( w ∣ t ) ∗ P ( t ∣ d ) P(w|d)=P(w|t)∗P(t|d) P(w∣d)=P(w∣t)∗P(t∣d)
由此可以定义LDA的生成过程:
- 对每篇文档,在主题分布中抽取一个主题;(相当于从该文档的主题骰子中骰一次)
- 对抽到的主题所对应的单词分布中随机抽取一个单词;(再在骰出来的主题对应的骰子骰出来一个词)
- 重复上述过程直至遍历整篇文档中的每个单词
6.2.2 LDA模型的训练
略