任务:对线性可分的二分类问题,寻找一条直线,对于距离该直线最近的正负样本点,使得它们到直线的距离相等,且它们之间的距离最大。即寻找最宽的路,将正负样本分开。
如下图所示,右侧的决策边界要优于左侧决策边界。
设
稍作化简,可得:
对
则决策函数应该满足:
对决策函数加入距离限制,比如要求最近的点到决策边界的函数间隔至少为1,则决策函数:
含义:正负样本点距离决策边界的最近距离为1。对于等于1的点,我们称之为支持向量。
优化目标是使
得
对
至此,求得决策边界:
定义:
则
从神经网络的角度理解,SVM的本质是通过全连接变换,采用hinge-loss作为损失函数的分类问题。
hinge-loss(经验风险)为:
为了防止过拟合,实际优化目标还会加入正则化项(结构风险):
实现代码为:
x1class LinearSVM(nn.Module):
2 def __init__(self):
3 super(LinearSVM, self).__init__()
4 self.linear = nn.Linear(in_features=2, out_features=1)
5 def forward(self, x):
6 y = self.linear(x)
7 return y
8
9svm = LinearSVM()
10optimizer = optim.SGD(svm.parameters(), lr=0.1)
11
12batch_size = 1
13epoch_num = 30
14N = 500
15
16for epoch in range(1,epoch_num+1):
17 for i in range(0, N, batch_size):
18 x = torch.Tensor(X[i: i+batch_size])
19 y = torch.Tensor(Y[i: i+batch_size])
20
21 y_pred = svm(x)
22
23 loss = torch.mean(torch.clamp(1 - y_pred * y, min=0)) # hinge loss
24 loss += 0.01 * torch.mean(svm.linear.weight ** 2) / 2 # l2 pently
25
26 loss.backward()
27 optimizer.step()
28 optimizer.zero_grad()
29
待补充。
解释: