제목: Weight를 단순한 scalar parameter가 아니라 상태(state)를 가진 객체로 취급하는 학습 구조에 대한 아이디어입니다. 기존 연구가 있을까요?

안녕하세요.
딥러닝을 공부하면서 역전파와 weight 업데이트에 대해 생각하다가 다음과 같은 아이디어가 떠올라 질문드립니다.
제가 이해한 일반적인 신경망에서는 각 weight를 하나의 scalar parameter로 보고,
w = 0.37
처럼 값 자체를 업데이트합니다.

그런데 저는 weight를 단순한 숫자 하나가 아니라 하나의 객체(object 또는 class) 로 관리해 보면 어떨까 생각하고 있습니다.
예를 들어 하나의 WClass를 다음과 같이 생각하고 있습니다.

WClass
├─ weights (실제 계산에 사용하는 여러 개의 weight, 배열이나 리스트처럼 사용)
├─ importance (중요도, 단일로 쓸지 배열이나 리스트처럼 쓸지 고민중)
├─ stability (안정성, 단일로 쓸지 배열이나 리스트처럼 쓸지 고민중)
├─ plasticity (가변성, 단일로 쓸지 배열이나 리스트처럼 쓸지 고민중)
├─ usage (사용 빈도, 단일로 쓸지 배열이나 리스트처럼 쓸지 고민중)
└─ confidence (확신도, 단일로 쓸지 배열이나 리스트처럼 쓸지 고민중)

여기서 weights는 하나의 값이 아니라 배열 또는 벡터처럼 여러 개의 weight를 가지고 있습니다.

예를 들어:

WClass_A

weights = [w1, w2, w3, …, wn]

importance = 0.8
stability = 0.9
plasticity = 0.1

제가 생각하는 핵심은 모든 weight를 동일하게 업데이트하지 않는 것입니다.

예를 들어 WClass 내부에서:

w1 → 이미 안정화됨 → 거의 고정
w2 → 안정화됨 → 거의 고정
w3 → 아직 학습 중 → 조금씩 변경
w4 → 불안정함 → 적극적으로 변경

처럼 각 weight의 학습 상태를 다르게 가져가는 것입니다.

학습이 진행되면서 특정 weight가 반복적으로 좋은 결과를 만들면 stability(stability)를 높이고, 해당 weight의 값을 거의 상수처럼 취급합니다.
반대로 아직 안정되지 않은 weight는 plasticity(plasticity)를 높게 유지해서 계속 조정할 수 있습니다.
즉,

처음에는
plasticity ↑
stability ↓
→ weight를 자주 조정

충분히 학습되면
plasticity ↓
stability ↑
→ weight를 거의 고정

하는 형태입니다.


또 하나의 핵심 아이디어가 있습니다.

제가 생각하는 것은 단순히 "weight에 importance 변수를 추가하자"가 아닙니다.
입력 x에 따라 어떤 WClass를 사용할지 선택하고, 선택된 WClass 안에서도 어떤 weight를 사용할지 선택하는 구조입니다.
예를 들어:

x

WClass Selector

WClass A / B / C / …

Weight Selector

w3, w7 등의 일부 weight만 활성화

ŷ

y와 비교

필요한 weight만 조정

즉 모든 입력이 모든 weight를 사용하는 dense 구조보다는,

x → 적절한 WClass 선택
→ 해당 WClass 내부에서 필요한 weight 선택
→ 선택된 weight만 계산 및 학습

하는 구조를 생각하고 있습니다.

그리고 x랑 첫번째 히든레이어에 사용하는 WClass, 히든레이어끼리 사용하는 WClass, 마지막 히든레이어와 결과값에 사용하는 WClass 이렇게 대분류로 3개 나눌 생각입니다.

제가 특히 궁금한 부분

기존 backpropagation에서는 최종 Loss에서 각 parameter의 gradient를 계산해서 weight를 업데이트합니다.

그런데 제가 생각한 구조에서는 먼저

  1. 현재 입력 x에 적합한 WClass를 찾고
  2. 해당 WClass 내부에서 어떤 weight가 이번 오차와 관련 있는지 판단하고
  3. 선택된 weight만 수정하며
  4. 반복적으로 좋은 값을 찾은 weight는 stability를 높여 거의 고정시키고
  5. 아직 불안정한 weight는 plasticity를 유지해서 계속 튜닝

