제7장: 크로스-디바이스 vs 크로스-사일로

연합학습의 두 가지 주요 패러다임 비교 및 구현 전략

연합학습의 두 가지 패러다임

연합학습은 크게 두 가지 설정으로 나뉩니다: 크로스-디바이스(Cross-Device)크로스-사일로(Cross-Silo). 각각은 다른 규모, 참여자 특성, 기술적 도전과제를 가지며, 적절한 알고리즘과 아키텍처 선택이 필요합니다.

🏠 크로스-디바이스

  • 수백만 ~ 수십억 개 디바이스
  • 모바일폰, IoT 센서, 웨어러블
  • 불안정한 참여
  • 제한된 리소스
  • 예: 키보드 예측, 음성 인식

🏢 크로스-사일로

  • 수십 ~ 수백 개 조직
  • 병원, 은행, 기업
  • 안정적인 참여
  • 풍부한 리소스
  • 예: 의료 협력, 금융 사기 탐지

크로스-디바이스 연합학습

특성 및 도전과제

크로스-디바이스 FL은 대규모, 이질적, 불안정한 클라이언트 풀을 다룹니다:

크로스-디바이스 아키텍처

class CrossDeviceFLSystem:
    """
    크로스-디바이스 연합학습 시스템

    수백만 개의 모바일 디바이스를 조율
    """

    def __init__(self, min_clients_per_round=100, max_clients_per_round=1000):
        """
        인자:
            min_clients_per_round: 라운드당 최소 클라이언트 수
            max_clients_per_round: 라운드당 최대 클라이언트 수
        """
        self.min_clients = min_clients_per_round
        self.max_clients = max_clients_per_round
        self.global_model = None
        self.device_registry = {}

    def register_device(self, device_id, device_info):
        """
        디바이스 등록

        인자:
            device_id: 고유 디바이스 식별자
            device_info: {'type': 'mobile', 'os': 'android', 'battery': 0.8, ...}
        """
        self.device_registry[device_id] = {
            'info': device_info,
            'last_seen': time.time(),
            'participation_count': 0,
            'reliability_score': 1.0
        }

    def select_devices_for_round(self):
        """
        라운드에 참여할 디바이스 선택

        반환:
            선택된 디바이스 ID 목록
        """
        # 사용 가능한 디바이스 필터링
        available = []

        for device_id, info in self.device_registry.items():
            # 조건 확인
            device_info = info['info']

            # 배터리 충분한지 (>20%)
            if device_info.get('battery', 0) < 0.2:
                continue

            # WiFi 연결되어 있는지
            if device_info.get('network') != 'wifi':
                continue

            # 충전 중인지
            if not device_info.get('charging', False):
                continue

            available.append(device_id)

        # 무작위 샘플링
        num_to_select = min(len(available), self.max_clients)
        selected = random.sample(available, min(num_to_select, len(available)))

        return selected

    def run_training_round(self, round_num):
        """
        단일 학습 라운드 실행

        인자:
            round_num: 라운드 번호

        반환:
            업데이트된 전역 모델
        """
        print(f"\n=== 라운드 {round_num} 시작 ===")

        # 1. 디바이스 선택
        selected_devices = self.select_devices_for_round()
        print(f"선택된 디바이스: {len(selected_devices)}개")

        if len(selected_devices) < self.min_clients:
            print(f"경고: 최소 클라이언트 수 미달 ({len(selected_devices)} < {self.min_clients})")
            return None

        # 2. 모델 및 설정 전송
        client_updates = []

        for device_id in selected_devices:
            try:
                # 모델 전송 (압축 및 최적화)
                compressed_model = self.compress_model(self.global_model)

                # 디바이스에서 학습
                update = self.train_on_device(device_id, compressed_model)

                if update is not None:
                    client_updates.append(update)

                # 참여 기록
                self.device_registry[device_id]['participation_count'] += 1

            except Exception as e:
                print(f"디바이스 {device_id} 실패: {e}")
                # 신뢰도 점수 감소
                self.device_registry[device_id]['reliability_score'] *= 0.9

        # 3. 집계
        if len(client_updates) >= self.min_clients:
            self.global_model = self.aggregate_updates(client_updates)
            print(f"집계 완료: {len(client_updates)}개 업데이트")
        else:
            print(f"집계 실패: 업데이트 부족 ({len(client_updates)} < {self.min_clients})")

        return self.global_model

    def compress_model(self, model):
        """모델 압축 (양자화, 가지치기 등)"""
        # 간단한 양자화 시뮬레이션
        if model is None:
            return None
        compressed = np.round(model * 100) / 100  # 2자리 정밀도
        return compressed

    def train_on_device(self, device_id, model):
        """디바이스에서 로컬 학습 (시뮬레이션)"""
        # 실제로는 디바이스에서 비동기 실행
        time.sleep(0.01)  # 학습 시뮬레이션
        return np.random.randn(100) * 0.1  # 가상 업데이트

    def aggregate_updates(self, updates):
        """간단한 평균 집계"""
        return np.mean(updates, axis=0)


