강의/machine learning & deep learning

[DL] Deep Neural Networks

하기싫지만어떡해해야지 2025. 11. 2. 18:45

본 게시글은

서울대학교 데이터사이언스대학원 오민환 교수님의

데이터사이언스를 위한 머신러닝 및 딥러닝1 수업을

학습을 목적으로 재구성하였습니다


 

 

이번 시간은 딥러닝의 두 번째 시간인

Deep Neural Network에 대해 배웠다

지난 시간에 배운 Shallow Network는 hidden layer가 1개인 것이었다면

Deep Neural Network는 hidden layer가 2개 이상인 것을 말한다

 

 

 

 

오늘 내용의 목차는 위와 같다

 

우선 2개의 network를 합성하는 방법을 알아보고

이게 어떻게 deep neural network와 연결이 되는지 살펴보자

 

 

 

 

 

이렇게 2개의 shallow network가 있다고 가정해보자

input이 1개이고 hidden unit이 3개이다

 

첫 번째 input이 x이고 첫번째 shallow network에서 나온 값이 y라고 한다면

두번째 network에서의 input이 y이고 두번째 shallow network의 output은 y'이다

 

 

 

 

 

 

그럼 위의 형태가 무엇인가?

바로 합성함수의 형태이다

그래서 이 2개를 합성함수의 형태로 표현해보자

 

x를 넣어서 y가 나오고 이 y를 넣어서 다시 y'이 나오는

2개를 compose시킨 형태이다

 

 

 

 

 

 

그럼 우리가 저번시간에 이 친구들이 다 piecewise linear function이 된다고 했다

그래서 우리가 방금 본 2개의 네트워크는

각각 b와 c의 piecewise linear function형태로 나오게 된다

그래서 이 2개를 compose한 형태가 바로 d가 나오게 된다

 

맨처음 b함수에서 input x를 집어넣어서 나오는 y값을

다시 c함수의 input으로 집어넣으면 최종 y'값이 나오게 된다

이게 mapping된 최종 d 함수를 보면 x가 증가하면서 y가 내려오는 구간도 있고 올라가는 구간도 있고 그렇다

 

 

 

 

 

 

input x에서 최종인 Input y'로 가는 mapping은

우리가 어릴적 많이 했던 종이접기와 주로 비슷하다

 

우리가 종이를 접은 다음에 가위로 한 번 자르면

펼쳤을 때 여러 개의 꺾인선처럼 나오는 것을 기억할 것인데 그거랑 비슷하다

아무튼 folding하는 효과가 난다는 것이다

 

그런데 여기서 중요한 것 중 한개는

piecewise 구간에서 linear piece들이 늘어난다는 점이다

 

왼쪽 a에서는 3개의 구간인데 오른쪽 b에서는 3개의 구간이고

가장 최종 c 구간에서는 3*3인 9개의 구간이 나오게 된다

 

 

 

 

 

 

 

위가 2개의 shallow network를 가지고 compose 했을 떄의 결과이고

아래는 1개의 hidden layer에 hidden unit을 6개만 한 결과이다

 

그럼 위의 compose에서 발생하는 piecewise region은 총 9개가 된다

그럼 밑에건 shallow network인데 hidden unit이 6개인 network이기 때문에

최대 region의 개수는 7개가 된다 (joint가 6개가 나오기 떄문에)

 

그럼 위와 아래 파라미터의 개수는 1개 차이밖에 안나는데

만들 수 있는 region의 개수는 확연히 차이가 나게된다

위에껀 또 최소 9개의 region이 나오는 것이고

밑에는 최대 7개의 region이 나오게 되는 것이다

이게 레이어가 쌓이면 쌓일수록 region 개수의 차이는 증가하게 된다

 

한 마디로, 더 적은 숫자의 파라미터로도 표현할 수 있는게 더 많아지는 것이고

이는 표현력이 더 크다는 것을 의미한다

 

 

 

 

 

 

그렇다면 지금까지 본건 input도 1개, output도 1개인거였는데

