DOCS/_archive/gpt_docs/07_기억_시스템_수학적_모델.md
happybell80 374a173e80 GPT_docs를 _archive로 이동 및 DB 테이블 활용 계획 문서 추가
- GPT_docs/ → _archive/gpt_docs/로 이동 (디렉토리 구조 정리)
- ideas/250818_conversation_logs_및_robing_stats_활용_계획.md 추가
  - conversation_logs, robing_stats, robing_settings 테이블 활용 방안
  - 현재 0개 레코드인 미사용 테이블들의 구현 가이드
  - 단계별 구현 계획 및 코드 예시 포함
2025-08-18 13:11:45 +09:00

13 KiB
Raw Blame History

기억 시스템의 수학적 모델

엔트로피 기반 기억 관리

정보 엔트로피 계산

기억의 중요도를 정보 이론의 엔트로피로 측정합니다.

import numpy as np
from scipy.stats import entropy

class MemoryEntropy:
    def calculate_information_entropy(self, memory_item):
        """
        Shannon 엔트로피를 이용한 정보량 계산
        H(X) = -Σ p(xi) * log2(p(xi))
        """
        # 메모리 항목의 특징 분포
        features = self.extract_features(memory_item)
        probabilities = self.normalize_distribution(features)
        
        # 엔트로피 계산
        H = -np.sum(probabilities * np.log2(probabilities + 1e-10))
        
        return H
    
    def calculate_relative_entropy(self, memory_new, memory_context):
        """
        KL-Divergence를 이용한 상대적 중요도
        D_KL(P||Q) = Σ P(i) * log(P(i)/Q(i))
        """
        p = self.get_distribution(memory_new)
        q = self.get_distribution(memory_context)
        
        return entropy(p, q)
    
    def information_gain(self, memory_before, memory_after):
        """
        새로운 정보가 추가한 가치 측정
        IG = H(before) - H(after|new_info)
        """
        h_before = self.calculate_information_entropy(memory_before)
        h_after = self.calculate_information_entropy(memory_after)
        
        return h_before - h_after

시간 감쇠 함수

에빙하우스 망각 곡선을 기반으로 한 기억 감쇠 모델:

class ForgettingCurve:
    def __init__(self):
        self.initial_strength = 1.0
        self.decay_rate = 0.5
        
    def memory_strength(self, time_elapsed, repetitions=0):
        """
        S(t) = S0 * exp(-λt) * (1 + α * log(1 + repetitions))
        
        S(t): 시간 t에서의 기억 강도
        S0: 초기 기억 강도
        λ: 감쇠율
        α: 반복 학습 효과 계수
        """
        base_decay = self.initial_strength * np.exp(-self.decay_rate * time_elapsed)
        repetition_bonus = 1 + 0.2 * np.log(1 + repetitions)
        
        return base_decay * repetition_bonus
    
    def optimal_review_time(self, target_retention=0.9):
        """
        목표 기억률을 유지하기 위한 최적 복습 시점
        t_optimal = -ln(target_retention) / λ
        """
        return -np.log(target_retention) / self.decay_rate

베이지안 기억 우선순위

베이지안 추론 모델

기억의 미래 유용성을 베이지안 추론으로 예측:

class BayesianMemoryPriority:
    def __init__(self):
        self.prior_probabilities = {}
        self.likelihood_matrix = {}
        
    def calculate_posterior(self, memory_item, context):
        """
        베이즈 정리: P(A|B) = P(B|A) * P(A) / P(B)
        
        P(유용|맥락) = P(맥락|유용) * P(유용) / P(맥락)
        """
        prior = self.get_prior(memory_item)
        likelihood = self.get_likelihood(context, memory_item)
        evidence = self.get_evidence(context)
        
        posterior = (likelihood * prior) / (evidence + 1e-10)
        return posterior
    
    def update_beliefs(self, observation):
        """
        온라인 베이지안 업데이트
        P_new(θ) ∝ P(data|θ) * P_old(θ)
        """
        for memory_id, memory in self.memories.items():
            old_prior = self.prior_probabilities.get(memory_id, 0.5)
            likelihood = self.compute_likelihood(observation, memory)
            
            # 베이지안 업데이트
            new_prior = likelihood * old_prior
            
            # 정규화
            self.prior_probabilities[memory_id] = new_prior / sum(self.prior_probabilities.values())
    
    def predict_utility(self, memory_item, future_contexts):
        """
        미래 맥락에서의 기억 유용성 예측
        U(m) = Σ P(c) * V(m, c)
        """
        utility = 0
        for context, prob in future_contexts.items():
            value = self.calculate_value(memory_item, context)
            utility += prob * value
        
        return utility

그래프 기반 연상 기억

의미 네트워크 구조

import networkx as nx

class SemanticMemoryGraph:
    def __init__(self):
        self.graph = nx.DiGraph()
        self.activation_threshold = 0.3
        
    def add_memory(self, memory_id, content, embeddings):
        """노드로 기억 추가"""
        self.graph.add_node(
            memory_id,
            content=content,
            embedding=embeddings,
            activation=0.0,
            last_accessed=time.time()
        )
    
    def create_association(self, memory1, memory2, strength):
        """연관성 엣지 생성"""
        self.graph.add_edge(
            memory1, memory2,
            weight=strength,
            co_activation_count=0
        )
    
    def spreading_activation(self, source_memory, decay=0.8):
        """
        활성화 확산 알고리즘
        A(n) = Σ w(m,n) * A(m) * decay^d(m,n)
        """
        activation = {source_memory: 1.0}
        visited = set()
        queue = [(source_memory, 1.0, 0)]
        
        while queue:
            current, current_activation, depth = queue.pop(0)
            
            if current in visited:
                continue
            visited.add(current)
            
            # 이웃 노드로 활성화 전파
            for neighbor in self.graph.neighbors(current):
                edge_weight = self.graph[current][neighbor]['weight']
                new_activation = current_activation * edge_weight * (decay ** depth)
                
                if new_activation > self.activation_threshold:
                    activation[neighbor] = max(
                        activation.get(neighbor, 0),
                        new_activation
                    )
                    queue.append((neighbor, new_activation, depth + 1))
        
        return activation
    
    def retrieve_associated_memories(self, query_memory, top_k=5):
        """연상 기억 검색"""
        activations = self.spreading_activation(query_memory)
        
        # 활성화 강도순 정렬
        sorted_memories = sorted(
            activations.items(),
            key=lambda x: x[1],
            reverse=True
        )
        
        return sorted_memories[:top_k]

계층적 시간 기억 (HTM)

Hierarchical Temporal Memory 구현

class HierarchicalTemporalMemory:
    def __init__(self, input_size, column_count, cells_per_column):
        self.input_size = input_size
        self.column_count = column_count
        self.cells_per_column = cells_per_column
        
        # 시냅스 연결 강도
        self.proximal_synapses = np.random.rand(column_count, input_size)
        self.distal_synapses = np.zeros((column_count, cells_per_column, column_count, cells_per_column))
        
    def spatial_pooling(self, input_vector):
        """
        공간 풀링: 입력을 희소 분산 표현으로 변환
        """
        # 각 컬럼의 overlap 계산
        overlaps = np.dot(self.proximal_synapses, input_vector)
        
        # 상위 k% 컬럼만 활성화 (희소성)
        k = int(0.02 * self.column_count)  # 2% 활성화
        active_columns = np.argpartition(overlaps, -k)[-k:]
        
        # 부스팅으로 사용 빈도 균등화
        boost_factors = self.calculate_boost(active_columns)
        overlaps *= boost_factors
        
        return active_columns
    
    def temporal_memory(self, active_columns, previous_state):
        """
        시간 기억: 시퀀스 학습과 예측
        """
        predicted_cells = []
        active_cells = []
        
        for col in active_columns:
            # 예측된 셀이 있으면 활성화
            if self.has_predicted_cell(col, previous_state):
                active_cells.append(self.get_predicted_cell(col))
            else:
                # 버스트: 모든 셀 활성화
                for cell in range(self.cells_per_column):
                    active_cells.append((col, cell))
            
            # 다음 상태 예측
            predicted_cells.extend(self.predict_next_cells(col))
        
        return active_cells, predicted_cells
    
    def learn_sequence(self, sequence):
        """시퀀스 패턴 학습"""
        previous_state = None
        
        for item in sequence:
            active_columns = self.spatial_pooling(item)
            active_cells, predicted = self.temporal_memory(active_columns, previous_state)
            
            # 시냅스 강화
            self.reinforce_synapses(active_cells, predicted)
            previous_state = active_cells

