[부스트캠프] 1주차 학습정리
1. 강의 복습내용
1. 벡터
벡터(Vector)
: 숫자를 원소로 가지는 list or array
- in 세로 : 열벡터, in 가로 : 행벡터(T첨자) (보통 numpy로 표현할 때는 행벡터로 표현)
- 벡터의 차원 : 벡터에 있는 숫자들의 개수
- 벡터는 공간에서 한 점(원점으로부터의 상대적 위치)을 나타냄
- 벡터에 숫자를 곱해주면(스칼라 곱) 길이만 변함
- 대신, 스칼라가 0보다 작을시 반대 방향으로 변함.
- 같은 모양을 가진 벡터는 덧셈, 뺄셈이 가능함
성분곱 (Hadamard Product, Element-wise product)
: 벡터 내에서 같은 위치에 있는 성분끼리의 곱셈
- numpy 내에서
*
기호를 사용하면 성분곱이 이루어짐.
I. 벡터의 노름
노름(Norm)
: 원점에서부터 거리 (와 같이 나타낸다.)
- L1 Norm (맨해튼 거리) : 벡터의 성분의 절대값들의 합
- L2 Norm (유클리드 거리): 벡터의 성분의 제곱들의 합의 제곱근
- ? 노름의 종류에 따라 기하학적 성질이 달라지기 때문에 서로 다른 노름이 존재한다.
- ex. L1 : Robust 학습, Lasso 회귀
L2 : Laplace 근사, Ridge 회귀
두 벡터 사이의 거리
: 두 벡터 사이의 거리를 계산할 때에는 벡터의 뺄셈을 이용한다.
- 벡터의 뺄셈은 교환법칙이 성립한다. ()
두 벡터 사이의 각도
: 두 벡터 사이의 거리를 L2 Norm을 통해 계산한 후, 제 2코사인 법칙을 이용한다.
- 내적(inner product) : <x,y>로 나타내며, 벡터들의 성분곱을 취한 다음 전부 더해준다.
- numpy에선
np.inner(x,y)
를 통해 내적을 구할 수 있다.
- numpy에선
II. 벡터의 내적
내적은 정사영(orthogonal projection)된 벡터의 길이와 관련이 있다.
- 내적은 두 벡터의 유사도를 측정하는 데에 사용한다.
정사영(orthogonal projection)
: proj(x)는 벡터 y로 정사영된 벡터 x의 그림자를 의미 (벡터 x의 꼭짓점에서 벡터 y로 수선의 발을 내린 지점)
- proj(x)의 길이 =
- 내적은 정사영된 길이를 벡터 y의 길이 만큼 조정한 값
2. 행렬
행렬(Matrix)
: 벡터를 원소로 가지는 2차원 배열 (numpy에선 행(row)가 기본 단위)
- n x m 행렬 : 각 행은 m개의 원소를 가지며, 행렬은 n개의 행으로 이루어져있다.
- 행(가로)을 먼저 쓰고, 열(세로)을 먼저 쓴다.
- (): 위에서부터 i번째, 왼쪽에서부터 j번째 성분)
- 전치행렬(Transposed matrix) : 행과 열의 index가 바뀐 행렬 ()
- 공간에 위치한 여러 점들을 의미
I. 행렬의 연산
행렬끼리 같은 모양을 가질시, 덧셈, 뺄셈, 성분곱을 계산할 수 있음 (벡터와 같음)
행렬 곱셈(Matrix Multiplication)
: i번째 행벡터(가로)와 j번째 열벡터(세로) 사이의 내적을 성분으로 가짐
- 교환법칙이 성립하지 않는다.
- numpy에서는
“@”
기호를 통해 연산을 수행한다.
행렬의 내적 (numpy 기준)
: np.inner
는 i번째 행 벡터와 j번째 행 벡터 사이의 내적을 성분으로 가지는 행렬을 계산. (수학적 내적X)
- 행벡터 사이의 계산을 하기 때문에, 두 행벡터의 크기가 같아야지 계산할 수 있음.
II. 역행렬
역행렬(Inverse matrix)
: A의 연산을 거꾸로 되돌리는 행렬 (행과 열 숫자가 같고, 행렬식(determinant)가 0이 아니어야 함)
- numpy에서는
np.linalg.inv(X)
를 통해 역행렬을 구할 수 있다.
유사역행렬(pseudo-inverse)/무어펜로즈(Moore-Penrose) 역행렬
: 역행렬을 계산할 수 없을 때 사용 (로 표현)
- 인 경우 : (벡터의 개수가 차원보다 큰 경우)
- ex. 선형회귀식
- 인 경우 : (벡터의 차원이 개수보다 큰 경우)
- ex. 연립방정식
- numpy에서는
np.linalg.pinv(X)
를 통해 유사역행렬을 구할 수 있다.
3. 경사하강법
import sympy as sym # symbolic python : 다항식 처리할 때 사용
from sympy.abc import x # abc : 기호를 가져올 때 사용
sym.diff (sym.poly(x**3 +3*x + 3), x)) # x에 관한 다항식에 대한 미분 값을 구함.
>> Poly(3*x**2 + 3, x, domain = “ZZ”)
- x라는 점에서 함수값을 증가시키고 싶으면 미분값을 더하고, 감소시키고 싶으면 빼면 된다.
- 미분값이 음수일 때, 미분값을 더해주면 뺄셈이 되기 때문에 왼쪽으로 간다 (함수 값이 증가)
- 미분값이 양수일 때, 미분값을 더해주면 덧셈이 되기 때문에 오른쪽으로 간다 (함수 값이 증가)
경사상승법(Gradient ascent) / 경사하강법(Gradient descent)
: 미분값을 더해(빼)주는 것으로 주어진 함수의 극댓값(극소값)을 구해 목적함수를 최대화(최소화)시키고 싶을 때 사용
- 극값에 도달하면 미분값이 0이 되기 때문에 최적화가 종료된다.
I. 변수가 벡터일 때의 경사하강법
그레디언트 벡터(gradient vector)
: 각 변수 별로 편미분을 계산한 값. (역삼각형 기호는 Nabla라고 읽는다.)
- 그레디언트 벡터를 사용하면 벡터 x를 동시에 업데이트 할 수 있음.
- 종료조건을 설정할 때, 그래디언트의 절대값 대신에 Norm을 사용한다.
II. 경사하강법으로 선형회귀분석
선형회귀식 (이를 최소화해야 함)
선형회귀식의 그래디언트 벡터
- n개의 데이터를 가지고 있기 때문에, 평균값을 취하기 위해 n으로 나눈 후에 제곱근을 구한다.
경사하강법 알고리즘
- 경사하강법은 (1) 미분가능하고 (2) 볼록한 함수에 대해선 수렴이 보장됨.
- 그러나 비선형회귀 문제에는 (2) 볼록하지 않기 때문에 수렴이 보장되지 않는다.
III. 확률적 경사하강법 (Stochastic gradient descent)
확률적 경사하강법:
데이터를 전부가 아닌 일부만 활용하여 업데이트하는 방법
- 볼록하지 않은 함수에 대해서도 최적화가 가능하다.
- 확률적으로 개의 데이터를 사용하기 떄문에, 매 번 목적식의 모양이 변화하기 때문.
- 개의 데이터가 아닌 일부()개만 사용하기 때문에, 연산량이 으로 감소한다.
- 데이터를 일부만 사용하기 때문에 메모리부족 문제를 해결할 수 있다.
4. 딥러닝 학습방법
Softmax(o)
: 모델의 출력을 확률로 해석할 수 있게 변환해주는 연산
- overflow를 예방하기 위해, 각 값에 max값을 빼도 연산은 동일하게 일어난다.
- 학습에는 softmax를 사용하지만, 추론 시에는 사용하지 않는다.
활성 함수 (activation function)
: 선형 모델의 출력물을 비선형으로 만들기 위한 함수 (input: 실수, output: 실수)
- 활성함수를 사용하지 않으면 선형 모형과 다를 것이 없다.
- sigmoid(x)= (0부터 1까지 (0,0.5) 대칭)
- tanh(x)= (-1부터 1까지 원점대칭)
- ReLU(x)=max[0,x]
- 신경망은 선형모델과 활성함수를 합성한 함수이다.
Universal approximation theorem
: 2-layer 신경망으로 임의의 연속함수를 근사할 수 있음.
- 그러나 층이 깊을수록, 필요한 뉴런의 숫자가 감소하기 때문에 보다 효율적이다. (층을 여러 개 쌓는 이유)
- 층이 깊을수록 학습이 어려움.
역전파 (back propagation)
: 손실함수를 각각의 weight로 미분하여 값들을 업데이트하는 것
2층 신경망을 가정
5. 확률론
기계학습에선 손실함수의 작동원리를 이해하기 위해 확률론을 사용한다.
이산형 확률변수 (Discrete)
: 확률변수가 가질 수 있는 경우의 수를 고려하여, 확률을 더해서 모델링
연속형 확률변수 (continuous)
: 데이터 공간에 정의된 확률의 밀도 위에서의 적분을 통해 모델링
결합분포 (Joint distribution)
: 확률 변수가 복수 개일 때, 이들을 함 께 고려하는 확률분포 (eg. )
- 원래 확률분포 D를 모델링할 수 있음.
주변확률분포 (marginal distribution)
: 결합분포에서 특정 확률변수의 영향을 배제했을 때의 확률분포(?)
조건부확률분포
: 조건이 주어졌을 때의 확률분포
- P(x|y) : y의 값이 주어졌을 때 x의 확률분포 (입력 x와 출력 y 사이의 관계를 모델링)
- P(y|x) : x의 값이 주어졌을 때, 정답이 y일 확률(or 밀도 if 연속확률분포)
- 회귀 문제에서는 조건부기대값(E(y|x))을 사용.
기대값
: 데이터를 대표하는 통계량
- 기대값을 통해 분산(Variance), 첨도(Skewness), 공분산(Covariance) 등 다양한 통계량을 계산할 수 있음.
몬테카를로 샘플링 (Monte Carlo Sampling)
: 데이터의 확률분포를 명시적으로 알 수 없을 때 데이터를 샘플링하는 방법 (이산형, 연속형 상관 X)
- 독립추출이 보장된다면, 대수의 법칙에 의해 수렴성을 보장한다.
6. 통계학
통계적 모델링
: 적절한 가정 위에서 확률분포를 추정하는 것.
-
그러나 유한한 데이터로는 모집단의 분포를 알 수 없기 때문에, 근사적으로 확률분포를 추정할 수밖에 없음.
-
모수적 방법론: 데이터가 특정분포를 따른다고 가정(데이터의 모양을 관찰)한 후, 분포를 결정하는 모수(parameter)를 추정하는 방법 (비모수적 방법론)
I. 모수 추정
데이터의 확률분포를 가정했다면, 모수를 추정할 수 있음. (모수적 방법론)
- 정규분포의 모수 : 평균, 분산(불편추정량을 구하기 위해 n이 아닌 n-1로 나눔)
- E(표본평균) = 평균, E(표본분산) = 분산
표집분포(Sampling distribution)
: 통계량(표본평균과 표본분산)의 확률분포
- 표본평균의 표집분포는 N이 커질수록, 정규분표를 따르게 된다. (중심극한정리)
최대가능도 추정법(MLE ; Maximul likelihood extimation)
: 이론적으로 가장 가능성이 높은 모수를 추정하는 방법 중 하나
- 모수 theta를 따르는 분포가 x를 관찰할 가능성 (다 더했을 때 1이 되지 않기 때문에 확률 X; 대소비교용)
- 불편추정량을 보장하지 않음
- 데이터 집합 X가 독립적으로 추출되었을 때의 로그가능도를 최적화
- 로그를 씌우는 이유?
- 데이터가 많은 경우, 컴퓨터의 정확도로 가능도를 계산하는 것이 불가능
- 로그를 씌우면 곱셈을 덧셈으로 바꿀 수 있기 때문에 연산이 가능해짐
- 미분 연산을 사용할 때 연산량을 줄어줌.
II. 확률분포의 거리
손실함수는 주로 모델이 학습하는 확률분포와 데이터에서 관찰되는 확률분포의 거리를 통해 유도된다.
쿨백-라이블러 발산(KL Divergence)
- 첫번째 항을 크로스 엔트로피(cross entropy), 두 번째 항을 엔트로피(Entropy)라고 부른다.
- 정답 레이블을 P, 모델 예측을 Q라 두었을 때, MSE는 KL을 최소화하는 것과 같다.
7. 베이즈 통계학
베이즈 정리는 데이터가 추가할 때 업데이트하는 방법에 대한 기반을 제공한다.
베이즈 정리
A를 관찰하는 데이터, B를 모수(or 가정)이라고 가정해보자.
- P(B|A) : 사후확률(Posterior); 데이터가 주어져있을 때, 가정이 성립할 확률
- P(B) : 사전확률(prior); 데이터가 주어져있지 않을 때, 가정이 성립할 확률
- P(A|B) : 가능도(likelihood); 현재 주어진 모수에서 데이터가 관찰될 확률.
- P(A) : Evidence; 데이터 자체의 분포
- 사후확률을 사전확률로 사용하는 것으로 갱신된 사후확률을 계산할 수 있음
- 조건부 확률”만”으로 인과관계(Casuality)를 추론할 수는 없다.
I. 평가 지표
Confusion Matrix
- True Positive : 관측값과 실제값이 둘 다 참인 경우
- False Positive(1종 오류) : 실제값은 거짓인데 관측값이 참인 경우
- True Negative : 관측값과 실제값이 둘 다 거짓인 경우
- False Negative(2종 오류): 관측값은 참인데 실제 값은 거짓인 경우
정밀도(Precision): TP / (TP + FP)
II. 인과관계
인과관계를 알면, 데이터 분포에 변화가 생길 때에도 안정적으로 예측할 수 있다.
- 인과관계를 알기 위해선 중첩요인(confounding factor; 복수 개의 변수에 영향을 미치는 변수)을 제거해야 한다.
8. CNN
I. Convolution 연산
고정된 크기의 Kernel에 입력벡터 상에서 움직이며 하는 연산
- Kernel의 크기에 따라 연산량을 줄일 수 있음.
- 입력 크기를 I, 커널 크기를 K라고 가정했을 때, 출력 크기는 (I-K+1)이 된다.
- 채널이 복수 개인 경우, 2D Conv를 채널 개수만큼 적용한 후 합한다.
- 출력의 채널을 늘리고 싶은 경우, 커널의 개수를 늘린다.
II. Convolution 연산의 역전파
Convolution 연산은 미분을 해도 Convolution 연산이 나온다.
9. RNN
시퀀스 데이터(Sequence data)
: 순차적으로 들어오는 데이터 (eg. 소리, 문자열, 주가 등)
- 독립동등분포(i.i.d) 가정을 자주 위배하기 때문에, 정보의 순서가 중요하다.
- 과거의 데이터를 바탕으로 특정 시점의 데이터의 확률분포를 다루기 때문에 조건부 확률을 이용할 수 있음
- 그러나 표기와는 다르게, 모든 과거의 정보들이 필요한 것은 아님.
자기회귀모델 (AutoRegressive Model)
: 고정된 길이만큼의 시퀀스만 활용하는 모델
- 잠재자기회귀모델
: 바로 직전의 정보를 제외한 나머지 정보들을 로 인코딩하는 모델 (길이가 고정적이나, 인코딩 방식을 결정하는 문제가 있음)
I. 기본적인 RNN 구조
MLP 모형에 가 추가된 형태
- : 바로 직전의 잠재변수
- : 바로 직전의 잠재변수에 곱해지는 가중치 (W는 t에 독립적임)
- 시퀀스의 길이가 길어질수록, 역전파 시 기울기가 0으로 수렴하거나 무한으로 발산할 수가 있다.
Truncated BPTT (Back-Propagation thorugh Time)
: 기울기소실 문제를 해결하기 위해 시퀀스의 길이를 제한하는 것.
- eg. 특정 시점이후 잠재변수의 그래디언트는 받지 않고, 출력의 그래디언트만 받아서 업데이트
- cf. 기울기 소실 문제를 해결하기 위해 LSTM, GRU 등의 모델이 개발됨.
2. 과제 수행과정 / 결과물 정리
과제는 총 다섯 개가 주어졌으며, 네 번째 과제까지는 무난하게 풀 수 있었으나 다섯 번째 과제에서 정규식을 다루는 능력을 요구하였다.
compile()
andmatch()
import re
text = "abcd1234^.,!"
text2 = "1234abcd1234^.,!"
com = re.compile("[a-zA-Z]")
r1 = com.match(text)
r2 = com.match(text2)
print(r1)
print(r2)
'''
>> result:
<re.Match object; span=(0, 1), match='a'>
None
'''
re.compile()
은 정규식을 작성하는 코드이다. 본 코드에서는 정규식 "[a-zA-Z]"를 넘겨주는 것으로 알파벳을 찾고자 한다.
re.match()
는 문자열을 처음부터 탐색하여 문자열이 정규식과 일치하는지 알려주는 함수이다.
r1
의 경우,text
의 첫 번째 글자인 "a"가 알파벳이기 때문에 "a"의 위치를 반환한다.r2
의 경우,text2
의 첫 번째 글자가 숫자기 때문에 탐색을 종료하고 아무 것도 반환하지 않는다.
그러나 text2에도 알파벳이 있기 때문에 r2
의 결과값이 None
이라는 사실은 받아들이기 어렵다. 그렇다면 어떻게 해야할까?
search()
import re
text = "abcd1234^.,!"
text2 = "1234abcd1234^.,!"
com = re.compile("[a-zA-Z]")
r1 = com.search(text)
r2 = com.search(text2)
print(r1)
print(r2)
'''
>> result:
<re.Match object; span=(0, 1), match='a'>
<re.Match object; span=(4, 5), match='a'>
'''
re.search()
는 문자열을 처음부터 탐색하는 것이 아니라 문자열 전체를 탐색한다. 따라서 문자열 전체에 정규식에 해당하는 글자가 있다면 이의 위치를 반환해준다.
sub()
import re
text = "abcd1234^.,!"
text2 = "1234abcd1234^.,!"
com1 = re.sub("[a-zA-Z]","",text)
com2 = re.sub("[a-zA-Z]","-",text2)
print(com1)
print(com2)
'''
>> result:
1234^.,!
1234----1234^.,!
'''
sub()
는 sub(정규식, 치환할 문자, 문자열)
의 형태로 구성된다.
com1
은 text에서 알파벳을 빈칸으로 치환하여 반환한다.com2
은 text에서 알파벳을 하이픈(-)으로 치환하여 반환한다.
그리고 나는 문득 텍스트에서 ^
과 .
를 지우고 싶었고 다음과 같은 코드를 실행하였다.
import re
text = "abcd1234^.,!"
com1 = re.sub("[^.]","",text)
print(com1)
'''
>> result:
.
'''
코드 실행 결과, .
을 제외한 모든 문자가 제거되었다. 이는 ^
가 부정의 의미를 나타내기 때문이다.
즉, re.sub("[^.]","",text)
는 .
과 ^
를 지우는 것이 아니라, .
이 아닌 모든 문자를 지우라는 의미가 된다.
고로 코드는 다음과 같이 수정되어야 한다.
import re
text = "abcd1234^.,!"
com1 = re.sub("[\^.]","",text) # '\'추가
print(com1)
'''
>> result:
abcd1234,!
'''
\
는 특수한 역할을 하는 문자의 역할을 지운다. 이를 이스케이프 문자(escape character)라고 한다.
- 괄호 내에서 특수한 역할을 하는 문자는
\
,^
,-
,]
네 개로, 정규식에 위 문자들을 사용하기 위해선\
를 꼭 사용해주어야 한다.
3. 피어 세션 정리
피어세션 때는 강의를 요약하는 시간을 가졌다.
그러나 (1) 강의를 요약하는 시간이 너무 오래걸린다는 것과 (2) 곧 있을 competition을 준비한다는 명목으로, (1) 알고리즘 문제 풀이와 (2) Kaggle 코드 공유 시간을 가지는 것으로 합의되었다.
따라서 2주차부터는 알고리즘 문제를 풀거나 Kaggle 문제를 풀 때 배운 점을 중심으로 피어세션 파트를 전개하고자 한다.
4. 학습 회고
시간이 굉장히 많이 모자랐다. 시간 분배를 좀 더 철저히 해야겠다는 생각을 했다.
- 금요일에는 주간학습을 정리해야 하기 때문에 목요일까지 모든 학습을 완료한다.
- 과제와 문제는 그 날에 바로 풀 수 있도록 한다.
Author And Source
이 문제에 관하여([부스트캠프] 1주차 학습정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@veonico/부스트캠프-1주차-학습정리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)