【人工神经网络】第一讲:竞争网络与自组织特征映射:从胜者为王到保序映射

一、同层之间加上竞争

前馈网络一层一层往下算。层与层之间有连接,同一层里的神经元彼此不搭线,各自算各自的。信号从输入推过去,误差从输出反传回来,每个神经元的参数由落到它头上的那一份误差决定。感知机、BP、RBF 都在这套框架里,结构简单,式子也简单,写成程序不长。

这套框架有一条没写出来的假设:同一层的神经元之间没有关系。它们只是并排摆着,谁也不知道旁边那个算出了什么。换激活函数、加隐层、改损失,动的都是层与层之间的那条通路,同层之内始终是空的。

竞争网络改的正是这一处。它让同一层的神经元互相比较,比较的是相似度。每个神经元有一套与输入同维的权向量,可以看成它在输入空间里的一个位置。输入进来,谁的位置离它最近,谁就赢,其余被压住不出声。参数的学习不再经过输出与期望之差,直接由输入决定,网络由此多了一层自学习的能力。

不用误差反传、直接拿数据定中心,这条路子在隐层上已经走过一遍。RBF 网络的隐层中心先由 k 均值定下来,再让它们参与训练:

ck=1Nk∑x∈Skx(1-1)\mathbf c_{k}=\dfrac{1}{N_{k}}\sum_{\mathbf{x}\in S_{k}}\mathbf{x}\tag{1-1}ck=Nk1x∈Sk∑x(1-1)

式(1-1)里的 SkS_{k}Sk 是划到第 kkk 簇的样本集,NkN_{k}Nk 是它的样本数。中心一定,隐层就到手了,剩下要学的只是输出层那一点线性权重。这种做法把聚类当成前馈网络的一个初始化步骤,用完就丢。竞争网络反过来,把聚类本身做成一层网络自己的学习规则。

从结构上看,经典的网络分三类。前馈网络管层与层之间的映射,竞争网络管同一层内部的比较,动态网络管时间方向上的反馈。前馈网络的内容最多,后两类各占两周。竞争这一支再往下分,先是在同层里只有竞争;再往下把位置关系加进去,就成了自组织特征映射;末了在竞争层外面接一层有导师的输出,那是学习矢量量化与对偶传播网络,留到下一次。

二、相似性与胜者为王

判类别靠相似性,样本与哪一类更像就归哪一类。有标签叫分类,没标签叫聚类;聚类靠数据自身的相似性分组,分类多一个先验,类别或者类中心已经给定。两边的依据是同一个东西,相似性怎么度量。

最常用的两种。一种用欧氏距离:

d(x,w)=∥x−w∥(2-1)d\left(\mathbf{x},\mathbf{w}\right)=\Vert\mathbf{x}-\mathbf{w}\Vert\tag{2-1}d(x,w)=∥x−w∥(2-1)

式(2-1)在维数不高时最直观,算起来也便宜,是度量相似性的第一选择。另一种看夹角:

cos⁡θ=xTw∥x∥∥w∥(2-2)\cos\theta=\dfrac{\mathbf{x}^{\mathrm{T}}\mathbf{w}}{\Vert\mathbf{x}\Vert\Vert\mathbf{w}\Vert}\tag{2-2}cosθ=∥x∥∥w∥xTw(2-2)

夹角越小越相似。两者在计算上可以统一:先把两个向量都除以自己的模,落到单位超球面上,式(2-2)的分母变成一,余弦就等于内积。

∥x∥=∥w∥=1 ⇒ cos⁡θ=xTw(2-3)\Vert\mathbf{x}\Vert=\Vert\mathbf{w}\Vert=1\ \Rightarrow\ \cos\theta=\mathbf{x}^{\mathrm{T}}\mathbf{w}\tag{2-3}∥x∥=∥w∥=1 ⇒ cosθ=xTw(2-3)

式(2-3)是后面所有算法都要用的一步。归一化之后,比较相似度就是比较内积,除法和开方都省掉。竞争层每来一个样本,都要把输入与几十个权向量逐个比一遍,省下的这点运算在样本量大时很可观。

用哪一种看维数。特征少、维数低,直接算距离直观,也够用。维数高了,距离变成了大量分量的累加,单个分量的差别被摊薄,样本之间的远近关系反而被压平;夹角只关心方向,在同样的情形下更稳。高维空间里距离向均值集中,是这条经验背后的原因。

度量选得好不好,常常比后面的算法更关键。同一个数据集换一种相似性,聚类结果可以完全不同。

图 1:同一组样本在 L1 与 L2 距离下的最近邻划分

