20. 2주차 스터디 정리

이번 주에 궁금했던 내용들을 정리해 본다. 다행스럽게 이번 주에도 대부분의 결과에 대해 나름대로의 답을 얘기할 수 있었다.


# ------------------- sigmoid ----------------- #

1. sigmoid를 영어 사전에서 찾아보면 S 또는 C 자 형태의 모양을 말함.
sigmoid는 기존의 hypothesis 함수의 범위를 0과 1 사이로 조정하기 위해 추가한 함수

2. sigmoid는 그 자체로 굴곡이 있기 때문에 cost 함수가 밥그릇처럼 매끈하게 나오지 않는다.
시작점이 어딘가에 따라서 최저점을 찾지 못할 수도 있다. global minimum을 찾아야 하는데 local minimum을 찾고 멈출 수 있다. 그래서, 기존의 cost 함수를 log 함수가 포함된 공식으로 수정해서 사용한다.

3. 새로운 cost 함수
y가 0일 때와 1일 때에 대해 다른 공식 적용. H(x)와 1-H(x). 두 개의 log 함수를 묶어서 마치 하나의 공식인 것처럼 사용한다. 두 개의 공식이 동시에 사용되는 경우는 없다.

4. "sigmoid 결과가 참, 거짓으로 나온다"라고 착각할 수 있다.
전혀 그렇지 않고 0과 1 사이의 어떤 값으로 나올 뿐이다. 참과 거짓이 필요하다면 0.5와 직접 비교해야 한다.

5. linear regression에서는 x축에 대해 y를 결정하기 때문에 one feature 그래프에 대해 2차원으로 표현. logistic regression에서는 x1과 x2에 대해 분류를 하고 y가 없기 때문에 two feature 그래프가 2차원. logistic regression은 그룹을 구분하는 선을 찾는 작업. 여러 차원이 있기 때문에 hyper plain이라고도 함.

6. decision boundary는 그룹을 나누어줄 수 있는 경계선을 말함.
1차원 직선일 수도 있지만, 대부분은 타원이나 비정형의 아메바 같은 형태가 된다. deep learning 알고리듬으로 처리할 수도 있겠지만, SVC(Support Vector Machine)과 같은 다른 머신러닝 알고리듬에 나오는 이론을 적용하면 더 쉽게 그릴 수 있다.


# ------------------- cost 함수 ----------------- #

1. cost 함수의 목적
구현 방법에 상관없이 맞는 예측일 때 적은 비용을, 틀린 예측일 때 많은 비용을 부과하는 것이다. 그러면 미분을 통해 비용이 적은 방향으로 진행할 수 있다.

2. 두 개의 값 A와 B가 존재. y 값에 따라 A나 B만 사용하고 싶은 게 목적.
앞에서도 설명했는데, 이 공식을 사용해서 두 개의 log 함수를 연결해서 하나로 작성할수 있다. y는 언제나 1 또는 0이고, 1일 때 A를 사용한다.

  공식  ==>  y*A + (1-y)*B
  y=1  ==>  1*A + (1-1)*B = A
  y=0  ==>  0*A + (1-0)*B = B

3. Y vs. Ŷ(y hat)
Y : real. 데이터에 포함되어 있는 실제 값으로 label이라고도 부른다.
Ŷ : prediction, H(x). 모델이 예측한 값으로 이 값과 Y를 비교해서 비용을 계산함


# ------------------- softmax ----------------- #

1. softmax는 점수(score)와 같은 데이터를 확률(probability)로 변경
one-hot encoding은 행렬에 포함된 값들 중에서 가장 큰 값만 1로, 나머지는 0으로 변경

2. softmax는 binary classfication으로 나온 여러 개의 결과를 계산하기 위한 방법
결과값을 확률로 변환하면서, 전체 합계가 1이 되도록 만드는 함수. one-hot encoding을 사용해서 확률이 가장 높은 것은 1로, 나머지는 0으로 처리. 결국 A, B, C 중에서 고르는 상황이고 A의 확률이 가장 높다면 A라고 예측

