diff --git a/README.md b/README.md index 7664941..aeca000 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,30 @@ -# 2022-1-Euron-Study-Assignments -Euron 2기 스터디팀 예습·복습 과제 제출 +# Euron 2기 예습·복습 과제 제출 + +### ▶ [Computer Vision](https://github.com/Ewha-Euron/2022-1-Euron-CV) +### ▶ [Natural Language Processing](https://github.com/Ewha-Euron/2022-1-Euron-NLP) +### ▶ [Data Analysis](https://github.com/Ewha-Euron/2022-1-Euron-DA) +### ▶ [Competition](https://github.com/Ewha-Euron/2022-1-Euron-CP) + +## Curriculum + +| 주차 | 날짜 | CV | NLP | DA | +|---|---|---|---|---| +|1|22/03/08|cs231n 1주차|cs224n 1강|파이썬 머신러닝 완벽가이드 1~3장| +|2|22/03/15|cs231n 2주차|cs224n 2강|파이썬 머신러닝 완벽가이드 4장(1)| +|3|22/03/22|cs231n 3주차|cs224n 3강|파이썬 머신러닝 완벽가이드 4장(2)| +|4|22/03/29|cs231n 4주차|cs224n 4강|4장 관련 필사| +|5|22/04/05|cs231n 5주차|cs224n 5강|파이썬 머신러닝 완벽가이드 5장| +|6|22/04/12|cs231n 6주차|cs224n 6강|5장 관련 필사| +|7|22/04/19|cs231n 7주차|cs224n 7강|파이썬 머신러닝 완벽가이드 7장| +|8|22/05/03|cs231n 8주차|cs224n 8강|7장 관련 필사| +|9|22/05/10|cs231n 9주차|cs224n 9강|파이썬 머신러닝 완벽가이드 6장| +|10|22/05/17|cs231n 10주차|cs224n 10강|6장 관련 필사| +|11|22/05/24|cs231n 11주차|cs224n 11강|파이썬 머신러닝 완벽가이드 9장| +|12|22/05/31|cs231n 12주차|cs224n 12강|9장 관련 필사| +|13|22/06/07|cs231n 13주차|cs224n 13강|캐글 필사 1| +|14|22/06/21|cs231n 14주차|cs224n 14강|캐글 필사 2| +|15|22/06/28|논문 스터디 1|cs224n 15강|캐글 필사 2| +|16|22/07/05|논문 스터디 2|cs224n 18강|| +|17|22/07/12|논문 스터디 3|cs224n 20강|| +|18|22/07/19||cs224n 21강|| +|19|22/07/26||cs224n 22강|| diff --git "a/Week11 \354\230\210\354\212\265\352\263\274\354\240\234" "b/Week11 \354\230\210\354\212\265\352\263\274\354\240\234" new file mode 100644 index 0000000..06a61e3 --- /dev/null +++ "b/Week11 \354\230\210\354\212\265\352\263\274\354\240\234" @@ -0,0 +1,93 @@ +### Image Segmentation + +semantic Segmentation: 이미지의 픽셀들이 어떤 클래스에 속하는지 예측하는 과정 +Classification처럼 미리 클래스의 수와 종류를 정해 놓아야 한다. 단, 개별 객체가 구분되지 않는다는 단점이 있다. + +이를 구현하기 위한 방법으로는 + +1. Sliding Window → Patch를 만들고 전체 영역을 모두 돌면서 한 픽셀이 어느 카테고리에 들어가는지 찾는 방법 +계산량이 너무 많다는 단점이 있음 +2. Fully Convolutional Network → 입력의 Spatial Size를 유지해야한다는 특징이 있다. 모든 픽셀에 대해 카테고리 Score를 계산해야 하기 때문에 계산량이 많다. +3. 2번에서 FC Layer 대신 Spatial resolution을 다시 키우는 방법이 제안 +이 과정에서 Upsampling이라는 과정을 거친다. + +### Upsampling + +간단히 말하자면 Downsampling의 역과정이라고 생각하면 된다. 이미지의 사이즈를 늘리게 되면 빈 공간이 생겨날텐데, 이런 빈 공간을 채우는 Issue가 발생. + +이를 해결하는 방법으로는 + +1. Unpooling +단순히 0으로 채우거나 인접한 값을 복사하여 채운다. +2. Max Unpooling +대부분의 네트워크가 downsampling 과정을 거칠 때 Maxpooling 가정을 거치는데 네트워크가 주로 대칭적인 특징을 가지고 있어 그 위치로 Upsampling을 하는 과정이다. +3. Transpose Convolution +Convolution 연산을 행렬로 생각하고 내적의 과정으로 이해할 수 있다. + +입력값을 가중치라고 생각하고, 필터의 값을 곱해서 output에 채워넣는다. 만약 겹치는 부분이 있을 경우 그 구간에 있는 값들을 모두 더해주면 된다. +Deconvolution / Upconvolution / Fractionally strided convolution / Backward strided convolution + +### Instance Segmentation + +Semantic Segmentation은 개별 객체를 구분할 수 없다는 단점이 있었다. 이 단점을 보완하기 위해 나온 방법이 Instance Segmentation이다. + +각각의 픽셀 별로 카테고리 score를 매기는 방식이 아니라 각각 픽셀 별로 Object가 있는지 없는지를 판단한다. +Instance Segmentation과 Object Detection을 결합하여 만들어진 대표적인 알고리즘 = Mask R-CNN이다. + +Classification + Localization + +Classification과 Localization은 이미지에서 하나의 물체에 대해 그 물체가 어떤 것에 속하고, 그 물체가 어디에 위치해 있는지 찾아내는 Task이다. + +보통 Image Classification을 위한 네트워크는 최종적으로 하나의 FC 층이 존재하지만 이 Task는 2개의 FC 층을 이용하여 Bounding Box와 Classification을 찾는다. +따라서 학습을 시킬 때 2개의 Loss function을 이용한다. Multi task Loss이기 때문에 네트워크 가중치들의 각각의 미분값을 사용하므로 Loss function의 단위가 달라도 gradient 계산이 가능하다. + +Object Detection + +한 장의 이미지에서 다수의 물체를 찾고 그 물체가 어디 있는지 알아내는 Task이다. Classification + Localization과 달리 이미지 마다 객체의 수가 달라져 이를 미리 예측할 수 없다. 즉, 더 어려운 Task이다. + +2-stage Detector / 1-stage Detector 두 가지가 있다. +이를 나누는 기준은 Classification과 Localization을 단계별로 할 경우: 2-stage, 이를 한 번에 진행할 경우 1-stage이다. + +R-CNN + +- Selective Search Algorithm: 딥 러닝을 사용하지 않고 Rule based로 된 알고리즘으로 물체가 있는 영역을 찾는데 효과적인 알고리즘이다. + +Region Proposals은 딥러닝을 쓰지않고 찾는 방법 중 가장 성능이 좋은 알고리즘이다. +간단히 설명하면 물체의 스케일이나 위치를 모두 고려해 모든 후보군을 처음에 샅샅이 조사한 다음, Greedy Algorithm을 이용해서 여러 영역에서 비슷한 부분을 합치는 식으로 영역을 통합하는 방법이다. → Region of Interest = RoI를 추출 +→ RoI를 CNN에 training 시키기 위해 input size를 맞춰줌 +→ CNN을 통과한 다음 SVM을 통해서 Classification 과정을 거침. +→ Linear Regression을 통해서 Bounding BoX도 Loss 값을 계산 +→ 2개의 Loss가 최소가 되는 방향으로 training + +- 계산량이 많다. +- Memory가 많이 든다. +- 학습 과정이 느리다 +- Test time이 느리다. +- 학습되지 않는 Region Proposal이 존재한다. + +Fast R-CNN + +계산 비용이 많이 드는 이유 → 각각의 RoI 영역에서 CNN 과정을 다 진행시켜서 + +⇒ Fast R-CNN에서는 Input Image에 대해 한 번의 CNN 과정을 거친다. +→ Feature Map에서 Region Proposal을 찾아낸다. +→ RoI의 영역에 모두 다른 Issue가 발생 +* 일반적인 방법으로 Pooling을 통해 Input size를 맞춰야하는데 RoI가 달라서 문제가 생긴다. +→ RoI pooling이라는 새로운 기법을 이용하여 Feature map의 size를 통일 +→ FC 층을 통해서 Classification에 대한 Loss 값을 계산 +→ 마찬가지로 Bounding Box에 대한 Loss 값 계산 + +Faster R-CNN + +Feature map을 만드는 CNN과 그 이후 classification + localization하는데 사용하는 CNN을 공유해서 사용한다는 아이디어에서 출발한다. + +*RPN classify object / not object (binary classification)RPN regress box coordinatesFinal classification score (object classes)Final box coordinates* + +이렇게 4개의 Loss function이 필요하다. + +RPN은 Region Proposal Network를 의미한다. +Faster R-CNN에서는 총 9개의 anchor box를 사용한다. + +Anchor box란 물체의 모양이 어더게 생겼는지 모르니 서로 다른 비율의 Bounding box를 만들고, 모두 시도를 해서 최적의 Bounding box를 찾기 위해 사용하는 것 + +물체가 있을 확률 = IoU → 내가 예측한 Bounding Box의 크기과 실제 GT의 값을 비교해보는 것 diff --git "a/Week15 \354\230\210\354\212\265" "b/Week15 \354\230\210\354\212\265" new file mode 100644 index 0000000..9e86c20 Binary files /dev/null and "b/Week15 \354\230\210\354\212\265" differ diff --git "a/Week17_\353\205\274\353\254\270_\353\246\254\353\267\260.pdf" "b/Week17_\353\205\274\353\254\270_\353\246\254\353\267\260.pdf" new file mode 100644 index 0000000..840ebe8 Binary files /dev/null and "b/Week17_\353\205\274\353\254\270_\353\246\254\353\267\260.pdf" differ diff --git "a/Week3_\354\230\210\354\212\265\352\263\274\354\240\234.txt" "b/Week3_\354\230\210\354\212\265\352\263\274\354\240\234.txt" new file mode 100644 index 0000000..eff9664 --- /dev/null +++ "b/Week3_\354\230\210\354\212\265\352\263\274\354\240\234.txt" @@ -0,0 +1,125 @@ +Linear Classifier에서 어떤 가중치(w) 값을 사용하느냐에 따라 정확도가 달라진 다는 것을 배웠다. +그렇다면 어떻게 최적의 가중치 값을 찾아야 하는지 알아야 하는데 이를 위해서 사용하는 정량화 방법이 loss function이다. +loss fuction은 어느 가중치 값이 얼마나 "안 좋은지"를 알려주는 지표이다. +그리고 이 안 좋은 가중치를 좋은 가중치로 바꿔나가는 과정을 optimization이라고 한다. +f(x, W) = Wx + b +이 식에서 x는 이미지, W는 가중치, b는 편향값이다. +이 식에서 loss를 구하는 방법은 각 카테고리 (고양이 자동차 개구리 등)별로 loss를 각각 구해서 그걸 모두 더한 후 평균을 내는 것이다. +강의 자료에서 제시된 고양이 자동차 개구리 이미지를 통해 loss를 구한 값들은 다음과 같다. + +- SVM loss (= hinge loss) +sj는 정답이 아닌 클래스의 score이고 syi는 정답 클래스의 score 값이다. +만약, syi > sj + safety margin(강의자료에서는 1)이면 loss = 0이고, +syi < sj + safety margin 이면 loss = sj - syi + safety margin이다. +SVM loss = SUM(j != y_i) { max (0, sj-syi+1) } +강의 자료의 고양이 자동차 개구리의 케이스로 계산한 SVM loss = 5.27이다. +고양이 자동차의 경우는 loss 값이 작지만 개구리에서 12.9의 loss 값이 나온다. + +Q1. 그런데 이 때 자동차의 score 값을 조금 변경해서 loss 값을 계산해도 loss 값이 크게 변동하지 않는 것을 볼 수 있다. +따라서, SVM hinge loss는 데이터에 민감하지 않다는 특성이 있음을 알 수 있다. +Q2. 그럼 최소 최댓값은 어떻게 될까? +loss의 최소값은 0이다. 그리고 최대값은 무한대이다. +Q3. 만약 W가 매우 작아져서 score가 0에 근사해지면 어떻게 되나? +계산해보면, 클래스 3개니까 (2+2+2)/3 = 2가 나오고 만일 클래스가 9개라면 (9+9+9+~+9)/10 = 9가 나올 것이다. +따라서 그럴 경우 loss = 클래스 갯수 -1이 된다. 이 계산은 디버그 용으로 사용한다. +0으로 해주었을 때 loss가 클래수 갯수 -1의 값으로 나오는지 검사하는 것이다. +이걸 sanity check라고 부른다. +Q4. 지금까지 계산하면서 정답 클래스 값을 제외하고 계산했는데 그 이유는? +정답 클래스 값을 포함해서 계산하게 되면 모든 경우에서 loss 값이 +1 증가하게 된다. +그러나 우리는 loss 값이 0에 근사하게 되길 바라기 때문에 정답 클래스 값을 제외하는 것이다. +Q5. 만약 sum 대신 평균을 이용하면 어떻게 되나? +계산해보면 딱히 상관은 없다. 단지 평균을 사용했기 때문에 scale만 작아질 뿐이다. +다만, loss가 0에 가까워지도록 하길 바라기 때문에 scale을 크게 해서 변화를 관찰하는 것이 좋은 방법일 수 있다! +Q6. 그럼 max 값에 제곱승을 해서 계산하면? +제곱승을 해서 계산하게 되면 nonlinear한 결과가 나오고, 답이 달라지게 된다. +이렇게 계산하는 방식을 squared hinge loss라고 하는데 때에 따라서는 이 방식이 잘 먹힐 때도 있다. +그래서 "아주 좋다"와 "아주 나쁘다"를 따질 때 유용한 방식이다. (그러나 잘 사용하지는 않음) + +그런데 이렇게 구하는 W 값은 과연 유일한 걸까? -> 아님 +각각의 score 값을 2배 혹은 3배 증가시켜도 똑같은 loss 값이 나올 수 있다. 따라서 W는 여러 개가 나올 수 있다. +유일하지 않는 W값이 문제가 되는 이유는 +-> 우리는 새로운 값에 대해서 예측을 하기 위해 model을 만들기 때문에 test set에 더 관심이 많고 따라서 정확도도 test set을 통해서 추출한다. +그런데 지금까지 구한 W값은 train set에 맞춰서 나온 것들이기 때문에 최적값도 train set에 맞춰져서 나오게 된다. +그래서 그 최적값은 test set에는 맞지 않을 수도 있다는 문제가 있다. +-> overfitting의 문제가 생길 수도 있다는 것이다. + +따라서 test set에도 맞을 수 있는 W값을 찾아야 하는데 이를 위해 사용하는 방식이 regularization이다. +L(W) = 1/N * SUM^N_(i=1) { Li(f(xi, W), yi) } + lamda R(W) +이 식에서 왼쪽의 항은 data loss이고 오른쪽의 항은 regularization이다. +data loss는 train set의 입장에서, regularazation은 test set의 입장에 있기 때문에 +이 식에 따르면, 매 loss 값을 계산할 때 마다 train에만 맞는 것을 학습하려고 하면 regularization에서 패널티를 부여하게 된다. +이 과정을 통해서 test set에도 맞는 W 값을 찾아나갈 수 있다. + +* 여기서 lamda R(W)가 무엇이길래 패널티를 부여하는 것일까? +일단 다항식이 너무 깊어지게 되면 복잡한 계산을 하게 되기 때문에 이를 방지하는 효과가 있다. +그리고 L1 regularization, L2 regularization이 있는데 +전자는 실제로 차수 값이 0이 되도록하고, 후자는 전체 차수의 값이 0에 가깝도록 유도한다. +따라서 L1은 원하는 특성이 제거될 수 있기 때문에 L2가 모든 것을 고려한다는 점에서 비교우위를 가지게 된다. +그리고 lamda 값은 규제의 강도 값이고, 높으면 모델이 단순해지며 underfitting / 낮으면 모델이 복잡해지며 overfitting이 된다는 문제가 있다. + +위와 같은 특성들 때문에 L1은 가중치 값 중 0이 있는 경우를, L2는 전체적으로 0에 가깝게 퍼진 가중치 값을 선호한다. + +어쨋든 우리의 목적에 더 부합하는 것은 L2 regularization이기 때문에 이를 더 많이 사용하고 이는 dropout, batch normalization에서도 많이 사용한다. + +- softmax classifier (=cross entropy) +모든 스코어에 exp를 취하고 그걸 모두 더한 뒤 원하는 클래스의 점수에 exp를 취해서 나눈다. +이렇게 계산한 것은 확률 값으로 도출되며, 이 때 원하는 정답 클래스에 -log를 취해 loss를 구하게 된다. +softmax는 multinomial logistic regression이다. (logistic regression = sigmoid function) +위와 같은 정의에 따라 위의 계산 방식에서 exp를 취해주는 것이다. +그리고 우리는 얼마나 "안" 좋은지를 판단하고자 하는데 +x축을 확률, y축을 loss라고 했을 때, -log의 함수가 확률이 1에 가까워질 수록 0에 가까워지기 때문에 -log를 취해 최종 loss를 구하게 되는 것이다. + +Q1. 이런 방식을 취했을 때 min, max는? +이론적으로 최소는 0, 최대는 무한대이다. (feat. -log graph) +Q2. 만약 score가 0에 가까워지면? +-log(1/클래스 갯수)가 되고 이 또한 디버깅 용으로 사용하며, sanity check라고 불린다. + +강의자료에서는 예시 자료를 통해 svm과 softmax를 비교하고 있다. +1. max값을 취해서 loss를 구하는 것과 exp를 취해서 확률 값으로 loss를 구하는 것의 차이가 있다. +2. 만약 data point를 흔들어 주게 되면? +SVM의 경우에는 딱히 영향이 없었고 둔감하다는 결론이 나왔으나, +cross-entropy loss의 경우에는 조금만 데이터가 바뀌어도 확률에 영향이 있었고 매우 민감하다는 결론이 나온다. + ++) Full loss라는 것은 언제가 regularization을 추가한다. + +위와 같은 방식들을 통해서 얻은 결론은 "어떤 W값이 얼마나 안좋은지"이다. +그렇다면 좋은 W값은? -> Optimization을 통해 구할 수 있다. +optimization은 쉽게 말하면 산 골짜기의 가장 깊은 곳으로 내려가는 것과 같으며 이 과정이 곧 loss가 0에 가까워지도록 하는 것이다. +몇 가지 방법이 소개되고 있는데 그 중에서 Random search는 사용하지 말아야 한다. (연산 오래 걸릴 수 있음.) +보통은 Follow the slope (gradient descent)경사 하강법을 사용한다. + +1-dimension, the derivative of a function +d f(x) / d x = lim_(h->0) { ( f(x+h) - f(x) ) / h } (* 만약 다차원이면 편미분 형태의 식) +이렇게 수식으로 하나하나 계산해서 사용하는 방법 -> numerical 방법 (수치적 방법) +이 방식은 모든 가중치 W 값에 조금씩 변화를 줘가면서 loss 값의 변화를 관찰하는 것인데 이렇게 하면 너무 연산이 오래 걸린다. +단지 W가 변화할 때의 loss 값을 알고 싶을 뿐이라면? +미분을 이용한 analytic gradient(해석적 방법)을 사용한다. 이 방식을 사용하면 일일이 계산할 필요없이 딱! 원하는 값이 나오게 된다. +요약하자면, +numerical gradient: 정확하지 않고 느리지만 간편한 연산 방식 (오류가 덜 나는 편) +analytic gradient: 정확하고 빠르지만 복잡한 연산 방식 (오류가 날 가능성이 있음) +이다. 보통은 해석적 방법을 더 많이 사용하지만 디버깅을 할 때는 수치적 방법을 사용하기도 한다. 이를 gradient check라고 한다. + +위와 같이 gradient 계산한 것들은 앞에 -가 붙으면 음의 기울기이기 때문에 +방향으로 이동하고 +앞에 +가 붙으면 - 방향으로 이동하면서 그래프에서 가장 낮은 지점으로 이동한다. +여기서 한 번 이동할 때 이동하는 거리를 step size (=learning rate)라고 부른다. 이 값도 적절한 값을 찾아서 적용시키는 것이 중요하다. +그래서 임의의 w 위치에서 가운데 빨간색 지점으로 가는 것, 즉 기울기가 0에 가까운 지점으로 가는 것이 목표이다. + ++) 지금까지 계산한 방식들은 N을 한 번에 올려서 계산했는데, 만약 N이 굉장히 큰 값이라면 매우 비효율적인 결과가 나올 것이다. +그래서 이 N을 나눠서 계산하는 stochastic gradient descent (SGD)를 많이 사용한다. +mini batch를 두어서 데이터 갯수를 잘라 사용하는 것인데 보통 2의 제곱수 만큼 잘라서 사용한다. +(256개를 가지고 W를 업데이트하고 그 다음 256개를 가지고 W를 업데이트하는 것을 반복하는 식이다.) + +그냥 이미지를 그대로 넣어버리는 식으로 사용하는 것은 성능이 그닥 좋지 않았다. (이전 강의록의 말 머리가 2개 있는 식이라던가..) +그래서 CNN이 연구 되기 전까지는 이미지의 특징을 뽑아내고 이 특징을 합쳐서 linear regression에 넣는 방식을 사용해왔다. +이전에 linear classification으로 해결할 수 없는 것들의 예시를 보여주었었는데 이 때 극좌표계로 변환함으로써 직선으로 구분 가능한 형태로 바뀌는 경우가 있었다. +이미지를 활용할 때는 이렇게 하지 않지만 여기서 동기 부여를 받아 특징을 추출하는 방식으로 이어지게 된 것이다. +특징 추출의 한 가지 방법이 바로 color histogram이다. 컬러 hue 값이 있는데 여기에 어떤 컬러가 많이 나오는지 count 해서 특징을 추출하는 것이다. +2번 째 방법은 HoG(Historam of Oriented Gradients)이다. 방향 값을 히스토 그램으로 표현하는 것이다. +전체 이미지 내에서 어느 방향으로의 각도가 많은지 히스토그램으로 나타내 특징을 추출하는 것이다. +3번 째 방법은 bag of words이다. 자연어 처리에서 많이 사용하는 방법인데 +먼저 이미지를 여러 개로 잘라낸 뒤, 비지도 학습과 같이 클러스터링을 돌려 각도, 색 등의 특징을 추출한다. +이 후 새로운 이미지가 들어오면 이 이미지를 잘라내서 클러스터와 비교해 어떤 특징이 있는지 비교한다. + +그러나 CNN 연구 방식이 도입된 후 특징을 미리 뽑아내는 것이 아니라 입력된 이미지에서 스스로 특징을 추출하도록 하여 사용하고 있다. + +(-> 다음 강의: neural network & backpropagation) \ No newline at end of file diff --git "a/Week4_\354\230\210\354\212\265.txt" "b/Week4_\354\230\210\354\212\265.txt" new file mode 100644 index 0000000..6c32cdc --- /dev/null +++ "b/Week4_\354\230\210\354\212\265.txt" @@ -0,0 +1,56 @@ +정리하자면, Gradient Descent을 이용해 손실 함수가 최소화되는 가중치 w를 수정해나간다. +여기서 계산방식의 효율이 높은 analytic gradient 방식으로 chain rule을 이용한다. +이 계산 방식을 3가지의 예제를 통해 익힐 것이며, 여기서 쓰이는게 바로 Back propagation(오차 역전파)이다. +결과값에서 거꾸로 거슬러서 가중치 w를 계산해주는 방식이다. + +(*주의) +오차역전파는 가중치를 계산하는 방식으로 생각하고, 경사 하강법은 가중치를 업데이트하는 방식으로 생각하면 된다. +그래서 이번 4장은 업데이트가 아닌 가중치를 계산하는 방법만 다룬다. + +AlexNet이나 Neural Turing Machine을 보면 input에서 loss function를 도출할 때까지의 노드가 굉장히 많다. +이런 방대한 모델의 가중치 계산을 일일이 하게 되면 오래 걸리지만, Back propagtion을 이용하면 chain rule을 통해 반복 계산으로 전부 구할 수 있다. + +강의 예시 (작성하려다가 gitbhub에 Latex 적용 어떻게 하는지 몰라서 스킵합니다.) +간단한 함수 하나를 설정하고 이 함수 모델에 따라 반대로 거슬러 올라가면서 가중치를 계산해준다. (=Back propagation) +최종 값은 df/df = 1이다. +(중략) +chain rule을 이용해서 합성 함수의 미분을 풀어낸다. 이 때 global gradient * local gradient로 표현한다. +이런 식으로 계산 과정을 통해서 합성 함수의 미분을 풀어내는 과정을 보여준다. + +간단한 함수를 다룬 뒤에는 sigmoid 함수에 back propagation을 적용하는 것을 보여준다. + +예시 함수들에 back propagation을 적용하는 것들을 적기에는 text로 작성하는 것이 너무 시간이 오래 걸리고 latex와 이미지 첨부가 안 돼서 스킵. + +어쨋든 이런 식으로 계산한 것들을 보면 사실 sigmoid 함수를 이용해 일반화가 가능하다는 것을 알 수 있다. +위 과정들에서 chain rule을 통해 구해온 것들은 사실 sigmoid gate를 통해 한 번에 계산이 가능하고 일반화된 공식이 있다. + +add gate: gradient distributor (현재의 가중치를 다음 단계로 뿌려줌) +max gate: gradient router (큰 값에 가중치를 부여) +mul gate: gradient switcher (서로의 값을 바꿔줌) +이렇게 gate들을 일반화 시킬 수 있다. + +이미지 데이터를 다루고자 할 때는 모든 픽셀 값들을 1차원 array로 재배치 하기 때문에 차원이 굉장이 높다. class도 여러 개인 이미지 데이터의 가중치는 매우 높은 차원의 행렬 데이터일 것이기 때문에 이 때는 Jacobian matrix(행렬의 미분 연산)을 이용한다. +그렇게 하면 diagonal의 특성에 따라 대각 행렬만 계산하면 돼서 연산이 좀 간단해진다. + +다음 예시로는 L2 regularization function f를 다룬다. +여기서 f(x, W)의 x는 n차원, W는 n*n 차원이다. 이 예씨는 2장에서의 linear regression의 예시ㅣ로 접해본 구성이다. 클래스가 3개라서 w의 차원이 x차원보다 많다. +L2의 최종값은 0.116이 나오고, 출력 노드의 미분값은 1이다. L2 노드 이전의 [0.22, 0.26]은 W, x의 행렬 연산 결과값이다. +f(q)로 함수를 지정하면 f(q) = sum {q^2}이고, 이는 2q로 미분되므로 가중치는 *2를 해주어 [0.44, 0.52]이다. +mul gate에서는 서로가 서로의 계수이므로 값을 교환하는 방식으로 일반화 가능했었다. 따라서 [0.2, 0.4] * [0.44, 0.52]를 서로 행렬 계산해서 2*2 행렬로 만들어 준다. (W가 2*2 행렬임) +이후 결과값은 [[0.2*0.44, 0.4*0.44], [0.2*0.52, 0.4*0.52]]의 값이 나온다. +x에는 local gradient를 w값으로 하여 계산하고, Wx에서 x1에 들어가는 w값이 0.1, -0.3임을 고려해 transpose를 해준다. +이러면 최종 결과 값은 (01*0.44) + (-0.3*0.52) = -0.112, (0.5*0.44) + (0.8*0.52) = 0.636이다. + +위와 같은 방식으로 backpropagation을 수행한다는 것을 배웠다. + +Neural Network를 구성할 때 이제 단순한 Linear regression만 하는 것이 아니라 hidden layor를 추가해 모델을 구축한다. +hidden layor를 input node와 output node 사이에 100개를 추가한 것은 2-layor NN이라고 부른다. (헷갈릴 것 같다....) +이를 통해 NN과 같은 모델은 각각 하나의 클래스에 하나의 분류기로만 이용해서 그 특징에만 부합한 클래스를 부여했던 것이 hidden layor를 포함함으로써 한 개의 클래스에도 여러 개의 분류기가 생겨 다양한 특징을 잡아 분류할 수 있게 되었다는 발전이 있다! +이런 방식으로 2-layor, 3-layor NN을 만들 때, 함수는 max 함수를 이용하게 된다. <-- 여기서 함수는 활성화 함수를 말하는데 이전에는 sigmoid를 많이 사용했으나 이제는 relu를 더 많이 사용한다. +(이런 식의 NN 구조가 인체의 신경망이랑 비슷하지 않느냐 근데 헷갈리지는 말라는 이야기) + +활성화 함수들 (Activation function)의 종류가 다양하다. sigmoid, tanh, ReLu, Leaky ReLu, Maxout, ELU 함수들의 그래프를 소개했다. +NN 모델의 구조를 간단하게 보여주는데 여러 개의 노드들이 있는 layor를 거쳐 값이 도출되는 과정을 설명한다. 이런 방식을 Fully Connected (FC)라고 한다. + +4강은 Back propagation으로 W를 계산하는 방법을 배우고 NN 모델 맛보기를 했다. +다음 5강에서는 CNN의 구조를 살펴본다. \ No newline at end of file diff --git "a/Week6 \354\230\210\354\212\265\352\263\274\354\240\234.txt" "b/Week6 \354\230\210\354\212\265\352\263\274\354\240\234.txt" new file mode 100644 index 0000000..74373d3 --- /dev/null +++ "b/Week6 \354\230\210\354\212\265\352\263\274\354\240\234.txt" @@ -0,0 +1,145 @@ +Activation functions +딥러닝에 있어서 비선형성을 가해주는 중요한 역할 +몇 가지 활성화 함수들의 예시이 있는데 그중에서 시그모이드 함수는 그동안 많이 다뤘다. +그런데 이 함수는 비선형성을 갖추고 있음에도 최종 output을 낼 때만 이용한다. +그 이유는 +1. 기울기 gradient 값을 없애버린다. (vanishing gradient) +Neural Network는 backpropagation이라는 기법 때문에 강력한 모델을 만들 수 있었다. +하지만 sigmoid 함수를 사용하면 backprop에 문제가 생긴다. +sigmoid 함수에서 x=-10 일때는 거의 0이고, x=0일 때 기울기가 거의 최대일 때도 0.25 정도이다. +back prop 과정이 이전의 기울기 값에 계속해서 local gradient를 곱해주는 식인데, global gradient가 거의 0이니 결국 모두 0에 수렴해서 기울기 값이 소실되어버리는 것이다. +결과적으로 w가 update되지 못한다는 것이다. + +2. Zero-center의 문제도 있다. +시그모이드 함수를 보면 output 값이 항상 양수이다. 0을 중심으로 값이 분포하고 있지 않고 +Neural Network는 층을 계속해서 쌓았기 때문에 이전 노드의 output 값이 다음의 입력 값이 된다. +시그모이드를 활성화 함수로 이용하면 계속해서 양수의 값만 input 된다는 것이다. +또 입력값이 항상 양수이면 gradient에서 문제가 생기기도 한다. +back prop 과정에서 시그모이드 함수이므로 dl/df * df/dwi로 w의 기울기를 구할 때 체인 룰을 구한다. +df/dwi는 x_i이고 여기서 입력값은 항상 양수이므로 dl/df의 부호를 따라가게 된다. +전부 양수이거나 전부 음수가 되는 것이다. +그래서 위 슬라이드 오른쪽 그래프를 보면 w1을 x축, w2를 y축인 2차원이라고 보았을 때, update가 초기 가중치 0에서 강의록 그림처럼 파란색 화살표가 best w라 하자. +빨간색 화살표처럼 지그재그로 가중치가 update 되기 때문에 비효율적이라는 문제가 있다. 입력값이 양수이기 때문에 생기는 문제이다. + +3. exp() is a bit compute expensive 연산이 무겁다고 한다. + +위의 1~3 문제로 인해 시그모이드 함수는 activation 함수로는 이용하지 않는다. + +다음은 하이퍼볼릭 탄젠트 함수이다. +시그모이드 함수와 유사하지만 zero centered 문제를 해소했지만 마찬가지로 기울기 소실 문제가 해결되지 못 해 활성화 함수로는 적합하지 않습니다. + +ReLU 함수는 양의 방향에서 입력값 x를 그대로 배출하기 때문에 기울기가 살아있다. f(x) = max(0, x) 식을 사용하는 이 함수는 기울기 소실 문제를 어느 정도 해결했다. +따라서 양의 영역에서는 가중치 w의 update가 가능해진다. +exp 연산도 사라져서 계산적으로도 효율적이다. +그래서 ReLU 함수는 2012 AlexNet에서 쓰이기 시작하면서 CNN과 큰 규모의 데이터에 매우 잘 작동했다. +하지만 음의 영역에서는 기울기가 모두 0이 되고 zero - centered 문제가 남아있어 입력 값의 음의 부분은 전부 0이 되기 때문에 vanishing gradient, zero centered 문제로 효율성 문제도 생긴다. + +그 문제를 해결한 것이 dead ReLU이다. +w initialization에서 dead ReLU에 빠져버리면 업데이트가 안 될 수도 있고 learning rate를 크게 설정할 경우, w가 너무 크게 비약해서 학습이 안 되는 상황이 발생하는 단점이 있다. + +이렇게 ReLU를 활성화 함수로 한 모델을 훈련 도중에 network의 일부가 freeze 되는데 이는 10~20% 정도가 dead ReLU에 빠진 것이라 한다. 이는 문제이긴 하지만 train은 잘 된다고 한다. +즉, 시그모이드 함수에 비해 기울기 소실 문제가 적으면서 학습이 되고 큰 문제가 있지 않아 상용화된 것이라 생각하면 된다. + +그래도 어쨋든 문제가 없는 건 아니라서.. ReLU 함수에 약간의 bias를 주어서 시작하려는 시도가 있다. +(처음부터 dead ReLU로 빠뜨리지 않게 하려는 시도인 듯) +좀더 active의 가능성을 높여주는 것이다. 위에서 말했듯이 initialization은 중요하기 때문이다. (효과가 미미해 안 하는 사람도 있다.) + +Leaky ReLU는 렐루 함수의 효율성과 함께 dead ReLU의 단점을 보완한 것이다. +음의 영역에서도 경미한 기울기를 주어 vanishing gradient를 해결한 것이다. + +PReLU도 있다. Leaky는 음의 영역의 기울기가 있다면 PReLU는 파라미터로 알파 X를 만들어서 융통성 있게 해결한 것이다. + +ELU 함수도 있는데 _| 모양의 함수를 모두 LU 함수라고 한다. +ELU는 0에서의 미분 불가점을 미분 가능하게 smoothing 시켰다. +이 함수가 Leaky ReLU와 비교했을 때 노이즈에 대해서 더 강건하다고 하는데 이는 zero mean에서 함수가 스무스하기 때문에 생긴 특징이다. +따라서 zero mean의 결과값들을 출력하는데 장점이 있다. 하지만 여전히 음의 영역에서 기울기 값 소실이 있고 exp 연산으로 인한 효율성 저하도 있다. +ReLU < ELU < Leaky ReLU 정도 이다. +보통은 각각의 장단점을 보고 경험에 따라 사용할 함수를 결정한다고 한다. +(그리고 다 한 번씩 사용해보면서 성능이 가장 좋은 것을 선택해서 쓰면 된다고 하는데 sigmoid는 그냥 쓰지 말라고 한다.) + +Maxout Neuron은 파라미터를 더 두어서 각각 출력 갑시 다른 함수 2개 중에 max 값을 취하는 함수이다. +maxout은 기울기 소실은 없지만 연산량이 2배라는 비효율성이 있다. + +데이터 전처리 내용도 다룬다. +zero centering / normalize가 전처리 방식 중 하나로 나온다. +데이터들의 중앙값이 0에 가깝도록 배치한 뒤 각각의 들쑥날쑥한 feature들을 어떤 범위 내로 모아주었다. + +하지만 이미지 데이터에서는 zero centering만 한다. 어차피 이미지 데이터들은 픽셀 값이 전부 같은 범위이기 때문이다. (0~255) + +zero centering을 하는 이유는 입력값이 전부 양수이면 w가 전부 음수나 양수가 되어서 업데이트가 일방향으로만 일어나기 때문에 비효율적이기 때문이다. +zero mean으로는 그 문제를 해결할 수 없고 오직 첫 layer에서 zero centering이 되고 그 이후에 네트워크가 깊어짐녀 깊어질수록 활성화 함수로 값이 양수만 나와서 첫 layer 정도에만 의미가 있다고 한다. + +전처리로 PCA나 whitening 기법들을 생각해볼 수 있다. 하지만 이미지 데이터에서는 zero mean 정도만 학 다른 복잡한 기법은 안 쓴다고 한다. +왜냐면 이미지 데이터를 저차원의 새로운 피쳐들로 이루어서 학습을 진행하는 것이 아니라 convolutional layer에서 오리지널의 이미지 데이터를 필터 등으로 공간적인 구조로 바라봐야 함을 알기 때문이라고 합니다. + +train set과 test set을 전처리할 때는 동일한 mean을 이용해 zero mean을 해준다. +여기서 mean값을 이미지의 전체 데이터로 할지, 아니면 각각 독립된 채널마다의 mean으로 이용할지 선택할 수 있는데, 이는 큰 차이는 나지 않는다고 한다. + +VGGNet은 알렉스 넷보다 이후에 나온 것인데 각각의 채널별로 mean값을 두어 zero mean을 했다고 한다. + + +Weight Initialization +Neural Net에서 weight를 전부 0으로 맞추면 뉴런들은 전부 똑같은 것을 수행하게 됩니다. +w가 전부 0이기 때문에 입력값에서부터 모든 뉴런이 계속 똑같은 값을 내놓는다는 것이고, 활성화 함수가 작동하지 않으니, layer가 의미 없어지는 상황이라고 생각하면 된다. + +그래서 이를 해결하기 위한 방식으로는 +1. 맨 처음 w에 아주 작은 랜덤의 값을 부여하는 것이다. 정규 분포로부터 가져온 작은 편차들의 값들을 랜덤으로 w initialization 해주는 것이다. 하지만 이 방법도 Neural Net이 깊어지면 문제가 발생한다. +w initialization에서 임의의 작은 값들을 랜덤하게 주니 1보다 작은 w값들이 layer가 깊어질수록 계속해서 곱해지니까, 0으로 수렴해버린 것이다. +값이 너무 작아져서 collapse 되어 버린 것이다. + +-> 이런 상황에서의 w의 gradient는 입력값, 출력값들이 애초에 0에 수렴할 정도로 작은 값들이니 gradient마저도 엄청나게 작아지게 된다. 그래서 update도 잘 이루어지지 않는다. +그래서 항상 활성화 함수에 대해서 foward pass와 backward에서의 gradient의 흐름을 잘 파악하고 생각해야한다고 강조한다. + +가중치를 0.01이 아니라 1을 곱해서 0으로 수렴하지 않도록 한 결과가 있다. 그랬더니 출력값들이 1과 -1로만 가버려서 explode 해버린다. +tanh 함수에서 1과 -1 값들을 전부 기울기아 0이 되는 saturated 지점이었는데 기울기가 전부 0이 되어 update가 마찬가지로 되지 않는다. +그래서 강의에서는 initialization이 w를 작게 하면 collapse가 되고, 너무 크게 하면 saturate되기 때문에 매우 어려운 것이라고 한다. +(initialization이 잘된 예시로 2010년의 Xavier initialization) +(*입력 값들의 수가 적으면 우리는 큰 값의 w가 필요하다. 그래서 더 적은 수로 나누어 스케일링 해주고, 반대로 입력값들의 수가 많으면 우리는 작은 값은 w가 필요해서 큰 수로 나누어 스케일링을 하는 것이다.) + +하지만 이 방식은 비선형 함수인 ReLU를 이용하면, 다시금 문제가 발생한다. zero-mean 함수였던 tanh와는 다르게 ReLU는 음수 부분은 전부 0이 되기 때문에 강의록과 같은 그래프가 나타난다. +활성화 함수를 지나면서 편차가 강제로 절반이 된다. layer가 깊어질수록 std가 0에 가까워지는 것이 보인다. 출력값들이 0이 많다면 w의 update는 잘 이루어지지 않을 것이다. +여기서 np.sqrt(fan_in/2)로 수정해 2로 더 나누어주면 (뉴런의 절반이 죽기 때문에) 그래프의 상황이 더 나아지는 것을 볼 수 있고 마지막 layer에도 출력값이 살아있다. +이렇게 작은 차이에도 weight의 값들에 대해서 주의를 기울이면, 큰 차이가 난다는 것을 강조한다. + +Batch normalization +우리가 원하는 가우시안의 범위 내에서 activation 값들을 뽑고 싶은 idea에서 기인한 방식이다. +현재 batch에서의 평균과 분산을 이용해서 훈련 처음부터 batch normalization을 취해 주어 모든 층에서 정규 분포를 따르게끔 하는 것이다. +각 뉴런에서 평균과 분산을 구하는 function을 이용해서 batch마다 normalization을 해주는 것인데 이는 미분 가능한 함수라서 back prop에도 문제가 없다. +이걸 이용하면 굳이 weight init을 안 해도 된다고 한다. 이는 기본적으로 training과정에서 gradient vanishing의 문제를 일어나지 않도록 한다. + +batch normalization은 각 층의 input distribution을 평균 0, 표준편차 1로 만드는 것이다. +network 각 층의 activation마다 input distribution이 달라지만 internal covariance shift이 달라지는 문제를 해결하기 위해 사용된다. +보통 batch 별로 데이터를 train 시키는데, 이때 N*D의 batch input이 들어오면 이것을 normalize한다. +이는 일반적으로 activation layer 전에 사용되어 잘 분포되도록 한 후, activation을 진행할 수 있도록 한다. BN 목적이 네트워크 연산 결과가 원하는 방향의 분포대로 나오는 것이기 때문에 activation function이 적용되 분포가 달라지기 전에 적용하는 것이다. + +그런데 BN을 사용할 때 과연 unit gaussian이 적합한지에 대해서 판단하여야 한다. +BN이 적절한지에 대한 판단을 학습에 의ㅣ하여 조절할 수 있다고 한다. 처음 normalize를 진행하고 이후 감마 값과 같은 하이퍼 파라미터 값들을 조정하여 batch norm을 할지 않 할지 선택하는 것이다. +감마 값은 normalizing scale를 조절해주고 베타 값은 shift를 조절해주는 파라미터 값이다. +이 값들을 학습을 통해 조절함으로서 normalize 정도를 조절할 수 있다. + +먼저 mean과 variance를 구하고 normalize를 한다. +그리고 scale, shift를 얼마나 할지 학습을 통해 값을 정하게 된다. + +BN을 하게 되면 dropout를 사용하지 않아도 된다고 한다. BN의 논문 저자는 dropout을 대체할 수 있다고 하였으나 실제적으로 둘 다 모두 사용했을 때 성능이 좋은 경우도 있고 의견이 다양하게 존재하는 것이다. + +Babysitting the Learning Process +이 과정은 +1. 먼저 전처리 과정을 진행해준다. 이미지의 경우 zero - centered를 사용한다. +2. 사용할 neural architecture를 정해준다. +3. sanity check를 통해 loss가 적절하게 나오는지 확인한다. +4. 규제 값을 올렸을 때 loss가 증가하였고, network가 잘 동작하는지 확인할 수 있다. +5. 그리고 먼저 작은 데이터셋을 이용해서 훈련을 시켜본다. +6. data 수가 작기 때문에 overfitting이 발생하고, train acc가 100% 나오는 것을 확인할 수 있다.. + overfitting이 나온다는 것은 모델이 제대로 동작하고 있다는 의미로 받아드려고 된다. +7. 이제 적절한 hyper parameter 값들을 설정해줄 것이다. 강의록에 따라 lr를 정하면 loss가 매우 조금씩 바뀌는 것을 확인할 수 있었다. +하지만 train acc가 조금씩 높아지는 것을 보면 느리지만 train이 되는 것을 확인할 수 있다. +8. 다시 lr로 설정하니 cost 값이 Nan이 되는 것을 확인할 수 있다. 이것은 값이 너무 커서 튕겨 나간것이라 할 수 있다. +9. 또 lr를 수정해도 inf로 튕겨져 나가는 것을 확인할 수 있고 몇 번의 실험을 통해 1e-3~1e-5 값이 적절한 값이라는 것을 추측할 수 있다. + +Hyperparameter Optimization +처음에는 범위를 크게 잡았다가 좁은 범위로 좁혀나가는 방법을 사용한다. + +이렇게 hyperparameter를 찾기 위한 방법으로 Grid Search와 Random Search가 있는데 Grid Search는 일정한 간격을 가지고 있어, 제일 best case를 찾지 못할 수도 있다. +그래서 Random Search 방법을 더 많이 사용한다고 한다. +이렇게 적절한 hyperparameter를 찾음으로서 좋은 train이 이루어지는 환경을 설정할 수 있다. +hyperparamter에는 network architecture, lr, decay, regularization 등이 있다고 한다. \ No newline at end of file diff --git "a/Week9_\354\230\210\354\212\265\352\263\274\354\240\234.pdf" "b/Week9_\354\230\210\354\212\265\352\263\274\354\240\234.pdf" new file mode 100644 index 0000000..7740b2c Binary files /dev/null and "b/Week9_\354\230\210\354\212\265\352\263\274\354\240\234.pdf" differ diff --git a/Week_18.pdf b/Week_18.pdf new file mode 100644 index 0000000..0a27b01 Binary files /dev/null and b/Week_18.pdf differ diff --git "a/Week_8_\354\230\210\354\212\265\352\263\274\354\240\234.pdf" "b/Week_8_\354\230\210\354\212\265\352\263\274\354\240\234.pdf" new file mode 100644 index 0000000..7323059 Binary files /dev/null and "b/Week_8_\354\230\210\354\212\265\352\263\274\354\240\234.pdf" differ diff --git a/preview.md b/preview.md new file mode 100644 index 0000000..bc68e64 --- /dev/null +++ b/preview.md @@ -0,0 +1,23 @@ +생각보다 컴퓨터 비전은 알아야 하는 분야가 많은 과목이었다. +인간의 시각 체계는 복잡하고 중요한 감각처리로 이에 대한 연구도 오래 전 부터 진행되어왔다. + +CV 분야에서 큰 영향을 준 연구들은 다음과 같다. + +1959: Hubel, Wiesel 포유류의 시각 메커니즘이 어떻게 될 것인지에 대해 연구 +1963: Larry Roberts 우리가 보는 사진을 특징점으로 재구성하는 방법에 대해 연구 +1970년대: Davide Marr Vision이라는 책을 통해 CV가 어떤 방식으로 발전해야하는지 제시 +Input Image가 들어왔을 때, 이미지의 특징을 추출, 특징에 따라 depth나 surface를 추출한다. 이렇게 추출한 정보를 바탕으로 3D modeling하는 방법을 제시 + +Object Detection 분야는 굉장히 어렵기 때문에 객체 분할을 먼저 시도하는 연구가 있었다 (= Object segmentation) +시간이 흘러, 90년도 후반에서 2010년도 까지는 특징을 기반으로 한 객체 인식 알고리즘이 대세를 이루었다. 이 흐름에 영향을 준 논문이 SIFT 알고리즘이다. +객체의 모양은 카메라의 각도에 따라, 조도의 영향에 따라 달라질 수 있지만 불변하는 특징을 찾아 매칭하는 것이 main idea이다. + +이후 Spatial Pyramid Matching, HOG algorithm 등등 여러 논문이 CV에 영향을 미쳤다. + +2000년대 초: SVM, Adaboost 같은 기계학습 알고리즘을 Training 하는 과정에서 overfitting이 일어나는데 그 이유는 시각 데이터가 복잡하고, 학습 데이터가 부족하기 때문이다. 따라서 Classificaiton 분야에서는 세상의 모든 객체를 인식하고 overfitting을 줄인다는 목표를 세운다. + +위의 목표를 가지고 ImageNet이라는 데이터셋을 만들게 된다. 이는 22K의 카테고리와 14M의 이미지 사진이 들어있으며 이를 가지고 Image Classification 대회를 열기도 한다. (=ILSVRC) + +이 대회에서 2012년에 오차율이 10%로 줄어든 혁신적인 알고리즘이 제안되었고 그것이 CNN 구조를 기반으로한 ALexNet이다. 그 이후로 CNN을 변형해서 성능을 좋게 하려는 연구가 계속되고 있으며 이 수업에서는 CNN이 무엇인지 배우게 될 것이다. + +1988년에 이미 제안되었던 CNN은 데이터의 양이 적었거나 연산 속도가 굉장히 느렸다는 단점에 의해 발전이 느렸었다. 하지만 최근에는 여러 기술들이 발전하면서 한계를 극복해나가는 중이다.