图源:Stanford CS231n 2026 春季,Lecture 2《Image Classification with Linear Classifiers》,第 34 页。

图 1 里两组点没动,只是把距离从城市街区距离换成欧氏距离,分界就从一组折线变成另一组折线。距离定了,划分就定了。度量不只在选公式,还在选空间:在像素上算距离,找出来的近邻是颜色和形状接近的图;在中间层输出的那个几千维向量上算距离,找出来的近邻换成了同一类东西的不同姿态。词向量的相似性也是这样,早先靠词形与共现统计,语义相近的词在字面上毫无关系,距离算不出来,现在由网络训练出来,下游的生成模型才有可用的度量。

结构最简单的竞争网络只有一层。每个神经元一套权向量,全部与输入相连。

图 2:竞争网络的结构,输入全连到竞争层的每个神经元

图源:卓晴《人工神经网络(2025 年秋):第三次作业》,CSDN 博客,2025 年 11 月。https://blog.csdn.net/zhuoqingjoking97298/article/details/154560385

示意图画的是两个输入、三个神经元。没有隐层,输入直接连到每个神经元,连线的权值就是那套权向量;输出端只有一个非零,表示谁赢。

输入进来,先算相似度,再选出最大的那个:

c=arg⁡max⁡j wjTx(2-4)c=\arg\max_{j}\ \mathbf{w_{j}}^{\mathrm{T}}\mathbf{x}\tag{2-4}c=argjmax wjTx(2-4)

式(2-4)按内积写,前提是权向量与输入都已归一化;按欧氏距离写就是取最小,胜者相同。这一步在实现上是一次遍历取最大,没有学习内容,纯粹是选择。

胜出者输出一,其余输出零。它把一个连续的相似度向量压成一个只有一位是一的指示向量,后面的学习只认这一位。

修正只对胜出者做:

wc(t+1)=wc(t)+α(x−wc(t))(2-5)\mathbf{w_{c}}(t+1)=\mathbf{w_{c}}(t)+\alpha\left(\mathbf{x}-\mathbf{w_{c}}(t)\right)\tag{2-5}wc(t+1)=wc(t)+α(x−wc(t))(2-5)

几何上很清楚。x−wc\mathbf{x}-\mathbf{w_{c}}x−wc 是从中心指向样本的向量,乘一个小于一的系数加回去,中心朝样本挪了一步,没走到。α\alphaα 取一,一步就到样本上,此后这个神经元的位置就等于最近一次胜出的样本,来回跳动更厉害。

这叫奖赏性学习。中心挪近之后,同一个样本下次再来,它更容易胜出。反复下去,每个神经元停在自己那一簇样本的中间。

用夹角度量时可以再省一步。既然每次修正完都要重新归一化,差值那一步可以直接去掉,叠加再归一化就够:

wc(t+1)=wc(t)+ηx∥wc(t)+ηx∥(2-6)\mathbf{w_{c}}(t+1)=\dfrac{\mathbf{w_{c}}(t)+\eta\mathbf{x}}{\Vert\mathbf{w_{c}}(t)+\eta\mathbf{x}\Vert}\tag{2-6}wc(t+1)=∥wc(t)+ηx∥wc(t)+ηx(2-6)

式(2-6)里 η\etaη 是学习速率。叠加让方向朝样本偏,归一化把长度拉回一,净效果仍然是夹角变小。两条路子的区别只在这个系数怎么取,一条给的是相对步长,一条给的是叠加量。

学习速率不能一直不变。η\etaη 固定,中心每次朝当前样本挪一步,样本轮换着来,中心就在几个样本之间来回摆,停不下来。实际训练时让 η\etaη 从大到小衰减,最后趋于零,摆动幅度跟着收敛,中心才停得住。这条经验后面还要用一次,自组织映射把它变成了两条收敛曲线。

图 3:两个神经元在五个样本上的竞争演化,红点是权向量,蓝点是样本

图源:卓晴《竞争网络演化动图》,CSDN 博客,2020 年 11 月。https://blog.csdn.net/zhuoqingjoking97298/article/details/110195549

红点从随机位置出发,被蓝点轮流拉过去。速率不变时它进不到正中间,只在两个样本之间来回荡;速率衰减之后才停下来。

还有一类现象要单独说。竞争层的神经元个数往往多于真实的类数,多出来的那些如果初始化位置离样本群很远,整个训练过程中一次也没胜出过,权向量停在初值上,占着一个位置却从不参与。这类神经元叫死节点。它的害处不只是浪费,还有解释上的麻烦:统计结果时得先判断哪些节点活着,否则类中心里会混进几个随机数。