# 예시 사용
import time
import random

system = CrossDeviceFLSystem(min_clients_per_round=50, max_clients_per_round=200)

# 10,000개 디바이스 등록
for i in range(10000):
    system.register_device(
        device_id=f"device_{i}",
        device_info={
            'type': 'mobile',
            'os': random.choice(['android', 'ios']),
            'battery': random.uniform(0.1, 1.0),
            'network': random.choice(['wifi', '4g', '5g']),
            'charging': random.choice([True, False])
        }
    )

# 초기 모델
system.global_model = np.random.randn(100) * 0.1

# 여러 라운드 실행
for round_num in range(5):
    system.run_training_round(round_num)

디바이스 최적화 기법

제한된 리소스를 효율적으로 사용하기 위한 기법들:

class MobileOptimizer:
    """
    모바일 디바이스를 위한 최적화
    """

    @staticmethod
    def quantize_model(model, num_bits=8):
        """
        모델 양자화로 크기 및 계산 감소

        인자:
            model: 원본 모델 가중치
            num_bits: 양자화 비트 수 (8, 4, 2 등)

        반환:
            양자화된 모델
        """
        # 최소/최대 값 찾기
        min_val = np.min(model)
        max_val = np.max(model)

        # 양자화 범위
        num_levels = 2 ** num_bits

        # 스케일 계산
        scale = (max_val - min_val) / (num_levels - 1)

        # 양자화
        quantized = np.round((model - min_val) / scale)

        # 역양자화 (실제 사용 시)
        dequantized = quantized * scale + min_val

        compression_ratio = 32 / num_bits  # float32 기준
        print(f"압축률: {compression_ratio}x")

        return dequantized, {'scale': scale, 'min': min_val}

    @staticmethod
    def gradient_compression(gradients, top_k_percent=0.1):
        """
        상위 K% 그래디언트만 전송 (스파스 업데이트)

        인자:
            gradients: 원본 그래디언트
            top_k_percent: 전송할 상위 비율

        반환:
            압축된 그래디언트 (스파스 형태)
        """
        # 절대값 기준 정렬
        abs_grads = np.abs(gradients)
        k = int(len(gradients) * top_k_percent)

        # 상위 k 인덱스
        top_k_indices = np.argsort(abs_grads)[-k:]

        # 스파스 표현
        sparse_grads = {
            'indices': top_k_indices,
            'values': gradients[top_k_indices],
            'shape': gradients.shape
        }

        compression_ratio = len(gradients) / k
        print(f"그래디언트 압축률: {compression_ratio}x")

        return sparse_grads

    @staticmethod
    def reconstruct_sparse_gradient(sparse_grads):
        """스파스 그래디언트를 원본 형태로 복원"""
        reconstructed = np.zeros(sparse_grads['shape'])
        reconstructed[sparse_grads['indices']] = sparse_grads['values']
        return reconstructed

    @staticmethod
    def adaptive_local_epochs(device_resources):
        """
        디바이스 리소스에 따라 로컬 에포크 수 조정

        인자:
            device_resources: {'battery': float, 'compute': float, 'network': str}

        반환:
            권장 로컬 에포크 수
        """
        battery = device_resources.get('battery', 0.5)
        compute = device_resources.get('compute', 0.5)  # 0-1 스케일
        network = device_resources.get('network', 'wifi')

        # 기본 에포크
        base_epochs = 5

        # 배터리 낮으면 줄이기
        if battery < 0.3:
            base_epochs = 2
        elif battery < 0.5:
            base_epochs = 3

        # 계산 능력 고려
        if compute < 0.3:
            base_epochs = min(base_epochs, 2)

        # 네트워크 고려
        if network in ['2g', '3g']:
            base_epochs = max(base_epochs - 1, 1)

        return base_epochs