하는 방식입니다.

따라서 질문은 다음과 같습니다.

  • 이런 구조와 유사한 기존 연구나 architecture가 있을까요?
  • WClass처럼 parameter에 여러 개의 state를 부여해서 관리하는 연구가 있을까요?
  • 입력 x에 따라 특정 parameter 또는 parameter group만 선택적으로 사용하는 연구가 있을까요?
  • Mixture of Experts(MoE), Dynamic Sparse Training, Selective Plasticity, Continual Learning, Fast Weights 등의 연구와 어떤 차이가 있을까요?
  • 특히 WClass 선택 → WClass 내부의 weight 선택 → 선택된 weight만 업데이트 → 안정화된 weight는 고정이라는 조합과 유사한 연구가 있는지 궁금합니다.
  • 이런 구조에서 backpropagation을 완전히 제거하거나, 최소한 일부 parameter에만 제한적으로 사용하는 것이 가능한지도 궁금합니다.

그냥 공부하다가 지피티랑 아이디어 정리하다가 물어보면 뭔가 비슷한 내용의 연구주제나 논문이 있는 것 같긴하더라고여
참고할만한거 혹시 알고계시만 공유부탁드립니다.

감사합니다.

이 아이디어는 기존의 여러 연구 분야와 겹칩니다.

Synaptic Intelligence( Continual Learning Through Synaptic Intelligence )는는) 온라인 중요도 추정치를 포함한 추가 상태를 각 매개변수에 명시적으로 부여하고, 이전 작업(task)에 중요한 매개변수의 변화를 줄여줍니다. Context-dependent gating with synaptic stabilization은은) 희소 활성화(sparse activation)와 보호된 가중치(protected weights)를 결합합니다. PathNet( [1701.08734] PathNet: Evolution Channels Gradient Descent in Super Neural Networks )은은) 매개변수 경로를 선택하고, 선택된 경로만 업데이트하며, 이전에 학습된 경로를 동결(freeze)할 수 있습니다. Mixture-of-Experts 역시 유사하게 입력에 따른 전문가 선택(input-dependent expert selection)을 수행합니다.

비교적 덜 일반적이라고 볼 수 있는 부분은 이들의 완전한 조합입니다. 즉, 입력에 따른 WClass 선택, 각 클래스 내부의 두 번째 선택기, 선택된 부분만 업데이트하는 방식, 그리고 가중치별로 가역적인(reversible) 안정성 및 가소성(stability/plasticity)을 모두 결합했다는 점입니다. 역전파(Backpropagation)를 제거할 필요는 없을 것입니다. 선택되지 않은 매개변수에는 0의 기울기(zero gradient)를 할당하면 되고, 이산형 선택기(discrete selectors)는 소프트 게이트(soft gates), 통과 추정(straight-through estimation), Gumbel-Softmax, 정책 기울기(policy gradients) 또는 진화 탐색(evolutionary search) 등을 사용해 훈련할 수 있습니다.

구현 측면에서는 단일 스칼라 가중치마다 Python 객체를 하나씩 생성하는 것보다, 가중치와 그 상태를 정렬된 텐서(aligned tensors)나 블록 단위로 저장하는 것이 훨씬 나을 것입니다. 또한 블록 수준의 선택이 실제 GPU 속도 향상을 가져올 가능성이 더 높습니다.

This may sit at the intersection of several research lines​:thinking::


My short answer to the literature questions is: yes, there are fairly close precedents for almost every individual component you described, but I would not collapse the whole idea into “this is just MoE” or “this is just continual learning.” The interesting comparison seems to be how the pieces are connected.

The rough map I would use is:

Your idea Nearby research line Important difference
A weight carries persistent history / importance Synaptic Intelligence, Memory Aware Synapses Mostly consolidation/continual learning, not input-conditioned routing
Stability / plasticity differs across connections Differentiable Plasticity Plasticity is learned in a different meta-learning/local-plasticity setting
confidence controls how much a weight may change UCB, MESU in Bayesian continual learning and forgetting in neural networks Close only if your confidence means something like parameter uncertainty
Input selects only part of the network conditional computation / MoE / modular networks Usually expert/module granularity rather than individual scalar weights
Selection history identifies what should be protected Conditional Channel Gated Networks, Hash Filters/prompts rather than scalar weights
Parameters themselves act like experts ParaX Trainable parameter matrices are routed/aggregated; no persistent synaptic state like your proposal
Two routing stages CaRE Router → expert routing, rather than WClass → scalar-weight routing
Individual weights can be active/inactive Piggyback, Supermasks in Superposition Mostly task-specific masks over fixed weights, not per-input stateful routing
Only part of the backward/update is used meProp, SparseProp Different selection rule and objective; this does not by itself remove backprop

