Processing math: 100%

마음을 다스리는 글

욕심을 비우면 마음보다 너른 것이 없고, 탐욕을 채우면 마음보다 좁은 곳이 없다.
염려를 놓으면 마음보다 편한 곳이 없고, 걱정을 붙들면 마음보다 불편한 곳이 없다.
-공지사항: 육아일기 등 가족이야기는 비공개 블로그로 이사했습니다.

2025년 6월 9일 월요일

Deep Learning - 제4장 신경망이 어떤 함수라도 계산할 수 있다는 시각적 증명

 Deep Learning을 공부하고자 하는 많은 입문자들을 위하여 내가 공부하면서 입문서로 가장 도움이 되었던 Michael Nielsen의 온라인 도서를 여기 장별로 정리하여 두고자 한다.

이 장에서 나오는 내용들은 그의 온라인 도서 4장에 대한 내용을 한국어로 얼기설기 번역한 것이다. 번역이 어색하지만, 개념을 이해하기에는 무리가 없다고 생각한다.


신경망에 대한 가장 놀라운 사실 중 하나는 그것들이 어떤 함수든지 계산할 수 있다는 것입니다. 다시 말해, 아래와 같은 복잡하고 구불구불한 함수 f(x)가 있다고 가정해 봅시다.


어떤 함수이든지 간에, 가능한 모든 입력 x에 대해 그 함수값 f(x) (또는 그에 매우 근사한 값)가 신경망에서 출력되도록 하는 신경망이 반드시 존재합니다. 예를 들면 다음과 같습니다.

이 결과는 함수가 f=f(x1,...,xm)처럼 많은 입력과 여러 출력을 가질 때도 마찬가지입니다. 예를 들어 여기 m=3개의 입력과 n=2개의 출력을 가진 함수를 계산하는 신경망이 있습니다.


이 결과는 신경망이 일종의 보편성을 가지고 있음을 알려줍니다. 우리가 어떤 함수를 계산하려고 하든, 그 작업을 수행할 수 있는 신경망이 존재한다는 것을 의미합니다. (보편성 정리)

더욱이 이 보편성 정리는 입력 뉴런과 출력 뉴런 사이에 단 하나의 중간층, 즉 단일 은닉층만 있는 신경망으로 제한하더라도 성립합니다. 따라서 매우 간단한 신경망 구조 조차도 엄청난 능력을 가진 샘입니다.

보편성 정리는 신경망을 사용하는 사람들에게는 잘 알려져 있습니다. 하지만 왜 그것이 사실인지는 널리 이해되고 있지 못하고 있습니다. 대부분의 설명은 상당히 기술적입니다. 예를 들어 이 결과를 증명한 원래 논문 중 하나는 하-바나흐 정리(Hahn-Banach theorem), 리즈 표현 정리(Riesz Representation theorem), 그리고 푸리에 해석(Fourier analysis)을 사용하여 증명했습니다. 수학자라면 이 증명들을 따라가는 것이 어렵지 않겠지만 대부분의 사랍들에게는 그렇지 않습니다. 보편성의 근본적인 이유는 간단하고 아릅답기 때문인데, 그렇지 못한 것은 안타까운 일입니다.

이 장에서는 보편성 정리에 대한 간단하고 주로 시각적인 설명을 해보고자 합니다. 우리는 기본적인 아이디어를 단계별로 살펴볼 것입니다. 신경망이 어떤 함수든지 계산할 수 있다는 것이 왜 사실인지 이해하길 바라겠습니다. 그리고, 이것의 제한사항에 대해서도 일부 살펴보도록 하겠습니다. 그리고 이것이 심층 신경망과 어떻게 관계되는지에 대해서도 다루도록 하겠습니다.

이 장의 내용을 따라가기 위해 이 전 장들을 읽을 필요는 없습니다. 이 장의 내용은 독립적으로 읽을 수 있도록 구성하였습니다. 신경망에 대한 기본적인 지식만 있다면 이 장의 내용을 읽는데 큰 무리는 없을 것입니다. 그렇다고 이전 장의 내용과 완전히 무관한 것은 아닙니다.