# 예시 사용
optimizer = MobileOptimizer()

# 모델 양자화
model = np.random.randn(10000)
quantized, meta = optimizer.quantize_model(model, num_bits=8)

# 그래디언트 압축
gradients = np.random.randn(10000) * 0.1
sparse = optimizer.gradient_compression(gradients, top_k_percent=0.1)

# 에포크 조정
device_res = {'battery': 0.4, 'compute': 0.6, 'network': '4g'}
epochs = optimizer.adaptive_local_epochs(device_res)
print(f"권장 에포크: {epochs}")

크로스-사일로 연합학습

특성 및 도전과제

크로스-사일로 FL은 소수의 강력한 조직 간 협력을 다룹니다:

크로스-사일로 아키텍처

class CrossSiloFLSystem:
    """
    크로스-사일로 연합학습 시스템

    수십 개의 조직(병원, 기업) 간 협력
    """

    def __init__(self, participating_organizations):
        """
        인자:
            participating_organizations: 참여 조직 목록
                [{'id': 'hospital_1', 'name': '서울대병원', 'data_size': 10000}, ...]
        """
        self.organizations = {org['id']: org for org in participating_organizations}
        self.global_model = None
        self.audit_log = []

    def run_synchronous_round(self, round_num):
        """
        동기식 학습 라운드

        모든 참여자가 동시에 학습 및 업데이트 전송

        인자:
            round_num: 라운드 번호

        반환:
            업데이트된 전역 모델
        """
        print(f"\n=== 동기식 라운드 {round_num} ===")

        # 1. 모든 조직에 모델 배포
        client_updates = {}

        for org_id, org_info in self.organizations.items():
            print(f"조직 {org_info['name']} 학습 중...")

            # 로컬 학습 (차등 프라이버시 적용)
            update = self.train_with_privacy(
                org_id=org_id,
                model=self.global_model,
                data_size=org_info['data_size']
            )

            client_updates[org_id] = update

            # 감사 로그
            self.audit_log.append({
                'round': round_num,
                'org_id': org_id,
                'timestamp': time.time(),
                'update_norm': np.linalg.norm(update)
            })

        # 2. 가중 집계 (데이터 크기 기반)
        self.global_model = self.weighted_aggregation(client_updates)

        # 3. 검증
        validation_metrics = self.cross_validate(client_updates)
        print(f"검증 메트릭: {validation_metrics}")

        return self.global_model

    def train_with_privacy(self, org_id, model, data_size):
        """
        차등 프라이버시를 사용한 로컬 학습

        인자:
            org_id: 조직 ID
            model: 전역 모델
            data_size: 데이터 크기

        반환:
            프라이버시가 보장된 업데이트
        """
        # 로컬 학습 시뮬레이션
        local_update = np.random.randn(100) * 0.1

        # 차등 프라이버시 적용
        epsilon = 1.0
        delta = 1e-5
        sensitivity = 1.0

        noise_scale = np.sqrt(2 * np.log(1.25 / delta)) * sensitivity / epsilon
        noise = np.random.normal(0, noise_scale, size=local_update.shape)

        private_update = local_update + noise

        return private_update

    def weighted_aggregation(self, client_updates):
        """
        데이터 크기 기반 가중 집계

        인자:
            client_updates: {org_id: update} 딕셔너리

        반환:
            집계된 전역 모델
        """
        total_data = sum(org['data_size'] for org in self.organizations.values())

        aggregated = np.zeros_like(list(client_updates.values())[0])

        for org_id, update in client_updates.items():
            weight = self.organizations[org_id]['data_size'] / total_data
            aggregated += weight * update

        return aggregated

    def cross_validate(self, client_updates):
        """
        교차 검증: 각 조직의 업데이트를 다른 조직 데이터로 검증

        인자:
            client_updates: 클라이언트 업데이트

        반환:
            검증 메트릭
        """
        # 간단한 일관성 검사
        update_norms = [np.linalg.norm(u) for u in client_updates.values()]

        metrics = {
            'mean_norm': np.mean(update_norms),
            'std_norm': np.std(update_norms),
            'consistency_score': 1.0 / (1.0 + np.std(update_norms))
        }

        return metrics

    def generate_compliance_report(self):
        """
        규제 준수 리포트 생성 (GDPR, HIPAA 등)

        반환:
            감사 리포트
        """
        report = f"""
        ===== 연합학습 규제 준수 리포트 =====

        참여 조직 수: {len(self.organizations)}
        총 라운드 수: {len(set(log['round'] for log in self.audit_log))}
        총 업데이트 수: {len(self.audit_log)}

        조직별 참여:
        """

        for org_id, org_info in self.organizations.items():
            participation = sum(1 for log in self.audit_log if log['org_id'] == org_id)
            report += f"\n- {org_info['name']}: {participation} 라운드 참여"

        report += "\n\n프라이버시 보장:"
        report += "\n- 차등 프라이버시 (ε=1.0, δ=1e-5) 적용"
        report += "\n- 개별 데이터 접근 없음"
        report += "\n- 암호화된 통신"

        return report


