Computer Science/기계학습 (Machine Learning)

[기계학습/ML] Deep Neural Networks

gxxgsta 2023. 12. 18. 10:07
반응형
SMALL

Deep Neural networks (DNN)

Neural Network에 Deep을 붙인 이유는 hidden layer의 수를 많이 두었기 때문이다. hidden layer를 많이 둬 더 많은 최적화 업데이트 대상이 되는 파라미터를 두고 더 복잡한 형태로 input과의 관계를 모델링하는 것이 목적이다.

 

따라서 깊은 네트워크의 구조를 가져서 DNN이라고 부르며 DNN 기반의 어떤 ML 작업을 Deep Learning라고 한다.

 

Architecture design

여러 개의 hidden layer를 두는 이유는 capacity를 높이기 위함이다.

즉, input과 output의 관계를 잘 나타낼 수 있다.

 

 

Universal approximation theorem은 하나의 hidden layer와 여러 개의 node를 두는 것이 충분히 nonlinear한 관계를 표현할 수 있다는 것이다.

 

이 방법으로도 input과 output 사이의 복잡한 관계를 표현할 수 있지만 효율적인 측면에서는 하나의 레이어에 여러 개의 노드를 두는 것보다 여러 개의 레이어를 두는 것이 더 효율성이 좋다.

 

위 그래프는 레이어의 수에 따라 테스트 데이터에 대한 정확도를 나타낸 그래프이다.

레이어의 개수가 올라감에 따라 정확도도 증가하고 있는 모습을 볼 수 있다.

 

Problems in great depth

레이어를 깊게 쌓으면서 여러 가지 문제가 발생했다.

해당 문제가 어떤 것인지 살펴보자.

 

1. Vanishing (or exploding) gradient

 

각 hidden layer가 존재하고 backpropagation을 통해 각 weight에 대하여 편미분을 계산하다 보면 chainrule에 의해 층을 많이 쌓았을 때 초기의 weight들은 gradient의 값이 거의 0이 되는 문제가 발생하였다.(소수점의 길이가 길어짐)

 

sigmoid를 사용할 때 기울기가 0에 가까운 부분이 두 부분이 존재하고, 기울기가 가장 큰 부분도 값이 1이 되지 않기 때문에 계속해서 곱하자 보면 소수의 크기가 커져 곱할수록 앞의 weight에 대해 제대로 학습이 되지 않는 문제가 발생하였다.

 

따라서 이 문제를 해결하기 위해 활성함수로 sigmoid 대신 양수에서는 기울기가 1, 음수에서는 기울기가 0이 되는 ReLU를 사용하기 시작했다.

 

2. Overfitting 문제

여러 층을 쌓고 여러 노드를 두다보니 파라미터의 수가 많이지면서 capacity가 올라가기 때문에 overfitting 문제가 발생할 수 있다.

 

이러한 overfitting 문제를 해결하기 위해 사용하는 방법을 간단히 소개하겠다.

 

- Drop out

학습 중에 사용할 수 있는 방법으로 특정 노드 사이의 연결을 랜덤하게 끊는 것이다.

drop out rate가 1/4이라고 할 때, 4개 중 1개의 노드를 꺼버리는 것이다.

따라서 해당 노드와 연결된 weight들에 대한 update가 진행되지 못하게 막는다.

학습에 따라 원하는 노드를 끌 수 있으므로 ensemble method에서 얻을 수 있는 이점을 일부 얻을 수 있다.

 

- data agumentation

데이터 증감 기법이라고도 하며, 데이터에 변형을 가해 학습을 하는 방법이다.

이미지 학습에서 주로 사용하는 방법으로 사진은 5도, 10도 정도씩 돌리거나

일부를 자른 후 training data로 넣어주는 방법이다.

또는 일부러 노이즈를 넣기도 하는데, 이러한 방법을 사용함으로써 training data의 개수도 늘릴 수 있고, 모델에 대해서도 조금 더 일반화된 성능을 얻을 수 있다.

 

3. Too slow to optimize

최적화 하는 데에 있어 weight를 업데이트 하는 것에 대해 시간이 오래 걸린다.

노드의 개수와 레이어의 개수가 많이 때문에 학습해야 하는 weight의 개수가 많아 발생하는 문제이다.

 

이를 해결할 수 있는 방법 몇 가지를 소개하겠다.

 

- SGD(Stochastic Gradient Descent)

우리는 지금까지 gradient descent(GD) 방법을 사용하여 weight를 업데이트했다.