보편성 정리는 컴퓨터 과학에서는 흔한 개념이며 때로는 그것이 얼마나 놀라운 것인지 잊어버리기도 합니다. 하지만 이점을 다시 한번 상기할 필요가 있습니다. 임의의 함수를 계산하는 능력은 정말 놀랍습니다. 여러분이 상상할 수 있는 거의 모든 프로세스를 함수 계산으로 생각할 수 있습니다. 짧은 음악 샘플을 기반으로 음악 제목을 짓는 문제를 생각해 보세요. 이것도 함수 계산 문제입니다. 또는 중국어를 영어로 번역하는 문제도 마찬가지 입니다. 또는 mp4 영화 파일을 가져와 영화 줄거리와 연기 품질에 대한 짧은 글을 생성하는 문제도 일종의 함수 계산입니다. 보편성은 원직적으로 신경망이 이것들을 포함한 더 많은 거을 할 수 있다는 것을 의미합니다.

물론 중국어 텍스트를 영어로 번역할 수 있는 신경망이 존재한다는 것을 안다고 해서 그러한 신경망을 구성하거나 심지어 인식하는 좋은 기술을 보유하고 있다는 것을 뜻하지는 않습니다. 이러한 제한은 부울 회로와 같은 모델에 대한 전통적인 보편성 정리에도 적용됩니다. 그러나 이 책 앞부분에서 보았듯이 신경망은 함수를 학습하는 강력한 알고리즘을 가지고 있습니다. 학습 알고리즘과 보편성의 조합은 매력적인 조합입니다. 지금까지 이 책은 학습 알고리즘에 초점을 맞췄습니다. 이 장에서는 보편성과 그것이 의미하는 바에 초점을 맞출 것입니다.

두 가지 제한사항

보편성 정리가 왜 사실인지 설명하기 전에, "신경망은 어떤 함수든지 계산할 수 있다"는 비공식적 언급에 대해 두 가지 주의사항을 언급하고자 합니다.

첫째, 이것은 신경망이 어떤 함수든지 정확하게 계산하는 데 사용될 수 있다는 의미가 아닙니다. 우리가 원하는 만큼 좋은 근사값을 얻을 수 있다는 의미입니다. 은닉 뉴런의 수를 널리면 근사값을 개선할 수 있습니다. 앞서 세 개의 은닉 뉴런을 사용하여 어떤 함수 f(x)를 계산하는 신경망을 예로 든 적이 있습니다. 대부분의 함수에 대해서는 세 개의 은닉 뉴런만으로는 대략의 근사값만 산출하는 것이 가능합니다. 은닉 뉴런의 수를 늘리면 (예를 들어 다섯 개로) 일반적으로 더 나은 근사값을 얻을 수 있습니다.


그리고 은닉 뉴런의 수를 더 늘리면 훨씬 더 잘 할 수 있습니다. 이 더 정확하게 표현하자면, 우리가 원하는 정확도 ϵ>0 내에서 계산하고 싶은 함수 f(x)가 주어졌다고 가정해 봅시다. 이것은 충분한 은닉 뉴런을 사용하면 항상 모든 입력 x에 대하여 출력 g(x)|g(x)f(x)|<ϵ을 만족하는 신경망을 찾을 수 있다는 것입니다. 다시 말해, 근사값은 가능한 모든 입력에 대해 원하는 정확도 범위내에 있음을 만족한다는 뜻입니다.

두 번째 주의사항은 앞서 설명한 방식으로 근사할 수 있는 함수의 종류는 연속 함수라는 것입니다. 함수가 불연속적이라면, 즉 갑작스럽고 급격한 변화가 있다면 일반적으로 신경망을 사용하여 근사하는 것이 불가능합니다. 우리의 신경망은 입력의 연속 함수를 계산하기 때문에 이는 놀라운 일이 아닙니다. 그러나 우리가 실제로 계산하고자 하는 함수가 불연속적이라 할지라도 연속적인 근사값이 충분히 좋은 이유들이 있습니다. 그렇다면 우리는 신경망을 사용할 수 있습니다. 실제로 이것은 일반적으로 중요한 제한사항은 아닙니다.

요약하자면 보편성 정리의 더 정확한 표현은 단을 은닉층을 가진 신경망을 사용하여 어떤 연속 함수든지 원하는 정밀도로 근사할 수 있다는 것입니다. 이 장에서는 실제로  하나의 은닉층이 아닌 두 개의 은닉층을 가진 신경망으로 이를 증명할 것입니다. 그리고 이를 약간 수정하여 단일 은닉층에 대해서도 적용할 수 있음을 간략하게 설명할 것입니다.