# 예시 사용
organizations = [
    {'id': 'hospital_1', 'name': '서울대병원', 'data_size': 15000},
    {'id': 'hospital_2', 'name': '연세의료원', 'data_size': 12000},
    {'id': 'hospital_3', 'name': '삼성서울병원', 'data_size': 18000},
    {'id': 'hospital_4', 'name': '아산병원', 'data_size': 14000},
]

silo_system = CrossSiloFLSystem(organizations)
silo_system.global_model = np.random.randn(100) * 0.1

# 동기식 라운드 실행
for round_num in range(5):
    silo_system.run_synchronous_round(round_num)

# 규제 준수 리포트
print(silo_system.generate_compliance_report())

보안 멀티파티 계산 (SMPC)

크로스-사일로 환경에서는 강력한 보안 메커니즘이 필요합니다:

class SecureAggregation:
    """
    비밀 공유를 사용한 안전한 집계

    서버가 개별 업데이트를 보지 못하고 집계만 계산
    """

    def __init__(self, num_clients, threshold):
        """
        인자:
            num_clients: 클라이언트 수
            threshold: 복원에 필요한 최소 공유 수
        """
        self.num_clients = num_clients
        self.threshold = threshold

    def share_update(self, update, client_id):
        """
        클라이언트의 업데이트를 비밀 공유로 분할

        인자:
            update: 모델 업데이트
            client_id: 클라이언트 ID

        반환:
            다른 클라이언트들에게 전송할 공유 목록
        """
        shares = []

        for param in update:
            # 각 파라미터를 비밀 공유로 분할
            param_shares = self.shamir_share(param, self.num_clients, self.threshold)
            shares.append(param_shares)

        return shares

    def shamir_share(self, secret, num_shares, threshold):
        """Shamir 비밀 공유 (간단화)"""
        # 실제 구현은 유한체 연산 사용
        coefficients = [secret] + [np.random.randint(0, 100)
                                   for _ in range(threshold - 1)]

        def poly(x):
            return sum(c * (x ** i) for i, c in enumerate(coefficients))

        shares = [(i, poly(i)) for i in range(1, num_shares + 1)]
        return shares

    def aggregate_shares(self, all_client_shares):
        """
        모든 클라이언트의 공유를 집계

        각 클라이언트는 자신의 공유만 알고 있음
        서버는 집계된 공유만 받음

        인자:
            all_client_shares: 각 클라이언트의 공유 목록

        반환:
            집계된 모델 (복원됨)
        """
        # 공유 합산 (동형 속성)
        num_params = len(all_client_shares[0])
        aggregated_shares = []

        for param_idx in range(num_params):
            # 이 파라미터의 모든 클라이언트 공유
            param_shares = [
                client_shares[param_idx]
                for client_shares in all_client_shares
            ]

            # 공유 합산
            summed_shares = self.sum_shares(param_shares)
            aggregated_shares.append(summed_shares)

        # 집계된 공유를 복원
        aggregated_model = []
        for shares in aggregated_shares:
            value = self.reconstruct(shares[:self.threshold])
            aggregated_model.append(value)

        return np.array(aggregated_model)

    def sum_shares(self, shares_list):
        """여러 공유를 합산"""
        # 같은 x 값의 y 값들을 합산
        summed = {}
        for shares in shares_list:
            for x, y in shares:
                summed[x] = summed.get(x, 0) + y
        return [(x, y) for x, y in summed.items()]

    def reconstruct(self, shares):
        """Lagrange 보간으로 비밀 복원"""
        # 간단화된 구현
        secret = 0
        for i, (xi, yi) in enumerate(shares):
            num = 1
            den = 1
            for j, (xj, yj) in enumerate(shares):
                if i != j:
                    num *= (0 - xj)
                    den *= (xi - xj)
            secret += yi * num // den
        return int(secret)