选出最大这一步,本身也可以用一层网络实现。把相似度当初值送进去,层内两两相连,自连接权取一,互连权取一个很小的负数:

yj(t+1)=max⁡(0, yj(t)−ε∑k≠jyk(t))(2-7)y_{j}(t+1)=\max\left(0,\ y_{j}(t)-\varepsilon\sum_{k\neq j}y_{k}(t)\right)\tag{2-7}yj(t+1)=max 0, yj(t)−εk=j∑yk(t) (2-7)

式(2-7)里的 ε\varepsilonε 取一个很小的正数,取大了会把所有输出一起压到零。每个神经元的下一拍等于自己减去其余全体之和的一小部分,再由取零截断。谁的数大谁减得少,一时掉不到零;小的先掉到零,一旦到零就被截住,不再影响别人。迭代若干次,只剩最大的那个还活着。

这是侧抑制最早的样子:邻近单元互相压制,最后只留一个。整套结构在书里叫汉明网络,前一层算匹配,后一层选出最大,后一层叫最大网。它靠迭代收敛,属于反馈网络,放到动态网络那一章再展开。工程实现不会真去搭这一层,软件里扫一遍取最大值,等价而且快得多。

三、只给类中心不够

竞争学习收敛之后,每个神经元给出一个类中心。看起来聚类就做完了,实际上有三条不通。

第一条,判别面是直的。两类各一个中心,新样本归到距离近的那个,分界就是两中心连线的垂直平分面。这跟最近邻法在两类情形下完全一样。数据线性可分时够用,分布复杂时不行。

图 4:一条直线分不开的三种分布

图源:Stanford CS231n 2026 春季,Lecture 2《Image Classification with Linear Classifiers》,第 63 页。

图 4 三格分别是棋盘分布、圆环分布、三团分布。这三种情况下任何一条直线都分不开,两类中心法也就分不开。

要让判别面弯起来,一类必须有多个中心。两类各一个中心,边界是一条垂直平分线;一类有 k 个中心,边界就由 k 段这样的平分线拼起来,能弯成折线。竞争网络训练完之后,每个神经元管的正是一小片,片与片之间都是垂直平分面。这也解释了两类中心法为什么只能线性可分:片只有两片的时候,边界必然是一条直线。

第二条局限,类内的信息丢了。一个类只留一个中心,这个类分布得多宽、多散、跟邻近的类重叠多少,全都没有记下来。后面要做异常检测、要给置信度,用的正是这些信息。只给中心,等于只回答了在哪里,没回答有多大。

第三条,能做的事太少。前馈网络除了分类回归,还能做压缩、特征提取,甚至接优化问题。只靠一层竞争,这些接不上,输出只是一个类标号。

四、从皮层到侧抑制

自组织特征映射的想法来自大脑皮层。

大脑是三维的器官,功能却集中在表面那层皮层上。皮层靠褶皱把面积撑大,能容纳的神经元数目随之增加,拓扑上它仍是一张二维的薄片。所有高级功能都长在这张薄片上,网络那一层为什么要排成网格,来由就在这里。

这张薄片不是均匀的。听觉、运动、躯体感觉各占一块,同一块里处理同类信号的神经元挤在一起。用得越多、对生存越关键的功能,占的面积越大。分区与面积这两条,是后面保序与密度匹配两个性质的生物出处。

最极端的一个例子是老鼠。它大部分时间在地下活动,视力退得很厉害,靠的是嘴边十几根长须,探前面的障碍全靠它们。把一根胡须单独刺激,皮层上能定位到一簇神经元,几十个一组,位置固定,一根须对应一簇。用得越多的一根须,对应的那簇占地越大。这类结构常被称作桶状皮层。

皮层内部的连接方式是这样的:一个神经元被激活,附近的神经元跟着兴奋,再远一点反而被压住。前者叫近距兴奋,后者叫侧抑制。神经元之间不再只是竞争,是近处合作、远处竞争。

视网膜上能直接看到这件事。先用光点激活一片区域,再照它旁边的神经元,旁边那个反而更不容易响应。效果是增强对比:均匀的光照被压平,明暗的交界和运动被突出。这不是缺陷,是对生存有用的偏向,视野里变的才需要处理。

三条合起来就是自组织映射的全部结构假设:神经元排成低维网格、相邻单元协同、远处单元抑制。

有个一维模型能把这套机制算出来。神经元排成一条线,第 jjj 个被选中之后,与它拓扑距离不超过 RRR 的按正的学习速率修正:

Δwj=η0(x−wj)d(j,c)≤R(4-1)\Delta\mathbf{w_{j}}=\eta_{0}\left(\mathbf{x}-\mathbf{w_{j}}\right)\quad d(j,c)\le R\tag{4-1}Δwj=η0(x−wj)d(j,c)≤R(4-1)

再远一圈反过来修正:

Δwj=−η1(x−wj)R<d(j,c)≤R′(4-2)\Delta\mathbf{w_{j}}=-\eta_{1}\left(\mathbf{x}-\mathbf{w_{j}}\right)\quad R<d(j,c)\le R'\tag{4-2}Δwj=−η1(x−wj)R<d(j,c)≤R′(4-2)

式(4-1)与式(4-2)里的 d(j,c)d(j,c)d(j,c) 是拓扑距离,指网格上隔了几格,不是输入空间里的距离。正系数取一个正常值,负系数的绝对值取小,比如零点零五。

迭代若干次之后,原本摊在整条线上的响应往中间收,形成一个尖峰,两侧降到零。分散在各处的信息被集中到一小段,自组织这三个字说的就是这件事。这一步只解决信息往中间聚,还不解决谁跟谁挨着,后者要靠网格本身。

五、结构与训练

结构上自组织映射只有一层。所有神经元共享同一个输入向量,彼此之间按选定的拓扑连成网格,网格是逻辑上的,跟物理位置无关。

拓扑可以是零维、一维、二维、三维。零维就是没有结构,退化成胜者为王。一维是一条线,每个神经元有左右两个邻居,也可以首尾相接成环。二维是平面,四邻域或者八邻域。三维以上原则上也可以,实际用到的多是一维和二维。

拓扑一给,就有了邻域。半径 RRR 以内的神经元算作胜出者的邻居,一起参与修正。这一步把每次只改一个节点,变成每次改一片,死节点的概率大幅下降,这正是引入邻域最直接的收益。

二维网格上怎么算距离,细节上可以说几句。用方形距离,即行列差取绝对值再取大;用欧氏距离;用六边形网格上的步数,都可以。这些度量在离散网格上的差别不大,因为半径最终要收到零,收零之后拓扑不再起作用,选哪一种对收敛结果没有本质影响。真要说差别,主要是收敛速度与中途的形状。

训练规则只有一条:

wj(t+1)=wj(t)+η(t)(x−wj(t))j∈Nc(t)(5-1)\mathbf{w_{j}}(t+1)=\mathbf{w_{j}}(t)+\eta(t)\left(\mathbf{x}-\mathbf{w_{j}}(t)\right)\quad j\in N_{c}(t)\tag{5-1}wj(t+1)=wj(t)+η(t)(x−wj(t))j∈Nc(t)(5-1)

式(5-1)说的是胜出者 ccc 连它的邻域一起朝样本挪,邻域内用同一个学习速率。这一点比生物原型简化了一层:真实的侧抑制是按距离连续变化的,实现里取成了平台,邻域内一视同仁,邻域外一概不动。有的版本还保留一圈负系数,做惩罚性学习,多数实现把它去掉了。

剩下的是两个循环、两个收敛。内层循环走样本,外层循环走轮次。这跟前馈网络的三层循环不同,那边有分组、有批次,这边样本全用,不再分批。

半径按网格上的整数递减。初始可以取到整个网格,让所有神经元都动一次,做一轮粗排;之后按固定轮数往下减,减到一,最后减到零。降到零时邻域只剩它自己,算法退化成胜者为王,此后做的是细调。

半径的下降不能均速。半径越小,每次参与学习的神经元越少,一次只挪一小片,要反复熬才能把这一片定下来;半径大的时候几轮就能把整体形状拉出来。前面快、后面慢,是被结构决定的,不是调参的人偷懒。

学习速率按轮次单调下降,线性、指数、分段都行:

η(t)=η0(1−tT)(5-2)\eta(t)=\eta_{0}\left(1-\dfrac{t}{T}\right)\tag{5-2}η(t)=η0(1−Tt)(5-2)

R(t)=max⁡(0, R0−⌊tτ⌋)(5-3)R(t)=\max\left(0,\ R_{0}-\left\lfloor\dfrac{t}{\tau}\right\rfloor\right)\tag{5-3}R(t)=max(0, R0−⌊τt⌋)(5-3)

式(5-2)里 TTT 是总轮数,式(5-3)里 τ\tauτ 是每降一格所需的轮数。两条曲线的具体形式可以换,单调不增这一条不能变。

两个收敛各管一件事。学习速率收到零,中心才停得住,不被最后一个样本拖偏,这是位置上的精细;半径收到零,拓扑的影响才褪掉,同一类里的神经元才能在网格上排得紧,这是排列上的精细。少了任何一个,结果都会松:只降速率不降半径,网格会一直扭;只降半径不降速率,中心会一直摆。