So the part I would investigate most carefully is not whether a Weight can be richer than a scalar — that has quite a lot of precedent — but something closer to:

persistent per-parameter state
          |
          +------> routing decision
          |
          +------> update / plasticity decision

input
  |
  v
WClass selection
  |
  v
parameter-subset selection
  |
  v
forward / credit assignment / update

I did not find an exact match for that complete combination in this search, especially with persistent multi-dimensional state at individual-weight granularity plus input-dependent two-stage routing. That is not a novelty claim; it is only where the closest references I found stop matching.

If I were turning the idea into a first prototype, I would first separate five things that are currently bundled together:

  1. parameter value
  2. persistent state / memory
  3. routing
  4. update rule
  5. actual execution sparsity

That separation lets you change one part without changing the underlying idea. It also makes comparisons with the existing literature much easier.

A minimal first experiment could then be something like:

dense baseline
state only
routing only
routing + state
capacity-matched random routing

and measure both retention and new-learning performance. The random-routing control is cheap but useful: it helps distinguish “the router learned something useful” from “splitting parameters reduced interference anyway.”

I would probably start at block/channel/small-module granularity, even if scalar-weight routing is the eventual goal. It preserves the main idea while making routing behavior, optimizer behavior, and real compute effects much easier to inspect. Scalar routing can then be a second experiment rather than an assumption built into the first one.

Why I think these research lines are close, but not identical

1. Stateful synapses: Synaptic Intelligence / MAS / EWC-family methods

Synaptic Intelligence (SI) is unusually close to your initial intuition.

Its motivation explicitly contrasts the usual ANN synapse — essentially one scalar parameter — with biological synapses that have richer internal dynamics. SI maintains an online estimate of how important each parameter was to previous learning and then resists changing important parameters during later tasks.

So something like:

weight value
+
history-dependent importance

already has a very direct precedent.

Memory Aware Synapses (MAS) is useful for another reason: its importance measure is not simply “how often was this parameter used?” It estimates importance from the sensitivity of the learned function to changes in that parameter.

That suggests that your separation between:

usage
importance

may actually be worth keeping.

A frequently active parameter is not necessarily a uniquely important parameter, and an infrequently active parameter might be critical for a rare subset of inputs.

There is also a useful recent caution here. EWC-DR (CVPR 2026) revisits parameter-importance estimation and shows that the details of how parameters are identified/protected matter; “having an importance score” is not by itself a solved design problem.

So I would treat importance as an operational definition to choose and test, rather than a self-explanatory field.


2. Selection + protection: Conditional Channel Gating

Conditional Channel Gated Networks may be one of the closest older examples of the whole select → use → identify importance → protect cycle.

It adds task-specific gates to convolutional layers, uses the gate execution patterns to identify important filters, protects those filters, and promotes sparse filter selection so unused capacity remains for future tasks.

The difference matters, though:

their unit: filter/channel
their context: task-aware continual learning

your proposed unit: possibly individual weight
your router: potentially input-dependent WClass -> weight selection

So I would use it as a structural comparison, not as “the same architecture.”

A related example is the combination of context-dependent gating and synaptic stabilization studied by Masse et al.. That work combines sparse context-dependent gating with SI/EWC-like stabilization.

Again, the qualifier is important: this is context/task gating, not necessarily a learned sample-wise router of the form you sketched.


3. Usage/history feeding back into protection: Hash

A particularly relevant recent paper is Is Parameter Isolation Better for Prompt-Based Continual Learning? (Hash).

It maintains a global prompt pool, sparsely routes prompts, records cumulative prompt activation statistics, and uses that history to protect frequently used prompts from excessive updating.

That is conceptually close to:

usage history
   |
   v
future routing / protection / plasticity

The main difference is granularity: these are prompt parameters, not arbitrary scalar weights.

But I think it is a useful precedent for the feedback loop part of your proposal.


4. Routing parameters themselves: ParaX