하나의 입력과 하나의 출력을 갖는 함수의 보편성

보편성 정리가 왜 사실인지 이해하기 위해, 먼저 하나의 입력과 하나의 출력만을 갖는 함수를 근사하는 신경망을 구성하는 방법을 이해하는 것부터 시작해 보겠습니다.


이것이 보편성 문제의 핵심이라는 것이 밝혀졌습니다. 이 특수한 경우를 일단 이해하고 나면 많은 입력과 많은 출력을 갖는 함수로 확장하는 것은 실제로 꽤 쉽습니다.

함수 f를 계산하는 신경망을 구성하는 방법에 대한 통찰력을 얻기위해 먼저 두 개의 은닉뉴런을 가진 단일 은닉층과 하나의 출력 뉴런을 포함하는 출력층으로 구성된 신경망부터 시작해봅시다.



신경망의 구성요소가 어떻게 작동하는지 이해하기 위하여 맨 위에 있는 은닉 뉴런에 집중해보도록 하겠습니다. 아래 그림에서 가중치 w를 클릭하고 마우스를 오른쪽으로 약간 드래그하여 w를 증가시켜 보세요. 맨 위에 있는 은닉 뉴런이 계산하는 함수가 어떻게 변하는지 즉시 확인할 수 있습니다.

앞서 다루었듯이, 은닉층 뉴런에서 계산되는 것은 σ(wx+b)입니다. 여기서 σ(z)1/(1+ez)는 시그모이드 함수입니다. 지금까지 우리는 이 대수적 형태를 자주 사용했습니다. 그러나 보편성 증명을 위해 대수를 완전히 무시하고 대신 그래프에서 표시된 모양을 조작하고 관리함으로써 더 많은 통찰력을 얻을 것입니다. 이렇게 하면 무슨 일이 일어나고 있는지 더 잘 이해하고 있을 뿐만 아니라 시그모이드 함수가 아닌 다른 활성화 함수에도 적용되는 보편성 증명을 얻을 수 잇습니다.

이 증명을 시작하려면 위 다이어그램에서 편향 b를 클릭하고 오른쪽으로 드래그 하여 값을 늘리십시오. 편향이 증가함에 따라 그래프가 왼쪽으로 이동하지만 모양은 변하지 않는 것을 알 수 있습니다.

다음으로, 왼쪽으로 클릭하고 드래그하여 편향을 줄여보시기 바랍니다. 편향이 감소함에 따라 그래프가 오른쪽으로 이동하지만 다시 말하지만 모양은 변하지 않는 것을 알 수 있습니다.

다음으로 가중치를 약 2 또는 3으로 줄이십시오. 가중치를 줄이면 곡선이 넓어지는 것을 알 수 있습니다. 곡선을 화면 안에 유지하려면 편향도 변경해야 할 수도 있습니다.

마지막으로, 가중치를 w=100 이상으로 늘리십시오, 그렇게 하면 곡선이 점점 가팔라지다가 결국 계단 함수처럼 보이기 시작합니다. 편향을 조정하여 계단이 x=0.3 근처에서 위치하도록 해보십시오. 다음 짧은 비디오는 결과가 어떻게 보이는지 보여줍니다. 재상 버튼을 클릭하여 비디오를 재생하십시오.

[비디오]

가중치를 매우 크게 늘려서 출력이 매우 근사적으로 계단 함수가 되도록 하면 분석이 상당히 단순할 ㅅ 수 있습니다. 아래에는 가중치가 w=999일 때 맨 위 은닉층 뉴런의 출력을 그래프로 나타냈습니다. 아래 그래프는 가중치와 같은 매개변수를 변경할 수 없습니다.


계단 모양의 함수는 일반 시그모이드 함수보다 훨씬 다루기가 쉽습니다. 그 이유는 출력층에서는 모든 은닉 뉴런의 출력을 합산하기 때문입니다. 여러 계단 모양 함수의 합을 분석하는 것은 여러 시그모이드 모양 곡선을 합산했을 때 어떤 형상이되는지 추론하는 것보다 훨씬 쉽습니다. 따라서 은닉 뉴런이 계단 모양의 함수를 출력한다고 가정하면 일이 훨씬 쉬워집니다. 좀 더 구체적으로 말하자면, 가중치(w)를 매우 큰 값으로 고정하고 편향을 수정하여 함수의 계단이 나타나는 부분을 정합니다. 모든 출력을 계단 모양 함수로 취급하는 것은 근사치이지만 이는 매우 좋은 근사치라고 할 수 있습니다. 이를 당분간은 정확한 값이라고 간주하도록 하겠습니다. 이 근사치에서 벗어나는 차이에 대해서는 나중에 좀 더 논의하도록 하겠습니다.

