机器学习
回顾线性代数
线性空间
我们称针对向量V(实数组成)和运算符+、x,有以下性质时为线性空间:
加法:$v+w \in V$,即$(V, +)$是阿贝尔群(可交换,有逆元)
缩放乘法:$\alpha \in R$且$v \in V$,有$\alpha v \in V$,且满足以下性质:
$\alpha (\beta v)=(\alpha \beta)v$($\alpha, \beta \in R; v \in V$)
$1v=v$($v \in V$)
分配律:
$(\alpha + \beta) v = \alpha v + \beta v$($\alpha, \beta \in R; v \in V$)
$\alpha (v + w) = \alpha v + \alpha w$($\alpha \in R; v, w \in V$)
$R^d$是代表由d维的实数组成的空间。
$\vec v=\left (\begin{array}{cc} v_{1} \\ v_2 \\ v_3 \end{array} \right) $
$\vec v + \vec w =\left (\begin{array}{cc} v_{1} + w_1\\ v_2 + w_2 \\ v_3 + w_3 \end{array} \right) $
$\alpha \vec v =\left (\begin{array}{cc} \alpha v_{1}\\ \alpha v_2 \\ \alpha v_3 \end{array} \right) $
矩阵的空间
数据表示为矩形
d个特征,n个观察值
3x2矩阵:
$A=\left (\begin{array}{cc} A_{11} & A_{12} \\ A_{21} & A_{22} \\ A_{31} & A_{32} \end{array} \right) $
当然,也可以视作若干个向量的向量。
矩阵加法:
$A+B=\left (\begin{array}{cc} A_{11}+B_{11} & A_{12}+B_{12} \\ A_{21}+B_{21} & A_{22}+B_{22} \\ A_{31}+B_{31} & A_{32}+B_{32} \end{array} \right) $
矩阵缩放:
$\alpha A=\left (\begin{array}{cc} \alpha A_{11} &\alpha A_{12} \\ \alpha A_{21} & \alpha A_{22} \\ \alpha A_{31} & \alpha A_{32} \end{array} \right) $
矩阵操作:
转置,整个矩阵“对折”。
向量转置:
$\vec v=\left (\begin{array}{cc} v_{1} \\ v_2 \\ v_3 \end{array} \right) $
$(\vec v )^ T = (v_1, v_2, v_3)$
向量乘法:
向量内积:
$\vec v (\vec w )^ T= (v_1, v_2, v_3) \left (\begin{array}{cc} w_{1} \\ w_2 \\ w_3 \end{array} \right) = \sum_{1}^n v_i w_i$
向量外积:
$(\vec v)^T \vec w= \left (\begin{array}{cc} v_{1} \\ v_2 \\ v_3 \end{array} \right) (w_1, w_2, w_3) = \left (\begin{array}{ccc} v_1*w_1 & v_1*w_2 & v_1*w_3 \\ v_2*w_1 & v_2*w_2 & v_2 * w_3 \\ v_3*w_1 & v_3*w_2 & v_3*w_3 \end{array} \right) $
矩阵乘法
行(第i行)*列(第j列)=一个元素(i, j)
$C_{i,j}=\sum_{k=1}^{r} A_{i, k}*B_{k, j}$
不过,我们还可以用另外一种视角看待矩阵乘法:
我们之前一直认为,矩阵乘法是向量的内积(也就是上边这种计算方法),现在我们转换一下思路:
矩阵乘法也可以是两个向量的外积:
也就是说,矩阵等于向量A1*B1,A2*B2……得到的矩阵的和。
$X=(A_1, A_2 ... A_r)$(其中$A_i$是列向量)
$Y=\left (\begin{array}{cc} B_{1} \\ B_2 \\ ... \end{array} \right)$(其中$B_i$是行向量)
$C_{i,j}=\sum_{l=1}^{k} a_{i,l}*b_{l,j}$
而,$A_l * B_l$=$(a_{i,l}*b_{l,j})$的矩阵。
然后所有的加起来就是结果。
由于:
每个l的外积直接生成覆盖整个mxn矩阵的结果,不会局部化或偏移到矩阵的某个子区域。
累加操作严格逐元素:结果矩阵C中的每个$c_{i,j}$是所有外积在位置$(i,j)$上的累加值,外积的贡献范围完全一致。
所以不会发生偏移。
赋范向量空间:
向量有长度的空间。
赋范向量空间是有范值$||·||$的向量空间,其中对于任意v,w∈V,α属于R有以下性质:
$||v+w|| \leq ||v||+||w||$
$||\alpha v||=|\alpha|||v||$
$||v||=0 \equiv v =0 $
首先,可以将矩阵的norm视作多个向量的和:
$||A||_p = (\sum_{i=1}^{n} \sum_{j=1}^{m} |A_{ji}|^{p})^{1/p}$
或者,可以想象成让某个单位向量最大的结果:
$||A||_{op}=\max_{||v||=1}||Av||$
迹(trace):
主对角线上值的和
$tr(cA+B)=c*tr(A)+tr(B)$
$tr(A^{T})=tr(A)$
$tr(ABCD)=tr(BCDA)=...$
欧几里得距离/L2范数和迹有关:
$||v||^2=v^T v=tr(v^T v)$
$||A||^2 = tr(A^T A)$($||A||^2$还可定义为$\sqrt{\lambda_{max} (A^T A)}$,其中$\lambda$是最大特征值,特征值是指,如果$A \xi = \lambda \xi$,则$\xi$是A的一个特征向量,$\lambda$是对应的特征值)
奇异值分解(singular value decomposition):
任何一个nxp的矩阵,可以分解为三个矩阵的乘积
$X=U \Sigma V^T$,其中:
$U^T U=I$,$V^T V=I$。
$\Sigma$是一个长方形矩阵,但其只在对角线上有值(奇异值)。
SVD能够决定一个矩阵是否可逆
如果可逆,其所有奇异值大于0。
orthogonal matrix(正交矩阵):是指和自己转置乘积为单位矩阵的矩阵。
即:$A^T A = A A^T = I$
此外,如果一个矩阵满足:
$A^\top A = diag(\lVert A_{\cdot 1}\rVert^2, \ldots, \lVert A_{\cdot d}\rVert^2)$,则我们称之为其具有正交列。
优化问题
从数据集中得到些什么的情况一般可以正规化为一个具体的目标,而常见情况是正规化为一个优化目标,因此要用到优化。
无约束优化
给目标函数$f: R^n \rightarrow R$,无约束优化问题的目标为最小化f。
我们有如下定义:
$x^{*} \in \arg \min_{x \in R} f(x)$是函数最小时的定义域取值。
f(x)取值最小的称为最小值
全局最小值和局部最小值
First Order Necessary Condition & Second Order Necessary Condition
第一必要条件即寻找斜率为0的点。
第二必要条件即在某个点斜率为0,且二阶导数大于0,此时为最小值点。在最小值前后,斜率会从负数变为整数,那么斜率的增长必然为正。
偏导数和全导数
First Order Necessary Condition:
如果x是一个使得函数f在连续可微的区域上取到局部最小值的点,那么$\nabla f(x)=0$
如果$\nabla f(x)==0$,那么我们称这个点为驻点。
Second Order Necessary Condition:
如果x是一个使得函数f在连续可微的区域上取到局部最小值的点,那么$\nabla f(x)=0$且$\nabla^2 f(x)$是半正定的。
半正定是指,一个矩阵$A \in R^{d*d}$,有$x^T A x \ge 0$(对于任意$x \in R^d$),那么称之为半正定。
这里求二阶导时,会得到一个矩阵,其中第一行是对x1一阶导对x1,x2的偏导;第二行是对x2二阶导对x1、x2的偏导。
注意这里求半正定的时候其实乘的是$x=\left (\begin{array}{cc} x_{1} \\ x_2 \\ ... \end{array} \right)$。
有约束优化
给一个函数f(d维),给若干限制函数$c_i, g_k$(同样d维),目标为:
$\min_{x \in R^n} f(x) s.t. c_{i}(x)=0, g_{k}(x) \geq 0$。
称所有满足限制的集合为feasible set:
$C = \{ x | c_{i}(x)=0, g_{k}(x) \geq 0\}$。
FONC和SONC在这里不再好用了。
那么,自然我们会先考虑将有约束转为无约束的,但这比较复杂。
拉格朗日函数,以及其想法:
$L(x, \lambda, \mu) = f(x) - \sum_{i=1}^m \lambda_{i} c_{i}(x) - \sum_{k=1}^{l} \mu_k g_{k}(x)$。
其中$\lambda_i (R), \mu_i (\geq 0)$称为拉格朗日乘数。
$\min_{x \in C} f(x) \geq \inf_{x \in C} L(x, \lambda, \mu) \geq \inf_{x \in R^d} L(x, \lambda, \mu) = L_{dual}(\lambda, \mu)$
因此这里就只依赖于对偶函数了,所以找对偶函数最大值。
拉格朗日函数似乎不能用于非凸问题?
如果FONC/SONC和上面的拉格朗日都不行?
数值优化
数值优化——爬山算法
坐标下降
无法确定最小值的具体值,但可以确定其坐标相对当前点的方向
$x_i^{t+1} \leftarrow \arg \min_{x_i} f(x_1^{(t)}, ..., x_i, ..., x_d^{(t)})$
即,固定其他所有坐标不变,每次只从一个维度上进行更新。
梯度下降
$x_i^{t+1} \leftarrow x_t - \eta \nabla f(x_t)$
其中$\eta$是步长。
如果步长选太大,可能不收敛
如果步长选太小,可能收敛太慢
凸优化
一个集合称为凸的,当且仅当集合内任意两点组成的线段上的点全在集合中。
$\alpha x + (1- \alpha) y \in X$
凸函数是指,有函数f,对于函数上的任意两点x,y,总满足$f(\alpha x+(1-\alpha)y) \le \alpha f(x)+(1-\alpha)f(y)$,则称函数为凸函数。
凸优化问题:
给出一个凸函数f,一个凸可行集$C$,目标为:
$\min_{x \in R^n} f(x) s.t. x \in C$。
凸函数性质:
定理:如果f是凸函数,那么每个局部最小取值$x*$也是全局最小取值。
不过需要注意,并非所有只有一个全局和局部最小取值的函数都是凸函数。
证明:(概述)假设凸函数f有局部最小值$x_{loc}$但却并非全局最小取值$x^{*}$,由于凸函数的性质,必然$f(x_{loc})$到$f(x^{*})$是单向减小的,$x_{loc}$不是局部最小值,与假设矛盾。
凸函数性质:
若有$f(x)= \sum_{i=1}^{k} \lambda_{i} f_{i}(x)$,且$f_{i}(x)$是凸函数,且$\lambda_{i} \geq 0$,则$f(x)$是凸函数。
若函数$g(x)$是对x的仿射变换($g(x)=Ax+b$,注意这里是矩阵变换),且f是关于x的凸函数,则$f(g(x))=f(Ax+b)$是凸函数。
范数都是凸函数。
此外,每个线性函数既是凸函数又是凹函数。
怎么计算斜率:能用链式法则就用链式法则。
非常常用的梯度计算公式和结论
计算斜率:
斜率在矩阵上的推广:对于函数$f: R^{n \times d} \rightarrow R$,它的导数是:
$\frac{\partial f(X)}{\partial X}=\left (\begin{array}{ccc} \frac{\partial f(X)}{\partial X_{11}} & ... & \frac{\partial f(X)}{\partial X_{n1}} \\ ... & ... & ... \\ \frac{\partial f(X)}{\partial X_{1d}} & ... & \frac{\partial f(X)}{\partial X_{nd}} \end{array} \right) \in R^{d \times n}$ (雅可比矩阵)
$\nabla f(X)=\left (\begin{array}{ccc} \frac{\partial f(X)}{\partial X_{11}} & ... & \frac{\partial f(X)}{\partial X_{1d}} \\ ... & ... & ... \\ \frac{\partial f(X)}{\partial X_{n1}} & ... & \frac{\partial f(X)}{\partial X_{nd}} \end{array} \right) \in R^{n \times d}$ (梯度矩阵,与上面的雅可比矩阵互成transpose)
Jacobian和Gradient的两个特殊性质(这里只列出了Jacobin):
若函数$f: R \rightarrow R^c$,则$\frac{\partial f(x)}{\partial x}=\left (\begin{array}{cc} \frac{\partial f_1(x)}{\partial x} \\ ... \\ \frac{\partial f_c(x)}{\partial x} \end{array} \right) \in R^{c}$
若函数$f: R^d \rightarrow R^c$,则$\frac{\partial f(x)}{\partial x}=\left (\begin{array}{ccc} \frac{\partial f_1(x)}{\partial x_{1}} & ... & \frac{\partial f_1(x)}{\partial x_{d}} \\ ... & ... & ... \\ \frac{\partial f_c(x)}{\partial x_{1}} & ... & \frac{\partial f_c(x)}{\partial x_{d}} \end{array} \right) \in R^{c \times d}$
$\frac{\partial \alpha f(x) + g(x)}{\partial x} = \alpha \frac{f(x)}{\partial x}+\frac{g(x)}{\partial x}$(线性性)
$\frac{f(g(x))}{\partial x} = \frac{f(g)}{\partial g}\frac{g(x)}{\partial x}$(链式法则)
根本上来说,这里的求导要凑出对应的项来:
求$f(x)=||\vec x||^2$的Jacobian导和梯度,其中$\vec x \in R^d$。
由于$\vec x \in R^d$,$||\vec x||^2 = \sum_{i=1}^{n} x_i^2$,因此对$x_i$的偏导为$\frac{\partial ||\vec x||^2}{\partial x_k} = \frac{partial \sum_{i=1}^{n} x_i^2}{\partial x_k}=2x_k$
根据Jacobian的求导矩阵($R^d \rightarrow R^c$,此时d=n,c=1),这里因此写为$\frac{\partial ||\vec x||^2}{\partial x} = (2x_1, 2x_2, ..., 2x_n) = 2X^T$
故梯度为$2X$。
求函数$f: R \rightarrow R^n, f(x)=a-bx, a \in R^n, b \in R^n$的Jacobian导
$f(x)=a-bx=\left (\begin{array}{c} f_1(x) \\ ... \\ f_n(x) \end{array} \right)=\left (\begin{array}{c} a_1 - b_1 x \\ ... \\ a_n - b_n x \end{array} \right)$
$\frac{\partial f(x)}{\partial x}=\left (\begin{array}{cc} \frac{\partial a_1 - b_1 x}{\partial x} \\ ... \\ \frac{a_n - b_n x}{\partial x} \end{array} \right) = \left (\begin{array}{cc} -b_1 \\ ... \\ - b_n \end{array} \right)\in R^{n}$ = -b
求函数$f: R^d \rightarrow R^n, f(x)=a-Bx, B \in R^{n \times d}$的Jacobian导
$f(x) = a-Bx = a - \sum_{i=1}^{d} R_{·i} x_{i}$(拆项,拆出x来)
$\frac{\partial f(x)}{\partial x} = \partial a - \frac{\partial Bx}{\partial x}$
对于某一个$x_i$,可以得到$\frac{\partial \sum_{i=1}^{d} B_{·i}x_{i}}{\partial x_{i}}$(对应Jacobian第i列,得到的上面的值是一样的,即f1...fn每次都一样,只是求导的不一样)
$\frac{\partial \sum_{i=1}^{d} A_{·i}x_{i}}{\partial x_{i}} = B{·i}$
于是同样,根据上面Jacobian的求导法则,将$R^d \rightarrow R^n$,这里可以得到$\frac{\partial f_1(x)}{\partial x_1} = B_{1, 1}$(因为对$x_1$求导得到了$B_{·i}$,而将第一项抽出来就是$B_{1,1}$,后面的以此类推)。
由此,我们得到$\frac{\partial f(x)}{x} = -B$
证明2:
也可用内积,求出第一行的表达式,然后针对每一项求导得到矩阵。这样好想但写的要长些(但我还是倾向用)。
求函数$f: R^d \rightarrow R, f(x) = ||b-Ax||^2$的梯度?
在这里我们将函数分解为两层,外层为$h(y)=||y||^2$,内层为$g(x)=b-Ax$。
根据对范数求导,我们有:$\nabla_y h(y)=(\frac{\partial ||y||^2}{\partial y})^T = 2y$
根据对矩阵求导,我们有:$\nabla_x b-Ax=-A^T$
根据链式法则,我们有:$\nabla_x h(g(x)) = \nabla_x g(x) \nabla_g(x) h(g(x))=-2A^T(b-Ax)$
求函数$f: R^{d \times r} \rightarrow R, f(x) = ||D-YX^T||^2, D \in R^{n \times d}, Y \in R^{n \times r}$的梯度?
首先,根据X的维度,可以将式子化成
$\nabla_Xf(X) = \begin{pmatrix} - &\nabla_{X_{1\cdot }}f(X) &-\\&\vdots&\\-&\nabla_{X_{d\cdot }}f(X)&-\end{pmatrix}$
考虑对第k行所有值而言的梯度:
$\nabla_{X_{k \cdot }f(X)} = \nabla_{X_{k \cdot }}\lVert D-YX^\top\rVert^2$
$= \nabla_{X_{k\cdot }}\sum_{i=1}^d\lVert D_{\cdot i}-YX_{i\cdot }^\top\rVert^2$
$= \nabla_{X_{k\cdot }}\lVert D_{\cdot k}-YX_{k\cdot }^\top\rVert^2$(显然只有$D_{·k}$和后面的项与梯度有关)
$\nabla_{X_{k\cdot}}\lVert D_{\cdot k}-YX_{k\cdot}^\top\rVert^2$
$=(-2Y^\top(D_{\cdot k}-YX_{k\cdot}^\top))^\top$(根据对复杂向量的求梯度)
$= -2 (D_{\cdot k}-YX_{k\cdot}^\top)^\top Y$
将这个结果带回:
$\nabla_Xf(X) = \begin{pmatrix} - &\nabla_{X_{1\cdot }}f(X) &-\\&\vdots&\\-&\nabla_{X_{d\cdot }}f(X)&-\end{pmatrix}$
$= \begin{pmatrix} -2 (D_{\cdot 1}-YX_{1\cdot}^\top)^\top Y \\\vdots\\ -2 (D_{\cdot d}-YX_{d\cdot}^\top)^\top Y\end{pmatrix}
$=-2\begin{pmatrix} (D_{\cdot 1}-YX_{1\cdot}^\top)^\top \\\vdots\\ (D_{\cdot d}-YX_{d\cdot}^\top)^\top \end{pmatrix}Y$
$=-2 (D-YX^\top)^\top Y$
一个结论的推导:
$\frac{\partial x^T A x}{\partial x} = (A+A^T)x$
$x^T A x = (x_1, x_2, ... x_n) \left (\begin{array}{ccc} A_{11} & ... & A_{1n} \\ ... & ... & ... \\ A_{n1} & ... & A_{nn} \end{array} \begin{array}{cc} x_1 \\ ... \\ x_n \end{array} \right) = \sum_{i=1}^{n}\sum_{j=1}^{n}x_i A_{ij} x_j$。
$\frac{\partial}{\partial x_{1}} x^{T} A x=\frac{\partial}{\partial x_{1}} \sum_{i=1}^{n} \sum_{j=1}^{n} x_{i} A_{i j} x_{j}=\sum_{j=1}^{n} A_{1 j} x_{j}+\sum_{i=1}^{n} x_{i} A_{i 1}$
由于是对$x_i$求偏导,所以要挑出所有含$x_i$的项,以$x_1$为例:
$x_1\sum_{j=2}^{n} A_{1 j} x_{j}+\left(\sum_{i=2}^{n} x_{i} A_{i 1}\right)x_{1} + x_{1}A_{11}x_{1}$,求偏导后就是$\sum_{j=1}^{n} A_{1 j} x_{j}+\sum_{i=1}^{n} x_{i} A_{i 1}$(其中最后一项分别分给前面两项)。
于是:
$\frac{\partial}{\partial x} x^{T} A x=\left[\frac{\partial}{\partial x_{1}} x^{T} A x, \frac{\partial}{\partial x_{2}} x^{T} A x, \cdots, \frac{\partial}{\partial x_{n}} x^{T} A x\right]^{T}$
$=\left[\sum_{j=1}^{n} A_{1 j} x_{j}+\sum_{i=1}^{n} x_{i} A_{i 1}, \sum_{j=1}^{n} A_{2 j} x_{j}+\sum_{i=1}^{n} x_{i} A_{i 2}, \cdots, \sum_{j=1}^{n} A_{n j} x_{j}+\sum_{i=1}^{n} x_{i} A_{i n}\right]^{T}$
$=\left[\sum_{j=1}^{n} x_{j} A_{1 j}+\sum_{i=1}^{n} x_{i} A_{i 1}, \sum_{j=1}^{n} A_{2 j} x_{j}+\sum_{i=1}^{n} x_{i} A_{i 2}, \cdots, \sum_{j=1}^{n} A_{n j} x_{j}+\sum_{i=1}^{n} x_{i} A_{i n}\right]^{T}$
$=\left(x^{T} A^{T} + x^{T} A\right)^{T}=\left(A+A^{T}\right)x$
回归
知道一些值,求整个模型的情况。
每行的值叫“观察”(observation,实际上叫做数据),每一行有一个目标值。
ID | $F_1$ | $F_2$ | $...$ | $F_d$ | $y$ |
1 | $D_{11}$ | $D_{12}$ | $...$ | $D_{1d}$ | $y_1$ |
2 | $D_{21}$ | $D_{22}$ | $...$ | $D_{2d}$ | $y_2$ |
$...$ | $...$ | $...$ | $...$ | $...$ | $...$ |
n | $D_{n1}$ | $D_{n2}$ | $...$ | $D_{nd}$ | $y_n$ |
有如上数据集
目标是在新给定特征的数据下,通过一个函数预测目标y的值。
我们希望F(x)=y,但是由于有太多噪音了,我们一般没有办法完全做到……
但是我们依然可以尽量拟合。
更形式化的定义:
给出一个有n行的数据集
$D=\{(D_i, y_i) | D_i \in R^{1 \times d}, y_i \in R, 1 \le i \le n\}$
找到函数$f: R^d \rightarrow R, f \in F$使得$f(D_{i}^T) ≈ y_i, \text{for all }1 \le i \le n$
此处有假设,每个数据真的是由函数和一些噪音产生的。
所以回归就是要找到一个函数,拟合这个真实存在的函数。
1. 我们在找什么函数?
2. 拟合是在说什么?
首先先看看仿射函数($f(x) = \beta_1 x + \beta_0$。
$f(x) = (1, x) \left (\begin{array}{cc} \beta_0 \\ \beta_1 \end{array} \right)$
$=\phi(x)^T \beta$
此处$\phi(x)=\left (\begin{array}{cc} 1 \\ x \end{array} \right)$
(这个结论也可以推广到任意高维)
$F_{aff}= \{f: R^d \rightarrow R, f(x) = \phi_{aff}(x)^T \beta | \beta \in R^{d+1}\}$
二次函数:
$f(x) = \beta_2 x^2 + \beta_1 x + \beta_0$
$=(1, x, x^2) \left (\begin{array}{cc} \beta_0 \\ \beta_1 \\ \beta_2 \end{array} \right)$
$=\phi(x)^T \beta$
(同样,也可以推广到更高次数的函数)
然而,推广到更多个变量时,情况会变得很复杂——尽管最后依然可以化成这样的形式。但是,我们现在的$\phi$维度太高了。
高斯函数:
$k(x) = \text{exp}(-\gamma ||x-\mu||^2)$($gamma$决定宽度,$\mu$决定曲线的中心位置)
高斯径向基函数:
通过叠加高斯函数,可以得到性质非常好的曲线,高斯径向基函数曲线。
$f(x) = \sum_{i=1}^k \beta_{i} e^{- \frac{||x-\mu_i||^2}{2 \sigma^2}}$
$= (\Kappa_1 (x), ..., \Kappa_k (x)) \left (\begin{array}{cc} \beta_1 \\ ... \\ \beta_k \end{array} \right)$
$=\phi(x)^T \beta, \phi(x), \beta \in R^k$
coefficient系数
对于机器学习,我们要知道的实际上是$\beta$。
那么,我们应该怎么将数据拟合进函数?
最小化残差平方和。
$RSS(\beta)=\sum_{i=1}^n (y_i - f(D_{i·}))^2$(其实值得注意的是这里就已经是$D_{i·}$了)
$= \sum_{i=1}^n (y_i - \phi (D_{i·}^T)^T \beta)^2$
$= \sum_{i=1}^n (y_i - X_{i·} \beta)^2$
$=||y-X\beta||^2$
回归向量$\beta$,目标值向量$y$
我们定义design matrix(设计矩阵)的第i行是将表该行所有元素代入基函数后得到的值。(比如这行得到的数据是2,3,5,基函数是1,x,$x^2$,结果就是1,3,25)
所以设计矩阵的第i行也就是原本的值过了基函数之后的结果,还是以上面这个例子为例,假设这是$D_{i·}$,那么$X_{i·}=(1, 3, 25)$。
一个X适用于一整个函数簇,即所有以φ为基函数的函数簇。此外,需要注意设计矩阵可以比d大一点(因为基函数可能会引入一些无用的额外x等等)
回归:任务
给一个数据集,包含n次观察
$D = \{(D_{i·}, y_i) | D_{i·} \in R^{1 \times d}, y_i \in R, 1 \le i \le n \}$
选择基函数$\phi: R^d \rightarrow R^p$,并作对应设计矩阵$X \in R^{n \times p}$,其中$X_{i·}=\phi (D_{i·}^T)^T$
找到回归向量$\beta$,使得能够最小化$RSS(\beta)$,即:
$\min_{\beta} RSS(\beta) = ||y-X \beta||^2 s.t. \beta \in R^d$
返回预测函数$f: R^d \rightarrow R, f(x) = \phi(x)^T \beta$。
那么现在只剩下两个问题:怎么找到$\beta$?怎么进行优化?
$RSS(\beta) = ||y-X \beta||^2$是凸函数。
证明:只需证明$||·||^2$是凸函数即可。
显然$y-X \beta$是$||·||^2$上对$\beta$的仿射变换(线性变换),只要证明$||·||^2$是凸函数,那么根据凸函数的性质整个函数自然也是凸函数。(可以看下怎么证明的)
好了,我们现在知道整个问题是优化一个凸函数,这让我们有以下两个性质:
$RSS(\alpha \beta_1 + (1-\alpha) \beta_2) \le \alpha RSS(\beta_1) + (1-\alpha) RSS(\beta_2), \text{for every }\alpha \in [0, 1], \beta_1, \beta_2 \in R^p$
$R^p$是凸集合。(先记下来,后面回去看这里以及问人)
现在我们有了一个无约束优化问题。用FONC。
现在计算驻点:
$RSS(\beta)=||y-X \beta||^2$
$\nabla_{\beta} RSS(\beta)=-2X^T(y-X \beta)$
$-2X^T(y-X \beta) = 0 \equiv X^T X \beta = X^T y$
根据FONC,所有驻点/全局最小值都在$\{ \beta \in R^p | X^T X \beta = X^T y\}$
可以证明这里的驻点必定是局部最小值,因为如果是其他情况,会使得整个函数不满足凸函数的性质。
如果$X^T X$可逆,那么只有一个最小值的解:
$\beta=(X^T X)^{-1} X^T y$
否则,可能会有无穷多个最小值的解。
问题:我怎么知道我选的基函数好?
偏差-方差间权衡
评估模型:1. 评估测试集
如果模型假设正确,那么回归模型应当能够预测一个不在X/D中的新数据x的值y。
方向:保留一部分训练集中的数据$\Iota \subseteq \{1, ... n \}$($\Iota$是测试集编号的集合)当作测试集,并计算测试集上的误差。
均方误差(MSE):$MSE(\beta, \Iota) = \frac{1}{|\Iota|} \sum_{i \in \Iota} (y_i - \phi(D_{i·})^T\beta)$
然而,我们有时候会发现MSE有时候恰好计算的和随机扰动刚好一样了
于是我们再让整个模型在理论上更复杂一点:
我们每次从数据集里挑不同的训练集和测试集,每次做MSE。
然后对MSE取平均,得到期望MSE(Expected squared Prediction Error,EPE)。
期望MSE是一个和x、y和D的三个分别的随机变量有关的函数/值:
$E_{x, y, D}[(y-f_D(x))^2]$(x,y与选出来的测试集有关)
所以我们希望最小化期望MSE。
y的随机变量是指:虽说y本身是依赖于真函数$f^{*}, x$和随机扰动$\epsilon_i$,但是y的期望还是$f^{*}(x)$,而随机扰动可以看作一个满足正态分布的函数,所以y的扰动就和正态分布一样,$\sigma^2$。
$E_{x, y, D}[(y-f_D(x))^2] = E_x[E_{y,D}[(y-f_D(x))^2|x]]$(通过某种方法可以让x变得不重要)
$E_{y,D}[(y-f_D(x_0))^2]=\sigma^2 + (f^{*}(x_0)-E_D[f_D(x_0)])^2 + E_D[(E_D[f_D(x_0)]-f_D(x_0))^2]$。
其中$f^{*}(x_0)-E_D[f_D(x_0)])^2$称为$bias^2$,$E_D[(E_D[f_D(x_0)]-f_D(x_0))^2]$称为variance。
bias告诉我们我们的预测平均,距离真实值差多少;variance告诉我们预测平均,距离其中某一个模型,差值的平方的预测值。(即,模型和这些模型预计出来值,之间平均差了多少)
因此,只需要最小化两者,即可得到最小的EPE。
high bias, low variance: 欠拟合
low bias, low variance: 刚刚好
high variance, low bias: 过拟合
过拟合的一个问题在于过度贴合训练数据,反而不反映真实情况了。
(由于分类器是在随机变量上训练的,分类器本身也是一个随机变量;同理,分类器的性能也是随机变量)
随着模型复杂度的增加(可以是函数的项数次数、超参数……),训练集上的误差始终下降,测试集上的误差先下降后上升。
这些都是理论上的最优方法,实践上的最优方法是交叉验证:
k折交叉验证
将数据集分成k个块,每个块为$\Iota_{i}$,即:
{1, ..., n} = $\Iota = \Iota_1 \cup ... \Iota_k, \Iota_j \cap \Iota_l = \emptyset \text{ for } j \neq l$。
根据这些分块的数据,训练k个模型,第j个模型$f_j(x) = \phi(x) \beta_j$通过$I \setminus I_j$训练, 并在$I_j$上做分析。(注意数据集可能要打乱)
交叉验证MSE:
$\frac{1}{m}MSE(\beta_j, \Iota_j) = frac{1}{m} \sum_{j=1}^m frac{1}{|\Iota_j|} \sum_{i \in \Iota_j} (y_i - f_j (D{i·})^2$
如果有无限多个回归最小值和拟合出来的回归函数?
例子:p>n。基函数维度大于要拟合的函数的维度。
通过奇异值分解,我们可以发现这种情况下一定$X^T X$一定没有可逆矩阵。
$ X^T X \beta = X^T y = V \Sigma^T U^T U \Sigma V^T \beta = V \Sigma^T U^T y$
$\equiv V \Sigma^T \Sigma V^T \beta = \Sigma^T U^T y$
假设有r(r≤n)个非0元素位于$\Sigma$对角线上,得到的伪逆矩阵对角线上同样也只有r个元素。而r≤n<p,所以一定不会有逆矩阵。不过,由于伪逆矩阵和逆矩阵有一些相似的性质,我们可以构造$\beta=V A \Sigma^T U^T y$,,其中A
$=\left(\begin{array}{ccc|cc}\frac{1}{\sigma_1^2}&\cdots& 0 & \cdots & 0\\ \vdots&\ddots&\vdots & \cdots & 0 \\0 &\cdots&\frac{1}{\sigma_r^2} & \cdots & 0 \\ \hline A_{r+1, 1} & \cdots & \cdots & \cdots & A_{r+1, p} \\ \vdots & \vdots & \vdots & \cdots &\cdots \\ A_{p, 1} & \cdots & \cdots & \cdots & A_{p, p} \end{array}\right)$(其中下面这些是任意的)
当$\beta$运算过程中包含了伪逆矩阵,即$A$的下半部分全是0时,称这时的$\beta$是伪逆矩阵的回归解(regression solution)。
首先,也许可以选择一个很简单的函数,绕过这个问题?
也许……但是,如果d>n(特征数目远大于数据数量),那么就不可行。
特征选择(feature selection)
回归向量$\beta$的意义是得到所有与$f(x)$有关x的非负系数。
我们可以尽量将系数设置成0,这样我们就有很少特征与预测值有关系了。
但是如果一个系数是0,那么显然这个变量和结果没什么关系。
$L_0$“范数”统计了$\beta$里非0的系数。
稀疏逻辑回归
给一个数据矩阵$D \in R^{n \times d}$,目标向量$y \in R^n$,设计矩阵$X \in R^{n \times p}$, 其中$X_i = \phi(D_{i·}^T)^T$和常数s。
找到满足如下条件的回归向量$\beta$:
$\min_{\beta \in R^p}||y - X \beta||^2 s.t. ||\beta||_0 \le s$
返回预测函数$f: R^d \rightarrow R, f(x)=\phi(x)^T \beta$
不过……目标不再是凸的了,目标函数还是凸函数,但是定义域(可能)不再是凸集合了
而且这里的$L_0$“范数”也很难解,它不连续也不可微。
我们可以对其进行松弛
$L_p$范数定义在$p \in (0, \inf]$上,而且只在$p \ge 1$时才真是范数。
$||x||_p = (\sum_{k=1}^d |x_k|^p)^{1/p}$
我们可以将$L_0$松弛到$L_1$,这样定义域就是凸集合了。
不过即便定义域又凸了,我们怎么解决这个问题呢?
……一般没人会真去解决这种线性规划的难题,而是会将函数化成$f(x) - \lambda c(x)$(惩罚函数,penality function)。
于是整个函数就成了拉格朗日函数。
整个过程:
$L_p$约束回归
给$p \in [0, \inf], s>0$,$L_p$约束回归为:
$\min_{\beta}||y - X \beta||^2 s.t. ||\beta||_p \le s$
根据拉格朗日乘子理论,总有一个参数$\lambda >0$,使得上述目标等价于:
给$p \in [0, \inf], \lambda>0$,$L_p$乘法函数约束回归为:
$\min_{\beta}(||y - X \beta||^2 + \lambda ||\beta||_p)$
理论上来说,对于任何$L_p$约束回归,都能找到一个参数使得上下等价。
由于我们不知道$\lambda$的具体情况,我们就选一个,然后通过交叉验证慢慢验——因为只要选出来了,整个函数想要最小化是很轻松的。
然后,选怎么样的$L_p$合适?2阶以上最好,因为可微且连续。但也需要考虑1阶。
再然后,我们具体探讨一下选好了怎么做:
岭回归
给一个数据矩阵$D \in R^{n \times d}$,目标向量$y \in R^n$,设计矩阵$X \in R^{n \times p}$, 其中$X_i = \phi(D_{i·}^T)^T$和正则化乘子$\lambda$。
找到满足如下条件的回归向量$\beta$:
$\min_{\beta \in R^p}||y - X \beta||^2+\lambda ||\beta||^2$
返回预测函数$f: R^d \rightarrow R, f(x)=\phi(x)^T \beta$
整个函数平滑且凸。
于是继续求驻点
$\min_{\beta \in R^p} RSS_{L_{2}}(\beta)=||y-X\beta||^2 + \lambda ||\beta||^2$
求驻点,有:
$\nabla_{\beta}RSS_{L_{2}}(\beta) = -2X^T (y-X\beta)+2 \lambda \beta = 0$
$=(X^T X+\lambda I)\beta = X^T y$
于是我们又回到了解$\beta$的问题,以及$X^T X+\lambda I$是否可逆的问题上。
但这次,由于$\lambda>0$,对X进行奇异值分解$X = U \Sigma V^T$,得到整个式子为:
$X^T X + \lambda I = V(\Sigma^T \Sigma +\lambda I) V^T$
于是,对于某个$\lambda >0$,整个岭回归的唯一$\beta$就是:
$\beta_{L_2}=(X^T X+\lambda I)^{-1}X^T y$
岭回归的解与原回归的解:
由于岭回归里对设计矩阵做了奇异值分解,带有正则化乘子$\lambda>0$的回归解$\beta_{L_{2}}$和原解相差不大
$\beta_{L_{2}}=(X^T X+\lambda I)^{-1} X^T y = V(\Sigma^T \Sigma +\lambda I)\Sigma^T U^T y \approx VA\Sigma^T U^T y$
如果$\lambda >0$但值很小且
岭回归可以用来快速得到类似原稀疏函数解的解。
如果我们选了$L_1$呢?
这个情况下连续,但在0点时不可微。
Lasso回归
给一个数据矩阵$D \in R^{n \times d}$,目标向量$y \in R^n$,设计矩阵$X \in R^{n \times p}$, 其中$X_i = \phi(D_{i·}^T)^T$和正则化乘子$\lambda$。
找到满足如下条件的回归向量$\beta$:
$\min_{\beta \in R^p}||y - X \beta||^2+\lambda ||\beta||$
返回预测函数$f: R^d \rightarrow R, f(x)=\phi(x)^T \beta$
进一步考虑,一阶范数的次梯度有以下三种情况:
$\frac{\partial |\beta|}{\beta_k} = 1, \text{ if } \beta_k > 0$
$\frac{\partial |\beta|}{\beta_k} = -1, \text{ if } \beta_k < 0$
$-1 \le \frac{\partial |\beta|}{\beta_k} \le 1, \text{ if } \beta_k = 0$
次梯度是指不是处处可导的函数的梯度,特别的,是指当这个梯度不可导,但处于某一个范围内时的情况。
梯度的很多性质对次梯度也成立,比如FONC。
于是我们接着找$0 \in \nabla f(x)$的点。
那么我们怎么做来最优化Lasso?
首先可以尝试对整个函数做FONC,但是整个函数需要考虑的东西太多了,需要考虑每个子变量在左侧,在右侧还是在0点。
再接下来尝试做子梯度下降,但是由于在零点的情况和步长“冲突”,同样处理起来很麻烦。
……于是我们做坐标下降,因为如果只考虑一个坐标的变动,整个函数还是很简单就能找到最小值的。
所以,最小化Lasso函数等价于找到每一个使得Lasso函数最小的$\beta_k$,即找到$\beta_k$满足:
$\beta_k^{*} = \arg \min_{\beta_k \in R} ||y-X \beta||^2 + \lambda |\beta|$
这个函数通过求偏导后可以得到
$c_k = X_{·k}^T y - \sum_{i \neq k} X_{·k}^T X_{·i} \beta_i$
$\beta_{k}^{*}=\frac{1}{||X_{·k}||^2}(c_k-\lambda), \text{ if } c_k > \lambda$
$=\frac{1}{||X_{·k}||^2}(c_k+\lambda), \text{ if } c_k < -\lambda$
$=0, \text{ if } -\lambda \le c_k \le \lambda$
$c_k$是原函数只对$\beta$做坐标下降得到的解。
证明:
$\nabla RSS(\beta) = 2X^\top(X\beta- \vec {y})$
$\frac{\partial}{\partial \beta_k} RSS(\beta) = 2X_{\cdot k}^\top(X\beta- \vec {y})$(如果我没理解错的话,这里应该不是Jacobian的问题。同样,Jacobian矩阵应该只有对向量求导时才会出现?)
$\frac{\partial}{\partial \beta_k} RSS_{L1}(\beta) = 2X_{\cdot k}^\top(X\beta-\vec{y}) + \lambda\frac{\partial\lvert\beta\rvert}{\partial \beta_k}$
我们计算驻点并设置$\frac{\partial}{\partial \beta_k} RSS_{L1}(\beta)=0$
$2X_{\cdot k}^\top(X\beta-\vec{y}) + \lambda\frac{\partial\lvert\beta\rvert}{\partial \beta_k} = 0$
$\Leftrightarrow 2X_{\cdot k}^\top X\beta - 2X_{\cdot k}^\top\vec{y} + \lambda\frac{\partial\lvert\beta\rvert}{\partial \beta_k} = 0$(见链式法则和对矩阵求导中对矩阵求偏导的结果)
$\Leftrightarrow 2X_{\cdot k}^\top X\beta = 2X_{\cdot k}^\top\vec{y} - \lambda\frac{\partial\lvert\beta\rvert}{\partial \beta_k}$
$\Leftrightarrow X_{\cdot k}^\top X\beta = X_{\cdot k}^\top\vec{y} - \frac \lambda 2\frac{\partial\lvert\beta\rvert}{\partial \beta_k}$
$\Leftrightarrow X_{\cdot k}^\top \sum_{l} X_{\cdot l}\beta_l = X_{\cdot k}^\top\vec{y} - \frac \lambda 2\frac{\partial\lvert\beta\rvert}{\partial \beta_k}$
$\Leftrightarrow X_{\cdot k}^\top X_{\cdot k}\beta_k = - X_{\cdot k}^\top \sum_{l\neq k} X_{\cdot l}\beta_l + X_{\cdot k}^\top\vec{y} - \frac \lambda 2\frac{\partial\lvert\beta\rvert}{\partial \beta_k}$
$\Leftrightarrow \beta_k = \frac{1}{\lVert X_{\cdot k}\rVert^2}\left(X_{\cdot k}^\top\left(\vec{y} - \sum_{l\neq k} X_{\cdot l}\beta_l \right) - \frac \lambda 2\frac{\partial\lvert\beta\rvert}{\partial \beta_k}\right)$(令$c_k = X_{\cdot k}^\top\left(\vec{y} - \sum_{l\neq k} X_{\cdot l}\beta_l \right)$)
$\Leftrightarrow \beta_k = \frac{1}{\lVert X_{\cdot k}\rVert^2}\left(c_k - \frac \lambda 2\frac{\partial\lvert\beta\rvert}{\partial \beta_k}\right)$
于是偏导数$\frac{\partial\lvert\beta\rvert}{\partial \beta_k}$取决于$\beta_k$的取值。我们已经在前面探讨过,$\beta_k$有三种取值:
首先是$\beta_k>0$,此时
$\Leftrightarrow 0<\beta_k = \frac{1}{\lVert X_{\cdot k}\rVert^2}\left(c_k - \frac \lambda 2\cdot 1\right)$
$\Leftrightarrow 0<c_k - \frac \lambda 2$
$\Leftrightarrow \frac \lambda 2 < c_k$(这里求的是$c_k>0$的条件)
也就是说,当$c_k > \lambda$时,$\beta_k = \frac{1}{\lVert X_{\cdot k}\rVert^2}\left(c_k - \frac \lambda 2\right)$
同理,可以得到当$c_k < -\lambda$,$\beta_k = \frac{1}{\lVert X_{\cdot k}\rVert^2}\left(c_k + \frac \lambda 2\right)$
那么,$-\lambda \le c_k \le \lambda, \beta_k = 0$(这时$c_k$总能和$\lambda$相等,使得整个式子等于0)
$L_1$和$L_2$哪个更好呢?
惩罚后的Lasso和岭回归目标都有等价的有界优化
也就是说,对于每个$\lambda$,都存在一个$s>0$使得:
$\min_{\beta \in R^p}||y - X \beta||^2+\lambda ||\beta||^2$
等价于,$\min_{\beta \in R^p}||y - X \beta||^2 s.t. ||\beta||^2 \le s^2$
同样,有:
$\min_{\beta \in R^p}||y - X \beta||^2+\lambda ||\beta||$
等价于,$\min_{\beta \in R^p}||y - X \beta||^2 s.t. ||\beta|| \le s$
$L_1$倾向于将结果进一步稀疏化,也就是说$L_1$得到的函数往往项数更少。
岭回归计算起来更快,但结果会稍差。
Lasso计算起来比较慢,但是结果往往比岭回归要好。
分类
已经知道一些东西的分类,新来了一个东西,问是什么类别的?
输入一些特征,有一些标签——训练集。
iid假设:数据彼此独立采样,且根据某种分布进行分布。
定义学习算法和分类器
原则上、理想的学习目标(然而在实践上也可以实现)
贝叶斯最优分类器
有若干个数据集,已经标好结果(注意结果是离散但有限的)。
要研究的项目可以用一个特征向量来表示——颜色、形状、糖含量……
并有一个目标结果y。
训练集
我们假设我们有n个训练数据$(x_1, y_1)... (x_n, y_n)$提供给分类器。让我们的算法学习一个分类器出来。
IID
基本假设:我们假设数据彼此独立采样,且根据某种分布$p^{*}(X, Y)$进行分布。
$(x_i, y_i) ~ p^{*}$
但我们不知道这个分布。
分类器
分类器是一个函数h,接受并将一些向量$\vec x$映射到标签$\hat{y}$上。比如$\hat{y_i} = h(x_i)$
这里,我们用$\hat{y}$表示预测出来的值,$y$表示训练集里真实存在的值。
学习算法(分类)
一个学习算法是一个接受一组数据集并返回一个分类器的函数。
最小化真实分类误差
假设已有一个分类器,h的真实分类误差(True Classification Error)为:
$P[Y \neq h(X)] = E_{X, Y ~ p^{*}}[one(Y \neq h(X))]$
此处$one$为一指示函数:
$one(X) = 1, \text{ if } X \text{ is true}$
$one(X) = 0, \text{ if } X \text{ is false}$
左侧意义在于,随机(再)抽取一个变量分类错误的概率。
右侧意义在于,在一个非常大测试集上错误分类的概率。
然而在现实中,我们无法计算这个东西。(为什么?)
贝叶斯最优分类器
我们还是可以定义一个能够最小化真实分类误差的东西,称为贝叶斯最优分类器(我们知道这玩意存在)$h^{*}$。
定理:
让$p^{*}(X, Y)$为我们不知道的数据产生的分布。分类器:
$h^{*}(x) = \arg \max_y p^{*}(y | x)$(y在x下的条件分布)
$= \arg \max_y p^{*}(y|x)p^{*}(x)$(y在x下的条件分布乘上x的边际分布,x的边际分布只与x有关,和我们要找的y没关系,所以可以看成是常数)
$=\arg \max_y p^{*}}(y, x)$(联合分布)
k近邻
不需要调整参数,基于实例的训练方法
假设新来一个点,根据这个点的“位置”找到k个最近的邻居,然后根据其中的多数票来标记新点。
也可以用来做回归。(如何?)
可以通过增加训练阶段来降低预测的复杂度(如何?)
定理:
如果训练集点数$N \rightarrow \inf$
k近邻参数$k \rightarrow \inf$
N增长速度高于k$\frac{N}{k} \rightarrow 0$
KNN会收敛成贝叶斯最优分类器
有如此性质的算法称为贝叶斯一致(Bayes consistent)
朴素贝叶斯
我们知道$p^{*}$能做出贝叶斯最优分类器来
我们希望能学到$p^{*}$并用于分类,但是这很困难,因为实际上的$p^{*}$往往是一个高维的联合分布。
朴素贝叶斯:条件独立假设
我们已经知道了$h^{*}(x) = \arg \max_y p^{*}(y | x)$,我们尝试去学$p^{*}(y | x)$并用此来做分类。
使用贝叶斯规则(Bayes rule)
条件概率:
$p(A | B) = \frac{p(A, B)}{p(B)}$(B条件下A发生的概率)
因此$p(A, B) = p(A | B)* p(B)$
同样,$p(A, B) = p(B | A)* p(A)$
贝叶斯规则:
$p(A | B) = \frac{p(B | A) p(A)}{p(B)}$
对于分类问题:
我们想求$p (y | X)$,估计$p(y)$并不难,$p(x)$通过边际分布也可以算出($p(x) = \sum_y p(x|y)p(y)$)
而且,我们其实并不需要p(x),因为我们想求的是和y有关系的,和x关系不太大。
最大问题是$p(x|y)$,这是一个关于x的高维联合分布。
在朴素贝叶斯中,我们假设x中的每个子参数都是独立分布的,因此这个概率就等价于多个$p(x_d | y)$的累乘。即:
$p(x | y) \approx \Pi_{d=1}^{D} p (x_d | y)$。
于是我们只需要学习$p (x_d |y)$而不是复杂的高维$p(x | y)$。
让$p(y)$为我们真实分类比例$p^{*}(y)$的估计,$p(x_d | y)$时真实条件概率分布$p^{*}(x_d|y)$的估计,对于每个特征$X_d$,朴素贝叶斯分类器为:
$h_{NB}(x) = \arg \max _y p(y) \Pi_{d=1}^D p(x_d | y)$
利用朴素贝叶斯做垃圾邮件检测:
独热编码,对每个单词做一个编码,数据集对应的特征向量为:
$x_i = \left (\begin{array}{c} 0 \\ 0 \\ 1 \\ ... \\ 0 \end{array} \right)$,如果单词$x_{ij}$出现在邮件中。
如果不是垃圾邮件,$y_i = 0$,否则$y_i=1$。
实践中,对于英语保留最多40000个左右的词典即可。
$I_c$存了所有$y_i = c$的数据集的下标。
接下来我们按照维度和featureValues迭代,对于每一次迭代,我们计算$I_c$中所有$x_i, d=f$的值,除以总$|I_c|$,得到$p(x_d = f | y=c)$。
对于预测:
新来一个数据之后,我们对其求一下对应$y=c$的结果,输出对应最大的那个结果$\hat{c}$。
一些技巧:
拉普拉斯平滑:如果$x_{i,d}=f$的量很小,我们会把原本的式子从$p(x_d = f | y =c) = \frac{\sum_{i \in I_c}one(x_{i,d} =f)+\alpha}{|I_c|+\alpha*\text{feature values}}$
由于贝叶斯分类器中要用到累乘,可能会有精度问题
可以换成累加,即$p(x, y) = p(y=c) \Pi_{d} p(x = x_d^{test} | y =c)$等价于$\log p(x, y ) = \log p(y=c) + \sum_d \log (x=x_d^{test} | y=c)$。
换成累加后:
$\log p(y=c)$表示分类是c的概率
$\log (x=x_d^{test} | y=c)$表示每个特征给出独立证据支持或者抵消分类是c的概率。
我们这里做的都是离散数据
如何用朴素贝叶斯计算连续的特征?(积分?)
优点:
训练快速(只用对数据集做一次)
分类快速
效果好
对不相关数据不敏感
缺点:
依赖于强假设
并非贝叶斯一致(由于依赖于强假设)
决策树
需要各种特征值
我们询问特征,根据特征进行决策
形式定义:
给一组特征$X_1, ..., X_D$(可以是连续或者离散)和一个分类用变量Y,决策树是一个有向二叉树,包含以下两种节点:
1. 决策节点(内部节点)
决策节点与一种特征值有关,并返回一个真值,并会根据真值选择对应的真子树或者假子树。
2. 预测节点(叶节点)
预测节点要么返回一个标签y,要么返回对标签的分布p(Y)。
到每个叶子的路径应该是唯一的
每个叶子应当是唯一的
使用分布的原因主要是以免决策节点选的不好
决策树会将输入划分为若干个区
每个叶子对应了输入空间的某一块
我们希望计算机能自己学到如何进行决策树的分类,而不是我们手算
有一些众所周知的算法:CART、ID3、C4.5……
CART:
迭代所有可能的特征和决策函数,计算花费
选取花费最小的特征进行分割
1. 可能决策是指什么?
1.1 连续:
1.1.1 阈值,问特征是否大于阈值t
1.1.2 排序
1.1.3 只需要考虑两个连续的值,特别是他们的中间值
1.2 离散
1.2.1 一对多分割 ${1, 2, 3, 4} \rightarrow {1, 2, 4}, {3}$
1.2.2 完整分割(不过不再是二叉树) ${1, 2, 3, 4} \rightarrow {1}, {2}, {3}, {4}$
1.2.3 任意分割 ${1, 2, 3, 4} \rightarrow {1,2 }, {3, 4}$
2. 代价
2.1 令N为不对当前点进行分割情况下的数据集
令$N_0$、$N_1$为通过某种分割后的$L_0$、$L_1$分别的数据集
$cost= \frac{N_0}{N} impurity(L_0) + \frac{N_1}{N} impurity(L_1) - impurity(L)$
(impurity 杂质)
杂质计算函数:
令$p(Y)$为对应类别的经验频率,比如:
$p(plum) = \frac{5}{8}=0.625$
$p(lemon)=\frac{3}{8}=0.375$
Gini杂质:$G = 1-\sum_y p(y)^2$
熵杂质:$E=-\sum_y p(y) \log(p(y))$
自分类错误:$C=1-max_y p(y)$
停止标准:
如果对结果改进很小或者数据点太少,就可以停止分叉
总结:
学习过程:贪心的进行树的增长,尝试让叶子尽量没有杂质,在建好树之后经常用后剪枝优化
优点:
快、可解释
缺点:
对于大型的决策树不太好解释,分类精确度往往比较差(可以用随机森林优化,是最好的分类器之一)
可以很轻易地给回归模型做(怎么做?)
评估模型
估计真实分类误差
关于训练集的过拟合和泛化问题
混淆矩阵
估计真实分类误差
假设已经训练好了分类器h,数据独立、相同的按照$p^{*}(X, y)$分布。
我们希望计算真实分类误差$CE_{true}=P[Y \neq h(X)]=E_{X, y ~ p^{*}}[one(Y \neq h(X))]$
问题在于$p^{*}$我们不知道,而且即便我们知道,计算真实分类误差也是很麻烦的问题。
不过我们可以通过在有限的数据集上的数据,根据经验来估计这个误差:
$CE_{true} \approx \frac{1}{N} \sum_{i=1}^N one(y_i \neq h(x_i))$
只用训练集:可能会过拟合
训练集上的误差相对真实分类误差过于乐观,在这里当degree到达10时训练集上的误差估计为0,真实分类误差却很大。训练集上的误差小不代表泛化好。
真实分类误差必须用一部分不在训练集内的数据做,可以是测试集,不过我们接下来要引入新东西:验证集(validation set)。
一般而言,我们会把数据集切成两部分,
训练集上做模型,测试集上做真实分类误差。
大多数算法/模型会有超参数:例如朴素贝叶斯里的拉平参数,决策树里的分类下限等等,一般来说越复杂的模型超参数越多。
我们现在将测试集的一部分拉出来,进行超参数的调整现在:训练集训练模型,验证集调整超参数,测试集做性能评估(真实分类误差)。
常规分割方法:60/20/20或70/15/15
然而,多分少分带来的好处和坏处?
机器学习的标准工作流程:
不过需要注意,整个流程中应当尽量避免人介入,比如人看到最后test error不好,于是根据test error对参数进行凸优化了,而是应该整体重做。
总结:
我们想做$CE_{true}=P[Y \neq h(X)]=E_{X, y ~ p^{*}}[one(Y \neq h(X))]$。然而,我们没法直接做,因此我们有几个估计:
训练误差(过度乐观的估计):
$CE_{train}=\frac{1}{N_{train}}\sum_{i=1}^{N_{train}} one(y_i \neq h(x_i))$
验证误差(依然相对比较乐观的估计):
$CE_{val}=\frac{1}{N_{val}}\sum_{i=1}^{N_{val}} one(y_i \neq h(x_i))$
测试误差——对真实误差的无偏有噪音估计:
$CE_{test}=\frac{1}{N_{test}}\sum_{i=1}^{N_{test}} one(y_i \neq h(x_i))$
根据定义,$N_{test} \rightarrow \inf: CE_{test} \rightarrow CE_{true}$(但是训练误差和验证误差不也如此吗?)
准确度——误差的相反,一个计算正确预测一个计算错误预测:
真实准确度:$ACC_{true}=P[Y \neq h(X)]=E_{X, y ~ p^{*}}[one(Y = h(X))]$
训练准确度:$ACC_{train}=\frac{1}{N_{train}}\sum_{i=1}^{N_{train}} one(y_i = h(x_i))$
验证准确度:$ACC_{val}=\frac{1}{N_{val}}\sum_{i=1}^{N_{val}} one(y_i = h(x_i))$
测试准确度:$ACC_{test}=\frac{1}{N_{test}}\sum_{i=1}^{N_{test}} one(y_i = h(x_i))$
准确度:Accuracy=1-Classification Error。
混淆矩阵(从准确度角度)
行:真实标签
列:预测标签
非对角线:错误分类
正则化:对行求和后除以和
随机森林
最强大的分类器之一
许多颗树可能会比一棵树结果要好。
bootstrap后,我们将获得稍微不同的重新取样的训练集,并对这个训练集训练可以得到随机森林。
随机森林使用了对决策树的随机化集成方法,并通过bagging(引导,bootstrapping和聚合,aggregating)。
我们都知道如果模型太过复杂,会发生过拟合:方差太大。
通过对多次训练的分类器结果进行平均,可以减小方差。
但是我们只有一个训练集……
原则上来说不可能,但是有一种技术可以模拟:bootstraping(引导)
统计学方法,常用来估计某一估计量的噪声分布。
首先原始数据肯定还是有N个,然后我们生成K个新数据集,每个大小为N,但内部元素是从原始数据中随机取样(允许重复)得到的。
每个新产生的数据集大概包含$1-\frac{1}{e}%$的原始数据集。
除非N很大,不然没法保证会产生接近真实估计量的分布。但实践中很好用。
例子:对于均值的经验分布,我们会对产生的所有新数据集的每一组求平均,然后看这个平均值如何分布。
引导聚类算法/装袋算法(bagging)
1. 先做K个数据集
2. 对每个数据集做一个模型
3. 整合结果:均值、多数投票……
随机森林:
用决策树做引导聚类
1. 做k个数据集
2. 随机化的CART学习方法:对于树的增长,不再考虑所有特征,而只考虑m个(m<D)随机选择的特征。(一般K=100, 200, 500,m≈D/3)
3. 最后结果可能用平均树或者多数票
运行时间:k*单个树构造时间
对于没有太多结构的数据(表格、非结构化的数据),随机森林是最好的分类器。
有结构的数据(一般是说信号结构,比如音频、文字、视频),神经网络是最好的分类器。
支持向量机
“正好被夹在训练集中间,被训练集支持(support),所以叫支持向量机”
通过超平面将空间分成两个半空间(最大距超平面)。
线性决策边界
分割超平面:
$h(x)=sgn(w^T x +b) = \{ \begin{array}{**lr**} +1 \text{ if } w^T x+b \ge 0\\ -1 \text{ otherwise} \end{array}$
其中$w$是超平面的法向量,$b$是一个实数。$w^T, b$决定了超平面。
如果我们能找到至少一个线性超平面将数据集分割成两部分,我们称数据集为线性可分离数据集。
然而,我们实际上会找到很多线性超平面,那么如何评估线性超平面好不好呢?
这个超平面贴的数据集太近了,一旦数据集稍微有点噪音,我们就会错误分类。
找最大边缘距离的超平面:边缘距离是指到任意训练集的最小距离d。此平面有唯一性。
“找到最厚的木板,让其挤在我们的训练样本之间,木板被若干个点所支撑”。
超平面完全取决于决定最小距离的几个向量,即便移除了其他所有点或者移动其他所有点,对结果没有影响。
如何学习这个超平面?——如何学习机器学习中的各种模型?
优化!
将问题表述为优化问题,并解决优化问题。
让我们先假设数据集可以被线性分割……
我们想要找到有最大边缘距的超平面。
问题1
有N个数据点$(x_i, y_i)$,其中:
$y_i = \{ \begin{array}{**lr**} +1 \text{对于正分类(x)}\\ -1 \text{对于负分类(o)} \end{array}$
$h(x)=sgn(w^T x +b) = \{ \begin{array}{**lr**} +1 \text{ if } w^T x+b \ge 0\\ -1 \text{ otherwise} \end{array}$
$\underset{w, b}{\text{maximize}} \min\limits_{i} d_{w,b}(x_i)$
其中:
$d_{w, b}(x_i)$是$x_i$到超平面w, b的距离
这个构建是正确的,但是对于优化器来说太抽象了
我们需要把问题构建的再具体一点
一个点到超平面的距离$d = \frac{w^T x - b}{||w||}$(处于正侧时)
$d = -\frac{w^T x - b}{||w||}$(处于负侧时)
$\frac{w^T x - b}{||w||}$是点到平面带符号的距离
……而我们的标签恰好是{-1, 1},与带符号距离相乘后刚好是正确的距离值。
问题2
于是,我们将原本的式子转化为:
$\underset{w, b}{\text{maximize}} \min\limits_{i} \frac{y_i (w^T x_i - b)}{||w||}$
然而,由于有$\min$和除以范数,其不凸,不能保证全局最优解。
于是我们用边距搞一搞。
对于任意超平面,我们可以引入两个新的边缘超平面,一个是$w^T x-b=1$,一个是$w^T x - b =-1$,一个称为正边缘超平面(向正半空间稍微移动了一点),一个称为负半边缘超平面(稍微向负半空间移动了一点)。
很显然,这两个超平面到原本超平面的距离都是$d=\frac{1}{||w||}$,因此如果我们拉大w和b,会减小距离,两个新的超平面会逐渐靠近原本的超平面。
也就是说,通过调整超平面的参数,我们总是能让:
所有负点位于新的负边缘超平面的负侧$w^T x - b \le -1$
所有正点位于新的正边缘超平面的正侧$w^T x - b \ge 1$
也就是说,通过调整超平面的参数,我们总是能让所有点有$y_i (w^T x - b) \ge 1$(乘以标签),称这个约束为边际约束。
两个超平面到原本超平面的距离都是$d=\frac{1}{||w||}$
而且,两个超平面到原本超平面的距离等价于原来的距离(老师说的)
问题3
于是,有:
$\underset{w, b}{\text{maximize}} \frac{1}{||w||}$
$s.t. y_i (w^T x_i - b) \ge 1$
但由于$\frac{1}{||w||}$,这个东西依然不是凸的。
然而我们可以将$maximize \frac{1}{||w||} \rightarrow minimize ||w||$
然后为了保证处处可微,再用$\frac{1}{2} ||w||^2$替换$||w||$
问题4
于是,有:
$\underset{w, b}{\text{minimize}} \frac{1}{2}||w||^2$
$s.t. y_i (w^T x_i - b) \ge 1$
二次函数,可微
凸函数
二次规划的特殊情况
有标准求解器
如果数据不是线性可分的呢?
区别总是这个点和我们的仿射函数之间的关系:
在非线性分割数据里,我们不可能让所有的点都满足线性分割
但是我们肯定如果越多点满足约束又开心
引入松弛变量,原式转化为$y_i (w^T x_i - b) \ge 1-\xi_i, \xi_i \ge 0$
我们想要$\xi_i$尽量小,用作惩罚。
令$\xi$为$\xi_i$组成的向量。
由于我们在做优化,我们自然希望将$\xi$引入目标函数中,并将这个当作惩罚函数
软边界的svm:
$\underset{w, b}{\text{minimize}} \frac{1}{2}||w||^2 + C \sum_{i} \xi_i$
$s. t. y_i (w^T x_i -b) \ge 1-\xi_i$
$\xi_i \ge 0$
C是权衡参数(超参数),C趋近无穷意味着整个函数回到硬边界
可以cross-validation验证
依然是二次函数
练习:
这个东西也等价于$\underset{w, b, \xi}{\text{minimize}} \frac{1}{2}||w||^2 + C \sum_{i} max(1-y_i (w^T x -b), 0)$(后面这一大坨也叫hinge loss)
现在我们依然是凸函数,没有约束,但不是二次函数。
变法:将$\xi_i$移项,$\xi_i$是$1-y_i (w^T x -b)$和$0$中较大的项。
由于是minimize,尽量取等。
最小化范数+满足边缘的条件等价于最大化边缘。
内核技巧
内核法不止可以用在svm里,也可以用在其他机器学习方法。
机器学习算法通常可以通过非线性特征变换改进,有效但昂贵。
内核法:隐式且有效的做到非线性特征变换做到的东西。
当算法包含特征向量的内积时总适用。
对偶SVM构建
我们称之前的软边界svm和硬边界svm为原始svm公式。
我们现在要讨论拉格朗日对偶性,并产生对偶svm公式。
有时比原始svm更好用,但真正的优势仅依赖于特征向量的内积,因此可以用内核法。
回顾一下对偶性:
标准形式的优化问题长成:
$\underset{z}{\text{minimize}} f(z) $
$s.t. g_i(z) \le 0$
我们称这个式子为原始式
这个问题的拉格朗日函数是:
$L(z, \lambda) = f(z) + \sum_{i} \lambda_i g_i (z)$
其中$\lambda_i$是约束的加权,称为拉格朗日乘数,$\lambda_i \ge 0$。
令$L_{primal}(z) = \max_{\lambda \ge 0}L(z, \lambda)$(注意这里是最大化函数而不是最大化$\lambda$)
如果现在我求$\min_{z} L_{primal}(z)$,这完全等价于原始问题。
(在拉格朗日对偶法中,拉格朗日函数的额外约束如果不满足,则会对整个函数进行惩罚,所以可行域依然是原本的。拉格朗日函数会改变最小值,但不会改变最小值时取到的值)
在原始问题里,所有的$g_{i}(z)$在可行域上结果都≤0,那么最合适的只能是让$\lambda=0$。
而对于不可行域上,我们内层可以将$\lambda_i$拉到无穷大,但是这样外层肯定不会选无穷大的点了。
于是L就变回f(z),原本的问题。
我们再令$L_{dual}(\lambda) = \min_{z} L(z, \lambda). \forall \lambda: L_{dual}(\lambda) \le \min_z L_{primal}(z)$(不过注意这里的下界可能并不在对应值处取,我们只知道一定比原本函数小)
每一个$L_{dual}$都是原函数的一个下界,我们求最好的下界。
我们称$\max_{\lambda \ge 0} L_{dual}(\lambda)$为对偶问题。
对于凸问题,原问题和对偶问题是紧的,也就是说他们的最优值相同(根据观察)。
有时,对偶问题的解完全等价于原问题的解。svm中就是如此。
硬margin svm的情况
原问题:$\underset{w, b}{\text{minimize}} \frac{1}{2} w^T w$
$s.t. 1-y_i (w^T x_i -b) \le 0$
拉格朗日乘数问题:
$L=\frac{1}{2} w^T w + \sum_{i} \lambda_i (1-y_i (w^T x_i -b))$
对soft margin也适用,只需要稍微做一点点修改即可
我们写出L了,然后我们写$L_{dual}$
$L_{dual}=\min_{w} \frac{1}{2} w^T w + \sum_{i} \lambda_i (1-y_i (w^T x_i -b))$
L中w的两次出现都是多项式的,因此整个函数在w和b中是凸的。
于是对L求梯度:
$\nabla_{w} L = w-\sum_{i} \lambda_i y_i x_i =0 \Rightarrow w = \sum_{i}\lambda_i y_i x_i$。
$\frac{\partial L}{\partial b} = \sum_{i} \lambda_i y_i = 0$
插入w,以及b=0:
$L_{dual}(\lambda) = \frac{1}{2} \lambda_i \lambda_j y_i y_j x_{i}^T x_j + \sum_i \lambda_i - \sum_{i}\lambda_i y_i x_i \sum_j \lambda_j y_j x_j + \sum_i \lambda_i y_i b$
$\sum_{i}\lambda_i y_i x_i \sum_j \lambda_j y_j x_j = \lambda_i \lambda_j y_i y_j x_{i}^T x_j$
$\sum_i \lambda_i y_i b = 0$
所以最后:
$L_{dual} = - \frac{1}{2} \lambda_i \lambda_j y_i y_j x_{i}^T x_j + \sum_i \lambda_i$
然后最大化$L_{dual}$,得到对偶svm问题,即:
$\underset{\lambda}{\text{minimize}} - \frac{1}{2} \lambda_i \lambda_j y_i y_j x_{i}^T x_j + \sum_i \lambda_i$
$s.t. \sum_{i} \lambda_i y_i = 0$(这里是上一步求出来的)
$\lambda_i \ge 0$
理论上来说只是求得下界,但如果我们真算出来了$\lambda^{*}$,我们立刻就能发现对应的w和b也是最优值。
$w^{*} = \sum_i \lambda_i^{*} y_i x_i$
$b^{*} = (w^{*})^T x_i - y_i$(对于$\lambda_i > 0$的情况)
这个函数甚至还是二次规划,而且还是凸优化问题。
对于soft margin,只需要将式子变成:
$\underset{\lambda}{\text{minimize}} - \frac{1}{2} \lambda_i \lambda_j y_i y_j x_{i}^T x_j + \sum_i \lambda_i$
$s.t. \sum_{i} \lambda_i y_i = 0$
$0 \le \lambda_i \le C$
即为soft margin的结果。
原问题复杂度是和特征数量D挂钩的,对偶函数只和数据集大小挂钩。
而且对偶函数依赖于内积,因此可以用内核法。
决策边界很可能不是线性的
但一个观察:高维度的数据往往是线性可分的
简单的技巧:运用一系列的非线性变换将特征升维
例如:多项式、指数、对数、三角函数……
关键是不能用线性变换,不然只是特征的旋转和缩放,不能让其变得线性可分离。
注意如果我们将这个超平面投影回去,那么我们会得到一些非线性的东西。
非线性特征+线性分类器=非线性分类器!
问题:
由于我们不知道哪些非线性特征是好的特征,我们需要枚举特征。
很快就会发生指数爆炸,比如有特征是D,指数K,我们会选出$C_{D+K-1}^{K}$个新特征(这是因为原问题等价于一个带放回的组合问题)。
D=100,K=5,就会有7.5*10^7个特征了。
理论上可行,但实践起来很慢。
很多算法可以通过推导变成只和$y_i$以及内积$x_i^T x_j$有关系的式子。
输入:标签y和成对相似度度量,即NxN的矩阵K,Gram矩阵:
$K_{i,j}=x_{i}^T x_{j}$
不论每个数据点值如何,他们的内积都是标量。
如果我们有某个高维特征变换$\phi(x)$,我们可以立刻用同样的方法生成一个Gram矩阵:
$K_{i,j}=\phi(x_i)^T \phi(x_j)$
对于我们的算法而言,算法只需要某组特定的值,所以其不会去探讨矩阵K具体是如何得到的。
我们能否在不计算$\phi$的情况下,快速计算$k(x_i, x_j) = \phi(x_i)^T \phi(x_j)$?
此即内核法。
一个核函数只是一个函数,接收两个向量并返回一个实数:
$k: R^D \times R^D \Rightarrow R$
核函数有正定性,即对于任意有限向量集$x_1, ... x_N$和实数集$a_1, ... a_N$,我们有:
$\sum_{i,j} a_i a_j k(x_i, x_j) \ge 0$
成立
(也可以写成$a^T K a \ge 0$,这里的K就将是我们接下来用的Gram矩阵)
Representer Theorem
一个核函数$k(x_i, x_j)$正定,当且仅当$k(x_i, x_j)=\phi(x_i)^T \phi(x_j)$在某些特征空间$\phi(x)$中成立。
也就是说,如果核函数正定,那么一定在某个特征空间里等价于特征空间的变换。
反过来,给一个特征空间,一定能找到一个正定核。
我们原本需要算$\phi(x_i)^T \phi(x_j)$,现在我们可以用某个核函数$k(x_i, x_j)$替换
只要k正定,我们甚至不需要明确知道$\phi$是什么。
常用的核:
线性核:$k(x_i, x_j)=x_i^T x_j$,对应$\phi(x)=x$
多项式核:$k(x_i, x_j)=(1+x_i^T x_j)^p$,对应阶数为p的所有多项式变换$\phi$
高斯核:$k(x_i, x_j) = e^(-\gamma ||x_i - x_j||^2)$,与无限特征空间对应——函数空间。
对svm进行核化:
$\underset{\lambda}{\text{minimize}} - \frac{1}{2} \lambda_i \lambda_j y_i y_j x_{i}^T x_j + \sum_i \lambda_i$
$s.t. \sum_{i} \lambda_i y_i = 0$
$0 \le \lambda_i \le C$
首先,替换:
$\underset{\lambda}{\text{minimize}} - \frac{1}{2} \lambda_i \lambda_j y_i y_j \phi(x_{i})^T \phi(x_j) + \sum_i \lambda_i$
$s.t. \sum_{i} \lambda_i y_i = 0$
$0 \le \lambda_i \le C$
这个对应某个正定核:
$\underset{\lambda}{\text{minimize}} - \frac{1}{2} \lambda_i \lambda_j y_i y_j k(x_i, x_j)+ \sum_i \lambda_i$
$s.t. \sum_{i} \lambda_i y_i = 0$
$0 \le \lambda_i \le C$
我们之前有:
$w^{*} = \sum_i \lambda_i^{*} y_i x_i$
$b^{*} = (w^{*})^T x_i - y_i$
概念上讲,我们只需要进行替换:
$w^{*} = \sum_i \lambda_i^{*} y_i \phi(x_i)$
$b^{*} = (w^{*})^T \phi(x_i) - y_i$
但我们不想要$\phi$,于是代入:
$b^{*}=(\sum_j \lambda^{*}_j y_j \phi(x_j))^T \phi(x_i) - y_i = \sum_j \lambda_j^{*} y_j k(x_j, x_i) - y_i$(对于$\lambda_i >0$的任意i)
对于w,如果我们想要对一个新点x分类我们实际上不需要$w^{*}$
$h(x)=sgn((w^{*})^T \phi(x) -b^*)$
$=sgn(\sum_i \lambda^{*}_i y_i \phi(x_i))^T \phi(x) -b^*)$
$=sgn(\sum_i \lambda^{*}_i y_i k(x_i, x) -b^*)$
所以只用核就能做。
核也可以交叉验证。
神经网络
参考自生物的神经网络——大脑。
神经网络的基本单位是简单的函数,但是我们用数学函数将他们组合成网络,我们能够表达高维度、复杂的函数。
通用函数近似器,可以任意近似任何函数。
对神经网络的高层次看法
动机
人工神经网络(Artificial neural network)的动机?——Let's copy the brain!
Brain is still the only "truly" intelligent devide on earth.
我们既用生物神经网络来构建人工的神经网络,也用人工的神经网络更好的理解生物神经网络。
在自然神经网络中,我们会有电刺激的概念,在人工神经网络中,我们并不完全有,我们用函数近似这一行为。
简而言之,神经网络是强大的通用函数近似器,可以任意近似任何函数。这里的本质是我们希望近似一个能解决我们工程问题的函数。
比较
在自然神经元中,我们有一个体细胞(soma),体细胞通过树突获得之前的电刺激,并在体细胞中积累,体细胞足够兴奋后,会自我发生电刺激,并发送一个刺激给轴突,轴突通过突触传输到下一个神经元。
突触传输会有不同的权重,很多学习就是在于改变突触传输的权重达成的。
在人工神经网络中,通过一个非常粗略的方式模拟的:
我们用的不是体细胞,我们用的是求和函数($\sum$);
我们用的不是电刺激,我们用的是实数($x_i$);
我们用的权重($W_{1, j}$)对应突触(这里的自适应权重也是我们希望学习的东西);
我们没有体细胞的非线性电刺激,只好用激活函数模拟;
激活函数的输出会作为后续函数的输入。
非常粗略的近似。
总结:
人工神经网络是非常模块化的,复杂函数只需要简单的模型就可造起来,就像乐高玩具一样。
但是,非常强大的、通用的函数近似器。比如分类问题,本质上是高维高度非线性函数,通过神经网络可以逼近。
神经网络有一个自然学习算法:误差反向传播,本质还是链式法则。
主要问题:黑盒,不可解释。
深度学习本质上是人工神经网路的复兴
有一些新技巧:经典的神经网络需要你提供一些提取过的数据以学习分类器;深度学习只需要原始数据,神经网络会自动学习特征和分类器。
由于是黑盒,有很多训练技巧。
历史
最早大概在1943年提出原型。
1982年,霍普菲尔德网络。
1986,反向传播。
1989,卷积神经网络。
接下来快速增长。
人工神经网络/深度学习很擅长处理“信号”式的数据:图像、视频、音频、自然语言……
对于某一种数据类型而言,神经网络的结构都会对应调整,会有很多的试错、尝试:
多层感知机(非结构数据)
卷积神经网络(图像数据)
循环神经网络、长短期记忆(语言数据)
Transformer,更现代的长短期(语言、图像数据)
……
神经网络在结构化的数据上表现出色,但是对于非结构数据、表格,不如随机森林和支持向量机。
神经网络的基本原理
人工神经元=仿射函数(激活)+非线性函数(激活函数)
神经网络=人工神经元的计算网络
神经元
神经元是神经网络中最基本的建构方块:
$\hat y = \phi(a) = \phi(\sum_{i=1}^D w_i x_i +b)$
其中:
$x_i$:输入(特征,来自于之前的神经元的输出)
$w_i$:权重
$b$:bias
$\phi$:非线性激活函数
$a$(activation):$\sum_{i=1}^D w_i x_i +b$($w_i$是权重,$b$是bias)
$\hat y$:输出
对仿射函数的非线性函数。
bias很重要,但是扰乱了符号:我们就把b当成权重的一部分
令$x_0 =1, w_0 =b$
原式转化为:$\hat y = \phi(a) = \phi(\sum_{i=0}^D w_i x_i)$
从此之后我们都将默认b被吸纳进w中。
我们可以把神经元画成计算图的形式:
我们可能会省略a:
神经网络的基本原理就是通过组合神经元,将整个网络变大。
每个神经元都很简单,但如果组成网络,就可以用来表示复杂的函数f(x),可以是:
分类、回归、更先进的应用等等。
任何问题通常都可以被表示为函数近似。
对于分类:分类苹果和梨,本质上是像素向量到二元决策的函数。复杂函数,但是是函数。
本质上,我们只是训练神经网络上面的权重。
为什么需要非线性激活函数?
1. 线性函数往往不足以满足真实的数据集。(在svm里,我们用核函数提高了svm的性能)
2. 人工神经网络的即插即用原则:通过简单的神经元构建复杂的神经网络
然而,线性函数(线性神经元)不能满足即插即用的原则。
参数命名约定:$w_{0, 1}^{2}$ 2是层数的索引,0是来自于第一个输入,1是进入第一个神经元。这里的意思是,这个参数负责调整第二层的第0个输入,到第二层的第一个神经元中。
线性激活函数无论叠多少层的网络,都会塌缩回单层的线性激活函数。
问题:非线性函数能否拯救我们的神经网络?
单层神经元网络
我们来从单层神经元网络看起:
输入层x
隐藏层H:有H个隐藏单元,每个单元只是一个最基本的非线性神经元,每个神经元都用相同的非线性函数$\phi$,$h_i = \phi(\sum_j w_{j, i}^1 x_j$。
隐藏层可以被理解为,我们通过神经元从输入向量中提取了一些我们不知道的特征。我们只观察到了每一个数据和对应的标签,但是我们可能遗漏了某种特征。因此称为隐藏单元。
每一个隐藏层内的神经元类型是一样的。
输出层$\hat y$:线性单元,可以有多个,我们这里就假设只有一个。
通用近似定律
通用近似定理(1990年证明):任何从D维映射到O维的连续函数可以在任意紧凑集(必须是有限集,不能是负无穷到正无穷)上被许多具有非线性(非多项式)的激活函数的单层神经网络任意近似。
一个前馈网络神经网络如果具体线性输出层和至少一层具有任何一种“挤压”性质的激活函数的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维控件到另一个有限维空间的可测函数。
非线性激活函数
传统非线性激活函数:
Sigmoid:$y = \frac{1}{1+e^{-x}}$
双曲正切:$y = \frac{e^x - e^{-x}}{e^x + e^{-x}}$
现代非线性激活函数:
线性整流函数(Rectified Linear Unit, ReLU):$y=\max(0, x)$
Leaky整流(Leaky ReLU):$y=\max(\alpha x, x)$
指数整流(Exponential LU):$y = \{ \begin{array}{**lr**} x, \text{ if } x \ge 0\\ \alpha(e^x - 1), \text{ if } x<0 \end{array}$
$\alpha$是一个小常数。
现代这些函数计算成本很低,而且可以增长到无穷。
传统的函数很快就会收敛,在很大一块里导数是0。而现代函数很大一块导数非0。
梯度扩散问题:为了学习,我们需要导出权重的梯度,这需要函数的梯度,如果你用传统函数,函数的梯度很快变成0,学不到东西。
所有函数都非多项式,都可以用于神经网络。
定理不会告诉我们需要多少神经元……
对于现代的函数,我们很容易就能算出导数。
我们在这里给出两个导数:
Sigmoid:$\phi(x)=\frac{1}{1+e^{-x}}$,$\phi^{'}(x)=\frac{\partial \phi}{\partial x}=\phi(x)\phi(-x)$
ReLU:$\phi(x)=\max(0, x)$,$\phi^{'}(x)=\frac{\partial \phi}{\partial x}=one(x > 0)$
多层感知机
堆叠多个隐藏层。
使用多层的神经网络,我们能够有效的、更紧凑的逼近函数。
我们还会引入多层感知机所需要的向量和矩阵表示。
我们可以将一层的输出当作一组输入给下一层的神经元。
最后我们就会产生多层前馈神经网络/多层感知机(MLP)。
一层MLP就是普通的单层神经网络。
第一层的神经元个数$H_1$,第二层的神经元个数$H_2$。
不同层神经元数量可以不一样,神经元种类也可以不一样。
第一层的神经元都是$\phi_1$,第二层的神经元都是$\phi_2$。
每一层拓扑结构总是一样的,有一个输入向量,产生一个新向量。
我们知道一层就已经可以近似任何函数了,为什么还需要新的呢?
浅层网络:
可以近似任何函数。
然而,可以证明,对于浅层网络,一些函数需要输入的指数级的神经元才能近似。
深度网络:
一般而言,你只需要输入的多项式级别的神经元即可。
这个情况被称为表达效率(expressive efficiency)——深层网络比浅层网络表达非线性函数更有效。
经典例子:奇偶校验,如果只用一层我们需要指数大小,用多层就只需要多项式级别的神经元。
一个直觉:非线性函数往往都比较简单,现实生活中的问题往往是比较复杂的非线性问题。如果你只用一层,那么可能会用比较多的神经元。而如果你级联简单函数,那么整个结构会很复杂,也就更可能和真实问题的情况对应。
然而,传统上来说深层的神经网络更难训练,甚至当时说“超过两层的神经网络是无法被训练的”(与sigmoid函数有关)。深度学习引入了许多技巧来真正实现多层神经网络的训练。现在,可以轻松训练几百、几千层的神经网络。
一些符号表记:
L:隐藏层层数,上述例子中为3,每一层有$H_i$个神经元(单元)。
$w_{k, j}^{i}$ i是层数的索引,k是来自于第i-1层的第k个输入,j是进入第i层的第j个神经元。这里的意思是,这个参数负责调整第i-1层的第k个输入,到第i层的第j个神经元中。(需要注意的是第0层到第1层一般会有dummy 1,但是第1层到第2层可能没有)
定义第i层对于第j个神经元所有权重的向量:$w_j^i = (w_{0, j}^i, w_{1, j}^i, ..., w_{H_{i-1}, j}^i)^T$。
现在所有神经元本质上是在计算前一层输入的特征,但实际上对于第一层的情况也没什么特别的,我们可以定义第一层的输入为第零个隐藏层(的输出)本身。即:$H_0 = D$,$h^{0}=(1, x_1, x_2, ..., x_D)^T$
对于更高层的隐藏层,我们也可以将其神经元(的输出)写入矩阵,即$h^i = (1, h_1^i, ..., h_{H_{i}}^i)^T$。
此处有$a_{j}^{i} = \sum_{k=1}^{L_{i-1}}w_{k, j}^{i} h_{k}^{i-1}, h_{j}^{i} = \phi_{i}(a_{j}^{i})$
这里包含了bias。a是激活,h是激活函数。
前面这一项是$(w_{j}^{i})^T$和$h^{i-1}$的内积。
$a_j^i = (w_{j}^{i})^T h^{i-1}$
我们将每一层的w向量收集起来,写成矩阵:
$W^i = (w_1^i, w_2^i, ..., w_{H_{i}}^i)$(第i层的权重矩阵)
这是一个$H_{i-1} \times H_{i}$大小的矩阵,有$H_{i-1}$行,$H_{i}$列。
同样,我们收集$a^i = (a_1^i, a_2^i, ..., a_{H_{i}}^i)$为向量。
然后我们就可以写成矩阵乘法的形式了:
$a^i = (W^i)^T h^{i-1}$($H_{i} \times H_{i-1}$ 和 $H_{i-1} \times 1$的矩阵)
$h^i = \phi_i (a^i)$
非常规则的结构
接受输入,矩阵乘法,非线性函数,输出到下一层。
最后一层的矩阵是$H_{L} \times O$的矩阵(在这里O=1,当然O也可以>1)。
三个隐藏层神经网络,写成一行。
反向传播
为了学习神经网络,我们会定义一个损失函数,表示网络应该学习的内容。
对于回归,我们将使用MSE作为损失函数。
对于分类,我们用交叉熵作为损失函数。
通过梯度下降进行学习。
为了计算整个神经网络的梯度,我们需要用到一种被称为反向传播的优雅算法。
神经网络可能会有几千、几百万个参数。
我们怎么学习?
原则上使用梯度下降。
1. 初始化参数
2. 重复直到收敛:
2.1 计算训练集上的损失(用来评估预测的质量)
2.2 稍微改变参数值以减小损失
损失函数
令$W^1, W^2,...$为神经网络需要学习的所有参数。
我们假设将所有参数收集在一个长向量w里。
让$\hat y = f(x, w)$表示对于输入x和参数w的输出。
损失(风险、代价)$L(y, \hat y)$衡量我们的(某一个)预测有多么接近真实标签y。
训练损失$L_{train} = \frac{1}{N} \sum_{i=1}^N L(y_i, f(x_i, w))$,整体损失就是平均损失。
我们的问题本质上是$\min_{W} L_{train}$
回归
$L(y, \hat y) = (\hat y - y)^2$
为了学习,我们需要对预测的导数:$\frac{\partial L(y, \hat y)}{\hat y}=2(\hat y - y)$
$L_{train} = MSE = \frac{1}{N} \sum_{i=1}^N (\hat y_i - y_i)^2 = \frac{1}{N} \sum_{i=1}^N (f(x_i, w)-y_i)^2$。
分类
令C为我们需要进行分类的类别数。我们要用C个隐藏线性神经元作为最后的输出。
softmax activation:
本质上只是将任意输入向量转化为一个正的概率分布
比如说在这里我们最后有一个C维的向量h
$softmax(h)=(\hat y_1, \hat y_2, ..., \hat y_C)^T$
$\hat y_i = \frac{e^{h_{i}}}{\sum_c e^{h_{c}}}$
h也被称作softmax的logits。
交叉熵
分类问题的一般损失函数
令C为类别数,$h^L=(h_1^L, h_2^L, ..., h_C^L)$为最后一层的输出。
$\hat y=softmax(h^L)$,$\hat y$会是一个在类上的概率分布。
交叉熵是真实类别的负对数概率。
针对一个数据的损失函数$L(y, \hat y) = CE(y, \hat y, w) = -\sum_{c} one(y=c) \log \hat y_c$(如果不是对应的类别,就是0,否则就是$-\log \hat y_c$(或者写成$- \log \hat y_y$)。
Training loss就还是平均:
$L_{train} = \frac{1}{N} \sum_{i=1}^N CE(y_i, \hat y, w)$
对于交叉熵,我们也需要交叉熵相对logits的导数。
令$h = (h_1, ..., h_C)$为最后一个隐藏层的输出(logits)。
我们需要交叉熵的导数以进行学习:
$\frac{\partial CE}{\partial h_j} = \{ \begin{array}{**lr**} \hat y_j -1, \text{ if } j=y\\ \hat y_j, \text{ if } j \neq y \end{array}$
输入:神经网络架构
训练数据集
最大训练epoch(迭代次数)
步长$n_k$
输出:神经网络参数w
(注意这里的粗体$\hat y$意味着可以是一个向量,比如分类的情况)
最后一步是对w求的梯度。(应该是对的,不过,为什么?)
不能期望损失函数是凸的,局部最小值也不错,不用太担心。
现在问题是,一切都需要计算$\nabla_w L_{train} = (\frac{\partial L_{train}}{\partial w_1}, \frac{\partial L_{train}}{\partial w_2}, ...)^T$
一个很基础的观察:
$\nabla_w L_{train} = \nabla_w \frac{1}{N} \sum_{i=1}^N L(y_i, \hat y_i) = \frac{1}{N} \nabla_w L(y_i, \hat y_i)$(最后一步是求导的线性性,此外$\sum$本身只是对损失函数的和,会得到一个实数值,没什么特别的)
通过简化,我们将原本计算整个training loss对整体的梯度简化成了计算单个损失函数对一个样本的梯度。
关键问题:如何计算单个样本的梯度?
学习:反向传播
假设我们有一个神经网络,如果我们逐层从前往后利用神经元产生最终结果$\hat y$(前馈评估),我们会有一个对应的损失。
反向传播实际上刚好相反,逐层从后往前传播,对每个参数产生对应的损失函数的梯度。
并不特别恰当的比喻:整个过程有点类似公司的运作过程。决策层会参考下属意见,如果决策层最后错了,就会对应调整参考意见的具体情况。
反向传播本质只是链式法则+bookkeeping。
由于神经网络是函数的嵌套,我们在这里学习一下嵌套函数怎么求导:
$f(x) = f(g(x), h(x))$
$\frac{\partial f}{\partial x}=\frac{\partial f}{\partial g}\frac{\partial g}{\partial x}+\frac{\partial f}{\partial h}\frac{\partial h}{\partial x}$
证明:
根据全微分,有:
$\mathrm{d}{f} = \frac{\partial f}{\partial g} \,\mathrm{d}{g} + \frac{\partial f}{\partial h} \,\mathrm{d}{h}$
而由于f和g都是关于x的函数,所以有:
$\mathrm{d}{g} = \frac{\partial g}{\partial x} \,\mathrm{d}{x}$、$\mathrm{d}{h} = \frac{\partial h}{\partial x} \,\mathrm{d}{x}$
代入,得到:
$\mathrm{d}{f} = \frac{\partial f}{\partial g} \frac{\partial g}{\partial x} \,\mathrm{d}{x} + \frac{\partial f}{\partial h} \frac{\partial h}{\partial x} \,\mathrm{d}{x}$
左右同除$\mathrm{d}{x}$:
$\frac{\partial f}{\partial x}=\frac{\partial f}{\partial g}\frac{\partial g}{\partial x}+\frac{\partial f}{\partial h}\frac{\partial h}{\partial x}$
(求结果时,“箭头”往后走)
(求导时,“箭头”往前走)
简单神经网络上的反向传播:
在做真正的反向传播——求损失函数对所有参数的梯度之前,我们先求一下损失函数对每个部分的偏导数:
$\frac{\partial L}{\partial \hat y} = B_1$(B is bookkeeping,通过前面的推导我们很容易就知道,比如说对回归的MSE和分类的交叉熵这一步的导数是什么)
$\frac{\partial L}{\partial h_i} = \frac{\partial L}{\partial \hat y}\frac{\partial \hat y}{\partial y_i}=B_1 w_{i, 1}^2=B_{2, i}$(链式法则,传导到第二层的信息)
$\frac{\partial L}{\partial a_i} = \frac{\partial L}{\partial h_i}\frac{\partial h_i}{\partial a_i}=B_{2, i} \phi_1^{'} (a_i) = B_{3, i}$(链式法则,非线性激活函数直接求导封闭解即可)
不过我们还没解决问题——对权重的梯度呢?
实际上很简单。
$\frac{\partial L}{\partial w_{i, 1}^{2}} = \frac{\partial L}{\partial \hat y}\frac{\partial L}{\partial w_{i, 1}^{2}}=B_1 h_1$(从后往前看,w只会对求和出$\hat y$的地方以及之后有影响,链式法则,对h的导数w,对w的导数自然是h)
对权重的梯度只是前向信息和后向传播信息在边上的乘积。
对于最前面的梯度同样也是如此:
$\frac{\partial L}{\partial w_{i, 1}^{1}} = \frac{\partial L}{\partial a_i}\frac{\partial a_i}{\partial w_{i, 1}^{1}}=B_{3, j}x_i$
我们可以把激活函数缩回单个节点:
$\frac{\partial L}{\partial \hat y_i} = B_{i}^{(4)}$(对于第四层,上标是第四层)
$\frac{\partial L}{\partial w_{i, j}^{4}} = \frac{\partial L}{partial \hat y_j}\frac{\partial \hat y_j}{partial \hat \partial w_{i, j}^{4}}=B_{j}^{(4)}h_i^{(3)}$(第三层节点的结果乘上第四层对应节点向后的结果)
$\frac{\partial L}{\partial h_{i}^{(3)}} = \sum_{j}\frac{\partial L}{partial \hat y_j}\frac{\partial \hat y_j}{partial h_{i}^{(3)}}=\sum_{j}B_{j}^{(4)}w_{i,j}^{(4)} = B_{i}^{(3)}$(损失函数对第三层某个节点的导数等价于所有从后往前导数的和,参见前边的推导,例如这里到$h_1^{(3)}$的结果就是$B_{1}^{(4)}w_{1, 1}^{(4)} + B_{2}^{(4)}w_{1, 2}^{(4)}+...$)
$\frac{\partial L}{\partial a_{i}^{(3)}} = \phi_{3}^{'}(a_{i}^{(3)})\frac{\partial L}{\partial h_{i}^{(3)}}=\phi_{3}^{'}(a_{i}^{(3)})B_{i}^{(3)}=(B^{'})_{i}^{(3)}$(虽然这里没再显式列出激活)
$\frac{\partial L}{\partial w_{i,j}^{(3)}}=\frac{\partial L}{\partial a_{j}^{(3)}}\frac{\partial a_{i}^{(3)}}{\partial w_{i,j}^{(3)}}=(B^{'})_{j}^{(3)}h_{i}^{(2)}$(同上不过这里变成了激活对w的求导)
后面的就都一样了。
损失函数告诉我们做的怎么样,一开始损失会很糟糕,但是当我们调整参数,损失会很快减少。
神经网络的训练技术
数据归一化
在训练前,将数据归一化:
一些数据可能以毫米为单位,二其他特征可能以千米为单位。
假设我们有NxD的数据矩阵。令X第j行(原文如此,应为列)为$x_j$
zero-mean-unit-variance(零均值归一化):
$x_j = \frac{x_j -mean(x_j)}{std(x_j)}$(变换后均值为0,单位方差为1)
Min-max normalization(最小最大归一化):
$x_j = \frac{x_j - \min(x_j)}{\max(x_j) - \min(x_j)}$(变换后最小值为0,最大值为1)
或者可以再移动0.5,整个公式变成:
$x_j = \frac{x_j - \min(x_j)}{\max(x_j) - \min(x_j)} -0.5$
很难知道哪种归一化好用,最好都试一下。
随机梯度下降
随机梯度下降(stochastic gradient descent)
我们想计算$\nabla_w L_{train}$,上次我们已经知道这是$\nabla_w \frac{1}{N} \sum_{i=1}^N L(y_i, \hat y_i)$(每个样本的平均梯度)。
我们每次要对所有样本全都扫一遍,才能进行一次更新。
看起来效率很低,由于数据冗余确实容易很低——样本可能比较相似。
让我们快速更新:
我们在每一轮epoch更新开始时,我们不再扫整个数据集,而是将训练集打乱并切成若干个大小为B的子batch(不过整个epoch还是包含所有子batch)。
我们不再在每个epoch里计算$\nabla_w L_{train}$,而是扫描子batch,每个子batch计算$L_{batch}=\frac{1}{B} \sum_{i=1}^{B} L(y_i, \hat y_i)$和对应的$\nabla_w L_{batch}$。
在做完每个子batch后,立刻对梯度进行更新$w = w-\eta_k \nabla_w L_{batch}$。
每个子batch是训练集的无偏带噪样本。所以梯度也是无偏带噪梯度。
此外,如果我们保证$\sum_{k} \eta_{k} = \inf$但是$\sum_{k} \eta_{k}^2 < \inf$(此处k为epoch个数),那么SGD可以保证一定会收敛到某一局部最小值处。
SGD容易和原本的梯度下降(batch gradient descent)搞混。因为原本的会过所有子batch。
Momentum
梯度下降本质上有点类似雪球向下滚。
物理学:你在位置w,你的速度是$\eta \nabla_w L$。
由于你没有质量,没有动量,会有“颤动”,会让整个下降过程在不稳定的轨道上。
通过包含一个两个位置之间的平均值,我们可以让整个轨迹更平滑。
自适应步长
$\nabla_w L$总是最陡的下降方向(总是能最快的接近局部最小值)。
此外,假设$A$为一正定矩阵,$A \nabla_w L$也是一个最陡下降方向的向量。
允许对每个参数使用不同的步长。
过拟合
阻止过拟合,阻止过度学习训练集。
早期停止
我们想要一个较小的validation error(因为test error没法动)。挑validation error最好的模型。
1. 记录最小validation error的模型。
2. 如果过K个epoch后依然validation不下降,停止训练。
epoch现在也像一个超参数了。
Reguarization
我们已经见过了线性回归中的regularization,我们现在将用几乎一样的方法。
我们想要惩罚复杂的模型:
$L_{train} = \frac{1}{N} \sum_{i=1}^{N} L(y_i, \hat y_i)+\lambda R(w)$,其中R是一个正则化项。
可选:L1范数或者L2范数。
regularization使得函数更简单,避免过度拟合。
Dropout
随机丢弃一些输入或者神经元。
将每个神经元乘以独立的伯努利变量。
避免共同拟合(神经元依赖的情况下总获得一样的结果)。
或者也可以看成隐式的模型集成。
丢失的机率是超参数。需要在最后用逆向的结果补偿。
可能对某些评估结果无效。
Batch normalization
我们前面对输入进行了归一化。
Batch normalization对神经元的结果做归一化。
在每一个batch中对神经元的结果做归一化(使用均值和方差的估计)。
需要以一个仿射函数进行补偿。
卷积神经网络
信号数据:图片、声音、语言
高维度,局部强相关
标准滤波操作
信号数据
图像:本质上是二维数据,可以用二维矩阵+每个像素有一个值
声音:记录每个声音的幅度
这类信号数据往往维度很高,有比较强的(时间/空间)局部相关性。由特定模式决定。
在多层感知机中,这种局部相关性本质上不会被体现出来。即便我们将数据全部打乱,用打乱顺序的数据进行训练,也会得到差不多的网络。多层感知机中这种局部相关性没有得到直接的尊重。
“并不是为其量身定制的”
归纳偏置
在理论上,多层感知机可以逼近任意函数。他们是多面手,但并非专家。特别是不擅长“领域知识”,比如有局部相关性的数据。
……我们也许可以设计一种能够反应这种相关性的结构。而设计能反映这种相关性结构的一般原则被称为归纳偏置(Inductive bias)。如果我们将机器学习设置为专门适合某一方面的学习,就称为归纳偏置。
卷积神经网络就是专门用于信号类数据。
信号数据的好归纳偏置是什么?
卷积
卷积本质上是信号处理中的标准滤波操作。
考虑我们有输入信号$x[n]$,其中n是离散时间索引。
我们有要训练的参数,滤波脉冲响应参数$w[n]$。
卷积操作定义为:
$y[n] = (x*w)[n] = \sum_{k=-\inf}^{\inf} x[k]w[n-k]$
卷积操作是将滤波器的位置移动到对应第n个输出的位置,同时翻转时间,再使之后的响应参数与输入信号做内积。
$y[2]=x[0]h[2]+x[1]h[1]+x[2]h[0]$
与cross-correlation类似。
$y[n] = (x \star w)[n] = \sum_{k=-\inf}^{\inf} x[k]w[n+k]$
很显然,这里就是通过某种方式将w(模式)进行了一定的移动再取内积,是模式检测器。
多层感知机的每一个神经元都会检测整个输入中存在的模式,我们不想要这样。
与之相比,卷积神经网络的每一个神经元只会检查一部分,这被称为其感受野(receptive field)。同样,每一个神经元神经元也有若干权重,每一层神经元依然相同。
我们举一个例子:
$w_1=1, w_2=-1, w_3=1, w_4=-1$。
这里是检测“高低高低”。卷积神经网络中每一层都会像这种本地模式检测器一样做卷积。
在MLP中,我们要学习30个参数,而且不能保证locality。在卷积神经网络中,我们只需要学习4个参数,而且能够保证locality。
二维卷积
本质上与一维卷积一致。
考虑$x[i, j]$为一二维图像。
让$w[i, j]$为二维滤波器(filter、window、kernel,注意与svm的kernel很不一样)。
假设K为奇数,$w[i, j]$定义在$- \lfloor \frac{K}{2} \rfloor \le i, j \le \lfloor \frac{K}{2} \rfloor$上。
$y[i, j] = (x \star w)[i, j] = \sum_{l=-\lfloor \frac{K}{2} \rfloor}^{\lfloor \frac{K}{2} \rfloor} \sum_{k=-\lfloor \frac{K}{2} \rfloor}^{\lfloor \frac{K}{2} \rfloor} x[i+k, j+l]w[k, l]$。
查看某个子矩阵,并取内积。
对于卷积神经网络的学习过程,我们实际上就是要学这些参数。而对于图像处理,我们就是已经知道这些参数是什么了。
卷积层
每个图像由宽高组成,其中对于每一块还会有若干个通道值,所以总共一张图有$h^0=W^0 \times H^0 \times C^0$的尺寸(被称为特征图)。
卷积网络和多层感知机一样,以层进行工作。
我们使用一个卷积核(滤波器),张量(维度)为$K^1 \times K^1 \times C^0$(所有通道一个卷积核,或者每个通道上的矩阵对应一个矩阵卷积核)。
对图像的每个通道进行2d卷积:
$b+\sum_{c=1}^{C^{0}} x_{::c} \star W_{::c}$(b还是偏差项)
通过卷积后,我们会得到一个$28 \times 28$的新层(由于卷积核宽度为5导致的,每边会有两个pixel被切掉)。
我们可以再用另外不同的卷积核再生成更多个新层。
我们可以假设我们最后生成了$C^1$个新层(此处$C^1$为超参数)。通过堆叠,我们一共能获得一张$h^1 = W^1 \times H^1 \times C^1$的新特征图。
(此处为$28 \times 28 \times 6)。
每个通道的层是由每个卷积核生成的。故我们一共有$6 \times (5 \times 5 \times 3 +1)=456$个训练参数。
我们可以将第一层用到的所有卷积核打包成一个$K^1 \times K^1 \times C^0 \times C^1$的张量(数组),称为$W^1$。所有偏置项打包成一个宽度为$C^1$的向量$b^1$。
严格说来,我们是有:$h_{::d}^1 = b_d^1 + \sum_{c=1}^{C^{0}} h_{::c} \star W_{::cd}^1$。(注意是每一轮卷积完了之后只做一次偏差,如果对每个位置引入不同偏移,就违反了卷积最初的空间平移性质了——没有人会考虑平移前后不同的情况吧。)
此处d对应第d个卷积核。c为第c个输入通道。
我们称这个卷积为$5 \times 5 \times 6$($K^1 \times K^1 \times C^1$)卷积,整个称为一个$5 \times 5 \times 6$的卷积层(输入层数一般会省略,因为无论如何都是给定的)。
做完卷积后,别忘了我们是在神经网络上做学习,所以要对每个元素套一个非线性函数。由于是对每个值做,会保证还是原本维度的图。
我们可以重复再做第二个完整的卷积层。比如,我们可以将$28 \times 28 \times 6$的特征图卷积成新的$24 \times 24 \times 8$的特征图。(会有一个$5 \times 5 \times 6 \times 8$的卷积核数组和一个长度为8的偏置向量)
零填充
对特征图做卷积会缩小尺寸。如果我们想要避免这种情况,可以对输入进行零填充。
假设对矩阵的卷积核尺寸为奇数,只需要在每边填充$\lfloor \frac{K}{2} \rfloor$个pixel(0)就可以使得卷积前后尺寸一样。
(此处k=3,故左右,上下两边各填充一层)
我们是否应该进行零填充?
设计上的问题
卷积网络的理念:通过原图产生更多抽象的特征图。
较低层捕捉低级特征,比如边,较高层捕捉高级特征,比如图片的含义。
如果我们不做填充,本质上我们只是在减少特征图的大小,在压缩信息,可能是好事。但是我们会需要保存所有的抽象图的特征信息,实现上会比较复杂。
所以一般会做零填充,保证维度。不过减少特征是好事,但是人们往往不会用这样的方法,而是会做池化。
池化
池化,或下采样,和卷积差不多,我们会用一个滑动的窗口。不过池化不会像卷积那样做线性累加,而是通过某种方法将值“聚合”成单个值。
最常用的包括最大化函数(最大池化)或者取平均值(平均池化)。
池化有超参数窗口大小$K_p$和步幅大小$S_p$。
池化会对每个通道都做一遍。
向右移动两格:
向下移动两格:
最大池化的例子。
我们现在已经讨论了卷积层和池化层。
卷积层:让我们得到越来越多的抽象特征。
池化层:下采样,减少采样特征。
但为了做机器学习,我们需要某种向量特征。
我们只需要将特征图(三维张量)展开成向量即可。我们可能会对这个展开的向量再做多层感知机,这被称为全连接层。
卷积神经网络的学习
如何设计?——实验
GoogleNet
ResNet
DenseNet
再次讨论归纳偏置
我们现在对卷积网络实现的归纳偏置进行总结:
locality:每个神经元只看当前卷积核内的情况。邻近的神经元因此会查看相交的感受野,故保证了局部相关性。
权重分享:每一个卷积核内的权重是共享的,使得特征对位置不太敏感。
池化:池化增加了平移不变性。
每一个卷积核内的权重是共享的的确总体上而言使得性能没那么好,但是比较一般的卷积网络就会有几百层了,对应多层感知机里的几百个神经元。
结构
卷积神经网络的许多结构来自于后验的实验。所以相关研究论文通常将新结构以紧凑的方式进行介绍。
最左侧:$h^0$,输入层。
6x+ReLU:$h^1$,第一层,5x5的卷积核(6输出层/通道)+ReLU。
12x+ReLU:$h^2$,第二层,5x5的卷积核(12输出层/通道)+ReLU。
12x+ReLU:$h^3$,第三层,5x5的卷积核(12输出层/通道)+ReLU。
全连接层:$h^4$,第四层,先做扁平化,然后通过256个神经元做多层感知机。
最右:输出,第五层,10个带softmax的神经元。
可以有池化层:
GoogleNet
有并行处理部分。通过多次调取值使得较前的结构也能获得强大的训练信号。
残差网络(ResNet)
恒等函数加上一些残差(网络会学到一些此前估计值与当前值之间的差值)。
DenseNet:
每一个密集块中连续多次调用此前卷积层的结果。
一些结果比较:https://paperswithcode.com/task/image-classification
解释卷积神经网络
解释卷积神经网络到底学到了什么。
在比较低级的层学到的是比较低级的东西:边、区域……
第三层就已经有一定意义的特征了。
这与大脑的情况类似。大脑的V1层也会对边缘进行反馈。
池化——抑制、竞争的细胞系统。但说实话,这部分还要保留,还有很多问题有待研究。
端到端学习
卷积层、池化层……堆叠起来的网络。
在顶部会回到全连接层(多层感知机)。
底层的像是特征提取器,而上层的全连接层比较像预测器。
端到端的直接训练与传统的机器视觉方法之间有很大的区别。在传统的计算机视觉中,人们使用预先了解的知识设计特征,并在此之上训练分类器。
在端到端中,特征提取和预测是一同端到端学习的。这也是深度学习的一大部分。
我们如何怎么学习的
反向传播。不过与多层感知机相比,现在的训练其实十分复杂。
使用pytorch或者tensorflow,就能训练卷积神经网络了。特别具体的原理十分复杂。而因此优化也十分复杂。
原理上是如何运行的:
在理论上,与多层感知机一样。在实践中并不如此,不过有利于我们理解。
卷积作为矩阵乘法
Toeplitz矩阵的乘法。
记得检查乘法结果和矩阵乘法结果是否匹配。
卷积神经网络中会有这种阶梯形状的矩阵以及大量0。
在全连接层中,我们有$y=Wx$。我们上面有了一个卷积矩阵了。同样对x做,两者结果都只是矩阵乘法。
二者的区别:在全连接层中,矩阵完全没有限制。在卷积层而言,有结构,而且可以看到其中有很多参数是共享的(比如$w_1$、$w_2$在多行中出现了多次)和稀疏区域。
我们可以像全连接层中的矩阵一样用反向传播学习Toeplitz矩阵。
最大的问题就是这里矩阵的结构。
对于0的区域,永远不更新。
对于共享的权重,我们先考虑不共享的权重w……
对于一个权重而言,它永远是获得隐藏层的一些输入,相乘,并将结果输入到激活单元(求和)中。
根据链式法则,我们知道损失函数对w的损失是$\frac{\partial L}{\partial w} = \frac{\partial L}{\partial \sum}\frac{\partial \sum}{\partial w} = \frac{\partial L}{\partial \sum}h$,其中L是损失函数。
后向信息我们其实是知道的。
那么对于共享的参数呢?
对于共享的权重,实际上只是多了一条路径。
$\frac{\partial L}{\partial w} = \frac{\partial L}{\partial \sum}\frac{\partial \sum}{\partial w}+\frac{\partial L}{\partial \sum^{'}}\frac{\partial \sum^{'}}{\partial w} = \frac{\partial L}{\partial \sum}h+\frac{\partial L}{\partial \sum^{'}}h^{'}$。
这个性质可以进一步扩展。
通过这个方法就可以更新Toeplitz矩阵了。
推荐系统
如果我们只有数据,没有标签呢?
检测模式
只推荐最火的电影可能并不是很好的策略……
列选择+行选择
如果一个值在模式上对应的行列处,那么应该会有对应值。
这里的列选择和行选择本质上是矩阵的乘积。
外积形式
合并之后的外积形式
我们找到了一个能够拟合我们现在矩阵的更低维度的矩阵。
r阶矩阵分解问题
给一个数据矩阵$D \in R^{n \times d}$和秩$r < \min (n, d)$(注意,这个秩不是D的秩,而是X和Y的秩!)
求:矩阵$X \in R^{d \times r}$和矩阵$Y \in R^{n \times r}$,满足:
$\min_{X, Y} ||D-YX^T||^2$ $s.t. X \in R^{d \times r}, Y \in R^{n \times r}$
如果我们想要近似什么,就可以考虑走L2范数。
可以证明这个问题是非凸的:取到最小值的集合是非凸的。
我们找到拟合最好的那些点一定都满足$x_1 x_2 =1$。
在这里,我们连接两点后,函数结果应该小于等于0(根据凸性的定义),这里显然并非如此。
既然这个问题非凸,是否意味着我们只能找到局部最小值,找不到全局最小值呢?
全局最小值可以用奇异值分解求到。
奇异值分解求解
若有$D=U \Sigma V^T \in R^{n \times d}$是D的奇异值分解,则矩阵分解的全局最小值问题:
$\min_{X, Y} ||D-YX^T||^2$ $s.t. X \in R^{d \times r}, Y \in R^{n \times r}$
会有以下性质:
$YX^T = U_{·R}\Sigma_{RR} V_{·R}^T$,其中$R=\{1, ..., r\}$,$\Sigma{RR}$是D的奇异值分解前r位。
可以证明向量的L2范数、矩阵的L2范数和算子范数下乘以正交矩阵($U U^T = I$,注意不是正定矩阵)结果不变。
$||A \vec v||^2 = (Av)^T Av = v^T A^T A v = v^T v = ||v||^2$
$||AX||^2 = tr((AX)^T AX) = tr(X^T A^T AX)=tr(X^T X) = ||X||^2$
$||AX||_{op} = \max_{\vec{y}:\lVert\vec{y}\rVert=1}\lVert AX\vec{y}\rVert = \max_{\vec{y}:\lVert\vec{y}\rVert=1}\lVert X\vec{y}\rVert = ||X||_{op}$(算子范数是指$||A||= \sup_{||x|| =1}||Ax||$,即A作用于单位变量x之后,在某一范数下最大的长度,其实这里证明是有点问题的,因为第二步引用的上面L2的结果,但技术上来说算子范数的范数可以不是L2)
根据第二条,U和V都是正交矩阵,所以乘完之后结果不变。
乘完之后,结果会有:
$\min_{X, Y} ||\Sigma-U^T YX^T V||^2$
会有一个奇异值对角矩阵。
然后后面是$U^T Y \in R^{n \times r}$,尝试拟合前r个最大的奇异值。(这里只说明了矩阵乘完只能够近似前r个奇异值以及这是最好结果,但其实并没有解释为什么)
这确实用低维度的东西表示了高维度的东西。
矩阵补全
但是如果我们要做SVD,我们必须填好值。
以平均值补全我们不知道的值。
接着可以做SVD,将其分解成两个矩阵:
我们在这里找到了两个模式,用一个秩为2的小矩阵去近似了右侧的大矩阵。
以第一个为例,第一个模式代表了四个电影都不喜欢的模式。第二个模式代表喜欢第一个和第二个电影,但不喜欢第三和第四个电影。但这里解释起来非常麻烦。
如果矩阵是稀疏矩阵(即只有很少电影的结果出现),我们该怎么处理?
我们用平均值很明显不太合适了……反过来我们会认为那些确实不是平均值的电影是噪声。
只用观测到的值进行近似。
给定数据集$D \in R^{n \times d}$,观察到的数据$D_{i,k}$,其中$(i,k)\in\mathcal{O}\subseteq \{1,\ldots,n\}\times \{1,\ldots d\}$,以及X和Y的阶数$r < \min \{n, d \}$。求矩阵$X \in R^{d \times r}$和矩阵$Y \in R^{n \times r}$,二者乘积近似于观察到的矩阵数据,即
$\min_{X,Y} \lVert \mathbb{1}_{\mathcal{O}}\circ(D- YX^\top)\rVert^2 =\sum_{(i,k)\in\mathcal{O}}(D_{ik}-Y_{i\cdot}X_{k\cdot}^\top)^2$
$\text{s.t. } X\in \mathbb{R}^{d\times r}, Y\in\mathbb{R}^{n\times r}$
其中$\mathbb{1}_{\mathcal{O}}$是一指示函数,$\circ$为阿达玛乘积(逐项乘积)。
我们一般会将阈值(threshhold)设置为μ,即只要最后矩阵里的值超过了μ,我们就会向用户推荐。
找到数据的低维表示
假设我们有Iris数据集——一种辨识花的数据集
(上到下:山鸢尾、变色鸢尾、维吉尼亚鸢尾)
(萼片长度、大小,花瓣长度、大小)
第一步:可视化数据集
我们能否只通过一部分参数就训练出一个不错的分类器出来?
也可以产生我们自己的新参数:
如何产生好的低维度新数据?如何产生好的可视化?
找到方差(variance)大的特征值,并通过线性组合产生新的新数据。
问题的正式定义
给数据集$D \in R^{n \times d}$,假设特征值的名字是$F_1, ..., F_d$,我们定义一个新的特征值为$F_{d+1} = \sum_{k=1}^{d} \alpha_{k} F_{k}$。
对于这个新特征,我们同样有n次观察后组合的数据,即:
$D_{·, d+1} = \sum_{k=1}^{d} \alpha_{k} D_{·k} = D \alpha \in R^{n}$(最后这个D不包含多出来的这一列)
如果我们想求方差,首先我们需要平均值。
$\mu_{F_{d+1}} = \frac{1}{n} \sum_{i=1}^{n} D_{id+1} = \mu_F^T \alpha$
同样,其中$\mu_{F}$是之前每一列的平均值。
现在我们可以算新特征值的方差了:
$F_{d+1} = \sum_{k=1}^{d} \alpha_k F_k$,特征值平均值$\mu_{F_{d+1}} = \mu_F^T \alpha$。
样本在新特征值上的方差为:
$\sigma_{F_{d+1}}^2 = \frac{1}{n} \sum_{i=1}^{n} (D_{i,d+1} - \mu_{F_{d+1}})^2 = \frac{1}{n} ||(D-1\mu_F^T) \alpha||^2$。
我们可以称呼$D-1\mu_F^T$为中心化数据矩阵C。
我们希望最大化$\frac{1}{n} ||(D-1\mu_F^T) \alpha||^2$。
我们只需要一个方向就可以了,因为我们只要有一个方向(基本点)就可以产生所有对应的情况。我们限制向量$\alpha$的长度为1。
于是有:
$\max_{||\alpha|| = 1}\frac{1}{n} ||(D-1\mu_F^T) \alpha||^2$(operator norm)
$= \max_{||\alpha|| = 1} \frac{1}{n} \alpha^T(D-1\mu_F^T)^T (D-1\mu_F^T) \alpha$
$= \max_{||\alpha|| = 1} \frac{\alpha^T C^T C \alpha}{n}$。
其中C为$D-1\mu_F^T$,中心化数据矩阵。
于是我们通过解这个方程得到$\alpha$,就成功获得了一个$\mu_F$。但是我们希望获得若干个新特征值的方向。
我们希望找到最大方差的r个正交方向。
给数据集D和一个秩r,求r个正交的方差方向$Z_{·s}$(以列方向给出的若干向量),且这些方向满足:
$\max_{Z} tr(Z^T C^T C Z) s.t. Z \in R^{n \times r}, Z^T Z = I$。
其中C为$D-1\mu_F^T$,中心化数据矩阵。
即下面的分别加结果等价于迹(注意不完全是拼接矩阵)。
Z的结果是什么?
Z结果等价于C的奇异值分解中的右矩阵$V_{·R}$(即前R行)。
我们可以返回$CV_{·R}$(中心化的),或者$DV_{·R}$(未中心化的)。
K-Means
PCA的结果不可解释……
介绍:如何分类卡片?
花色或者大小?——对于这些数据本身,其实我们不知道哪个分类更好。
可能有不止一个解,但我们需要分析,且想要知道最合适回答我们问题的解。
随着我们对这些问题的回答不同,我们得到的聚类中心也不同。
问题与模型
我们有几个聚类?——让用户决定。
这些聚类彼此之间重叠吗?——不重叠,每个点只能属于一个聚类:
$C_s \cap C_t = \emptyset, C_1 \cup ... \cup C_r = \{1, ..., n \}$。
即$\{C_1, ..., C_r \}是\{1, ..., n\}$的一个分割。我们用$P_n$表示n个点的所有分割集(注意这里r的定义)。
这些聚类是如何决定的?——一个聚类内的点平均最近,即:
$\frac{1}{|C_s|} \sum_{i, j \in C_s} ||D_{i·} - D_{j·}||^2$
优化目标:
给一组数据$D \in R^{n \times d}$和聚类个数r(同样注意r的定义是聚类数量),求:
找到r个聚类$\{C_1, ..., C_r \} \in P_n$,使得所有聚类内的平均距离的和最小(within cluster scatter)。即:
$\min_{\{C_1, ..., C_r\} \in P_n} Dist(C_1, ..., C_r) = \sum_{s=1}^r \frac{1}{C_s} \sum_{j,i \in C_s} ||D_{j·} - D_{i·}||^2$。
优化
一般的优化方法不再适用,因为我们现在面对的是一个离散的优化问题。我们不可能计算一个分割的梯度(能否比较严格的说明一下这里梯度不存在的问题?)。
我们要对问题进行一定的转化。
可以通过数学方法证明,最小化聚类内平均距离之和等价于最小化各点到其聚类中心点的距离之和,即$\min_{\{C_1, ..., C_r\} \in P_n} Dist(C_1, ..., C_r) = \sum_{s=1}^r \frac{1}{C_s} \sum_{j,i \in C_s} ||D_{j·} - D_{i·}||^2$等价于:
$\min_{s=1}^r \sum_{i \in C_s} ||D_{i·} - X_{·s}^T||^2 s.t. X_{·s} = \frac{1}{|C_s|} \sum_{i \in C_s} D_{i·}^T, \{C_1, ..., C_r \} \in P_n$。
证明:
$Dist(\mathcal{C}_1,\ldots,\mathcal{C}_r) =\sum_{s=1}^r\frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}{\sum_{i\in\mathcal{C}_s}}\lVert {D_{i\cdot}}-D_{j\cdot}\rVert^2$
$= \sum_{s=1}^r\frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}{\sum_{i\in\mathcal{C}_s}}\left( {\lVert D_{i\cdot}\rVert^2} - 2{D_{i\cdot}}D_{j\cdot}^\top + \lVert D_{j\cdot} \rVert^2\right)$(注:内积具有对称性,即$u^T v = v^T u$,因为二者都是$\sum_{i=1}^{n} u_i v_i$,而根据二项式定理,我们可以将$||D_{i·} - D_{j·}||^2$展开为$(D_{i·}-D{j·})^T (D_{i·}-D_{j·})=||D_{i·}||^2 -2D_{i·}^T D_{j·} + ||D_{j·}||^2$,但注意矩阵乘法不满足对称性)
$= \sum_{s=1}^r\left(\frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}{\sum_{i\in\mathcal{C}_s}} {\lVert D_{i\cdot}\rVert^2} - \frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}{\sum_{i\in\mathcal{C}_s}}2{D_{i\cdot}}D_{j\cdot}^\top + \frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}{\sum_{i\in\mathcal{C}_s}}\lVert D_{j\cdot} \rVert^2\right)$(根据加法的分配律)
$\sum_{s=1}^r\left({\sum_{i\in\mathcal{C}_s}} {\lVert D_{i\cdot}\rVert^2} -2{\sum_{i\in\mathcal{C}_s} D_{i\cdot}} \frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}D_{j\cdot}^\top + \sum_{j\in\mathcal{C}_s}\lVert D_{j\cdot} \rVert^2\right)$(第一项和第三项:$\frac{1}{n} \sum_{i=1}^n 1 = 1$,第二项:加法交换律,将$D_{i·}$一样的合并到一块)
$=\sum_{s=1}^r\left(2{\sum_{i\in\mathcal{C}_s}\lVert D_{i\cdot}\rVert^2}-2{\sum_{i\in\mathcal{C}_s} D_{i\cdot}} \frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}D_{j\cdot}^\top\right)$(第一项和第三项很明显等价)
根据定义,$\frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}D_{j\cdot}^\top$等于算数中心点(假设为$X_{·s}$)。特别的,$\sum_{i\in\mathcal{C}_s}D_{i\cdot}$等价于$|C_s| X_{·s}^T$,更特别的,合并后有$\sum_{i\in\mathcal{C}_s}D_{i\cdot}X_{·s} = \sum_{i\in\mathcal{C}_s}||X_{·s}||^2$($\sum_{i\in\mathcal{C}_s} D_{i\cdot}(\frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}D_{j\cdot}^\top)= (\sum_{i\in\mathcal{C}_s} D_{i\cdot}) (\frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}D_{j\cdot}^\top) $)。
$Dist(\mathcal{C}_1,\ldots,\mathcal{C}_r) =2\sum_{s=1}^r\Biggl({\sum_{i\in\mathcal{C}_s}\lVert D_{i\cdot}\rVert^2}-\underbrace{\underbrace{{\sum_{i\in\mathcal{C}_s} D_{i\cdot}}}_{\lvert\mathcal{C}_s\rvert X_{\cdot s}^\top} \underbrace{\frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}D_{j\cdot}^\top}_{X_{\cdot s}}}_{{\sum_{i\in\mathcal{C}_s}}\lVert X_{\cdot s}\rVert^2}\Biggr)$
$=2\sum_{s=1}^r{\sum_{i\in\mathcal{C}_s}} \left({\lVert D_{i\cdot}\rVert^2}- 2{D_{i\cdot}}X_{\cdot s} +\lVert X_{\cdot s}\rVert^2\right)$(加$-\sum_{i\in\mathcal{C}_s} D_{i\cdot}(\frac{1}{|\mathcal{C}_s|}\sum_{j\in\mathcal{C}_s}D_{j\cdot}^\top)$,加$\sum_{i\in\mathcal{C}_s}||X_{·s}||^2$)
$=2\sum_{s=1}^r{\sum_{i\in\mathcal{C}_s}} \lVert {D_{i\cdot}}-X_{\cdot s}^\top\rVert^2$
整个问题转化为找到若干个聚类的中心点,使得所有属于这个类的点到中心点的距离和最小。
其中$X_{·s}$是第s个聚类内所有点的算数平均位置,即中心点。
中心点的引入使得整个问题有更好解决的子问题吗?
也许,因为我们可以在给定聚类下很快计算出聚类中心点,或是给聚类中心点很快计算出整个聚类(不过如果同时计算二者的话会比较困难)。
假设我们已经有了若干随机选择的中心点。为了最小化每个点到其聚类中心点的距离之和,我们先将所有点分给距离它最近的中心点。一旦我们有了几个聚类后,这些随机选择的中心点就不再是聚类的中心点了,故我们对这些中心点进行更新。更新后,这些点到中心点的距离变得更小了,我们又回到了最开始“若干随机选择的中心点”这一步,于是我们可以说我们成功进行了一轮优化。
于是我们就得到了KMeans算法。
我们现在有了一个针对离散数据集的算法。不过这个算法有多好?会收敛吗?是启发式还是说有严格的结果保证?
我们可以用r阶矩阵分割来保证一些结果。
评估优化
我们现在将KMeans的目标转化成一个矩阵分解问题。
令$Y \in \{0, 1\}^{n \times r}$(一个$n \times r$的矩阵,每个元素只能是0或者1),使得若$i \in C_s$,则$Y_{is}=1$。根据上面的推导,我们已经知道每个点在任何时候只属于一个聚类,即$|Y_{i \cdot}| =1, \text{ for all } i \in \{1, ..., n \}$($||$是L1范数)。
我们在这里用$\text{one}^{n\times r}=\{Y\in\{0,1\}^{n\times r}\vert |Y_{i\cdot}|=1 \text{ for } i\in\{1,\ldots,n\}\}$,代表所有可能出现的上述矩阵,即,能够分割原本所有数据点的一个矩阵,也是所有可能的KMeans中对应的矩阵。
中心点矩阵:
第s个聚类中心还可以表示为:
$X_{·s} = \frac{1}{|C_s|} \sum_{i \in C_s} D_{i·}^T$(原式)
$= \frac{1}{|Y_{·s}|} \sum_{i=1}^n Y_{is}D_{i·}^T$(被除的项刚好是第s个聚类的大小,$Y_{is}$在且仅在第i个数据属于聚类s时才为1)
$= \frac{1}{|Y_{·s}|} \sum_{i=1}^n D_{i·}^T Y_{is}$(事实上$Y_{is}$放在左边的时候一但是1会导出一个单位矩阵,放到右边反而好理解)
$= \frac{1}{|Y_{·s}|} D^T Y_{·s}$(整个式子化作矩乘,$d \times n$的矩阵和$n \times 1$的矩阵得到一个$d \times 1$的矩阵,注意d,而不是r,是特征个数)
有了这个,我们就可以将所有中心构成的矩阵X(以列形式收集每个中心)表示出来:
$X = D^T Y \begin{pmatrix} \frac{1}{\lvert Y_{\cdot 1}\rvert} & &\mathbf{0}\\ &\ddots &\\ \mathbf{0}& & \frac{1}{\lvert Y_{\cdot r}\rvert} \end{pmatrix} = D^\top Y (Y^\top Y)^{-1}$
证明:
对于$Y^\top Y$,我们先考虑结果矩阵的对角线:
由于$Y^\top$和$Y$置换矩阵,且只有0、1两种取值,故对角线上的元素等于$|Y_{·i}|$(其中i是指结果矩阵中的第i行第i列)。
对于非对角线的部分,对应部分一定是0。考虑$Y^\top$的第i行和Y的第j列,由于在Y中每一行只能有一个元素为1,对于结果矩阵中的第$(i, j)$个元素,假设我们现在在计算$Y_{i, k}^\top$和$Y_{k, j}$,如果$Y_{i, k}^\top = 1$,则$Y_{k, i}=1$,则第k行的其他元素必然全部是0。我们现在已经知道不在主对角线上,所以$i \neq j$,所以$Y_{k, j}=0$。同样,假设$Y_{k, j}=1$,则则第k行的其他元素必然全部是0,则$Y_{i, k}^\top$必然是0。由此可得$Y^\top Y = \begin{pmatrix} \lvert Y_{\cdot 1} \rvert & &\mathbf{0}\\ &\ddots &\\ \mathbf{0}& & \lvert Y_{\cdot r} \rvert \end{pmatrix}$。
可以证明,KMeans可以转化成:
$\min_Y RSS(X,Y) = \lVert D-YX^\top\rVert^2 s.t. Y\in\mathbb{1}^{n\times r}$
$X=D^\top Y (Y^\top Y)^{-1}$
其中Y是数据属于聚类的指示矩阵,X是中心以列构成的矩阵。与我们之前见到的矩阵分解类似,但我们现在要Y满足一些性质,使得整个问题变得很难。
证明:
矩阵Y是指示矩阵,对于每一个点i,都存在一个聚类index$s_i$,使得$Y_{i, s_{i}}$为1,且其他$Y_{i, s}$为0。那么我们之前证明的式子可以转化为:
$\sum_{s=1}^r}\sum_{i\in{\mathcal{C}_s}}\lVert D_{i\cdot}-X_{\cdot s}^\top\rVert^2 = \sum_{i=1}^n\sum_{s=1}^r Y_{is} \lVert D_{i\cdot}-X_{\cdot s}^\top \rVert^2 $(只是加了一堆零)
$= \sum_{i=1}^n \lVert D_{i\cdot}-X_{\cdot {s_i}}^\top \rVert^2$(其实感觉这里可以跳步……)
$= \sum_{i=1}^n \left\lVert D_{i\cdot}-\sum_{s=1}^rY_{is}X_{\cdot s}^\top\right\rVert^2$(于是就把$Y_{i,s}$放进来了)
$= \left\lVert D-\sum_{s=1}^rY_{\cdot s}X_{\cdot s}^\top\right\rVert^2$(根据矩阵假发的定义)
$= \lVert D-YX^\top\rVert^2$(根据矩阵乘法的定义)
KMeans分解:
本质上来说通过矩阵乘法,每一轮我们都会用中心去近似每个数据点。
于是对于电影推荐系统,我们现在有了一个解释性更好的结果:
因为我们现在得到的是平均值了,所以我们不可能再有超过1到5的东西。
中心值在这里就是我们找到的模式。
在这里,由于3.7高于3,我们就会推荐这部电影给用户。
我们能否像之前给r阶矩阵做分割一样,找到KMeans的全局最小值?——很不幸不行。我们只能保证得到的是局部最小值。
不过,如果我们能够固定Y和X中的一个,我们就可以有全局的最小值了。
如果我们固定了Y,就意味着,我们现在要计算的X就已经确实是当前分类情况下的最优解(最优中心)了。
此时,整个问题为:
给一个数据集$D \in R^{n \times d}$和矩阵$Y \in \{0, 1\}^{n \times r}$,最优化问题$\min_X \lVert D-YX^\top \rVert^2 \text{s.t. } X\in\mathbb{R}^{d\times r}$的全局最小值为$X=D^\top Y(Y^\top Y)^{-1}$。
我们可以证明$\min_X \lVert D-YX^\top \rVert^2 \text{s.t. } X\in\mathbb{R}^{d\times r}$是一个凸问题(与我们前面证明回归的最小残差平方和是凸问题方法类似)。然后整个问题存在对X的梯度,我们用FONC找驻点解出X的值就可以了。
证明:
如果我们固定了D和X,那么Y就只是将每个点分配给已有的X。
考虑到Y是一个0、1构成的矩阵,我们不可能有函数对Y的导数,我们能够在这种情况下找到全局最小值是很惊人的事情。
证明:
其实是贪心。展开式子:
$\min_Y\sum_{s=1}^r\sum_{i=1}^n Y_{is}\lVert D_{i\cdot} - X_{\cdot s}^\top\rVert^2$
然后如果我们要选最小的,那自然要选最贴近中心的情况。 证毕。
寻找KMeans的算法事实上运行了一种叫做“块坐标下降法”(Block-Coordinate Descent)的最小化方法。
$X_{k+1} \leftarrow \arg \min_{X\in\mathbb{R}^{d\times r}}\lVert D-Y_kX^\top\rVert^2$
$Y_{k+1} \leftarrow \arg \min_{Y\in \mathbb{1}^{n\times r}}\lVert D-YX_{k+1}^\top\rVert^2$
与坐标下降的情况类似,我们的残差平方和在每次更新中都下降,所以一定会收敛。即我们有:
$RSS(X_0,Y_0)>RSS(X_1,Y_1)>RSS(X_2,Y_2)>\ldots \geq 0$
KMeans问题是NP难的(而SVD是多项式可分解的,尽管二者都属于r阶矩阵分解问题)。
此外KMeans每一步找到的结果都是一个局部最小值。这是因为这是一个离散的最优化问题。甚至于,每个可能的结果都是局部最小值。因为,从任何一个值稍微向左右移动都会离开可行域。所以无法左右稍作移动减小函数值,于是根据定义,每个值都是局部最小值,同时也是局部最大值。
因此我们需要找到一个好点的初始值,因为我们每一步找到的都是局部最小值,我们只知道每一步我们结果都会减小,但是我们并不知道收敛时结果怎么样。
以下三个公式是等价的:
$\min_{Y}\ \sum_{s=1}^r\sum_{i=1}^nY_{is}\|D_{i\cdot}-X_{\cdot s}^\top\|^2 \text{ s.t. } X\in\mathbb{R}^{d\times r}, Y\in\mathbb{1}^{n\times r}$(同时进行两个的最小化,此时两个矩阵都不知道,从此我们想出了KMeans算法的本体)
$\min_{Y}\ \|D-YX^\top\|^2 \text{ s.t. } X= D^\top Y(Y^\top Y)^{-1}, Y\in\mathbb{1}^{n\times r}$(r阶矩阵分解,有Y,要算聚类中心X)
$\min_{Y,X}\ \|D-YX^\top\|^2 \text{ s.t. } X\in\mathbb{R}^{d\times r},Y\in\mathbb{1}^{n\times r}$(有聚类中心X,要算Y)