主要从Hinge Loss 和 Kernel Method 入门介绍SVM
Hinge Loss : 从平方损失Square Loss角度来说,对于分类问题不是很好的损失函数,然后和交叉熵损失Cross Entropy Loss做笔记,其实Hinge Loss就是Cross Entropy Loss的鲁棒表示。
Kernel Method:这一过程就是输入 x x x,输出 ϕ ( x ) \phi(x) ϕ(x)。然后在高维空间做内积,即 K ( x , z ) = ϕ ( x ) ⋅ ϕ ( z ) K(x, z)=\phi(x) \cdot \phi(z) K(x,z)=ϕ(x)⋅ϕ(z)。而我们知道,在高维空间做内积可能运算量是巨大的。然后又发现高维空间内积的形式其实可以在低维空间中表示。
pdf 视频
下面先来说下 Hinge Loss 是什么。
Binary Classification
对于经典的而分类问题,之前已经提到可以使用逻辑回归解决,之前label使用0和1标记。现在label用-1和1来标记。
同样,分3步骤:设计模型 Function set(Model) 损失函数 找最好的模型(训练)
• Step 1: Function set (Model)
理想的模型输出:
g
(
x
)
=
f
(
x
)
>
0
Output
=
+
1
f
(
x
)
<
0
Output
=
−
1
g(x)=\begin{array}{ll} f(x)>0 & \text { Output }=+1 \\ f(x)<0 & \text { Output }=-1 \end{array}
g(x)=f(x)>0f(x)<0 Output =+1 Output =−1
• Step 2: Loss function
假设直接使用:
L
(
f
)
=
∑
n
δ
(
g
(
x
n
)
≠
y
^
n
)
L(f)=\sum_{n} \delta\left(g\left(x^{n}\right) \neq \hat{y}^{n}\right)
L(f)=n∑δ(g(xn)=y^n)
其中
δ
\delta
δ是信号函数,表示g在training set上放了多少次错,但是它是没办法微分的,没法在第3步使用GD求解。
换一个近似的:
L ( f ) = ∑ n l ( f ( x n ) , y ^ n ) L(f)=\sum_{n} l\left(f\left(x^{n}\right), \hat{y}^{n}\right) L(f)=n∑l(f(xn),y^n)
函数分析:
可以看到,
L
(
f
)
=
∑
n
δ
(
g
(
x
n
)
≠
y
^
n
)
L(f)=\sum_{n} \delta\left(g\left(x^{n}\right) \neq \hat{y}^{n}\right)
L(f)=∑nδ(g(xn)=y^n)就是黑色的线,当模型识别正确时有
1
∗
1
=
1
1 *1 = 1
1∗1=1和
−
1
∗
−
1
=
1
-1 * -1=1
−1∗−1=1,经过
δ
(
1
)
=
0
\delta(1) = 0
δ(1)=0可以认为loss更小。当模型识别错误时有
1
∗
−
1
=
−
1
1 *-1 = -1
1∗−1=−1和
−
1
∗
1
=
−
1
-1 * 1=-1
−1∗1=−1,经过
δ
(
−
1
)
=
1
\delta(-1) = 1
δ(−1)=1可以认为loss更大。函数图像很显示在0点附近它没法微分。
Square Loss
那么用平方损失Square Loss是否合理呢?
形式可以写成:
l
(
f
(
x
n
)
,
y
^
n
)
=
(
y
^
n
f
(
x
n
)
−
1
)
2
l\left(f\left(x^{n}\right), \hat{y}^{n}\right)=\left(\hat{y}^{n} f\left(x^{n}\right)-1\right)^{2}
l(f(xn),y^n)=(y^nf(xn)−1)2
但是,
y
^
n
f
(
x
)
\hat{y}^{n} f(x)
y^nf(x)很接近,它们的值会>1也就是上面横轴大于1,loss也开始上升。能不能说用
y
^
n
g
(
x
)
\hat{y}^{n}g(x)
y^ng(x)表示横轴,这样的话,虽然
y
^
n
g
(
x
)
\hat{y}^{n}g(x)
y^ng(x)的最大值为1,同时也限定了
y
^
n
g
(
x
)
\hat{y}^{n}g(x)
y^ng(x)的最小值为-1,那么loss最大就限定在
(
−
1
−
1
)
2
=
4
(-1 -1)^2 = 4
(−1−1)2=4了,所以对于非常negative的输出,都是4,模型就没法学习。
Sigmoid + Square Loss
既然
y
^
n
f
(
x
)
>
1
\hat{y}^{n} f(x)> 1
y^nf(x)>1会出现更大的loss,那么加个sigmoid函数不就限定到0~1了
σ
=
1
1
+
e
x
\sigma=\frac{1}{1+e^{x}}
σ=1+ex1
图像:
那么加了sigmoid函数的loss就变成:
l
(
f
(
x
n
)
,
y
^
n
)
=
(
σ
(
y
^
n
f
(
x
)
)
−
1
)
2
l\left(f\left(x^{n}\right), \hat{y}^{n}\right)=\left(\sigma\left(\hat{y}^{n} f(x)\right)-1\right)^{2}
l(f(xn),y^n)=(σ(y^nf(x))−1)2
图像:
和上面一样,发现loss最大就限定在1了,所以对于非常negative的输出,都是1,模型就没法学习。
所以对于这个model,loss设计成平方损失是不合理的。在之前二分类中提到使用交叉熵作为loss。
Sigmoid + Cross Entropy Loss
最后推导的结果:
l
(
f
(
x
n
)
,
y
^
n
)
=
ln
(
1
+
exp
(
−
y
^
n
f
(
x
)
)
)
\begin{array}{l} l\left(f\left(x^{n}\right), \hat{y}^{n}\right) =\ln \left(1+\exp \left(-\hat{y}^{n} f(x)\right)\right) \end{array}
l(f(xn),y^n)=ln(1+exp(−y^nf(x)))
函数图像:
Hinge Loss
函数形式:
l
(
f
(
x
n
)
,
y
^
n
)
=
max
(
0
,
1
−
y
^
n
f
(
x
)
)
l\left(f\left(x^{n}\right), \hat{y}^{n}\right)=\max \left(0,1-\hat{y}^{n} f(x)\right)
l(f(xn),y^n)=max(0,1−y^nf(x))
图上,penalty = 1表示
y
^
n
f
(
x
)
\hat{y}^{n} f(x)
y^nf(x)要Positive一段距离(=1)。才算足够好,否者就会有penalty。
Hinge Loss和Sigmoid + Cross Entropy Loss 最大的不同在于对已经Positive的结果怎么处理,Sigmoid + Cross Entropy Loss 想要好还要更好,Hinge Loss有一个及格就好了。
在实际中Hinge Loss有一个好处就是比较不害怕异常点(outlier)。Cross Entropy 总是想要好还更好,那么就像考试很多科目,会偏科。而Hinge Loss只要及格就好,所以会有更多精力在各个科目上。所以是更鲁棒的。
Linear SVM
• Step 1: Function (Model)
f
(
x
)
=
∑
i
w
i
x
i
+
b
=
[
w
b
]
⋅
[
x
1
]
=
w
T
x
f(x)=\sum_{i} w_{i} x_{i}+b=\left[\begin{array}{l} w \\ b \end{array}\right]\ \cdot\left[\begin{array}{l} x \\ 1 \end{array}\right]=w^{T} x
f(x)=i∑wixi+b=[wb] ⋅[x1]=wTx
用
w
w
w和
b
b
b组成新的向量
w
w
w, 用
x
x
x和
1
1
1组成新的向量
x
x
x
• Step 2: Loss function
L ( f ) = ∑ n l ( f ( x n ) , y ^ n ) + λ ∥ w ∥ 2 L(f)=\sum_{n} l\left(f\left(x^{n}\right), \hat{y}^{n}\right)+\lambda\|w\|_{2} L(f)=n∑l(f(xn),y^n)+λ∥w∥2
l ( f ( x n ) , y ^ n ) = max ( 0 , 1 − y ^ n f ( x ) ) l\left(f\left(x^{n}\right), \hat{y}^{n}\right)=\max \left(0,1-\hat{y}^{n} f(x)\right) l(f(xn),y^n)=max(0,1−y^nf(x))
Logistic Regression我们分析过过loss是使用Cross entropy。而SVM使用的就是上面提到的Hinge Loss。
• Step 3: gradient descent
由于Hinge Loss长这样:
正则项
λ
∥
w
∥
2
\lambda\|w\|_{2}
λ∥w∥2长这样:
都是凸函数,相加之后的 L ( f ) L(f) L(f)就也是凸函数,那么就可以顺利使用GD来求
Tip:函数不一定是要线性的,也可以使用非线性的比如NN,那么就是Deep版本。NN+Hinge Loss,深度学习版SVM。
具体的gradient descent步骤:
链式求导:
∂
l
(
f
(
x
n
)
,
y
^
n
)
∂
w
i
=
∂
l
(
f
(
x
n
)
,
y
^
n
)
∂
f
(
x
n
)
∂
f
(
x
n
)
∂
w
i
\frac{\partial l\left(f\left(x^{n}\right), \hat{y}^{n}\right)}{\partial w_{i}}=\frac{\partial l\left(f\left(x^{n}\right), \hat{y}^{n}\right)}{\partial f\left(x^{n}\right)} \frac{\partial f\left(x^{n}\right)}{\partial w_{i}}
∂wi∂l(f(xn),y^n)=∂f(xn)∂l(f(xn),y^n)∂wi∂f(xn)
先看第一项:
∂
l
(
f
(
x
n
)
,
y
^
n
)
∂
f
(
x
n
)
=
∂
max
(
0
,
1
−
y
^
n
f
(
x
n
)
)
∂
f
(
x
n
)
=
{
−
y
^
n
If
y
^
n
f
(
x
n
)
<
1
0
otherwise
\frac{\partial l\left(f\left(x^{n}\right), \hat{y}^{n}\right)}{\partial f\left(x^{n}\right)} = \frac{\partial \max \left(0,1-\hat{y}^{n} f\left(x^{n}\right)\right)}{\partial f\left(x^{n}\right)}=\left\{\begin{array}{cc} -\hat{y}^{n} & \text { If } \hat{y}^{n} f\left(x^{n}\right)<1 \\ 0 & \text { otherwise } \end{array}\right.
∂f(xn)∂l(f(xn),y^n)=∂f(xn)∂max(0,1−y^nf(xn))={−y^n0 If y^nf(xn)<1 otherwise
第二项:
因为
f
(
x
)
=
w
T
x
f(x) = w^{T} x
f(x)=wTx
所以
∂
f
(
x
n
)
∂
w
i
=
x
i
n
\frac{\partial f\left(x^{n}\right)}{\partial w_{i}} = x_{i}^{n}
∂wi∂f(xn)=xin
最后:
∂
L
(
f
)
∂
w
i
=
∑
n
−
δ
(
y
^
n
f
(
x
n
)
<
1
)
y
^
n
x
i
=
∑
n
c
n
(
w
)
x
i
\frac{\partial L(f)}{\partial w_{i}}=\sum_{n}-\delta\left(\hat{y}^{n} f\left(x^{n}\right)<1\right) \hat{y}^{n} x_{i}=\sum_{n}c^n(w)x_{i}
∂wi∂L(f)=n∑−δ(y^nf(xn)<1)y^nxi=n∑cn(w)xi
进行梯度更新:
w
i
←
w
i
−
η
∑
n
c
n
(
w
)
x
i
n
w_{i} \leftarrow w_{i}-\eta \sum_{n} c^{n}(w) x_{i}^{n}
wi←wi−ηn∑cn(w)xin
another formulation
通常SVM的做法是:
y
^
n
f
(
x
)
≥
1
−
ε
n
\hat{y}^{n} f(x) \geq 1-\varepsilon^{n}
y^nf(x)≥1−εn
希望找到
y
^
n
f
(
x
)
\hat{y}^{n} f(x)
y^nf(x)同号,并且大于等于margin = 1,但是有时候没法满足这个margin,所以就要减一个
ε
n
(
≥
0
)
\varepsilon^{n}(\geq 0)
εn(≥0)来放宽margin。作为Quadradic programming problem求解。
约束可以表示成:
ε
n
≥
0
ε
n
≥
1
−
y
^
n
f
(
x
)
\begin{aligned} \varepsilon^{n} & \geq 0 \\ \varepsilon^{n} & \geq 1-\hat{y}^{n} f(x) \end{aligned}
εnεn≥0≥1−y^nf(x)
是一个空间面
回到上面:
如果把loss表示成:
L
(
f
)
=
∑
n
ε
n
+
λ
∥
w
∥
2
L(f)=\sum_{n} \quad \varepsilon^{n}+\lambda\|w\|_{2}
L(f)=n∑εn+λ∥w∥2
也就是:
ε
n
=
max
(
0
,
1
−
y
^
n
f
(
x
)
)
\varepsilon^{n}=\max \left(0,1-\hat{y}^{n} f(x)\right)
εn=max(0,1−y^nf(x))
总结:可以看到常规SVM的做法的约束在做最小化时,其实和Hinge Loss的含义是一样的,比如给SVM的做法的约束加一个很大的值,但是为了使得loss最小,也会使得空间面趋向于与Hinge Loss线
Kernel Method
Dual Representation
实际上w是由x线性组成的
w
∗
=
∑
n
α
n
∗
x
n
w^{*}=\sum_{n} \alpha_{n}^{*} x^{n}
w∗=n∑αn∗xn
证明:
意味着,我们初始化的时候w是一个0向量。每次更新w的量都是由x线性变换组成的w。所以最后的w也是由x组成的线性变换。这个线性变换就是
α
n
∗
\alpha_{n}^{*}
αn∗
其中:
c
n
(
w
)
=
∂
l
(
f
(
x
n
)
,
y
^
n
)
∂
f
(
x
n
)
\begin{array}{l} c^{n}(w) =\frac{\partial l\left(f\left(x^{n}\right), \hat{y}^{n}\right)}{\partial f\left(x^{n}\right)} \end{array}
cn(w)=∂f(xn)∂l(f(xn),y^n)
l
(
f
(
x
n
)
,
y
^
n
)
l\left(f\left(x^{n}\right), \hat{y}^{n}\right)
l(f(xn),y^n)长这样
所以当
y
^
n
f
(
x
)
≥
1
\hat{y}^{n} f(x) \geq 1
y^nf(x)≥1时,就求导就都为0。有可能使用Hinge loss通常求导后为0,导致线性变换
α
n
∗
\alpha_{n}^{*}
αn∗是离散的, 即w由x组成的线性变换
α
n
∗
\alpha_{n}^{*}
αn∗,有可能部分是0。非0对应的就是支持向量x,这也就是SVM支持向量机的由来。
这也就意味着,在数据里的点不会都是支持向量,假如异常点不是支持向量,所以SVM是比较鲁棒的。而Cross Entropy的Loss函数的每个点微分都不会是0,所以它是更密的。意味异常数据影响更大。
总结:w是由x线性组成的,这个线性变换就是 α n ∗ \alpha_{n}^{*} αn∗
做变换,改成矩阵相乘表示。那么改一下3步骤样子:
Step 1:
f
(
x
)
=
∑
n
α
n
K
(
x
n
,
x
)
f(x)=\sum_{n} \alpha_{n} K\left(x^{n}, x\right)
f(x)=∑nαnK(xn,x)
上面把
x
n
⋅
x
x^{n} \cdot x
xn⋅x表示成
K
(
x
n
,
x
)
K\left(x^{n}, x\right)
K(xn,x)这么一个函数,也就是核函数(Kernel Function)
Step 2, 3:
K
(
x
n
,
x
)
K\left(x^{n}, x\right)
K(xn,x)里面没有参数,所以变成找
α
n
\alpha_{n}
αn最小化Loss
观察上面式子,我们发现不需要知道x的vector是什么,知道
K
(
x
n
,
x
)
K\left(x^{n}, x\right)
K(xn,x)是什么就可以继续下去,然后结束。真正需要知道的是
X
T
x
X^{T} x
XTx,就可以做所有的优化。这一方法就叫核技巧(Kernel trick),可以带来的好处我们下面分析。
Kernel Trick
在低维空间可能线性不可分,Kernel Trick其实就是想把数据从低维转到高维然后在高维空间进行超平面划分。
这一过程就是输入 x x x,输出 ϕ ( x ) \phi(x) ϕ(x)。然后在高维空间做内积,即 K ( x , z ) = ϕ ( x ) ⋅ ϕ ( z ) K(x, z)=\phi(x) \cdot \phi(z) K(x,z)=ϕ(x)⋅ϕ(z)。而我们知道,在高维空间做内积可能运算量是巨大的。然后又发现高维空间内积的形式其实可以在低维空间中表示,比如下面的例子
假设有个变换
ϕ
\phi
ϕ可以把输入的x进行Feature Transform
比如输入数据:
x
=
[
x
1
x
2
]
x=\left[\begin{array}{l} x_{1} \\ x_{2} \end{array}\right]
x=[x1x2]
Feature Transform:
ϕ
(
x
)
=
[
x
1
2
2
x
1
x
2
x
2
2
]
\phi(x)=\left[\begin{array}{c} x_{1}^{2} \\ \sqrt{2} x_{1} x_{2} \\ x_{2}^{2} \end{array}\right]
ϕ(x)=⎣⎡x122x1x2x22⎦⎤
发现:
ϕ
(
x
)
⋅
ϕ
(
z
)
=
[
x
1
2
2
x
1
x
2
x
2
2
]
⋅
[
z
1
2
2
z
1
z
2
z
2
2
]
=
x
1
2
z
1
2
+
2
x
1
x
2
z
1
z
2
+
x
2
2
z
2
2
=
(
x
1
z
1
+
x
2
z
2
)
2
=
(
[
x
1
x
2
]
⋅
[
z
1
z
2
]
)
2
=
(
x
⋅
z
)
2
\begin{array}{l} \phi(x) \cdot \phi(z)=\left[\begin{array}{c} x_{1}^{2} \\ \sqrt{2} x_{1} x_{2} \\ x_{2}^{2} \end{array}\right] \cdot\left[\begin{array}{c} z_{1}^{2} \\ \sqrt{2} z_{1} z_{2} \\ z_{2}^{2} \end{array}\right] \\ =x_{1}^{2} z_{1}^{2}+2 x_{1} x_{2} z_{1} z_{2}+x_{2}^{2} z_{2}^{2} \\ =\left(x_{1} z_{1}+x_{2} z_{2}\right)^{2}=\left(\left[\begin{array}{l} x_{1} \\ x_{2} \end{array}\right] \cdot\left[\begin{array}{l} z_{1} \\ z_{2} \end{array}\right]\right)^{2} \\ =(x \cdot z)^{2} \end{array}
ϕ(x)⋅ϕ(z)=⎣⎡x122x1x2x22⎦⎤⋅⎣⎡z122z1z2z22⎦⎤=x12z12+2x1x2z1z2+x22z22=(x1z1+x2z2)2=([x1x2]⋅[z1z2])2=(x⋅z)2
所以有这么一个Kernel Function:
K
(
x
,
z
)
=
(
x
⋅
z
)
2
K(x, z) = (x \cdot z)^{2}
K(x,z)=(x⋅z)2
对应的Feature Transform是
ϕ
(
x
)
\phi(x)
ϕ(x)。其实对于SVM来说,输入还是
X
T
X^{T}
XT和
x
x
x,如果不做任何变化,即
K
(
x
,
z
)
=
x
⋅
z
K(x,z) = x \cdot z
K(x,z)=x⋅z,那么其实这个核函数是什么Feature Transform都没做,而上面的例子
K
(
x
,
z
)
=
(
x
⋅
z
)
2
K(x, z) = (x \cdot z)^{2}
K(x,z)=(x⋅z)2,是说做了
ϕ
(
x
)
=
[
x
1
2
2
x
1
x
2
x
2
2
]
\phi(x)=\left[\begin{array}{c} x_{1}^{2} \\ \sqrt{2} x_{1} x_{2} \\ x_{2}^{2} \end{array}\right]
ϕ(x)=⎣⎡x122x1x2x22⎦⎤这么一个Feature Transform。
RBF(Radial Basis Function)Kernel
下面先给KF,然后解释Feature Transform
先给出Kernel Function:
K
(
x
,
z
)
=
exp
(
−
1
2
∥
x
−
z
∥
2
)
K(x, z)=\exp \left(-\frac{1}{2}\|x-z\|_{2}\right)
K(x,z)=exp(−21∥x−z∥2)
我们现在进行反推,尝试理解这个Kernel Function对应的Feature Transform是什么。
exp
(
−
1
2
∥
x
−
z
∥
2
)
=
exp
(
−
1
2
∥
x
∥
2
−
1
2
∥
z
∥
2
+
x
⋅
z
)
=
exp
(
−
1
2
∥
x
∥
2
)
exp
(
−
1
2
∥
z
∥
2
)
exp
(
x
⋅
z
)
=
C
x
C
z
exp
(
x
⋅
z
)
=
C
x
C
z
∑
i
=
0
∞
(
x
⋅
z
)
i
i
!
=
C
x
C
z
+
C
x
C
z
(
x
⋅
z
)
+
C
x
C
z
1
2
(
x
⋅
z
)
2
⋯
\begin{array}{l} \exp \left(-\frac{1}{2}\|x-z\|_{2}\right)\\ =\exp \left(-\frac{1}{2}\|x\|_{2}-\frac{1}{2}\|z\|_{2}+x \cdot z\right)\\ =\exp \left(-\frac{1}{2}\|x\|_{2}\right) \exp \left(-\frac{1}{2}\|z\|_{2}\right) \exp (x \cdot z)\\ =C_{x} C_{z} \exp (x \cdot z) \\ =C_{x} C_{z} \sum_{i=0}^{\infty} \frac{(x \cdot z)^{i}}{i !}\\ =C_{x} C_{z}+C_{x} C_{z}(x \cdot z)+C_{x} C_{z} \frac{1}{2}(x \cdot z)^{2} \cdots \end{array}
exp(−21∥x−z∥2)=exp(−21∥x∥2−21∥z∥2+x⋅z)=exp(−21∥x∥2)exp(−21∥z∥2)exp(x⋅z)=CxCzexp(x⋅z)=CxCz∑i=0∞i!(x⋅z)i=CxCz+CxCz(x⋅z)+CxCz21(x⋅z)2⋯
后面几步是进行泰勒展开
所以这个RBF Kernel Function 对应的Feature Transform是把输入的data x转换到无穷多维的一个空间上。
比如下图,输入数据的特征在低维空间上表示的,不能线性区分,现在做了Feature Transform:
ϕ
\phi
ϕ转到右边高维空间,而RBF Kernel Function 对应的
ϕ
\phi
ϕ是转换到一个无限高维空间,这就导致一个缺点:可能在训练集上过拟合。
Sigmoid Kernel
和NN的关系
先给出Kernel Function:
K
(
x
,
z
)
=
tanh
(
x
⋅
z
)
K(x, z)=\tanh (x \cdot z)
K(x,z)=tanh(x⋅z)
那么
f
(
x
)
=
∑
n
α
n
K
(
x
n
,
x
)
=
∑
n
α
n
tanh
(
x
n
⋅
x
)
f(x)=\sum_{n} \alpha^{n} K\left(x^{n}, x\right)=\sum_{n} \alpha^{n} \tanh \left(x^{n} \cdot x\right)
f(x)=n∑αnK(xn,x)=n∑αntanh(xn⋅x)
这其实就相当于只有1层hidden layer的NN
每个神经元的权重是输入每笔数据,比如第一个神经元的w是第一笔数据。
最后加权的weight就是
α
\alpha
α。注意到神经元的数目就是支持向量的数目,不是支持向量对应的
α
i
=
0
\alpha^i = 0
αi=0。
当输入是声音sequence时,因为长度不一样,很难用vector统一表示。
但是我们可以直接设定
K
(
x
,
z
)
K(x, z)
K(x,z)就是x和z的相似度。所以只要知道怎么算两个sequence的相似度,就可以进行SVM了。那怎么检查这样的相似度是不是真的存在支持向量呢?可以使用Mercer’s theory。
Deep Learning 和 SVM 差别
前几个layer做的就是Feature transformation,后面就是linear classifier
SVM做的也是类似的事情,使用一个Kernel Function:
ϕ
(
x
)
\phi(x)
ϕ(x),也是做Feature transformation。把feature转到高维对的空间上面,然后在高维空间进行linear classifier。而SVM里面一般linear classifier使用hinge loss。
事实上,SVM的kernel也是可以学习的,但是它学习能力没法像DP那么多,核心思想就是有好几和kernel,中间的weight是可以学习的。当只有一个kernel就类似只有1层hidden layer的NN。当有多个kernel组合时,就像有2层hidden layer的NN。
以上参考李宏毅老师视频和ppt,仅作为学习笔记交流使用