GD는 모든 input에 대해 전체값을 계산한 후 전체 값에 대한 loss 평균을 구하여 backpropagation으로 weight를 조정하였다.

 

하지만 SGD는 하나의 input에 대해 weight update를 진행한다.

이러한 방식을 사용하면 update 시간은 짧아지지만 값이 작아지는 방향이 정확하지 않다. 하지만 줄어드는 방향이 정확하지 않은 것이지 결국 최소값으로 수렴하게 된다. 즉, 한 step을 가는 시간이 줄어들게 된다.

 

+) minibatch GD

1개의 값으로 update를 진행하지 않고 여러 개의 입력을 묶어 feed forwarding을 진행한 후 결과값으로 weight를 update한다. 이때, minibatch GD와 SGD를 묶어 모두 SGD라고 하기도 한다.

 

- Adaptive learning rate

학습 과정에서 learning rate를 수정하는 방법이다.

누적 vector의 크기가 수렴하기 때문에 learning rate도 작아진다.

따라서 minimum값과 멀면 큰 step으로, 가까우면 작은 step으로 이동할 수 있다.

 

- Momentum(관성)

SGD 방법을 사용할 때, 위 그림과 같이 수렴하는 방향이 들쭉날쭉하다.

따라서 원래 움직이던 방향과 새로 움직이려고 하는 방향을 합쳐서 다음 step으로 이동한다.

 

Deep Feedforward Networks

Goal of the network

결국 DNN이 하고자 하는 것은 input과 output 사이의 함수를 근사하는 것이다.

어떤 실제값과 항상 동일한 출력을 내는 최적의 함수 f*(x)가 있다고 했을 때

우리는 이 f*(x)를 모방하고자 하는 것이다.

 

따라서 input과 어떤 파라미터 간의 계산을 통해 출력값을 내게되고, 얘가 input과 output 사이의 최적의 관계를 잘 모방하면 되는 것이다.

 

Networks

모방을 하는 방법 중 하나로 우리가 사용하고 있는 여러 레이어 층을 이용하는 방법이 있다. 각 층을 통과할 때를 하나의 함수로 봤을 떄 함수들의 합성 함수 형태로 표현이 될 것이다.

 

이들을 많이 쌓음으로써 activation 함수 통과하며 nonlinear 연산, weight를 곱하며 linear 연산을 반복하여 f*(x)를 모방할 수 있는 capacity를 가지도록 한다.

 

Hidden layers

hidden layer는  input layer와 output layer에 비해 명확하게 정해진 역할이 없기 때문에 layer의 층이나 노드의 개수, 활성 함수 등이 정해지지 않았다.

 

하지만 hidden layer에서는 활성 함수를 이용하여 꼭 non-linear transform을 진행해야 한다. 왜냐하면 weight를 곱하는 것이 linear operation이기 때문에 중간중간 non-linear transformation을 섞어줘야 한다.

 

Output units

Output node는 우리가 출력을 하고자 하는 형태나 학습하고자 하는 task에 따라 활성함수를 정의할 수 있으며 위 표는 각각의 경우에 따른 활성 함수 및 output distribution과 cost function을 정리해 둔 표이다.

 

Hidden units

층을 여러 개를 쌓을 때에는 기본적으로 ReLU function이 default로 정하기 좋다.

 

장점으로는 feed-forward process에서도 계산하기 쉬우며 편미분 계산 시에도 0보다 작으면 0, 0보다 크면 1로 설정하면 되기 때문에 아주 계산이 간단하다. sigmoid function의 경우 기울기가 0.25를 넘지 않으므로 여러 번 곱했을 때 gradient가 아주 작아지는 gradient vanishing 문제가 발생하는 것에 비해 ReLU의 경우 양수 값에 대해 해당 값이 유지가 된다.

 

단점으로는 음수에서는 기울기가 0이 된다는 것인데, 0이 되면 뒤쪽으로의 영향을 끼치지 않아서 backpropagation 과정에서 이 노드와 연결된 앞의 input 노드와의 weight update가 잘 진행되지 않는다는 단점이 있다.

 

하지만 activation이 0이 되는 것은 그리 큰 문제가 아니다. drop out과 마찬가지로 우리는 일반화된 성능을 얻기 위해 node를 일부러 끊기도 하기 때문이다.

 

이때, 우리는 음수일 때 기울기가 0이 되는 것이 문제라면 음수 값에 대해 0.1 또는 0.001 등을 곱하여 기울기가 0이 되지 않도록 나타내는 조금 더 gerneralization된 ReLU를 사용할 수도 있다.

 

