ai-paper-reader

深度解析 AI 论文,生成可直接发布的专业阅读笔记

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "ai-paper-reader" with this command: npx skills add frostant/awesome-claude-skills/frostant-awesome-claude-skills-ai-paper-reader

AI 论文阅读笔记生成器

核心目标

生成可直接发布到技术社区的论文阅读笔记(知乎、掘金、公众号等)。

笔记要求:

  • 内容完整:核心技术细节不遗漏,创新点深刻阐述
  • 专业易读:技术博客风格,既有深度又便于理解
  • 客观准确:基于论文内容分析,不添加主观臆断
  • 深度思考:通过 Q&A 环节帮助读者深入理解

写作规范

应该做

  1. 专业准确的表述

    • 使用领域内规范的术语
    • 公式和符号严格对应论文原文
    • 技术细节描述清晰无歧义
  2. 深入浅出的解释

    • 复杂概念先给直觉,再给细节
    • 用类比帮助理解抽象概念
    • 公式逐项解释变量含义
  3. 结构清晰的组织

    • 逻辑层次分明
    • 重点内容突出
    • 适当使用图表辅助说明
  4. 有价值的深度分析

    • 分析设计选择背后的原因
    • 对比与相关工作的异同
    • 指出方法的适用范围和局限

必须避免

  1. AI 套话和模板句式

    • ❌ "本文的核心贡献是..."
    • ❌ "该方法的优势在于..."
    • ❌ "综上所述..."
    • ❌ "值得注意的是..."
    • ❌ "具有重要意义/广泛应用前景..."
  2. 空洞的总结和评价

    • ❌ "这是一篇重要的工作"
    • ❌ "为该领域提供了新思路"
    • ❌ 不带具体分析的泛泛而谈
  3. 过度的格式装饰

    • ❌ 大量 emoji
    • ❌ 每句话都加粗
    • ❌ 过多层级嵌套
  4. 不必要的第一人称

    • ❌ "我认为..."
    • ❌ "我的理解是..."
    • 保持客观叙述视角

笔记结构

零、元信息(笔记开头)

每篇笔记开头需包含以下信息,帮助读者快速判断是否继续阅读:

> **论文**:Actions Speak Louder than Words: Trillion-Parameter Sequential Transducers for Generative Recommendations
> **作者**:Meta AI
> **发表**:ICML 2024
> **阅读时长**:约 15 分钟
> **难度**:⭐⭐⭐⭐ (需要 Transformer、推荐系统基础)
> **前置知识**:Attention 机制、DLRM、Scaling Law 概念

难度等级说明

  • ⭐ 入门级:无需专业背景
  • ⭐⭐ 基础级:了解深度学习基础
  • ⭐⭐⭐ 进阶级:熟悉相关领域
  • ⭐⭐⭐⭐ 专业级:需要较深的领域知识
  • ⭐⭐⭐⭐⭐ 专家级:涉及复杂数学或前沿研究

一、TL;DR

用 2-3 句话概括论文的核心创新,让没时间细读的读者快速抓住重点。

## TL;DR

DLRM 等传统推荐模型依赖大量人工特征且无法 scale,本文提出将推荐问题转化为序列生成问题。核心创新是 HSTU 架构:用 Pointwise Attention 替代 Softmax 来保留用户偏好的绝对强度信息,使推荐系统首次展现出类似 LLM 的 Scaling Law。

要求

  • 2-3 句话,不超过 100 字
  • 必须包含:问题背景 + 核心方案 + 关键创新点
  • 避免泛泛而谈,要有具体技术点

二、论文概述

简明扼要地回答三个问题:

  • 解决什么问题:一句话描述
  • 核心方案:一句话概括
  • 主要贡献:2-3 点列举
## 论文概述

**问题**:大规模推荐系统无法像 LLM 一样通过增加计算量持续提升质量

**方案**:将推荐问题从"特征工程+判别式模型"转变为"序列建模+生成式模型"

**贡献**:
1. 提出 Generative Recommenders (GRs) 范式,实现推荐系统的 Scaling Law
2. 设计 HSTU 架构,用 Pointwise Attention 替代 Softmax 保留强度信息
3. 提出 M-FALCON 推理算法,实现高效的候选打分

三、背景与动机

说明现有方法的问题,以及为什么需要新方法:

  • 现有方法怎么做的
  • 存在什么问题/瓶颈
  • 问题的根本原因是什么

四、核心方法(重点)

这是笔记的核心部分,要求完整、深入、不遗漏

组织方式

  1. 整体架构

    • 给出架构图
    • 说明数据流向
    • 标注关键模块
  2. 核心模块详解(对每个关键模块)

    • 输入输出说明
    • 核心公式 + 逐项解释
    • 伪代码/代码实现
    • 设计选择的原因分析
  3. 关键技术细节

    • 训练策略
    • 超参数设置
    • 实现 tricks