input이 2차원인 경우를 한 번 살펴보자

 

우리가 앞에서 input이 2차원인 shallow network를 해봤는데

그거랑 비슷하다

input을 2개로 해서 첫 번째 hidden layer에 넣어주고

그 output 값을 두번째 hidden layer에 넣어주면된다

 

 

 

 

 

 

 

그런데 우리가 지금까지 살펴본 것은

shallow network를 그냥 compose만 한 것이다

 

그런데 deep network의 책이나 교재

혹은 수업에서 한 번만 접해봤더라도 그 구조를 살짝 봤을 텐데

우리가 보통 통상적으로 공부하는 deep network에서

이를 shallow network의 compose로 표현하나?

전혀 그렇지가 않다

 

우리가 아까 이 2개의 shallow network를 compose한 건

최초의 input x를 넣어서 첫 번째 hidden layer에서의 output이 y가 나오고

그 y를 두 번째 hidden layer에서의 input으로 넣어서 최종 결과 y'이 나오게 된다

 

그럼 자강 아래는 이걸 그냥 우리가 중고등학교 때 배운

합성함수 그대로 식을 쓴 것이다

2번째 network의 y를 1번째 네트워크의 input에 그대로 대입해서 쓰면

가장 아래처럼 나온다고 한다

이게 굉장히 복잡하다는 것을 알 수 있다

 

 

 

 

 

 

그럼 이렇게 복잡한 것들을 새로운 변수로 치환해서 표현해보자

 

위의 식을 hidden unit들을 기준으로 덩어리로 구분하면

 

이렇게 묶을 수 있다

그럼 앞의 덩어리들을 psy 변수로 치환해서 새로 정의를 해보자

 

그럼 아래와 같이 

 

이렇게 표현할 수 있게 된다

이렇게 되면 h1'이라는 애를 h1, h2, h3으로 표현할 수 있게 된다

그래서 이 파라미터들은 psy가 되는 것이고

activation을 적용해주면 h1'이 나오게 된다

 

h2', h3'도 마찬가지로 표현할 수 있다

 

 

 

 

 

 

 

그럼 우리가 위에서 정리했던 식을 이렇게 표현할 수 있게 된다

우리가 아까는 합성함수로 표현했지만 합성함수로 표현할 필요가 없이

이렇게 simple하게 한 번의 connection으로 나타낼 수 있는 것이다

 

하나의 hidden layer에서 다음 hidden layer로 갈 수가 있고

이렇게 2개 이상의 hidden layer가 존재하는 것을 deep neural network라고 한다

이게 어려워 보이지만 사실 우리가 조금전에 봤던 합성함수랑 똑같은거다

아까처럼 합성함수로도 나타낼 수 있는데 그냥 조금 복잡하고 notation이 많을 뿐이다

하지만 우리가 이렇게 directly하게 하나의 hidden layer에서 다른 hidden layer로 가도록

나타낼 수가 있다는 것이다

 

그래서 결국이 deep neural network는 그냥 shallow network를 합성한 것 뿐

별거 아니라고 한다 (교수님의 말씀임)

 

그렇다면 3개의 hidden layer가 있는 deep neural network는?

3개의 shallow network를 합성한 것과 같다

deep neural network는 결국 shallow network를 합성한 것이라서

아까 우리가 봤던 folding과 같은 그런 직관들이 다 통하게 된다

 

 

 

 

 

위 y'식에 각 h1', h2', h3'을 대입해주면 아래와 같이

아주아주 복잡하게 식이 나온다고 한다

아무튼 이렇게 복잡하지만 식을 쓸 수는 있다고 한다

 

 

 

 

 

 

그렇다면 이제 output이 여러개인것을 살펴보자

지난 시간의 shallow network에서 output이 여러개인 것을 이해했다면

이것도 이해하기 매우 쉬울 것이라고 한다

 

똑같은 piecewise 함수가 있었는데 각각 꺾인 구간은 같고

그 구간에서의 output이 다른 그런 형태로 나오게 된다

 

 

 

 

 

 

 

그렇다면 네트워크가 어떻게 따로따로 output이 다른 애로 가는지 살펴보자

저 위의 ppt에서 동그라미 친 부분을 한 번 잘 살펴보자

 

두번째 레이어에서 hidden unit의 activation을 타기 전을

preactivation이라고 한다

두 번째 레이어에서의 preactivation을 한 번 잘 살펴보자

지금 저 화살표 부분이 preactivation이다

h1'에서의 Preactviation부분은 아래 그림에서 제일 첫번째 부분

h2'는 두번째 부분, h3'은 세번째 부분이 된다

 

그렇다면 이 전체를 한 번 살펴보자

저 그림에서 동그라미 친 부분ㄴ까지만 보면

이건 그냥 shallow network인데 output이 3개인것과 동일하다

 

output이 여러개라는건 우리가 뭐라고 했나?

꺾인점 위치는 같지만 output이 여러개인 것이다

 

 

 

 

 

그 꺾인점 위치는 같은데 서로 다른 3개의 output의 그래프는 위 a, b, c이다

세 그래프는 모두 꺾인점은 같지만 결과는 다르다

 

a는 첫 번째 레이어(h1)을 거치고 나서 첫 번째 hidden unit들을 weight sum을 한 것이다 (preactivation)

b는 h2의 Preactivation, c는 h3의 preactiviation이다

그렇다면 이 preactivation들이 activation을 통과하면 어떻게 되나?

 

 

 

 

 

 

위와 같은 결과가 나오게 된다

0 미만인건 다 날라가게 되는 것이다

이게 2번째 레이어에서의 hidden unit들을 통과한 값이 된다

 

 

 

 

 

 

이렇게 activation에 넣어준 값에 이제 상수배를 해주면 된다

d를 보면 상수가 음수배가 되기 때문에 뒤집어지고

뭐이렇게 아무튼 각각에 상수배를 해주면된다

 

이제 그 다음에 마지막으로 뭘해주면되나?

 

 

 

 

 

 

이 3개를 다 더해주면 됐었다

 

이 3개를 다 summation한 다음에 마지막 intercept만 더해주면 최종 output이 완성된다

이렇게 3개의 piecewise function을 더해주니 저렇게 나오게 된다

final output을 보면 꺾인 점이 처음에 비해서 굉장히 많아진 것을 확인할 수 있다

훨씬 더 complex한 함수가 되었다

 

그런데 이게 왜이렇게 되었을까?

 

우리가 첫 번째 layer를 타고 나온 각각의 output들은 3개가 있었다

걔네들은 분명히 joint의 위치가 같았다

그런데 이 final output의 Joint는 개수가 왜이렇게 늘어났을까?

이건 바로 activation 때문이다

두 번째 레이어에서 activation이 작용하니까 꺾인점들의 위치들이 추가로 늘어나면서 달라지게 된 것이다

 

그렇다면 여기서 piecewise region은 총 몇개가 되는가?

바로 12개가 된다

 

잘 생각해보면 deep neural network가 되면서 주어진 파라미터 숫자로도

더 많이 표현할 수 있다는 얘기가 된다

한 마디로 더욱 flexible한 함수를 만들 수 있다는 뜻이다

 

shallow network로도 flexible하게 만들 수 있지만

shallow로 동일하게 flexible한 형태를 만들려고 한 번 해보자

 

이렇게 위 처럼 12개의 piecewise region을 shallow network로 만들려면

hidden unit이 총 몇개가 필요한가?

11개가 필요해진다

 

그런데 우리가 2개의 layer를 가진 deep network로 하면

6개의 hidden unit으로 총 12개의 region을 만들게 된 것이다

shallow에서는 11개의 unit이 필요한데 deep에서는 6개만 있으면 되는 것이다

 

그래서 한 마디로 deep network가 무엇이 좋냐고 하면

적은 파라미터 숫자로 표현력을 더 키울 수 있다는 점이다

 

 

 

 

 

 

