6. history of Deep Learning
딥러닝
딥러닝 자체는 트렌트적 용어이다.
비교해볼 블로그 : http://nmhkahn.github.io/Casestudy-CNN
1957년에 시작하여 1960 ~1970년, 인공지능의 황금기(Golden Age)
딥러닝의 초안은 Perceptron 알고리즘이며, 인공지능의 부흥을 가져온 알고리즘이다.
이 당시 연구자들이 모이면서, 연구자들이 모이는 황금기가 찾아왔다.
그러면서, 2가지 학파가 생겼다. 연결주의 학파와 기호주의 학파이다.
딥러닝에 대한 인공신경망을 개발한 곳은 연결주의 학파이며, 너무 부흥하다보니까 기호주의 학파는 제대로 살아갈 수 없었다. 그 결과 연결주의 학파의 perceptron의 한계점을 지적하여 비판하기 시작하였다.
1970 ~ 1980년, 인공지능의 암흑기 (Ai winter)
그 비판의 핵심은 아주 간단한 문제인 XOR problem을 풀지못하는 한계를 지적한 것이다.(저번시간 학습했었다). 그러면서 책을 발간하는데, 연결주의 학파의 perceptron이라는 명칭으로 책을 내버린 것이다. 간단한 문제도 못푸는 주제에 사람을 어떻게 대체할 수 있겠느냐는 내용이었다.
그 결과 연결주의 학파가 망해가는데, 기호주의 학파도 같이 망해버렸다. 같은 인공지능에 대한 학파이기 때문인 것 같다. 이러한 시기를
AI winter라고 하며, 인공지능의 Dark Age(암흑기)가 찾아온것 이다.
1986년, 인공지능 암흑기의 끝, Backpropagation
암흑기를 맞이하게 한 주인공인 XOR problem을 제대로 푸는데 17년 정도 걸렸다. 즉, 암흑기 17년 동안 인공지능 연구가 제대로 되지 않고 있었다.
그러다가 실용적으로 XOR problem을 풀 수 있게한 알고리즘인 Back Proapgation이 등장하였다.
이러한 방식을 채용한 것이 Multi-Layer neural Network(Multi-Layer perceptron)인 것이다.
이 알고리즘을 제시한 유명한 학자들 가운데 가장 유명한 인물이 G. Hinton(제프리 힌턴)이다.
제프리 힌튼(Geoffrey Hinton·68, 토론토대 교수) 은 현대 딥러닝 알고리즘을 거의 다 만들었다.
그 밑의 제자들도 매우 유명하다.
facebook에서 Ai 연구총괄하는 yann lecun 얀 레쿤(Yann Lecun·55) 뉴욕대 교수 -> 페이스북 Ai 총괄)
apple에서 Ai 연구총괄하는 Ruslan Salakhutdinov(러슬란 살라쿠트디노브)
추가적으로 18년도에 영입된 존 지아난드레아(John Giannandrea, 53)
코세라 강의로 유명한 앤드류 응(Andrew Ng·39, 스탠포드대 교수)
1995년, SVM의 개발
SVM은 코어의 갯수와 무관하게, 분산처리가 안된다는 한계점을 가지고 있다.
그러므로 스몰데이터에서만 먹히게 되었다. 그 결과 사장되기 시작했다.
2006년부터 2010~ 딥러닝 부흥기
딥러닝이란 용어가 본격적으로 사용되는 것은 2006년, 제프리 힌튼과 그의 제자 러슬란이 RBM(restricted Boltzmann machine)이라는 볼트만 머신을 만들면서 였다. 러슬란이 힌튼의 박사과정을 진행하는 과정 중, 힌튼이 오버피팅을 방지하는 방법을 제안하면서 본격적으로 사용되었다고 한다.
참고로 2013년도 신호처리학회 (ICASSP)에 의해 고안된 Dropout으로 인해 오버피팅을 효과적으로 배제할 수 있게 된다.
부활한 인공신경망과 음성인식
딥러닝이 가장 먼저 두각을 드러낸 곳은 음성인식 분야였다. 그 가운데 Switchboard라는 음성 데이터셋이 큰 역할을 하였다.
이렇게 먼저 두각을 보인 이유는, 딥러닝에 있어서 필요한 3가지 조건을 모두 갖추고 있었기 때문이다.
- 좋은 알고리즘
- 양질의 데이터
- 컴퓨터 성능
2000년 후반대에, 양질이면서 대량의 데이터를 갖춘 것, 음성데이터였기 때문이다.
어떤 주제에 대한 음성내용과 그것을 텍스트로 만든 데이터셋이 바로 Switchboard라는 데이터셋이다.
그 결과 Speech to Text가 가능한 상황이므로, 그 가운데의 알고리즘을 연구하게 된 것이다.
힌튼 교수가 있던 토론대에서 이러한 연구를 하게 되고, 큰 성과를 내게 된다.
힌튼 교수의 딥러닝 알고리즘은 사용했더니 Speech to Text의 error가 확 줄게 된 것이다.
이 과정에서 마이크로소프트의 알고리즘을 힌튼 제자들이 인턴으로 가서, 기존이 알고리즘을 격파하고 왔다는 후문이 있다.
부활한 인공신경망과 이미지 인식
음성데이터에 있어서, 스탠포드 대학에서는 1억4천만개의 이미지에 대해서 22000개의 카테고리로 나누어놓은 이미지데이터셋을 만들었다.
압축했을 때 60기가 되는 대량의 이미지데이터셋을 IMAGE NET이라 이름하였다.
그결과 IMAGE to CLassification 알고리즘 연구가 가능해지게 된 것이다.
활발한 연구를 위해, 이러한 분류 알고리즘의 경진대회를 이미지넷 챌린지라고 하여, 년도별로 우수한 알고리즘이 나오기 시작했다.
그리고 2012년부터, 다른 알고리즘과 엄청난 격차를 벌리면서 딥러닝이 다시 한번 유명해지기 시작했다.
2012년, Alex Krizhevsky의 AlexNet
포스트닥터 과정 중이었던 Alex Krizhevsky가 AlexNet으로 1등을 차지하였다.
그 이전까지 IMAGENET 데이터셋의 image classification error rate는 2010(28.2%), 2011(25.8%)로
20대 중후반 %였다.
딥러닝인 AlexNet의 등장으로 음성인식, 이미지분류의 모든 알고리즘의 도장을 깨버리기 시작하게 된 것이다.
- AlexNet의 정리
- 2012년, error rate : 16.4% (확 낮아지는 계기)
- 8 Layers
2013년, 뉴욕대의 ZFNet
AlexNet에 비해 엄청 우수한 알고리즘이기 보다는, 약간 튜닝한 정도의 딥러닝 알고리즘이라고 한다.
- ZFNet의 정리
- 2013년, error rate : 11.7
- 8 Layers
2014년, 구글의 GoogleNet 과 옥스퍼드대의 VGGnet
2014년의 이미지넷 챌린지는 구글의 GoogleNet이 우승하였지만, 2등을 차지한 옥스퍼드대의 VGGnet이다.
GoogleNet에 비해 효율이 좋아, 많은 사람들이 이용가능한 딥러닝 알고리즘이었기 때문이다.
- GoogleNet의 정리
- 2014년, error rate : 6.7%
- 22 Layers
- VGGNet의 정리
- 2014년, error rate : 7.3%
- 19 Layers
2015년, 마이크로소프트 리서치(중국)의 ResNet
마이크로스프트의 자체 개발 알고리즘이기보다는, 중국의 마이크로소프트 리서치 회사에서 개발한 알고리즘이다.
이 ResNet을 만든 케이밍 해(Kaiming He)는 스타가 되어, 페이스북으로 영입되었다.
- ResNet의 정리
- 2015년, error rate : 3.57%
- 152 Layers
이미지 인식 알고리즘의 변천사
- LeNet5 (1998), 얀 리쿤(Lecun Y.)
- CNN 알고리즘의 시초, MNIST 데이터셋을 만들기도 한 장본인인 얀 리쿤에 의해 개발
- 지금은 28*28 사이즈를 많이 사용하지만, 당시에는 32*32 사이즈를 집어넣었다.
- 32-> Conv -> MaxPooling -> C -> P -> Flatten() -> FC1 -> FC2 -> FC3(output) = 10
- 옵티마이져로는 SGD(Stochastic Gradient Descent)를 사용
- epoch 20, learing rate를 고정시키지 않고 0.000 5->2->05->01 로 초반에 lr는 크게, loss수렴시 lr를 줄임 -> 반복
- 벤치마킹 결과 ( 정확도-error rate 와 메모리사용량)
-정확도에 있어서, SVM(1%)에 비해 큰 차이는 없었다. LeNet(0.8%)
-SVM과의 가장 큰 차이점은 메모리 사용량이다.
28000->60 - 에러율은 0.8%이므로, 10000개의 데이터 중에 81개만 틀렸다고 볼 수 있다.
[논문용] 하지만, 이 틀린 것들이 틀렸지만 틀린게 아니다라는 것을 강조하기 위해, 아래 그림을 제시하였다.
즉, 틀린 것은 사람의 눈으로도 분류할 수 없다는 것을 강조하였다. - AlexNet(2012), Alex krizhevsky
- 2012년, error rate : 16.4% (확 낮아지는 계기)
- 8 Layers
- 지금부터는 이미지넷 챌린지 우승모델, 인공지능 혁명을 일으킨 최초의 모델, 논문인용이 10000단위
- AlexNet에서 최초로 GPU를 사용(2개)하였다. 당시에는 tensorflow가 없었으므로, cuda라는 것으로 수동으로 분산시켰다.
- tensorflow, pytorch, keras는 알아서 처리해주니, 넣기만 하면 된다. - 논문의 figure상에는 224*224 사이즈로 나왔지만, 실제 구현하려면 227*227을 input으로입력해야한다.
- 첫 Conv는 필터크기가 11*11이며, output은 96개의 필터, stride 4칸 뜀
- 나중에는 stride를 1이 best이지만, 이 당시는 몰랐다고 한다. - 첫 Conv는 Pad 0은 제로패딩을 사용하였다.
- Conv의 단점이, input size와 output size가 작아진다는 것인데, 제로패딩을 넣으면, output size를 input과 동일하게 유지할 수 있다. 당시에는 이 개념없이 그냥 사용한 것이라고 한다. - 첫 MaxPooling은 3*3을 2칸씩 stride하였다. 이 때 크기가 3인 창을 2칸만 뛰므로, 다음 맥스풀링 연산과 1칸이 겹치게 된다.
이러한 방법을 Overwrapped Pooling이라고 하는데, AlexNet에서는 이 오버랩드 풀링을 써서 성능이 향상되었다고 기술했다.
- Max Pooling은 2*2를 2칸씩 뛰어 input size의 크기를 정확히 절반으로 줄일 수 있다. - Norm1은 Conv Layer에 대한 Contrast enchancement process로서, Local response Normalization Layer라고 하는데, 지금은 필요없는 것으로 판명되었다.
- weight initiation에 있어서는, Gaussian 분포를 이용해 평균0, 표준편차 0.01로 초기화하였다.
- activation function으로서의 sigmoid를 ReLU로 바꾸었다.
- Dropout을 사용하여, FC층에서 train시 하나의hidden layer에 있어서, neuron을 전부다 사용하지 않고 0.5rate를 주어 절반만 사용하도록 하였다.
- 딥러닝에서는 고양이를 인식할 때, 꼬리 30% 털에 5%, 귀 15% 얼굴에 50% 이런식으로 확률을 배정한다.
하지만, 커튼에 가려진 고양이의 경우, 꼬리만 보이므로 30%의 확률로 밖에 인식못하게 된다.
그러나, 사람의 경우 꼬리만 보고도 맞출 수 있다.
사람의 인식방식을 모방하여, 꼬리만 보고도 100% 고양이으로 맞출 수 있게,
강제로 neuron의 절반을 지운체 train시킨다.
고양이를 label을 준 상태에서 꼬리, 털, 귀, 얼굴을 랜덤하게 지운체로 weight를 back propagation을 통해 training시키면,
각 부위의 feature가 랜덤하게 지워지더라도 고양이라는 것을 맞출 수 있도록 train되는 것이다.
즉, 강제로 고양이 부위의 일부를 빼놓고 학습시킨다는 것이다. - Batch size는 128장 씩 넣었다.
- 이미지넷 데이터셋은 너무 많으므로,
쪼개서 128장씩 집어넣은 상태에서 foward/backward propage->weight 업데이트 시킨뒤,
다시 128을 가져와 weight를 업데이트 시키는 는 방식이다. - Optimizer는 LeNet5와 동일하게 Gradient Descend방식인 SGD를 썼으나, 추가적으로 Momentum이라는 가속도를 0.9로 주었다.
Weight Decay라는 방식도 이용해서 SGD를 사용하였다. - Learning rate는 0.01로 시작한 뒤, loss가 안떨어질때마다 1/10씩 총 3번 감소시켰다.
- 똑같은 AlexNet을 7개 만들어놓고, 각 7개 모델이 weight 초기화에 따라 미묘하게 달라지는 결과를 평균내는 앙상블(Ensemble)을 사용하였다.
- GPU를 최초로 사용하며 2개를 라이브러리가 없는 상태에서, cuda로 직접 나눠서 분산처리하였다.
- Data Augmentation을 굉장히 많이 사용하였다.
- 좌우반전은 사진데이터에서 필수
- 최초 원본이미지를 256*256*을 만들어놓고, crop을 랜덤하게 224*224로 2048개 만들어서 여러데이터를 넣었다.
Dropout처럼, feature가 일부분 짤리는 효과가 생겨 성능이 올라간다.
- test할 시에는 256*256 를 좌상단/우상단/가운데/좌하단/우하단 5개로 224*224 crop 한 뒤, 각각을 좌우반전하여
총 10배로 데이터를 부풀렸다. - 마지막으로, PCA(Principal component analysis)를 통해 RGB채널을 조정해서 넣어주었지만 현재는 쓰지 않는다.
- AlexNet의 성과로서, 2011년도에 우승한 알고리즘인 Xerox에 비해 딥러닝 알고리즘을 통해 error rate가 상당히 줄어들었다.
그결과 딥러닝의 붐이 일어나기 시작한다. - [논문용] AlexNet은 16.8%의 에러에 대해서, 틀린 그림의 top5를 제시하면서, 비록 틀렸지만, 나머지 4개를 보면 답이 있으며, 사람도 해깔린다 + AlexNet이 제시한 오답도 나름의 이유가 있다는 것을 설명하였다.
예를 들어, 2번째 줄 1번, 2번 그림들은, 오답으로 grile 과 mushroom을 내어노았지만 2번째 답으로 예측하였으며, 비록 1번째 답이라고 보아도 무방함을 나타내었다.
그리고 3번째 그림은 체리 뒤에 달마시안이 있으므로, 사람이 봐도 답을 체리가 아닌 달마시안으로도 낼 수 있다.
4번째 그림은, 사람도 모르는 것인데, AlexNet정도면 잘한것 아니냐는 늬앙스를 심어두었다. - ZFNet(2013년, 뉴욕대), Zeiler & Fergus
- 8 Layers, error rate : 14.8%
- ZFNet은 AlexNet을 튜닝하여 약간의 성능개선이 있었으며, 이미지 챌린지에서의 연구적 가치는 크지 않다.
- AlexNet의 Conv1의 필터 크기를 11*11 -> 7*7로 줄이고, stride를 4->2로 줄였다.
- 3,4,5번째 Conv Layer의 필터수(depth)가 384, 384, 256개에서 -> 512, 1024, 512로 늘어났다. - ZFNet의 눈 여겨볼 사항은 Conv Layer를 시각화 했다는 것이다.
- GoogleNet(2014년, 구글), InceptionNet이라는 이명
- 2014년, error rate : 6.7%
- 22 Layers
- 어머어마하게 복잡한 구조로 Layer를 쌓아놓고 우승하였다. 대기업 자본의 승리라는 말까지 나왔었다.
- 성능이 ZFNet보다 비약적으로 증가하였다 (14.8% -> 6.7%)
- InceptionNet은 Inception모듈에서 나왔다. 비슷한 ConvLayer들이 옆으로 묶여있는 구조를 가진 모듈이다
이러한 Inception모듈을 여러개 묶어놓은 것이 GoogleNet이 되는 것이다
- 당시 유행했던 인셉션 영화에서 디카프리오의 ' 더 깊게 들어가야한다'라는 대사에서 따왔다는 말이다 있다. - 여기서 하나의 14년도의 논란거리가 있다. Conv Layer의 필터 크기가 어느것이 best인지에 대한 논쟁이다.
당시에는 전통적으로 필터가 크면 큰 featuremap을, 필터가 작으면 작은 featuremap을 뽑아낸다는 것이 관례였다.
그래서 구글넷은 어느 featuremap이 좋은 것인지 모르는 상태였기 때문에, 종류별로(1*1, 3*3, 5*5) 필터를 여러개 묶어놓은 inception구조를 택한 것이다. 그리고 나서 딥러닝 알고리즘이 알아서 choice하도록 한 것이다. 이것이 인셉션의 기본 원리이다 - 왼쪽의 Prototype과 달리, 오른쪽은 기존 inception구조에 1*1 Conv Layer가 들어갔다.
이것은 기본적으로 Conv Layer의 의미가 없다. Conv Layer의 핵심은 필터크기만큼의 주변픽셀과 연관관계를 연산하는 것이 핵심이기 때문이다. 하지만, 1*1은 주변픽셀과 연관관계가 없다. 다른용도로 쓰인다. - VGGNet(2014년 2등, 옥스퍼드대)
- 2014년, error rate : 7.3%
- 19 Layers
- VGGNet이 2014년 2등을 했음에도 주목받은 이유[논문용]
1. 알고리즘이 엄청 쉽다.
2. 복잡한 구조의 GoogleNet에 비해, 같은 앙상블시 error차이가 거의 없었다.
3. 앙상블 안한 SingleModel로는 VGGNet이 더 성능이 좋다.
4. Conv 필터의 크기에 대해서, 명쾌한 답변을 하였다.
즉, 서로간의 연관관계를 계산할 수 있는 한도내에서 크기가 작을 수록 작다.고 하였다.
- Conv 필터의 크기는 무조건 홀수로 한다(짝수일 때는, 연산이 잘 안된다)
- 홀수로서, 연관관계를 계산하지못하는 1*1을 제외하고, 가장 좋은 필터크기로서 3*3을 채택하였다.
이 최적의 필터크기인 3*3으로서, 최대한 깊게(depth=필터 수) 쌓을 수록 성능이 올라간다.
5. Layer를 어떻게 쌓느냐에 대한 것에 명쾌한 답변으로, 여러가지모델을 사용해서 테스트하였다.
- A모델(11 Layers)을 만든 뒤, AlexNet에서 썼던 Local Response Normalization Layer를 추가해줬더니 성능변화가 없었다.
- B모델로서, A모델에 필터수 64개, 128개인 ConvLayer를 2개 추가했더니 성능이 좋아졌다.
- C모델로서, B모델에 256, 512, 512를 3개 추가했더니 성능이 좋아졌다.
- D모델로서, C모델에 똑같이 256, 512, 512를 3개 추가해줬더니 성능이 좋아졌다.
- E모델로서, D모델에 256, 512, 512를 3개 추가해줬더니 성능변화가 거의 없었다.
==> 결과적으로 같은성능을 내면서 메모리사용량이 적은 D모델이 최적의 모델로서 선택되었다. (VGG16) - 결과적으로 Conv Layer의 필터크기는 언제나 3*3으로, stride 1칸씩, 1개의 zeropadding을 쓴다.
기본적으로 시작 필터수(output filter size)는 64개로 시작한다. 그 뒤로 2배로 늘어난다(병렬처리 잇슈때문에 선택됨)
구글넷에서 썼던 1*1 conv 는 VGG에서는 효과를 못봤다.(하지만, 나중에 효과를 보여주니 알아야한다)
MaxPooling은 언제나 2*2, strides 2칸씩 뛰어, feautremap의 크기를 절반으로 만든다.
Dropout은 FC layers에만 적용시키며, rate는 0.5로 준다. - 다른 옵션들로서,
Optimizer는 AlexNet과 동일하게, SGD를 사용했으나, 시작 Learning rate 는 10배 늘린 0.1로 시작한다.
하지만 AlexNet과 마찬가지로, error 가 줄지 않을 때마다 1/10씩 줄이는 것을 3번 반복한다.
Momentum은 0.9로 동일하지만, weight decay는 0.005로 AlexNet에 비해 10배 늘렸다.
weight 초기화는 AlexNet과 동일하게 Gaussian 분포를 사용하였으나, 평균 0이지만, 분산은 0.1로 달랐다.
싱글모델로서는 D모델을 사용(7.2%)하지만, 성능을 높이고 싶다면 E모델을 앙상블로 사용한다(6.8%)
D모델(7.2%)은 싱글모델로서는 GoogleNet(7.9%)보다 좋다.
- 실용적인 면(메모리)에서 GoogleNet보다 D모델이 더 좋으면서, 연구가치도 높다. - input data의 전처리로서
이미지를 집어넣을 때, RGB값 각각의 평균을 빼는 작업을 통해, loss를 빨리 수렴하도록 만들었다.
512*512과 256*256를 --> 224*224로 여러개 crop한 뒤 학습시켰다.
그외 좌우반전 등을 이용하였다.
- ResNet(2015, 케이밍해, 중국 MS researcher -> 현재 페이스북)
- 2015년, error rate : 3.57%
- 152 Layers
- 일단 레이어수가 152개로 엄청나게 깊게 쌓았다.
- 인공지능의 목표인 인간의 한계(이미지넷 챌린지의 human performance error[논문용])인 5%를 넘어섰다.(3.57%)
이 이후로는, 이미지넷챌린지에서 classification문제는 나오지 않는다고 한다.... - VGGNet에서는 D모델(16)에서 E모델(19)로 Layer를 더 쌓았음에도 불구하고 성능이 늘어나지 않는 것에 대해,
케이밍 해는 밝혀낸 것이다.
이전까지는 Layer를 쌓음에 따라, overfitting으로서, train은 나아지지만<-> test데이터에서 성능이 안나왔다.
하지만 케이밍 해는 ResNet으로 20-> 56 Layer로 늘렸음에도 불구하고, train과 test데이터의 성능이 같이 안좋아졌다.
그 결과 Layer를 쌓는 것이 Overfitting의 문제는 아니라는 것을 먼저 밝혀냈다.
또, Layer를 쌓음에 따라서, 후반부의 Layer들이 training되지 않는 degradation problem을 발견했다.
그리고 이 degradation problem문제를 해결하기 위해서, Skip-Connection Layer라는 것을 도입하게 된다.
이러한 Skip-Connection Layer에는 Residual Block이라는 개념이 사용되었기 때문에 Deep Residual Network라 불린다.
Skip Layer는 아주 간단하다.
이전 VGGNet에서는 Conv Layer에 input x가 들어가서 H(x)가 나왔는데,
Residual Net에서는 x가 들어간 Conv Layer의 결과를 F(x)라 보고, input인 x를 더 해서 H(x) = F(x) + x로 하였다.
이 작업을 매 Conv Layer 2개 마다 이 작업을 해주는 것이다.
왜 이러한 것이 더 좋은 성능을 내는지 명확하게는 증명되지 않았지만,
x가 들어가서 새로운 H(x)를 내는 것보다, 원본x까지 포함되어, H(x)를 원본x의 변형된 버전으로서, 더 학습이 잘된다는 것이다. - VGGNet에서는 3*3 필터만 사용했지만, ResNet에서는 1*1 Conv Layer를 활용하여,
Featuremap의 차원을 축소하는 bottle neck개념도 사용되었다. - 또다른 특징으로
모든 레이어에 Batch Normalization을 적용하였다.
- Batch Norm은, weight가 업데이트과정에서 커저버려, output = 다음 Layer로 들어갈 input이 매우 커지는 것을 방지하기 위해,
output인 actavation값을 평균0, 표준편차 1로 만드는 standardization개념 + 상수 곱하고 + 상수 더하기
weight 초기화를 He initialization을 새롭게 적용하였다.(케이밍해가 만든 웨이트 초기화법)
SGD- Momentum 0.9는 VGG와 유사하지만, weight decay는 1e-5이다.
Dropout을 사용하지 않는 것이 VGG와 가장 큰 차이점이다. - 성능에 있어서, error rate는 싱글모델이 4.49% 앙상블 3.57%를 차지했다.
- Wide ResNet (2016년)