## 一、Cora 数据集与图数据基础

### 1. Cora 数据集是什么

- 由机器学习论文组成，共 **2708 篇**，分为 7 类（神经网络、强化学习、理论等）。
    
- 词表大小 **1433**（去停用词、词频<10 的词）。
    
- 两个文件：
    
    - `.content`：论文特征（二进制词向量）+ 类别标签
        
    - `.cites`：引用关系（有向边）
        
- 任务：**有监督的图节点分类**（输入=节点特征+边，输出=类别标签）
    

### 2. 关于 ID 超出 2708 的疑问

- 示例中出现的 `180373`、`1120084` 等 ID 超出范围，可能是：
    
    - 数据预处理 ID 映射错误
        
    - 使用了扩展版 Cora-Full
        
    - 文件损坏或格式错误
        
- 建议从官方来源重新下载并验证 ID 范围。
    

### 3. PubMed Diabetes 数据集

- 与 Cora 类似但更大（约 19717 篇论文），文件：
    
    - `Pubmed-Diabetes.NODE.paper.tab`（节点特征+标签）
        
    - `Pubmed-Diabetes.DIRECTED.cites.tab`（有向引用图）
        

---

## 二、配置文件与 HOCON

### 1. `pyhocon.ConfigFactory.parse_file()`

- 解析 HOCON 格式配置文件为 Python 对象（`ConfigTree`）。
    
- 支持 `${变量}` 动态替换和路径拼接。
    

### 2. HOCON 变量引用原理

- `${file_path.workdir}` 会替换为 `../`，并与后续字符串自动拼接。
    
- 这是 **HOCON 的特性**，由 `pyhocon` 库实现，**不是 Python 自带功能**。
    
- 变量需 **先定义后引用**，否则报 `ConfigSubstitutionException`。
    

### 3. HOCON 注释写法

- 单行：`#` 或 `//`
    
- 多行：`/* */`
    
- 不支持嵌套多行注释。
    

### 4. `OrderedDict` vs `ConfigTree`

|特性|OrderedDict|ConfigTree|
|---|---|---|
|来源|Python 标准库|pyhocon|
|点号路径访问|❌|✅|
|变量替换|❌|✅|
|类型转换方法|❌|✅（get_int 等）|

---

## 三、路径问题排查

### 1. `../` 的含义

- 返回上一级目录（父目录），可连续使用 `../../`。
    

### 2. `FileNotFoundError` 常见原因

- 路径拼写错误、工作目录不对、文件不存在、斜杠方向问题
    
- 解决方案：
    
    - 用 `os.path.abspath()` 转绝对路径
        
    - 用 `os.path.exists()` 验证
        
    - 打印 `os.getcwd()` 检查工作目录
        

### 3. `RuntimeError: Parent directory models does not exist`

- 保存模型前需创建目录：
    
    python
    
    os.makedirs('models', exist_ok=True)
    

---

## 四、PyTorch 与图神经网络（GraphSAGE）

### 1. `nn.Parameter` 与参数初始化

- `self.weight = nn.Parameter(...)` 定义可训练参数。
    
- `nn.Linear` 等内置模块**自动封装**参数为 `nn.Parameter`。
    
- `init_params()` 遍历 `self.parameters()` 做 Xavier 初始化。
    

### 2. `super().__init__()` 的两种写法

- `super(GraphSage, self).__init__()`（Python 2 风格）
    
- `super().__init__()`（Python 3 推荐）
    

### 3. 监督 vs 无监督

- 若使用**人工标注标签**计算损失 → **监督学习**
    
- 若无标签、靠图结构自生成目标 → **无监督/自监督**
    

### 4. `mask` 矩阵的作用

- 形状 `[batch_size, num_unique_nodes]`，标记邻居连接关系。
    
- 行列索引构建：
    
    python
    
    column_indices = [unique_nodes[n] for neigh in samp_neighs for n in neigh]
    row_indices = [i for i in range(len(samp_neighs)) for _ in range(len(samp_neighs[i]))]
    mask[row_indices, column_indices] = 1
    

### 5. MEAN 聚合的归一化

python

num_neigh = mask.sum(1, keepdim=True)
mask = mask.div(num_neigh)
aggregated = torch.mm(mask, embed_matrix)

- 每行权重和为 1，实现邻居特征均值聚合。
    

### 6. 多层邻居映射 `_nodes_map`

- 第 1 层无需映射；第 2 层起需去重重新编号，避免节点 ID 冲突。
    

### 7. 反向传播与梯度更新

python

loss.backward()                  # 计算梯度
clip_grad_norm_(params, 5)       # 梯度裁剪防爆炸
optimizer.step()                 # 更新参数

### 8. 参数优化对象

- `self.weight` 被优化（可训练参数）
    
- `combined` 是中间张量，不直接优化（除非来自可训练嵌入层）
    

### 9. `embed_matrix = pre_hidden_embs[torch.LongTensor(unique_nodes_list)]`

- 从全局嵌入矩阵中按索引提取指定节点的嵌入。