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]로의 모든 연속 함수에 대해 방금 설명한 절차를 그대로 사용할 수 있습니다. 본질적으로 목표 함수를 근사하기 위하여 단일층 신경망을 사용하였습니다. 그리고, 이 아이디어를 기반으로 보편성에 대한 일반 증명을 대신하고자 합니다.

여러 입력 변수

지금까지 논의한 결과를 여러 입력 변수가 있는 경우로 확장해 보겠습니다. 이는 복잡하게 들릴 수 있지만, 입력 변수가 두 개만 있는 경우부터 이해해보도록 하겠습니다.

자 먼저 뉴런에 두 개의 입력이 있을 때 어떤 일이 일어나는지부터 살펴보겠습니다.

여기서 입력값 xy와 각 입력값에 대한 가중치 w1w2, 그리고 뉴런의 편향 b가 있습니다. 가중치 w2를 0으로 설정한 다음, 첫 번째 가중치 w1과 편향 b를 조절하여 뉴런의 출력이 어떻게 영향을 받는지 살펴보겠습니다.
x=1y=1Output

보시다시피 w2=0이면 입력값 y는 뉴런의 출력에 아무런 영향을 미치지 않습니다. 마치 x만이 유일한 입력인 것과 같이 동작합니다.

이러한 점을 고려할 때, w2는 여전히 0인 상태에서 가중치 w1w1=100으로 증가시키면 어떤 일이 일어날까요? 만약 답이 바로 떠오르지 않는다면 잠시 시간을 갖고 무슨 일이 일어날지 생각해보시기 바랍니다.그런 다음 직접 시도해보고 여러분의 생각이 맞는지 확인해보시기 바랍니다. 다음 영상에서 그 결과를 보여드리도록 하겠습니다.

[비디오]

이전 논의에서와 마찬가지로 입력 가중치가 커질 수록 출력은 계단 모양에 가까운 함수가 됩니다. 차이점은 이제 계단 모양의 함수가 3차원이라는 것입니다. 또한 이전과 마찬가지로 편향을 수정하여 계단점의 위치를 이동시킬 수 있습니다. 계단점의 실제 위치는 sxb/w1입니다.

이제 위 내용을 계단의 위치를 매개변수로 사용하여 다시 수행해 보겠습니다.
x=1y=1Output

여기서 우리는 x 입력에 대한 가중치가 매우 큰 값이라고 가정합니다. 여기서는 w1=1000이라고 가정하겠습니다. 그리고 가중치 w2=0입니다. 뉴런 위의 숫자는 계단점을 의미하고, 숫자 위의 작은 x는 계단의 방향이 x축과 같음을 의미합니다. 물론 y 입력에 대한 가중치를 매우 크게 (예를 들어 w2=1000 설정하고 x에 대한 가중치를 0으로, 즉 w1=0으로 만들면 y 방향으로 향하는 계단 함수도 얻을 수 있습니다.)
x=1y=1Output

뉴런 위의 숫자는 이전과 마찬가지로 계단점이며, 여기서도 마찬가지로 숫자 위의 작은 y는 계단이 y축 방향임을 의미합니다. xy 입력에 대한 가중치를 명시적으로 표시할 수도 있었지만, 단순화를 위하여 표기하지 않았습니다. 하지만, y를 작게 나마 표기한 것은 y 가중치가 크고 x 가중치가 0이라는 점을 암시합니다.

방금 3차원 봉우리 함수를 나타내기 위해 계단 함수들을 사용할 수 있습니다. 이를 위해 각각 x 방향으로 계단함수를 계산하는 두 개의 뉴런을 사용합니다. 그런 다음 이러한 계단 함수들을 각각 가중치 hh로 결합합니다. 여기서 h는 봉우리의 높이를 나타냅니다. 다음 그림을 참조하세요.
x=1y=1Weighted output from hidden layer

높이 h의 값을 변경해보시기 바랍니다. 신경망의 가중치와 어떤 관련이 있는지 살펴보시고, 오른쪽 봉우리 함수의 높이가 어떻게 변하는지 확인해보시기 바랍니다.