ParaX: Parameters as Experts is another comparison I would definitely look at.

Its shared expert centers contain trainable parameter matrices. A module dynamically selects/aggregates matrices from those centers to produce input-dependent weight matrices.

So the basic viewpoint:

parameters themselves can be the routed experts

is already quite explicit there.

But ParaX is doing adapter-style PEFT with parameter matrices, and the routed parameters do not carry the persistent importance / stability / usage / confidence state you described.

That makes ParaX especially useful for isolating what may be different in your design: not parameter routing alone, but routing plus persistent parameter history plus state-dependent updates.

There is also a naming wrinkle in the current material: the official repository uses the name ParaX, while the current arXiv abstract still describes the method internally as AdaRoute. I would follow the official repository/paper title when searching for it.


5. Two-level routing: CaRE

CaRE uses a bi-level routing MoE:

router selection
      |
      v
expert routing

Structurally, that gives a recent reference point for:

WClass selection
      |
      v
within-class selection

But CaRE’s second level still selects experts/modules, so it does not establish the individual-weight version of your proposal.


6. Individual-weight masks: Piggyback / SupSup

If the question is specifically whether selection can go all the way down to individual connections, there is older work at that granularity.

Piggyback learns binary masks over individual weights of a fixed network.

Supermasks in Superposition likewise uses learned masks over fixed weights for many sequential tasks.

These differ from your proposal because the underlying weights can remain fixed and the masks are typically task-oriented rather than dynamically generated from every input.

Still, they are useful evidence that weight-level membership/selection is a real design axis, not something that has to stop at channels or experts.

A design split that might make the idea easier to prototype

One way to preserve your terminology while making the contracts explicit would be:

PARAMETER VALUE
    W

PERSISTENT STATE
    usage       U
    importance  I
    confidence  C
    ...

DERIVED UPDATE STATE
    stability   S = f(U, I, C, history, ...)
    plasticity  P = g(U, I, C, history, ...)

ROUTING
    r_class  = class_router(x, state)
    r_weight = weight_router(x, r_class, state)

FORWARD
    y = apply(W, r_class, r_weight, x)

CREDIT / UPDATE
    gradients or another credit signal
    -> optimizer/update rule
    -> parameter change modulated by P

STATE UPDATE
    U, I, C, ... <- observations from this step

This immediately exposes several independent decisions.

What exactly does each state mean?

For example:

usage
  - number of times selected?
  - cumulative routing probability?
  - activation magnitude?
  - contribution to output?

importance
  - loss sensitivity?
  - output sensitivity?
  - Fisher-like estimate?
  - accumulated contribution to loss reduction?

confidence
  - router confidence?
  - certainty that a weight is useful?
  - uncertainty of the parameter estimate?

stability
  - an independently learned state?
  - or a value derived from importance/history?

plasticity
  - multiplier on raw gradient?
  - multiplier on optimizer learning rate?
  - multiplier on the realized parameter update?
  - coefficient of a local plasticity rule?

Those choices are not merely naming details; they can produce different algorithms.

For example, if by confidence you mean something like parameter uncertainty, then there is a surprisingly direct research branch.

Uncertainty-guided Continual Learning (UCB) adapts learning rates according to uncertainty in Bayesian weight distributions.

More recently, the MESU method in Bayesian continual learning and forgetting in neural networks makes this relationship especially explicit: uncertainty controls metaplasticity, so uncertain parameters remain more adaptable while confident parameters become more stable.

That suggests one possible simplification:

confidence / uncertainty
          |
          v
      plasticity

instead of assuming that confidence, stability, and plasticity all have to be independent learned variables.

That is only one design option, though; your confidence may mean something entirely different.

Where should the state live?

It also does not necessarily need to live inside a Python object representing each scalar.

Conceptually you can keep a “stateful weight” while physically representing the states as same-shaped tensors:

weight
usage
importance
plasticity

or keeping some of them in:

model state
optimizer state
router/controller state
external memory

This is partly why learned optimizer work is another useful neighboring area: the rule deciding how a parameter changes can itself consume parameter/gradient/history information, without requiring the model parameter object to own all of that logic.

The question I would use to choose the boundary is:

Who reads this state, and who is allowed to update it?

For example:

router reads usage
optimizer reads plasticity
importance estimator writes importance
state update writes usage

is a much easier contract to test than one object implicitly doing all four jobs.