3. softmax에서 W가 왜 2차원 매트릭스 3x3이 될까? 수평으로 해석해야 할까, 수직으로 해석해야 할까?
행렬 곱셈을 하게 될 X가 곱셈을 할 수 있는 형태이면 된다. 다만 W는 x로 표현되는 각 행에 포함되는 열과 곱해야 한다. W가 앞에 오면 W의 행과 X의 열을 곱하게 되고, W가 뒤에 오면 X의 행과 W의 열을 곱하게 된다. 계산 순서는 편의에 따라 바꿀 수 있다.

4. multinomial classification에서 W는 3x3 행렬이 맞고, X는 3x1 행렬이 맞다.
X는 여러 개의 binary classification에서 재사용하니까. 데이터가 1개일 때는 3x1이지만, 많아져서 8개 되었다면 3x8로 바뀌게 된다. 앞서 나온 설명처럼 3x8로 사용할 것인지 8x3으로 사용할 것인지는 코드에 따라 선택해서 사용해야 한다.

5. hypothesis -> cost -> softmax -> one-hot encoding(argmax)
4단계의 순서를 거치고 나면 값을 예측하는 모델이 완성됨. 다음 순서는 예측한 값을 실제 값과 비교해서 cost 함수 완성.(cross entropy 함수)

6. softmax가 하는 두 가지 일
3개 중에서 하나를 예측한다고 가정했을 때, 첫 번째는 3가지를 예측하는 결과가 0과 1사이에 오도록 하는 sigmoid 역할이고, 두 번째는 이들 합계가 1이 되도록 하는 확률적인 역할이다. 


# ------------------- cross entropy 함수 ----------------- #

1. cross entropy
통계에서 현재 값과 평균까지의 정보량을 계산하는 방법으로, softmax를 통해 예측한 값(y hat)과 실제 값(y) 차이를 계산한다.

2. -∑Li log(Si) = -∑Li log(Ŷi) = ∑(Li) * (-log(Ŷi))
곱셈은 element-wise 곱셈. 행렬 곱셈이 아니라 같은 자릿수끼리의 곱셈. 이 식에서 -log(Ŷi)는 5장에서 나왔다. binary classification에서 왼쪽 그래프에 사용. 오른쪽 그래프는 1-h로 표현. Ŷ(y hat)은 softmax를 통과했기 때문에 항상 0과 1 사이.

3. y에 해당하는 L을 표시할 때 2행 1열의 행렬로 그린다. y는 그냥 0 또는 1이 되어야 하는거 아닌가? 왜 값이 2개가 있는 걸까?
이 부분은 정말 이해가 안 갔었다. binary classification이 2개 있다고 가정하기 때문. 3개 있다면 3행 1열로 표현해야 한다. A를 표현할 때는 [[0], [1]], B를 표현할 때는 [[1], [0]]이 된다. 즉, 선택할 label에 맞는 위치의 값이 1로 표시되는 방식을 사용하기 때문에. 그냥 0이나 1로 A와 B를 표현할 수 있지만, 이 방식은 성능은 좋아질 수 있겠지만 70%의 정확성 등에 비해 확장성이 떨어진다고 할 수 있다.
one-hot encoding에서 이와 같은 형태로 만들어 버린다. 그렇기 때문에 이와 같은 형태로 답 또한 존재해야 한다. 데이터 파일을 보면 y에 해당하는 열이 3개 있는데, [0 0 1]처럼 되어 있다. [0 0 1]은 A는 틀리고, B도 틀리고, C는 맞았다는 뜻이므로 C가 된다.

4. 왜 cross entropy에서 2개 짜리 행렬만 갖고 설명을 할까? feature가 3개 라면 1x3 행렬을 사용하는 것인가?
feature 몇 개가 아니라 multinomial(label) 갯수에 따라 정해진다. 3개로 분류한다면 1x3 행렬을 사용한다.

5. logistic cost와 cross entropy가 똑같다고 교수님께서 과제로 내주셨다.
cost 함수의 목적은 틀렸을 때 벌을 주어서 비용을 크게 만들어야 하는데, 양쪽 모두 무한대라는 벌칙을 적용한다. 다만 logistic regression에서는 2개의 log식을 연결해서 사용하지만, cross-entropy에서는 행렬로 한 번에 계산하는 방식을 취할 뿐이다. 즉, logistoic regression을 cross-entropy로 처리할 수 있다. 바로 앞에 나온 2개 중에 하나를 선택하는 그림이 logistoic regression의 cross-entropy 버전이다. 같다라기 보다는 cross entropy가 logistic cost를 포함하고 있는 느낌이다.