또한 위쪽 은닉 뉴런과 관련된 계단점 0.30을 변경해보세요. 봉우리 모양이 어떻게 변하는지 확인해보시기 바랍니다. 아래쪽 은닉 뉴런과 관련된 계단점 0.70보다 커지거나 작아지면 어떻게 되나요?

우리가 x 방향으로 봉우리 함수를 만드는 방법에 대해서 다루었습니다. 물론 y 방향으로 두 개의 계단 함수를 사용하여 y 방향으로도 봉우리 함수를 쉽게 만들 수 있습니다. y 입력에 대한 가중치를 크게 만들고 x 입력에 대한 가중치를 0으로 만들면 됩니다. 그 결과는 아래와 같습니다.
x=1y=1Weighted output from hidden layer

이전 신경망과 거의 같습니다. 명시적으로 변경된 것은 이제 은닉 뉴런에 작은 y 표시가 있다는 것 뿐입니다. 이는 x 계단 함수가 아닌 y 계단 함수를 생성하고 있으므로 y 입력에 대한 가중치가 매우 크고 x 입력에 대한 가중치는 0이라는 것을 뜻합니다. 이전과 마찬가지로 복잡함을 피하기 위하여 다른 입력에 대한 가중치는 생략했습니다.

이제 x 방향의 봉우리 함수와 y 방향의 봉우리 함수, 둘 다 높이가 h인 두 함수를 합쳤을 때 어떤 일이 일어나는지를 생각해 보겠습니다.
x=1y=1Weighted output from hidden layer

다이어 그램을 단순화하기 위해 가중치가 0인 연결은 생략했습니다. 우선 은닉 뉴런에 작은 xy 표시를 남겨두어 봉우리 함수가 어떤 방향으로 계산되고 있는지를 나타내었습니다. 나중에는 입력변수를 가지고 이를 알 수 있으므로 이도 생략할 것입니다.

매개변수 h를 변경해 보시기 바랍니다. 보시다시피, 이는 출력 가중치를 변경시키고 xy 봉우리 함수의 높이도 변경시킵니다.

이것은 마치 탑 함수와 비슷해 보입니다.

x=1y=1Tower function


만약 우리가 이러한 탑 함수를 만들 수 있다면, 다양한 높이와 다양한 위치에 있는 많은 탑들을 합쳐서 임의의 함수를 근사하는데 사용할 수 있습니다.

x=1y=1Many towers

물론 아직 우리는 타워 함수를 어떻게 만드는지 다루지 않았습니다. 우리가 만든 것은 높이 h인 고원 중앙에 위치한 높이 2h인 타워입니다.

이제 부터 타워 함수를 만들어 보겠습니다. 앞서 언급한 뉴런이 일종의 if-then-else 문을 구현하는데 사용될 수 있다는 점을 상기하시기 바랍니다.

    if input >= threshold: 
        output 1
    else:
        output 0

그것은 단일 입력을 가진 뉴런에 대한 것입니다. 우리가 원하는 것은 숨겨진 뉴런의 결합된 출력에 유사한 아이디어를 적용하는 것입니다.

    if combined output from hidden neurons >= threshold:
        output 1
    else:
        output 0
임계값을 적절하게 선택한다면, 예를 들어 고원의 높이와 중앙 타워의 높이 사이에 있는 값인 3h/2로 설정하면 고원을 0으로 낮추고 타워만 남길 수 있습니다.

이것을 어떻게 해야할지 이해가 되시나요? 다음 신경망을 가지고 실험해보면서 이해해보시기 바랍니다. 이제 숨겨진 계층의 가중치가 적용된 출력이 아니라 전체 신경망의 출력을 표시하고 있다는 점에 유의하시기 바랍니다. 이는 숨겨진 계층의 가중치가 적용된 출력에 편향항을 추가하고 시가마 함수를 적용한다는 의미입니다. 타워를 생성하는 hb 값을 찾을 수 있나요? 이것은 약간 까다롭기 때문에 잠시 생각해보고 계속 막힌다면 다음 두 가지 힌트를 참고하시기 바랍니다. (1) 출력 뉴런이 적절한 if-then-else 동작을 하게 하려면 입력 가중치 (모두 h 또는 h)가 커야 합니다. (2) b 값은 if-then-else 문의 임계값의 크기를 결정합니다.