Selection is not the only form of conditional parameterization

There is also a useful neighboring design choice:

select stored parameters
vs
compose stored parameter bases
vs
generate parameters from context

Your current sketch is mostly the first.

CondConv is a clean example of the second: it computes input-conditioned coefficients and combines expert kernels before the convolution.

ParaX is also closer to composition than to a pure one-hot hard selector.

This matters because hard scalar routing creates one set of optimization/system problems, while soft composition creates another. If the high-level goal is “different inputs should use different effective parameters,” it may be useful to keep all three implementations open initially.

Cheap controls I would use before scaling the idea up

I think a small controlled experiment can answer more than starting immediately with a large model.

A useful minimal matrix is:

Condition State Learned routing
Dense baseline no no
State only yes no
Routing only no yes
Routing + state yes yes
Random-routing control same capacity no learned router

The last condition is particularly useful.

If learned routing beats dense but not a capacity-matched random partition, the improvement may come from reducing parameter interference or increasing effective modularity rather than from the routing policy itself.

If learned routing also beats random routing, there is stronger evidence that input-conditioned selection is doing useful work.

An oracle router can also be useful in a synthetic experiment as an upper-bound control, but obviously not as a deployable method.

What I would log

At minimum:

old-task performance after new learning
new-task learning speed / final performance

routing frequency per WClass
routing entropy
overlap between parameter subsets
fraction of parameters never selected
fraction selected almost all the time

parameter-update norm
drift of "protected" parameters

usage distribution
importance distribution
correlation between the two

Those measurements would also catch an easy failure mode if usage feeds back into future routing:

selected often
 -> usage increases
 -> gets protected/preferred
 -> selected even more

That may or may not happen in your design, but ordinary MoE systems already need mechanisms for routing imbalance. The Hugging Face Switch Transformers documentation exposes things such as expert capacity and router auxiliary losses for related reasons.

I would therefore log utilization before trying to design a complicated anti-collapse mechanism.


A small sanity check produced two implementation warnings

I tried this only on tiny synthetic sequential-learning problems, so I would not treat the result as validation of the architecture. It was useful mainly for exposing implementation semantics.

1. Learned routing should have a random-routing control

In the toy setup, a learned soft router reduced forgetting more than both a dense model and a fixed-random router.

However, the expert indices did not cleanly correspond to task identities, so I would not describe this as discovering hard task-specific subnetworks.

A safer interpretation was simply:

the learned conditional mixture reduced interference better than the controls in that toy problem.

That is exactly why the random-routing condition seems worth keeping.

2. plasticity depends on where it acts in the optimizer pipeline

I also tried using a per-parameter plasticity value as a gradient multiplier.

With SGD this behaved as expected.

With AdamW, a fixed raw-gradient scale could be almost cancelled by the adaptive normalization, while a time-varying scale changed the trajectory. Applying plasticity to the realized parameter update after the AdamW step also produced different behavior.

I would not generalize that toy result into “AdamW ignores plasticity.” The useful lesson is narrower:

plasticity needs an operational definition that includes where it acts relative to the optimizer.

These are different algorithms:

raw gradient
    |
    * plasticity
    |
AdamW

versus:

raw gradient
    |
AdamW
    |
realized update
    |
* plasticity

and there are other possibilities.

If the aim is for plasticity = 0.1 to literally mean “this parameter changes one tenth as much,” that contract should be tested on the actual parameter delta, not assumed from a gradient multiplier.

One PyTorch trap: inactive, zero-gradient, and frozen are different states

This became important when thinking about individual scalar selection.

These statements are not equivalent:

this parameter contributes zero to this forward pass

this parameter's gradient tensor contains zero

this parameter received no gradient (grad is None)

the optimizer does not update this parameter

this parameter value is guaranteed not to move

PyTorch documents this distinction explicitly in Optimizer.zero_grad: optimizers behave differently when a gradient is zero versus None; in one case the optimizer can perform a step with a zero gradient, while in the other it skips the step.

This matters with momentum/Adam state and weight decay.

In a small test, an inactive branch that was genuinely absent from the graph (grad=None) stayed unchanged, while a branch that was still in the graph but multiplied by a zero mask could drift from previously accumulated optimizer state. Clearing that state removed the moment-driven drift in the no-weight-decay condition.

So if stability or WClass selection is supposed to mean strictly frozen, I would test the contract directly:

before = parameter.detach().clone()

optimizer.step()

drift = (parameter.detach() - before).abs().max()

rather than assuming that a zero mask guarantees it.

There is also a practical granularity issue here.

If thousands of scalar weights are coordinates inside one Parameter tensor, you cannot normally give each coordinate an independent grad=None state; None exists at the Parameter level.

That does not make weight-level protection impossible, but it suggests that strict scalar-level freezing may require something like:

custom coordinate-wise optimizer masking
+
coordinate-wise optimizer-state masking/reset

rather than only masking the forward value or raw gradient.

That is one reason I would prototype the semantics at block/channel granularity first, then move downward once the update contract is clear.

Partial backprop is quite plausible; no-backprop is a separate question

I would split your backprop question into several levels.

Level 1: only selected parameters receive/update gradients

This is already normal in conditionally executed computation graphs if the inactive branch really is not used.

At the more explicit sparse-gradient end, meProp is directly relevant: it performs the normal forward pass but keeps only top-k gradient components in the backward pass, updating only a small subset of parameters.

So “do I have to update every parameter on every sample?” is clearly no.

Level 2: make sparse backward actually cheaper

Logical gradient sparsity does not automatically produce wall-clock speedup.

SparseProp is useful precisely because it addresses the systems side: it implements sparse backpropagation specialized for sparse weights and demonstrates CPU training speedups.

That distinction becomes especially important if you go all the way to arbitrary scalar sparsity.

Level 3: replace the ordinary global backward dependency

That becomes a different research branch.

Decoupled Neural Interfaces / Synthetic Gradients predicts gradients locally so modules can be updated without waiting for true downstream backpropagated gradients.

The Forward-Forward Algorithm goes further and investigates replacing forward+backward training with two forward passes using local objectives.

There are also local/plasticity-rule approaches, including Differentiable Plasticity.

I would therefore phrase the relationship as:

stateful selective routing
        |
        +--> selective parameter update     [very direct connection]
        |
        +--> sparse / partial backprop      [plausible extension]
        |
        +--> no backprop at all             [separate credit-assignment problem]

In other words, your architecture may make partial backprop natural, but it does not automatically solve the problem that backprop normally solves: assigning credit to the router and the selected parameters.

For a hard discrete selector, that credit-assignment question becomes especially visible. A soft differentiable router, a straight-through estimator, reinforcement-style routing, evolutionary selection, etc. are different possible answers rather than implementation details.

Logical sparsity is not necessarily hardware-efficient sparsity

If compute reduction is one of the goals, I would keep a separate metric for it.

There are several different meanings of “only some weights are active”:

semantic/routing sparsity
graph sparsity
gradient sparsity
optimizer-update sparsity
hardware-efficient sparsity

They need not coincide.

For example, multiplying a dense tensor by a binary mask may give the desired mathematical behavior while still executing dense matrix multiplications.

The current Hugging Face Experts backends documentation is a nice concrete example of this distinction. At the high level, every backend performs the same MoE semantics:

router selects k experts
 -> selected expert projections
 -> aggregate outputs

but the actual execution can be an eager loop, batched matrix multiplication, grouped matrix multiplication, or specialized fused GPU kernels, with substantially different performance characteristics.

So if scalar selection is primarily about learning behavior, arbitrary scalar masks are a reasonable experiment.

If it is primarily about speed, I would seriously consider testing progressively coarser structure:

scalar
  |
small block
  |
channel / neuron
  |
matrix / adapter
  |
expert / module

and measure where the hardware benefit begins to dominate the routing overhead.

This is another place where I would avoid assuming that the most biologically synapse-like granularity is automatically the most useful computational granularity.

A compact way I would navigate the literature is:

If your main goal is preventing forgetting:
    Synaptic Intelligence
    MAS / EWC-family methods
    Conditional Channel Gating
    UCB / MESU
    Hash

If your main goal is input-dependent specialization:
    conditional computation / MoE
    Modular Deep Learning
    ParaX
    CondConv

If your main goal is individual-weight selection:
    Piggyback
    Supermasks in Superposition

If your main goal is learned per-weight plasticity:
    Differentiable Plasticity
    UCB / MESU
    learned optimizer literature

If your main goal is sparse training compute:
    meProp
    SparseProp
    structured/block/expert routing implementations