示例格式

## 核心方法

### 整体架构

[架构图]

数据流:用户历史序列 → Embedding → HSTU Layers × L → 预测头

### HSTU Layer 详解

#### 输入输出
- 输入:X ∈ R^{N×d},N 为序列长度,d 为嵌入维度
- 输出:Y ∈ R^{N×d}

#### 核心公式

**Pointwise Projection**:
$$U, V, Q, K = \text{Split}(\phi_1(f_1(X)))$$

其中:
- $\phi_1$:SiLU 激活函数
- $f_1$:单层线性变换
- Split 将输出分为四个向量

**Spatial Aggregation**:
$$A(X)V(X) = \phi_2(Q(X)K(X)^T + r_{ab}) V(X)$$

关键点:使用 SiLU 而非 Softmax,保留注意力的绝对强度信息。

#### 代码实现

```python
class HSTULayer(nn.Module):
    def forward(self, x):
        # Pointwise Projection
        projected = F.silu(self.proj_in(x))
        u, v, q, k = projected.split([...], dim=-1)

        # Spatial Aggregation (不是 Softmax!)
        attn = F.silu(q @ k.T + self.rel_bias)
        out = self.norm(attn @ v) * u

        return x + self.proj_out(out)

设计分析

为什么用 SiLU 而不是 Softmax?

Softmax 会将注意力归一化到概率分布,这在推荐场景下会丢失重要信息...


### 五、实验分析

不是罗列数字,而是提炼关键结论:

- **主实验结果**:与 baseline 对比的核心发现
- **消融实验**:各组件的贡献分析
- **Scaling 分析**:计算量与性能的关系(如有)
- **局限性**:方法在什么情况下效果不好

### 六、深度理解问答

通过精心设计的问题,帮助读者深入理解论文的关键点。

**问答直接展示,不使用折叠**。

```markdown
## 深度理解问答

### Q1: 为什么 Softmax Attention 不适合推荐场景?

推荐场景需要预测用户偏好的**绝对强度**(如观看时长),而非只是**相对排序**。

考虑两个用户:
- 用户 A:10 次历史交互
- 用户 B:100 次历史交互

使用 Softmax 时,两者的注意力权重都会被归一化到 [0,1],导致"用户 B 更活跃"这一信息丢失。

而 Pointwise Attention 保留了累加的原始 magnitude,模型可以学到活跃度差异。

### Q2: HSTU 如何用 2 个线性层替代 Transformer 的 6 个?

标准 Transformer 每层需要:
- Q, K, V 投影:3 个线性层
- Output Projection:1 个线性层
- FFN:2 个线性层(扩展+压缩)

HSTU 的简化:
1. **融合 Q, K, V, U 投影**:一个线性层同时生成四个向量
2. **用 U 门控替代 FFN**:`output * U` 实现类似的非线性变换

代价是单层表达能力下降,但可以通过堆叠更多层来补偿。

### Q3: Stochastic Length 训练为什么能丢弃 70% token 而效果几乎不变?

关键在于用户行为的**统计特性**:

1. **时间重复性**:用户会反复与相似内容交互,信息冗余度高
2. **兴趣低秩性**:10000 次交互可能只涉及 20 个主要兴趣点
3. **最近优先**:采样时对最近行为加权,保留最相关的信息

只要采样数量大于兴趣类别数的一定倍数,就能以高概率覆盖所有兴趣。

七、总结与思考

客观总结论文的贡献和局限:

## 总结

### 核心贡献
- 证明了推荐系统可以遵循 Scaling Law
- 提出了适合推荐场景的 Attention 变体

### 局限性
- 冷启动场景:历史序列太短时优势不明显
- 计算成本:需要大量 GPU 资源
- 实时性:长序列推理的延迟挑战

### 适用场景
- 用户历史丰富的场景(>100 次交互)
- 有充足计算资源
- 对实时性要求不是极端严格

目录结构规范

论文和阅读笔记应组织在统一的子目录下,便于管理和检索:

paper-notes/
├── hstu/                           # 每篇论文一个目录,使用简短名称
│   ├── paper.pdf                   # 原始论文 PDF
│   ├── README.md                   # 阅读笔记(主文件)
│   └── images/                     # 提取的图表
│       ├── fig1_architecture.png
│       ├── fig2_method.png
│       └── fig3_scaling.png
│
├── attention-is-all-you-need/
│   ├── paper.pdf
│   ├── README.md
│   └── images/
│
└── din-deep-interest-network/
    ├── paper.pdf
    ├── README.md
    └── images/

命名规范

  • 目录名:论文简称或关键词,小写,用 - 连接
  • 笔记文件:统一命名为 README.md,便于 GitHub 直接预览
  • 图片目录:统一命名为 images/

