动态路由作用
本篇文章给大家谈谈胶囊网络中动态路由算法,以及动态路由作用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、推荐系统论文阅读(二十二)-基于多兴趣向量召回的Mind
2、召回阶段的多兴趣模型——MIND
3、14.胶囊网络(Capsule Network)
4、目前使用的两种常见动态路由协议算法是什么方法
5、胶囊网络(一)
6、路由算法
推荐系统论文阅读(二十二)-基于多兴趣向量召回的Mind
论文:
论文题目:《Multi-Interest Network with Dynamic Routing for Recommendation at Tmall》
论文地址:
前面讲的论文大部分都是关于排序的算法,mind作为天猫商城召回阶段的算法,还是很值得阅读的。
主流的推荐系统一般都分为matching(召回)和rangking(排序)两个阶段,不管在哪个阶段,都要学习和表示用户的兴趣向量。因此,最关键的能力是为任一阶段建模并得到能代表用户兴趣的向量。现有的大多数基于深度学习的模型都将一个用户表示为一个向量,如YoutubeDNN那篇论文,不足以捕获用户兴趣的不断变化的特点。基于以上原因,天猫提出了Mind方法,通过不同的视角来解决这个问题,并且用不同的向量来表示从用户不同方面的兴趣。
天猫商城也是分为了召回和排序两个阶段,召回阶段的主要目标就是从亿级别的商品库中筛选出千级别的候选物品给排序阶段使用。在天猫场景下,用户每天都要与成百上千的商品发生交互,用户的兴趣表现得多种多样。如下图所示,不同的用户之间兴趣不相同,同时同一个用户也会表现出多样的兴趣:
现在主流的召回阶段用到的召回算法要么是基于协同过滤的算法,要么是基于embedding召回的方法,但是这两个方法都有缺陷。协同过滤算法有着稀疏性和计算存储瓶颈方面的缺点,embedding的向量召回方法也有着几个缺点,一个是单一的向量无法准确表达出用户多种多样的兴趣,除非把这个向量长度变得特别大,还有一个就是,只有一个embedding会造成一定的头部效应,召回的结果往往是比较热门领域的商品(头部问题),对于较为小众领域的商品,召回能力不足,也就是更容易造成马太效应。
正如我们在第一段话中阐述的那样,如果单个兴趣向量没法做到将所有的用户兴趣点覆盖,那么就多搞几个向量,几个向量同时来表示用户的兴趣点不就行了吗?事实证明这么做确实是可以的,而且天猫也通过这种方法大大提高了召回的效果。
简单的先来看一下这个模型的架构,还是浓浓的阿里味,不管是item还是user在生成属于自己的向量的时候都会加上side information,这也是跟din,dien中一样传承下来的东西。整个模型关键的部分就在于这个Multi-Interest Extractor Layer层,后面我们就重点来讲一下这个层。
召回阶段的目标是对于每个用户u∈U的请求,从亿级的商品池I中,选择成百上千的符合用户兴趣的商品候选集。每条样本可以表示成三元组(Iu,Pu,Fi),其中Iu是用户u历史交互过的商品集合,Pu是用户画像信息,比如年龄和性别,Fi是目标商品的特征,如商品ID、商品品类ID。
那么MIND的核心任务是将用户相关的特征转换成一系列的用户兴趣向量:
接下来就是item的embedding了:
说白了f函数就是个embedding+pooling层。
我们有了用户的兴趣向量 和物品向量e后,就可以通过如下的score公式计算得到topN的商品候选集:
这个score的计算过程过其实是对这K个向量分别计算出一个分数然后取最大对那个。有了每个用户的兴趣向量后,我们就能对所有对item求一个分数,这样直接取topN就可以得到N个候选物品了。
这一层跟我们之前介绍的论文din,dien中的操作是类似的。在user embedding中,输入部分包括user_id,还包括gender,city等用户画像信息,分别做完embedding后直接concat起来就得到用户的embedding。跟user侧不同的item embedding则是采用pooling操作来得到item embedding,将商品ID、品牌ID、店铺ID分别做embedding后再用avg pooling。
这部分就是整个mind最关键的地方了,下面会进行详细讲解。
我们认为,通过一个表示向量表示用户兴趣可能是捕获用户的多种兴趣的瓶颈,因为我们必须将与用户的多种兴趣相关的所有信息压缩到一个表示向量中。 因此,关于用户的不同兴趣的所有信息混合在一起,从而导致在匹配阶段的项目检索不准确。所以,mind采用了多个兴趣向量来表示用户的不同兴趣。 通过这种方式,可以在召回阶段分别考虑用户的不同兴趣,从而可以针对兴趣的各个方面进行更准确的检索。
Multi-Interest Extractor Layer,借鉴的是Hiton提出的胶囊网络。有关胶囊网络,下面的图可以帮助你快速理解(源于知乎: ):
可以看到,胶囊网络和传统的神经网络较为类似。传统神经网络输入一堆标量,首先对这堆标量进行加权求和,然后通过非线性的激活函数得到一个标量输出。而对胶囊网络来说,这里输入的是一堆向量,这里的计算是一个迭代的过程,每次对输入的向量,先进行仿射变换,然后进行加权求和,最后用非线性的squash操作得到输出向量,可以看到胶囊网络的的输入跟输出还是跟传统DNN不一样的。
但是,针对图像数据提出的原始路由算法不能直接应用于处理用户行为数据。 因此,我们提出了“行为到兴趣(B2I)”动态路由,用于将用户的行为自适应地汇总到兴趣表示向量中,这与原始路由算法在三个方面有所不同。
1.共享双向线性映射矩阵
在胶囊网络中,每一个输入向量和输出向量之间都有一个单独的双向映射矩阵,但是MIND中,仿射矩阵只有一个,所有向量之间共享同一个仿射矩阵。
主要原因:一方面,用户行为的长度是可变的,天猫用户的行为范围是几十到几百,因此固定双线性映射矩阵的使用是可推广的,同时也减少了大量的参数。 另一方面,我们希望兴趣胶囊位于相同的向量空间中,但是不同的双线性映射矩阵会将兴趣胶囊映射到不同的向量空间中。因此,映射的逻辑变成了:
其中ei是用户行为中的item i的embedding,uj是兴趣胶囊j的向量。
2. 随机初始化胶囊网络的权值
在原始的胶囊网络中,映射矩阵是初始化为0的,但是这样会导致几个问题。将路由对数初始化为零将导致相同的初始兴趣胶囊。从而,随后的迭代将陷入一种情况,在这种情况下,不同的关注点胶囊始终保持相同。这跟我们的意图是不一致的,我们希望生成不同的用户兴趣向量。因此,我们在初始化的时候,让胶囊网络中权重的初始化由全部设置为0变为基于正太分布的初始化。
这里随机初始化的是bij而不是S,也就是胶囊映射逻辑矩阵,S是双向映射矩阵,不要搞混了。
3. 动态的用户兴趣数量
由于不同用户拥有的兴趣胶囊数量可能不同,因此我们引入了启发式规则,用于针对不同用户自适应地调整K的值。 具体来说,用户u的K值由下式计算:
动态的调整会让那些兴趣点较少的用户节省一部分计算和存储资源。
整个Multi-Interest Extractor Layer的计算过程如下:
看到这里我有个疑惑,在于算法的第7点,我们的 是用正太分布初始化的矩阵 跟双向仿射变化后的向量相加的结果,这一点我在论文中并没有得到很好的理解,也就是说,本来 是全零的,现在是用标准正态分布初始化后在去跟双向映射完的向量叠加吗?
还有一个疑问就是,针对每一个j,我们利用所有的behavior的i计算得到一个向量uj,其实感觉应该就是在bij的计算上是不同的,只有bij的计算不同才会产生不同的wij,这样的话也就是说每一轮的bij都是有上一轮的结果来生成的意思?
关于这两点我还是没能搞清楚,以我现在已有的知识来看,每次生成uj后都会利用整个uj去生成下一个bij,跟dcn里面的cross network有点类似,但是说不上来是为什么这么做,可能是这样计算保持来序列计算的特性。
从图中我们也可以清楚的看出来,通过Multi-Interest Extractor Layer,我们得到了多个用户向量表示。接下来,每个向量与用户画像embedding进行拼接,经过两层全连接层(激活函数为Relu)得到多个用户兴趣向量表示。每个兴趣向量表征用户某一方面的兴趣。
我们在前面获得了多个用户的兴趣向量,那么该如何知道这些兴趣向量中哪些是重要的,哪些是可以忽视的呢?这时候attention就派上了用场,正如我们在din中对用户历史行为中的每个item计算weight一样,我们在这个地方也构建一个一个attention网络,用来计算不同兴趣点的weight。
看一下上面的attention网络在结合一下整个mind的模型结构不难得出,这个attention网络的q是候选item的embedding,k,v都是用户的兴趣向量。
attention的计算公式为:
其中,除了计算vu跟ei的内积意外,mind还对这个内积进行了指数运算,这个p值起到了一个平滑对作用,到p接近0的时候,所有的weight是相近的,意味着每个兴趣点都会被关注到。到p大于1的时候,有些weight就会变得很大,而有些就会变得很小,相当于加强了跟candidate item强相关的兴趣点的权值,削弱了弱相关兴趣点的权值,此时更类似于一种hard attention,即直接选择attention score最大的那个向量。实验也证明了,hard attention的方法收敛得更快。
通过label attention网络,我们得到了代表用户u的兴趣向量 ,有了这个向量,我们就可以计算用户u点击item i的概率了,计算方式如下:
目标函数为:
这个L不是损失函数,可以理解为极大似然函数,我们的目标就是让这个东西最大。
当然,在一个具有亿级别item的网站中,我们是不会采用原始的softmax操作的,跟在skip gram中的sample softmax类似,mind也采用了sample softmax的做法,大大减少了运算量。
而在serving阶段,只需要计算用户的多个兴趣向量,然后每个兴趣向量通过最近邻方法(如局部敏感哈希LSH)来得到最相似的候选商品集合。我们只需要输入用户的历史序列和画像信息,就可以得到用户的兴趣向量,所以当用户产生了一个新的交互行为,MIND也是可以实时响应得到用户新的兴趣向量。这里相当于把label attention舍弃掉了,直接用剩下的部分来得到用户的兴趣向量。
serving阶段跟training阶段对于用户的兴趣向量的处理是不一样的,在serving阶段,由于我们有多个兴趣向量,所以score的计算方式就变成了取最大的那个:
mind选择了跟他比较相近的YoutubeDNN进行对比,对比结果如下:
此外,论文还提到了DIN,在获得用户的不同兴趣方面,MIND和DIN具有相似的目标。 但是,这两种方法在实现目标的方式和适用性方面有所不同。 为了处理多样化的兴趣,DIN在item级别应用了注意力机制,而MIND使用动态路由生成兴趣,并在兴趣级别考虑了多样性。 此外,DIN着重于排名阶段,因为它处理成千或者万级别的item,但是MIND取消了推断用户表示和衡量user-item兼容性的过程,从而使其在匹配阶段适用于数十亿个项目。
召回阶段的多兴趣模型——MIND
2019年阿里团队发表在CIKM上的论文“Multi-Interest Network with Dynamic Routing for Recommendation at Tmall”,应用胶囊网络的动态路由算法来构建一个多兴趣网络MIND,是一个召回阶段的模型。
本文是在召回阶段的工作,来满足用户兴趣的物品的有效检索。建立 「用户兴趣模型」 和 「寻找用户兴趣表示」 是非常重要的,但由于 「用户的兴趣存在着多样性」 并不是一件容易的事。
现有的一些用户兴趣表示方法:
1.基于协同过滤的方法通过历史交互物品或隐藏因子来表示用户兴趣:会遇到稀疏和计算问题。
2.基于深度学习的方法用低维Embedding向量表示用户兴趣:
作者认为这是多兴趣表达的一个瓶颈,因为必须压缩所有与用户多兴趣相关的信息到一个表示向量,所以关于用户多兴趣的所有信息是混合在一起的,导致召回阶段物品检测不准确。
3.DIN在Embedding的基础上加入Attention机智:但采用attention机制对于每个目标物品,都需要重新计算用户表示,因此无法使用在召回阶段。
关于胶囊网络:
囊间动态路由算法,Dynamic Routing胶囊算法的核心就在于此处参数b的更新方法:更新参数时,综合考量了低层特征 与输出胶囊特征,由于二者都是向量,当二者同向时,即二者相似度较高,当前的低层特征更能反映图像特征,乘积为正,b权重增加,表示当前低层胶囊更被高层胶囊所“接纳”;相反,当二者反向时,代表当前低层特征与输出胶囊匹配度并不高,乘积为负,b权重减小,表示当前低层胶囊被更高层胶囊所“排斥”。通过这样的权重更新方式建立起了低层特征与高层特征的关联,使模型更能“理解”图像。
“胶囊”是一组聚合起来输出整个向量的小神经元。采用动态路由学习胶囊之间的连接权值,并利用期望最大化算法(EM)对其进行改进,克服了一些不足,获得了更好的精度。
主要贡献:
文章关注的是在召回阶段用户的多兴趣的问题,提出了使用 动态路由的多兴趣网络(MIND) 来学习用户表示。
最主要的「创新点」是:采用胶囊网络的动态路由算法来获得用户多兴趣表示,将用户的历史行为聚集成多个集合内容,每一组历史行为进一步用于推断对应特定兴趣的用户表示向量。这样,对于一个特定的用户,MIND输出了多个表示向量,它们共同代表了用户的不同兴趣。用户表示向量只计算一次,可用于在匹配阶段从十亿个尺度的物品中检索相关物品。
任务目标
召回任务的目标是对于每一个用户 从十亿规模的物品池检索出包含与用户兴趣相关的上千个物品集。
模型输入
对于模型,每个样本的输入可以表示为一个三元组 ,其中 代表与用户 交互过的物品集,即用户的历史行为; 表示用户的属性,例如性别、年龄等; 表示为目标物品 的一些特征,例如物品id和种类id等。
核心任务
学习一个函数可以将User-Item实例(原生特征)映射为用户兴趣Embedding表达集合 为用户 的向量表示, 为embedding的维度, 表示向量数量即兴趣的数量。
若 =1,即其他模型(如Youtube DNN)的Embedding表示方式,物品 的Embedding函数为: 其中 , 表示一个EmbeddingPooling层。
最终结果
根据评分函数检索得到top N个候选项:
根据评分函数检索:即根据 目标物品与用户表示向量的内积的最大值作为相似度依据 ,DIN的Attention部分也是以这种方式来衡量两者的相似度。
Embedding层的输入由三部分组成,用户属性 、用户行为 和目标物品标签 。每一部分都由多个id特征组成,则是一个高维的稀疏数据,因此需要Embedding技术将其映射为低维密集向量。
相对于单一向量进行用户兴趣表示,作者采用多个表示向量来分别表示用户不同的兴趣。通过这个方式,在召回阶段,用户的多兴趣可以分别考虑,对于兴趣的每一个方面,能够更精确的进行物品检索。
为了学习多兴趣表示,作者利用胶囊网络表示学习的动态路由将用户的历史行为分组到多个簇中。来自一个簇的物品应该密切相关,并共同代表用户兴趣的一个特定方面。
动态路由
“胶囊”是一种用一个向量表示的新型神经元,而不是普通神经网络中使用的一个标量。基于向量的胶囊期望能够表示一个实体的不同属性,其中胶囊的方向表示一个属性,胶囊的长度用于表示该属性存在的概率。
动态路由是胶囊网络中的迭代学习算法,用于学习低水平胶囊和高水平胶囊之间的路由对数 (logit) ,来得到高水平胶囊的表示。
我们假设胶囊网络有两层,即低水平胶囊 和高水平胶囊 , 表示胶囊的个数 表示每个胶囊内的神经元个数(向量长度)。路由对数 通过以下计算得到并进行更新: 其中 表示待学习的双线性映射矩阵(在胶囊网络的原文中称为转换矩阵)。
通过计算路由对数,将高阶胶囊 的候选向量计算为所有低阶胶囊的加权和:
采用多个向量来表达 User 不同的兴趣,将 User 的历史行为分组到多个 Interest Capsules 的过程。实现逻辑如下:
输入:
输出:
定义:
(1) 动态兴趣个数
(2)低阶行为向量Embedding表达: 代表User的行为向量(同 )
(3)高阶兴趣向量Embedding表达: 代表User的兴趣向量(同 )
(4)行为向量 与兴趣向量 之间的路由logit:
(5)双线性映射矩阵:
步骤:
(1) 计算兴趣Embedding个数
(2)初始化 (使用正态分布初始化)
(3)遍历迭代次数
(3.1)对所有的行为路由 ,计算
(3.2)对所有的兴趣路由 ,计算 和
(3.3)迭代更新 其中 是一个共享矩阵
通过多兴趣提取层,多个兴趣胶囊从用户行为embedding建立。在训练期间,我们设计一个标签意识注意力层:让标签(目标)物品选择使用过的兴趣胶囊。特别的,对于每一个标签物品,计算兴趣胶囊和标签物品embedding之间的相似性,并且计算兴趣胶囊的权重和作为目标物品的用户表示向量,通过相应的兼容性确定一个兴趣胶囊的权重。
训练
得到用户向量 和标签物品embedding 后,计算用户 和标签物品 交互的概率:
14.胶囊网络(Capsule Network)
接下来,我们来讲一下胶囊网络(Capsule)。Capsule是Hilton的paper,他发表在NIPS2017。
Capsule是什么呢?Capsule是一个你可以想成他想要取代neuron,原来 neuron是output一个值 , 而 Capsule是output一个vector ,在其余的部分它的用法你就把它想成是一个一般的neuron。
所以如下图所示:有个Capsule,Capsule的 output 就是一个 ,这边的写成 ,那Capsule的 input 是什么?Capsule的 input 就是其它的Capsule,我这边有一个黄色的Capsule,他会输出 ,这边有一个绿色的Capsule它会输出 ,这两个vector会当做蓝色的Capsule的 input ,蓝色Capsule的 output 也可以变成其他Capsule的 input 。
我们知道在一个network里面, 每一个neuron的工作就是负责底dectect一个specific pattern 。
举例来说有一个neuron,假设你做影像辨识,有一个neuron的工作只是detect往左的鸟嘴,另外一个neuron的工作只是detect向右的鸟嘴;其实不太可能有一个neuron,它可以同时做两件事情,一个neuron它其实就是侦测一种鸟嘴而已,所以你很难说有一个neuron,它就是看说有向左边的鸟嘴,他被activate;向右边的鸟嘴,它也这被activate。
举例来说同样是鸟嘴的pattern,也许看向左看的鸟嘴,他output的 的第一维就是 ,向右看的鸟嘴,它output的 ,它第一维就是 ,但这两个 可能长度是一样的,因为都出现鸟嘴,但是他们内部的值是不一样的,代表说现在输入的pattern有不同的特性。
输入两个 , 分别乘上另外两个matrix ,得到 。所以 ,接下来把 和 做 weighted sum , 得到 ,接下来把 通过一个叫做 挤压 的方式得到 ,这个 挤压 是怎么回事? 挤压 这件事,它只会改变 的长度,它不会改变 的方向。怎么改变它?把 先除以它的长度,让它变成是一个长度为 的 ,变成长度为 的 以后,前面再乘上一个值,这个值是什么意思?如果今天 的长度非常长,这个值会趋近于 , 的长度就趋近于 。 如果今天 非常短,今天前面这个值就会很小, 的长度就会趋近于 。
总而言之,反正就是输入 ,然后经过一连串的运算,得到 ;在这一连串的运算里面有 有 , Squashing 这个 挤压 是固定的,其实你就可以把它当做是一个激活函数一样, 跟 是参数,这个参数要通过backpropagation learn出来的。
今天的特别地方是这边 和 ,他们不是通过backpropagation learn出来的。 和 叫做 coupling coefficients ,他们是在testing的时候在使用这个Capsule的时候动态去决定的。这个决定的process叫做 dynamic routing 。
所以 和 你可以想成就好像是 pooling 一样。Max pooling就是你有一组neuron,然后只选最大那个值出来,到底哪一个neuron的值会被选, 在training的时候我们不知道,在testing的时候才去dynamic决定的;它这个coupling coefficients跟max pooling是一样的,它也是online的时候决定的。max pooling你可以想成是要被max的那一个neuron,它的位置就是1,其它为的就是零。 其实今天这个coupling coefficients,dynamic routing,你就想成是max pooling的一个进阶版 ,他不是1或者是0,这边可以是不一样的实数,但是我记得 , 的和必须要是1 ,但它不一定要是1或0,他跟max pooling很像,他是在测试的时候动态决定的。
接下来讲 , 又是怎么确定的?
我们先来看 dynamic routing 的演算法:一开始我们现在假设输入 ,把 用 做 weighted sum 以后,我们得到 , 再通过挤压就得到Capsule最后的 。
那么我们来看看 是怎么运作的,首先你要有一组参数 , 的初始值都是 ,而 就对应到 ;假设今天就跑 个iteration, 是一个Hyper-parameter,你要事先定好的。
接下来我们把 做 softmax 得到 ,所以我刚才讲说 的和必须是 。有了 以后你就可以做 weighted sum ,得到 , 还不是最终的 ,我们把得到的 做挤压得到 ,这个 也不是最终的结果 ,这是我们另外计算得到的 和 ;然后接下来我们用计算出来的 去update 的值,你就把 计算出来的结果去跟每一个 做内积,如果某个 和 的内积结果特别大,即他们特别接近的话,对应到的 input 的值就会增加。
如上图所示,我们举个例子:假设右下角红黄绿三个点是 ,然后经过一番计算以后,你得到 是这边灰色的点,这个点跟红色的点、绿色的点比较像,红色点的跟绿色点它们的 就会上升,而他们的然后它的 上升,他们的 也就会跟着上升;然后接下来灰色的点就会往红色的点跟绿色的点更靠近。
所以今天 dynamic routing 这件事,他在决定这个 的时候有点像是 排除离群点(outlier) 的感觉,因为想想看,你把 作 weighted sum ,然后再得到 ;我们假设 就跟 weighted sum 的结果很像,如果今天有某一个人,比如说 跟其他人都很不像,今天算出来的 就会跟他很不像,他的 weight 就会比较小,再算出它的 coupling coefficients 的时候,它算出来就有一点小。
总结一下就是: 今天在input的这一组vector里面,如果有某些人跟其他人都比较不像,它的weight就会越来越小。
现在假设跑了 个iteration以后,我们就得到了 个iteration的 ,这个就是我们最后要拿来计算 跟 的 coupling coefficients ,或者是如果我们用图示来展开的话,看起来像是这个样子:
我们有 然后分别乘上 得到 ,然后我们初始值 都是 。
接下来根据 我们可以得到 ,有了 以后,我们可以计算出一个 ,然后得到 ,根据 我们可以决定下一轮的 ,怎么决定下一轮的 呢?你要透过这个式子: ,去计算 跟 和 的相似的程度,如果 跟 比较像,之后 就会增加,如果 跟 比较像,之后 就会增加;看 跟谁像谁的 weight 就会增加,好,所以有了 以后你就会去update你的 ;有了新的 以后,你就计算出新的 ,然后你就得到 ,根据 你就可以得到新的 weight : ……以此类推,就可以得到 ,就是最终的输出 了。
而这整个process其实它就跟 rnn 是一样的。你 output 的 ,会再下一个时间点被使用;这个在 rnn 里面就好像是 hidden layer的memory 里面的值一样,在前一个时间点的输出会在下一个时间点使用。
所以在training 的时候,实际上你train的时候你还是用backpropagation,很多农场文都说Hilton他要推翻backpropagation,其实我看也好像不是这样的,你刚刚看农场再下到吃手,其实也好像也不是这个样子,最后train的时候还是用backpropagation,怎么用呢?这个training就跟RNN很像,就是说这个dynamic routing你就可以想成是一个RNN,然后train下去就像train RNN一样,train下去你就得到那个结果。
实际上这个Capsule怎么train?
首先Capsule可以是convolution的 。我们知道说在做卷积的时候,我们会有一堆filter,然后扫过那个图片, Capsule可以取代filter,filter就是input一幅图片的一小块区域得到output的value;那么Capsule就是input一幅图片的一小块区域得到一个 ,就这样的差别而已。Capsule最后的output长什么样子?
假设我们现在要做的是手写数字辨识,辨识一张image,原来如果是一般的neuron network,你 output 就是 十个neuron ,每个neuron对应到一个可能的数字,如果是Capsule,你 output 就是 十个Capsule,每一个Capsule就对应到一个数字。
可是你说Capsule的输出是一个vector,我们怎么知道说在这个vector里面这个数字有没有出现呢?我们刚才讲过说vector的norm就代表了pattern出现的confidence。所以今天如果你要知道数字1有没有出现,你就把对照数字1的Capsule,取他的对应1的vector那个norm,那也就是得到了数字1的confidence。同理其他数字;
那么在training的时候,输入数字 你当然希望输出数字 的confidence越大越好,所以今天如果输入是数字 ,你就希望说 的norm越大越好,你希望 的norm被压小,细节的式子我们就不列出来,精神就是这个样子的:
而在Hilton 的paper里面,它还加了一个 reconstruction的network,是说他把Capsule的output吃进去,然后output reconstruct出原来的image 。这个CapsNet的output他其实是 一排vector ,如果是手写数字辨识,它的output就是十个vector。那如上图 绿色方框NN 这个neuron network就把这十个vector的串接吃进去,然后希望可以做reconstruction。在实作上的时候,如果今天知道input的数字是 ,那么就会把对应到 的Capsule的output乘 ,其他数字统统都会乘 。如果今天对应的数字输入的数字是 ,那就是就会把对应到 的Capsule的output乘 ,其他数字统统都会乘 。得到neuron network,希望可以reconstruct回原来的输入。
如下图所示,接下来我们先来看一下Capsule的实验结果,这个实验结果baseline应该是一个CNN的network,在MNIST上错误率其实很低,0.39%的错误率。接下来四行分别是Capsule的结果,routing 1次或者是routing 3次,没有reconstruction和有reconstruction, 这边很明显的有reconstruction 的performance有比较好 ,至于routing 1次或者是routing 3次谁比较好就有点难说,在没有reconstruction的时候,然后routing 1次比较好,有reconstruction的时候,routing 3次比较好。
这边有另外一个实验是想要 展示CapsNet它对抗noise的能力,他的robust的能力 ,所以今天这个实验把MNIST的CapsNet做一个 affine transformation ,但注意一下training没有affine transformation,所以training 跟testing是有点mismatch。 把testing故意作为一个affine以后,因为training 跟testing是mismatch的,所以当然理论上你的network performance是会变差,所以CapsNet的正确率掉到79%。但是traditional convolutional neuron networkmodel掉的更多,他是66%的正确率, 这显示说CapsNet它比较Robust ,你有做一下affine transformation, CapsNet的performance掉的量是比较少的。
我们刚才有说每一个Capsule的output 的 每一个dimension就代表了现在pattern的某种特征。怎么验证这一件事呢?
我刚不是说有一个会做reconstruction的network嘛,用它吃Capsule的output就可以变回image。好,我们就让他吃某一个Capsule的output,然后故意调整这个Capsule的output某一个dimension,就可以知道说这个Capsule的output的dimension,他代表了什么样的特征。举例来说在Hilton的paper的实验上看到说有某些dimension,他代表了笔画的粗细,有某些dimension代表了旋转等等,就每一个dimension都是代表了今天你要侦测的pattern的某一种特征。
如下图所示,为实验结果:
最后这个实验是想要 显示Capsule的reconstruction的能力 ,这个实验是这样,他是把network train在MultiMNIST上面,也就network在train的时候她看到的image本来就是 有重叠 ,我觉得这个实验其实如果有另外一个版本是:training的时候是没有重叠的一般数字,testing的时候有重叠还可以辨识出来,我就真的觉得我钦佩的五体投地,但这个不是这样,这个应该是training和testing都是有重叠的数字的。
那么machine需要做的工作是把这两个数字辨识出来。做法是:给machine看着这一张数字,不知道是哪两个数字的叠合,然后machine它辨识出来是7跟1的结合的可能性比较大。接下来再分别把7跟1丢到reconstruction里面,你就可以分别把7跟1 reconstruct回来,所以这边就显示一下reconstruct的结果,我们看第一排第一张图:看起来是4,其实是2跟7叠在一起,然后她被reconstruct以后,它就可以看出来说红色部分是2,绿色的部分是7。再看第一排第五张图,如果它辨识出来是5跟0,但是你要求他reconstruct 5和7,你把7的那个vector 即:对应到7的Capsule的output丢到reconstruct network里面叫他reconstruct,明明没有看到7,所以7的部分就会消失。好,这个是CapsNet的一些实验。好,为什么CapsNet会work呢?接下来,我们就来看看这个结构的特色。
有两个特性,一个叫Invariance,一个叫Equivariance。
Invariance 是什么意思?input一张image,得到这样的output;我input另外一张image,也得到这个output;他们都是1,虽然有点不一样,network学会无视这个差别得到一样的输出。如下图左边所示;
所谓的Equivariance意思是说我们并不是希望network input不一样的东西就输出一样东西,我们希望network输出完全地反映了现在看到的输入,比如说你输入这张1,得到结果是这样,你输另外一张1,其实这个1是左边这张1的翻转,那它的输出就是左边的vector的翻转。如下图右边所示;
那CNN的max pooling的机制,只能做到Invariance,不能够真的做到Equivariance。 为什么?CNN就是一组neuron里面选最大的出来,现在input是 ,max pooling选 ,max pooling选3。 input不一样的东西,output一样的东西,它只做到Invariance;
但CapsNet可以做到Equivariance这件事情,怎么做到呢? 现在input这个 出来, 进去,然后让Capsule的output要说看到 的confidence很高,input另外一张 ,CapsNet要说我看到 的confidence也很高,今天它在对应到 的Capsule的output的 ,他们的norm都要是大的;在输入这两张image的时候,但是他们在取norm之前的vector里面的值可以是不一样,而这个不一样可以反映的这两个 之间的差异。
所以如果要打个比方的话,你就可以想成说 Invariance 其实是说这个network很迟钝,他是个特别迟钝的人,人家赞美他或批评他对他来说是没差的,因为它看起来就是没差别。但是Capsule不一样,他知道差别,但是他选择不去理会,就是输入的差别在Capsule的output有被呈现,只是取norm的时候,最后没有用到差别。
至于Dynamic Routing,为什么会work呢? 我直觉觉得 Dynamic Routing非常像Attention-based model加multi-hop ,我们之前已经讲过memory network嘛,我们说里面有attention的机制,然后有multi-hop的机制。
Dynamic Routing其实很像这个,你可以把input的 就想成是这边的document。然后这边的 你就想成是attention的weight,你先得到一组attention的weight,抽出一个vector,然后再回头再去做attention,再抽出一个vector再回头去做attention,跟memory network里面的attention加multi-hop的机制是一样,是非常类似的,至于他为什么会work,其实我没有很确定,我觉得这边其实需要一个实验,这个实验是什么?你敢不敢让那些 的值也跟着backpropagation一起被learn出来这样子,因为今天我们并没有验证说如果 的值用别的方法取得performance会不会比较好,如果今天 的值也跟着backpropagation一起被learn出来,但他的performance比capsule还要差的话,我就会觉得说Dynamic Routing提这件事情是真的有用。
这边就是一些reference给大家参考,
目前使用的两种常见动态路由协议算法是什么方法
根据路由算法对网络变化的适应能力,主要分为两种类型:
静态路由选择策略——即非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。
动态路由选择策略——即自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。
因特网的路由选择协议
有关路由选择算法的几个基本概念
分层次的路由选择协议
内部网关协议和外部网关协议
距离向量算法,链路状态算法
路由信息协议RIP(Routing
Information
Protocol)
开放最短路径优先OSPF(Open
Shortest
Path
First)
外部网关协议EGP,BGP
路由选择算法的几个基本概念
理想的路由算法
算法必须是正确的和完整的。
算法在计算上应简单。
算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。
算法应具有稳定性。
算法应是公平的。
算法应是最佳的。
费用或代价
在研究路由选择时,需要给每一条链路指明一定的费用或代价。
这里“代价”并不一定是仅指
“钱”,而是由一个或几个因素综合决定的一种度量(metric),如链路长度、数据率、链路容量、是否要保密、传播时延等,甚至还可以是一天中某一个小时内的通信量、结点的缓存被占用的程度、链路差错率等。
不同的要求下,各种因素的权值可能不同。
因特网采用分层次的路由选择协议。
因特网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使因特网的通信链路饱和。
许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到因特网上。
胶囊网络(一)
胶囊是一组神经元,其输出代表同一实体的不同属性。
胶囊网络的每一层都包含许多胶囊。
我们描述了一个胶囊的版本,其中每个胶囊都有一个逻辑单元来表示实体的存在和一个4x4矩阵,它可以学习表示实体和观察者之间的关系(姿态)。
一个层中的胶囊通过将其自身的位姿矩阵乘以能够学会表示部分-整体关系的可训练的视点不变变换矩阵来为上面层中许多不同胶囊的位姿矩阵投票。
每个票数都由分配系数加权。使用期望最大化算法迭代地更新每幅图像的这些系数,这样每个胶囊的输出将被路由到上面一层中接收到一组类似投票的胶囊。
通过在每一对相邻的包膜层之间的展开的EM迭代中反向传播,对变换矩阵进行区分训练。在smallNORB基准测试中,胶囊与最先进的相比减少了45%的测试错误。与我们的卷积神经网络相比,胶囊对白盒对抗攻击也表现出更强的抵抗力。
卷积神经网络基于一个简单的事实,即视觉系统需要在图像的所有位置使用相同的知识。这是通过绑定特征检测器的权重来实现的,这样在一个位置学习到的特征在其他位置也可以使用。卷积胶囊扩展了跨位置的知识共享,包括描述熟悉形状的部分-整体关系的知识。视点变化对像素强度有复杂的影响,但对表示物体或物体部分与观察者之间关系的位姿矩阵有简单的线性影响。胶囊的目的是充分利用这种潜在的线性,既用于处理视点变化,也用于改进分割决策。
胶囊使用高维符合滤波:一个熟悉的对象可以通过寻找其位姿矩阵的一致投票来检测。这些选票来自已经被检测到的部分。一个部件通过将它自己的位姿矩阵乘以一个学习过的变换矩阵来产生一个投票,这个变换矩阵表示部件和整体之间的视点不变关系。当视点改变时,各部分和整体的姿态矩阵将以协调的方式改变,以便来自不同部分的投票之间的任何一致意见将持续存在。
在一团不相关的选票中找到密集的高维投票簇,这是解决将部分分配给整体问题的一种方法。这不是小事,因为我们不能像对低维平移空间网格化那样对高维位姿空间网格化,以方便卷积。解决这一挑战,我们使用一个快速的迭代过程称为路由协议更新的概率部分分配给一个完整的基于距离的选票来自这部分的选票来自其他部分分配给整个。这是一个强大的分割原则,允许熟悉的形状的知识推导分割,而不是仅仅使用低层次的线索,如接近或一致的颜色或速度。胶囊和标准神经网络的一个重要区别是,胶囊的激活是基于对多个传入的姿态预测的比较,而在标准神经网络中,它是基于对单个传入的活动向量和学习的权值向量的比较。
神经网络通常使用简单的非线性,其中非线性函数应用于线性滤波器的标量输出。
他们也可以使用softmax非线性将整个对数向量转换为概率向量。胶囊使用一种更为复杂的非线性,将一层中胶囊的整个激活概率和姿态转换为下一层的激活概率和姿态。
胶囊网由几层胶囊组成。第L层的胶囊集合记为L,每个胶囊有4x4位元矩阵M和激活概率a。这些类似于标准神经网络中的活动:它们依赖于电流输入,不被存储。
在L层的每个胶囊i和L + 1层的每个胶囊j之间是一个4x4可训练的变换矩阵Wij。
这些Wij(以及每个胶囊的两个习得偏差)是唯一存储的参数,它们是有区别地习得的。胶囊的姿态矩阵转换,维琪投票Vij = MiWij胶囊的姿态矩阵j。所有的胶囊层的姿态和激活在层L + 1使用非线性路由程序计算,得到即输入Vij和ai对所有i ∈ ΩL, j ∈ ΩL+1.
非线性过程是期望最大化过程的一个版本。它迭代地调整L+1层中胶囊的均值、方差和激活概率以及所有i ∈ ΩL, j ∈ ΩL+1之间的分配概率。在附录1中,我们简单直观地介绍了协议路由,并详细描述了它与拟合高斯混合的EM算法之间的关系。
在最近改善神经网络处理视点变化能力的多种尝试中,有两大主流。
一个流试图实现视点的不变性,而另一个流试图实现视点的等方差。
Jaderberg等人(2015)提出的《空间变压器网络》(Spatial Transformer Networks)通过根据仿射变换的选择改变cnn的采样来寻求视点不变性。
De Brabandere等人(2016)扩展了空间变压器网络,在推理过程中根据输入调整滤波器。它们为特征图中的每个局部生成不同的过滤器,而不是对所有的过滤器应用相同的转换。他们的方法是传统模式匹配框架(如标准的CNNs)向输入协方差检测迈出的一步(LeCun et al., 1990)。Dai等人(2017)对空间变压器网络进行了改进,推广了滤波器的采样方法。我们的工作有很大的不同,因为单元不是根据过滤器的匹配分数激活的(在推理过程中固定或动态改变)。在我们的例子中,一个胶囊被激活,只有当转换的姿态来自下面的层相互匹配。这是捕获协方差的一种更有效的方法,并导致模型具有更少的参数,从而更好地泛化。
CNNs的成功促使许多研究人员将嵌入到CNNs中的翻译等方差扩展到旋转等方差(Cohen Welling (2016), Dieleman等人(2016),Oyallon Mallat(2015))。
谐波网络中最近的方法(Worrall et al.(2017))通过使用圆形谐波滤波器和使用复数返回最大响应和方向来实现旋转等变特征映射。这与“胶囊”的基本表征思想相同:通过假设一个位置上只有一个实体实例,我们可以使用几个不同的数字来表示它的属性。他们使用固定数量的流的旋转命令。通过强制沿任何路径的旋转顺序和相等,它们实现了贴片方向的旋转等方差。这种方法比数据增加方法、复制特征图或复制过滤器更具有参数效率(Fasel Gatica-Perez(2006)、Laptev等人(2016))。我们的方法编码一般的视点等方差,而不是仅仅仿射二维旋转。对称网络(Gens Domingos(2014))使用迭代的Lucas-Kanade优化来找到最低级特征支持的姿势。它们的主要缺点是迭代算法总是以相同的姿态开始,而不是以自底向上投票的均值开始。
Lenc Vedaldi(2016)提出了一种特征检测机制(DetNet),它与仿射变换是等变的。DetNet被设计用于检测在不同视点变化下的图像中的相同点。这与我们的工作是正交的,但是DetNet可能是实现第一级还原的好方法,它激活了主胶囊层。
我们的路由算法可以看作是一种注意机制。这个观点中,这与Gregor等人(2015)的工作有关,他们在生成模型中使用高斯核来关注编码器生成的feature map的不同部分,从而提高了解码器的性能。Vaswani等人(2017)在为查询生成编码时,使用softmax函数注意机制来匹配翻译任务的部分查询序列和部分输入序列。它们显示了使用循环架构对以前的转换工作的改进。我们的算法关注的是相反的方向。竞争并不存在于较低级别的胶囊之间,而较高级别的胶囊可能会参与竞争。它是在较高级别的胶囊之间,一个较低级别的胶囊可以发送它的投票。
Hinton等人(2011)在转换自动编码器中使用了一个变换矩阵,该编码器学会了从稍微不同的视角将立体图像对转换为立体图像对。但是,该系统需要从外部提供转换矩阵。最近,协议路由被证明对高度重叠的数字分割是有效的(Sabour等(2017)),但该系统存在一些缺陷,我们在本文中已经克服了这些缺陷
基于Sabour等人(2017)的工作,我们提出了一种新型胶囊系统,其中每个胶囊都有一个物流单元来表示实体的存在,以及一个4x4位姿矩阵来表示该实体的位姿。我们还基于EM算法在胶囊层之间引入了一种新的迭代路由过程,该过程允许将每个低层胶囊的输出路由到上层的胶囊,从而使活动胶囊接收到一组类似的姿态投票。这个新系统在smallNORB数据集上取得了比最先进的CNN更好的精度,减少了45%的错误。我们也证明了它在对抗白盒攻击时比基线CNN更加强大。
SmallNORB是开发新的精确形状识别模型的理想数据集,因为它缺少野外图像的许多附加特征。既然我们的capsule模型在NORB上工作得很好,我们计划实现一个有效的版本,在更大的数据集(比如ImageNet)上测试更大的模型。
路由算法
路由算法是网络层软件的一部分。子网提供数据报服务,每个包都要做路由选择;子网提供虚电路服务,只需在建立连接时做一次路由选择
正确性,简单性,健壮性(鲁棒性,网络出现意外情况时候的解决问题的能力。例如突然某个路由器停电了,使得周边的路由器都没法正常工作,如果出现这样的问题说明路由器的健壮性不够),稳定性(常规使用是否稳定,数据量增多的时候能否正常工作),公平性(网络资源的使用是否公平,避免有些节点出现特别繁忙的状态,而有些节点总是处于很闲的状态),最优性
• 按转发方式和数据副本数量划分
1.全路路由(广播路由)算法:如洪泛算法,按照所有路径广播转发(中间转发节点以及目标节点都会送到很多重复数据。不需要路由表和路由控制功能)
2.多路路由算法:向所有接近目的节点的路径转发(中间转发节点以及目标节点都会送到很多重复数据。)
3.单路路由算法:如距离矢量算法,向目的节点沿着唯一的路径转发(中间的转发节点只转发一份数据即可)
• 按健壮性和简单性划分
1.非自适应算法(静态路由算法):不能根据网络流量和拓扑结构的变化更新路由表,使用静态路由表。需要人为的更改和设定。特点是简单、开销小、灵活性差。典型算法为基于流量的路由算法等
2.自适应算法(动态路由算法):可根据网络流量(网络承载的数据量)和拓扑结构的变化更新路由表。特点是开销大、健壮性和灵活性好。典型算法为距离向量路由算法、链路状态路由算法等
☆可以静态路由和动态路由结合起来使用,此时静态路由的优先级别较高
测量(获取)有关路由选择的网络度量参数(选择最优,比如是要求传播距离最短,还是要求传输时延短等)。如何测量?选取哪些网络参数?
将路由信息传送到适当的网络节点。传送给谁?如何传送?传送什么信息?
计算和更新路由表。更新路由表的算法
根据新路由表执行分组的转发
如果路由器J在路由器I到K的最优路由上,那么从J到K的最优路由一定落在同一路由上
从所有的源节点到一个给定的目的节点的最优路由的集合形成了一个以目的节点为根的树,称为汇集树;路由算法的目的是找出并使用汇集树
基本思想:构建子网的拓扑图,图中的每个节点代表一个路由器,每条弧代表一条通信线路。为了选择两个路由器间的路由,算法需要在图中找出节点间的最短路径
节点数量;地理距离;传输延迟;距离、信道带宽等参数的加权函数
网络规模增大带来的问题:路由器中的路由表增大;路由器为选择路由而占用的内存、CPU时间和网络带宽增大
分层路由:分而治之的思想;根据需要,将路由器分成区域、聚类、区和组;Fig.6-6,路由表由17项减为7项
分层路由带来的问题:路由表中的路由不一定是最优路由
☆分层路由功能大部分时候性能是比较好的,可以选择最优路径,但是有时也会选择到非最优路径。比如上图中如果想从1A到5C,应该是1A→1B→2A→2B→2D→5C是比较优的选择,但是按照1A的分层路由表显示,从区域1到区域5出口线路为1C,因此选择的路线为1A→1C→3B→4A→5A→5B→5C,这时就相对绕远了
DVR - Distance Vector Routing
动态路由算法,也称Bellman - Ford路由算法或Ford - Fulkerson算法,最初用于ARPANET(Internet的前身),被RIP协议所采用
每个路由器维护一张路由表,表中给出了到每个目的地的已知最佳距离和线路,并通过与相邻路由器交换距离信息来更新表;每隔一段时间,路由器向所有邻居节点发送它到每个目的节点的距离表,同时它也接收每个邻居节点发来的距离表;邻居节点X发来的表中,X到路由器I的距离为Xi,本路由器到X的距离为m,则路由器经过X到i的距离为Xi + m。根据不同邻居发来的信息,计算Xi + m,并取最小值,更新本路由器的路由表
图1:
此时路由A把它的路由表发给路由B,B会综合从A得来的路由表来更新自己的矢量表↓
根据初始A矢量表和B矢量表得知B到A为6,B到C为1,B到D没有;两个表都有到E的距离,直接从B到E为8;如果B经由A再到E就要计算A到B的距离加上A到E的距离即可,即6+1=7
图2:
B把路由表发给C之后↓
从C的初始矢量表可得知C到B为1,C到D为2,C无法直接到A,但是通过B的路由表得知B到A为6,再加上C到B的距离1,得出C到A距离为7,同理可得到E距离为7+1=8
图3:
C把路由表发给D之后↓
图4:
D把路由表发给E之后↓
J的相邻节点为4个,分别为A,I,H,K,因此可以选择的路线也为4种
现在要求J的最新路由表。以J到E为例,J到A为8,A到E为14,和为22;J到I为10,I到E为7,和为17;J到H为12,H到E为30,和为42;J到K为6,K到E为22,和为28。从而得出,经由I的时候得到的和17最小,因此在新生成的J到E的位置记录17
无限计算问题:对好消息反应迅速,对坏消息反应迟钝
比如从E到A,E刚开始连通的时候是不知道如何才能到A的,只有通过B与A交互,C与B交互这样最终E通过与D交互才知道如何能到A,这就是好消息。可能需要花些时间,但是结果都是无论目的节点是哪里总会找到路径
坏消息例子:A,B,C之间通信。B到A的距离为1(A,1),C到A的距离为2(B(经B),2)。各个节点都会有一个刷新周期,到了这个周期的时候每个节点会把自己的路由信息发给其相邻节点。例如A路由断开连接,这个时候B到A的线路断开。也就是B到A的距离为无穷大了(A,∞)。如果在B把这个信息反馈给C之前,C先把路由信息告诉B了,那么B收到的信息就为(C,3)。因为A已经不存在,而B从C处得知通过C有路径可以到达A,这时B的路由表就变成(C,3),同样的这时B再告诉C,C就会变成(B,4),就会这样无穷计算下去。如果一开始是B先把信息发给C就不会发生这样的问题
• 触发式更新:节点不等到刷新周期的到来,只要有突发情况马上就会把情况通知相邻路由
• 水平分割:因为一开始C是从B得知经过B可以到达A的,所以用了这种方法之后,C就不会再向B发送如何到A,而只等着B给C发如何到A了。这样就不会有无穷计算问题
• 定义一个最大值:坏消息例子当中,括号里后面的数会一直循环增长下去,如果把这个数字设置一个最大值,那么当循环到这个最大值的时候双方就不会再就怎么到A的信息进行交互了,就不会发生无穷计算的情况
• 挂起计数器:坏消息例子当中,B收到了C的路由最新信息(C,3)的时候这个不会马上生效刷新,(A,∞)会保留两个周期,在这两个周期里面,B肯定有机会给C发送(A,∞),
而因为C没有通往A的路径,所以当C到刷新周期的时候给B发的就为(B,∞)。B前后收到的信息不一致,但是第二次收到的信息和B发给C的信息是一致的,所以B就会认为第一次收到的(C,3)是无效的。但是如果C真的有了一条通往A的线路,这时两次发的信息一定是一致的,那么B就会相信C的信息,从而把(A,∞)刷新成C给B的信息
❉距离向量路由算法只适用于小规模网络,每个节点不清楚整个网络的拓扑结构
发现邻居节点,并学习它们的网络地址,测量到每个邻居节点的延迟或开销,将所有学习到的内容封装成一个链路状态包(包以发送方的标识符开头,后面是序号、年龄和一个邻居节点列表;链路状态包定期创建或发生重大事件时创建)。将链路状态包广播发送给所有其他路由器【洪泛方式:状态包包含一个序号,每次发送新包时加1。路由器记录信息对(源路由器,序号),当一个链路状态包到达时,若是新的则分发,若是重复的则丢弃,若序号比路由记录中的最大序号小则认为过时而丢弃】。计算到每个其他路由器的最短路径
☆链路状态路由算法适用于大规模网络。每个节点都会了解其他节点的局部拓扑,因此就会了解整个网络的拓扑结构,这时当前节点就能找到到目的节点的最优路由
• 使用32位序号。
因为序号是循环使用的,如果位数很少,比如只是1~7,那么7不一定比1大,1有可能是下一轮的第一个数。而32位的时候因为数字特别庞大,不会出现这样问题
• 增加年龄域,每秒钟年龄减1,为零则丢弃
比如A发给B (C,4),由于差错,本来是(C,5)的下一个包,变成了(C,1000)。这之后来的(C,6),(C,7)。。。都没有(C,1000)大,因此包会被丢弃。但其实后面到的包都是新的。为了避免这样的问题发生,(C,1000)里的1000就会在每一秒减1,直到年龄比新到的包小,接下来就可以正常接包了。不过这之前到的包都会被丢弃,这也是没有办法的事
• 链路状态包到达后,延迟一段时间,并与其它已到达的来自同一路由器的链路状态包比较序号,丢弃重复包,保留新包
• 链路状态包需要应答
为了保证数据传输的可靠性
胶囊网络中动态路由算法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于动态路由作用、胶囊网络中动态路由算法的信息别忘了在本站进行查找喔。