If your main goal is eliminating backprop:
    synthetic gradients / DNI
    Forward-Forward
    local-learning / plasticity-rule research

For a broader taxonomy, the Modular Deep Learning survey is also useful because it explicitly separates computation, routing, aggregation, and training instead of treating “modularity” as one algorithm.

If I were choosing one default route for a first implementation, I would probably do this:

1. Use a very small model.

2. Make WClass a block/channel/small-module grouping first.

3. Start with only two persistent quantities:
       usage
       importance

4. Derive stability/plasticity from them initially,
   rather than making five independent state variables at once.

5. Compare:
       dense
       state only
       routing only
       routing + state
       random routing

6. Record:
       retention
       new-task adaptation
       routing entropy/utilization
       overlap of selected parameters
       actual parameter drift

7. Only after those semantics are clear:
       try scalar-level routing,
       more state dimensions,
       hard routing,
       sparse backward,
       or non-backprop credit assignment.

That would keep the original idea intact while making each claim independently testable.

The part I would be most interested in seeing separated experimentally is:

Does persistent parameter history improve the routing policy, the update policy, or both?

If that distinction becomes clear, it should also become much easier to tell which existing research line is the closest comparison — and which part of the design is genuinely doing something different.

자세한 설명 감사합니다. 아직 딥러닝 공부한 지 3주 정도라 말씀해주신 연구들을 하나씩 찾아보면서 이해하고 있습니다.

처음에는 weight 하나하나를 객체처럼 관리하는 생각이었는데, 실험해보니 실제 구현에서는 너무 느릴 것 같아서 지금은 말씀해주신 것처럼 block 단위의 WClass로 묶어서 선택하는 방식으로 바꿔 테스트하고 있습니다.

현재 WClass 자체는 같은 구조를 사용하지만 위치에 따라 역할을 3개로 나눠서 생각하고 있습니다.

WClass1 : 입력 → 첫 번째 Hidden
WClass2 : Hidden → Hidden
WClass3 : 마지막 Hidden → Output

그리고 입력 데이터를 실제로 따로 옮겨서 군집화하는 대신, WClass1에서 나온 특징을 이용해 비슷한 입력끼리 가상그룹 ID를 만드는 방식도 같이 실험하고 있습니다.

현재는 대략

입력 → WClass1 → 가상그룹 결정 → 해당 그룹에 관련된 WClass2 일부 선택 → WClass3 → 선택된 부분만 학습

하는 구조입니다.

아직 WClass1은 전체를 사용하는 방식과 일부만 사용하는 방식을 둘 다 테스트해봤는데, 현재까지는 첫 번째 WClass는 공통으로 사용하는 쪽이 더 괜찮아 보여서 계속 확인하고 있습니다.

또 단순히 gradient만 0으로 만드는 것이 아니라 실제 GPU 계산량도 줄어드는지 같이 측정하고 있습니다.

아직 많이 배우는 단계인데 비슷한 연구들과 구현 방향을 알려주셔서 정말 감사합니다. 말씀해주신 논문들도 하나씩 공부해보겠습니다.

정말 자세한 답변 감사합니다. 아직 딥러닝을 공부한 지 3주 정도라 처음 읽었을 때는 어려웠는데, 몇 번 읽어보니 특히 여러 아이디어를 한꺼번에 넣지 말고 하나씩 나눠서 실험해보라는 말씀이 많이 와닿았습니다.

현재는 우선 stability 같은 상태값은 잠시 빼고, 입력에 따라 일부 WClass만 선택해서 학습하는 방식 자체가 가능한지부터 테스트하고 있습니다.

WClass는 같은 형태이지만 위치에 따라 역할을 세 가지로 나눠서 생각하고 있습니다.

WClass1 : 입력 → 첫 Hidden
WClass2 : Hidden → Hidden
WClass3 : 마지막 Hidden → Output

그리고 최근에는 가상그룹이라는 방식도 같이 실험하고 있습니다. WClass1의 반응을 간단하게 요약해서 비슷한 입력에 같은 group ID를 주고, 그 그룹마다 필요한 WClass2의 개수와 종류를 다르게 사용하는 방식입니다.

예를 들면 어떤 가상그룹은 WClass2를 6개 정도 사용하고, 다른 그룹은 12개 정도 사용할 수도 있게 해보고 있습니다. 처음에는 무조건 한 개의 경로만 사용하는 생각이었는데, 실험하면서 입력에 따라 필요한 K개를 사용하도록 바꿨습니다.