이 계단 모양은 어떤 입력값 x에서 발생할까요? 다시 말해, 계단 모양의 위치는 가중치와 편향의 영향을 어떻게 받을까요?

이 질문에 답하려면 위 다이어그램에서 가중치와 편향을 변경해보세요. (약간의 스크롤을 해야할 수도 있습니다.) 계단 모양의 위치가 b에 비례하고 w에 반비례한다는 것을 확인할 수 있습니다. 계단 모양의 위치를 s라고 하면 s=b/w라는 것을 알 수 있습니다. 아래 다이어그램에서 가중치와 편향을 수정하여 이를 확인할 수 있습니다.


계단의 위치를 나타내는 단일 매개변수 s (s=b/w)를 사용하여 은닉 뉴런을 설명하면 훨씬 쉬워집니다. 새로운 매개변수(s)에 익숙해지도록 아래 다이어그램에서 s를 수정해보시기 바랍니다.

위에서 언급했듯이, 입력에 대한 가중치 w를 계단 모양의 함수가 매우 좋은 근사치가 되도록 충분히 큰 값으로 설정했습니다. 편향 b=ws로 선택하면, 새로운 매개변수가 도입된 지금의 뉴런을 기존 뉴런으로 쉽게 다시 변환할 수 있습니다.

지금까지 우리는 맨 위 은닉 뉴런의 출력에만 집중해왔습니다. 이제 전체 신경망의 동작을 살펴보겠습니다. 특히 은닉 뉴런이 단계점 s1 (가장 위에 위치한 뉴런)과 s2 (가장 아래에 위치한 뉴런)로 매개변수화된 계단 모양의 함수를 계산한다고 가정해보겠습니다. 그리고 이들은 각각 w1,w2를 가중치로 갖습니다. 다음 그림이 그 신경망입니다.

오른쪽에 그려진 것은 은닉층으로 부터 가중치가 적용된 출력, w1a1+w2a2입니다. 여기서 a1a2는 각각 가장 위에 위치한 뉴런과 가장 아래에 위치한 은닉 뉴런의 출력입니다. 이러한 출력은 a로 표시되는데 이는 이 출력들이 뉴런의 활성화라고 불리기 때문입니다.

위쪽 은닉 뉴런의 단계점 s1을 늘리거나 줄여보세요. 이것이 은닉층으로 부터 가중치가 적용된 출력을 어떻게 변화시키는지 확인해보시기 바랍니다. 특히 s1 값이 s2 값 보다 커지거나 작아질  때, 어떤 현상이 일어나는지 이해하는 것이 중요합니다. 이 경우 그래프의 모양이 바뀌는 것을 확인할 수 있습니다. 이는 위쪽 은닉 뉴런이 먼저 활성화되는 상황에서 아래쪽 은닉 뉴런이 먼저 활성화되는 상황으로 바뀌었기 때문입니다.

마찬가지로 아래쪽 은닉 뉴런의 단계점 s2를 조작해 보고, 이것이 은닉 뉴런의 결합된 출력에 어떠한 영향을 미치는지 확인해보세요.

각 출력 가중치를 늘리거나 줄여 보세요. 이것이 각 은닉 뉴런이 출력에 미치는 영향을 확인해보시기 바랍니다. 가중치 중 하나가 0이 되면 어떻게 되는지도 확인해보세요.

마지막으로 w1을 0.8로 w2를 -0.8로 설정해보세요. s1 지점에서 시작하여 s2 지점엣 끝나는 높이가 0.8인 봉우리 모양의 함수를 얻을 수 있습니다. 예를 들어 가중치가 적용된 출력은 다음과 같습니다.


물론, 봉우리의 높이를 얼마든지 재조정할 수 있습니다. 높이를 나타내기 위해 단일 매개변수 h를 사용하겠습니다. 또한, 혼동을 줄이기 위해서 "s1=...w1=...과 같은 표현은 없애도록 하겠습니다.