압축 기억 모델

정보 압축과 복원

class CompressiveMemory:
    def __init__(self, compression_ratio=0.1):
        self.compression_ratio = compression_ratio
        self.dictionary = {}  # 압축 사전
        
    def compress_memory(self, memory_stream):
        """
        PCA 기반 차원 축소로 기억 압축
        """
        from sklearn.decomposition import PCA
        
        # 원본 차원
        original_dim = memory_stream.shape[1]
        compressed_dim = int(original_dim * self.compression_ratio)
        
        # PCA 압축
        pca = PCA(n_components=compressed_dim)
        compressed = pca.fit_transform(memory_stream)
        
        # 복원을 위한 정보 저장
        self.dictionary['pca'] = pca
        self.dictionary['original_dim'] = original_dim
        
        # 압축률과 정보 손실 계산
        reconstruction_error = self.calculate_reconstruction_error(
            memory_stream, 
            pca.inverse_transform(compressed)
        )
        
        return compressed, reconstruction_error
    
    def adaptive_compression(self, memory, importance_score):
        """
        중요도에 따른 적응적 압축
        높은 중요도 = 낮은 압축률
        """
        adaptive_ratio = self.compression_ratio * (2 - importance_score)
        adaptive_ratio = np.clip(adaptive_ratio, 0.05, 0.95)
        
        return self.compress_with_ratio(memory, adaptive_ratio)
    
    def hierarchical_compression(self, memories):
        """
        계층적 압축: 자주 접근하는 기억은 덜 압축
        """
        layers = {
            'hot': 0.9,   # 거의 압축 안함
            'warm': 0.5,  # 중간 압축
            'cold': 0.1   # 높은 압축
        }
        
        compressed_memories = {}
        for memory_id, memory_data in memories.items():
            access_frequency = self.get_access_frequency(memory_id)
            
            if access_frequency > 10:
                layer = 'hot'
            elif access_frequency > 3:
                layer = 'warm'
            else:
                layer = 'cold'
            
            compressed_memories[memory_id] = self.compress_with_ratio(
                memory_data, 
                layers[layer]
            )
        
        return compressed_memories

양자 기억 모델 (실험적)

양자 중첩 상태 기억

class QuantumMemory:
    """
    양자 컴퓨팅 원리를 적용한 기억 모델
    여러 상태를 동시에 유지
    """
    
    def __init__(self):
        self.superposition_states = {}
        self.entangled_memories = {}
        
    def create_superposition(self, memory_states):
        """
        여러 가능한 기억 상태의 중첩
        |ψ⟩ = α|0⟩ + β|1⟩ + γ|2⟩ + ...
        """
        amplitudes = self.normalize_amplitudes(memory_states)
        
        superposition = {
            'states': memory_states,
            'amplitudes': amplitudes,
            'coherence': 1.0  # 결맞음 정도
        }
        
        return superposition
    
    def quantum_entanglement(self, memory1, memory2):
        """
        기억 간 양자 얽힘
        한 기억의 관측이 다른 기억에 즉시 영향
        """
        entangled_state = {
            'memory_pair': (memory1, memory2),
            'correlation_matrix': self.calculate_correlation(memory1, memory2),
            'bell_state': self.create_bell_state(memory1, memory2)
        }
        
        self.entangled_memories[(memory1.id, memory2.id)] = entangled_state
        
    def collapse_wavefunction(self, superposition, observation):
        """
        관측 시 파동함수 붕괴
        확률적으로 하나의 상태로 수렴
        """
        probabilities = np.abs(superposition['amplitudes']) ** 2
        collapsed_state = np.random.choice(
            superposition['states'],
            p=probabilities
        )
        
        return collapsed_state

성능 메트릭

기억 시스템 평가 지표

def evaluate_memory_system(memory_system):
    metrics = {
        'recall_precision': calculate_precision(memory_system),
        'recall_speed': measure_retrieval_time(memory_system),
        'storage_efficiency': calculate_compression_ratio(memory_system),
        'association_accuracy': test_association_strength(memory_system),
        'temporal_coherence': measure_sequence_prediction(memory_system),
        'information_retention': calculate_retention_rate(memory_system)
    }
    
    # 종합 점수
    overall_score = np.mean(list(metrics.values()))
    
    return metrics, overall_score