初始化有三种做法:在零一之间随机取,在样本所在的区域里随机取,或者直接拿若干样本当初值。要点是不让初值离样本太远,远了就是死节点,训练结束也回不来。

整个训练过程不会发散,也不会震荡。原因很简单,半径与速率都是人为规定的下降曲线,没有让误差反过来影响步长的地方。这一点比反向传播省心,代价是收敛速度与最终精度都要靠经验调,没有统一的最优曲线。

走到最后,学习速率降到零,网络就被冻结了。此后不管再来多少样本,权向量都不再改动,训练到此结束。所谓收敛,在这套算法里不是误差落到某个阈值以下,而是两条曲线把步长压到了零。

把整段流程按顺序排一遍:定拓扑与神经元个数,初始化权向量,每个样本进来先竞争选出胜出者,再按邻域一起修正,一轮走完调一次半径与速率,直到速率归零。中间没有别的分支,也没有提前终止的判据。

训练结束,每个神经元指向数据的某个中心,但这张图本身还不带类别。要拿它分类,得给神经元贴标签:把网格上连成一片、指向同一类的神经元指定成同一个标签,新样本胜出之后按标签归位。贴标签这一步是人工的,也可以用少量带标签的样本去标。要拿它做回归,则在这一层之上再接一层有导师的映射。

六、拿到一个新问题怎么下手

真要拿它解决一个实际问题,动手之前有四处要定,定完才能训练。

第一处是输出层的规模,也就是神经元选多少个、按什么拓扑排。个数少不得,数据分布复杂的时候,几个类会被硬挤进一个神经元,后面怎么调也分不开;个数也多不得,多出来的多半变成死节点,网格上还留下一片解释不了的空白。常用的办法是先估计样本大概有多少个类中心,按这个数再放个两三倍。

第二处是拓扑的维数。普通的分类问题,一维就够,一维结构已经能把相邻的类排在一起,判别面也不再是单张平面。要解释数据内部的远近与疏密,或者问题本身就是路径规划、语音这种带有空间关系的,才用得上二维三维。维数越高,训练越慢,中途的形状也越难判断。

第三处是初始化。三种做法前面说过,实操上最稳的是在样本所在的区域里随机取,或者直接挑若干样本当初值。初值撒在样本外围,就等于人为造出一批死节点。

第四处是两条曲线的调法。半径的下降往往不是匀速的:粗排阶段用大半径走少数几轮,把网格整体拉成数据的大致形状;中间每若干轮降一格,很快降到一;末了在半径为零或一的条件下长时间训练,做精细调整。三段的比例大致是短、短、长,前面省时间,后面出力。学习速率同理,前段大,末段小。

这些数字没有统一答案。比较可靠的做法是把训练过程画出来看,每个阶段过后位置如果还在明显变化,就说明这一段还没走完,反之可以提前进入下一段。有人提出过把半径与速率合成一个公式、按轮次统一给出,实际做的时候用不着那么细,按问题调几个整数就够了。

七、保序特性

训练完之后,每个神经元指向输入空间里的一个位置。这些位置在低维网格上有邻居关系,于是可以反过来读数据。

第一条读法是保序。原来在输入空间里挨得近的样本,落到网格上也挨得近。

第二条读法是密度匹配。原来分布得紧凑的一类,占的神经元少而集中;分布得散的一类,占的神经元多而散。第一条管远近,第二条管疏密,两条合起来,网格就成了一张压缩过的数据分布图。

第三条读法是降维与特征选择。高维样本被摊到一维或二维的网格上,网格的每个点就是投影点,网格的形状就是数据在低维的一个像。它跟主成分分析不是一回事:主成分分析找的是方差最大的线性子空间,这里找的是一张能保住邻接关系的网格,是一个非线性映射。

图 5:一维隐变量沿二维数据铺出的曲线

图源:CMU 11-785《Introduction to Deep Learning》2026 春季,第 21 讲《Representation and Autoencoders》,第 81 页。

压到一维时,这张图最好认。左边是二维平面上的一条螺旋,右边是一条一维曲线,线上每一点取一个值,颜色沿取值渐变。曲线顺着螺旋走,取值相邻的点在平面上也相邻,这就是保序最直白的样子。

把这条曲线拉出来的办法不止一种。自编码器用重建误差拉:压到一维再解回来,解不回来的偏差就是损失,网络为了少损失,只能让曲线贴着数据走。自组织映射用邻域拉:胜出的神经元带着左右邻居一起朝样本挪,链自己会摊开,不需要重建。两者目标一样,动力不同,落到的形状未必相同,保序的意图是共同的。