봉우리의 높이가 어떻게 변하는지 확인하기 위해 h 값을 크거나 작게 변경해 보세요. 높이를 음수로 변경하면 어떤 일이 발생하는지도 관찰해보시기 바랍니다. 그리고 단계점을 변경하여 봉우리의 모양이 어떻게 바뀌는지도 확인해보시기 바랍니다.

참고로 우리는 뉴런을 단순히 그래프와 관계된 것으로만 생각할 수 있는 것이 아니라 더 전통적인 프로그래밍 용어, 일종의 if-then-else 문과 같이 생각할 수도 있습니다. 예를 들어:

  if input >= step point:
        add 1 to the weighted output
    else:
        add 0 to the weighted output

대부분 그래픽적인 관점을 고수할 것입니다. 그러나 다음과 같이 때때로 관점을 바꿔서 if-then-else 문과 같은 측면에서 생각하는 것이 도움이 될 수도 있습니다.

두 쌍의 은닉 뉴런을 갖는 신경망을 함께 사용하여 다음과 같은 두 개의 봉우리를 만들 수도 있습니다.

여기서는 가중치를 생략하고 단순히 각 은닉 뉴런 상에 대한 h 값만 표시했습니다. 두 h 값을 모두 늘리거나 줄여서 그래프가 어떻게 변하는지 관찰해보시기 바랍니다. 단계점을 변경하여 봉우리를 이리저리 움직여 보시기 바랍니다.

더 일반적으로 이 아이디어를 사용하여 원하는 높이의 봉우리를 원하는 만큼 많이 얻을 수 있습니다. 특히 [0,1] 구간을 N개의 많은 하위 구간으로 나누고 N개의 은닉 뉴런 쌍을 사용하여 원하는 높이의 봉우리를 설정할 수 있습니다. N=5인 경우 어떻게 되는지 확인해보도로 하겠습니다. 뉴런이 꽤 많아서 약간 압축해서 보여드리도록 하겠습니다. 다이어그램이 조금 복잡하더라도 이러한 신경망이 어떻게 동작하는지 구체적으로 이해하기 위해서 어쩔 수 없는 점도 양해를 부탁드립니다.

보시다시피 다섯 쌍의 은닉 뉴런이 있습니다. 각 뉴런 쌍의 단계점은 0, 1/5이고, 그 다음은 1/5, 2/5이며, 4/5, 5/5까지 계속됩니다. 이 값들은 고정되어 있으며 그래프에서 다섯 개의 간격이 균등한 봉우리가 나타나도록 합니다.

각 뉴런 쌍은 각각 h 매개변수를 가집니다. 뉴런에서 나가는 출력 연결에는 표시되지 않았지만 가중치 hh도 있다는 것을 기억하시기 바랍니다. h 값 중 하나를 클릭하여 마우스를 좌우로 드래그하여 값을 변경해보세요. 이때 함수가 어떻게 변하는지 확인해보세요. 출력 가중치를 변경함으로써 실제로 함수를 디자인할 수 있습니다.

반대로 그래프를 클릭하고 위아래로 드래그하여 봉우리 함수의 높이를 변경해보세요. 높이를 변경하면 해당 h 값의 변화를 확인할 수 있습니다. 그리고 표시되지 않았지만 해당 출력 가중치인 +hh도 함께 변합니다.

다시 말해 오른쪽 그래프에 나타나는 함수를 직접 조작하고, 왼쪽의 h 값에 반영되는 것을 확인할 수 잇습니다. 재미있는 방법은 마우스 버튼을 누른 채 그래프의 한쪽 끝에서 다른 쪽 끝으로 마우스를 드래그 하는 것입니다. 이렇게 하면 함수를 직접 그리고 신경망의 매개변수가 적응하는 것을 볼 수 있습니다.

이제 도전을 해볼 시간입니다.

이 장의 시작부분에서 그렸던 함수를 떠올려 봅시다.

실제 이 그래프를 나타내는 함수는 다음과 같습니다.

f(x)=0.2+0.4x2+0.3xsin(15x)+0.05cos(50x),

위 그래프는 x를 0에서 1까지, y도 0에서 1까지의 값으로 하여 그린 것입니다.

이것은 분명히 간단한 함수가 아닙니다. 이제 신경망을 사용하여 이 함수를 계산하는 법에 대하여 이야기해보도록 하겠습니다.

