news 2026/6/25 14:08:00

通俗理解记忆网络(Memory Network)——从0到1彻底掌握End-to-End MemNN

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
通俗理解记忆网络(Memory Network)——从0到1彻底掌握End-to-End MemNN

目录

  • 1. 为什么Memory Network如此重要?
  • 2. Memory Networks vs 传统RNN/LSTM
  • 3. 原始Memory Networks(2014,非端到端)
  • 4. End-to-End Memory Networks(MemN2N)核心详解
    • 4.1 单跳(Single Hop)完整架构
    • 4.2 输入编码(Embedding + Position Encoding + Temporal Encoding)
    • 4.3 Attention机制推导
    • 4.4 多跳(Multi-Hop)推理过程
  • 5. 数学公式完整推导
  • 6. PyTorch完整可运行代码(单跳 + 3-Hop + PE + TE)
  • 7. bAbI数据集实验复现与结果分析
  • 8. 主流变体对比(DMN / Key-Value MemNN / Memformer)
  • 9. 局限性、为什么被Transformer取代?RAG的继承
  • 10. 总结 + 思考题

1. 为什么Memory Network如此重要?

2014-2015年,Facebook AI Research(FAIR)连续推出两篇革命性论文:

  • Memory Networks(Weston et al., ICLR 2015)
  • End-to-End Memory Networks(Sukhbaatar et al., NeurIPS 2015)

这是第一个真正可微分的外部记忆 + 多跳推理框架,奠定了现代Memory-Augmented Neural NetworksRetrieval-Augmented Generation (RAG)的理论基础。

它首次在bAbI数据集上实现了接近人类水平的多跳推理(3-hop以上),远超当时的LSTM。

2. Memory Network 与 RNN/LSTM 的本质区别

维度LSTM/GRUMemory Network (MemNN)
记忆方式隐状态 h_t(固定维度)外部显式Memory(N个向量)
推理方式单步顺序多跳(Multi-hop)注意力
长距离依赖衰减严重可通过多次跳跃直接访问
可解释性高(可可视化attention)
外部知识注入困难天然支持

4. End-to-End Memory Networks 详解(最重要章节)

4.1 单跳架构图(经典原图)

核心流程(Single Hop)

  1. Story → 嵌入为 Memory M(N×d)
  2. Question → 嵌入为 u(d维)
  3. Attention:p_i = softmax(u^T m_i)
  4. o = Σ p_i * c_i
  5. 最终预测:â = softmax(W (o + u))
4.2 输入模块(Input Module)进阶技巧
  • Bag-of-Words(最基础)
  • Position Encoding (PE):强烈推荐!解决词序问题
    P E i , j = ( 1 − i N ) ⋅ ( 1 − j d ) + i N ⋅ j d ( j 为维度 ) PE_{i,j} = (1 - \frac{i}{N}) \cdot (1 - \frac{j}{d}) + \frac{i}{N} \cdot \frac{j}{d} \quad (j \text{为维度})PEi,j=(1Ni)(1dj)+Nidj(j为维度)
  • Temporal Encoding:给每个sentence加上时间向量 T_i(可学习)
4.3 多跳(Multi-Hop)机制(最强大之处)

多跳更新规则
u k + 1 = u k + o k u^{k+1} = u^k + o^kuk+1=uk+ok
其中 o^k 是第k跳的输出向量

通常3-hop即可解决bAbI中绝大多数多跳任务。


5. 完整数学公式推导

设:

  • Story有N个sentence,每个sentence有T个词
  • Embedding维度 d = 50 或 100

嵌入矩阵

  • A, B, C, W ∈ R^{V × d} (V为词表大小)

第k跳计算
m i k = A k x i + T i A ( Input Memory ) m_i^k = A^k x_i + T_i^A \quad (\text{Input Memory})mik=Akxi+TiA(Input Memory)
c i k = C k x i + T i C ( Output Memory ) c_i^k = C^k x_i + T_i^C \quad (\text{Output Memory})cik=Ckxi+TiC(Output Memory)
p i k = softmax ( ( u k ) T m i k ) p_i^k = \text{softmax}( (u^k)^T m_i^k )pik=softmax((uk)Tmik)
o k = ∑ i = 1 N p i k c i k o^k = \sum_{i=1}^N p_i^k c_i^kok=i=1Npikcik
u k + 1 = u k + o k u^{k+1} = u^k + o^kuk+1=uk+ok

最终:
a ^ = softmax ( W ( u K + o K ) ) \hat{a} = \text{softmax}(W (u^K + o^K))a^=softmax(W(uK+oK))


6. PyTorch完整高质量实现(推荐收藏)

importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassEndToEndMemoryNetwork(nn.Module):def__init__(self,vocab_size,embed_dim=64,num_hops=3,max_sent=20):super().__init__()self.embed_dim=embed_dim self.num_hops=num_hops self.max_sent=max_sent# Embedding (A, B, C)self.A=nn.Embedding(vocab_size,embed_dim)self.B=nn.Embedding(vocab_size,embed_dim)self.C=nn.Embedding(vocab_size,embed_dim)# 可选:Position Encoding + Temporal Encodingself.position_encoding=self._generate_position_encoding(max_sent,embed_dim)self.temporal_A=nn.Parameter(torch.randn(max_sent,embed_dim))self.temporal_C=nn.Parameter(torch.randn(max_sent,embed_dim))self.W=nn.Linear(embed_dim,vocab_size)def_generate_position_encoding(self,max_sent,dim):# 经典Position Encoding from paperencoding=torch.zeros(max_sent,dim)foriinrange(max_sent):forjinrange(dim):ifj%2==0:encoding[i,j]=(1-i/max_sent)-(j/dim)*(i/max_sent)else:encoding[i,j]=(1-i/max_sent)+(j/dim)*(i/max_sent)returnnn.Parameter(encoding,requires_grad=False)defforward(self,story,question):# story: (batch, num_sent, num_word)batch_size,num_sent,num_word=story.shape# Input Memory mm=self.A(story)# (batch, sent, word, d)m=m.sum(dim=2)+self.position_encoding[:num_sent]+self.temporal_A[:num_sent]# Question embedding u0u=self.B(question).sum(dim=1)# (batch, d)forhopinrange(self.num_hops):# Attentionu_temp=u.unsqueeze(1)# (batch, 1, d)attn=torch.matmul(u_temp,m.transpose(1,2))# (batch, 1, sent)p=F.softmax(attn.squeeze(1),dim=-1)# (batch, sent)# Output Memory cc=self.C(story).sum(dim=2)+self.position_encoding[:num_sent]+self.temporal_C[:num_sent]o=torch.matmul(p.unsqueeze(1),c).squeeze(1)# (batch, d)u=u+o# Update query vector# Final predictionlogits=self.W(u)returnlogits

7. bAbI 10k 实验结果(经典数据)

模型Mean Error (%)Failed Tasks (≤95%)
LSTM48.720
MemNN (Strong Supervision)6.82
MemN2N (1-hop)18.414
MemN2N (3-hop)12.18
MemN2N (3-hop + PE + TE)6.92
DMN+5.81

结论3-hop + Position Encoding + Temporal Encoding是MemN2N的甜点配置。


9. 为什么后来被Transformer + RAG 取代?

Memory Network 的致命局限

  1. Memory 固定大小(N=20~50),无法处理长文档
  2. 每次都全Attention,O(N) 计算开销
  3. 无法处理超长上下文(>512 token)

现代继承者

  • RAG:用Dense Retriever + LLM(Memory Network的精神继承者)
  • Memformer/Infinite Attention
  • Transformer-XL + Memory
  • Longformer / Reformer

总结

End-to-End Memory Networks 是深度学习历史上第一个真正实现“可微分外部记忆 + 多跳推理”的里程碑模型。

虽然已被Transformer时代超越,但它的思想(External Memory + Soft Attention + Multi-Hop)深刻影响了:

  • RAG
  • Memory-Augmented LLMs
  • Agent Memory
  • Knowledge Graph Reasoning

思考题(欢迎评论区讨论)

  1. 如果把Memory Network的Memory换成Key-Value Memory,能解决什么问题?
  2. 在长文档QA上,如何把MemNN思想与Sliding Window结合?
  3. 你觉得未来最有潜力的Memory架构是什么?

欢迎点赞 + 收藏 + 留言,我看到高赞评论会继续更新进阶版(包括Key-Value MemNN完整代码、DMN+实现、RAG vs MemNN对比实验)!

参考文献

  • End-To-End Memory Networks (Sukhbaatar et al., NeurIPS 2015)
  • Memory Networks (Weston et al., ICLR 2015)
  • Dynamic Memory Networks (Kumar et al., ICML 2016)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 18:24:30

渗透神器 - BurpSuite - 基础篇

渗透神器 - BurpSuite - 基础篇 一、什么是BurpSuite? 因为这个kali系统里面都是自带的,我这里就不讲安装方法了 BurpSuite是一款集成化的渗透测试工具,包含了很多功能,可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。 …

作者头像 李华
网站建设 2026/6/18 16:58:01

Node.js面试常见问题与高频考点解析

作为多年参与Node.js技术招聘的面试官,我发现很多候选人对面试考察的重点缺乏清晰认识。Node.js面试不仅考查语法熟练度,更关注对运行时特性、异步模型和生态工具的理解深度。以下是几个高频出现的核心考察领域。 Node.js面试中事件循环如何考察 事件循环…

作者头像 李华
网站建设 2026/6/16 17:16:36

leetcode 941. Valid Mountain Array 有效的山脉数组-耗时100

Problem: 941. Valid Mountain Array 有效的山脉数组 耗时100%&#xff0c;数组长度需要>3&#xff0c;且存在上升至少需要arr[0] < arr[1]&#xff0c;然后遍历数组&#xff0c;若arr[i] < arr[i-1]则改变方向&#xff0c;若dir<0 && arr[i] > arr[i-1…

作者头像 李华
网站建设 2026/6/14 20:35:44

STM32_新建工程(标准库版)

文章目录工程模板下载一、新建工程目录   新建模版目录   在目录下新建子文件夹  建立好目录后&#xff0c;拷贝文件二、新建工程   1、Keil5新建一个工程 Template   2、选择CPU型号   3、在线添加库文件&#xff08;直接关闭&#xff09;   4、工程中添加组文件…

作者头像 李华
网站建设 2026/6/13 0:41:55

建议收藏|9个AI论文软件深度测评,专科生毕业论文+开题报告全攻略

对于专科生来说&#xff0c;撰写毕业论文和开题报告是一项既重要又充满挑战的任务。随着AI技术的不断发展&#xff0c;越来越多的工具被应用于学术写作中&#xff0c;但如何选择真正适合自己需求的产品成为难题。为此&#xff0c;我们基于2026年的实测数据与用户反馈&#xff0…

作者头像 李华