三条可以合成一句话:拓扑距离是输入距离的一个保序近似。

d(xi,xj)<d(xk,xl) ⇒ d(ni,nj)<d(nk,nl)(7-1)d\left(\mathbf{x_{i}},\mathbf{x_{j}}\right)<d\left(\mathbf{x_{k}},\mathbf{x_{l}}\right)\ \Rightarrow\ d\left(\mathbf{n_{i}},\mathbf{n_{j}}\right)<d\left(\mathbf{n_{k}},\mathbf{n_{l}}\right)\tag{7-1}d(xi,xj)<d(xk,xl) ⇒ d(ni,nj)<d(nk,nl)(7-1)

式(7-1)里的 ni\mathbf{n_{i}}ni 是 xi\mathbf{x_{i}}xi 胜出的那个神经元的网格坐标。这条只是个近似,不是定理。成立到什么程度,取决于初始化、半径曲线与速率曲线三条,同样的数据跑两遍得到两张不同的图,是常事。

一个常见的演示是十六种动物。每种取十三个外形与运动特征,有该特征记一,没有记零,再拼上十六位类别码,合起来二十九维。用一百个神经元排成十乘十的网格去训练。

训练完,把每个神经元与它最近的动物对上号,网格上就出现一片一片的同类。狗和狼挨着,鸭子和猫离得远。这个结果和直觉对得上,因为特征向量本来就编码了这层关系。占格子的多少也有规律,特征越常见、越接近其他动物的,占的格子越多;鸭子这种长相特殊的,只占一两个格子。

第二个演示更抽象。三十二个字符,二十六个字母加六个数字,每个用五维向量表示,坐标刻意按组构造,让同一组的几个字符只差一个分量。用七十个神经元排成七乘十,去学这三十二个样本。

结果能看出分组,但每次训练出来的布局不一样。跑三次可能得到三种排列,保序关系都在,具体形状不同。这说明保序是一个关系约束,不是一个唯一解。不知道原始结构的人,光看结果去解释数据,多半会解释错一部分。

保序特性还有一个用法,不用来读数据,用来解题。网格上相邻意味着输入空间里相邻,那么沿着网格走一圈,就等于在输入空间里走一条尽量短的闭合路径。旅行商问题正好是这个形状。

八、从四个样本到字母点阵

例一:四个样本分成两类

最简单的一个。四个样本,两个类,竞争层给两个神经元就够。

初始化取零一之间的随机数,学习速率从 0.6 起,每轮减半。拓扑取零维,没有邻域,半径始终是零。

训练过程就是式(2-5)反复执行:取一个样本,找最近的神经元,把它朝样本挪 0.6 的量;四个样本走完算一轮,速率减半。几轮之后,两个神经元分别停在两组样本的中间。

这一类问题不需要拓扑。零维的竞争网络就能给出正确结果,加结构反而是浪费。反过来看,这个例子也把竞争学习的下限划出来了:类分得开、样本又少的时候,最简单的规则就够;一旦类有形状,单点就得让位给一片点。

例二:字母点阵上的三种拓扑

第二个例子用字母点阵。七个字母,每个字母三种字体,共二十一个样本。每个样本是七乘九的点阵,拉直成六十三维向量。

七个类,竞争层至少要七个神经元。实际给二十五个,排布分三种:零维、一维、二维五乘五。学习速率都从 0.6 线性降到 0.01,训练一百多轮。

零维的结果最差。二十五个神经元里只有五个在训练中胜出过,其余二十个初始化之后离样本太远,一次没赢过,成了死节点。胜出的五个里有几个正好落在类中心,另外几个落在两类的中间,被它们分到的那两类就被错误地合并了。

原因很直接。六十三维空间里随机撒二十五个点,落在样本附近的本来就不多。没落在附近的那些,靠单点修正永远追不上,因为每次只有一个节点能动,轮到它胜出的机会本来就少。这一条把死节点的成因说得最清楚:不是训练不够,是初始化的位置决定了它有没有机会。

一维把二十五个神经元排成一条线,每个有左右两个邻居,半径取一。每次胜出,连同左右两个一起修正。参与聚类的神经元从五个增到九个,错分明显减少。少数情况下一个类被两个相邻神经元分担,这在分类上不算错误,两个中心都归到同一类即可,新样本靠近哪一个都能判对。

二维五乘五,半径同样取一,每次参与的是上下左右加自己共五个。参与聚类的神经元从九个增到十一个,比一维多两个,可结果只好一点点。