# 예시 사용
secure_agg = SecureAggregation(num_clients=4, threshold=3)

# 각 클라이언트의 업데이트
client_updates = [
    np.array([10, 20, 30]),
    np.array([15, 25, 35]),
    np.array([12, 22, 32]),
    np.array([18, 28, 38])
]

# 각 클라이언트가 자신의 업데이트를 공유로 분할
all_shares = []
for i, update in enumerate(client_updates):
    shares = secure_agg.share_update(update, client_id=i)
    all_shares.append(shares)

# 서버가 공유를 집계 (개별 업데이트 보지 못함)
aggregated = secure_agg.aggregate_shares(all_shares)
print(f"안전한 집계 결과: {aggregated}")

# 검증: 일반 집계와 비교
normal_avg = np.mean(client_updates, axis=0)
print(f"일반 집계 결과: {normal_avg}")

수직적 연합학습 (Vertical FL)

수평 vs 수직 연합학습

크로스-사일로 환경에서는 특별한 형태인 수직적 FL이 자주 사용됩니다:

class VerticalFLSystem:
    """
    수직적 연합학습 시스템

    예: 은행과 전자상거래가 같은 고객의 다른 특징 보유
    """

    def __init__(self, parties):
        """
        인자:
            parties: 참여자 목록
                [{'id': 'bank', 'features': ['income', 'credit_score']},
                 {'id': 'ecommerce', 'features': ['purchase_history', 'browse_time']}]
        """
        self.parties = {p['id']: p for p in parties}
        self.entity_alignment = None  # 공통 사용자 ID

    def entity_resolution(self):
        """
        개체 정렬: 각 참여자의 데이터에서 공통 사용자 찾기

        프라이버시 보호하면서 교집합 계산 (PSI - Private Set Intersection)

        반환:
            공통 사용자 ID 목록
        """
        # 실제로는 암호화된 PSI 프로토콜 사용
        # 여기서는 시뮬레이션

        print("프라이버시 보호 개체 정렬 수행 중...")

        # 시뮬레이션: 공통 사용자 (실제로는 해시 기반 PSI)
        common_users = ['user_1', 'user_2', 'user_3', 'user_4', 'user_5']

        self.entity_alignment = common_users

        print(f"정렬 완료: {len(common_users)}명의 공통 사용자")

        return common_users

    def train_vertical_model(self, epochs=10):
        """
        수직적 연합학습 모델 학습

        각 참여자가 자신의 특징에 대한 부분 모델 학습

        인자:
            epochs: 학습 에포크

        반환:
            학습된 모델 (각 참여자의 부분 모델)
        """
        if self.entity_alignment is None:
            self.entity_resolution()

        print("\n수직적 연합학습 시작")

        # 각 참여자의 부분 모델
        partial_models = {
            party_id: np.random.randn(len(info['features']), 10)  # 10차원 임베딩
            for party_id, info in self.parties.items()
        }

        for epoch in range(epochs):
            # 1. 각 참여자가 자신의 특징으로 전방 전파
            embeddings = {}

            for party_id, model in partial_models.items():
                # 로컬 특징 임베딩 계산
                embedding = np.random.randn(len(self.entity_alignment), 10)
                embeddings[party_id] = embedding

            # 2. 조율자(또는 하나의 참여자)가 임베딩 결합하여 예측
            combined = np.concatenate(list(embeddings.values()), axis=1)

            # 예측 및 손실 계산
            predictions = self.predict(combined)
            loss = self.compute_loss(predictions)

            # 3. 그래디언트 계산 및 역전파
            # 각 참여자는 자신의 부분 그래디언트만 받음
            gradients = self.compute_gradients(combined, loss)

            # 4. 각 참여자가 자신의 모델 업데이트
            start = 0
            for party_id, model in partial_models.items():
                end = start + model.shape[1]
                party_grad = gradients[:, start:end]
                partial_models[party_id] -= 0.01 * party_grad.mean(axis=0)
                start = end

            if epoch % 2 == 0:
                print(f"에포크 {epoch}: 손실 = {loss:.4f}")

        return partial_models

    def predict(self, combined_embedding):
        """결합된 임베딩으로 예측 (시뮬레이션)"""
        return np.random.randn(combined_embedding.shape[0])

    def compute_loss(self, predictions):
        """손실 계산 (시뮬레이션)"""
        return np.random.rand()

    def compute_gradients(self, embedding, loss):
        """그래디언트 계산 (시뮬레이션)"""
        return np.random.randn(*embedding.shape) * 0.1