x=1y=1Output


초기 매개변수를 사용하면 출력은 이전 다이어그램의 평탄화된 버전처럼 보이게 하며, 타워와 고원을 가지고 있습니다. 우리가 원하는 바를 얻으려면 매개변수 h를 증가시켜 큰 값이 되도록 합니다. 이렇게 하면 if-then-else 임계값이 동작하는지가 확실하게 나타납니다. 둘째, 임계값을 올바르게 설정하기 위해 b3h/2로 설정합니다. 직접 설정해보고 작동을 확인해 보시기 바랍니다.

h=10으로 설정했을 때 아래와 같이 나타납니다.

[비디오]

비교적 작은 값인 h에서도 꽤 괜찮은 타워 함수를 얻었습니다. 물론 h를 더 늘리고 편향을 b=3h/2로 유지하면 원하는 만큼 정확하게 만들 수 있습니다.

두 개의 서로 다른 타워 함수를 계산하기 위해 이러한 신경망 두개를 붙여 보도록 하겠습니다. 두 하위 신경망의 역할을 명확하게 하기 위하여 아래에 별도의 상자에 넣어 표시했습니다. 각 상자는 위에 설명된 기술을 사용하여 타워 함수를 계산합니다. 오른쪽 그래프는 두 번째 숨겨진 계층의 가중치가 적용된 출력을 보여줍니다. 즉, 타워 함수의 가중치 조합입니다.

x=1y=1Weighted output

특히 마지막 계층의 가중치를 수정하여 출력 타워의 높이를 변경할 수 있습니다.

같은 아이디어를 사용하여 원하는 만큼 많은 타워를 만들 수도 있습니다. 원하는 만큼 얇게 그리고 원하는 높이로도 만들 수도 있습니다. 결과적으로 두 번째 은닉층의 가중치가 적용된 출력이 두 변수의 원하는 함수를 근사하도록 만들 수 있습니다.

x=1y=1Many towers

특히 두 번째 은닉층의 가중치가 적용된 출력이 σ1f에 근사하도록 만들면, 우리 신경망의 출력이 원하는 함수 f를 잘 근사하도록 보장할 수 있습니다.

세 개 이상의 변수를 갖는 함수는 어떨까요?

세 개의 변수 x1,x2,x3에 대하여 생각해봅시다. 다음 신경망은 4차원에서 타워 함수를 계산하는데 사용될 수 있습니다.

여기서 x1,x2,x3은 신경망의 입력을 나타냅니다. s1,t1등은 뉴런의 계단입니다. 즉, 첫 번째 계층의 모든 가중치는 크고, 편향은 계단점 s1,t1,s2,...이 생성되도록 설정됩니다. 두 번째 계층의 가중치는 +h,h,+h,h와 같이 번갈아 나타나며, 여기서 h는 매우 큰 수로 설정됩니다. 그리고 출력 편향은 5h/2가 됩니다.

이 신경망은 세가지 조건이 충족되면 11을 출력하는 함수가 됩니다. x1s1t1사이에 있고, x2s2t2사이에 있으며, x3s3t3사이에 있는 경우입니다. 그 외의 모든 곳에서 신경망은 0이 됩니다. 즉, 입력 공간의 작은 영역에서 1이고 그 외의 모든 곳에서 0인 일종의 타워 형태가 됩니다.

이러한 신경망을 여러 개 연결함으로써 원하는 만큼 많은 타워를 얻을 수 있으며, 따라서 세 변수의 임의의 함수를 근사할 수 있습니다. 정확히 동일한 아이디어를 m차원에도 적용할 수 있습니다. 유일하게 바뀌는 것은 고원의 높이를 맞추기 위해 출력 편향을 (m+1/2)h로 설정하는 것입니다.

