You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多分类感知机实现疑问:权重更新方式的选择

多分类感知机权重更新疑问解答

我正在学习《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)时,应采用以下哪种更新方式?

  1. 完成所有比较后,仅对w_i执行一次w_i(k+1) = w_i(k) + C * x_i(如代码1)
  2. 每次遇到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:10:24