현재는 개별 weight보다는 block 단위로 먼저 실험하고 있고, Dense 방식과 비교해서 정확도와 실제 GPU 속도를 같이 보고 있습니다.

그리고 말씀해주신 Random Routing 비교도 바로 추가해서 테스트하고 있습니다.

Dense / 제가 만든 선택 방식 / 같은 개수의 WClass를 랜덤 선택

이렇게 비교해서 제가 만든 선택 방식이 실제로 의미가 있는지 확인해보려고 합니다.

이 부분이 어느 정도 정리되면 그다음에 usage, importance 같은 간단한 상태값부터 하나씩 추가해서, 상태값이 어떤 WClass를 선택하는 데 도움이 되는지 또는 어떤 weight를 얼마나 업데이트할지 결정하는 데 도움이 되는지 따로 확인해보고 싶습니다.

관련 연구도 많이 알려주시고 실험 방향까지 조언해주셔서 정말 감사합니다. 많이 배우고 있습니다.

진행 상황을 간단히 공유합니다.

처음에는 WClass에 importance(중요도), stability(안정성), usage history(사용이력) 등 여러 상태를 두고, 현재 입력에서 필요한 일부 노드/WClass만 선택하여 순전파하고 선택된 부분만 역전파하면 기존 방식보다 계산을 줄일 수 있지 않을까 생각했습니다.

이후 관련 연구를 찾아보고 직접 여러 방식으로 실험하면서, 이 방향이 MoE, SkipNet, BlockDrop과 같은 conditional computation(조건부 계산) 방식과, meProp과 같은 sparse/partial backpropagation(희소/부분 역전파) 연구와 각각 상당히 겹치는 부분이 있다는 것을 알게 되었습니다. 그래서 현재 형태의 WClass 자체를 새로운 방법으로 발전시키는 것은 일단 중단하려고 합니다.

오히려 실험 과정에서 어려웠던 부분들이 더 흥미로웠습니다.

  • importance, stability, usage history 같은 상태값으로 WClass를 선택해도 동일한 수를 랜덤으로 선택한 경우보다 뚜렷하게 좋아지지 않았습니다.
  • virtual group(가상그룹)과 함께 MoE의 router와 유사하게 입력에 따라 사용할 경로를 선택하는 방식도 실험했습니다. 그러나 입력에 따라 일부 네트워크만 사용하는 방향 자체는 MoE, SkipNet, BlockDrop 등 기존 연구와 큰 맥락에서 상당히 유사하다고 판단했습니다. Open Access
  • meProp처럼 backward를 희소화하는 기존 연구도 있지만, 현재 실험에서는 선택되지 않은 WClass를 forward graph 자체에 포함하지 않아 해당 부분의 backward gradient도 생성되지 않도록 구현해보았습니다. 실제로 16개 block 중 8개에 대해서만 sparse gradient가 생성되는 것도 확인했습니다. Proceedings of Machine Learning Research
  • 하지만 이것이 곧 실제 GPU 속도 향상으로 이어지지는 않았습니다. 특히 RTX 4070 SUPER에서는 Dense matrix 연산이 매우 효율적이어서, block 선택·lookup·scatter 등의 overhead 때문에 sparse 방식이 오히려 느렸습니다.
  • route를 너무 자주 변경하면 학습 성능도 불안정해졌고, 단순한 random fixed route가 의외로 강한 baseline이었습니다.

결국 현재까지 가장 크게 배운 점은 “계산할 weight의 수를 줄이는 것”과 “실제 학습 비용을 줄이는 것”은 같은 문제가 아니라는 점입니다. 처음에는 역전파 계산을 줄이는 것이 주된 문제라고 생각했는데, 실제로는 전체 계산을 하지 않고도 어떤 parameter subset을 선택할지 결정하는 비용과 GPU가 그 sparse computation을 실제로 효율적으로 처리할 수 있는지가 더 어려운 문제였습니다.

그래서 현재 형태의 WClass 설계는 여기서 중단하고, 실험 과정에서 확인된 한계와 기존 연구와의 차이를 정리한 뒤 다른 방향을 검토하려고 합니다. 그리고 기존에 공부하던 머신러닝, 딥러닝공부에 집중하려고 합니다.