지금까지 우리는 신경망을 사용하여 여러 변수를 갖는 실수 함수를 근사하는 방법에 대하여 논의했습니다. 벡터 값 함수 f(x1,,xm)Rn는 어떨까요? 물론 이런 함수는 단순하게 n개의 개별적인 실수 값 함수 f1(x1,,xm),f2(x1,,xm)로 간주할 수 있습니다. 따라서 우리는 f1을 근사하는 신경망 f2를 위한 또 다른 신경망 등을 만들 수 있습니다. 그런 다음 단순히 모든 신경망을 함께 연결하여 벡터 값 함수를 근사할 수 있습니다.

시그모이드 뉴런의 확장

지금까지 우리는 시그모이드 뉴런으로 구성된 신경망이 어떤 함수든 근사할 수 있음을 살펴보았습니다. 시그모이드 뉴런에서 입력 x1,x2,...은 출력 σ(jwjxj+b)를 생성합니다. (wj는 가중치, b는 편향, σ는 시그모이드 함수입니다.)

다른 종류의 뉴런, 즉 다른 활성화 함수 s(z)를 사용하는 뉴런은 어떨지 생각해보도록 합시다.

우리 뉴런이 입력 x1,x2,..., 가중치 w1,w2,... 및 편향 b를 가지면 s(jwjxj+b)을 출력한다고 가정합시다.

시그모이드 함수를 사용했던 것처럼 이 활성화 함수를 사용하여 계단 함수를 얻을 수 있습니다. 다음에서 가중치를 w=100과 같이 늘려보시기 바랍니다.

시그모이드 함수와 마찬가지로, 가중치를 늘리면 활성화 함수를 수축시켜 결국엔 계단 함수와 같이 됩니다. 편향을 변경해보면 계단의 위치를 우리가 원하는 곳으로 설정할 수 있다는 것 또한 알 수 있습니다. 따라서 이전에 논의했던 것과 같은 기법을 사용하여 원하는 함수를 근사할 수 있습니다.

이와 같이 작동하려면 활성화 함수 s(z)는 어떤 조건을 만족해야할까요? z and z 일때도 s(z)가 잘 정의되어 있어야 합니다. 이 두 극한값은 우리의 계단 함수가 취하는 두 값입니다. 그리고 이 극한값이 서로 달라야 합니다. 그렇지 않으면 계단이 아니라 평평한 그래프가 되어버립니다. 하지만 활성화 함수 s(z)가 이러한 조건을 만족한다면, 이를 기반으로 한 뉴런은 보편성 정리를 일반적으로 충족시킵니다.

계단 함수의 개선

지금까지 우리는 뉴런이 계단 함수를 정확하게 생성할 수 있다고 가정해 왔습니다. 이것은 꽤 좋은 근사이긴 하지만 단지 근사일 뿐입니다. 실제로 다음 그래프에서 설명하고 있는 것처럼 계단 함수와 매우 다르게 동작하는 좁은 오차 구간이 존재합니다.

이러한 오차 구간에서는 보편성 정의에 대하여 우리가 지금까지 논의한 것이 성립하지 않습니다.

물론, 이는 심각한 오류는 아닙니다. 뉴런에서 입력되는 가중치를 충분히 크게 만들면 이러한 오차 구간을 원하는 만큼 작게 만들 수 있습니다. 확실히 위에서 보여준 것보다 훨씬 좁게 실제로 우리 눈이 식별하기 어려울 정도로 좁게 만들 수 있습니다. 따라서 이 문제에 대하여 너무 걱정하지 않아도 됩니다.

그럼에도 불구하고 이 문제를 해결한 방법이 있다면 좋을 것입니다.

사실, 이 문제는 쉽게 해결할 수 있습니다. 단일 입력 및 단일 출력을 사용하여 함수를 계산하는 신경망에 대한 해결 방법을 살펴봅시다. 더 많은 입력 및 출력이 있는 경우에도 동일한 아이디어가 문제를 해결하는 데 효과적입니다.