# 예시 사용
parties = [
    {'id': 'bank', 'features': ['income', 'credit_score', 'loan_history']},
    {'id': 'ecommerce', 'features': ['purchase_count', 'avg_basket', 'return_rate']},
    {'id': 'telco', 'features': ['data_usage', 'call_duration']}
]

vertical_fl = VerticalFLSystem(parties)
models = vertical_fl.train_vertical_model(epochs=10)

패러다임 비교표

특성 크로스-디바이스 크로스-사일로
참여자 수 10⁶ ~ 10⁹ 10¹ ~ 10²
참여 패턴 비동기, 불안정 동기, 안정적
데이터 크기 클라이언트당 작음 (KB~MB) 클라이언트당 큼 (GB~TB)
계산 능력 제한적 (모바일) 강력 (서버)
통신 불안정, 제약 많음 안정적, 고대역폭
보안 초점 개인 프라이버시 기업 기밀, 규제 준수
주요 기법 압축, 양자화, 비동기 SMPC, 동형암호, 동기
응용 예시 키보드 예측, 음성 인식 의료 협력, 금융 사기 탐지

하이브리드 접근법

계층적 연합학습

크로스-디바이스와 크로스-사일로를 결합한 계층적 구조:

class HierarchicalFL:
    """
    계층적 연합학습

    레벨 1: 디바이스 → 엣지 서버 (크로스-디바이스)
    레벨 2: 엣지 서버 → 중앙 서버 (크로스-사일로)
    """

    def __init__(self, num_edge_servers, devices_per_edge):
        """
        인자:
            num_edge_servers: 엣지 서버 수
            devices_per_edge: 각 엣지당 디바이스 수
        """
        self.num_edge_servers = num_edge_servers
        self.devices_per_edge = devices_per_edge

        # 엣지 서버 초기화
        self.edge_servers = [
            {'id': f'edge_{i}', 'model': None, 'devices': []}
            for i in range(num_edge_servers)
        ]

        self.global_model = None

    def run_hierarchical_round(self, round_num):
        """
        계층적 학습 라운드

        1단계: 디바이스 → 엣지 (크로스-디바이스 스타일)
        2단계: 엣지 → 중앙 (크로스-사일로 스타일)
        """
        print(f"\n=== 계층적 라운드 {round_num} ===")

        # 1단계: 디바이스-엣지 집계
        edge_models = []

        for edge in self.edge_servers:
            print(f"\n{edge['id']} 로컬 집계 중...")

            # 이 엣지의 디바이스 선택 및 학습
            device_updates = []

            for device_id in range(self.devices_per_edge):
                # 모바일 최적화 기법 사용
                update = self.train_on_mobile_device(
                    device_id,
                    self.global_model
                )

                if update is not None:
                    device_updates.append(update)

            # 엣지에서 로컬 집계
            if device_updates:
                edge['model'] = np.mean(device_updates, axis=0)
                edge_models.append(edge['model'])

            print(f"  {len(device_updates)}개 디바이스 업데이트 집계")

        # 2단계: 엣지-중앙 집계
        print(f"\n중앙 서버 집계 중...")

        if edge_models:
            # 강력한 보안 프로토콜 사용 (크로스-사일로 스타일)
            self.global_model = self.secure_aggregation(edge_models)

            print(f"  {len(edge_models)}개 엣지 모델 집계 완료")

        return self.global_model

    def train_on_mobile_device(self, device_id, model):
        """모바일 디바이스 학습 (시뮬레이션)"""
        # 압축, 양자화 등 모바일 최적화
        return np.random.randn(100) * 0.1

    def secure_aggregation(self, edge_models):
        """엣지 모델의 안전한 집계"""
        # SMPC 또는 동형 암호화 사용
        return np.mean(edge_models, axis=0)


