您的更新中有几个错误。我认为通常您会将当前权重的值与当前权重和先前权重之间的差异混淆。您将符号分散在不应有的地方,而+ =应该在=的地方。Δ
感知器:
ww(t+1)=ww(t)+ηt(y(i)−y^(i))xx(i),
其中是模型对训练示例。我吨ħy^(i)=sign(ww⊤xx(i))ith
可以将其视为以下“感知器损失”函数的随机次梯度下降方法*:
感知器损耗:
Lww(y(i))=max(0,−y(i)ww⊤xx(i))。
∂Lww(y(i))={0},{−y(i)xx(i)},[−1,0]×y(i)xx(i), if y(i)ww⊤xx(i)>0 if y(i)ww⊤xx(i)<0 if ww⊤xx(i)=0。
由于perceptron已经是 SGD的一种形式,因此我不确定SGD更新为何与perceptron更新不同。如果使用非阈值来编写SGD步骤,则如果您对答案的预测过于正确,则会蒙受损失。那很糟。
您的批次渐变步骤是错误的,因为当您应该使用“ =”时,您正在使用“ + =”。将为每个训练实例添加当前权重。换句话说,您编写的方式
ww(t+1)=ww(t)+∑ni=1{ww(t)−ηt∂Lww(t)(y(i))}。
应该是:
ww(t+1)=ww(t)−ηt∑ni=1∂Lww(t)(y(i))。
另外,为了使算法收敛于每个数据集,您应按时间表降低学习率,例如。ηt=η0t√
*在感知器丢失方面,感知器算法与SSGD 不完全相同。通常在SSGD中,在平局()的情况下,,所以,所以您可以不采取任何措施。因此,在,感知器损耗可以最小化,这是没有用的。但是,在感知器算法中,如果选择了错误的答案,则必须打破平局,并在使用子梯度方向。ww⊤xx(i)=0∂L=[−1,0]×y(i)xx(i)00∈∂Lww=00−y(i)xx(i)∈∂L
因此,它们并不完全相同,但是如果您假设感知器算法对于某些损失函数是SGD,然后对损失函数进行反向工程,那么感知器损失就是您的最终选择。