图片命名规范

fig{序号}_{类型}_{简述}.png

类型:
- arch: 架构图
- method: 方法流程
- result: 实验结果
- ablation: 消融实验
- compare: 对比图

示例:
- fig1_arch_overall.png
- fig2_method_attention.png
- fig3_result_scaling.png

Q&A 环节设计指南

问题类型

  1. 原理理解类

    • 为什么这样设计?
    • 与替代方案相比有何优势?
  2. 细节辨析类

    • 某个符号/操作的具体含义
    • 容易混淆的概念区分
  3. 边界条件类

    • 什么情况下方法会失效?
    • 假设条件是什么?
  4. 延伸思考类

    • 能否迁移到其他场景?
    • 有哪些可能的改进方向?

答案要求

  • 直接展示:不使用折叠,读者可以顺畅阅读
  • 有理有据:答案要有论证,不是简单断言
  • 适当举例:用具体例子帮助理解
  • 承认不确定:对于论文未说明的部分,可以标注"推测"

图表处理

必须提取的图表

  • 整体架构图
  • 核心方法流程图
  • 关键实验结果(Scaling Law 曲线等)

图表说明规范

![架构图](images/fig1_architecture.png)

**图示内容**:HSTU 的整体架构,左侧为 DLRM 对比

**关键信息**:
- 输入为统一的物品-行为交替序列
- HSTU Layer 可以无限堆叠
- 输出为多任务预测头

**与正文对应**:第 3.2 节详细描述

图片提取工具

学术论文中的图表有两种类型,需要不同的提取方式:

类型特点提取方法
嵌入式图片作者插入的 PNG/JPEGget_images()
矢量图形架构图、流程图等绘制的图形cluster_drawings()

方法 1: 提取嵌入式图片

适用于论文中直接插入的位图(如实验结果截图、照片等):

import fitz  # PyMuPDF
import os

def extract_embedded_images(pdf_path, output_dir):
    """提取 PDF 中嵌入的位图"""
    os.makedirs(output_dir, exist_ok=True)
    doc = fitz.open(pdf_path)

    for page_num in range(len(doc)):
        page = doc[page_num]
        images = page.get_images(full=True)

        for img_idx, img in enumerate(images):
            xref = img[0]
            base = doc.extract_image(xref)
            image_bytes = base["image"]
            image_ext = base["ext"]

            # 过滤过小的图片(可能是图标/装饰)
            if base["width"] > 100 and base["height"] > 100:
                output_path = f"{output_dir}/page{page_num+1}_img{img_idx+1}.{image_ext}"
                with open(output_path, "wb") as f:
                    f.write(image_bytes)

    doc.close()

方法 2: 提取矢量图形(推荐)

适用于论文中绑制的架构图、流程图、图表等矢量图形:

import fitz
import os

def extract_vector_figures(pdf_path, output_dir, dpi=200, min_size=100):
    """
    使用 cluster_drawings() 识别矢量图形区域并截图

    Args:
        pdf_path: PDF 文件路径
        output_dir: 输出目录
        dpi: 输出分辨率(默认 200,可提高到 300 获得更清晰的图片)
        min_size: 最小尺寸阈值,过滤装饰线条(默认 100pt)
    """
    os.makedirs(output_dir, exist_ok=True)
    doc = fitz.open(pdf_path)

    figures = []
    for page_num in range(len(doc)):
        page = doc[page_num]

        # 识别矢量图形的聚类区域
        # x_tolerance/y_tolerance 控制相邻元素的合并距离
        try:
            drawing_rects = page.cluster_drawings(
                x_tolerance=3,
                y_tolerance=3
            )
        except Exception:
            # 某些 PDF 可能不支持,跳过
            continue

        for idx, rect in enumerate(drawing_rects):
            # 过滤过小的区域(可能是线条/装饰)
            if rect.width < min_size or rect.height < min_size:
                continue

            # 扩展边界,避免裁切太紧
            rect = rect + (-10, -10, 10, 10)
            # 确保不超出页面边界
            rect = rect & page.rect

            # 高分辨率截图
            zoom = dpi / 72
            mat = fitz.Matrix(zoom, zoom)
            pix = page.get_pixmap(matrix=mat, clip=rect)

            output_path = f"{output_dir}/page{page_num+1}_fig{idx+1}.png"
            pix.save(output_path)
            figures.append({
                "page": page_num + 1,
                "path": output_path,
                "rect": rect
            })

    doc.close()
    return figures

方法 3: 手动指定区域截取

当自动识别效果不理想时,可手动指定坐标:

import fitz