이때 음수 값에 대해 약간의 기울기를 준 것이 Leaky ReLU라고 하며 Maxout units이라고 하는 여러 개의 1차식을 두어 그 중 최대값을 출력하는 방법을 사용해도 된다.

 

많은 방법의 활성 함수가 존재하지면 결국 현재 가장 많이 쓰이고 있는 활성함수는 ReLU 혹은 Leaky ReLU이다. 왜냐하면 ReLU의 단점에 비해 장점이 크기 때문이다.

 

ReLU를 사용하는 이유는 아래와 같다.

 

1. 연산량이 아주 작다.

2. 새로운 모델 개발 시 새로운 것이 활성 함수 부분이 아니라면 이전의 요건과 똑같게 만들어 주어야 한다.

 

그렇다고 해서 다른 활성 함수를 사용하지 않는 것은 아니다.

sigmoid나 tanh도 현재까지 많이 사용하고 있지만 기울기가 크지 않다는 단점이 존재하기 때문에, 기울기가 중요하지 않은 모델에서 주로 사용한다.

 

Convolutional Neural Networks (CNN)

CNN은 이미지 처리에 특화된 모델이다.

그렇다고 이미지 처리에서만 사용해야 한다는 의미는 아니며, convolution 연산을 사용하여 Convolutional Neural Network라고 부른다.

 

CNN에서 주로 다루는 input은 이미지의 각 픽셀 값이 된다.

이미지에서의 각 픽셀은 흑백에서 0~255 범위의 8bit의 값으로 표현이 되고,

컬러의 경우 0~255 범위의 사진을 각각 RGB의 값으로 3장이 들어오게 된다.

 

이때 이미지의 높이를 h, 너비를 w, 깊이를 d라고 했을 때, 해당 이미지에 대한 feature 개수는 h*w*d, 즉 픽셀 크기 만큼 가지게 된다. 따라서 input의 크기가 굉장히 크다.

 

Convolutional operation

레이어 사이의 연결이 있을 때 이 연결을 matrix로 표현한다고 했을 때, y는 행렬의 곱으로 표현해 줄 수 있다. Convolution에서도 마찬가지로 행렬곱의 형태로 표현할 수 있지만, 조금 더 특별한 행렬곱으로 표현된 특별한 연산을 사용한다.

 

Convolution의 motivation을 소개하겠다.

 

- Sparse connections

NN에서 모든 노드에 대해 다 연결 되어 있는 것을 fully connected network라고 한다. CNN에서 convolution하는 필터가 input을 통과해가며 필터를 곱한 값으로 output을 내게 되는데, 이때 모든 노드에 대한 fully connted 형태가 아닌, 위 그림과 같은 형태를 띠게 된다.

 

- Parameter sharing

입력에 대해 동일한 필터를 통과시키기 때문에 각 연결 wieght는 동일한 값을 갖게 된다.

하나의 필터로 인풋에 대해 슬라이딩 하면서 output을 계산하기 때문에 곱해지는 값들이 가 shared가 된다. 따라서 위 사진에서 각 1, 2, 3은 동일한 값을 가지게 된다.

 

- Spatial data

기존의 데이터 형태에서 각각의 피처가 서로 독립적이어서 x1, x2, x10에 대한 관계가 서로 다르지 않았다.

 

하지만 사진의 경우 바로 옆의 픽셀과 멀리 떨어진 픽셀의 연관성이 다르기 때문에 두 픽셀 간의 관계를 필터를 통과해줌으로써 해당 연관성을 반영해줄 수 있다.

 

Convolution

CNN에서의 Convolution은 필터를 뒤집거나 할 필요 없이 필터를 그대로 쭉 통과시키면 된다. 원래의 연산은 필터를 뒤집어서 진행하는 것이지만 필터를 그대로 진행시킨다.

 

이때 이 필터를 kernel이라고도 하며, 이들이 각각 weight 역할을 하게 된다.

필터가 슬라이딩하며 모든 영역에 곱해지기 때문에 parameter sharding 효과가 있으며 output 하나를 계산할 때 해당 input만 연결이 되어 있다.

 

위 과정을 channel 방향으로 확장했을 때, input이 컬러인 경우 RGB의 채널 3개를 가지게 되는데, 이 경우 Convolution은 아래와 같이 진행된다.

 

이때 필터는 임의의 채널 개수를 가질 수 있다.

