5.1 KiB
Excellente question ! Réfléchissons à l'utilité réelle de la salience...
À Quoi Sert la Salience ? Analyse Critique
- Usages Théoriques vs Pratiques Dans ton architecture actuelle, la salience pourrait servir pour : Filtrage Contextuel: // Sélectionner quels neurones inclure dans le contexte pour le LLM std::vector<Neuron*> get_active_context() { std::vector<Neuron*> context; for (auto& neuron : all_neurons) { if (neuron->salience > CONTEXT_THRESHOLD) { // Ex: > 30000/65535 context.push_back(neuron); } } return context; }
Priorisation de Propagation: // Les neurones plus saillants propagent plus d'activation float propagated_strength = base_strength * (neuron->salience / 65535.0f);
- Maintenance Temps Réel - Question Cruciale Option A: Decay Temps Réel // Problématique - coûteux ! void continuous_decay() { while (system_running) { for (auto& neuron : all_neurons) { neuron->salience = static_cast<uint16_t>(neuron->salience * 0.999f); } std::this_thread::sleep_for(std::chrono::seconds(1)); } }
Problème: O(N) toutes les secondes = très coûteux ! Option B: Lazy Decay (Plus Intelligent) struct Neuron { uint16_t salience; std::chrono::time_pointstd::chrono::system_clock last_update;
uint16_t get_current_salience() {
auto now = std::chrono::system_clock::now();
auto seconds_elapsed = std::chrono::duration_cast<std::chrono::seconds>
(now - last_update).count();
// Decay calculé à la demande
float decay_factor = std::pow(0.999f, seconds_elapsed);
return static_cast<uint16_t>(salience * decay_factor);
}
};
Avantage: Calcul seulement quand nécessaire !
-
Cycles de Sommeil - Usage Plus Clair Phase d'Analyse: void analyze_network_state() { // Identifier les neurones sur-activés std::vector<Neuron*> overactive_neurons; for (auto& neuron : all_neurons) { if (neuron->get_current_salience() > HIGH_ACTIVITY_THRESHOLD) { overactive_neurons.push_back(neuron); } }
// Ces neurones deviennent candidats pour consolidation consolidate_memories(overactive_neurons); }
Consolidation Sélective: void consolidate_memories(const std::vector<Neuron*>& active_neurons) { // Renforcer les connexions entre neurones récemment actifs for (auto* neuron_a : active_neurons) { for (auto* neuron_b : active_neurons) { if (neuron_a != neuron_b && are_connected(neuron_a, neuron_b)) { strengthen_connection(neuron_a, neuron_b); } } } }
-
Alternative: Simplifier Sans Salience Question fondamentale: As-tu vraiment besoin de salience ? Architecture Simplifiée: struct Neuron { std::string concept; std::vector<Neuron*> connections; std::vector<uint16_t> weights;
// Pas de salience - juste activation temporaire lors propagation };
class ActivationEngine { std::unordered_map<Neuron*, float> current_activation; // Temporaire
public: void propagate_from(Neuron* start, float strength) { current_activation.clear(); // Reset à chaque propagation // ... propagation normale }
std::vector<Neuron*> get_active_context() {
std::vector<Neuron*> context;
for (auto& [neuron, activation] : current_activation) {
if (activation > threshold) context.push_back(neuron);
}
return context;
}
};
- Recommandation Pragmatique Si tu gardes la Salience: Utilise-la pour: ✅ Sélection du contexte pour le LLM ✅ Identification des neurones à consolider pendant le sommeil ✅ Métriques de "vivacité" du réseau Implémente avec: ✅ Lazy decay (calcul à la demande) ✅ Reset global pendant les cycles de sommeil ❌ Pas de maintenance temps réel continue Si tu supprimes la Salience: Alternative plus simple: Activation temporaire pendant propagation uniquement Historique d'activation pour cycles de sommeil Simplification significative du code
Code Recommandé (Hybride): struct Neuron { std::string concept; std::vector<Neuron*> connections; std::vector<uint16_t> weights;
// Salience avec lazy evaluation
uint16_t stored_salience{0};
std::chrono::time_point<std::chrono::system_clock> last_salience_update;
uint16_t get_salience() {
auto now = std::chrono::system_clock::now();
auto hours = std::chrono::duration_cast<std::chrono::hours>
(now - last_salience_update).count();
if (hours > 0) {
// Decay de 1% par heure
stored_salience = static_cast<uint16_t>(stored_salience * std::pow(0.99, hours));
last_salience_update = now;
}
return stored_salience;
}
void boost_salience(uint16_t amount) {
stored_salience = std::min(65535, static_cast<int>(stored_salience + amount));
last_salience_update = std::chrono::system_clock::now();
}
};
La salience a sa place, mais avec une implémentation intelligente qui évite la maintenance temps réel coûteuse !