페이지

2025년 7월 24일 목요일

차등 정보보호 - 7. 스피너 모델 적용과 통계 추정(스피너만 사용)

차등 정보보호 - 7. 스피너 모델 적용과 통계 추정(스피너만 사용)

다섯 명의 환자 질병 유무 데이터에 불확실성을 추가하여 공개하고 이로부터 원래의 질병 보유 환자 비율이 어떤 값일지 추정하는 과정을 보여 줍니다.

불확실성 추가 방식 정하기

전체 영역 중에서 밝은 부분의 면적이 차지하는 비율이 90%인 스피너를 사용하여 원본 데이터에 불확실성을 추가합니다.

  • plight=0.9p_{light} = 0.9

시행 결과로 바늘이 밝은 부분에서 멈추면 질병 유무를 그대로 유지하고 어두운 부분에서 멈추면 질병 유무를 뒤집어서 기록합니다.

원본 데이터 준비하기

위의 데이터는 원본이기 때문에 환자 D의 False가 진짜 False일 가능성은 100%입니다.

불확실성 추가하기

환자별로 스피너를 시행하고 그 결과에 따라 질병 유무를 그대로 유지하거나 반대로 바꿉니다.

데이터 공개하기

스피너를 시행하여 처리한 결과 데이터를 공개합니다.

불확실성의 추가로 인해 환자 D의 True가 진짜 True일 가능성은 100%가 아니고 90%가 됩니다. 이것은 다른 환자들의 질병 유무에 대해서도 마찬가지입니다.

질병 보유 비율 추정

공개된 데이터로부터 원본 데이터의 질병 보유 비율을 추정합니다.

통계 자료

원본 데이터에서 질병 유무가 True인 환자의 비율:

  • noriginal=0.6n_{original} = 0.6

공개 데이터에서 질병 유무가 True인 환자의 비율:

  • npublic=0.8n_{public} = 0.8

수식 유도

공개 데이터로부터 추정하는 원본 데이터에서 질병 유무가 True인 환자의 비율:

  • nestimated=?n_{estimated} = ?

공개 데이터에서 질병 유무가 True인 환자는 진짜 True인 환자가 True로 대답했거나 진짜 False인 환자가 True로 대답한 경우에 해당합니다. 따라서 다음의 관계가 성립합니다.

  • npublic=nestimated×plight+(1nestimated)×(1plight)n_{public} = n_{estimated} \times p_{light} + (1 - n_{estimated}) \times (1 - p_{light})

위의 관계를 사용하여 질병 유무가 진짜 True인 환자의 비율을 추정할 수 있습니다.

  • nestimated=npublic(1plight)2×plight1=0.8(10.9)2×0.91=0.70.8=0.875n_{estimated} = \frac {n_{public} - (1 - p_{light})}{2 \times p_{light} - 1} = \frac {0.8 - (1 - 0.9)}{2 \times 0.9 - 1} = \frac {0.7}{0.8} = 0.875

오차율

진짜 True 환자 비율과 추정 True 환자 비율의 차이:

  • error=nestimatednoriginal=0.8750.6=0.275{error} = n_{estimated} - n_{original} = 0.875 - 0.6 = 0.275

참고 자료

Written with StackEdit.

차등 정보보호 - 6. 스피너 모델과 프라이버시 손실의 관계 유도

차등 정보보호 - 6. 스피너 모델과 프라이버시 손실의 관계 유도

차등 정보보호(Differential Privacy)의 임의화 응답(Randomized Response) 기법에서 사용하는 스피너 모델은 사용자의 실제 답변을 확률적으로 바꾸어 프라이버시를 보호합니다. 스피너의 밝은 면이 차지하는 비율은 프라이버시 보호 수준, 즉 프라이버시 손실(Privacy Loss)과 직접적인 관계를 맺습니다.

스피너 모델의 작동 방식

먼저 스피너 모델이 어떻게 작동하는지 이해해야 합니다. 사용자가 “예” 또는 "아니오"로 답해야 하는 민감한 질문이 있다고 가정해 보겠습니다.

  1. 진실 응답: 사용자는 스피너를 돌리기 전에 질문에 대한 자신의 실제 답변(‘예’ 또는 ‘아니오’)을 마음속으로 정합니다.
  2. 스피너 돌리기:
    • 스피너가 밝은 면(p의 비율)에 멈추면, 사용자는 자신의 실제 답변을 그대로 말합니다.
    • 스피너가 어두운 면(1-p의 비율)에 멈추면, 사용자는 동전을 던지는 것과 같이 50% 확률로 ‘예’, 50% 확률로 ‘아니오’ 중 하나를 무작위로 선택하여 답합니다.

정의를 임의화 응답에 적용하기

차등 정보보호의 일반적인 정의를 스피너를 사용하는 임의화 응답 모델에 적용해 보겠습니다.

  1. 알고리즘 M: 스피너를 돌려 답변을 결정하는 임의화 응답 절차입니다.
  2. 인접 데이터셋 D1,D2:
    • D1: 개인의 실제 답변이 '예(Yes)'인 경우
    • D2: 개인의 실제 답변이 '아니오(No)'인 경우
  3. 결과 O: 공격자가 관찰하는 것은 응답자가 최종적으로 보고한 답변입니다. 프라이버시가 가장 많이 유출되는 최악의 시나리오인 '예(Yes)'라고 응답한 경우를 가정합니다.

