Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 30 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -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강||
93 changes: 93 additions & 0 deletions Week11 예습과제
Original file line number Diff line number Diff line change
@@ -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의 값을 비교해보는 것
Binary file added Week15 예습
Binary file not shown.
Binary file added Week17_논문_리뷰.pdf
Binary file not shown.
125 changes: 125 additions & 0 deletions Week3_예습과제.txt
Original file line number Diff line number Diff line change
@@ -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)
Loading