위의 신경망에서 우리는 은닉 뉴런으로부터 가중치가 적용된 조합 jwaj를 분석해 왔습니다. 이로 부터 이들을 어떻게 제어하는지 많이 알게되었습니다. 그러나 앞서 엎급했듯이 이들은 신경망에서 출력되는 것이 아닙니다. 신경망에서 출력되는 것은 σ(jwjaj+b)이며 여기서 b는 출력 뉴런의 편향입니다. 신경망의 실제 출력을 제어할 수 있는 방법이 있을까요?

해결책은 은닉층의 가중치가 적용된 출력이 σ1f(x)로 주어지는 신경망을 설계하는 것입니다. (σ1σ 함수의 역함수입니다.) 즉, 은닉층의 가중치가 적용된 출력이 다음과 같아지도록 하면 됩니다.

만약 그렇게 된다면, 전체 신경망의 출력은 f(x)에 대한 좋은 근사치가 될 것입니다.

따라서 우리의 과제는 바로 위에 보이는 목표 함수를 근사하는 신경망을 설계하는 것입니다. 최대한 많이 배우기 위해 이 문제를 한번 더 다루어보도록 하겠습니다. 먼저 그래프를 클릭하여 다양한 봉우리 함수의 높이를 직접 조절해보시기 바랍니다. 목표 함수와 비슷한 결과를 얻는 것이 어렵지 않을 것입니다. 근사 정도는 목표 함수와 신경망이 실제로 계산하는 함수 간의 평균 편차로 측정할 수 있습니다. 우리의 과제는 평균 편차를 최대한 낮추는 것입니다. 평균 편차를 0.40 이하로 낮추면 성공한 것입니다.

일단 이를 완수했다면, "Reset"을 클릭하여 봉우리들을 무작위로 다시 초기화할 수 있습니다. 두 번째로 시도할 때는 그래프를 클릭하지 않고 대신 왼쪽의 h 값을 수정하여 다시 평균 편차를 0.40 이하로 낮추어 보시기 바랍니다.

이제 우리는 신경망이 함수 f(x)를 대략적으로 계산하는 데 필요한 모든 요소를 알게 되었습니다. 이는 대략적인 근사치일 뿐이지만 은닉 뉴런 쌍의 수를 늘려 더 많은 봉우리를 만들면 훨씬 더 목표 함수에 근사하도록 만들 수 있습니다.

특히 우리가 찾는 모든 데이터를 신경망에 사용되는 표준 매개변수들로 쉽게 변환할 수 있습니다. 이 방식을 간단하게 설명해보도록 하겠습니다.

첫번째 가중치 층은 모두 어떤 일정한 큰 값, 예를 들어 w=1,000을 갖습니다.

은닉 뉴런의 편향은 단순히 b=ws입니다. 예를 들어 두 번째 은닉 뉴런의 경우 s=0.2b=1,000×0.2=200이 됩니다.

최종 가중치 층은 h 값에 의해 결정됩니다. 예를 들어 위에서 선택한 첫번째 hh=1.2는 맨 위 두 은닉 뉴런의 출력 가중치가 각각 -1.2와 1.2임을 의미합니다. 출력 가중치의 전체 층에 대해 이와 같은 방식으로 적용됩니다.

마지막으로 출력 뉴런의 편향은 0입니다.

이것이 전부입니다. 이것이 원래 목표 함수를 꽤 잘 계산하는 신경망에 대한 설명입니다. 그리고 은닉 뉴런의 수를 늘려 목표 함수와의 근사 정도를 개선할 수 있습니다.

더욱이 원래 목표 함수 f(x)=0.2+0.4x2+0.3xsin(15x)+0.05cos(50x)에는 특별한 점이 없었습니다. [0,1]에서 [0,1]로의 모든 연속 함수에 대해 방금 설명한 절차를 그대로 사용할 수 있습니다. 본질적으로 목표 함수를 근사하기 위하여 단일층 신경망을 사용하였습니다. 그리고, 이 아이디어를 기반으로 보편성에 대한 일반 증명을 대신하고자 합니다.

Lee, Jeong Ho

Lee, Jeong Ho
Biography: Bachelor: Computer Science in Korea Univ. Master: Computer Science in KAIST Carrier: 1. Junior Researcher at Korea Telecom (2006 ~ 2010) 2. Researcher at Korea Institute of Nuclear Nonproliferation and Control (2010~)