이제 deep neural network의 hyperparameter를 한 번 살펴보자

 

K는 layer의 깊이(hidden layer의 개수)이고

Dk는 1개의 hidden layer에 있는 hidden unit의 개수

즉, network의 넓이이다

 

이런 애들이 다 하이퍼파라미터가 되는 것이다

우리가 이런 것은 deep neural network를 훈련시키기 전에

결정을 하고 가야한다

 

참고로 각 레이어마다 unit의 개수가 반드시 같을 필요는 없다

첫 번째 레이어에서는 3개일수도, 두번째 레이어에서는 4개일 수도 있다

 

이런 하이퍼파라미터를 선택하는 것도 결국 cross validation으로 정한다고한다

 

 

 

 

 

 

그렇다면 이런 notation들을 어떻게 simplify하는지 살펴보자

각각의 hidden unit로 가는 mapping을 뭉쳐서 위와 같이 표현할 수 있다

각각을 하나의 벡터로 보면 위와 같이 계산 식을 표현할 수 있다

 

따라서 결론적으로 마지막은 

 

위와 같이 표현할 수 있다

 

 

 

 

 

 

하지만 아까 위처럼 바꾼것도 그냥 bold로 이렇게 표현할 수도 있다

두 번째도 마찬가지이다

 

 

 

 

 

 

하지만 위처럼 하면 일관성이 없으니까 이렇게 매 layer마다 기호를 통일시켜준다

 

input에서 매핑을 해주는 weight은 오메가로

intercept는 베타로 표기를 해준다

오메가를 통상적으로 weight matrix라고 하고 베타를 bias vector라고 한다

 

다른 교재에서는 이렇게 표현할 수도 있고 안할 수도 있다

W matrix와 B로 표현하는 경우도 있는데

그냥 notation만 달라진 것 뿐 다 똑같은 말이다

 

 

 

 

 

 

그렇다면 위 식을 이렇게 일반화를 시킬 수 있을 것이다

 

이렇게해서 k번을 쭈욱 반복한 다음에 k번째 hidden layer가 있는데

마지막에는 activation이 없다

 

따라서 마지막 layer에서 나오는 linear 함수에 넣은 결과로

최종 output을 내게 된다

 

이렇게 계속 보면 결국 계속해서 합성하는 합성함수라는 것을 알 수 있다

 

 

 

 

 

 

따라서 이게 우리가 통상적으로 많이 보던 익숙한 visualization이다

 

input이 3차원이면 이렇게 input layer로 해주고

첫번째 hidden layer에는 unit의 개수가 4개이다

 

그리고 우리가 이전 시간에 말했지만 사실 1도 숨어있다고도 말했다

또 앞에서 각각의 layer마다 hidden unit의 개수가 다를수도 있다고 말했다

깊이가 더 깊을수도, 넓이가 더 넓을 수도 있다

 

layer별 hidden unit의 개수에 사실 기준은 없다

그래서 우리가 딥러닝 모델의 대표적인 모델인 CNN 중에서도

이런저런 다른 종류의 모델들이 있는데

그것도 결국 사람들이 이정도 깊이와 이정도 넓이로 해보니까

결과가 잘나오더라!하는 것에서 시작하는 것이다

 

나중에 자연어 처리에서 나오겠지만

transformer도 결국 한개의 이런 아키텍처일 뿐이다

 

 

 

 

 

그렇다면 shallow와 deep network를 비교해보자

 

참고로 대부분의 SOTA를 차지하는 것은 다 deep network 모델이다

레이어의 숫자가 몇십개인 것을 넘어서 몇 천개가 되는 것도 있다

 

왜 deep network의 모델들이 대부분 SOTA를 찍을까?

 

 

 

 

deep network가 shallow network에 비해서 여러 함수들을 잘 근사할 수 있어서일까?

 

우리가 이전 시간에 theorem 한개를 배웠다

그게 뭐였나면 shallow network도 Hidden unit의 개수가 enough하다면