二十一个样本、七个类,这个问题的复杂度撑不起二维结构。三种拓扑比下来,普通分类问题上一维就够。要更好的结果,与其加维度,不如调神经元个数、半径的收敛曲线、速率的下降曲线。

九、路径、指纹与皮料

例三:一条不走重复的路径

旅行商问题是优化问题里的试金石:给若干城市,找一条走遍每个城市一次、总长度最短的闭合路径。城市一多,穷举就不可行。

自组织映射能给出一个不算坏的解。把城市坐标当样本,神经元个数取成城市个数,拓扑取一维环。首尾相接这一点是关键,环上每个神经元才有两个邻居,路径才能闭合。若不接成环,两端各少一个邻居,路径就断在那儿。

训练按常规走,半径从一降到零,学习速率从 0.4 降到 0.2。半径不为零时,每个神经元的移动受邻居牵制,整条环被拉向城市分布的区域;半径收到零之后,每个神经元才独立地落到某个城市上。

这条环最终会穿过所有城市,原因是保序。环上相邻的两个神经元,最后指向的两个城市在平面上也相邻,路径每一步都走邻近的城市,总长度就短。它不是严格的最优解,只是把组合问题软化成了一个连续的排序问题。

图 6:十个城市上的搜索过程,竞争层取首尾相接的一维拓扑

图源:卓晴《竞争网络演化动图》,CSDN 博客,2020 年 11 月。https://blog.csdn.net/zhuoqingjoking97298/article/details/110195549

每一步,链都被城市拉过去,同时被邻居拉住,所以不会有哪个神经元单独跑掉。前几十步还看不出路径,越到后面越贴合,最后收敛成一条绕城的闭合线。搜索过程中给每个节点叠了一点随机噪声,为的是跳出局部的形状。

铺开的过程在演示里看得很清楚。在平面上随机撒五十个点,用一条首尾相接的一维链去学,几十轮之后,原本缩成一团、毫无规律的链会张开,均匀地铺满样本所在的那片区域,走向顺着样本的形状。

图 7:一维拓扑的链在三角形内均匀样本上展开

图源:卓晴《竞争网络演化动图》,CSDN 博客,2020 年 11 月。https://blog.csdn.net/zhuoqingjoking97298/article/details/110195549

链起初缩成一团,位置也是随机的,几十轮之后顺着三角形的边界铺开。这一例的链不闭环,两端各少一个邻居,也就不受另一端的牵制。

换成一维不闭环,链会铺成一条折线;换成二维方形,会铺成一张网。

图 8:二维拓扑在方形区域样本上铺成一张网

图源:卓晴《竞争网络演化动图》,CSDN 博客,2020 年 11 月。https://blog.csdn.net/zhuoqingjoking97298/article/details/110195549

二维铺出来是一张网,格点间距大致均匀,覆盖的形状跟着样本走。三种拓扑铺出来的形状不同,铺开这件事是一样的。

铺出来的形状不只由样本决定。同一组样本,改初始化、改半径的下降过程、改速率的下降过程,最后可能得到一条光滑的链,也可能得到一条扭曲的链。这三个因素决定了落在哪个稳定点,样本只是把稳定点的范围框住。

图 9:同样一组样本与拓扑,训练落到扭曲形态的一例

图源:卓晴《竞争网络演化动图》,CSDN 博客,2020 年 11 月。https://blog.csdn.net/zhuoqingjoking97298/article/details/110195549

看图 9 的中央,一圈连线全收向同一个位置,网格在那儿绕了一下。这不算训练失败,保序关系还在,只是整体绕了一圈;换一组初始化,或者改一改两条曲线的下降速度,多半就能绕回来。

九个城市的例子能看出两处失效。一个神经元卡在两个城市正中间,因为这两个城市轮流把它拉过去,最后停在中间;另一个神经元没落到任何城市上,成了死节点。

补救有两个办法。剩下的神经元不多时,人工把它们指派给剩下的城市;或者把没对上的那几个城市拿出来单独穷举,个数少,代价可以接受。先软化再收敛,剩下的交给精确方法,这是这类混合做法的一般套路。

例四:指纹分类

指纹用于身份认定,有两条线。一条是刑侦,现场提取的残缺指纹与库里的记录比对;一条是门禁与手机,判断来的人是不是登记过的那一个。两边的难处不一样,前者要在大库里找一个未知的人,后者只需确认一个人。

第一条线的难处在于时间。现场留下的指纹要去库里查,而破案有黄金时间,几十小时之内锁不住人,比对出来也没用。库容又是百万量级,逐枚比对根本不可能在时限内做完。