def crop_figure(pdf_path, page_num, rect, output_path, dpi=200):
    """
    从 PDF 指定页面裁剪特定区域

    Args:
        pdf_path: PDF 路径
        page_num: 页码(从 1 开始)
        rect: (x0, y0, x1, y1) 坐标,单位为点(pt),72pt = 1英寸
        output_path: 输出图片路径
        dpi: 分辨率
    """
    doc = fitz.open(pdf_path)
    page = doc[page_num - 1]

    clip = fitz.Rect(rect)
    zoom = dpi / 72
    mat = fitz.Matrix(zoom, zoom)

    pix = page.get_pixmap(matrix=mat, clip=clip)
    pix.save(output_path)
    doc.close()

# 使用示例:裁剪第 2 页的某个区域
# 坐标可通过 PDF 阅读器查看,或先用方法 2 识别后微调
crop_figure(
    "paper.pdf",
    page_num=2,
    rect=(50, 100, 550, 400),  # 左上角(50,100) 到 右下角(550,400)
    output_path="./images/fig1_architecture.png"
)

智能提取(综合方案)

自动尝试多种方法,提取所有图表:

import fitz
import os

def smart_extract_figures(pdf_path, output_dir, dpi=200):
    """
    智能提取论文中的所有图表
    1. 先使用 cluster_drawings 识别矢量图形
    2. 再提取嵌入式位图
    3. 自动过滤和去重
    """
    os.makedirs(output_dir, exist_ok=True)
    doc = fitz.open(pdf_path)
    results = {"vector": [], "embedded": []}

    for page_num in range(len(doc)):
        page = doc[page_num]

        # 1. 提取矢量图形
        try:
            rects = page.cluster_drawings(x_tolerance=3, y_tolerance=3)
            for idx, rect in enumerate(rects):
                if rect.width > 100 and rect.height > 100:
                    rect = (rect + (-10, -10, 10, 10)) & page.rect
                    zoom = dpi / 72
                    pix = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom), clip=rect)
                    path = f"{output_dir}/p{page_num+1}_vec{idx+1}.png"
                    pix.save(path)
                    results["vector"].append(path)
        except:
            pass

        # 2. 提取嵌入式图片
        for img_idx, img in enumerate(page.get_images(full=True)):
            xref = img[0]
            base = doc.extract_image(xref)
            if base["width"] > 100 and base["height"] > 100:
                path = f"{output_dir}/p{page_num+1}_img{img_idx+1}.{base['ext']}"
                with open(path, "wb") as f:
                    f.write(base["image"])
                results["embedded"].append(path)

    doc.close()
    print(f"提取完成: {len(results['vector'])} 个矢量图, {len(results['embedded'])} 个位图")
    return results

# 使用示例
results = smart_extract_figures("paper.pdf", "./images/")

常见问题

Q: 提取的图片包含多个 Figure 合在一起?

调小 x_tolerancey_tolerance 参数(如 1-2),使聚类更严格。

Q: 同一个 Figure 被切成多块?

调大容差参数(如 10-20),使相邻元素合并。

Q: 某些 Figure 没有被识别?

  1. 可能是嵌入式图片,尝试 get_images() 方法
  2. 使用手动指定区域的方法

Q: 图片模糊?

提高 dpi 参数到 300 或更高。


使用方式

基本用法

请阅读这篇论文,生成一篇专业的阅读笔记,适合发布到技术社区。

指定重点

请阅读这篇论文,重点分析:
1. HSTU 与标准 Transformer 的区别
2. Scaling Law 实验的设置和结论
3. 在工业场景的落地可行性

对比分析

请对比分析这两篇论文在 XXX 问题上的不同解法。

技术要求

内容完整性

  • 核心公式必须包含,逐项解释
  • 关键算法有伪代码实现
  • 重要超参数和训练细节不省略
  • 消融实验的关键结论要提炼

深度要求

  • 分析"为什么这样设计"
  • 与相关工作建立联系
  • 指出方法的边界和局限

可读性

  • 先直觉后细节
  • 代码和公式配合
  • 长公式分步解释

依赖配置

# 图片提取
pip install pymupdf

# PDF 转图片(可选)
pip install pdf2image

MCP 配置(可选)

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@anthropic/mcp-server-filesystem", "/path/to/papers"]
    },
    "notion": {
      "command": "npx",
      "args": ["-y", "@notionhq/notion-mcp-server"],
      "env": {
        "OPENAPI_MCP_HEADERS": "{\"Authorization\": \"Bearer YOUR_TOKEN\", \"Notion-Version\": \"2022-06-28\"}"
      }
    }
  }
}

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Research

content-research-writer

No summary provided by upstream source.

Repository SourceNeeds Review
Research

lead-research-assistant

No summary provided by upstream source.

Repository SourceNeeds Review
General

webapp-testing

No summary provided by upstream source.

Repository SourceNeeds Review
General

skill-creator

No summary provided by upstream source.

Repository SourceNeeds Review