多分类感知机实现疑问:权重更新方式的选择
多分类感知机权重更新疑问解答
我正在学习《Pattern Recognition and Machine Learning》,需要实现一个多分类感知机,给定的算法步骤如下:
现有向量:v_i = [v_i0, v_i1, v_i2, ..., v_im], i = (1, 2, ..., n)
转换为增广形式:x_i = [v_i0, v_i1, v_i2, ..., v_im, 1]
初始值:w_i(0) = [0 for _ in range(m)],C
伪代码:
for iteration ITER: for i in range(n): step = k = ITER * n + i use x_i as learning example: calculate d_j = w_j(k) * x_i, j = (1, 2, ..., n) if d_i(k) > d_j(k) is TRUE for all (j != i): w_j(k+1) = w_j(k) else if exists l such that d_i(k) <= d_l(k): w_i(k+1) = w_i(k) + C * x_i w_l(k+1) = w_l(k) - C * x_i w_j(k+1) = w_j(k) for any (j != i,l)
疑问
当存在N个w_l(k)满足d_i(k) ≤ d_l(k)时,应采用以下哪种更新方式?
- 完成所有比较后,仅对
w_i执行一次w_i(k+1) = w_i(k) + C * x_i(如代码1) - 每次遇到
d_i(k) ≤ d_l(k)时都执行w_i的更新,最终w_i(k+1) = w_i(k) + N * C * x_i(如代码2)
代码1
PUNISH = 0 for _j in range(1,n): j = (i + _j) % n if d[i] > d[j]: COUNT += 1 else: w[j] -= C * x[i] PUNISH += 1 if PUNISH > 0: w[i] += C * x[i]
代码2
for _j in range(1,n): j = (i + _j) % n if d[i] > d[j]: COUNT += 1 else: w[i] += C * x[i] w[j] -= C * x[i]
解答
回到原始算法描述并结合多分类感知机的经典实现逻辑:
原算法的核心意图是让正确类别的得分d_i相对所有错误类别更高。当存在多个错误类别(即多个l满足d_i ≤ d_l)时,正确的更新规则是:
- 对每个错误类别
l,执行w_l(k+1) = w_l(k) - C * x_i(下调错误类别的权重,降低其得分) - 仅对正确类别
i执行一次w_i(k+1) = w_i(k) + C * x_i(上调正确类别的权重,提升其得分)
这样做的原因是:一次训练步中,正确类别的权重只需要提升一次就能实现“相对错误类别得分更高”的目标;如果像代码2那样每次误判都上调正确类别,会导致w_i被过度更新,打破权重平衡,进而拖慢模型收敛速度甚至导致无法收敛。
因此,代码1的实现是正确的,代码2的逻辑不符合多分类感知机的训练原理。
内容的提问来源于stack exchange,提问作者Firestar-Reimu
相关产品推荐
相关产品推荐