하지만 input layer에 대해서는 input 데이터의 형태에 맞춰줘야 하기 때문에 가로*세로*채널 개수만큼 가지지만 hidden layer에서부터는 채널의 개수를 자유롭게 조정할 수 있다.

 

 

이때 필터의 개수는 (i-1) channel # * i channel #이고,

필터 값의 개수는 (i-1) channel # * i channel # * 가로 * 세로이다.

 

이때 MLP와 CNN의 다른점은 아래와 같다.

 

1. sparse connection

모든 노드와 연결되어 있지 않다.

 

2. parameter sharing

하나의 필터로 sliding하며 계산하기 때문에 여러 개의 채널이 하나의 표현법에 의해 표현이 가능해진다.

 

CNN에서 fully connection을 사용하지 않는 이유는 아래와 같다.

 

- 데이터 간의 상관관계를 학습할 수 있다.

가까운 픽셀에 대한 상관관계를 학습할 수 있다.

 

- 연산이 효율적이다.

input의 피처 개수가 엄청나게 많기 때문에 피처 각각에 대해 모두 연결하다보면 필요한 weight가 엄청나게 많아지게 된다.

 

 

위 사진에서 아래쪽이 input, 위쪽이 output(다음 레이어)이라고 할 때

다음 레이어의 특정 노드에 연결되는 전 노드를 receptive field라고 한다.

즉, 해당 노드를 표현하기 위한 영역이 되는 것이다.

 

따라서 파라미터의 수와 연산량을 줄일 수 있게 되고 하나의 필터를 통과시키기 때문에 메모리의 오버헤드도 줄일 수 있다.

 

Pooling

input의 size가 크기 때문에 대표값을 추출하여 크기를 줄여주는 방법을 pooling라고 한다.

 

- Max pooling

해당 영역에서 가장 큰 값만 다음 레이어로 연결

 

- average pooling

해당 영역의 평균값을 다음 레이어로 연결

 

이미지에서의 어떤 범위가 경계가 될 수 있지만, 그렇지 않은 경우에는 비슷한 값을 가지는 경우가 많이 때문에 대표값을 추출해줌으로써 해당 값을 묶어줄 수 있다. 또한 input에 노이즈가 섞인 경우 해당 노이즈에 대한 영향을 적게 받을 수도 있다.

 

따라서 convolution과 activation function, pooling까지 하나의 묶음으로 본다.

 

Stride

input의 크기가 너무 커서 output의 크기를 줄일 필요가 있을 때 사용하는 방법으로 필터를 한 칸씩 옮기는 것이 아니라, stride값씩 슬라이딩 해주는 방법이다.

 

Zero-padding

convolution을 진행하면 일반적으로는 크기가 점점 줄어들게 된다.

따라서 이미지의 테두리를 0으로 둘러주면서 input과 output의 이미지 크기를 맞춰줄 수 있다.

 

전체적인 CNN의 구조는 위 사진과 같다.

 

Remarkable CNN architectures

LeNet (1998)

 

AlexNet (2012)

 

우측은 파라미터를 계산한 식이다.

 

VGGNet (2014)

 

 

GoogleNet (2014)

 

여러 filter를 병렬적으로 넣는다.

이때 서로 다른 필터를 사용하므로 ensemble method라고 할 수 있다.

 

ResNet (2015)

skip connection 방법이 등장하였으며 층을 통과한 입력과 통과하지 않고 그냥 지나가는 입력 두 개를 합쳐준다. 이러한 과정을 반복하기 때문에 backpropagation 과정에서 기울기가 곱해지면서 소실되어도 퓨어한 입력과 연결된 부분이 존재하여 해당 부분에 대한 기울기가 1이 된다.

 

따라서 필요 없는 일부 층을 스킵할 수도 있어 앞쪽 층에 대한 학습을 잘 시킬 수 있다.

 

Recurrent neural networks (RNN), 순환신경망

지금까지 입력과 출력 사이의 관계에 대해서만 다루었다.

따라서 데이터 간의 연관 관계를 따지지 않았기 때문에 각 데이터들은 독립적이다.

그런데 RNN에서는 비디오와 같이 데이터의 순서에 따라 연관성이 있는 sequential data에 대한 처리가 주된 목적이 된다.

 

시간에 따라 출력이 다시 입력으로 들어갈 수도 있고,

이전에 계산된 결과가 현재 계산되는 값에 영향을 주기도 한다.

좌측의 모습을 시간에 따라 펼쳐주면 우측의 모습이 된다.

 

 

반응형
LIST