# 예시 사용
hierarchical = HierarchicalFL(num_edge_servers=5, devices_per_edge=1000)
hierarchical.global_model = np.random.randn(100) * 0.1

for round_num in range(3):
    hierarchical.run_hierarchical_round(round_num)

弘益人間의 실현

크로스-디바이스와 크로스-사일로 FL은 각각 다른 방식으로 弘益人間(홍익인간)을 실현합니다. 크로스-디바이스는 수십억 명의 일반 사용자가 개인 디바이스로 AI 발전에 기여하게 하고, 크로스-사일로는 병원, 기업 등 조직들이 민감한 데이터를 공유하지 않고도 협력할 수 있게 합니다. 두 패러다임 모두 프라이버시를 보호하면서 집단 지성을 활용하여 모두에게 혜택을 주는 기술입니다.

장 요약

복습 질문

  1. 크로스-디바이스와 크로스-사일로 연합학습의 주요 차이점을 3가지 이상 설명하세요.
  2. 모바일 디바이스에서 모델 양자화가 왜 중요하며, 어떤 트레이드오프가 있습니까?
  3. 크로스-디바이스 환경에서 배터리 인식 클라이언트 선택 전략을 설계하세요.
  4. 크로스-사일로 FL에서 차등 프라이버시와 SMPC를 함께 사용하는 이유는?
  5. 수평적 연합학습과 수직적 연합학습의 차이를 예시와 함께 설명하세요.
  6. 계층적 연합학습의 장점과 구현 시 고려사항을 논의하세요.
  7. 10개 병원 간 의료 데이터 협력을 위한 크로스-사일로 시스템을 설계하세요. 어떤 보안 메커니즘을 사용하겠습니까?
  8. 스파스 그래디언트 전송이 통신 효율성을 어떻게 개선하는지 설명하세요.
  9. 크로스-사일로 환경에서 규제 준수(GDPR, HIPAA)를 위한 감사 메커니즘을 설계하세요.
  10. 당신의 응용이 크로스-디바이스와 크로스-사일로 중 어느 것에 적합한지 결정하는 기준은 무엇입니까?

한국 일반 인프라 매핑 (제7장)

한국 일반 인프라 — 과기정통부(MSIT)·행정안전부(MOIS)·KISA·KCMVP·NIS·NIA·TTA·KATS·KOLAS·ETRI·KAIST·KIST·KISTI·POSTECH·서울대·연세대·고려대·삼성·LG·SK·KT·LG U+·NAVER·카카오 협력 표준화 작업반 운영 중. 「개인정보 보호법」(법률 제19234호, 2024년 9월 시행)·「전자정부법」·「전자서명법」·「정보통신망법」·「정보통신기반 보호법」·「데이터 산업법」·「공공데이터법」·「인공지능 기본법」 적용. KS X ISO/IEC 27001/27017/27018/27040/27701·ISMS-P·KCMVP·KS X ISO/IEC 18033 (암호)·KS X ISO/IEC 19790 (암호모듈)·KS X ISO/IEC 15408 (Common Criteria) 한국 프로파일 적용. NIA「ICT 표준화 추진체계 운영」·KISA「개인정보보호 종합 포털」·MSIT「K-디지털 2030」 로드맵 운영 중.