이제 차등 정보보호의 정의에 이 요소들을 대입합니다.

P(보고된 답변=실제 답변=)P(보고된 답변=실제 답변=아니)eϵ \frac{P\left(보고된\ 답변='예'\mid 실제\ 답변='예'\right)}{P\left(보고된\ 답변='예'\mid 실제\ 답변='아니오'\right)}\le e^{\epsilon }

프라이버시 손실은 특정 응답이 나왔을 때, 그 응답이 실제 '예’에서 나왔을 확률과 실제 '아니오’에서 나왔을 확률의 비율을 통해 측정됩니다. 이 비율에 자연로그를 취한 값이 프라이버시 손실(ε)입니다.

확률 계산 및 수식 연결

가장 프라이버시 손실이 큰 경우는, 즉 공격자가 가장 많은 정보를 얻을 수 있는 시나리오는 응답자가 '예’라고 답했을 때입니다. 이때의 프라이버시 손실을 계산해 보겠습니다.

응답이 '예’일 확률 계산:

  • 실제 답변이 '예’일 경우:
    • 밝은 면에 멈춰 '예’라고 답할 확률: p×1=p
    • 어두운 면에 멈춰 '예’라고 답할 확률: (1−p)×0.5
    • 따라서, P(보고된 답변='예’∣실제 답변=‘예’)=p+0.5(1−p)=0.5p+0.5
  • 실제 답변이 '아니오’일 경우:
    • 밝은 면에 멈춰 '예’라고 답할 확률: p×0=0
    • 어두운 면에 멈춰 '예’라고 답할 확률: (1−p)×0.5
    • 따라서, P(보고된 답변='예’∣실제 답변=‘아니오’)=0.5(1−p)

이 확률들을 비율식에 넣으면 다음과 같습니다.

0.5p+0.50.5(1p)=1+p1p \frac{0.5p+0.5}{0.5\left(1-p\right)}=\frac{1+p}{1-p}

이것이 차등 정보보호 정의의 eεe^ε보다 작거나 같아야 하므로,

1+p1peϵ \frac{1+p}{1-p}\le {e}^{\epsilon }

프라이버시 손실 ε을 구하기 위해 양변에 자연로그(ln)를 취하면, 임의화 응답에서의 프라이버시 손실 수식이 완성됩니다.

ln(1+p1p)ϵ \ln \left(\frac{1+p}{1-p}\right)\le \epsilon

따라서, 임의화 응답 메커니즘이 ε-차등 정보보호를 만족하기 위한 최소 ε 값, 즉 프라이버시 손실은

ln(1+p1p) \ln \left(\frac{1+p}{1-p}\right)

가 됩니다.

이 과정을 통해 차등 정보보호라는 추상적인 수학적 정의가 어떻게 임의화 응답이라는 구체적인 알고리즘의 프라이버시 수준을 측정하는 수식으로 연결되는지 명확하게 알 수 있습니다.

Written with StackEdit.

차등 정보보호 - 4. 용어의 의미 및 수학적 정의

차등 정보보호 - 4. 용어의 의미 및 수학적 정의

용어의 의미

차등 정보보호(Differential Privacy)에서 'differential’이라는 단어는 '차이(difference)'를 의미하며, 데이터베이스에 특정 개인의 데이터가 포함되거나 포함되지 않았을 때 발생하는 '결과의 차이를 제어’하는 기술의 핵심 개념을 직접적으로 나타냅니다.

이 용어는 2006년 컴퓨터 과학자 신시아 드워크(Cynthia Dwork)가 발표한 논문 "Differential Privacy"에서 처음으로 공식화되었습니다. 이 개념의 핵심은 데이터베이스에 대한 질의(query) 결과가 특정 개인의 데이터 유무에 따라 크게 달라지지 않도록 보장하는 것입니다. 즉, 데이터베이스에서 한 사람의 정보를 추가하거나 제거하더라도 분석 결과에 미치는 영향(차이)이 거의 없도록 만드는 것이 목표입니다.

수학적 정의

어떤 무작위화 알고리즘 M이 ε-차등 정보보호를 만족한다는 것은, 단 하나의 데이터만 다른 임의의 두 인접 데이터셋 D1과 D2에 대해, 알고리즘 M이 출력할 수 있는 모든 결과의 집합 S에 속하는 특정 결과 O가 나올 확률이 다음 부등식을 만족한다는 의미입니다.

P(M(D1)=O)P(M(D2)=O)eϵ \frac {P(M\left({D}_1\right)=O)} {P(M\left(D_2\right)=O)} \le {e}^{\epsilon }

  • 알고리즘 M: 데이터를 입력받아 무작위화된 결과를 출력하는 함수 (여기서는 임의화 응답 메커니즘)
  • 인접 데이터셋 D1,D2: 단 한 사람의 정보만 다른 데이터셋 (여기서는 한 사람의 실제 답변이 '예’인 경우와 '아니요’인 경우)
  • 결과 O: 알고리즘이 출력하는 값 (여기서는 응답자가 보고한 답변 ‘예’ 또는 ‘아니요’)
  • ε(엡실론): 프라이버시 손실(Privacy Loss). 이 값이 작을수록 프라이버시 보호 수준이 높습니다.

Written with StackEdit.

차등 정보보호 - 3. 인접 데이터셋의 두 가지 주요 정의

차등 정보보호 - 3. 인접 데이터셋의 두 가지 주요 정의

차등 정보보호에서 인접 데이터셋(Adjacent Datasets)은 단 한 사람의 데이터만 다른 두 개의 데이터셋을 의미합니다. 이 개념은 "어떤 한 개인이 데이터셋에 포함되거나 포함되지 않더라도, 분석 결과가 거의 바뀌지 않아야 한다"는 차등 정보보호의 핵심 아이디어를 수학적으로 정의하는 기준이 됩니다.

인접 데이터셋의 두 가지 주요 정의

인접 데이터셋을 정의하는 방식에는 크게 두 가지가 있으며, 사용 사례에 따라 구분됩니다.

1. 비제한적 인접성 (Unbounded Adjacency) - 추가/삭제

가장 일반적인 정의입니다. 두 데이터셋 D1과 D2는 한 개의 레코드(데이터 행)를 추가하거나 삭제해서 서로를 만들 수 있을 때 '인접’하다고 말합니다.

  • 수학적 표현: ∣D1ΔD2∣=1
    • 여기서 Δ는 대칭차(Symmetric Difference)를 의미합니다. 즉, 한쪽에만 있고 다른 쪽에는 없는 원소의 개수가 1개라는 뜻입니다.
  • 예시: 100명의 환자 데이터가 담긴 데이터셋 D1이 있다고 가정해 봅시다.
    • D2: D1에서 특정 환자 A의 데이터를 삭제한 99명의 데이터셋
    • D3: D1에 새로운 환자 B의 데이터를 추가한 101명의 데이터셋
    • 이때, (D1, D2)는 인접 데이터셋이고, (D1, D3)도 인접 데이터셋입니다.

이 정의는 데이터셋의 전체 크기가 바뀔 수 있는 전역 민감도(Global Sensitivity) 모델에서 주로 사용됩니다.

2. 제한적 인접성 (Bounded Adjacency) - 대체

두 데이터셋의 크기(레코드 수)는 동일하지만, 단 하나의 레코드 내용만 다를 때 '인접’하다고 말합니다.

  • 수학적 표현: 데이터셋 D1과 D2는 크기가 같고, 단 하나의 인덱스 i에서만 D1[i] ≠ D2[i]를 만족합니다.
  • 예시: 100명의 설문조사 응답 데이터셋 D1이 있습니다.
    • D2: D1에서 다른 모든 정보는 동일하지만, 오직 3번 참가자의 응답만 '예’에서 '아니요’로 바꾼 데이터셋
    • 이때, D1과 D2는 인접 데이터셋입니다.

이 정의는 개인의 각 응답을 독립적으로 보호하는 지역 민감도(Local Sensitivity) 모델, 특히 임의화 응답(Randomized Response) 같은 시나리오에 직접적으로 적용됩니다. 스피너 모델의 경우가 바로 여기에 해당합니다.

  • D1: 당신의 실제 답변이 '예’인 상태
  • D2: 당신의 실제 답변이 '아니요’인 상태

이 두 "데이터셋"은 당신이라는 한 사람의 정보만 다르므로, 제한적 인접성의 정의를 만족합니다.

인접 데이터셋이 중요한 이유

인접 데이터셋 개념은 차등 정보보호의 최악의 시나리오(worst-case)를 가정하게 해줍니다.

알고리즘이 인접 데이터셋 D1과 D2에 대해 거의 동일한 확률로 같은 결과를 출력한다면, 즉

P[M(D1)=O]P[M(D2)=O] P[M(D_1)=O] \approx P[M(D_2)=O]

이라면, 공격자는 결과를 보고도 데이터가 D1에서 왔는지 D2에서 왔는지 확신할 수 없습니다.

이는 곧 데이터셋의 유일한 차이점인 한 개인의 정보가 무엇인지 추론할 수 없게 만든다는 의미이며, 이를 통해 개인의 프라이버시가 수학적으로 보장되는 것입니다.

Written with StackEdit.

차등 정보보호 - 2. 재식별 위험의 정량적 접근

차등 정보보호 - 2. 재식별 위험의 정량적 접근

재식별 위험, 어떻게 측정할 수 있을까?

데이터가 공개될 때 우리가 느끼는 '왠지 모를 불안감’을 숫자로 측정할 수 있다면 어떨까요? 놀랍게도, 프라이버시 보호 기술은 그 막연한 불안감을 구체적인 '위험도’로 계산하고 관리하는 것을 목표로 합니다.

그 실마리는 '한 개인의 정보가 전체 결과에 미치는 영향’을 살펴보는 데 있습니다.

데이터베이스에 내 정보가 추가됨으로 인해 통계 결과가 크게 달라진다면, 역으로 그 결과를 통해 나를 특정하기 쉬워진다는 의미입니다. 반대로 내 정보가 추가되어도 결과에 거의 변화가 없다면, 나는 수많은 데이터 속에 안전하게 숨을 수 있습니다.

즉, 재식별 위험을 낮추려면 개인의 정보가 결과에 미치는 영향(차이)을 최소화해야 합니다.

  • 상황 1: N명의 데이터베이스 → 통계 결과 A
  • 상황 2: (N+1)명의 데이터베이스 (내 정보 추가) → 통계 결과 B (A와 차이가 큼)

이러한 결과의 차이를 통제할 수 있다면, 우리는 재식별 위험을 관리할 수 있게 됩니다. 그렇다면 구체적으로 어떻게 그 차이를 줄일 수 있을까요?

해결책: '그럴듯한 부인’을 위한 확률적 장치

"마리화나를 피운 적이 있습니까?"와 같이 매우 민감한 질문에 답변해야 하는 상황을 상상해 봅시다. 모든 사람이 진실만을 답한다면, 특정인의 답변은 곧 그의 민감한 정보가 됩니다.

이때 '차등 정보보호(Differential Privacy)'라는 개념이 해법을 제시합니다. 핵심은 답변에 의도적인 노이즈(noise), 즉 무작위성을 섞는 것입니다. 예를 들어, 응답자에게 다음과 같은 규칙을 따르도록 하는 것입니다.

  1. 동전을 던집니다.
  2. 앞면이 나오면 무조건 진실을 말합니다.
  3. 뒷면이 나오면 다시 동전을 던져서, 그 결과에 따라 “예” 또는 "아니오"로 답합니다. (진실과 무관하게)

이런 장치를 도입하면, 설령 누군가 "예"라고 답했더라도 그것이 정말 경험이 있어서인지, 아니면 동전 던지기 규칙에 따른 우연의 결과인지 아무도 확신할 수 없습니다. 개인은 '나는 규칙에 따라 답했을 뿐’이라고 그럴듯하게 부인(Plausible Deniability)할 수 있는 안전장치를 얻게 됩니다.

위험의 정량화: 확률의 비율로 답을 찾다

바로 이 확률적 장치가 재식별 위험을 재는 '눈금’이 됩니다. 우리는 특정 응답이 나왔을 때, 그것이 진실에서 비롯되었을 확률과 거짓에서 비롯되었을 확률의 비율을 통해 위험도를 정밀하게 측정할 수 있습니다.

P(응답=""진실="")P(응답=""진실="아니오") \frac{P\left(응답="예"\mid 진실="예"\right)}{P\left(응답="예"\mid 진실="아니오"\right)}

  • 이 비율이 매우 크다면? "예"라는 응답은 진실이 "예"일 때 나올 가능성이 압도적으로 높다는 뜻입니다. 응답을 통해 실제 정보를 거의 확신할 수 있으므로 재식별 위험이 큽니다.
  • 이 비율이 1에 가깝다면? "예"라는 응답이 진실에서 비롯되었을 가능성과 거짓에서 비롯되었을 가능성이 거의 비슷하다는 의미입니다. 응답만으로는 실제 정보를 추측하기 어려우므로 재식별 위험이 작습니다.

이처럼 프라이버시 보호 기술은 단순히 정보를 가리는 것을 넘어, 정보 공개 시 발생할 수 있는 위험의 정도를 수학적으로 계산하고 이를 사전에 설정한 안전한 수준 이하로 통제하는 것을 목표로 합니다. 바로 이 지점에서 우리는 막연했던 불안감을 구체적인 '숫자’로 관리할 수 있는 실마리를 찾을 수 있습니다. 이는 개인의 존엄성을 지키면서 데이터의 사회적 가치를 안전하게 활용하기 위한, 우리 시대의 필수적인 기술적 약속이라 할 수 있습니다.

Written with StackEdit.

2025년 7월 20일 일요일

차등 정보보호 - 1. 재식별 위험: 보이지 않는 위협

차등 정보보호 - 1. 재식별 위험: 보이지 않는 위협

데이터를 완벽하게 보호하는 가장 확실한 방법은 공개하지 않는 것입니다. 하지만 이는 데이터가 가진 무한한 활용 가치를 포기하는 것과 같습니다. 결국 데이터의 가치를 실현하기 위해 공개는 불가피하며, 바로 그 순간 '재식별’이라는 그림자가 따라붙습니다. 설령 이름이나 주민등록번호 같은 직접적인 식별자를 제거하더라도, 다른 정보와 결합하면 특정 개인을 추론해낼 수 있는 위험은 사라지지 않습니다. 이는 정도의 차이만 있을 뿐, 근본적으로 피하기 어려운 문제입니다.

재식별 위험이 어떻게 현실화될 수 있는지 구체적인 예를 통해 살펴보겠습니다.

어떤 지역 주민 전체를 대상으로 특정 질병의 보유 현황을 조사했다고 가정해 봅시다. 조사 기관은 첫해에 주민의 1%가 해당 질병을 앓고 있다는 통계를 발표했습니다. 그리고 1년 후 같은 조사를 반복하니, 그 비율이 1.09%로 소폭 증가했다는 사실을 공개했습니다.

여기까지만 보면 아무 문제가 없어 보입니다. 하지만 만약 누군가 이 지역의 1년간 인구 이동 자료에 접근할 수 있다면 어떨까요?

그는 작년 총인구가 1,000명이었고, 그사이 이사 나간 사람은 없이 10명만 새로 전입했다는 사실을 알게 됩니다. 이 정보를 질병 통계와 결합하면, 매우 구체적인 추론이 가능해집니다.

계산 과정:

  • 작년 환자 수: 1,000명의 1% = 10명
  • 올해 환자 수: 1,010명의 1.09% ≈ 11명
  • 결론: 인구 변동이 오직 신규 전입자 10명뿐이었으므로, 이들 중 1명이 질병 보유자일 가능성이 매우 높습니다. (물론 설문조사에서 누군가 거짓 답변을 했을 수도 있기에 '추정’이라고 표현합니다.)

이러한 상황을 인지하게 된 신규 전입자 10명의 심정은 어떨까요? 특히 실제 질병을 보유한 사람은 자신이 10%의 확률로 특정될 수 있다는 사실만으로도 극심한 불안감을 느낄 수 있습니다.

이처럼 안전해 보이는 비식별 통계 데이터조차 다른 정보와 만났을 때 어떻게 개인의 프라이버시를 위협할 수 있는지 명확히 보여주는 사례입니다.

Written with StackEdit.

2025년 7월 15일 화요일

Intel MKL 예제를 Microsoft Visual C++로 빌드하기

Intel MKL 예제를 Microsoft Visual C++로 빌드하기

인텔 프로세서 시스템에서 아래의 영역에 해당하는 수학 계산을 빠르게 수행하고자 한다면 Intel MKL 라이브러리를 사용할 수 있습니다.

  • Linear Algebra
  • Fast Fourier Transforms (FFT)
  • Vector Statistics & Data Fitting
  • Vector Math & Miscellaneous Solvers

이 문서는 Intel MKL이 제공하는 예제 파일을 Microsoft Visual C++ 로 컴파일하고 링크하여 실행 파일을 만드는 과정을 소개합니다.

빌드 환경

다음은 이 문서를 작성하는 과정에서 Intel MKL 예제를 빌드하기 위하여 사용한 환경입니다.

시스템

  • 운영체제: Windows 10 (64비트)
  • 프로세서: Intel Core i7

설치 제품

환경 변수

  1. 명령 프롬프트 창을 엽니다.

  2. 아래 스크립트를 실행하여 환경 변수INCLUDE, LIB, 그리고 PATH를 설정합니다.

    @echo off
    
    set CPRO_PATH=C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows
    set MKLROOT=%CPRO_PATH%\mkl
    set REDIST=%CPRO_PATH%\redist
    
    set INCLUDE=%MKLROOT%\include;%INCLUDE%
    
    set LIB=%MKLROOT%\lib\intel64;%LIB%
    set PATH=%REDIST%\intel64\mkl;%PATH%
    
    REM for OpenMP intel thread
    set LIB=%CPRO_PATH%\compiler\lib\intel64;%LIB%
    set PATH=%REDIST%\intel64\compiler;%PATH%
    
    REM for TBB thread
    set LIB=%CPRO_PATH%\tbb\lib\intel64\vc_mt;%LIB%
    set PATH=%REDIST%\intel64\tbb\vc_mt;%PATH%
    
    call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
    
  3. 아래 스크립트를 실행하여 Visual C++ 사용 환경을 만듭니다. 64-bit로 빌드하기 위하여 vcvarsall.bat의 인자로 amd64를 지정합니다. 인자를 지정하지 않으면 32-bit로 빌드할 것입니다.

    @echo off
    
    call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
    

예제-1. ex_nslqp_c

  1. 아래 위치에 있는 예제 압축 파일을 작업하고자 하는 폴더 <working folder>에 풉니다.

    C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\mkl\examples\examples_core_c.zip
    
  2. 명령 프롬프트 창에서 아래의 폴더로 이동합니다.

    <working folder>\solverc
    
  3. 아래 스크립트를 실행하여 ex_nlsqp_c 예제를 빌드합니다.

    @echo off
    
    nmake dllintel64 threading=parallel compiler=msvs function="ex_nlsqp_c"
    nmake libintel64 threading=parallel compiler=msvs function="ex_nlsqp_c"
    nmake dllintel64 threading=sequential compiler=msvs function="ex_nlsqp_c"
    nmake libintel64 threading=sequential compiler=msvs function="ex_nlsqp_c"
    
  4. 아래 폴더에서 빌드 결과로 ex_nlsqp_c.exe 파일이 생성되었는지 확인합니다.

    _results\msvs_lp64_parallel_intel64
    _results\msvs_lp64_parallel_intel64_dll
    _results\msvs_lp64_sequential_intel64
    _results\msvs_lp64_sequential_intel64_dll
    
  5. ex_nlsqp_c.exe 파일을 실행하면 아래와 같은 메시지가 표시됩니다.

    >_results\msvs_lp64_sequential_intel64_dll\ex_nlsqp_c.exe
    |         dtrnlsp Powell............PASS
    

예제-2. matrix_multiplication

  1. 아래 사이트를 방문하여 예제 압축 파일을 다운로드하고 작업하고자 하는 폴더 <working folder>에 풉니다.

  1. 명령 프롬프트 창에서 아래의 폴더로 이동합니다.

    <working folder>\mkl\mkl_c_samples\matrix_multiplication\src
    

FOR 루프 계산

  1. 아래 스크립트를 실행하여 matrix_multiplication 예제를 빌드합니다.

    @echo off
    
    set THREADING=sequential
    set DLL_SUFF=
    set EXAMPLE=matrix_multiplication
    set OMP_LIB=
    cl.exe /c %EXAMPLE%.c
    link.exe mkl_intel_lp64%DLL_SUFF%.lib mkl_core%DLL_SUFF%.lib mkl_%THREADING%%DLL_SUFF%.lib %OMP_LIB% %EXAMPLE%.obj
    
  2. 현재 폴더에 matrix_multiplication.exe 파일이 생성되었는지 확인합니다.

  3. matrix_multiplication.exe 파일을 실행하면 아래와 같은 메시지가 표시됩니다.

    >matrix_multiplication.exe
     
     This example measures performance of rcomputing the real matrix product
     C=alpha*A*B+beta*C using a triple nested loop, where A, B, and C are
     matrices and alpha and beta are double precision scalars
    
     Initializing data for matrix multiplication C=A*B for matrix
     A(2000x200) and matrix B(200x1000)
    
     Allocating memory for matrices aligned on 64-byte boundary for better
     performance
    
     Intializing matrix data
    
     Making the first run of matrix product using triple nested loop
     to get stable run time measurements
    
     Measuring performance of matrix product using triple nested loop
    
     == Matrix multiplication using triple nested loop completed ==
     == at 1219.72656 milliseconds ==
    
     Deallocating memory
    
     Example completed.
    

    계산 소요 시간:

    • 1219.72656 milliseconds

CBLAS API + 멀티쓰레드 계산

  1. 아래 스크립트를 실행하여 dgemm_threading_effect_example 예제를 빌드합니다.

    @echo off
    
    set THREADING=intel_thread
    set DLL_SUFF=
    set EXAMPLE=dgemm_threading_effect_example
    set OMP_LIB=libiomp5md.lib
    cl.exe /c %EXAMPLE%.c
    link.exe mkl_intel_lp64%DLL_SUFF%.lib mkl_core%DLL_SUFF%.lib mkl_%THREADING%%DLL_SUFF%.lib %OMP_LIB% %EXAMPLE%.obj
    
  2. 현재 폴더에 dgemm_threading_effect_example.exe 파일이 생성되었는지 확인합니다.

  3. dgemm_threading_effect_example.exe 파일을 실행하면 아래와 같은 메시지가 표시됩니다.

    >dgemm_threading_effect_example.exe
    
     This example demonstrates threading impact on computing real matrix product
     C=alpha*A*B+beta*C using Intel(R) MKL function dgemm, where A, B, and C are
     matrices and alpha and beta are double precision scalars
    
     Initializing data for matrix multiplication C=A*B for matrix
     A(2000x200) and matrix B(200x1000)
    
     Allocating memory for matrices aligned on 64-byte boundary for better
     performance
    
     Intializing matrix data
    
     Finding max number of threads Intel(R) MKL can use for parallel runs
    
     Running Intel(R) MKL from 1 to 4 threads
    
     Requesting Intel(R) MKL to use 1 thread(s)
    
     Making the first run of matrix product using Intel(R) MKL dgemm function
     via CBLAS interface to get stable run time measurements
    
     Measuring performance of matrix product using Intel(R) MKL dgemm function
     via CBLAS interface on 1 thread(s)
    
     == Matrix multiplication using Intel(R) MKL dgemm completed ==
     == at 17.27277 milliseconds using 1 thread(s) ==
    
     Requesting Intel(R) MKL to use 2 thread(s)
    
     Making the first run of matrix product using Intel(R) MKL dgemm function
     via CBLAS interface to get stable run time measurements
    
     Measuring performance of matrix product using Intel(R) MKL dgemm function
     via CBLAS interface on 2 thread(s)
    
     == Matrix multiplication using Intel(R) MKL dgemm completed ==
     == at 9.67240 milliseconds using 2 thread(s) ==
    
     Requesting Intel(R) MKL to use 3 thread(s)
    
     Making the first run of matrix product using Intel(R) MKL dgemm function
     via CBLAS interface to get stable run time measurements
    
     Measuring performance of matrix product using Intel(R) MKL dgemm function
     via CBLAS interface on 3 thread(s)
    
     == Matrix multiplication using Intel(R) MKL dgemm completed ==
     == at 8.70466 milliseconds using 3 thread(s) ==
    
     Requesting Intel(R) MKL to use 4 thread(s)
    
     Making the first run of matrix product using Intel(R) MKL dgemm function
     via CBLAS interface to get stable run time measurements
    
     Measuring performance of matrix product using Intel(R) MKL dgemm function
     via CBLAS interface on 4 thread(s)
    
     == Matrix multiplication using Intel(R) MKL dgemm completed ==
     == at 7.69962 milliseconds using 4 thread(s) ==
    
     Deallocating memory
    
     It is highly recommended to define LOOP_COUNT for this example on your
     computer as 130 to have total execution time about 1 second for reliability
     of measurements
    
     Example completed.
    

    계산 소요 시간:

    • 17.3 milliseconds using 1 thread(s)
    • 9.7 milliseconds using 2 thread(s)
    • 8.7 milliseconds using 3 thread(s)
    • 7.7 milliseconds using 4 thread(s)

정리

계산 소요 시간 비교

행렬곱을 계산하기 위하여 Intel MKL이 제공하는 CBLAS API와 멀티쓰레드를 사용하면 FOR 루프를 사용할 때에 비하여 소요 시간이 1/158 수준으로 단축됨을 알 수 있었습니다.

  • FOR 루프 계산: 1219.7 milliseconds
  • CBLAS API + 멀티쓰레드 계산: 7.7 milliseconds using 4 thread(s)

스크립트 및 소스 파일

본문에서 소개한 환경 설정 스크립트, 빌드 스크립트, 그리고 행결곱 계산 소스 파일을 GitHub에 올려 놓았습니다.

참고 문서

  1. Developer Guide for Intel® Math Kernel Library for Windows
  2. Using Intel® Math Kernel Library for Matrix Multiplication - C
  3. Intel® Math Kernel Library Link Line Advisor
  4. Compiling and Linking Intel® Math Kernel Library with Microsoft* Visual C++*

Written with StackEdit.

2025년 7월 13일 일요일

1차원 데이터로 흠집 탐지할 때 일반 오토인코더와 LSTM-오토인코더 중 어느 것을 사용할까?

평평한 표면의 흠집을 1차원 데이터로 탐지할 경우, 대부분의 상황에서는 일반 오토인코더(Autoencoder)가 더 적합하고 효율적입니다.

왜 일반 오토인코더가 더 적합한가?

흠집이나 긁힘은 1차원 데이터 상에서 순간적으로 급격하게 튀는 '점 이상(Point Anomaly)'의 형태로 나타날 가능성이 큽니다. 평평한 표면의 정상 데이터는 거의 일정한 값을 유지하다가, 흠집 구간에서만 값이 크게 벗어납니다.

  • 패턴보다 분포 학습이 중요: 일반 오토인코더는 정상 데이터의 통계적 분포(예: '모든 값은 거의 0에 가깝다')를 학습하는 데 뛰어납니다. 따라서 이 분포에서 크게 벗어나는 흠집 신호를 매우 효과적으로 잡아낼 수 있습니다.
  • 단순성과 효율성: 모델 구조가 단순하여 LSTM-오토인코더보다 학습 속도가 훨씬 빠르고 계산 비용이 적게 듭니다. 이 문제에 굳이 복잡한 모델을 사용할 필요가 없습니다.

LSTM-오토인코더는 어떤 경우에 더 나은가?

만약 표면이 단순히 평평한 것이 아니라, 일정한 '결'이나 반복적인 '패턴'을 가지고 있다면 LSTM-오토인코더가 더 나은 선택이 될 수 있습니다.

  • 예시: 헤어라인 마감 처리된 금속 표면, 규칙적인 무늬가 있는 직물 등
  • 패턴의 이상 탐지: 이런 경우 흠집은 단순히 값이 튀는 것을 넘어, 정상적인 패턴의 흐름(Sequence)을 깨뜨리는 이상 현상으로 나타납니다. LSTM-오토인코더는 이러한 시간적, 순서적 패턴을 학습할 수 있으므로, 패턴이 망가진 지점을 더 정교하게 탐지할 수 있습니다.

2025년 7월 6일 일요일

차등 정보보호 - 5. 데이터 처리 방식 및 구현 모델에 따른 분류

 

데이터 처리 방식에 따른 분류

데이터에 직접 적용되어 프라이버시를 보장하는 핵심 알고리즘들입니다.

노이즈 추가

차등 정보보호에서 가장 보편적으로 사용되는 기법입니다. 핵심 원리는 데이터베이스에 대한 통계적 질의(Query)의 결과값에 수학적으로 생성된 '노이즈(noise)'라고 불리는 무작위 숫자를 더하여, 개별 데이터의 기여도를 모호하게 만드는 것입니다.

작동 원리

  1. 쿼리 실행: 데이터 분석가가 데이터베이스에 쿼리(예: "30대 사용자들의 평균 소득은 얼마인가?")를 실행하면, 시스템은 먼저 실제 결과값을 계산합니다.
  2. 민감도(Sensitivity) 계산: 쿼리 결과가 데이터베이스 내의 단 한 사람의 데이터 변화에 의해 얼마나 크게 변할 수 있는지를 측정합니다. 예를 들어, 한 사람의 데이터를 추가하거나 제거했을 때 평균 소득의 최댓값 변화가 '민감도'가 됩니다. 민감도가 높을수록 더 많은 노이즈가 필요합니다.
  3. 노이즈 생성 및 추가: 계산된 민감도와 목표 프라이버시 수준(엡실론, ε)에 따라 노이즈의 크기가 결정됩니다. 이 노이즈를 실제 쿼리 결과에 더하여 최종 결과를 만듭니다.

대표적인 노이즈 메커니즘

  • 라플라스 메커니즘 (Laplace Mechanism): 평균, 합계, 개수 등 수치형 결과를 반환하는 쿼리에 주로 사용됩니다. 민감도에 비례하는 라플라스 분포에서 추출된 노이즈를 추가합니다.
  • 가우시안 메커니즘 (Gaussian Mechanism): 라플라스 메커니즘과 유사하지만, 정규분포(가우시안 분포)에서 노이즈를 추출합니다. 여러 쿼리를 조합하거나 머신러닝 모델의 학습 파라미터를 보호하는 등 더 복잡한 분석에 적합합니다.

결론적으로, 노이즈 추가 기법은 분석 결과에 약간의 불확실성을 주입하여 "이 결과가 특정 개인의 정보 때문에 이렇게 나온 것"이라고 확신할 수 없게 만듦으로써 개인의 프라이버시를 보호합니다.

무작위 응답

주로 설문조사와 같이 사용자로부터 직접 데이터를 수집하는 단계에서 적용되는 기법입니다. 응답자가 자신의 민감한 정보(예: 위법 행위 경험, 특정 정치 성향 등)를 직접적으로 노출하지 않고도 통계적으로 유의미한 데이터를 제공할 수 있게 합니다.

작동 원리

이해를 돕기 위해 "불법 다운로드 경험이 있습니까?"라는 민감한 질문을 예로 들어보겠습니다.

  1. 무작위 규칙 설정: 응답자에게 다음과 같은 규칙을 제시합니다.
    • "먼저, 동전을 던지세요."
    • "앞면이 나오면, 진실을 답해주세요."
    • "뒷면이 나오면, 다시 동전을 던져서 앞면이 나오면 '예', 뒷면이 나오면 '아니요'라고 무작위로 답해주세요."
  2. 응답자 답변: 응답자는 이 규칙에 따라 답변합니다. 질문자는 응답자가 어떤 규칙에 따라 답변했는지(진실을 말했는지, 무작위로 답했는지) 알 수 없습니다. 따라서 "예"라는 답변이 실제 경험 때문인지, 아니면 동전 던지기 결과 때문인지 구분할 수 없습니다.
  3. 통계적 보정: 데이터 수집가는 이렇게 수집된 수많은 응답을 바탕으로 통계적 보정을 통해 실제 "예"의 비율을 추정할 수 있습니다. 예를 들어, 전체 응답 중 70%가 "예"라고 나왔다면, 무작위 응답으로 인해 "예"가 나올 확률(이 경우 25%)을 제외하여 실제 불법 다운로드 경험자의 비율을 수학적으로 계산해낼 수 있습니다.

이 기법은 각 응답의 신뢰도를 희생하는 대신, 응답자에게 그럴듯한 부인 가능성(Plausible Deniability)을 제공하여 더 솔직한 답변을 유도하고, 전체 데이터셋의 통계적 정확성을 확보하는 데 목적이 있습니다. 지역형 차등 정보보호(Local DP)의 근간이 되는 중요한 기술입니다.

구현 모델에 따른 분류

중앙형 차등 정보보호 (Central DP):

  • 개념: 신뢰할 수 있는 중앙 데이터 관리자(서버)가 원본 데이터를 모두 수집합니다.
  • 처리: 관리자는 수집된 전체 데이터에 대해 쿼리를 실행하고, 그 결과값에 노이즈를 추가하여 외부에 공개합니다.
  • 장점: 데이터 전체의 통계적 특성을 파악한 후 최소한의 노이즈를 추가하므로 데이터의 정확성과 유용성이 높습니다.
  • 단점: 모든 원본 데이터가 중앙 서버에 집중되므로, 서버 관리자에 대한 높은 신뢰가 필요하며 서버가 해킹당할 경우 개인정보 유출 위험이 있습니다.

지역형 차등 정보보호 (Local DP):

  • 개념: 중앙 관리자를 신뢰하지 않는 모델입니다. 각 사용자의 기기(로컬)에서 데이터가 중앙 서버로 전송되기 전에 프라이버시 처리가 이루어집니다.
  • 처리: 각 사용자가 자신의 데이터에 직접 노이즈를 추가한 후, 처리된 데이터를 서버로 전송합니다. 서버는 노이즈가 포함된 데이터들을 수집하여 통계를 분석합니다.
  • 장점: 원본 데이터가 기기를 떠나지 않으므로 강력한 프라이버시를 보장합니다. 중앙 서버 관리자를 신뢰할 필요가 없습니다.
  • 단점: 각 데이터에 개별적으로 노이즈가 추가되므로 전체적으로 노이즈의 양이 많아져 데이터의 정확성과 유용성이 중앙형 모델에 비해 낮아질 수 있습니다.



차등 정보보호 - 7. 스피너 모델 적용과 통계 추정(스피너만 사용)

차등 정보보호 - 7. 스피너 모델 적용과 통계 추정(스피너만 사용) 다섯 명의 환자 질병 유무 데이터에 불확실성을 추가하여 공개하고 이로부터 원래의 질병 보유 환자 비율이 어떤 값일지 추정하는 과정을 보여 줍니다...