指纹的身份信息在细节点上。纹线走到某处会分叉,或者会断掉,分叉点与端点的位置和方向构成一个特征点。十来个点对上,基本可以认定同一个人。细节点比对本身很费时间,所以真正动手之前要先分类。

分类依据的不是细节点,是纹线的走向。人的指纹按纹路形态可以分成十几类,类分对了,只需在同类里比对,速度立刻上一个量级。人工分类有两个问题:类的数目上不去,十几类已经是专家能给的上限;各类的样本量差得远,有的类占了三成,有的类寥寥无几。样本量不均,提速就打折。

改进的办法是把自组织映射用在这个分类环节上,一共改三处。

第一处改度量。先把指纹图转成方向图,每个小块给出该处纹线的走向;同时给出可信度图,标记这个走向有多可靠。指纹的清晰程度因人而异,同一枚指纹的不同区域也不一样,可信度就是把这层差异显式记下来。两个指纹的距离用方向图做内积,可信度做加权,可信度低的位置权重小,对相似度的贡献也小。这一条改动把度量的可靠性提了上去,比单纯改聚类算法更管用。

第二处改结构。第一层聚类之后,某些神经元指向的样本特别多,就把这些神经元连同它们的样本取出来做第二层聚类,第二层再往下分。层数按需要加,直到每个小组的样本量大致均匀。单层变成多层,这是解决类内不均的直接办法。

第三处降维。方向图加可信度图拼起来维数很高,比对的计算量顶不住当年的机器,先用主成分分析把维数压到原来的三分之一到四分之一,再聚类。

三处合起来,比人工分类分得更细、更均匀,检索速度也上去了。这条路子在今天的深度网络面前已经落后很多,现场只留四分之一枚残缺指纹也能认出来。但它的次序仍然有用:先把度量的可靠性做对,再谈算法与结构。

例五:一件皮衣的用料

最后一个例子很朴素。做皮衣,一件要用四五块皮料。皮料的颜色、纹理、厚薄不一样,拼在一件衣服上要挑相近的,否则成衣的颜色接不上。

把每块皮料的颜色与纹理特征取出来,用自组织映射聚类。分完之后按网格上的相邻关系取料:相邻的类在特征上接近,配在一起过渡自然。

还有数量问题。有的类里皮料多,有的少,一件衣服要凑够四五块。做法是把相邻两类的皮料平均着用,让每个批次的用料量大致齐平。

这个例子说明它的用处不只在分类。输出是一张带邻居关系的图,凡是需要挑相近一组的场合,这张图都能直接用。

十、后面还有什么

竞争学习解决的是自学习,也就是在没有标签的情况下把数据的结构找出来。分类与回归还需要后面的有导师学习。下一步在竞争层外面接一层输出,竞争层做自组织,输出层做有导师的映射,两层合起来就是对偶传播网络。另一条路是给竞争层的神经元挂上类别标签,胜出时把同类拉近、把异类推远,这就是学习矢量量化。推远那一步用的是惩罚性学习,正好补上胜者为王只奖不罚的缺口。

从胜者为王到自组织映射,加进去的东西只有一样:神经元之间的位置关系。这一样东西换来三件事,更多的神经元参与训练、更弯的判别面、以及一张能反过来读数据的图。

相关推荐
吴声子夜歌1 小时前
Kubernetes权威指南——Kubernetes安装配置指南(网络配置)
网络·容器·kubernetes
硅基造物主1 小时前
STM32 从 0 到 1 做智能家居(十二):USART2 分时复用 —— ESP-12F + MQTT
网络·stm32·mqtt·智能家居·esp-12f
我不会起名字3222 小时前
TCP 三次握手为什么是三次:丢包、重传与初始序列号
网络·tcp·原理·握手
Yang96112 小时前
鼎讯信通DXA-3S光纤熔接机:光缆教学中的技术精粹解析
网络
xbzb3 小时前
IP、掩码、网关、DNS 到底谁管什么?网络基础与七种设备一次讲清
网络·网关·mac·ip·dns·掩码
前进吧-程序员3 小时前
C++20 协程入门实战:从 co_await 到一个 100 行的异步任务调度器
网络·c++·c++20
前进吧-程序员3 小时前
实战:C++20 协程 + io_uring 写一个 400 行的 echo server
网络·c++·c++20
云飞云共享云桌面5 小时前
机械制造研发部门:一台SolidWorks云主机替代 10 台传统图形工作站
运维·服务器·网络·3d·自动化·制造
loulanyue_5 小时前
从碎片文档到工业知识网络:TDengine工业知识图谱架构设计与大模型落地破局——读涛思数据OpenDay实录
网络·知识图谱·tdengine