6. 이번에 배운 cost 함수도 미분을 할 수 있을까?
김성훈 교수님도 그렇고 앤드류 교수님까지 이번 미분은 보여주지 않으셨다. 이게 되어야 텐서플로우 코드를 파이썬으로 변환할 수 있다.


# ------------------- 기타 ----------------- #

1. 자연상수 mathematical constant
2.71828182845904523536
오일러가 이름을 붙여서 오일러 상수라고도 한다. 비순환소수이며 무리수이다. 초월수로 증명된 첫 번째 상수이고, 원주율도 초월수의 하나. 수학 공식에 e를 넣으면 표기법이 놀랍도록 간단해져서 '자연'이라는 단어를 붙임. 그러나, 영어를 직역하면 '수학적인 상수' 정도가 됨. 파이썬에서는 math.e, 옥타브에서는 e라고 하는 상수 또는 변수가 있음.

2. binary classification을 행렬로 묶으면 multinomial classification이 됨.
앤드류 교수님은 polynomial classification으로 부름

3. tf.matmul 함수
tf.matmul(a, b, transpose_a=False, transpose_b=False, a_is_sparse=False, b_is_sparse=False, name=None)
매개변수를 통해 transpose를 지정할 수 있다. 기본값은 False. 매개변수를 2개만 전달했다는 것은 행렬 곱셈이 transpose 없이 된다는 뜻.

4. WX vs. XW
행렬 곱셈은 앞쪽 행과 뒤쪽 열을 곱한다. 이미 W에서 어떤 것을, X에서 어떤 것을 곱해야 하는지 알기 때문에 순서를 바꿀 수 있다. W가 앞에 와도 되고 뒤에 와도 된다. 앤드류 교수님은 항상 W를 앞쪽에 두는 코드를 보여주었다.

5. linear와 logistic regression 용어 차이
linear regression은 값을 예측. logistic regression은 classification으로도 부르며 한 개를 선택. 비슷해 보이지만 완전히 다른 개념. linear는 숫자로 된 값을 예측하는 것이고, logistic은 label로 된 항목을 선택하는 것이다. 전문 용어로는 regression과 classification. linear regression을 사용해서 logistic classification을 구현할 수 있기 때문에 logistic regression이라고 부르는 듯 하다.

6. 분류
binary classfication 2개 그룹, 시험 pass/non pass
multinomial classfication 다중 그룹, 시험 성적 A/B/C/D/F.
multinomial은 binary를 여러 번 사용해서 구현 가능

7. 데이터 구분
original set = training set + test set
original set = training set + validation set + test set
mnist 예제에서는 validation set까지 지정해서 구현하고 있다.

8. online learning
한 번에 학습하는 것이 아니라 일부만 갖고 학습하고, 또 일부를 추가하는 방식. mnist 예제에서 batch 크기를 정해서 일부씩 잘라서 처리하고 있다. 두 가지 중의 한 가지를 사용하면 된다.

9. mnist
The MNIST(Mixed National Institute of Standards and Technology) database is a large database of handwritten digits that is commonly used for training various image processing systems.
이미지를 처리하기 위해 opencv 모듈을 사용하는데 맥에서는 설치가 잘 되지 않음. opencv 2버전은 쉽게 되는데, 새로 나온 3버전은 잘 안됨. 성능 차이가 꽤 있음. 그런데, mnist 예제에 opencv 없어도 잘 동작함.

0. reduce_sum(a, reduction_indices=1)
첫 번째 매개변수에 대한 합계 계산. 두 번째가 없으면 전체 합계, 0을 입력하면 열 기준, 1을 입력하면 행 기준 합계 적용. Y*tf.log(hypothesis)의 결과가 어떤 매트릭스인지 파악되면, reduce_sum 함수도 쉽게 이해할 수 있음

x = [[1, 1, 1] [1, 1, 1]]

tf.reduce_sum(x)

# 6

tf.reduce_sum(x, 0)

# [2, 2, 2]

tf.reduce_sum(x, 1)

# [3, 3]

tf.reduce_sum(x, 1, keep_dims=True)

# [[3], [3]]

tf.reduce_sum(x, [0, 1])

# 6