[FEAT#59] neuron Phase 9 — group-as-node graph hidden layer foundations - #60
Conversation
신규 모듈 src/graphlm/neuron/graph_group.py:
- GroupGraphLinear: H 채널을 group_size 단위로 묶어 graph node 로 다루는 linear
- weight: 4D block tensor (n_groups_out, n_groups_in, group_size, group_size)
- adj: 학습 가능 continuous routing scalar (n_groups_out, n_groups_in)
- forward: y[go] = Σ_gi adj[go, gi] · (x[gi] @ W[go, gi]) (einsum block matmul)
- adj_init="full" → 표준 Linear 와 forward 동치 (function preserving)
- adj_init="identity" → block-diagonal (가장 sparse 시작)
- freeze_adjacency / sparsify_adjacency stub — Phase 10+ sparsification 학습용
신규 모듈 src/graphlm/neuron/graph_group_demo.py:
- GroupGraphMLPLM — 3 arch (plain Linear / group_full / group_identity) 비교용
- train_group_graph_mlp 학습 헬퍼
tests/neuron/test_graph_group.py — 13 신규 테스트:
- shape, validation, function preservation (adj=full → Linear 등치 수학적 검증)
- adj=identity 시 block-diagonal forward 입증
- weight + adj 양쪽 gradient 흐름
- freeze_adjacency / sparsify_adjacency 동작 + edge case
notebooks/02-function-level/08-phase9-group-graph-foundations.ipynb:
- 3 × 2 sweep: arch ∈ {plain, group_full, group_identity} × seed ∈ {42, 123}
- §5 final_loss 비교 / §6 학습된 adjacency heatmap / §7 loss curve
85/85 tests pass.
Notion 아키텍처 구성 계획의 B 진입:
https://www.notion.so/36ce8b70b7aa818cbf1fe71687b449b8
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
📝 WalkthroughWalkthroughThis PR introduces Phase 9 group-as-node graph linear layers, implementing ChangesPhase 9 Group-as-Node Graph Linear Implementation
Sequence Diagram(s)sequenceDiagram
participant Notebook
participant TrainFunc as train_group_graph_mlp
participant Model as GroupGraphMLPLM
participant Embedding
participant FC1 as fc1 (GroupGraphLinear)
participant Act as GELU+LayerNorm
participant FC2 as fc2 (Linear/GroupGraphLinear)
Notebook->>TrainFunc: Call with arch, hyperparams
TrainFunc->>Model: Initialize model (arch-dependent)
loop max_steps
TrainFunc->>Model: Forward on batch
Model->>Embedding: Token IDs
Embedding->>FC1: Embeddings (flattened)
FC1->>Act: Hidden (plain or grouped)
Act->>FC2: Activated features
FC2->>Model: Logits
Model->>TrainFunc: Loss
TrainFunc->>Model: Backward + optimizer step
end
alt arch != "plain"
TrainFunc->>FC1: Snapshot adj
TrainFunc->>FC2: Snapshot adj
end
TrainFunc->>Notebook: Return dict{losses, final_loss, final_adj}
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request introduces Phase 9 group-as-node graph hidden layer foundations, implementing the GroupGraphLinear layer, a demo MLP-LM, and associated tests. The reviewer feedback points out three valuable improvement opportunities: correcting a Kaiming initialization bug where nn.init.kaiming_uniform_ miscalculates fan_in on a 4D tensor, simplifying the identity adjacency matrix creation using torch.eye directly, and optimizing the sparsification logic using masked_fill_ instead of multiplying by a casted mask.
There was a problem hiding this comment.
Pull request overview
Phase 9(neuron)에서 hidden layer를 group-as-node 그래프 구조로 표현하기 위한 기반을 추가하는 PR입니다. GroupGraphLinear를 도입해 채널을 group_size 단위로 묶어 block weight + 학습 가능한 adjacency로 라우팅을 학습할 수 있게 하고, 이를 검증/실험하기 위한 demo와 테스트/노트북을 함께 제공합니다.
Changes:
GroupGraphLinear(block weight + adjacency) 신규 구현 및 public export 추가- 비교 실험용
GroupGraphMLPLM/학습 루프 헬퍼 신규 추가 - shape/검증/function-preservation/gradient/sparsify 등 테스트 13개 및 Phase 9 노트북 추가
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
src/graphlm/neuron/graph_group.py |
Group-as-node 그래프 선형 레이어(블록 weight + adjacency) 핵심 구현 추가 |
src/graphlm/neuron/graph_group_demo.py |
plain vs group_full vs group_identity 비교용 MLP-LM 및 학습 헬퍼 추가 |
tests/neuron/test_graph_group.py |
초기화/shape/동치성/gradient/freeze/sparsify 검증 테스트 추가 |
src/graphlm/neuron/__init__.py |
GroupGraphLinear를 neuron 패키지 public API로 export |
notebooks/02-function-level/08-phase9-group-graph-foundations.ipynb |
Phase 9 sweep 실험 및 adjacency/loss 시각화 노트북 추가 |
graph_group.py: - kaiming_uniform_ fan_in 잘못 계산 (4D tensor) → in_features 기반 직접 bound 로 standard Linear 와 동일 스케일 init (gemini #3301524127, Copilot #3301531321) - torch.eye(n, m) 직접 사용 (max+slice+contiguous 단순화) (gemini #3301524134) - masked_fill_ 사용 (mul_(mask.to(dtype)) 단순화) (gemini #3301524139) - _validate_groupable 에 group_size >= 1 검증 추가 (ZeroDivisionError 회피) (Copilot #3301531298) - adj_init='identity' 가 rectangular 일 때 명시적 ValueError (의미 모호 거부) (Copilot #3301531337) - forward 의 x.view → x.reshape (non-contiguous tensor 안전) (Copilot #3301531355) graph_group_demo.py: - 'nearest multiple로 pad' 주석 부정확 → 'caller 책임' 으로 정정 (Copilot #3301531359) - arch='group_identity' 시 fc2 는 'group_full' fallback — fc2 (hidden→vocab) 직사각형 이라 identity 의미 모호. 비교 공정성 위해 fc2 는 항상 full (Copilot #3301531369) 85/85 tests pass.
graph_channel.py: - import torch.nn.functional as F (Copilot #3301736141) — # noqa: N812 제거 + 다른 demo 와 import 스타일 통일 - 0-init 거부 에러 메시지에서 'feedback_no_zero_init.md' 제거 → repo-resolvable 'Phase 9 PR #60' 로 교체 (Copilot #3301736167) - module docstring 의 link 도 동일 정리 - sparsify_adj 에서 self.adj.data.masked_fill_ 명시 — leaf+requires_grad in-place 안전성 (gemini #3301728271) graph_group.py: - sparsify_adjacency 도 동일 .data 패턴으로 (consistency) notebooks/02-function-level/09-phase10-...ipynb: - 헤더의 broken link → Phase 9 PR #60 GitHub URL 로 (Copilot #3301736194) tests/neuron/test_graph_channel.py: - 메시지 변경에 따라 match='vanishing gradient' 로 갱신 102/102 tests pass.
연관 이슈
Closes #59
배경
Phase 8 (PR #56) 의 structural axis foundations 검증 완료 후, GraphLM 원래 vision (히든 레이어 자체를 graph 구조로) 에 본격 진입. 노션 아키텍처 구성 계획 의 B (group-as-node) 먼저 권장 따름.
구현 내용
1.
src/graphlm/neuron/graph_group.py(신규)GroupGraphLinear(in_features, out_features, group_size, adj_init)group_size단위로 묶어 graph node 로 다루는 linear(n_groups_out, n_groups_in, group_size, group_size)(n_groups_out, n_groups_in)y[go] = Σ_gi adj[go, gi] · (x[gi] @ W[go, gi])(einsum block matmul)adj_init="full"→ 표준 Linear 와 forward 동치 (function preservation)adj_init="identity"→ block-diagonal (가장 sparse 시작)freeze_adjacency/sparsify_adjacency— Phase 10+ sparsification 학습 stub2.
src/graphlm/neuron/graph_group_demo.py(신규)GroupGraphMLPLM— 3 architecture (plain Linear / group_full / group_identity) 비교용 MLP-LMtrain_group_graph_mlp— sweep 학습 unit (노트북 분리 규약 준수)3.
tests/neuron/test_graph_group.py— 13 신규 테스트4.
notebooks/02-function-level/08-phase9-group-graph-foundations.ipynb(신규)검증할 가설
CI / 머지 게이트 점검
make fmt통과make lint통과 (nbqa --fix 1건 자동 해소)make test통과 — 85 passed (기존 72 + 신규 13)변경 영향 범위 + 위험도
Phase 10+ 계획
Summary by CodeRabbit
New Features
Tests