【无标题】ww

📅 2026/8/11 5:57:56
【无标题】ww
继续。DC-NAS源码解析二Evolution 分治进化机制上一部分我们分析了Divide 数据划分 ↓ 多个population ↓ 每个population拥有自己的搜索子问题现在进入第二部分Part 2 Evolution子种群如何进化对应源码gen_offspring_tree.py核心任务当前种群[P_t]生成下一代候选[Q_t]流程P_t | |-- selection 选择优秀父代 | |-- crossover 交叉 | |-- mutation 变异 | ↓ Q_t | ↓ evaluate fitness | ↓ selection | ↓ P_(t1)1. Evolution入口gen_offspring()源码defgen_offspring(P_t):函数作用输入P_t当前种群。输出Q_t下一代候选。整体逻辑Q_t[]whilelen(Q_t)len(P_t):选择父代 crossover mutation 加入Q_treturnQ_t1.1 为什么需要产生offspringNAS不是一次搜索。例如初始P0: A B C D经过一次进化产生Q1: A B C D然后比较P0 Q1 选择更好的 ↓ P1不断迭代。2. Individual结构进化对象是什么DC-NAS不是直接修改网络层。它修改Fusion Tree例如一个individual1a2a3a经过解析Fusion / | \ V1 V2 V3所以Evolution实际上是在搜索树结构3. Crossover交叉操作对应源码gen_offspring_tree.py中的crossover()3.1 转换成树源码逻辑p1_treeutils_tree.list_to_tree(p1)p2_treeutils_tree.list_to_tree(p2)作用把字符串1a-0-1a转换Fusion / \ V1 V2为什么因为NAS结构不是字符串。需要树节点交换。3.2 随机选择交换位置源码逻辑node1random.choice(nodes1)node2random.choice(nodes2)例如父代AAdd / \ V1 V2父代BConcat / \ V3 V4随机选A中的V2B中的V4交换。3.3 交叉结果得到ChildAdd / \ V1 V4这就是NAS中的architecture recombination。4. Mutation随机结构变化Mutation是DC-NAS产生新结构的主要方式。源码逻辑noderandom.choice(nodes)随机选择树节点。选择节点后判断情况1融合节点例如Add变成Concat源码ifnode.typefusion:change fusion operation例如原V1 | Add | V2变V1 | Attention | V2情况2视图节点例如原View1MutationView3也就是改变输入模态。所以mutation搜索两个东西① 用什么模态例如RGB SAR Depth② 怎么融合例如add concat attention5. Selection父代和子代竞争进化产生P_t ↓ Q_t现在需要决定谁留下。源码逻辑P_t1selection(P_t,Q_t)输入父代P_t子代Q_t合并P_t Q_t计算accuracy排序。例如父代结构accA90B85C80子代结构accA’95B’88C’70排序A B B A ...选择前N得到P_(t1)6. train_DC.py如何调用Evolution回到主流程。核心foriinrange(nb_iters):每一轮Step1生成子代Q_tgen_offspring_tree.gen_offspring(P_t)对应EvolutionStep2训练multi_process_train(Q_t)得到fitnessStep3选择P_tselection(P_t,Q_t)得到下一代。7. 到这里DC-NAS和普通进化NAS有什么区别普通进化NAS一个population ↓ mutation/crossover ↓ best architectureDC-NASDataset | Divide ------------------- P1 P2 P3 | | | Evolution Evolution Evolution区别不是一个搜索器。而是多个局部搜索器。8. Evolution部分总结源码对应操作源码产生子代gen_offspring_tree.py交叉crossover()变异mutation()选择selection()评价train_individual()论文对应Conquer problem: 1. Divide into subproblems 2. Solve each by evolution下一部分进入真正体现 DC-NAS 创新的地方Part 3Knowledge Exchange知识交换重点分析Archive1Archive2best_fives.pygen_offspring_tree_DC_K.py这里要回答你之前一直问的问题“不同population到底怎么交流交流的是什么什么时候交流”这一部分才是答案。继续分析。DC-NAS源码解析三Knowledge Exchange知识交换机制上一部分我们已经知道DC-NAS不是一个整体population搜索而是Divide P1 P2 P3 P4 ↓ 每个population独立Evolution ↓ 产生优秀结构但是问题来了如果P1只在自己的子空间搜索P2只在自己的子空间搜索它们之间的信息怎么流动这就是论文提出的Knowledge Exchange对应源码主要在gen_offspring_tree_DC_K.py best_fives.py train_DC.py1. Knowledge Exchange整体思想普通进化Population1: A B C ↓ mutation/crossover ↓ A B C所有信息只在内部流动。DC-NAS增加Population1 ↘ Knowledge Archive ↗ Population2也就是说每个population不仅学习自己产生的优秀结构还可以利用其他population发现的优秀结构。2. best_fives.py知识库定义首先看frombest_fivesimportbest_fivess,Archive1,Archive2这个导入在train_DC.py中。说明best_fives.py负责保存历史优秀结构。2.1 为什么需要Archive因为进化过程第1代A B C可能发现A acc90%如果下一代淘汰A这个优秀结构就消失。所以建立Archive 保存历史best architecture类似进化算法里的Elite archive。3. Archive保存什么保存的不是网络参数。注意这一点。DC-NAS搜索的是architecture所以Archive保存individual code accuracy 参数量例如1a-0-2a accuracy95% params2M也就是说Knowledge不是网络权重迁移而是网络结构知识迁移4. 为什么有Archive1和Archive2源码Archive1 Archive2两个知识库。这里对应论文DC-KDivide and Conquer with Knowledge exchange。设计思想不同子种群代表不同搜索区域。例如Population group A 搜索区域 view combination 1 Population group B 搜索区域 view combination 2两个区域产生的优秀结构分别保存Archive1 Archive25. Knowledge Exchange发生在哪里重点不是在训练阶段。是在生成offspring阶段也就是gen_offspring_tree_DC_K.py为什么因为Evolution产生新个体时需要选择父代。普通Evolutionparent1 parent2 ↓ childDC-Kparent1 其他population优秀parent ↓ child6. 普通crossover和DC-K crossover区别普通P1: parent A parent B AB ↓ childDC-KPopulation1: parent A Archive2: best architecture B AB ↓ child这就是知识交换。7. 代码逻辑分析伪代码defgen_offspring_DC_K(P_t):Q_t[]whilelen(Q_t)len(P_t):# 当前population选择父代p1random.choice(P_t)# 从其他archive获取知识p2random.choice(Archive)# crossoverchildcrossover(p1,p2)# mutationchildmutation(child)Q_t.append(child)returnQ_t对应论文Local Evolution External Knowledge ↓ New offspring8. 为什么知识交换可以提高搜索效率假设Population1一直搜索View1 View2发现Concat效果好Population2一直搜索View3 View4发现Attention效果好如果没有交换两个population各自重复探索。有交换P1获得Attention fusionP2获得Concat fusion于是产生View1 View2 Attention Concat新的组合。9. Knowledge Exchange在DC-NAS中的作用总结它解决Divide带来的问题Divide优点降低搜索难度。但是缺点每个子种群容易陷入局部最优。所以加入Knowledge Exchange。形成Divide ↓ Local Evolution ↓ Knowledge Exchange ↓ Global Improvement10. 和普通NAS区别DARTS信息流一个supernet ↓ 梯度更新Evolution NAS信息流population内部 ↓ mutation/crossoverDC-NAS信息流多个population ↓ 内部Evolution ↓ 跨population知识交换 ↓ 融合搜索经验11. 对你的多模态融合NAS启发你现在做可见光-SAR融合搜索P3 P4 P5可以对应Population1搜索P3融合位置Population2搜索P4融合位置Population3搜索P5融合位置然后Knowledge Exchange交换最佳融合层选择 融合权重策略例如P3发现SAR增强效果好传给P5搜索。本部分总结论文概念源码Knowledge Exchangegen_offspring_tree_DC_K.py知识保存best_fives.py优秀结构Archive1/Archive2交换时机offspring生成阶段交换对象architecture code不是交换network weight下一部分继续Part 4Conquer最终整合重点分析四个population最后如何合并selection()如何完成全局竞争为什么DC-NAS最后不是得到4个网络而是一个最终architecture这一部分会把整个搜索闭环串起来。继续。DC-NAS源码解析四Conquer —— 多种群整合与最终架构选择前面三部分已经完成Divide数据和搜索空间拆分Original Search Problem ↓ P1 P2 P3 P4Evolution每个子种群独立进化Pt ↓ mutation ↓ crossover Qt ↓ selection Pt1Knowledge Exchange不同子种群之间共享优秀结构P1 ←→ Archive ←→ P2现在的问题多个population经过多轮进化以后最后怎么得到一个网络这就是第四部分Conquer整合1. Conquer在DC-NAS中的作用论文中的思想Divide把一个大问题拆成多个小问题Evolution分别解决每个小问题但是最后必须把多个子问题的解重新组合得到全局最优解。因此Multiple populations ↓ Collect candidates ↓ Global selection ↓ Best architecture2. 最终选择在哪里完成DC-NAS源码中最终选择依然依赖gen_offspring_tree.py selection()也就是说Conquer不是一个单独文件。原因进化算法本身每一代都需要父代 子代 ↓ 选择 ↓ 下一代最终一代的population就是Conquer后的结果。3. Evolution中的selection回顾输入P_t当前种群。产生Q_t子代。然后P_t Q_t进行竞争。形式[P_{t1}Selection(P_t \cup Q_t)]4. selection做了什么Step 1合并父代和子代例如父代P_t A B C D子代Q_t A B C D合并A B C D A B C DStep 2按照fitness排序每个individual训练以后得到accuracy parameter number例如结构AccuracyA90%B94%C88%D96%排序D B A CStep 3保留population规模假设pop_size10但是PQ20那么取前10得到P_(t1)5. 为什么selection就是Conquer因为DC-NAS虽然有多个子种群例如Population 1 Population 2 Population 3 Population 4但是它们不是永久独立。每轮它们都会产生候选评价竞争最终所有优秀结构会进入最终population。6. DC-NAS最终架构如何产生经过Iteration 1 P0 ↓ Evolution ↓ P1 Iteration 2 P1 ↓ Evolution ↓ P2 ... Iteration T PT最后选择best individual例如最终1a-0-2a-1b然后通过code2net_tree转换Actual Neural Network7. 从代码角度看完整闭环现在把四部分串起来。Step 1 Divide对应datasetsplit/split.py产生D1,D2,D3,D4Step 2 Population Initialization对应population_init.py生成P1,P2,P3,P4Step 3 Evolution对应gen_offspring_tree.py每个Pi ↓ Qi ↓ selection ↓ Pi1Step 4 Knowledge Exchange对应Archive1 Archive2交换architecture knowledgeStep 5 Conquer对应selection()产生Global best population8. DC-NAS完整源码流程图Dataset | ---------------------- | | split.py population_init.py | | ↓ ↓ D1 P1 D2 P2 D3 P3 D4 P4 | ↓ gen_offspring_tree.py | ----------------- | | | Mutation Crossover Selection | ↓ Archive Exchange | ↓ New populations | ↓ Conquer | ↓ Best Architecture | ↓ code2net_tree | ↓ Final Network