얼마든지 flexible하게 만들 수 있다는 것이었다

 

한 마디로 여러 함수들을 잘 근사할 수 있는 것은

deep network만의 특징이 아니고

shallow network에서부터 해당되는 내용이다

 

 

 

 

 

 

그렇다면 shallow network와 deep network의 가장 큰 차이점은 뭘까?

 

주어진 파라미터 숫자에서 파라미터 숫자가 같을 때

depth가 더 deep하다면(hidden layer가 더 많다면) 표현할 수 있는 region이 더 많다는 것이다

 

위 그림은 파라미터가 증가하는 것에 따라

piecewise region이 얼마나 증가하는지를 보여주는 그래프이다

모든 함수에서 파라미터가 증가하면

number of region은 당연히 증가하지 감소하지는 않는다

그런데 여기서 depth가 커지면 region이 증가하는 정도가 더 커진다는 것을 알 수 있다

 

이걸 y축을 기준으로 한 번 잘라서 살펴봐라

이게 무슨말이냐?

x축으로 만약 잘라서 본다고 하면

파라미터 500개 기준으로 표현할 수 있는 region이 몇개에요 하면

shallow는 회식이 되고 layer가 5개 있으면 젤 위의 파란색 그래프가 된다

 

하지만 이걸 y축을 기준으로 잘라서 살펴보면?

100개 정도의 region을 만들고 싶은데 몇 개의 파라미터가 필요한가?

100개 정도의 region을 내가 만들려고할 때 몇 개의 파라미터가 필요한가?

shallow network는 적어도 100개의 파라미터가 필요하게 된다

 

 

왼쪽은 Input dimension이 1일때이고 오른쪽은 10일 때이다

오른쪽에 input이 10차원일 때도 표현가능한 정도가 어느정도로 커지는지 한 번 보자

gap이 어마어마하다는 것을 알 수 있을 것이다

 

 

 

 

따라서 deep network의 가장 큰 장점은 똑같은 파라미터 숫자를 기준으로

region을 더 많이 만들 수 있다는 점이다

 

하지만 dependency가 존재하기는 한다

이게 합성함수이다보니 layer별로 독립적이지는 않다

우리가 앞에서 봤던 folding을 한 번 생각해보자

적당한 depth만 있을 경우에는 아까 보다시피 이전의 layer에 의존적이기 때문에

조금 제약은 있을 수가 있다

 

하지만 depth가 충분히 많으면 큰 이슈는 없다고 한다

 

 

 

 

 

우리가 deep neural network에서 여러 층으로 hidden unit을 쌓는 것을

shallow network에서 1개의 layer로 표현하려면

기하급수적으로 많은 hidden unit들이 필요하다

이것을 바로 depth efficiency라고 한다

 

deep network는 depth가 늘어나면서 region의 개수가 곱을 기준으로 되었는데

shallow는 sum을 기준으로 계산한다

이 차이가 나중에 가면 지수적으로 차이가 난다는 것이다

 

그렇지만 우리가 real world 함수에서 이러한 property를 갖는 것을 선호하냐?

굳이 그렇지는 않다고 한다

하지만 이러한 depth efficiency가 존재하는것은 사실이고

이미지, 자연어 등 여러 분야에서 이러한 구조가 잘 작동하는 것도 명백한 사실이다

 

 

 

 

 

network에서 input이 만약에 Image라고 해보자

이미지의 픽셀 사이즈가 1000*1000이면 픽셀 개수는 이미 백만개가 존재한다

 

우리가 fully connected layer로 첫 레이어부터 x를 1M개에 비례해서 파라미터가 존재해야할까?

반드시 그럴 필요가 없다는 것이다

 

특히 우리가 vision 문제를 살펴보면

locally하게 filter하는 개념을 자주 사용한다

 

convolution이라는 Local 개념을 사용해서 학습해야하는 파라미터의 숫자를

확 줄일 수 있다는 것이 key이다

더욱 자세한건 나중에 vision 내용에서 다뤄본다고 한다

 

