2021. 12. 7. 12:56ㆍ파이썬/딥러닝
Deap Learning이란 Neural Network를 deep하게 쌓아서 만든 네트워크.
그 중에 대표적인 것이 Neural Network에 convolution이라는 개념을 접목 시켜서
이미지에 관련된 문제(이미지 분류, object detection, video context recognation)를 푸는 것에 특화되어 있음.
1. Neural Network
history
Neural Network는 인간의 brain을 mimicking하고 했던 것, 즉 brain안의 있는 neuron을 모사.

Neuron의 network (Neural Network, Aritificial Neural Network라고 하기도 함.)
1980년대와 1990년대 초에 광범위하게 사용되었다.
90년대 후반에 인기가 감소한다. (생각만큼 문제를 풀어내지 못했기 때문에.)

입력에 대한 weight를 곱해주고(원점을 지나는 기울기를 가진 함수 생성)모두 더해줌 그리고 bias를 더해줌 (y절편으로 원점에서 벗어나게 해줌). 이를 Activation function에 통과시켜준다.
Activation Function으로 sigmoid를 사용했음
sigmoid는 모든 구간에서 미분이 가능하고 0과 1이에서만 존재하는 함수.

x가 양수일 때는 0.5이상의 값. 음수일 때는 0.5이하의 값. x의 값이 커질 수록 y값도 커짐.

어떤 형태의 function이든 충분한 수의 뉴런과 레이어가 있다면 표현할 수 있다.
방금 까지는 하나의 뉴런을 보았고

히든 레이어가 많다면 DNN이라고 하기도 함. 더 복잡한 funtion을 추정(approximate)를 할 수 있다.
(function은 분류 문제에서는 decision boundary를 찾는 것이고, 회귀 문제는 regression function을 찾는 것이다.)
input layer는 데이터의 dimension의 개수. output layer는 문제 정의를 어떻게 하느냐에 따라 달라짐.
히든 레이어와 뉴런의 개수는 하이퍼 파라미터이다. (사용자가 임의 조정.)
regulizaition(정규화)
복잡한 문제를 풀 때는 뉴런과 레이어의 개수가 많아져야 하지만,
그럴 수록 오버피팅의 위험성이 커질 수 잇음.
test와 valiation error를 체크를 하면서 나빠지는 시점을 찾아야함.
XOR problem (대표적인 non-linear 문제)


굉장히 심플하지만 선형적인 함수로는 풀 수 없음.
해결 방법은 어떤 종류의 함수를 만들 수 있는 NN으로 해결 할 수 있다. 단 Activation Function을 사용해야 함.
굉장히 신기함. 한번 검색해서 풀어보기 바람. (그렇게 안 어려움.)
뉴럴 네투워크에서 학습은 기울기(weight)와 y절편(bias)를 찾는 것. 이것은 Backpropagation을 통해 얻을 수 있다
역전파 알고리즘 (Backpropagation)
gradient descent를 사용. error가 작아지는 방향으로!
Error의 gradient를 weight와 bias에 대해서 구함 (편미분)

바로 앞단의 레이어의 weight는 편미분을 해서 gradient를 구할 수 있다. 하지만 그 앞 단 부터는 어떻게 구함?
바로 chain rule을 이용해서 구할 수 있음.
chain rule
output과 먼 layer의 gradient를 구해야하는 문제는 어떻게 해결할까?
많은 layer를 지나며 편미분을 해왔으니 그 정보를 활용해보자.

f를 g에 대해 편미분을 하고 g를 x에 대해 편미분한 것을 곱하면 f를 x에 대해 편미분한 것이 된다.
output과 실제 값 (ground truth)의 차이를 가지고 error를 계산한다.
여기서 output은 함수이기 때문에 gradient를 적용(편미분)할 수 있다. 하지만 그 이전의 layer들은 바로 구하지 못하기 때문에 chain rule을 이용해서 구함.

체인룰을 계속 하다 보면 제일 앞까지 도달.
the problem of NN
복잡한 문제에 대해 학습이 잘 안됨.
universal approximation theorem --> 데이터 뉴런 레이어가 충분하다면 어떤 문제도 풀 수 있어야 한다.
학습이 왜 잘 안될까?
최근에 그 이유를 찾게 되었다.
1. 레이블된 데이터가 너무 적었다. (빅데이터로 해결)
2. 컴퓨터가 너무 느렸다. (GPU로 해결)
3. sigmoid를 썻을 때 생기는 문제점 : 네트워크가 깊어지면 앞단까지
error에 대한 gradient가 잘 전파되지 않는다. (new activation = RELU)
4. weight와 bias를 초기화할 때 생기는 문제점 (Xavier initialization, 안정적으로 학습)
sigmoid
x 입력에 따라 0과 1에 가까워질 경우 slope 즉 gradient가 0에 가까워짐.
layer가 깊어지면 backpropagation. 체인룰을 사용하기 때문에 0에 가까운 값이 누적되기 시작하면
vanishing gradient problem 문제가 발생한다.
Relu

Relu를 사용하니 loss, cost가 줄어들었다. (학습이 잘 되었다.)
Xavier initialization
입력과 아웃풋의 개수를 비율로 weight로 초기화 (요새는 디폴트값으로 지원됨.)
CNN(Convolutional Neural Network)

기본적인 CNN의 구조.
CONV와 POOL의 layer의 동작이 핵심 컨셉.
인풋 이미지의 dimension은 width * hight * depth이다. (노드의 개수)
depth는 무엇일까 (color이미지라고 하면, RGB(3)등 다양한 표현)
이미지 처리에 있어서 convolution은 filter와 같은 이야기.
filter는 depth(color)도 그대로 가져온다.
convolution없이 학습을 하려면 너무 많은 weight값이 필요하다. 학습이 불가
CNN에서 weight의 개수는 filter의 사이즈로 결정된다.

최종적으로 W 스칼라 값이 나옴. 필터 하나의 스칼라 하나가 나온다. 여기에 RELU 적용.
예를 들어 7 * 7 이미지의 3 * 3 필터를 씌우면

stride를 1로 두었을때 5 * 5의 행렬로 나타남.
stride를 2로 두었을 때 3 * 3의 행렬로 나타남.

안 나눠 떨어지면 만들면 안된다. (보통 1을 많이 선택함.)

borderline에 0을 두는 zerp padding을 하면 7 * 7이미지가 9 *9이미지가 된다.
이때 stride를 1로 두고 convolution을 하면 7*7로 원래 이미지의 크기를 유지할 수 있다.(하는 것이 요새 트렌드)
Pooling layer (sampling)
디멘션을 줄이는 목적이다. width와 height는 줄어들지만 depth는 줄어들지 않는다.
pooling (2*2, pooling은 겹치게 하지 않음. stride 2)을 주로 사용. 가장 큰 값을 가지는 pixel를 가져옴. (max pooling)
마지막은 Fully Connected Layer 모든 뉴런과 input을 연결함.
CNN 모델로 Googlenet, ResNet이 유명하다.
'파이썬 > 딥러닝' 카테고리의 다른 글
| LSTM 다변량 예측하기 exercise (실전 활용) (1) | 2021.12.13 |
|---|