모두의 딥러닝 2 Lec 10 ~ 13 review
안녕하세요. 이번 3주차 모두의 딥러닝2 강의 리뷰를 맡게된 C조 남서아입니다. 그럼 리뷰 시작해보겠습니다.
먼저 목차를 소개해드리자면, 강의의 순서랑 같게 진행이 됩니다. 먼저 오버피팅과 그래디언트 디센트 등을 소개한 뒤에 이를 구현한 예제를 살펴보겠습니다. 또 MNIST가 무엇인지, 여기에 어떤 개념들이 중요하게 사용되는지 다루겠습니다. 다음으로 퍼셉트론, 그 다음에 멀티레이어, 즉 다층 퍼셉트론. 이런 식으로 진행하겠습니다. 또, 이번 강의에 다루지는 않았지만, 간략히 이름만 나왔던 정규화 방식 2가지에 대해 따로 소개 드리고. 마지막으로 이번 수업내용에서 떠올린 제 의문점을 제시하겠습니다.
첫 번째로 소개할 내용은 MLE인데요. 이건 통계학적인 방법이면서, 원하는 값들이 나올 가능도를 최대로 만드는 모수를 선택하는 방법이라고 합니다. 화면에 보이는 그래프는 수업 내용에 나온 그래프로, 베르누이 분포 공식을 이용한 그래프입니다. 이때 가로축은 세타, 세로축은 likelihood입니다. 이때 MSL은 observation을 가장 잘 설명하는 세타를 찾아내는 과정으로 이해할 수 있습니다. 여기에서 같은 값을 찾아내는 데 그래디언트 디센트를 이용한 최적화 방법도 활용할 수 있습니다. 여기에서는 Local maximum이므로 그래디언트 어센트이지만 원리는 같습니다.
하지만 이 경우에는 꼭 오버피팅이 생긴다고 합니다. 오버피팅이 무엇이냐 하면. 이미 주어진 트레이닝 데이터에 그래프가 너무 정확히 맞아들어갈 때 발생하는 문제점입니다. 이 경우에는 예전 데이터에만 과하게 맞춘 나머지 정확하게 새로운 데이터를 정확하게 판단하지 못하는 문제점이 생깁니다. 이경우 Observation에대해서데이터를 training set , development set, test set으로나눠서사용할수있습니다. 트레이닝 셋과 구성이 비슷한 테스트 셋을 통해 오버피팅의 여부를 판별합니다. 이때 테스트 셋과 트레이닝 셋 모두 오버피팅이 된 경우를 판단하기 위해 디벨롭먼트 셋, 즉 벨리데이션 셋을 같이 사용하기도 합니다.
validation set 은 오버피팅을 방지하는 데 중요한 역할을 하는데요. 화면의 그래프와 같이 training loss가 점점 줄어드는데 validation loss는 점점 늘어나는 경우가 있습니다. 그러면 그 늘어나기 시작한 부분부터 오버피팅이 일어났다고 볼 수 있습니다.
그 외에도 오버피팅을 해결하는 방법은 다양한데요.
1. 데이터는 많이 모을 수록 편향된 분포에서 벗어나 실제 분포와 가까워집니다. 이를 통해 오버피팅에서 벗어날 수 있죠.
2. 또 feature의 개수를 줄이는 것도 효과가 있습니다.
3. 마지막으로 Regularization을 들 수 있습니다.
regularization에는 또 여러방법이 있는데, Early stoping 은 validation loss가 더 이상 낮아지지 않는 시점에 수행합니다. 또 네트워크 사이즈를 줄이는 것은 딥러닝에서 뉴럴네트워크의 학습량을 줄이는 것입니다. weight decay는 뉴럴 네트워크에서 웨이트 파라미터의 크기를 제한하는 것입니다. 딥러닝에 한해 사용되는 dropout과 배치 노말리제이션은 마지막에 설명해드리겠습니다.
이 외에도 머신러닝 과정에서 중요한 요소 중 하나인 learning rate를 살펴 볼 수 있습니다.
1. learning rate가 너무 크면 발산하며 cost가 점점 늘어납니다.
2. 반대로 너무 작아도 cost가 거의 줄어들 지 않는 문제점이 생깁니다.
=> 따라서, 적절한 숫자로 시작해 발산하면 작게, cost가 줄어들지 않으면 크게 조절하는 것이 좋습니다.
다음은 learning rate를 잘못 설정한 경우 2가지의 예제를 실행 해 본 것입니다. learning rate가 너무 작은 경우 cost가 거의 줄어들 지 않는 것, 그리고 learning rate가 너무 큰 경우 cost가 발산하기 시작한다는 것을 모두 확인해 볼 수 있습니다.
전처리도 중요한 과정인데요. 전처리는 그래디언트 디센트를 통해 학습하기 쉽도록 바꿔주는 과정입니다. 여기서는 정규분포를 만드는 standardization 이라는 방법으로 전처리를 수행하였습니다. 그래서 정규분포를 따르는 training set으로 학습을 실행해 보았습니다.이때 y의값은 첫번째 칼럼의 값이 아주 큰 값, 두 번째 칼럼의 값이 아주 작은 값이 주어진 것을 볼 수 있습니다. 이때 전처리가 유용한데요. 같은 범위의 값으로 모두 바꿔주어 첫번째 칼럼 쪽이 오버피팅 되는 것을 방지할 수 있습니다.
regulation(정규화)의 과정을 예제 코드를 통해 살펴볼 수 있습니다. 이 경우에는 weight에 너무 큰 숫자가 들어가지 않도록 하는 방법으로 정규화를 수행하였습니다.
MNIST란 손으로 쓴 숫자들의 이미지를 모아놓은 데이터 셋을 뜻합니다. 이 강의에서 사용한 MNIST 예시파일의 사이즈는 28x28이고 1채널 그레이 이미지이며, 0~9 digit을 포함합니다.
참고로, 강의에서 소개된 torchvision 이라는 곳에서 실습을 위한 많은 data set과 model architecture을 다운받을 수 있습니다. 직접 실습해보고 싶은 사람들은 알아두는 것이 좋겠습니다.
잠시 먼저 중요한 딥러닝의 개념 3가지에 대해 설명드리겠습니다.
Epoch은 전체 데이터 셋에 대해 한 번 학습을 완료한 상태를 말합니다. 여러 번의 epoch을 사용하면 local minima에 갇히는 상황을 보완하기도 합니다.
Batch Size는 하나의 Mini-Batch를 몇 개의 데이터로 구성할 지 설정하는 값입니다. 참고로, 미니 배치로 GD를 수행하면 나이브한 배치 그래디언트 디센트보다 더 적은 컴퓨터 자원을 사용한다고 합니다. 또한 배치사이즈는 프로그래머가 직접 조정하는 하이퍼파라미터의 일종으로 실험을 통해 최적값을 찾는 과정이 필요하다고 합니다.
Iteration은 epoch을 나눠서 실행하는 횟수를 말합니다. 배치사이즈가 커질 수록 이터레이션 값은 줄어들게됩니다.
MNIST의 과정에 대해 예제로 살펴볼 수 있습니다.
과정은 크게 4단계로 나누어집니다.
1. 데이터 읽어오기
2. Softmax함수를 적용하여 학습
3. 테스트
4. 시각화
예제에서는 결과값으로 정확도가 0.88 즉 88퍼센트로 나왔습니다. 따라서 완전히 정확하지 않아 예제에는 학습된 모델에 대해 틀린 예측값이 나온 것을 확인해 볼 수 있습니다.
퍼셉트론은 뉴런을 본따 만든 모델입니다. 뉴런은 여러 자극이 입력되었을 때 그게 어떤 특정 값을 넘어서면 그것을 신호로 전달합니다.
퍼셉트론은 입력이 들어왔을 때 그것을 가중치 w와 곱하고 bias를 더한뒤에 액티베이션 함수를 거쳐서 아웃풋을 만듭니다. 퍼셉트론은 classifier을 구현할 수 있습니다.
그 다음으로는 OR, AND, XOR 논리게이트와 그 분류문제에 대해 살펴보았습니다. 그런데 여기서 문제가 발견하는데요. 하나의 퍼셉트론 classifier로는 OR과 AND는 해결할 수 있지만, XOR 문제는 해결할 수 없음을 발견하였습니다.
이 문제가 제기됬던 이후로 한참동안 신경망은 암흑기를 맞았다고 합니다.
그렇다면 어떻게 이 문제를 해결할 수 있었을까요?
예제 코드를 통해 XOR문제를 정말 해결할 수 없는 것인지 실행시켜 보았습니다. 그 결과, 다음과 같이 정확도가 0.5 즉 50%의 정답률로, 정답률이 낮아 문제를 해결하지 못하는 것을 확인할 수 있었습니다.
이 XOR 문제를 해결한게 multilayer perceptron입니다.
다층 신경망이라는 이야기죠. multilayer perceptron은 레이어를 하나의 레이어가 아닌 여러 레이어로 구성하는 것을 말하는 것입니다.
멀티레이어 퍼셉트론의 학습 과정에서는 back-propagation과 gradient descent가 중요한 역할을 합니다.
Back-propagation은 가중치에 대해 loss를 미분하여, 뒷단에 있는 가중치부터 loss의 값을 최소화시킬 수 있도록 가중치를 업데이트 시키는 방법입니다.
멀티레이어 퍼셉트론의 구조는 보시는 바와 같고, 저렇게 backward방향으로 가중치를 조정하는 과정이 있음도 확인할 수 있습니다(back-propagation).
멀티레이어 퍼셉트론의 학습 과정은 보시는 바와 같은 5가지 과정으로 이루어진다고 볼 수 있습니다.
다음으로 백프로파게이션 예제를 살펴보겠습니다. 여기서는 XOR문제를 사용하였고요. linear를 2개 선언하여 2개의 레이어로 퍼셉트론을 구성하였습니다. 그렇게 머신러닝을 실행한 결과, 이 경우에는 단층 퍼셉트론과 다르게 계속해서 로스가 감소하여 정확도가 1.0 , 즉 100%에 수렴한다는 것을 확인할 수 있었습니다. 퍼셉트론에서의 XOR 오류를 해결한 셈입니다.
또 layer을 2개 더 늘려서 4개를 만들어 학습을 실행시켜보았습니다. 그 결과, 같은 값인 정확도 100%로 수렴합니다. 하지만 한가지 차이점이 있다면, layer가 늘어날 경우, 학습과정에서 더욱 빠르게 loss가 줄어든다는 점을 발견할 수 있습니다. (loss의 변화를 다 담기에는 길어서 ppt에는 담지 않았습니다)
추가) 강의 내용에 없었없지만 제가 발표준비를 하며 찾아보다가 알게 된 건데 멀티퍼셉트론도 한계점이 있다고 합니다. 바로 이미지를 학습하고 예측하는 능력이 떨어진다는 것입니다. 같은 이미지라도 이미지 속에 물체의 위치가 조금만 달라져도 전혀 다른 입력값으로 인식해서, 동일 이미지에 대해 매번 연산을 수행하게 된다고 합니다. 굉장히 비효율적이죠. 이를 보완하기 위해 이미지 학습 알고리즘인 CNN이 도입되었습니다
또 제가 따로 짧게 소개드리려 하는 내용은 이번주차 강의에서 제대로 소개되지 않았으나. 딥러닝에서 제일 중요하게 쓰이는 regulation 방법 2가지입니다.
첫번째는 dropout 방식입니다. 입력 layer나 hidden layer의 일부 뉴런을 생략(dropout)하고 줄어든 신경망을 통해 학습을 수행합니다. 이 경우에는 Co-adaption을 피하고 voting에 의한 평균효과를 낼 수 있다는 장점이 있습니다. co-adaption을 피한다는 것은 특정 편향된 값의 영향을 받지 않고 학습을 수행한다는 것입니다. 그리고 voting에 의한 평균효과는 어떤 구간을 오버피팅이 될 때까지 학습시키고 다시 무작위로 랜덤 구간을 선택하여 계속 반복함으로서 갖게되는 효과라고 합니다.
두번째는 batch-normalization입니다. Batch 단위로 한 레이어에 입력으로 들어오는 모든 값들을 이용해서 평균과 분산을 구합니다. 그 다음, 평균과 분산값을 이용해 normalization을 해줍니다. batch normalization의 특징은 미니배치 단위에서 정규화가 수행된다는 것이라고 합니다.
다음과 같은 도표로 2가지 정규화 과정의 원리와 방법을 살펴볼 수 있습니다.
마지막으로 제가 강의를 듣다가 생긴 의문점인데요. 한번 넣어보면 좋을 거 같아서 같이 소개해드립니다. 저는 이번 3주차 강의를 통해 알게 된 MNIST가 입문자에게 아주 좋은 간단한 알고리즘인 것을 확인하였습니다. 그래서 제가 시도할만하다는 생각이 들었습니다. MNIST를 응용하여 '필체 구별 모델'을 만들고 싶다는 목표가 생겼습니다. 이번 주에 배운 내용이라 시간 상 뭘 만들어보거나 하진 못했지만 언젠가는 보고싶습니다. 좀 더 공부해서 제가 직접 모델을 만들어 실습하고, 그걸 제가 또 발표할 수 있게 된다면 좋을 것 같습니다.
그럼 이상으로 제 리뷰를 마치겠습니다 감사합니다.