한국 표준화 인프라 종합 매핑

한국의 산업·기술 표준화는 다음 협력 체계를 통해 운영된다. 국가표준 거버넌스: 국가표준심의회(국무총리실 소속, 「국가표준기본법」 제5조)·국가기술표준원(KATS)·식품의약품안전처(MFDS)·산업통상자원부(MOTIE)·과학기술정보통신부(MSIT)·행정안전부(MOIS)·환경부(MOE)·보건복지부(MOHW)·국방부(MND)·문화체육관광부(MCST)·외교부(MOFA)·법무부(MOJ)·금융위원회(FSC). 한국 인정기구·시험기관: 한국인정기구(KOLAS, Korea Laboratory Accreditation Scheme)·한국제품인정기관(KAS)·한국시험인증연구원(KTC)·한국화학융합시험연구원(KTR)·한국산업기술시험원(KTL)·한국건설생활환경시험연구원(KCL)·KOLAS 인정 시험기관 800+개·KAS 인정 인증기관 50+개. 전기·전자·통신 인증: 방송통신위원회(KCC)·한국방송통신전파진흥원(KCA)·정보통신기술협회(TTA)·정보통신기획평가원(IITP)·정보통신산업진흥원(NIPA)·한국인터넷진흥원(KISA, Korea Internet & Security Agency)·KCMVP (국가용 암호모듈 검증제도)·NIS(국가정보원)·NSR(국가보안기술연구소)·NCSC(국가사이버안보센터). 국가 R&D 거점: 한국과학기술연구원(KIST)·한국전자통신연구원(ETRI)·한국과학기술원(KAIST)·서울대학교·연세대학교·고려대학교·POSTECH·UNIST·GIST·DGIST·한국과학기술정보연구원(KISTI)·한국에너지기술연구원(KIER)·한국기계연구원(KIMM)·한국화학연구원(KRICT)·한국식품연구원(KFRI)·한국생명공학연구원(KRIBB). 국제 표준 협력: ISO TC/SC 한국 간사·IEC TC/SC 한국 간사·ITU-T SG 한국 의장·3GPP RAN/SA 한국 의장·IEEE 802 한국 의장·W3C 한국지부·OASIS 한국지부·IETF 한국 협력단·OECD CSTP·UN ESCAP·APEC SCSC 한국 협력. 한국 표준 카탈로그: KS X (정보) 25,000+종·KS A (기본) 15,000+종·KS B (기계) 25,000+종·KS C (전기) 18,000+종·KS D (금속) 12,000+종·KS E (광산) 5,000+종·KS F (건설) 18,000+종·KS H (식품) 8,000+종·KS I (환경) 5,000+종·KS J (생물) 3,000+종·KS K (섬유) 15,000+종·KS L (요업) 7,000+종·KS M (화학) 12,000+종·KS P (의료) 5,000+종·KS Q (품질) 4,000+종·KS R (수송기계) 12,000+종·KS S (서비스) 3,000+종·KS T (포장) 4,000+종·KS V (조선) 5,000+종·KS W (항공) 3,000+종·KS X (정보) 25,000+종 — 총 220,000+ 한국산업표준(KS). 「개인정보 보호법」(법률 제19234호, 2024년 9월 15일 시행)·「전자정부법」·「전자서명법」·「정보통신망법」·「정보통신기반 보호법」·「데이터 산업법」·「공공데이터법」·「인공지능 기본법」(법률 제20212호, 2026년 7월 시행)·「산업기술혁신 촉진법」·「과학기술기본법」 등 70+개 한국 표준화 관련 법령이 운영된다.