如何理解fast_abs_rl的'抽取→改写→RL'三段式摘要架构?一张图读懂核心思想
【免费下载链接】fast_abs_rlCode for ACL 2018 paper: "Fast Abstractive Summarization with Reinforce-Selected Sentence Rewriting. Chen and Bansal"项目地址: https://gitcode.com/gh_mirrors/fa/fast_abs_rl
fast_abs_rl 是 ACL 2018 论文Fast Abstractive Summarization with Reinforce-Selected Sentence Rewriting的官方开源实现(PyTorch),它用"抽取→改写→RL"的三段式架构,把一篇长新闻快速改写成几句摘要。这篇文章不啃源码,带你用一张图 + 三个问题读懂它的核心思想。
📌 一图速览:fast_abs_rl 三段式数据流
整个模型就像一条"流水线工厂":
原始长文(CNN/DailyMail 新闻) │ ▼ ① 抽取器 rnn-ext(指针网络) │ 从几十句中挑出关键句,并自己决定"选几句就停" ▼ ② 改写器 CopySumm(seq2seq + 拷贝机制) │ 把每个关键句逐句改写成流畅的摘要句 ▼ 摘要结果(可选 beam search 重排,beam=5) │ └── ③ RL 段(A2C):用 ROUGE 分数当奖励, 回头训练 ① 的"选句眼光"三段各司其职:① 负责"选",② 负责"写",③ 负责"教 ① 选得更好"。记住这一点,剩下的细节都很好理解。
🧠 第一段:抽取器——指针网络挑关键句
抽取器(model/extract.py中的PtrExtractSumm)由三个部件组成:
- 句编码器(
ConvSentEncoder):用卷积网络把每个句子编码成一个向量; - 文章编码器(双向 LSTM):把整篇文章读通,理解全局;
- 指针网络(
LSTMPointerNet):像指针一样一步步"点"出该选哪句。
训练时它先用监督学习热身:先跑一个廉价的基线抽取器生成"伪标签"(脚本make_extraction_labels.py),再用train_extractor_ml.py把指针网络训练到位。这一步保证了 RL 阶段有一个靠谱的起点。
✍️ 第二段:改写器——带"拷贝机制"的 seq2seq
改写器(model/copy_summ.py中的CopySumm)是一个经典 encoder-decoder:读入一个关键句,逐词生成对应的摘要句。它的亮点是拷贝机制(copy mechanism)——生成每个词时,模型可以决定"自己造词"还是"从原文原样抄一个词"。
这对新闻摘要非常实用:人名、地名这类词照抄原文,既准确又不会生成乱码。改写器在 RL 阶段是冻结的,只当"翻译官",不参与强化学习,这正是整个架构"Fast"的关键。
🎯 第三段:RL——用 ROUGE 奖励教抽取器"会选句"
这是 fast_abs_rl 的灵魂。普通做法是把"选句"当分类问题,但作者换了一个思路:选句好不好,最终要看改写出来的摘要质量如何。于是用强化学习来优化选择过程:
| 角色 | 代码位置 | 职责 |
|---|---|---|
| Actor(演员) | PtrExtractorRLStop(model/rl.py) | 按概率采样下一句;额外加了一个"停止 token",学会自己决定选几句 |
| Critic(评论员) | PtrScorer(model/rl.py) | 预测基线奖励,降低策略梯度的方差 |
| 奖励函数 | metric.py | 改写结果与人工摘要的 ROUGE-L 分数 |
训练采用A2C(优势演员-评论员)算法,实现见 rl.py 中的a2c_train_step:每选一句就获得一次 ROUGE 奖励,多句奖励按折扣累积(γ=0.99),最后用"标准化奖励 − 基线"的优势更新选句策略。整个 RL 入口是train_full_rl.py,它加载前两段训练好的模型,只优化抽取器——轻量网络吃 RL,重量网络保持冻结,所以训练又快又稳。
⚡ 为什么这套"抽取→改写→RL"又快又好?
- 改写按句进行:每句独立改写,序列短、速度快,远快于对整篇文章一次性 seq2seq;
- RL 只训练小网络:指针网络远比完整 seq2seq 轻量,RL 开销小;
- 奖励端到端对齐目标:选句能力直接由"最终摘要的 ROUGE 分数"塑造,而非人工伪标签的上限。
效果上,测试集(CNN/DailyMail)的 ROUGE-1/2/L 达到 40.41 / 17.92 / 37.87,加上 beam=5 重排后进一步提升到 41.20 / 18.18 / 38.79(详见 README 的 Results 表格)。
🚀 动手体验:4 步训练 + 解码命令
先获取代码(仓库地址):
git clone https://gitcode.com/gh_mirrors/fa/fast_abs_rl按 README 准备 CNN/DailyMail 数据并设置DATA环境变量后,完整训练顺序是:
# 1. 预训练 word2vec 词向量 python train_word2vec.py --path=[path/to/word2vec] # 2. 生成抽取伪标签 python make_extraction_labels.py # 3. 分别用监督学习训练改写器、抽取器 python train_abstractor.py --path=[path] --w2v=[path] python train_extractor_ml.py --path=[path] --w2v=[path] # 4. 训练完整 RL 模型(只优化抽取器) python train_full_rl.py --path=[path] --abs_dir=[path] --ext_dir=[path]解码只需一条命令,beam=1为贪心解码,beam=5启用重排(decode_full_model.py):
python decode_full_model.py --path=[输出目录] --model_dir=[预训练模型] --beam=5 --test📂 核心文件速查表
| 想看懂什么 | 去哪里看 |
|---|---|
| 指针网络抽取器 | model/extract.py |
| 拷贝机制改写器 | model/copy_summ.py |
| Actor / Critic 网络 | model/rl.py |
| A2C 训练循环与奖励 | rl.py、metric.py |
| 三模型组装与加载 | decoding.py |
| 完整解码与重排 | decode_full_model.py |
| RL 总训练入口 | train_full_rl.py |
一句话总结
fast_abs_rl 的智慧在于分工:指针网络先学会"挑句",拷贝改写器负责"写句",再用最终摘要的 ROUGE 分数作为奖励,回头把"挑句"这一步打磨到极致——轻量网络做 RL、按句改写求速度,这就是它名字里"Fast"的由来。
【免费下载链接】fast_abs_rlCode for ACL 2018 paper: "Fast Abstractive Summarization with Reinforce-Selected Sentence Rewriting. Chen and Bansal"项目地址: https://gitcode.com/gh_mirrors/fa/fast_abs_rl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考