% superfig golden example 4 -- a dual-encoder dependency, not a linear pipeline. % Two encoder rows share a rail; fusion is placed from their east anchors. % ../scripts/build.sh dependency-graph.tex \documentclass[border=10pt]{standalone} \usepackage[cjk]{superfig} \sfsetrole{text}{sfTeal} \sfsetrole{img}{sfOrange} \sfsetrole{fuse}{sfViolet} \sfsetrole{out}{sfCoral} \begin{document} \begin{tikzpicture} \sfstage{S1}{双塔编码} \sfrow{R1}{12mm} \sfnode[role=text]{txt}{文本}{14mm}{10mm} \sfconn{e1}{} \sfnode[role=text]{te}{文本编码}{18mm}{10mm} \sfrowend \sflane{R1} \sfcaption{txt}{text}{token 序列} \sfcaption{te}{$E_t$}{文本向量} \sfrow{R2}{12mm} \sfnode[role=img]{img}{图像}{14mm}{10mm} \sfconn{e2}{} \sfnode[role=img]{ve}{视觉编码}{18mm}{10mm} \sfrowend \sflane{R2} \sfcaption{img}{image}{视觉输入} \sfcaption{ve}{$E_v$}{视觉向量} % Fusion sits to the right of the two encoders, on their shared east line. \sfnode[role=fuse, at={($(te.east)!0.5!(ve.east)+(20mm,0)$)}]{fu}{融合}{16mm}{10mm} \sfnode[role=out, at={($(fu.east)+(16mm,0)$)}]{dec}{解码}{16mm}{10mm} \sfnode[role=out, at={($(dec.east)+(16mm,0)$)}]{out}{输出}{14mm}{10mm} \sfarrow{te.east}{fu.west} \sfarrow{ve.east}{fu.west} \sfarrow{fu.east}{dec.west} \sfarrow{dec.east}{out.west} \sfnolane \sfcaption{fu}{fuse}{晚融合} \sfcaption{dec}{decode}{条件生成} \sfcaption{out}{out}{目标文本} \sfbbox{all} \sftopformula{F}{% $y = \mathrm{Dec}\bigl(\mathrm{Fuse}(E_t(x),\, E_v(I))\bigr)$} \sfmeaningbox{mb}{112mm}{all} {两个编码器互不共享权重,只在融合节点会合} {文本塔、视觉塔、融合、解码} {各塔独立编码;融合后才进入解码,所以任一侧的依赖都经过融合节点} \end{tikzpicture} \end{document}