读李航的《统计学习方法》时,读到了novikoff定理,内容如下:
我马上感到困惑,k怎么与学习率无关呢?难道学习率再小也能保证在此上界次数内学完?
研究公式发现,更新k次后得到超平面方程为
其中求和项内是每次(共k次)用来更新权重的误分类实例。
显然,如果,则可约去,此方程与学习率无关,那么总学习次数与也无关;
如果,则此方程与和都有关,总学习次数与和也都有关,这时公式(2.9)就未必成立了。那么究竟它还成不成立呢,让我们做个实验。
实验
假设训练数据集的正实例点是(3,3), (4,3),负实例点是(1,1).
那么满足条件且使超平面将训练数据集正确分开,于是可求得,取。
又,易求得,于是.
设定,改变学习率,发现学习次数不变:
trainX = np.array([[3,3],[4,3],[1,1]], dtype=np.float64)
trainY = [1,1,-1]
for i in range(6):
lr = 0.1**i
w = np.array([0,0], dtype=np.float64)
b = 0
sign = True
cnt = 0
while sign:
sign = False
for x,y in zip(trainX, trainY):
if y*(np.dot(w,x) + b) <= 0:
w += lr*y*x
b += lr*y
cnt += 1
sign = True
break
print(cnt)
’‘’运行结果:
7
7
7
7
7
7
‘’‘
设定,改变学习率,发现学习次数变化,且可能大于286:
trainX = np.array([[3,3],[4,3],[1,1]], dtype=np.float64)
trainY = [1,1,-1]
for i in range(6):
lr = 0.1**i
w = np.array([1.8,-0.5], dtype=np.float64)
b = 0.01
sign = True
cnt = 0
while sign:
sign = False
for x,y in zip(trainX, trainY):
if y*(np.dot(w,x) + b) <= 0:
w += lr*y*x
b += lr*y
cnt += 1
sign = True
break
print(cnt)
’‘’运行结果:
4
5
44
437
4367
43667
‘’‘
结论
novikoff定理成立的条件是算法从开始,否则不等式不成立。