SOM 自组织映射
参考
[1] Wiki 自组织图
[2] CSDN博客
- 1970年 芬兰教授Teuvo Kohonen设计
- 外形似前馈网络,但体系在安排和动机上是不同的.
- 竞争学习,非纠错式学习
- 无监督
生物原理
——百度文库
生物学研究表明,在人脑的感觉通道上,神经元的组织原理是有序排列的。当外界的特定时空信息输入时,大脑皮层的特定区域兴奋,而且类似的外界信息在对应的区域是连续映像的。
神经元相互竞争,通过Winner Take All和侧向抑制机制找到对某个输入模式的获胜神经元,然后获胜神经元会进行紧邻着相互激励,远邻者相互抑制,最终会在一个空间图中形成各个集群,每个集群表征对某个模式的响应。
关于提到竞争、合作、自适应的,分别对应胜者为王(Winner Take All)、优胜邻域和权重更新。
SOM结构
输入层为单样本的各个特征,竞争层自定义大小,但肯定是要大于样本类别数的,可以定义为矩形,也可以定义为正六边形,取决于你要定义的优胜邻域的形状。
每个竞争层的神经元与输入层神经元都是全连接的,
对输入层和竞争层神经元的理解:
- 输入层神经元携带的是特征信息,每个维度一个数值,用于接受外界信息
- 竞争层神经元不像传统前馈神经网络的神经元那样用数值模拟脉冲发放率,只是用来判定是否优胜(各神经元比较大小),用于对输入模式进行“分析比较”
- 每个竞争层神经元与所有输入神经元连接,其权重至关重要,这些权重与输入模式(特征向量)的相似程度决定了竞争层神经元的输出,即是否胜出
综上,权重是重中之重。
如何来表征权重与输入向量的相似程度?
这里用纯数学的角度来考虑,两个向量重合的情况肯定是最相似的,那么越相似,权向量向输入向量投影就越大(当然,需要对权向量进行归一化,输入向量可免),SOM做的就是看看每个竞争层神经元的权向量与输入向量哪个最接近。
设输入向量为,权向量为,我们要找内积最大,即最大,也就是找欧式距离最小的神经元。
训练过程(结合自己理解)
先描述下整个训练过程做的事情:
对每个输入,都找出一个相似度最大的神经元,然后“近吸远斥”,使得最后神经元图中,相近神经元能够表征同类的输入模式,但既有区别又有很大相似性。怎么做到吸近斥远呢,就靠上面的墨西哥草帽了。
算法计算步骤
1、权重初始化及归一化
刚才提到权重是最重要的,要的就是最终让权重与输入相似度最大,如果一开始初始化就让权重出现在样本附近,那训练起来就省事很多,不要出现大量的初始“死节点”,即在过程中这个推那个推最终没有归宿了。
- 死节点
在训练过程中永远不能获胜的节点
假设样本和权重都被归一化了(向量除以模),假设样本维度是2,那样本就是分布在一个单位元上的点。
-
随机初始化方法:让权向量随机分布在单位元各个角落
-
在样本重心加随机数初始化
让权重出现在样本所在的地带,可以想象三维的单位球,可能样本分布的区域只是球面的一小部分,如果有权重初始化在另一部分,这样就不好调了;
更具体一点,把地球想象成单位球,样本在北半球有十个集群,如果把向量初始化到南极就不好玩了。
-
随机调出一部分样本作为初始化权重
2、设置初始优胜邻域(后面更新部分说)和学习率
3、对输入数据进行归一化处理
前面提到,不归一化也没啥大事。
4、计算所有权向量与输入向量内积或计算距离,将距离最小或内积最大的神经元标记为获胜神经元
假设某次输入样本为上方的黄色点,此次显然是获胜。
5、更新优胜邻域
-
优胜邻域
以获胜神经元为中心设定一个邻域半径R,该半径圈定的范围称为优胜邻域。
说白了就是获胜神经元的影响范围,它应该是随着迭代次数(或时间)而减小的,意味着经过学习,竞争层上的神经元的小团体渐渐成型了,优胜邻域如果不收缩,是会影响到别的小团体的稳定性的。
-
方形优胜邻域
-
六边形优胜邻域
影响的范围定了,那影响的程度怎么定呢?一般计算这个影响的程度就用一个高斯函数来表征最舒服了
表示的是获胜神经元,表示的优胜邻域内的神经元,这个是高斯函数的标准差,决定帽子的高矮胖瘦(瘦的表示独宠一小块,胖的表示雨露均沾),它是与优胜半径不同的两个参数,一个决定影响的范围,一个决定影响的程度。
6、调整权值
这两个公式就是关键,吸近斥远,
- 是学习率,表示改变多少
- 决定影响谁,影响程度多大
- 让与优胜神经元相近的神经元都向该输入模式靠拢
还是以输入上方黄色点为例,优胜向量为2,优胜区域是一个半圆,那么对1而言的h是正的,被它加上之后是向上方黄色点靠近的,对3而言的h是负的,它会像上方黄色点远离,而4不在优胜邻域内,影响不到。
7、更新学习率
这里谈谈它和优胜半径。
初始时学习率较大,使得优胜神经元对周围的神经元的吸力较强,使得竞争层神经元尽快形成小团体,逐渐减小学习率,进而方便捕捉到精细的结构。
在更新时的一种参考方法就是
8、终止条件
判断学习率是否小于一定值,进而结束训练
训练框图如下:
测试阶段
经过训练后,即使输入样本数远大于竞争层神经元个数,也有可能有神经元从来没有获胜过。
- 测试向量与某个权向量最小且**过,则该测试向量被分到对应聚类
- 若测试时获胜神经元在训练时没有被**过,一个想法是该神经元距离竞争层上哪个聚类最近(纯粹的索引最近),就是哪类;更好的是看看相似度第二、三等神经元是哪个聚类的,顺便将这个优胜神经元划到该类中。
作用(都没做过还)
- 保序映射
将输入空间的样本模式有序的映射到输出层中
- 特征提取、数据压缩
高维输入低维输出,高维上相近的点输出肯定也相近
Python代码
暂无