사실 문제에 따라서 파라미터 숫자들을 더 줄일 수 있는 방법들이 존재한다

결론적으로 데이터 인풋에 비례해서 파라미터 사이즈가 커질 필요는 없다는 것이다

 

 

 

 

 

 

그렇다면 deep network가 항상 유리할까?

꼭 그렇지도 않다

 

이 deep network는 깊이가 깊어지면 깊어질수록

훈련하는데에 있어서 상당히 까다롭다

 

deep network의 레이어가 20개 미만이면 큰 문제가 없는데

이 친구가 점점 깊어지면 깊어질수록

구조적으로 trick을 안쓰고 하다보면 얘네들의 gradient가 계속해서 곱해진다

우리가 1.1을 계속해서 제곱한다고 생각해보자

처음에는 별거 아닌게 되겠지만 이걸 100번 수행하면 엄청나게 큰 수가 된다

0.99도 계속해서 제곱한다고 생각해보자

나중에 가면 엄청 작은 수가 된다

그래서 이렇게 gradient를 바탕으로 update를 해주는데

이 gradient가 없어지거나 explode하면 둘 다 문제가 생기게 된다

deep neural network에서는 train시에 이러한 문제들이 생겨서 매우 까다롭다

 

generalization은 deep network에서는 매우 잘되는 경향을 보인다고 한다

 

 

 

 

 

 

위 예시는 MNIST-1D라는 숫자 0부터 9까지 digit 이미지가 있는 데이터이고

이 친구들을 fully connected layer를 이용해서

CNN을 쓰지않고 굉장히 flat하게 펼친 다음에 feature 벡터로 해서 학습한 것이다

이렇게 나이브하게 해도 충분하 힉습이 가능하다고 한다

다른 모멘텀이나 Learning rate를 잡고 하면 가능하다고 한다

 

위 그래프를 살펴보면 히든레이어가 증가할 수록 Train error가 점점 감소하는 것을 볼 수 있다

특히 hidden layer가 많을 수록 train error가 증가하는 속도도 훨씬 빠른 것을 볼 수 있다

 

더 재밌는건 이게 train error라고 했는데 train error에서만 이렇지 않다는 것이다

generalization error에서의 성능도 좋다

즉, test나 validation에서의 성능도 좋아지는 경향이 있다는 것이다

 

 

 

 

사실 deep network가 왜 이런 현상을 보일까에 대해서는

굉장히 많은 연구들이 진행되고 있는데

대부분은 이를 그냥 자연현상으로 받아들인다고 한다

굉장히 많은 theory가 있지만 여기서는 따로 설명하지 않는다고 한다

 

아무튼 shallow와 deep 모두 flexible한 함수이다

걔네들이 같이 하나의 family of function을 형성해서

얘네들이 굉장히 flexible한 함수가 되는데 

이 친구들을 우리가 임의의 input dimension에서 임의의 output dimension으로 매핑할수도있고

우리가 원하는 임의의 depth나 임의의 hidden unit을 여러 개로 만들 수도 있는데

거기에 따라서 성능은 당연히 달라지게 된다

아무튼 이러한 네트워크를 여러 가지 형태로 만들 수 있다는 것이다

 

잘 생각해보면 linear function에서는 이런게 없다

input dimension이 정해지면 파라미터 숫자는 정해지게 된다

(plain linear를 기준으로 한다면)

 

주어진 input에 대해서 우리가 머신러닝에서 배운 linear와 logisitic regression은

내가 어느 부분을 늘릴지 또는 줄일지를 선택할 수 없었는데

neural network는 이걸 선택할 수가 있고

이거에 따라서 test 성능이 차이가 나게된다

 

우리가 지금까지 deep neural network의 내용만 살펴보았고

이걸 어떻게 학습하는지에 대해서는 배우지 않았다

이런 구조를 이용해서 어떻게 loss를 설정하고

어떻게 그 loss의 minima를 찾는지는 다음 시간에 배워본다고 한다