159 lines
5.1 KiB
Markdown
159 lines
5.1 KiB
Markdown
Excellente question ! Réfléchissons à l'utilité réelle de la salience...
|
|
|
|
À Quoi Sert la Salience ? Analyse Critique
|
|
1. 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);
|
|
|
|
|
|
2. 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_point<std::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 !
|
|
|
|
3. 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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
4. 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;
|
|
}
|
|
};
|
|
|
|
|
|
5. 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 !
|
|
|