우리 신경망이 어떤 함수 f를 계산하기를 원한다고 가정해봅시다. 이전과 마찬가지로 은닉층 뉴런의 가중치가 적용된 출력이 σ1f(x)가 되도록 신경망을 설계하려고 노력함으로써 이를 달성할 수 있습니다.

이전에 설명한 기술을 사용하여 이를 수행하려면, 은닉층 뉴런을 사용하여 일련의 계단 함수를 만들어야 합니다.

위 그래프는 오차 구간의 크기를 과장하여 잘 보이도록 만들었습니다. 이러한 모든 계단 함수를 합하면 오차 구간들을 제외하고는 σ1f(x)에 대한 합리적인 근사치를 얻게 된다는 것이 매우 분명해야 합니다.

방금 설명한 근사치를 사용하는 대신, 은닉층 뉴런 집합을 사용하여 원래 목표 함수의 절반, 즉 σ1f(x)/2에 대한 근사치를 계산한다고 가정해봅시다. 물론 이것은 바로 위 그래프를 축소한 것처럼 보입니다.

그리고 또 다른 은닉층 뉴런 집합을 사용하여 σ1f(x)/2에 대한 근사치를 계산하되 계단 부분의 밑면을 계단 폭의 절반 만큼 이동시킨다고 가정해 봅시다.

이제 σ1f(x)/2에 대한 두 가지 다른 근사치가 있습니다. 이 두 근사치를 합하면 σ1f(x)에 대한 전체적인 근사치를 얻을 수 있습니다. 이 전체적인 근사치에도 작은 구간에서 오차가 있을 수 있습니다. 하지만 이전보다는 훨씬 오차가 줄어들 것입니다. 그 이유는 한 근사치의 오차 구간에 있는 점이 다른 근사치의 오차 구간에는 없을 것이기 때문입니다. 따라서 해당 구간에서 근사치는 대략 22배 더 나아질 것입니다.

함수 σ1f(x)/M에 대하여 M개의 겹치는 근사치를 합하면 훨씬 더 낫게 만들 수 있습니다. 오차 구간이 충분히 좁다면 한 점은 오직 하나의 오차 구간에만 속할 것입니다. 그리고 충분히 많은 수 M의 겹치는 근사치를 적용하면 훨씬 더 정확한 전체적인 근사치를 얻을 수 있을 것입니다.

결론

우리가 논의 한 보편성에 대한 설명은 신경망을 사용하여 계산하는 실질적인 방법은 아닙니다. 이점에서 NAND 게이트 드으이 보편성 증명과 매우 유사합니다. 이러한 이유로 이번 장은 주로 구성을 명확히하고 이해하기 쉽게 설명하는데 중점을 두었고, 구성의 세부 사항을 최적화하는데 중점을 두지 않았습니다.

이번 장에서 논의한 결과가 신경망 구축에 직접적으로 유용하지는 않지만 특정 함수가 신경망을 사용하여 계산 가능한지 여부에 대한 질문을 더 이상 고민할 필요가 없다는 점에서 중요성을 찾을 수 있습니다. 그 질문에 대한 답은 항상 "예"일 것입니다. 따라서 올바른 질문은 특정 함수가 계산 가능한지 여부가 아니라 그 함수를 계산하는 좋은 방법이 무엇인지가 될 것입니다.

이 장에서 논의한 보편성 구성은 임의의 함수를 계산하는 데 단 두 개의 은닉층만 사용했습니다. 더욱이 우리가 논의한 것처럼 단일 은닉층만으로도 동일한 결과를 얻을 수 있습니다. 이를 감안할 때 많은 은늑층을 가진 심층 신경망에 왜 관심을 가져야하는지 궁금할 수 있습니다. 이러한 신경망을 단일 은닉층을 가진 얕은 신경망으로 간단히 대체할 수 있지 않을까요?

이는 원칙적으로 가능하지만 심층 신경망을 사용하는 데에는 실질적인 좋은 이유가 있습니다. 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~)