1. 광고 클릭률 예측의 개요

2. 범주형 특징을 수치형으로 변환: 원-핫 인코딩과 순서 인코딩

    2.1. 로지스틱 회귀를 이용한 데이터 분류

    2.2. 로지스틱 함수 시작하기

    2.3. 로지스틱 함수와 로지스틱 회귀

3. 로지스틱 회귀 모델 훈련

    3.1. 경사하강법을 이용한 로지스틱 회귀 모델 훈련

    3.2. 경사하강법 기반의 로지스틱 회귀를 이용한 광고 클릭률 예측

    3.3. 확률적 경사하강법을 이용한 로지스틱 회귀 모델 학습

    3.4. 정규화를 통한 로지스틱 회귀 모델 학습

    3.5. L1 정규화를 통한 특징 선택

4. 온라인 학습을 통한 대규모 데이터셋 훈련

5. 다중 클래스 분류

6. 텐서플로를 이용한 로지스틱 회귀 구현

7. 랜덤 포레스트를 이용한 특징 선택


1. 광고 클릭률 예측의 개요

온라인 디스플레이 광고는 텍스트, 이미지, 플래시로 구성하는 베너 광고와,

오디오, 비디어와 같은 리치 미디어(Rich Media)를 포함한 다양한 형식으로 전달한다.

 

이 온라인 디스플레이 광고는 머신 러닝을 활용하기 좋은 예 중 하나이다

특정 연령대 소비자가 제품에 관심을 가진 가능성, 특정 가계소득 고객이 광고 시청 후 제품을 구매할 가능성,

스포츠 사이트를 자주 방문하는 방문자가 광고 시청에 시간을 할애할 가능성 등이 해당한다.

광고의 효과를 측정하는 가장 일반적인 방법은 클릭률(CTR; Click Through Rate)이다.

 └ 클릭률 : 전체 조회수 대비 특정 광고를 클릭하는 비율

 

클릭률 예측은, 특정 광고를 특정 사용자가 클릭할지 여부를 이진 분류한다. 주로 3가지 특징을 이용한다.

ㆍ 광고 콘텐츠와 정보(범주, 위치, 텍스트, 형식 등)

ㆍ 페이지 내용과 게시자 정부(범주, 컨텍스트(문맥), 도메인 등)

ㆍ 사용자 정보(나이, 성별, 위치, 소득, 관심사, 검색 기록, 인터넷 사용 기록, 사용 기기 등)

 

훈련과 예측을 위한 광고 샘플

위의 표에서 볼 수 있듯이 특징들은 대부분 범주형 데이터이다.

하지만 실제(현실 세계) 데이터는 수치형이거나 범주형일 수 있는데, 이 변화는 다음 목차에서 살펴본다.

본 글에서는 로지스틱이 무엇인지, SGD는 무엇인지, 정규화, 그리고 예시들을 살펴본다.

 

2. 범주형 특징을 수치형으로 변환: 원-핫 인코딩과 순서 인코딩

    2.1. 로지스틱 회귀를 이용한 데이터 분류

원-핫 인코딩의 예시

k개의 가능한 값을 갖는 범주형 특징을 변환하는 가장 간단한 방법은 매핑이다.

예를 들어 [생물, 지리, 지리, 과학, 생물, 생물, 과학]은 [1, 2, 2, 3, 1, 1, 3]에 대응한다.

하지만 이때 과학이 생물보다 크고, 지리에 더 가깝다는 '순서(Ordinal) 속성'이 생긴다.

이러한 방식을 '순서 인코딩(Ordinal Encoding)'이라고 한다.

 

순서 인코딩이 아닌 원-핫 인코딩(One-Hot Encoding)을 하면 범주형 특징을 수치형 특징으로 변환할 수 있다.

그러면 범주형 특징에 제한받지 않고, 트리 기반 알고리즘에 적용할 수 있다. 

 

사이킷런의 OneHotEncoder를 이용해 문자열 행렬을 이진 행렬로 변환한다.

이때 효율적인 변환을 위해 DictVectorizer 모듈을 사용한다. 사전 객체를 원-핫 인코딩된 벡터로 변환해준다.

 

결과(print(X_encoded))는 위의 매핑 결과에 따라 변환이 되었음을 알 수 있다.

이러한 특징으로 결괏값에서 원래 특징으로 역변환도 가능하다.

한 가지 유의할 점은, 새로운 데이터에서 보지 못한 새로운 범주를 발견하면 이를 무시해야 한다는 것이다.

OneHotEncoder에서 ignore 매개변수를 지정하면 DictVertorizer가 자동으로 처리해준다.

 

대ㆍ중ㆍ소 혹은 호ㆍ불호같은 경우, 순서 인코딩을 사용하는 게 좋을 때도 있다.

이런 특징들은 학습할 때, 순서나 순위(ranking) 지식을 사용해야 하기 때문이다.

이러한 코딩은 pandas 라이브러리로 구현할 수 있다.

 

    2.2. 로지스틱 함수 시작하기

로지스틱 함수(Logistic Function) = sigmoid function

로지스틱 회귀는 기본적으로 수치형 특징만을 다루는 분류기이다.

위는 로지스틱 알고리즘의 핵심 함수인 '로지스틱 함수(Logistic function)'이다.

일반적으로는 시그모이드 함수(sigmoid function)이라고도 부른다.

S자 곡선을 통해 입력이 클수록 출력은 1에, 입력이 작을수록 출력은 0에 가까워진다.

 

    2.3. 로지스틱 함수와 로지스틱 회귀

로지스틱 회귀에서 함수 입력 z는 특징의 가중치 합이 된다.

n개의 특징(x1, x2, ..., xn)을 가진 데이터 샘플 x의 가중치가 주여졌을 때, z는 위의 식처럼 표현한다.

 └ x는 특징 벡터를, w는 벡터를 나타낸다.

 └ x = (x1, x2, ..., xn), w는 벡터 (w1, w2, ..., wn)으로 나타낸다.

 └ 가중치(Weight)는 계수(Coefficient)라고도 한다.

만약 절편(w0)이 있는 경우, 선형 관계식은 위의 식처럼 바뀐다.

 └ 절편은 편향(bias)라고도 한다.

 

알고리즘에서 출력 y(z)는 0에서 1 사이의 범위를 갖는다.

이는 목표가 1 또는 양성 클래스일 확률이 된다.

따라서 로지스틱 회귀는 나이브 베이즈 분류기와 유사한 확률적 분류기라고 할 수 있다.

 

양성 샘플은 가능한 1에 가깝게 예측하고 음성 샘플은 가능한 0에 가깝게 예측하도록 학습한다.

수학적 언어로는 '평균제곱오차'로 정의하는 비용을 최소화하도록 가중치를 훈련한다고 볼 수 있다.

 └ 평균 제곱 오차  :참값과 예측값 차이의 제곱에 대한 평균으로 계산하는 식

 

m개의 훈련 샘플 (x1, y1), (x2, y2), ..., (xi, yi), ..., (xm, ym)이 있다고 하자.

여기서 yi가 1 또는 0을 가질 때, 최적화할 가중치에 대한 비용 함수 J(w)는 위와 같이 표현한다.

 └ 비용 함수(cost function) : 예측값과 실젯값 사이의 오차를 계산하는 함수

이 비용 함수는 볼록하지 않으므로, 많은 국소 최적이 발견되고, 함수가 전역 최적값으로 수렴하지 못할 수 있다.

 

볼록(convex)과 비볼록(non-convex) 함수의 예시

볼록(convex)과 비볼록(non-convex) 함수 그래프 예시는 위와 같다.

볼록 함수 에서는 전역 최적값이 하나뿐이지만, 비볼록 함수에서는 최적값이 2개라고 볼 수 있다.

이러한 문제가 있기에 실제 비용 함수 J(w)는 다음과 같이 정의한다.

 

실제 정의한 비용 함수 J(w)
비용 함수에서 하나의 훈련 샘플 비용의 예시

정답 yi가 1일 때, 모델이 완벽하게 예측하면 샘플 비용 j는 0이 나온다.

비용 j는 예측 확률이 감소함에 따라 증가하다가, 양성 클래스(1)일 가능성이 없다고 판단하면 무한히 커진다.

 

y = 1일 때 로지스틱 회귀의 비용 함수(왼쪽), y = 0일 때 로지스틱 회귀의 비용 함수(오른쪽)

위의 상황, 즉 y의 값에 따른 비용 함수 그래프를 그리면 위와 같다.

로지스틱 회귀에서 사용하는 대체 비용 함수를 최소화하는 문제는, 실제 MSE 기반 비용 함수를 최소화하는 것과 같다.

MSE 대신 이 로지스틱 회귀의 비용 함수를 선택할 때의 이점은 다음과 같다.

ㆍ 볼록 함수이기에 최적의 모델 가중치를 찾을 수 있다.

ㆍ 가중치에 대한 예측값 또는 도함수를 간단하게 계산할 수 있다.

참고로 J(w)에는 로그(log) 함수가 있는데, 로그 함수로 인한 비용 함수를 '로그 손실(Logarithmic loss)'이라고 한다.

 

3. 로지스틱 회귀 모델 훈련

    3.1. 경사하강법을 이용한 로지스틱 회귀 모델 훈련

J(w)가 최소화하도록 하는 최적의 w를 얻는 방법을 구해야 한다.

이는 '경사하강법(gradient descent)'을 통해 구할 수 있다.

 └ 가장 가파른 하강법(steepest descent)라고도 한다.

 

학습률 식

경사하강법은 1차 반복 최적화(first-order iterative optimization)를 통해, 목적 함수를 최소화하는 절차이다.

반복할 때마다 현재 지점에서, 목적 지점의 음의 도함수에 비례하는 만큼 이동한다.

이 비율을 학습률(learning rate) 또는 단계 크기(step size)라고 하는데 식은 위와 같다.

좌변의 w는 훈련 후의 가중치 벡터이고, 우변의 w는 이동 전의 가중치 벡터이다.

η는 학습률이고 Δw는 기울기(1차 도함수)를 나타낸다.

 

기울기(도함수) 식
학습률에 기울기(도함수)를 적용한 식

J(w) = MSE 식을 미분 후 일반화하면 위와 같은 Δw 식이 나오는데, 이를 학습률 식에 대입한다.

그 후 w를 반복할 때마다 업데이트하는 과정을 거친다.

 

결정 임곗값의 기본값은 0.5지만, 다른 값으로 설정할 수 있다.

예를 들어 화재 경보를 예측할 때 거짓 음성(false negative)을 피하고자 한다면, 임곗값을 낮게 설정하면 된다.

다른 예로 품질 보증을 위해 양품을 예측할 때 거짓 음성(false negative)을 피하고자 한다면, 기준에 따라 설정하면 된다.

 

위에서 정리한 식들을 기반으로 로지스틱 회귀 알고리즘을 구현한다.

ㆍ compute_prediction() : 현재 가중치로 예측값 y(x)을 계산하는 함수

ㆍ update_weights_gd() : 경사하강법으로 가중치를 업데이트하는 함수

ㆍ compute_cost() : 비용 J(w)를 계산하는 함수

ㆍ train_logistic_regression() : 위에서 구현한 함수를 통합한 모델 훈련 함수

ㆍ predict() : 새로운 입력에 대한 결과를 예측하는 함수

 

    3.2. 경사하강법 기반의 로지스틱 회귀를 이용한 광고 클릭률 예측

샘플 10,000개를 편향있는 로지스틱 회귀 모델을 0.01의 학습률로 max_iter = 10000번 훈련한다.

이때 모델 최적화에 걸린 시간은 232초가 소요된다.

만일 100,000개의 훈련 샘플로 이 과정을 진행했다면, 5240초(약 1시간 20분)가 소요된다.

 

로지스틱 회귀 분류기는 대규모 데이터셋에 유용하다.

하지만 테스트 결과만을 살펴본다면 모순되는 상황이다. 이에 대한 효율적 처리는 다음 목차에서 설명한다.

 

    3.3. 확률적 경사하강법을 이용한 로지스틱 회귀 모델 학습

경사하강법 기반의 로지스틱 회귀 모델에서는 가중치 업데이틀 위해 모든 훈련 샘플을 사용한다.

따라서 훈련 샘플 수가 많아지면 전체 훈련 과정 시간이 오래 걸리고, 계산 비용이 많이 든다.

 

SGD 가중치 계산 식

각 가중치를 업데이트할 때 전체 훈련셋 대신 단 하나의 훈련 샘플만을 사용하는 쪽으로 수정하면 된다.

하나의 훈련 샘플로 계산한 오차를 기반으로 모델을 한 단계 이동하고, 모든 샘플을 사용하면 한 번 반복이 완료된다.

이런 방식을 '확률적 경사하강법(SGD; Stochastic Gradient Descnet)'이라고 한다.

SGD는 일반 경사하강법보다 훨씬 빠르게 수렴한다.

 

SGD를 사용하기 위해서는 update_weights_gd()와 train_logistic_regression() 함수를 약간만 수정하면 된다.

수정 후 100,000개의 훈련 샘플을 학습률 0.01로 10번 반복한다면, 40초만에 작업이 끝난다.

 

사이킷런의 SGDClassifier 모듈을 이용해서도 구현이 가능하다.

ㆍ loss 매개변수에 대한 log는 비용 함수가 로그 손실임을 나타낸다.

ㆍ penalty 매개변수는 과적합을 줄이기 위한 정규화 항을 나타낸다.

ㆍ max_iter 매개변수는 최대 반복 횟수를 나타낸다.

ㆍ learning_rate 매개변수의 기본값을 optimal로, 업데이트를 진행할수록 학습률이 약간 감소한다.

     └ 이 방법은 대규모 데이터셋에서 최적의 솔루션을 찾을 때 조금 더 유용하다.

 

    3.4. 정규화를 통한 로지스틱 회귀 모델 학습

SGDClassifier의 penalty 매개변수는 모델 '정규화'와 관련이 있다.

정규화에는 L1과 L2의 두 가지 기본 형식이 있는데, 둘 다 원래의 비용 함수에 추가하는 항이다.

 └ L1 정규화는 라소(Lasso)라고 한다.

 └ L2 정규화는 리지(Ridge)라고 한다.

 

L1 정규화 식

가장 우측에 있는 α는 정규화 항에 곱하는 상수이고, q는 1 또는 2인데 각각 L1과 L2 정규화를 나타낸다.

로지스틱 회귀 모델을 훈련하는 것은 비용(오차 = 가중치 w의 함수)을 줄여나가는 과정이다.

만약 wi, wj, wk와 같은 일부 가중치가 상당히 커지면, 이런 가중치가 전체 비용을 좌우한다.

이를 위해 정규화라는 과정이 존재한다. 즉, 정규화는 과적합을 없애주는 과정이다.

 

매개변수 α는 로그 손실과 일반화 간의 균형을 잡아준다.

α가 너무 작으면 큰 가중치를 줄일 수 없고 모델의 분산이 커지거나 과적합이 발생한다. = 과잉적합 문제

α가 너무 크면 모델이 과도하게 일반화되어 데이터를 제대로 fitting할 수 없어 성능이 저하한다. = 과소적합 문제

α는 정규화를 통해 최상의 로지스틱 회귀 모델을 얻을 때 조정하는 중요한 매개변수이다.

 

L1과 L2 정규화를 선택하는 차이는 '특징 선택'과 관련있다.

머신 러닝 '분류'에서 '특징 선택'은 더 나은 모델 구성에 중요한 특징의 부분집합을 선택하는 과정이다.

실제 데이터 특징 중 일부는 중복되거나, 관련이 없으므로 샘플을 구별하는데 유용하지 않다.

따라서 이런 특징들은 거의 손실 없이 버릴 수 있다.

결론적으로 로지스틱 회귀 분류기에서는 L1 정규화를 통해서만 특징 선택을 할 수 있다.

 

L1 정규화와 L2 정규화의 차이

가중치 벡터 w1 = (1, 0)과 가중치 벡터 w2 = (0.5, 0.5)가 있다고 가정해보자.

두 벡터의 로그 손실이 동일할 때, 각 가중치 벡터의 L1, L2 정규화 항은 위와 같다.

두 벡터의 L1 항은 동일하지만 L2 항은 값이 다르다.

L1 정규화는 상당히 작거나 큰 가중치도 일부 허용하여 계산할 수 있다(L2 정규화는 그렇지 않다).

이는 곧 L1 정규화는 특징을 선택할 수 있다는 의미이고, 일부 가중치를 0에 가깝거나 0이 되도록 줄여줄 수 있다는 뜻이다.

 

사이킷런에서 정규화 유형은 penalty 매개변수로 none, l1, l2, elasticnet(혼합) 중 선택할 수 있다.

정규화 항에 곱해주는 상수 α는 alpha 매개변수로 지정할 수 있다.

 

    3.5. L1 정규화를 통한 특징 선택

특징 선택을 위한 L1 정규화를 검토한다.

L1 정규화를 통해 SGD 로지스틱 회귀 모델을 초기화하고, 10000개 샘플로 모델을 훈련한다.

 

훈련한 모델을 이용해서 계수의 절댓값을 구한다.

 

크기순으로 하위 10개 계수와, 그에 해당하는 값들을 출력한다.

 

하위 10가지 특징들이 무엇인지 출력하여 확인하는 코드이다.

예를 들어 X_train 0열의 1001, 8열의 851897aa 등이다.

 

마찬가지로 상위 10개 계수와 그에 해당하는 값을 구하는 코드이다.

예를 들면 X_train 7열의 cef3e649, 3열의 7687a86e 등이다.

 

4. 온라인 학습을 통한 대규모 데이터셋 훈련

온라인 학습과 오프라인 학습 비교

300,000개 이하의 샘플에 관해 모델을 훈련했지만, 이보다 수가 많아지면 메모리 부족이 발생할 수 있다.

그 이상의 샘플을 훈련하기 위해서는 '온라인 학습(Online Learning)'을 통해 대규모 데이터셋을 학습해야 한다.

 

한 번에 전체 훈련셋을 사용하는 경사하강법과 달리, SGD는 개별 훈련 샘플로 모델을 순차적으로 업데이트한다.

한 번에 모든 데이터가 제공되는 오프라인과 달리, 온라인에서는 데이터가 순차적 혹은 실시간으로 제공된다.

훈련할 때 한 번에 작은 크기의 샘플을 로드하고 전처리하기 때문에, 메모리가 적게 든다.

온라인 학습은 계산이 효율적일 뿐만 아니라, 실시간 데이터 처리도 가능하고 최신 모델 유지도 가능하다.

 

오프라인 학습에서는 이전 데이터셋과 최근 데이터셋을 함께 사용하여 처음부터 다시 개발해야만 한다.

하지만 온라인 학습에서는 가장 최근의 가용 데이터셋만으로도 업데이트가 가능하다.

사이킷런의 SGDClaffifier 모듈은 partial_fit 방법으로 온라인 학습을 구현한다.

 

5. 다중 클래스 분류

앞서 설명한 모든 내용은 로지스틱 회귀를 이진 분류에 적용한 설명이다.

그렇다면 다중 클래스의 경우에도 적용 가능할까? 라는 의문이 생긴다. 물론 가능하다.

두 개 이상의 클래스에 대한 로지스틱 회귀를 '다항 로지스틱 회귀(Multinomial Logistic Regression)'라고 한다.

이는 '소프트맥스 회귀(Softmax Regression)'라고도 부른다.

 

이진 분류의 로지스틱 회귀

앞서 이야기했듯, 이진 분류에서 목표가 1일 확률 또는 양성 클래스일 확률은 위와 같다.

 

다중 클래스의 로지스틱 회귀

K개 클래스에 대한 모델은 K개의 가중치 벡터(w1, w2, ..., wk)로 표현한다.

이때 목표가 클래스 k일 확률은 위와 같다.

이때 분모항은 확률값 yk(k의 범위는 1에서 K)의 합이 1이 되도록 정규화한다.

 

이진 클래스의 비용 함수
다중 클래스의 비용 함수

위의 식은 3.4 목차에서 언급한 이진 클래스의 비용 함수이다.

아래 식은 다중 클래스의 비용 함수이다.

1{y^(i) = j} 함수 부분에서 y^(i) = j가 참인 경우에 1이고, 그렇지 않으면 0이다.

 

비용 함수를 정의하면 이진 사례에서 Δw를 유도한 것과 같은 방식으로 j 가중치 벡터에 대한 Δwj를 구한다.

 

유사한 방식으로 매 반복마다 모든 K 가중치 벡터를 업데이트한다.

충분히 반복한 후에, 학습한 가중치 벡터 w1, w2, ..., wk는 위의 방정식을 통해 새로운 샘플 x`를 분류할 때 사용한다.

 

6. 텐서플로를 이용한 로지스틱 회귀 구현

300,000개 샘플 중 90%는 훈련에, 10%는 테스트에 사용한다.

텐서플로를 import하고, X_train, Y_train 등의 데이터 샘플을 float32로 캐스팅(cast)한다.

하나의 샘플이나 전체 훈련셋 대신 '하나의 샘플 배치(one batch)'만을 사용해서 가중치를 업데이트 한다.

이 예제에서 배치 크기는 1000이다.

그후 현재 예측, 비용, 기울기, 계수 등을 계산하여 (6000 단계의 )훈련을 실시한다.

모델 훈련 중 500 단계마다 성능을 확인하고, 최종 훈련 후 테스트셋을 예측하고 AUC 지표를 계산한다.

 

7. 랜덤 포레스트를 이용한 특징 선택

L1 정규화 로지스틱 회귀로 특징을 선택하는 방법을 앞에서 살펴보았다.

중요하지 않은 특징의 가중치는 0에 가깝게 줄어들거나 0이 된다.

L1 정규화 로지스틱 회귀 외에도 특징 선택을 위해 사용하는 기술이 있는데, '랜덤 포레스트(Random Forest)'이다.

 

랜덤 포레스트는 개별 의사결정 트리의 집합이다.

각각의 트리는 각 노드에서 무작위로 선택한 특징의, 부분집합에 대해서 최상의 분할 지점을 찾는다.

의사결정 트리에서 중요한 특징만 트리 노드를 구성하는데 사용한다.

전체 트리 집합에 대해서 좀 더 자주 사용하는 트리 노드의 특징이, 더 중요한 특징이다.

즉 모든 트리에 걸쳐, 노드에서 분할에 사용하는 특징을 기준으로 중요도를 평가하고, 가장 중요한 특징을 선택할 수 있다.

 

사이킷런에서 제공하는 RandomForestClassifier 모듈에는 특징의 중요도를 나타내는 속성이 있다.

feature_importances_ 속성으로 트리 노드에서 발생하는 비율로 계산한다.

랜덤 포레스트 모델을 fitting한 후, 특징 중요도 점수를 계산한다.

 

하위 10개 특징 점수(왼쪽), 상위 10개 특징 점수(오른쪽)

각각의 코드에 따라 하위 10개, 상위 10개의 특징 점수를 출력한다.

각 특징 점수에 따른 가장 중요하지 않은 특징도 같이 살펴본다.

1. 시계열 데이터의 이해

    1.1. 시계열 데이터의 특성

    1.2. 미래 예측을 위한 데이터 준비

    1.3. 시계열 데이터 사례: 비트코인 가격

2. 순환 신경망

    2.1. 구조와 동작, 학습 알고리즘

    2.2. 선별 기억력을 갖춘 LSTM

    2.3. LSTM의 유연한 구조

3. LSTM으로 시계열 예측하기

    3.1. 단일 채널 비트코인 가격 예측

    3.2. 성능 평가

    3.3. 다중 채널 비트코인 가격 예측

4. 편곡하는 인공지능

    4.1. ABC 악보 표기

    4.2. LSTM으로 편곡

5. 자연어 처리

    5.1. 텍스트 데이터에 대한 이해

    5.2. 텍스트 데이터 사례: 영화평 데이터셋 IMDB

    5.3. 단어 임베딩

    5.4. LSTM으로 인식: 조기 멈춤 적용

    5.5. word2vec과 GloVe


1. 시계열 데이터의 이해

    1.1. 시계열 데이터의 특성

시계열 데이터 예시

시계열 데이터(時系列, Time Series)

시간 정보가 들어있는 데이터, 시간 축을 따라 신호가 변하는 동적 데이터이다.

시계열 데이터는 기존의 데이터와는 다른 독특한 특성이 있다.

ㆍ 단어(요소)가 나타나는 순서가 중요하다.

ㆍ 샘플의 길이가 다르다. ('인공지능' 발음과 '인~공~지~능~' 발음은 다른 것이다.)

ㆍ 문맥 의존성이 있다.

ㆍ 계절성이 있다. (계절에 따른 미세먼지 수치, 항공권 판매량 등)

 

시계열 데이터를 인식하는 고전 모델

ㆍ ARIMA(AutoRegressive Integrated Moving Average)

ㆍ SARIMA(Seasonal ARRIMA)

ㆍ Prophet 등

 

시계열 데이터를 인식하는 딥러닝 모델

ㆍ RNN(Recurrent Neural Network)

ㆍ LSTM(Long Short Term Memory)

 

시계열 데이터의 표현

시계열 데이터는 가변 길이이고, 벡터의 벡터이다.

매일 기온, 습도, 미세먼지 농도를 기록한다면 a1 = (23.5, 42.0, 0.1, ...), a2 = (25.5, 45.0, 0.08, ...)처럼 될 것이다.

 

    1.2. 미래 예측을 위한 데이터 준비

RNN의 구조는 여러 문제에 적용이 가능하다.

ㆍ 미래 예측(Prediction / Forecasting)

     └ 주가, 날씨, 기기 고장, 제품 가격, 수요량 등의 예측

ㆍ 언어 번역

ㆍ 음성 인식

ㆍ 생성 모델

     └ 사진을 보고 설명하는 문장을 생성하는 인공지능

 

예를 들어, 농산물 수요량 데이터를 예측한다고 해보자.

농산물 유통업자가 5년동안 매일 판매량을 기록했다면, 길이가 t = 365 * 5 = 1825인 샘플일 것이다.

하나의 긴 샘플을 가지고 '윈도우 크기(w)'로 잘라 샘플을 수집한다.

얼마나 먼 미래를 예측할지 지정하는 '수평선 계수(h)'를 정해 예측한다.

위의 예시에서는 w는 3, h는 1이다.

 

다중 품목을 표현하는 데이터(다중 채널)이다. 벡터의 벡터 구조를 갖는다.

예를 들어, 농산물 수요량에서 오이와 상추를 예측하고, w = 3, h = 1일 때 위와 같다.

 

    1.3. 시계열 데이터 사례: 비트코인 가격

코인데스크(www.coindesk.com)에서 코인 가격 데이터를 다운로드한다.

데이터는 Currency, Date, Closing Price(USD), 24h Open(USD), 24h High(USD), 24h Low(USD)의 6열이다.

 

L7 첫 번째 행을 헤더(header = 0)로 사용하는 코드이다.

L8 Closing Price 행을 취하고 numpy 배열로 변환한다.

 └ [[ ]]는 벡터의 벡터, [ ]는 벡터라는 차이가 있다. [[ ]]가 다중 채널로 확장이 쉽기 때문에 이 방법을 추천한다.

L9 앞의 5개의 샘플을 취한다.

 

2. 순환 신경망

    2.1. 구조와 동작, 학습 알고리즘

순환 신경망(RNN; Recurrent Neural Network)은 시계열 데이터를 처리하는 대표적인 신경망이다.

다층 퍼셉트론을 살짝만 고치면 RNN으로 사용 가능하다.

다층 퍼셉트론의 은닉층 노드 사이에, 순환 에지를 추가하면 RNN으로써 사용 가능하다.

가중치 집합은 다층 퍼셉트론이 {U, V}, 순환 신경망이 {U, V, W}이다.

 

펼친 순환 신경망

순환 신경망에 데이터 입력을 이해하기 쉽게 펼쳐서 그렸다.

순간마다 서로 다른 가중치를 가지는 것이 아니라, 모든 순간 {U, V, W}를 공유한다.

 

i 순간의 a_i는 가중치 U를 통해 은닉층의 상태 h_i에 영향을 미친다.

h_i는 가중치 V를 통해 출력값 o_i에 영향을 미친다.

h_i-1은 가중치 W를 통해 h_i에 영향을 미친다.

 

은닉층 계산(왼쪽), 출력층 계산(오른쪽)

Whi-1 항을 제외한다면 은닉층의 계산은 다층 퍼셉트론과 동일하다.

RNN은 이 항을 통해 이전 순간의 은닉층 상태를 현재 순간의 은닉층 상태로 전달하여, 시간성을 처리한다.

순환 신경망의 학습 알고리즘은 최적의 {U, V, W}를 알아낸다.

 └ BPTT(Back-Propagation Through Time) 알고리즘

 

 

    2.2. 선별 기억력을 갖춘 LSTM

RNN의 기억력에는 한계가 있다.

은닉층 상태를 다음 순간으로 넘기는 기능을 통해 과거를 기억하는 흉내를 낸다.

하지만 장기 문맥 의존성을 제대로 처리하지 못하는 한계가 있다.

 └ 장기 문맥 의존성 : 멀리 떨어진 요소가 밀접한 상호작용하는 현상

게속 들어오는 입력의 영향으로 한계가 짙어진다.

사람에게는 선별 기억 능력으로 오래 전 기억을 간직한다. LSTM에서는 선별 기억 능력을 참고한다.

 

RNN과 LSTM

LSTM은 게이트라는 개념으로 '선별 기억'을 확보한다(O는 열림, X는 닫힘).

게이트는 0에서 1 사이의 실숫값으로 열린 정도를 조절한다.

게이트의 여닫는 정도는 가중치로 표현하며, 가중치는 학습으로 알아낸다.

(b)의 상황을 보면 게이트를 처음과 끝을 제외하고 중간은 전부 닫아, 기억을 끝까지 끌고 간다.

 

RNN의 가중치 {U, V, W}에 4개를 추가하여 7개의 LSTM 가중치를 사용한다.

 └ LSTM의 가중치 : {U, Ui, Uo, W, Wi, Wo, V}, i는 입력 게이트, o는 출력 게이트 

 

    2.3. LSTM의 유연한 구조

단방향이 아닌 양방향으로 문맥을 살릴 필요가 있는 경우는 양방향 LSTM을 사용한다.

예시로 '잘 달리는 차를 타고, 고산지대에서 생산한 차를 따러 간다.'라는 문장이 있다고 해보자.

문장의 앞과 뒤를 보고 각각 car와 tea로 번역을 할 수 있다.

 

응용 문제에 따라서 LSTM은 다양한 구조를 유연하게 사용한다.

 

3. LSTM으로 시계열 예측하기

시계열 데이터를 보고 미래를 예측하는 프로그래밍 코드 분석 목차이다.

마찬가지로 핵심이 되는 코드와 해석만을 일부 진행한다.

3.1의 목차에서는 단일 채널로 종가만을 고려하는 프로그램이다.

3.3의 목차에서는 다중 채널로 종가, 시가, 고가, 저가를 모두 고려하는 프로그램이다.

 

    3.1. 단일 채널 비트코인 가격 예측

L25 LSTM층을 위한 함수를 불러온다.

L34 units=128로 은닉층과  x_train[0]의 입력층을 설정한다.

L35 출력층을 설정한다. activatino 매개변수를 생략하여 기본값인 선형을 사용한다.

L36 손실함수로 MAE를 사용한다.

 

    3.2. 성능 평가

평균 절댓값 오차(MAE; Mean Absolute Erro)는 스케일 문제에 대처하지 못한다.

평균 절댓값 백분율 오차(MAPE; MA Percentage E)는 스케일 문제에 대처 가능한 MAE 식의 변형이다.

 

위의 표는 MAE와 MAPE의 수식 연산 예시이다.

MAE는 값이 변하는 데에 비해 MAPE는 유지하는 모습을 볼 수 있다.

 

성능 기준으로 '등락 정확률'을 본다. 등락을 얼마나 정확하게 맞히는지를 측정한다.

맞힌 경우의 수를 전체 샘플 수로 나누어 등락 정확률을 판단한다.

 

    3.3. 다중 채널 비트코인 가격 예측

L8 (종가, 시가, 고가, 저가)를 데이터로 사용한다.

 

4. 편곡하는 인공지능

    4.1. ABC 악보 표기

인공지능의 창작 능력으로 다양한 활동이 가능하다.

Deep Dream Generator로 생성한 그림, Magenta 프로젝트의 음악 창작, 인공지능 소설 등 다양하다.

앞 소절을 보고 다음 음표를 LSTM으로 예측하는 방식의 단순한 편곡이다.

 

가장 간단한 음악 표기법인 ABC 방식으로 표기한 악보를 사용한다.

 └ ABC 표기 : C(도), D(레), ..., 라(A), 시(B) / 2(2분 음표), 4(4분 음표), 8(8분 음표)

 

    4.2. LSTM으로 편곡

ABC 표기 데이터는 2채널(계이름과 박자)이고, 분류 문제에 해당한다.

 

L62 예측이 목적이 아니고 생성이 목적이기에 전체를 훈련 집합으로 사용한다.

 

L69 원핫 코드의 길이는 21이고, 분류 문제이기에 softmax 함수를 사용한다.

 

L75 첫 소절을 지정한다.

L76 duration만큼 반복한다.

L77 직전 윈도우를 보고 다음 음표를 예측한다.

L78 가장 큰 확률을 가진 부류로 분류하고 ABC 표기로 변환하여 리스트에 추가한다.

 

67번부터 69번까지의 라인 신경망 구조는 왼쪽의 그림과 같다.

 

5. 자연어 처리

    5.1. 텍스트 데이터에 대한 이해

자연어 처리(NLP; Natual Language Processing)는 인간이 구사하는 언어를 자동으로 처리하는 인공지능 분야이다.

언어 변역, 댓글 분석, 고객 챗봇, 소설 창작 인공지능 등의 분야에서 사용할 수 있다.

 

텍스트 데이터의 가장 큰 특성은 시계열 데이터이다.

샘플마다 길이 또한 다르고 구문론과 의미론의 차이도 존재하며, 잡음이 심하고 형태소 분석이 필요하다.

언어별로 다양한 특성을 띄기도 하기에 신경망에 입력하기 위해서는 기호를 수치로 변환해야 한다.

 

하나의 말뭉치(Corpus)가 있다고 해보자.

말뭉치의 단어 수집을 진행한다. Python(3), freshman(2), loves(1), ..., is(1)

파이썬의 자료구조인 딕셔너리를 이용하여 빈도수에 따른 순위를 표현한다.

이렇게 나온 딕셔너리를 기반으로, 텍스트를 숫자 코드로 변환한다. 

 

텍스트를 숫자 코드로 변환한 값을 원-핫 코드로 표현한 것이다.

원핫 코드는 특정 데이터를 제외하고 나머지는 전부 0으로 처리하는 패딩 방식을 말한다.

이런 원핫 코드에는 문제점이 있다.

ㆍ 사전 크기가 크면 원핫 코드는 희소 벡터가 되어 메모리를 낭비한다.

ㆍ 단어 사이의 연관 관계를 반영하지 못 한다.

 

    5.2. 텍스트 데이터 사례: 영화평 데이터셋 IMDB

텐서플로가 제공하는 영화 평가 댓글 데이터셋(IMDB)이 있다.

50,000개의 댓글을 긍정과 부정 평가한 레이블링했다.

감정 분류(Sentiment Classification) 문제에 주로 사용하는 데이터셋이다.

 

다양한 토픽의 뉴스를 모아둔 Reuters 데이터셋이 있다.

로이터 통신의 뉴스 11,228개를 46개의 토픽으로 레이블링했다.

토픽 분류 문제에 주로 사용하는 데이터셋이다.

 

    5.3. 단어 임베딩

원핫코드의 몇 가지 단점을 해결하는 방안 중 하나인 '단어 임베딩(Word Embedding)'이다.

단어 임베딩이란, 단어를 저차원 공간의 벡터로 표현하는 기법이다.

 └ 보통 수백 차원을 사용하는 밀집 벡터이다.

 

원핫 코드와 단어 임베딩의 차이는 위와 같다.

 

L24 샘플의 크기를 sample_size(512)로 고정한다. 보다 작은 샘플은 pad_sequences 함수가 특수 문자로 채운다.

 

L28  Embedding 함수는 input_dim 차원을 output_dim 차원으로 축소한다.

L30 input_length * output_dim 구조의 텐서를 일렬로 펼친다.

L31 0(부정) 또는 1(긍정)로 분류하므로 출력 노드는 1개이다. 손실 함수는 이진 교차 엔트로피이다.

 

    5.4. LSTM으로 인식: 조기 멈춤 적용

조기 멈춤(Early Stopping)은 훈련 집합에 대해 덜 수렴했더라도 검증 집합에 대해 성능 개선이 없으면 학습을 마치는 전략이다.

L18 monitor='val_accuracy'로 검증 집합에 대한 정확률을 조기 멈춤 기준으로 사용한다.

L18 patience=5로 5세대 동안 성능 향상이 없으면 멈춤을 의미한다.
L18 restore_best로 가장 높은 성능을 발휘했을 때의 가중치를 취한다.

L26 validation_split = 0.2로 훈련 집합의 20%를 떼어 검증 집합으로 사용한다.

L26 callback = [early]로 콜백 함수를 통해 조기 멈춤을 적용한다.

 

LSTM에서 조기 멈춤을 적용하여 실행할 경우, 때에 따라 성능이 안 좋을 수 있다.

단어의 빈도수에 따라 분류하는 것이지만, 문장의 의미를 파악하지 못한 채 분류했기 때문에 그렇다.

문장의 의미를 이해하려면 발전한 자연어 처리 알고리즘(word2vec과 GloVe)이 필요하다.

 

    5.5. word2vec과 GloVe

Word2Vec(구글)

ㆍ 1000억 개가량의 뉴스를 모아둔 데이터셋으로 학습

ㆍ 300만 개가량의 단어를 300차원 공간에 표현

 

GloVe(스텐포드 대학)

ㆍ 위키피디아 문서 데이터를 사용하여 학습

ㆍ 40만 개가량의 단어를 50, 100, 200, 300차원 공간에 표현

 

L3 거리 계산용 함수로 사용할 distance를 호출한다.

L6 GloVe의 100차원 공간을 사용한다.

 

L15 문자열 표현을 벡터 형식으로 변환하고 딕셔너리에 저장한다.

L23 매개변수 vector와 가까운 순으로 정렬한 키를 반환하는 함수이다.

L27 'movie'와 가장 가까운 5개의 단어를 찾는다.

1. 지능 에이전트 시나리오

    1.1. 지능 에이전트란

    1.2. 라이프 사이클

2. 지능 에이전트 만들기

    2.1. 영상 바구니 만들기

    2.2. 다국어 단어 공부 1 - tkinter를 이용한 대화형 인터페이스

3. 고급 인터페이스를 갖춘 지능 에이전트

    3.1. 웹과 앱

    3.2. 로봇

4. 지식 표현과 추론

    4.1. 지식 표현 방법론

    4.2. 지식 그래프

5. 틈새 없는 협동과 능동성을 갖춘 지능 에이전트

 


1. 지능 에이전트 시나리오

    1.1. 지능 에이전트란

지능 에이전트

'에이전트(agent)'는 다양한 의미로써 불린다.

 └ 일상생활에서 특정한 일을 대행해주는 사람

 └ 컴퓨터에서 사람 대신 일을 하는 소프트웨어

 └ 어떤 효과를 내거나 낼 능력이 있는 어떤 것(something that produces or is capable of producing an effect)

 

로봇 몸과 소프트웨어가 에이전트라면, 카메라, 센서, 로봇 팔은 액추에이터(Actuator)이다.

스마트폰과 앱이 에이전트라면, 카메라, 스피커는 액추에이터(Actuator)이다.

 

이러한 에이전트에 인공지능을 추가한 것이 '지능 에이전트'이다.

지능 에이전트를 사용하기 위해서는 '지식 베이스'라는 특수한 데이터베이스가 필요하다.

 └ 지식 베이스 : 축적한 전문 지식이나 문제 해결에 필요한 사실과 규칙 등을 저장한 데이터베이스

 

    1.2. 라이프 사이클

인공지능 제품의 라이프 사이클

1단계: 문제 정의

ㆍ 비즈니스 정의: 어디까지 서비스할 것인지, 해결하려는 문제는 무엇인지 정의

ㆍ 데이터 수집: 현장을 대변하는 다양한 영상 및 이미지 수집

 

2단계: 모델 제작

ㆍ 컨볼루션 신경망, 순환 신경망, 강화 학습 등 사용 모델 결정 단계

ㆍ 모델의 구조 설계, 모델 학습, 성능 평가를 수행(교차 검증으로 성능 평가 신뢰도 확보)

 

3단계: 배포(Deploy)

ㆍ 자체 서버 사용 또는 클라우드를 이용하여 배포를 진행

ㆍ 현대에는 주로 웹/앱 인터페이스를 사용

 

위의 3단계는 순환적으로 동작한다.

운영 환경이나 사용자의 요구사항에 따라 꾸준한 업그레이드가 필요하다. (a.k.a. 나선형 모델)

 

2. 지능 에이전트 만들기

6장에서 학습한 여러 모델에 간단한 UI를 붙여 지능 에이전트로 확장하는 목차이다.

이 목차에서도 6장과 마찬가지로 일부 코드들과 설명만을 작성한다.

 

    2.1. 영상 바구니 만들기

영상 바구니 서비스 : 영상을 분류하고 분류 결과에 따라 해당 폴더에 영상을 저장하는 서비스

 

L32 배포 시 충분한 계산 자원을 사용하여 학습하는데, 이를 모방하여 epochs을 늘려서 학습을 진행한다.

L59 배포에 사용하기 위해 학습된 모델을 저장한다.

 

L6 위에서 저장한 모델을 읽어서 사용한다.

위의 코드를 실행하고 나면 우측 하단의 그래프와 같은 결과가 나온다.

INPUT으로 넣어준 각각의 사진에 대해서 10개의 분류 중 해당하는 OUTPUT(그래프)가 표현된다.

 

L6 바로 위의 코드와는 또 다른 코드로, 저장해둔 모델을 읽어들인다.

 

L24 ~ L30 test_images 밑에 class_buckets 폴더를 만들고 그 밑에 10개 부류에 해당하는 폴더를 만든다.

L32 ~ L36 인식 결과를 저장한 pred에 따라 해당 폴더에 원본 영상 저장한다.

INPUT으로 넣어준 그래프 OUPUT을 기준으로 10개의 폴더를 생성하여 분류한다.

 

마지막으로 폴더로 분류한 코드는 '구글 포토'의 원시 버전이다.

구글 포토는 촬영 장소와 사물에 따라 영상을 구분한다.

CIFRA-10보다 큰 ImageNet 데이터셋으로 학습하여 확장 가능하다.

또한 장소나 사물에 따라 분류하는 기능 추가와, 웹/앱 인터페이스를 부착하는 것도 가능하다.

 

    2.2. 다국어 단어 공부 1 - tkinter를 이용한 대화형 인터페이스

L40 ~ L44 tts_english 버튼을 클릭했을 때 실행하는 콜백 함수, 영어를 들려준다.

L46 ~ L50 tts_french 버튼을 클릭했을 때 실행하는 콜백 함수, 프랑스어를 들려준다.

L52 ~ L56 tts_deutsch 버튼을 클릭했을 때 실행하는 콜백 함수, 독일어를 들려준다.

L58 ~ L59 끝내기 버튼을 클릭했을 때 실행하는 콜백 함수

 

3. 고급 인터페이스를 갖춘 지능 에이전트

위의 코드들에서는 '패키지 소프트웨어 방식의 인터페이스'를 사용한다.

이 목차에서는 현대적인 웹/앱 방식과 로봇에 대한 기초를 작성한다.

 

    3.1. 웹과 앱

텐서플로 사이트

웹 프로그래밍으로 제작한 웹의 예시이다.

HTMl과 JS의 언어 이해가 필요하고 서버에 대한 지식도 필요하다.

 └ 컴퓨터를 웹 서버로 설정하거나 glitch.com 같은 무료 서비스를 활용할 수 있다.

텐서플로 프로그램을 웹과 연결하려면 tensorflow.js를 사용하면 된다.

 

    3.2. 로봇

다양한 지능 에이전트의 대표적인 예시인 로봇이다.

위와 같은 다양한 형태와 다양한 기능을 갖추고 있다.

 

지능 로봇의 수준 별로 분류를 하자면 아래와 같다(아래로 갈수록 불확실성이 큰 과업을 처리한다).

ㆍ 조립용 로봇 : 이동 궤적을 정해주면 충실하게 단순 반복 작업 수행한다.

ㆍ 행동용 로봇 : 자세가 제멋대로인 부품을 집는 로봇으로 컴퓨터 비전을 통한 인식이 필요하다.

ㆍ 청소용 로봇 : 카메라와 센서가 필요하고 검출ㆍ인식ㆍ경로 계획 알고리즘 등이 필요하다.

ㆍ 빅독 : 모르는 건물에 진입해 작전을 수행하는 로봇으로, 위치 파악과 지도 제작을 하는 SLAM이 필요하다.

     └ SLAM : Simultaneous Localization And Mapping

ㆍ 휴머노이드 : 혼잡한 공간 이동, 물체 인식과 음성 인식, 상대의 표정을 인식한다.

 

로봇 프로그래밍 교육에서 아래와 같은 방법을 활용한다.

ㆍ 주로 단일 보드 컴퓨터(라즈베리파이, 젯슨, 오드로이드 등)를 탑재한 바퀴 달린 로봇을 활용한다.

ㆍ 표준 미들웨어인 ROS(Robot Operating System) 상에서 프로그래밍을 한다.

 

4. 지식 표현과 추론

    4.1. 지식 표현 방법론

지식표현(Knowledge Representation)은 지식(Knowledge)을 컴퓨터와 사람이 동시에 이해할 수 있는 형태로 나타내는 것이다.

인간 지능에 있어서 핵심이기도 하고 쉬울 수 있지만, 인공지능에 있어서는 아직까지 미숙한 분야이다.

이 목차에서는 이에 대한 대표적인 방법을 간략하게 소개한다.

 

규칙 기반

ㆍ if-then(조건) 구절로 지식을 표현한다.

ㆍ 1980年 전문가 시스템(Denedral, Mycin 등)을 만드는 중요 기술이다.

 

프레임

ㆍ 슬롯-값 쌍으로 지식을 표현한다. 이는 프로그래밍에서 구조체, 데이터베이스의 관계와 유사하다.

ㆍ KL-One 패키지를 사용한다. 개념으로 지식을 표현하고 연역적 분류기로 추론을 수행한다.

 

의미망

ㆍ 그래프로 지식을 표현한다.

ㆍ is-a(추상화)와 kind-of(상속) 관계를 주로 사용한다.

 

온톨로지 계층 구조

온톨로지(Ontology)

ㆍ 사람들이 세상을 생각하는 것에 대해 합의한 바를, 개념적이고 컴퓨터에서 다룰 수 있는 형태로 표현한 모델이다.

ㆍ 개념의 타입이나 사용상의 제약 조건들을 명시적으로 정의한 기술이다.

ㆍ RDF를 사용하여 주어, 술어, 목적어로 구성한 트리플을 사용한다.

     └ RDF : Resource Description Framework : 웹상의 자원의 정보를 표현하기 위한 규격

     └ 방대한 수의 트리플을 표현, 저장, 관리하는 기술이다.

 

온톨로지(Ontology) 계층 구조

ㆍ SPARQL : RDF에서 동작하는 표준 질의 언어

ㆍ OWL : RDF에서 동작하는 온톨로지 언어, 이를 구현한 SW는 Protege나 지식 그래프가 있다.

 

온톨로지로 구현한 지식 베이스

ㆍ Cyc : 최대 규모 지식 베이스 구축 프로젝트였으나 사실상 실패한 지식 베이스

ㆍ WordNet : 인간 어휘 전반을 상위어, 하위어, 유사어로 연결한 지식 베이스

 

    4.2. 지식 그래프

현재 가장 널리 쓰이는 지식 표현 방법으로 지식 베이스로 만든 그래프이다.

대표적인 예시로 구글의 지식 그래프는 2016年 기준으로 700억 개의 사실을 포함한 방대한 지식 베이스를 활용했다.

 

트리플로 표현한 지식 베이스

위의 사진은 트리플로 표현한 지식 베이스 예시이다.

이를 지식 그래프로 구현하는 방법은 아래와 같다.

ㆍ 큐레이션 : Cyc, WordNet

ㆍ 협업 : Wikidata, Freebase

ㆍ 자연어 처리 : Yago, DBpedia, Knowledge vault

 

5. 틈새 없는 협동과 능동성을 갖춘 지능 에이전트

틈새 없는 협동(Seamless Coordination)

ㆍ 인간은 완벽하게 틈새 없는 협동을 할 수 있다.

ㆍ 컴퓨터 비전과 로봇 손이 협동하는 '시각 서보잉(Visual Servoing)'으로 협동하지만 한계가 있다.

 

능동성(Proactive)

ㆍ 사람은 과업에서 과업으로 틈새 없이 전환이 가능하다.

ㆍ 로봇은 매우 제한적인 능동성을 발휘하기에, 어떻게 다른 과업으로 전환하는지에 대한 논의가 필요하다.

1. 컨볼루션 신경망의 동기와 전개

2. 컨볼루션 신경망의 구조와 동작

    2.1. 컨볼루션 연산으로 특징 맵 추출

    2.2. 컨볼루션층과 풀링층

    2.3. 빌딩 블록을 쌓아 만드는 컨볼루션 신경망

3. 컨볼루션 신경망의 학습

    3.1. 손실 함수와 옵티마이저

    3.2. 통째 학습

    3.3. 컨볼루션 신경망의 성능이 월등한 이유

4. 컨볼루션 신경망 프로그래밍

    4.1. 필기 숫자 인식

    4.2. 텐서플로 프로그래밍

    4.3. 패션 인식

    4.4. 자연 영상 인식

    4.5. 학습된 모델 저장과 재활용

5. 컨볼루션 신경망의 시각화

    5.1. 커널의 시각화 프로그래밍

    5.2. 특징 맵의 시각화 프로그래밍

6. 딥러닝의 규제

    6.1. 데이터 증대(Data Augmentation)

    6.2. 드롭아웃(Dropout)

    6.3. 가중치 감쇠(Weight Decay)

    6.4. 성능 평가 쟁점

7. 전이 학습

    7.1. 현대적인 컨볼루션 신경망 모델: AlexNet, VGG, GoogLeNet, ResNet

    7.2. 전이 학습 프로그래밍: 새의 품종 분류

8. 물체 검출

    8.1. 욜로를 이용한 물체 검출

    8.2. yolo 프로그래밍


1. 컨볼루션 신경망의 동기와 전개

1900년대 초에 동물의 감각 기관은 수용장으로 구성됨을 발견했다.

 └ 광수용 세포(Photoreceptor Cell) 뭉치가 수용장(Receptive Field)을 구성한다.

 └ 광수용 세포는 빛의 강도를 화학 신호로 변환하여 수평 세포와 양극 세포에 전달한다.

 └ 수평 세포와 양극 세포는 신호를 모아 발화 여부를 결정한다.

 

허블과 비셀의 고양이 실험에서 뉴런 반응을 확인했다.

 └ 1차 시각 피질에 마이크로 전극을 삽입 후 반응을 관찰

 └ Edge 방향에 따라 반응하는 뉴런이 정해져 있고, 같은 방향에 반응하는 뉴런은 같은 열에 배치됨을 발견

이것이 인공 신경망으로 발전했다.

 └ 1980年 발표한 후쿠시마의 네오코그니트론(Neocongitron) 네트워크

1998年 "Proceedings of the IEEE" 논문의 LeNet-5이 실용 성능을 입증한 최초의 CNN가 되었다.

 

개와 고양이 사진을 구별하는 문제는 매우 어려워 CAPTCHA로 사용했다.

무작위는 1/2^12 = 1/4096, 고전 컴퓨터 비전 기술은 0.827^12 = 1/9.77의 확률로 뚫을 수 있다.

하지만 CNN을 사용할 경우 개당 98%의 확률을 지니고, 0.98914^12 = 0.87719의 확률로 뚫을 수 있게 되었다.

└ 12개의 테스트를 한다고 가정했을 경우 이러하다.

즉 CAPTCHA로써의 기능을 상실했다.

 

ILSVRC(Imagenet Large Scale Visual Recognition Challenge) 대회

ㆍ WordNet의 계층 단어 분류 체계에 따라, 부류를 정하고 약 2만 부류에 대해 각각 500 ~ 1000장의 영상을 수집했다.

ㆍ 그중 1000개의 부류를 뽑아 분류 문제를 푸는 대회

ㆍ 120만 장의 훈련 집합, 5만 장의 검증 집합, 15만 장의 테스트 집합

ㆍ ILSVRC는 1순위 오답률과 5순위 오답률 두 가지로 성능을 측정한다.

ㆍ 2012년 AlexNet이 5순위 오답률 15.3%, 2015년 Microsoft의 ResNet이 5순위 오답률 3.5%를 기록했다.

 

이때부터 CNN이 RNN나 강화 학습과 결합하기 시작했다.

영상을 단어로 설명하는 시스템에서 영상 분석은 CNN, 문장 생성은 RNN이 처리한다.

비디오 게임을 하는 시스템에서 화면 분석은 CNN, 게임 전략 학습은 강화 학습이 처리한다.

대표적으로 알파고는 CNN과 강화 학습을 사용한 인공지능이다.

 

2. 컨볼루션 신경망의 구조와 동작

    2.1. 컨볼루션 연산으로 특징 맵 추출

컨볼루션(Convolution) 연산

ㆍ 특징 추출 또는 신호 변환에 사용한다.

ㆍ 수용장(파란 부분)과 커널의 선형 결합 연산이다.

 

에지 검출

컨볼루션 연산을 통해 특징 맵, 즉 에지(윤곽선)을 추출할 수 있다.

위 사진 예시는 수평 에지와 수직 에지 커널을 계산하였을 때 각 맵을 나타낸 그림이다.

 

1차원 컨볼루션 계산 식
2차원 컨볼루션 계산 식

1차원과 2차원 컨볼루션을 계산할 때는 각각 식 f(i)와 f(j, i)를 사용한다.

z는 입력 신호, u는 커널, h는 커널의 크기를 나타내는 변수이다.

 

    2.2. 컨볼루션층과 풀링층

컨볼루션층

컨볼루션 층의 전체 연산은 위의 식처럼 단순하다.

그저 2차원 컨볼루션 식을 활성화 함수에 넣어 계산하는 것뿐이다.

 

컨볼루션층(Convolution Layer)은 표준 컨볼루션 연산에 몇 가지 아이디어를 추가로 고려한다.

ㆍ 특징 맵이 작아지는 문제를 해결하기 위한 덧대기(Padding)

ㆍ 영상 크기를 축소할 수 있는 보폭(보폭을 K라고 하면, 특징 맵은 1/K로 축소)

ㆍ 바이어스를 추가

 

다증 특징 맵 추출(왼쪽), 다중 특징 맵 압축(오른쪽)

컨볼루션층에서는 다중 커널을 사용한다.

커널을 32, 64 또는 128개를 사용하여 다중 특징(풍부한 특징) 맵을 추출한다.

M * N * k 텐서에 h * h * k 크기의 커널 k`개를 적용하면 M` * N` * k` 텐서를 얻는다.

커널은 M과 N축을 따라 슬라이딩하고, K축은 움직이지 않는다. 위의 사진에서는 왼쪽의 예시이다.

M` * N` * k` 크기의 각 텐서를 커널의 크기에 따라 압축한다. 위의 사진에서는 오른쪽의 예시이다.

 

위는 다중 커널을 사용하는 계산 예시이다.

512 * 512(k = 3) 크기의 RGB 영상에 3 * 3 커널을 적용한다.

커널 하나당 512 * 512 * 3 * 3 * 3 = 7,077,888번의 곱셈을 수행한다.

 

풀링층

최대 풀링 예시(보폭이 2인 경우)

경우와 원하는 특징 추출에 따라 풀링의 종류를 선택한다.

 └ 최대 풀링 : 커널 안에 있는 값 중 최댓값을 취하는 풀링

 └ 평균 풀링 : 커널 안에 있는 값 중 평균값을 취하는 풀링

 └ 최소 풀링 : 커널 안에 있는 값 중 최솟값을 취하는 풀링

특징 맵에 있는 지나친 상세 정보를 줄여 요약 통계량을 추출해준다.

보폭을 s로 하면 특징 맵은 1/s로 축소한다.

 └ 2차원의 경우는 1/s^2으로, 3차원의 경우는 1/s^3으로 줄어들지만 전부 1/s로 줄어든다고 총칭한다.

 

CNN에서 부분 연결성과 가중치 공유

오른쪽 층의 노드는 왼쪽 층의 노드 3개와 연결된 '부분 연결성'을 띈다.

두 층의 노드 개수를 N1과 N2 커널 크기를 h라고 할 때

CNN은 h * N2개의 에지를, FC는 N1 * N2개의 에지를 가진다.

 

(CNN 기준으로) 에지는 h * N2지만, 가중치를 공유하기에 가중치는 h개밖에 없다.

2차원 영상에서 h * h 커널을 k개 사용하는 경우, 가중치는 h * h * k개이다.

학습해야 하는 매개변수 수가 대폭 축소한다는 이야기이다.

참고로 오류 역전파(Backpropagation)에서는 가중치 업데이트가 곧 커널 값 업데이트다.

 

    2.3. 빌딩 블록을 쌓아 만드는 컨볼루션 신경망

이 그림 구조를 이해했다면 CNN에 대한 이해가 끝났다고 해도 과언이 아니다.

k * m * n 입력 텐서에 k`개의 커널을 적용하면 k` * m` * n` 크기의 다중 특징 맵이 나온다.

이 다중 특징 맵을 활성화 함수에 넣어 또 다른 다중 특징 맵을 계산한다.

계산해 나온 다중 특징 맵에 풀링을 적용하면 k` * m`` * n`` 크기의 특징 맵을 출력한다. 여기까지가 하나의 '빌딩 블록'이다.

마지막으로 출력한 텐서는 다음 '빌딩 블록'의 입력이다.

어떤 입력 데이터가 있을 때, 이러한 '빌딩 블록'을 쌓아 출력을 뱉는 것이 바로 CNN이다.

 

LeNet-5의 CNN 구조

1998年 실용 성능을 입증한 최초의 CNN인, LeNet-5 사례이다.

C > P > C > P > C > FC > FC의 구조를 갖는 간단한 CNN이다.

입력은 1*32*32 텐서(32*32 크기의 필기 숫자 맵)이다.

빌딩 블록 1의 CONV는 5*5 커널 6개(보폭1, 덧대기X), POOL은 2*2 커널을 사용한다.

빌딩 블록 2의 CONV는 5*5 커널 16개(보폭1, 덧대기X), POOL은 2*2 커널을 사용한다.

이후 CONV에서 5*5커널 120개(보폭1, 덧대기X)와 FC를 2번 적용한다.

각 FC에서는 1*120 입력이 1*84 출력으로, 1*84 입력이 1*10 출력으로 변한다.

 

가중치는 CONV층에 50,692개, FC층에 11,014개이다.

학습 알고리즘은 14,706개의 매개변수를 최적화해야 한다.

FC층이 CONV층보다 가중치 매개변수가 2배 가량 많다.

딥러닝에서 FC층을 전역 평균 풀링 등으로 대체하여 매개변수를 줄이는 방향으로 발전했다.

 

3. 컨볼루션 신경망의 학습

컴파일 시 손실(loss) 함수, 최적화(optimizer) 함수, 평가(evaluation) 함수가 필요하다.

손실 함수는 예측값과 실제값 사이의 오차(비용)를 계산하는 함수이다.

손실 함수에는 이진 엔트로피, 교차 엔트로피, MSE 등이 있다.

최적화 함수는 손실 함수의 결과가 0에 가까워지도록 계산하는 함수이다.

최적화 함수에는 SGD, Adagrad, RMSProp, Adam 등이 있다.

평가 함수는 인공지능 모델의 성능을 계산하는 함수이다.

평가 함수에는 acc, MAE 등이 있다.

 

    3.1. 손실 함수와 옵티마이저

CNN의 빌딩 블록 구조(왼쪽), 깊은 다층 퍼셉트론의 오류 역전파 알고리즘(오른쪽)

컨볼루션 신경망은 커널(파란색으로 표시한 부분)을 학습한다.

깊은 다층 퍼셉트론은 노드를 연결하는 가중치를 학습한다.

둘의 학습 알고리즘에서 손실 함수와 옵티마이저(최적화) 함수는 같은 함수를 사용한다.

 

컨볼루션 신경망과 다층 퍼셉트론의 중간 층은 다르지만 입력과 출력은 동일하므로 같은 손실 함수를 사용한다.

컨볼루션 신경망은 커널의 화소 값을, 다층 퍼셉트론은 에지 가중치를 최적화한다는 점만 다르다.

그외의 학습 원리는 동일하므로 같은 옵티마이저 함수를 사용한다.

 

    3.2. 통째 학습

초기의 인공지능 수작업 특징(왼쪽), 딥러닝 이후 통째 학습(오른쪽)

고전적인 컴퓨터 비전은 수작업(Hand-Crafted) 특징을 사용한다.

 └ 예시) 수직 에지와 수평 에지

사람의 직관으로 설계하기 때문에 일정 수준의 성능은 달성이 가능하다.

하지만 최적이 아니기 때문에 자연 영상처럼 복잡한 데이터에서 낮은 성능을 갖는다.

 

딥러닝에서는 특징을 학습한다.

특징 추출에서 패러다임 변화가 있었다. 특징 추출과 분류를 동시에 학습으로 알아내는 것이다.

입력에서 출력까지 전 과정을 한꺼번에 학습하므로 통째 학습(End-to-End Learning)이라고 부른다.

 

딥러닝의 통째 학습: 특징 추출과 분류를 동시에 학습

위의 그림은 컨볼루션 신경망의 특징 학습을 설명하고 있다.

앞부분(컨볼루션층과 풀링층)은 특징 추출, 뒷부분(FC층)은 분류를 담당한다.

 

    3.3. 컨볼루션 신경망의 성능이 월등한 이유

CNN의 성능이 월등한 이유가 네 가지 이유가 있다.

ㆍ 통째 학습 : 따로 최적화하여 붙이는 이전 방식보다 우수하다.

ㆍ 특징 학습 : 수작업 특징보다 우수하다.

ㆍ 신경망 깊이를 깊게 하여(수십에서 수백 층) 풍부한 특징을 추출한다.

ㆍ 데이터의 원래 구조를 유지한 채 특징을 추출한다.

 

4. 컨볼루션 신경망 프로그래밍

CNN을 활용하여 여러 가지 실험을 한 코드 부분이다.

MNIST 필기 숫자 인식, Fashion MNIST 인식, 자연 영상 CIFAR-10 인식

여러 종류의 층을 사용해봄으로써 텐서플로의 유연성을 확인한다.

고로 본 목차에서는 일부 코드만을 살펴본다.

 

    4.1. 필기 숫자 인식

LeNet-5로 필기 숫자를 인식했다.

LeNet-5는 C - P - C - P - C - FC - FC 구조를 가진다.

 

손실 함수로 교차 엔트로피를, 최적화(옵티마이저) 함수로 Adam을 골랐다.

 

컨볼루션 신경망은 경우에 따라 유연한 구조를 갖는다.

C - C - P - dropout - FC - dropout - FC의 구조를 갖는다. 

dropout은 규제 기법이므로 C - C - P - FC - FC의 구조라고 할 수 있다.

 

    4.2. 텐서플로 프로그래밍

텐서플로 프로그래밍에는 중요한 4가지의 클래스가 있다.

: models 클래스, layers 클래스, loss 클래스, optimizers 클래스

 

models 클래스

Sequential과 function API으로 이루어져 있다.

Sequential 함수는 다음과 같은 특징을 갖는다.

ㆍ 순차적으로 층을 쌓아 모델을 만드는 경우에 사용한다.

ㆍ 대부분의 신경망이 이 구조에 해당한다.

function API 함수는 다음과 같은 특징을 갖는다.

ㆍ 텐서가 흐르다가 중간에서 여러 개로 갈라지는 경우, 출력이 여러 개일 수 있음

ㆍ 시계열이나 생성 모델에서 종종 발생한다.

 

layers 클래스

텐서플로 프로그램에서 층을 쌓는 기본이다.

입력 매개변수 텐서 크기, 커널 크기, 활성화 함수 등 은닉층, 출력층의 세부 설정을 한다.

그외에도 드롭아웃과 N차원 구조, 완전 연결층 여부 등을 설정하기도 한다.

Dense, Conv2D, MaxPooling 2D, Flatten 함수 등을 사용한다.

 

    4.3. 패션 인식

Fashion MNIST를 인식하는 컨볼루션 신경망이다.

MNIST 코드와는 데이터를 읽어오는 부분만 제외하고 전부 동일하다.

 

    4.4. 자연 영상 인식

딥러닝 프로그래밍에서 주로 사용하는 자연 영상 데이터베이스(ImageNet, MSCoCo, CIFAR)를 활용했다.

MNIST를 인식하는 데이터셋 읽는 부분만 다르고 나머지는 동일하다.

CIFAR-10은 읽은 데이터가 (32, 32, 3) 텐서로 표현되기에 MNIST와 달리 reshape를 할 필요가 없다.

 

    4.5. 학습된 모델 저장과 재활용

학습에 많은 시간이 소요되므로 저장해두고 필요할 때 불러서 쓸 필요가 있다.

save 함수로 신경망의 구조 정보와 가중치를 저장할 수 있다. HDF5 파일 형식을 사용한다. 

summary() 함수로 불러온 모델의 구조를 확인할 수 있다.

 

5. 컨볼루션 신경망의 시각화

커널의 시각화와 특징 맵의 시각화는 설명 가능 인공지능(XAI; eXplaining Artficial Intelligence)과 관련이 깊다.

딥러닝으로 구현한 인공지능은 성능이 뛰어나지만 왜 그런 의사결정을 했는지 설명하는 능력은 매우 뒤떨어진다.

방대한 수치 계산으로 의사결정이 이루어져 의사결정에 대한 이유를 해석할 방법이 마땅히 없기 때문이다.

 

두 가지 시각화를 시도한다.

ㆍ 컨볼루션층에 있는 커널을 시각화한다.

ㆍ 컨볼루션층이나 풀링층이 추출해주는 특징 맵을 시각화한다.

 

    5.1. 커널의 시각화 프로그래밍

L37 이름에 conv가 포함된 층(컨볼루션층)에 대해 커널의 텐서 모양을 출력한다.

L41 맨 앞에 있는 컨볼루션층의 커널 정보를 추출한다.

 

    5.2. 특징 맵의 시각화 프로그래밍

L59 이름에 conv가 포함된 층(컨볼루션층)에 대해 특징 맵의 텐서 모양 출력한다.

L65 층 0의 특징 맵을 시각화하기 위해서 층 0만 떼내어 partial_model 객체에 저장한다.

L69 테스트 집합의 1번 영상에 대한 특징 맵을 시각화

 

6. 딥러닝의 규제

    6.1. 데이터 증대(Data Augmentation)

과적합(overfitting)을 방지하는 가장 확실한 방법은 큰 훈련 집합 사용한다.

위의 그림은 데이터가 커지면 과적합(overfitting)이 자연스럽게 사라지는 현상이다.

대부분의 상황에서 데이터를 늘리는 일은 많은 비용이 소요된다.

딥러닝에서는 주어진 데이터를 인위적으로 늘리는 데이터 증대(Data Augmentationo)를 적용한다.

 └ 영상을 이동ㆍ회전ㆍ좌우 반전, 명암 조정 등이나 텐서플로의 함수를 활용할 수 있다.

 

    6.2. 드롭아웃(Dropout)

일정 비율의 가중치를 임의로 선택하여 불능으로 만들고 학습하는 규제 기법이다.

불능이 될 에지는 샘플마다 독립적(난수를 이용하여 랜덤하게)으로 정한다.

 

    6.3. 가중치 감쇠(Weight Decay)

과소적합(왼쪽으로 갈수록)과 과잉적합(오른쪽으로 갈수록)

과적합에서는 가중치 값이 아주 큰 현상이 나타난다.

가중치 감쇠(Weight Decay)는 성능을 유지한 채로 가중치 크기를 낮추는 규제 기법이다.

이때 표준 손실 함수인 '평균 제곱 오차(MSE; Mean Sqaured Error)'를 사용한다.

가중치 감쇠를 위한 텐서플로 프로그래밍에 3가지 매개변수가 있다.

ㆍ Kernel_regularizer : 가중치에 적용하는 매개변수

ㆍ Bias_regularizer : 바이어스에 적용하는 매개변수

ㆍ Activity_regularizer : 활성 함수 결과에 적용하는 매개변수

 

    6.4. 성능 평가 쟁점

객관적인 성능 평가 방법에는 2가지가 있다.

ㆍ 교차 검증(Cross Validation) : 데이터를 분할하여 여러 번 반복함으로써 통계적 신뢰성을 높인다.

ㆍ 제거 조사(Ablation Study) : 여러 선택 사항이 있을 때, 하나씩 빼면서 성능을 측정하여 각각의 기여도를 평가한다.

 

7. 전이 학습

전이 학습(Transfer Training)

어떤 모데인의 데이터로 학습한 모델을 다른 도메인의 데이터를 인식하는데 활용하여 성능 향상을 꾀하는 기법이다.

데이터가 부족하여 스크래치 학습으로 높은 성능을 달성하기 어려운 상황에 주로 사용한다.

 

    7.1. 현대적인 컨볼루션 신경망 모델: AlexNet, VGG, GoogLeNet, ResNet

이들은 텐서플로에서 제공하는 예비 학습 모델(Pre-trained model)이다.

이미 ImageNet으로 학습되어 있는 CNN들이다.

그중 VGG, Inception, ResNet가 많이 사용하는 모델이다.

ㆍ VGG : 3*3의 작은 마스크를 사용하는 모델

ㆍ Inception(GoogLeNet) : 네트워크 속의 네트워크(NIN)을 구현한 모델

ㆍ ResNet : 잔류 학습을 이용하는 모델

 

    7.2. 전이 학습 프로그래밍: 새의 품종 분류

ImageNet으로 학습한 ResNet 모델을 새 품종 인식 문제로 전이했다.

새 품종 인식 데이터셋으로 cub200-2011을 사용한다.

 └ 200종의 새 영상 11,788장의 데이터를 갖는다.

미세 분류(Fine-grained Classification) 문제를 해결해야 한다.

'부류 내 변화(Within-class Variation)'가 아주 크고, '부류 간 유사도(Between-class Similarity)'가 크다.

 

L49 ResNet에서 특징 추출 부분을 설정한다. include_top = False는 모델의 뒷부분을 떼내라는 뜻이다.

L52, L53, L54 뒷부분을 새롭게 부착한다.

L56 미세 조정 방식의 학습(낮은 학습률 설정)을 사용한다.

 

미세 조정(Fine Tuning) 방식

ㆍ 컨볼루션층과 완전연결층의 가중치를 동시에 수정한다.

ㆍ 학습률을 낮게 유지하여 조금씩 수정한다.

 

동결 방식

ㆍ 컨볼루션층의 가중치를 동결하여 수정이 일어나지 않게 제한한다.

ㆍ CUB 데이터셋에 대해 실험한 결과 미세 조정 방식이 우수하다.

 

8. 물체 검출

    8.1. 욜로를 이용한 물체 검출

컴퓨터 비전의 세 가지 문제

물체 검출은 분류(Classification), 검출(Detection), 분할(Segmentation) 문제로 나눈다.

분류는 A인지 아닌지 판단하는 방식, 즉 어떤 레이블에 속하는지 판단하는 알고리즘이다.

검출은 모든 물체를 찾아내고, 해당 물체를 바운딩 박스로 구별하는 알고리즘이다.

분할은 물체 영역을 정확하게 픽셀을 구분하여 윤곽선으로 구별하는 알고리즘이다.

 

물체 검출을 위한 딥러닝 모델에는 여러 가지가 존재한다.

 └ R-CNN, Fast R-CNN, Faster R-CNN, YOLO(You Only Look Once) 등의 모델

입력 영상을 S * S 격자로 나눈 S^2개의 격자 방 각각에 대해 B개의 바운딩 박스를 생성한다.

바운딩 박스는 (x, y, w, h, o)의 5개 값으로 표현한다.

 

개선된 YOLOv3의 신경망 구조

14 * 14, 28 * 28, 56 * 56개의 3가지 스케일을 사용한다.

각각 yolo_82, yolo_94라는 중간층과 yolo_106이라는 마지막 층에서 추출 가능하다.

 

    8.2. yolo 프로그래밍

L5 욜로는 MSCoCo 데이터셋에 대해 학습했는데, 80개의 부류 이름을 읽어온다.

L9 ~ L11 테스트할 영상을 읽고, 전처리를 수행한다.

L13 YOLOv3 모델을 불러온다.

L15 yolo_82, yolo_94, yoloy_106층을 알아낸다.

L17 테스트 영상을 신경망에 입력한다.

L18 출력을 output3 객체에 저장한다.

 

L20 ~ L32 최고 부류 확률이 0.5를 넘는 바운딩 박스를 모은다.

L34 비최대 억제를 적용하여 주위에 비해 최대인 것만 남긴다.

L36 ~ L41 비최대 억제에서 살아남은 바운딩 박스를 영상에 표시한다.

 

비최대 억제(NMS; Non-Max Suppression) 알고리즘

ㆍ 각 물체를 한 번씩만 감지하는 것을 보장

ㆍ 물체를 감지한 경계 상자(바운딩박스) 중 감지 확률이 최대인 상자를 고른 후, 가장 높은 상자들을 제거하는 방법

1. 분류 시작하기

    1.1. 이진 분류

    1.2. 다중 클래스 분류

    1.3. 다중 레이블 분류

2. 나이브 베이즈

    2.1. 예제를 통한 베이즈 정리 학습

    2.2. 나이브 베이즈 작동 원리

3. 나이브 베이즈를 이용한 영화 추천기 구축

4. 분류 성능 평가

5. 교차 검증으로 모델 조정


참고 자료를 시작하기 전에

본 자료에서는 머신 러닝에서의 분류 문제, 특히 이진 분류(BInary Classification)로부터 지도학습을 배운다.

목표는 영화 추천 시스템을 구축하는 것인데, 실제 사례를 통해 더욱 쉽게 배울 수 있을 것이다.

나이브 베이즈(Naive Bayes) 알고리즘을 이용한 이진 분류, 기본 개념에 대해서 배운다.

끝으로는 모델의 미세 조정(Fine Tuning) 방법을 배운다.

 

1. 분류 시작하기

분류(Classification)는 지도 학습의 주요 응용 사례 중 하나이다.

분류의 목표는 훈련 데이터셋이 주어졌을 때, 관측값과 범주를 올바르게 매핑하는 일반 규칙을 학습하는 것이다.

 └ 관측값(Observation) 또는 특징(Feature) 또는 예측 변수(Predictive Variable)

 └ 범주(Category) 또는 레이블(Label) 또는 클래스(Class)

 

분류는 출력하는 클래스의 종류에 따라 크게 세 가지 유형으로 구분한다.

ㆍ 이진 분류(Binary Classification)

ㆍ 다중 클래스 분류(Multiclass Classification)

ㆍ 다중 레이블 분류(Multi-label Classification)

 

    1.1. 이진 분류

이진 분류는 관측값을 두 개의 클래스 중 하나로 분류한다.

대표적인 예시는 다음과 같다

ㆍ 스팸 메일 필터링(spam email filtering)

ㆍ 고객 이탈 예측(customer churn prediction)

ㆍ 온라인 광고 클릭률 예측(click-through prediction)

ㆍ 조기 암 진단 분류

 

    1.2. 다중 클래스 분류

다중 클래스 분류는 다항 분류(Multinomial Classification)라고도 한다.

관측값을 두 개 이상의 클래스로 분류한다.

대표적인 예시는 다음과 같다.

ㆍ 필기체 숫자 인식(handwritten digit recognition)

ㆍ 아이리스 꽃 품종 판별

 

    1.3. 다중 레이블 분류

'이진 분류'와 '다중 클래스 분류'는 목표가 되는 클래스가 상호 배타적이며 오로지 한 레이블만 대응한다.

다중 레이블 분류에서는 범주(category)가 갖는 다양한 특성에 따라 여러 레이블을 할당한다.

 

n-레이블 분류 문제를 해결하는 일반적인 방식은 n개의 이진 분류 문제로 변환한다.

그리고 각 이진 분류 문제를 개별 이진 분류기로 처리하는 것이다.

이를 위한 분류 알고리즘들을 다음과 같은 것들이 있다.

ㆍ 나이브 베이즈(Naive Bayes)

ㆍ 서포트 벡터 머신(Support Vector Machine)

ㆍ 의사 결정 트리

ㆍ 로지스틱 회귀

 

2. 나이브 베이즈

나이브 베이즈(Naive Bayes) 분류기는 확률적 분류기 계열에 속한다.

모든 클래스에 대한 확률 분포를 예측하기 위해, 각 클래스에 속하는 특징의 예측 확률을 계산한다.

 └ 특징(Feature) 또는 속성(Attribute) 또는 신호(Signal)

 

나이브 베이즈의 뜻은 구체적으로 다음과 같다.

ㆍ 베이즈 : 베이즈 정리(Bayes' theorem)를 기반으로, 조건부확률에 따라 어떤 클래스에 속할지 매핑한다.

ㆍ 나이브 : 예측하려는 특징이 상호 독립적이라는 가정 하에 확률 계산을 단순화한다.

 

    2.1. 예제를 통한 베이즈 정리 학습

두 사건(Event) A와 B가 있다고 하자.

베이즈 정리에서 P(A|B)는 B가 참일 때 A가 발생할 확률로 위 식으로 표현한다.

같은 맥락에서 P(B|A)는 A가 참일 때 B가 발생할 확률을 뜻하고, P(x)는 x가 발생할 확률을 말한다.

 

예시 1)

두 개의 동전이 있다. 이를 각각 동전 O와 T라고 한다.

동전 u는 앞면이 나올 확률이 90%, 뒷면이 나올 확률이 10%이다.

동전 f는 앞면이 나올 확률이 50%, 뒷면이 나올 확률이 50%이다.

그렇다면 무작위로 동전 하나를 던져서 앞면이 나왔다고 할 때, 이 동전이 첫 번째 동전일 확률을 얼마일까?

 

첫 번째 동전을 뽑는 사건을 U, 두 번째 동전을 뽑는 사건을 F, 동전의 앞면이 나오는 사건을 H라고 해보자.

그렇다면 앞면이 나왔을 때 첫 번째 동전을 뽑았을 확률은 P(U|H)이다.

이는 바꾸면 P(U|H) = P(H|U) * P(U) / P(H)이다.

P(H|U)는 첫 번째 동전이 앞면이 나올 확률이므로 90%, P(U)는 동전이 2개이므로 50%이다.

 

동전의 앞면이 나오는 사건 P(H)는 U와 F 모두와 연관된다.

첫 번째 동전을 뽑고 앞면이 나올 확률에 두 번째 동전을 뽑고 앞면이 나올 확률을 더해주면 된다.

이는 수식으로 곧 P(H) = {P(H|U) * P(U)} + {P(H|F) * P(F)}다.

각 확률을 식에 대입한다면 해당 문제에 대한 정답은 0.64로 64%이다.

 

예시 2)

암 검진 결과 예시

1만 명의 사람들이 암 선별 검사를 했고, 결과가 위의 표와 같다고 가정하자.

암 환자들 중 20명과 정상인 중 900명이 잘못 진단된 것을 확인할 수 있다.

이때 어떤 사람의 검진 결과가 양성이면 실제로 암에 걸렸을 확률은 얼마일까?

 

암에 걸린 사건을 C, 검사 결과 양성인 사건을 Pos라고 해보자.

P(Pos|C) = 80 / 100 = 0.8, P(C) = 100 / 10000 = 0.01, P(Pos) = 980 / 10000 = 0.098

우리가 원하는 결과는 P(C|Pos)이고 이를 전개하면 P(Pos|C) * P(C) / P(Pos)이므로

0.8 * 0.01 / 0.098 = 0.0816...로 약 8.16%이다.

 

예시 3)

공장의 기계 A, B, C는 각각 전구 생산량이 35%, 20%, 45%가 된다.

각 기계에서 생산된 불량 전구의 비율은 각각 1.5%, 1%, 2%이다.

이 공장에서 생산된 전구에 결함이 있는 사건을 D라고 할 때, 해당 전구가 각 기계에서 제조되었을 확률은 얼마일까?

이를 식으로 정리하면 다음과 같다

 

 

 

    2.2. 나이브 베이즈 작동 원리

n개의 특징 x1, x2, ...xn과 데이터 샘플 x, 그리고 K개의 클래스 y1, y2, ..., yk가 있다고 하자.

나이브 베이즈의 목표는 x가 K에 속할 확률 P(yk|x)를 결정하는 것이다.

 └ 다르게 표현하면 P(yk|x1, x2, ..., xn)이다.

x와 x1, x2, ..., xn은 동일하다. x는 각각의 특징값이 존재할 때의 결합 사건(Joint Event)을 말한다.

yk는 샘플이 클래스 k에 속하는 사건이다. 이때 k는 1, 2, ..., K의 범위를 갖는다.

 

우도 결합 조건부 분포(위), 증거(아래)

P(yk)는 사전 확률(prior)이라고 한다. 관찰을 통한 추가적인 지식이 없을 때의 클래스 분포 확률을 나타낸다.

P(yk|x)는 사후 확률(posterior)이라고 한다. 관찰을 통한 추가 지식이 있을 때의 확률이다.

P(x|yk)는 우도(likelihood)라고 한다. 샘플 x가 클래스 yk에 속할 때 n개 특징에 대한 결합 분포이다.

 └ 특징 수가 증가하면 우도를 계산하기 어려운데 나이브 베이즈에서는 특징의 독립성 가정 덕에 계산이 용이하다.

 └ n개 특징의 결합 조건부 분포를 개별 특징 조건부 분포의 곱으로 표현 가능하다는 말과 동일하다.

 └ 특징의 독립성 가정 : Independence Assumption, 결합 조건부 분포 : Joint Conditional Distribution

P(x)는 증거(evidence)라고 한다. 특징의 전체적인 분포를 나타내고 특정 클래스에 한정되지 않는 정규화 상수이다.

 

영화 추천을 위한 데이터 예시

4명의 관객이 세 편의 영화희 호불호 여부, 추천 영화 호불호 여부를 표로 그렸다.

이를 바탕으로 다섯 번째 관객이 추천 영화를 좋아할 가능성이 얼마일까? 계산해보는 것이다.

 

우선 사전 확률 P(Y) = 3/4, P(N) = 1/4이 된다.

세 편의 영화를 좋아하거나 싫어할 확률을 각각 f1, f2, f3라고 한다.

다섯 번째 관객의 호불호가 x = (1, 1, 0)일 때, 사후 확률 P(Y|x)를 계산하려면 우도를 먼저 계산해야 한다.

 └ P(f1 = 1|Y), P(f2 = 1|Y), P(f3 = 0|Y), P(f1 = 1|N), P(f2 = 1|N), P(f3 = 0|N)을 구해야 한다.

 

위에 표에서 P(f1 = 1|N)에 해당하는 데이터는 없으므로 0이 된다.

일반적으로 0 값을 갖는 우도를 곱하는 걸 방지하기 위해서 각 특징 초깃값을 1로 할당한다.

이런 방법을 라플라스 평활(Laplace Smoothing)이라고 한다.

 

라플라스 평활을 적용한 우도값

P(f1 = 1|Y)를 살펴보자.

Y 클래스가 있을 때, m1을 좋아하는 평가가 1개이고(ID = 4번째 사람), 여기에 +1 평활을 더한다.

Y 클래스에 해당하는 데이터 포인트 3개(ID = 1, 3, 4)와 2개(Y/N)의 +1 평활을 더한다.

 

P(f1 = 1|N)을 살펴보자.

N 클래스가 있을 때, m1을 좋아하는 평가가 0개이고, 여기에 +1 평활을 더한다.

N 클래스에 해당하는 데이터 포인트 1개(ID = 2)와 2개(Y/N)의 +1 평활을 더한다.

 

이런 식으로 6개의 우도를 모두 구해준다.

 

이제 사후 확률 비율은 위의 첫 번째 식으로 계산할 수 있다.

이때 x라는 상황에서 Y이거나 N일 확률은 1이다.

고로 P(Y|x)는 1458 / (125 + 1458) * 100 = 약 92.1%가 된다.

 

3. 나이브 베이즈를 이용한 영화 추천기 구축

영화 등급 데이터셋(moving rating dataset)을 사용한다.

시연을 위해 작은 데이터셋인 ml-lm.zip을 사용한다.

 └ 6040명의 사용자가 약 3900편의 영화에 대해 평가한 1~5까지의 평점 1백만 개 데이터이다.

 └ ml-lm.zip은 아래 4개의 파일이 존재한다.

ㆍ movies.dat : 영화 정보는 MovieID::Title::Genres 형식으로 저장

ㆍ ratings.dat : 사용자가 평가한 영화 등급이 UserID::MovieID::Rating::Timestamp 형식으로 저장

ㆍ users.dat : 사용자 정보가 UserID::Gender::Age::Occupation::Zip_code 형태로 저장

ㆍ README

 

본 코드에서는 분류 정확도(Classification Accuracy)로 모델의 성능을 평가한다.

분류 정확도는 71.6%로, 나이브 베이즈 분류기가 약 72%의 관객에게 올바르게 영화를 추천한다는 의미이다.

 

4. 분류 성능 평가

정확도(Accuracy) 외에도 클래스 불균형(Class Imbalance)를 피하고자 사용 가능한 측정 지표들이 존재한다.

ㆍ 혼동 행렬

ㆍ 정밀도

ㆍ 재현율

ㆍ F1 점수

ㆍ 곡선 아래 면적

 

혼동 행렬(Confusion Matrix)

테스트 사례에 대한 예측값과 참값을 분할표(contingency table)로 나타낸 것이다.

사이킷런의 confusion_matrix 함수를 통해 나이브 베이즈의 혼동 행렬을 계산하면 위와 같다.

(참 비율 / 전체 비율)을 계산하면 71.6%로 동일함을 알 수 있다.

 

정밀도(Precision)

참인 양성 사례의 비율로 TP / (TP + F'P')로 측정한다.

위의 경우에는 431 / (431 + 47) = 0.90에 해당한다.

 

재현율(Recall)

올바르게 식별한 참양성의 비율을 측정하는데, 이 비율은 TP / (TP + FN)이다.

위의 경우에는 431 / (431 + 148) = 0.74에 해당한다.

// 참양성률(true positive rate)라고도 한다.

 

F1 점수(F1 Score)

정밀도와 재현율의 조화 평균(harmonic mean)으로 F1 = 2 * (정밀도 * 재현율) / (정밀도 + 재현율)이다.

위의 경우에는 F1 = 2 * (0.90 * 0.74) / (0.90 + 0.74) = 0.81에 해당한다.

F1 점수는 정밀도나 재현율 한 가지만 사용하는 것보다 나은 경우가 많다.

 

from sklearn.metrics import precision_score, recall_score, f1_score

from sklrean.metrics import classification_report

사이킷런에서 함수를 호출하여 위의 함수들을 측정할 수 있다.

혹은 각각 호출하지 않고 classification_report 함수를 호출하여 효율적으로 계산할 수도 있다.

분류 보고서(classification_report)는 각 클래스에 대한 분류기의 결과를 전체적으로 보여준다.

 └ 불균형 분류(Imblanced Classification)에서는 유용하다.

 └ 불균형 분류 : 모든 샘플을 다수 클래스로 분류하는 것만으로 높은 정확도를 얻는 방법

 └ 하지만 소수 클래스에 대한 정밀도, 재현율, F1 점수 측정값은 낮게 나올 수 있다.

정밀도, 재현율, F1 점수는 '다중 클래스 분류'에도 적용할 수 있다.

 └ 이 경우 관심 있는 클래스를 양성, 그 밖의 다른 클래스는 음성으로 처리한다.

 

곡선 아래 면적(AUC; Area Under the Curve)

상황에 따라 클래스와 모델의 F1 점수가 차이가 나는 경우, 어떤 모델이 더 잘 작동하는지 판단하는 방법이다.

이는 통합 측정 방법으로 수신기 작동 특성(ROC; Reveiver Operation Characteristic) 중 하나이다.

 

ROC 곡선은 0에서 1까지 다양한 확률 임곗값에 대해 참양성률과 거짓양성률을 그린 그래프이다.

 └ 참양성률 : 재현율과 동일하다.

 └ 거짓양성률 : 양성으로 잘못 판별한 음성의 비율이다.

그래프에서 점선은 무작위 추측을 나타내는 기준선, 실선은 모델의 ROC 곡선이다.

거짓양성률에 따라 참양성률이 선형으로 증가하고 AUC는 0.5이다.

 

5. 교차 검증으로 모델 조정

K-폴드 교차 검증 다이어그램(K = 3)

K-폴드 교차 검증 다이어그램

모델이 실제로 어떻게 수행될지 평가하기 위해 사용하는 기술이다.

 

1. 원본 데이터를 무작위 K개의 같은 크기 부분집합으로 나눈다.

2. K개의 부분집합 중 하나의 부분집합을 순차적으로 테스트 집합으로 사용한다.

3. 시행할 때마다 나머지 K-1개의 부분집합은 모델의 훈련셋으로 사용한다.

4. 마지막으로 모든 K 시행에 대한 평균 성능을 계산해 전체 결과를 구한다.

 

k값은 일반적으로 3, 5, 10으로 설정한다. 훈련 데이터셋 크기가 작으면 큰 값이 좋다

alpha : 평활화 인자(smoothing factor)로, 각 특징의 초깃값

fit_prior : 훈련 데이터로 학습한 사전 확률의 사용 여부

 

각 폴드에 대해서 훈련과 예측 과정을 반복한 다음 AUC 결과를 기록한다.

결과 중 가장 높은 값으로 재학습한 뒤 AUC를 계산한다.

일반적으로 교차 검증을 통해 모델의 하이퍼 매개변수를 조정하는 것은 학습 성능을 높이고 과적합을 줄여준다.

'학교 공부 > 인공지능 응용' 카테고리의 다른 글

07 지능 에이전트  (0) 2023.05.31
06 CNN과 컴퓨터 비전  (0) 2023.05.30
05 딥러닝과 텐서플로  (0) 2023.04.12
04 신경망 기초  (0) 2023.04.11
03 기계 학습과 인식  (0) 2023.04.08

1. 딥러닝의 등장

    1.1. 딥러닝의 기술 혁신

    1.2. 딥러닝 소프트웨어

2. 텐서플로 개념 익히기

    2.1. 텐서플로와 넘파이의 호환

    2.2. 텐서 이해하기

3. 텐서플로 프로그래밍 기초

    3.1. sklearn의 표현력 한계

    3.2. 케라스 프로그래밍

4. 텐서플로로 다층 퍼셉트론 프로그래밍

5. 깊은 다층 퍼셉트론

    5.1. 구조와 동작

    5.2. 오류 역전파 알고리즘

    5.3. 가중치 초기화 방법

6. 딥러닝의 학습 전략

    6.1. 그레이디언트 소멸 문제와 해결책

    6.2. 과잉 적합과 과잉 적합 회피 전략

7. 딥러닝이 사용하는 손실 함수

    7.1. 평균 제곱 오차

    7.2. 교차 엔트로피

    7.3. 손실 함수의 성능 비교 실험

8. 딥러닝이 사용하는 옵티마이저

    8.1. 모멘텀을 적용한 옵티마이저

    8.2. 적응적 학습률을 적용한 옵티마이저

    8.3. 옵티마이저 성능 비교 실험

9. 좋은 프로그래밍 스킬

10. 교차 검증을 이용한 하이퍼 매개변수 최적화


1. 딥러닝의 등장

    1.1. 딥러닝의 기술 혁신

1980년대의 깊은 신경망 등장했지만, 학습이 잘 안 되는 문제가 존재했다.

 └ Gradient(기울기) 소실 문제, 적은 데이터셋 문제, 과한 계산 시간 등

 

딥러닝이라는 새로운 이론의 원리가 빈약했기 때문에 일어난 문제였다.

새로운 이론에서는 새로운 방법을 사용해야 하는데 기존 신경망의 구조, 동작, 학습 알고리즘이 거의 그대로다.

하지만 값싼 GPU가 등장하여 10 ~ 100배의 속도가 향상해 학습 시간이 단축하고,

인터넷을 통한 데이터 수집과 레이블링으로 데이터셋이 커졌고(ImageNet은 1400만장),

ReLU 활성화 함수, 규제 기법 등의 학습 알고리즘 발전으로 딥러닝은 기술 혁신이 일어났다.

 └ 규제 기법 : 가중치 감쇠, 드롭아웃(Dropout), 조기 멈춤(EarlyStopping), 데이터 증대, 앙상블 등

 

그리고 2010년대 딥러닝의 성공 사례를 하나둘 발표한다.

 └ 예시) 2012년 개최한 ILSVRC 대회의 우승을 차지한 CNN 구조의 AlexNet 모델

 └ 예시) 제프리 힌튼(Geoffrey Everest Hinton) 교수가 오답률 20%의 음성 인식에 성공했다.

학술 측면에서 CNN(Convolutional Neural Network)가 딥러닝의 가능성을 열었다고 본다.

 

ILSVRC(Imagenet Large Scale Visual Recognition Challenge) 대회

ㆍ 자연 영상을 분류하는 문제는 ImageNet이라는 DB가 만들어진 후 재주목받기 시작했다.

ㆍ WordNet의 계층 단어 분류 체계에 따라, 부류를 정하고 약 2만 부류에 대해 각각 500 ~ 1000장의 영상을 수집했다.

ㆍ 그중 1000개의 부류를 뽑아 분류 문제를 푸는 대회

ㆍ 120만 장의 훈련 집합, 5만 장의 검증 집합, 15만 장의 테스트 집합

ㆍ ILSVRC는 1순위 오답률과 5순위 오답률 두 가지로 성능을 측정한다.

ㆍ 2012년 AlexNet이 5순위 오답률 15.3%, 2015년 Microsoft의 ResNet이 5순위 오답률 3.5%를 기록했다.

 

    1.2. 딥러닝 소프트웨어

딥러닝 소프트웨어

현재는 텐서플로(TensorFlow)와 파이토치(PyTorch)를 자주 사용한다.

TensorFlow는 기업에서, PyTorch는 대학 연구자들이 주로 사용한다.

 

2. 텐서플로 개념 익히기

    2.1. 텐서플로와 넘파이의 호환

4행에서 TensorFlow(이하 tf)가 제공하는 random 클래스의 uniform 함수로 난수를 생성한다.

 └ uniform([2, 3], 0, 1) : [0, 1] 사이의 난수를 2 * 3 행렬로 생성

 

텐서플로와 넘파이는 서로 호환이 가능해, 각각 생성한 행렬을 더하는 연산이 가능하다.

 └ 텐서플로 1.0에서는 미지원이지만, 텐서플로 2.0에 넘어오면서부터 매커니즘을 바꾸어 호환이 된다.

 

버전 1에서는 '계산 그래프를 만드는 단계'와 '실제 계산을 실행하는 단계'를 엄격하게 구분한다.

편의를 위해, 계산 그래프를 만들면서 동시에 실행가능한 이거 모드(eager mode)를 제공한다.

이거 모드를 쓰려면 프로그램에 특수한 코드를 삽입해야 한다는 문제가 발생한다.

버전 2에서는 이거 모드를 반대로 적용했다.

이거 모드가 기본이고, 그래프와 실행을 각 단계 별로 하기 위해 특수한 코드를 삽입해야 한다는 소리이다.

물론 두 단계를 구분했을 때 속도가 빨라지는 장점이 있다.

 

    2.2. 텐서 이해하기

딥러닝에서 다차원 배열을 텐서(Tensor)라고 부른다.

데이터도 텐서, 신경망의 가중치(매개변수)를 텐서라고도 부른다.

 

특징 벡터의 차원과, 텐서의 차원을 구별할 줄 알아야 한다.

iris 데이터의 경우 샘플 하나를 (꽃잎길이, 꽃잎너비, 꽃받침길이, 꽃받침너비)의 특징 벡터로 표현한다.

요소가 4개이므로 특징 벡터의 차원은 4차원이다.

하지만 이 특징 벡터는 결국 방향을 갖는 어떤 값이므로 화살표로 표현할 수 있다.

이는 곧 1차원 구조의 텐서이다.

 

1차원 Tensor : iris 샘플 하나

2차원 Tensor : iris 샘플 여럿, 흑백 사진 한 장

3차원 Tensor : 흑백 사진 여럿, 컬러 사진 한 장

4차원 Tensor : 컬러 사진 여럿, 컬러 영상 하나

5차원 Tensor : 켤러 영상 여럿

 

이와 같은 느낌으로 받아들이면 된다.

 

3. 텐서플로 프로그래밍 기초

    3.1. sklearn의 표현력 한계

sklearn 라이브러리로는 딥러닝 구현이 어렵다는 점이 있다.

└ 사이킷런(Scikit-learn) : 고전적인 기계 학습 지원 라이브러리

딥러닝은 서로 다른 기능의 층(Layer)을 쌓아가는 방식이기에 2행같은 코드는 표현이 불가능하다.

 

    3.2. 케라스 프로그래밍

신경망을 작성할 때는 직접 하나하나 신경망 동작을 코딩해줘야 한다.

이런 부담을 덜기 위해 나온 것이 케라스(Keras)이다.

 

디테일은 숨기고, 필요할 때 직접 작성하는 방식으로 컴퓨터 프로그래밍의 추상화를 높였다.

텐서플로 자체도 아주 높은 추상화이지만, 추가로 추상화 할 여지가 있다.

이 여지를 활용한 것이 케라스 라이브러리이다.

 

텐서플로 버전 2에서 케라스가 텐서플로에 편입되어, tensorflow.keras로 모듈을 불러와야 한다.

keras의 models, layers, optimizers 클래스는 자주 등장하니 기억하는 게 좋은 클래스이다.

ㆍ models : Sequential과 funciton API 모델 제작 방식을 제공하는 클래스

ㆍ layers : 다양한 종류의 층을 제공하는 클래스

ㆍ optimizers : 다양한 종류의 옵티마이저를 제공하는 클래스

 

전형적인 절차는 '데이터 구축 > 신경망 구조 설계 > 학습 > 예측'의 절차이다.

Line 12에서 Sequential 클래스로 객체를 생성하고,

Line 13에서 add 함수로 Dense(완전 연결)층을 쌓는다.

 

Dense 함수의 매개변수인 units은 출력 노드의 개수를, input_shape는 입력 노드의 개수를 정한다.

이때 완전 연결층이란, 어떤 층이 있을 때, 모든 입력 노드와 출력 노드가 연결이 되어있을 형태를 말한다.

 

4. 텐서플로로 다층 퍼셉트론 프로그래밍

본 챕터 정리는 코드 전문을 첨부하지 않고 핵심 함수와 기능만 작성한다.

 

Adam : SGD(경사하강법)보다 좋은 optimizer(최적화) 함수

reshape : 특정 차원 구조의 텐서를 다른 차원 구조로 변환한다.

keras.utils.to_categorical : one-hot encoding 함수

batch_size : 미니 배치(데이터 학습 시 큰 데이터를 쪼개는 단위) 크기

epochs : 최대 세대 수

validation_data : 학습 도중 사용할 검증 집합 설정

 

5. 깊은 다층 퍼셉트론

    5.1. 구조와 동작

깊은 다층 퍼셉트론의 구조

가장 기본적인 깊은 다층 퍼셉트론(DMLP; Deep MLP)의 구조이다.

ㆍ L-1개의 은닉층이 있는 L층 신경망

ㆍ 입력층에 d+1개의 노드, 출력층에 c개의 노드, i번째 은닉층에 nj개의 노드

ㆍ 이때 nj는 하이퍼 매개변수

ㆍ 인접한 층은 완전 연결(Fully Connected) 구조

 

왼쪽은 L-1번째 층과 L번째 층을 연결하는 가중치 행렬이다.

uLji는 L-1번째 층의 i번째 층의 j번째 노드를 연결하는 가중치이다.

오른쪽은 입력층으로 들어오는 특징 벡터 값이다.

 

위의 식부터 순서대로 정리하면 아래와 같다.

ㆍ l번째 은닉층의 j번째 노드 연산

ㆍ l번째 층 전체의 연산 행렬 표현

ㆍ 훈련 집합 전체에 대한 연산식

이때 각 층의 활성화 함수는 주로 ReLU를 사용하고, L층(출력층)에서는 softmax를 사용한다.

 

    5.2. 오류 역전파 알고리즘

깊은 다층 퍼셉트론이 사용하는 오류 역전파 알고리즘

다층 퍼셉트론의 학습 알고리즘만을 조금만 확장한 경우이다.

 

위의 식은 깊은 다층 퍼셉트론에서늬 손실 함수(평균 제곱 오차)이고,

아래의 식은 가중치 갱신 규칙 식이다.

 

    5.3. 가중치 초기화 방법

kernel_initializer = 'random_unifom'으로 설정하여 균일 분포에서 난수를 생성, 가중치를 초기화한다.

kernel_initializer 함수 매개변수들을 보면 알듯이 기본값은 glorot_uniform 값이다.

glorot_uniform은 [Glorot2010] 유래하는데, 텐서플로에서는 좋은 성능이 입증되었다고 판단하여 기본값으로 제공 중이다.

 

6. 딥러닝의 학습 전략

    6.1. 그레이디언트 소멸 문제와 해결책

깊은 다층 퍼셉트론 가중치 갱신 규칙

깊은 다층 퍼셉트론 학습 알고리즘(가중치 갱신 규칙) 식은 수학, 공학 관점에서 깔끔하다.

하지만 층이 깊어질수록 현실적인 2가지 문제가 발생한다.

하나는 기울기 소실 문제(그레이디언트 소멸 문제)이고, 다른 하나는 과적합 문제이다.

 

미분 연쇄 법칙(Chain Rule)에 따르면

L번째 층의 기울기는, L+1번째 층의 기울기에 자신 층의 기울기를 곱해서 구한다.

따라서 기울기가 0.001처럼 작은 경우 진행하면서 점점 작아지게 된다.

갈수록 가중치 갱신이 느려져 전체 신경망 학습이 매우 느려지는 현상이 발생한다.

 └ 이는 GPU나 TPU를 사용해 병렬 처리로 해결 가능하다.

 

또는 ReLU 함수를 사용하여 해결 가능하다.

tanh(s) 시그모이드 함수의 문제점은 s가 크거나 작아질 때 기울기가 0에 가까워진다는 것이다.

 └ s가 8정도면 기울기가 벌써 0.0000004501이 된다.

ReLU는 s가 음수일 때는 0, 양수일 때는 1로 기울기가 고정이기에 해결 가능하다.

 

    6.2. 과잉 적합과 과잉 적합 회피 전략

x축은 특징, y축은 레이블인 회귀 문제이다.

 

Degree 1은 1차 다항식을 사용하여 분류했기에 과소 적합(Under fitting) 상태이다.

 └ 데이터에 비해 모델 용량이 작은 상황으로 볼 수도 있다.

Degree 12는 훈련 집합에 대해 가장 적은 오류를 나타내지만, 일반화 능력이 떨어진다.

데이터에 비해 너무 큰 용량의 모델을 사용한 탓에 과잉 적합(Over fitting)된 상태이다.

 

과적합은 모델의 용량이 크기 때문에 일어난다.

고로 과적합을 피하기 위해서는 데이터 양을 늘리면 된다.

데이터를 새로 수집해서 양을 늘릴 수 없다면 훈련 샘플로 인위적으로 데이터를 늘린다.

 └ 이를 데이터 증대(Data Augmentation)이라고 한다.

 

혹은 다른 규제 기법들을 사용해도 과적합을 줄일 수 있다.

 └ 데이터 증대, 가중치 감쇠, 드롭아웃(Dropout), 앙상블 등

 

7. 딥러닝이 사용하는 손실 함수

    7.1. 평균 제곱 오차

e식은 샘플 하나의 오류 값을 이야기한다.

더 정확하게는 레이블 y와 신경망이 예측한 값 o의 차이 값이다.

이를 활용한 평균 제곱 오차(MSE; Mean-Squared Error) 식은 통계학에서 사용하던 식이다.

교정에 사용하는 값(기울기)이 오차 e보다 작은 경우가 발생한다.

이는 곧 학습이 느려지거나 학습이 안 되는 상황을 초래할 가능성이 있다.

 

    7.2. 교차 엔트로피

엔트로피(Entropy)는 확률 분포의 무질서도를 측정하는 함수이다.

멀쩡한(공정한) 주사위와 1이 훨씬 넓게 찌그러진 주사위가 있다고 해보자.

그렇다면 이때 멀쩡한 주사위의 엔트로피가 더 높을 것이다.

 

교차 엔트로피(Cross Entropy)는 확률 분포 P와 Q가 다른 정도를 측정하는 함수이다.

이때 멀쩡한 주사위 P와 Q의 교차 엔트로피는 왼쪽의 식과 같다.

공정한 주사위 P와 찌그러진 주사위 Q의 교차 엔트로피는 오른쪽과 같다.

 

이에 살펴보면 예측이 틀릴수록 교차 엔트로피의 값이 더 커진다는 것을 알 수 있다.

교차 엔트로피는 평균 제곱 오차의 불공정성 문제를 해결해준다.

따라서 딥러닝은 주로 교차 엔트로피를 사용한다.

 

    7.3. 손실 함수의 성능 비교 실험

손실 함수를 지정하는 여러 가지 방식의 코딩이다.

모듈을 어떻게 호출하느냐에 따라서 방식이 달라질 뿐이다.

 

실제 MSE와 교차 엔트로피를 비교해 본 결과 교차 엔트로피가 0.15% 더 우세하게 나온다.

 

8. 딥러닝이 사용하는 옵티마이저

손실 함수의 최저점을 찾아주는 것이 옵티마이저, 최적화 함수이다.

표준에 해당하는 최적화 함수 SGD(Stochastic Gradient Descent)를 개선하는 2가지 방법에 대해 서술한다.

 

    8.1. 모멘텀(momentum)을 적용한 옵티마이저

물리에서 모멘텀(momentum)은 물체가 한 방향으로 지속적으로 변하는 경향을 말한다.

이는 쉽게 말하면 관성으로, 이전 운동량을 현재에 반영하여 계산하는 것이다.

 

이를 옵티마이저에 적용하면, 이전 방향 정보 v를 같이 고려한다.

그림 상에서 쉽게 말하면 우리의 최종 목적지(정답)는 빨간색 점을 향해 나가는 것이고, 현재 w에 있다.

이때 고전 SGD를 사용하면 빨간 화살표로 나아가지만, 모멘텀을 적용하면 파란 화살표로 나아간다.

 └ α = 0일 경우 고전적 SGD, α = 1에 가까울수록 이전 정보에 큰 가중치를 부여한다.

 └ α는 [0, 1] 사이 값으로 보통 0.5나 0.9를 사용한다.

 

네스테로프 모멘텀(Nesterov Momentum)이라는 방법도 존재한다.

 └ 현재 점 w에서 미분하는 대신, 이전 정보 αv를 이용하여 이동한 점에서 기울기를 계산(미분)하는 방법

 

SGD의 API 매개변수를 보면 위와 같다.

모멘텀과 네스테로프 모멘텀 기본값은 사용하지 않는 것으로 되어 있다.

학습률(learning_rate)과 모멘텀(momentum), 네스테로프(nesterov)를 적용하려면 이를 적절히 변경해야 한다.

 

    8.2. 적응적 학습률(adaptive learning rate)을 적용한 옵티마이저

기울기는 최저점을 향해 가는 방향은 알려주지만 이동량에 대한 정보는 없다.

작은 학습률을 곱해준다면 파란 화살표처럼 이동하여 너무 천천히 움직여 학습에 많은 시간을 소요한다.

큰 학습률을 곱하면 검은 화살표처럼 진동하여 목적지에 도달할 수 없을 지도 모른다.

따라서 상황에 맞는 적절한 학습률을 조절해야 한다.

 

ㆍ AdaGrad : 이전 기울기 누적 정보를 이용하여 학습률을 설정하는 기법

ㆍ RMSProp : 이전 기울기를 누적할 때 오래된 것의 영향을 줄이는 정책을 사용하여 AdaGrad를 개선한 기법

     └ rho 매개변수 : 오래된 기울기(Gradient)의 영향을 조절하는 값, 작을수록 영향이 줄어든다.

ㆍ Adam : RMSProp에 모멘텀 식을 적용하여 개선한 기법

     └ beta_1 매개변수 : 모멘텀 관련 값

     └ beta_2 매개변수 : RMS의 rho 값

 

    8.3. 옵티마이저 성능 비교 실험

 

9. 좋은 프로그래밍 스킬

1. 모듈화 : build_model 함수나, batch_size상수 , n_epoch 상수처럼 작은 모듈 단위로 쪼개어 활용한다. 

2. 언어의 특성 활용 : 파이썬이라는 언어의 특성을 활용해 최대한 간결하고 가독성있게 코드를 짠다.

3. 점증적 코딩 : 한 번에 한 가지 기능을 추가하고 옳게 작동하는지 확인하는 일을 반복해 나간다.

4. 디자인 패턴 숙지 : 디자인 패턴에 기반하여 다른 프로그램과 공유하며 다듬어 나간다.

5. 도구에 적응 : 사용하는 환경(IDE)나, 여러 라이브러리들을 적재적소에 활용한다.

6. 기초에 충실 : 기초 자료구조인 list, tuple, dictionary, 라이브러리, 이론 등의 특성을 제대로 알고 활용한다.

 

10. 교차 검증을 이용한 하이퍼 매개변수 최적화

텐서플로는 교차 검증을 지원하는 함수가 없어 직접 코드를 작성해야 한다. 그 코드 중 일부와 실행 결과이다.

함수 이름에서 알 수 있듯 Line 42 ~ 51에 해당하는 cross_validation 함수가 교차 검증 코드이다.

Kfold 함수를 이용하여 훈련과 검증 집합으로 데이터를 분할한다.

옵티마이저를 매개변수로 넘겨 옵티마이저(최적화 함수) 각각을 교차 검증한다.

성능 그래프에서 보면 전체적으로 Adam이 우세하다.

 

이런 교차 검증은 우연을 배제하는데 효과적이다.

하지만 많은 시간이 소요된다는 문제점이 발생한다.

 └ fit 함수를 동작할 때 시간이 가장 오래 걸린다.

 └ (옵티마이저 개수) * (학습률) * (미니배치 크기)만큼 조합이 생긴다.

시간을 줄이기 위해서는 이 조합의 수를 줄이든, GPU를 사용하든 해야 한다.

1. 인공 신경망의 태동

    1.1. 생물 신경망

    1.2. 인공 신경망의 발상과 전개

2. 퍼셉트론의 원리

    2.1. 퍼셉트론의 구조와 연산

    2.2. 퍼셉트론으로 인식하기

    2.3. 행렬 표기

3. 퍼셉트론 학습 알고리즘

    3.1. 손실 함수 설계

    3.2. 학습 알고리즘 설계

4. 현대 기계 학습으로 확장

    4.1. 현대적인 기계 학습의 복잡도

    4.2. 스토케스틱 경사 하강법

5. 퍼셉트론 프로그래밍

    5.1. OR 데이터 인식

    5.2. 필기 숫자 데이터 인식

    5.3. 기계 학습의 디자인 패턴

6. 다층 퍼셉트론

    6.1. 특징 공간 변환

    6.2. 다층 퍼셉트론의 구조

    6.3. 다층 퍼셉트론의 동작

    6.4. 활성 함수

7. 오류 역전파 알고리즘

    7.1. 손실 함수 설계

    7.2. 학습 알고리즘

8. 하이퍼 매개변수 최적화

    8.1. 하이퍼 매개변수 살피기

    8.2. 단일 하이퍼 매개변수 최적화: validation_curve 함수 이용


1. 인공 신경망의 태동

    1.1. 생물 신경망

뉴런(Neuron)은 뇌에서 연산을 수행하는 세포체(soma or cell body)이다.

처리한 정보를 다른 뉴런에 전달하는 축삭돌기(axon)와 정보를 받는 수상돌기(dendrite)로 구성한다.

뇌는 10^11개가량의 뉴런으로 고도의 병렬 처리기라고 할 수 있다.

반면 폰 노이만 구조의 컴퓨터는 아주 빠른 순차 명령어 처리기이다.

이러한 뉴런의 구조에서 영감을 얻어 구현을 하는 것이 인공 신경망이다.

 

    1.2. 인공 신경망의 발상과 전개

1943年 맥컬록과 피츠의 계산 모형

1949年 헤브의 학습 알고리즘

1958年 로젠블랫의 퍼셉트론, 위드로와 호프의 아달린과 마달린

1960年代 퍼셉트론에 대한 과도한 기대

1969年 민스키와 페퍼트의 Perceptrons』에서 퍼셉트론의 한계 지적

1986年 루멜하트의 Parallel Distributed Processing』에서 은닉층을 가진 다층 퍼셉트론 제안

1990年代 SVM에 밀리는 인공 신경망

2000年代 딥러닝으로 인해 신경망이 인공지능의 주류로 자리매김

 

2. 퍼셉트론의 원리

    2.1. 퍼셉트론의 구조와 연산

퍼셉트론의 구조는 입력층(여러 개의 노드)과 출력층(한 개의 노드)으로 구성한다.

입력층은  d+1개의 노드로 구성하고, 이때 d는 특징 벡터의 차원이다.

i번째 입력 노드와 출력 노드는 가중치 wi를 가진 간선(edge)으로 연결한다.

 

퍼셉트론 계산식(간선 계산(위), 활성 함수(아래))

i번째 간선은 xi와 wi를 곱해 출력 노드로 전달한다.

출력 노드에서는 d+1개의 곱셈 결과를 모두 더하여 S를 계산, 그 후 활성 함수(Activation Function)를 적용한다.

활성 함수는 뉴런을 활성화하는 과정을 모방한 것이다.

본 퍼셉트론에서는 활성 함수로 계단 함수를 사용했다. (S가 0보다 크면 1, 그렇지 않으면 -1을 출력하는 함수)

따라서 퍼셉트론은 특징 벡터를 1 또는 -1로 변환하는 이진 분류기이다.

 

    2.2. 퍼셉트론으로 인식하기

위에서 언급했듯이 퍼셉트론이 이진 분류기(Binary Classifier)일 때의 상황을 본다.

이진 분류 문제의 예시로는 불량품 구분, 환자 구분 등이 있다.

 

예를 들어서 제품을 크기와 색상을 나타내는 2개의 특징으로 표현한다고 가정해보자. (d = 2)

생산 라인에서 제품 4개를 수집하여 관찰한 결과 데이터를 확보한다.

x는 크기와 생산 데이터를 적은 특징 벡터이고, y는 불량품을 판단하는 레이블이다.

 └ 1일 때는 불량, -1일 때는 우량이다.

 

(b) 퍼셉트론의 가중치 w0 = -0.5, w1 = 1, w2 = 1를 퍼셉트론 계산식에 넣어보자.

o = w1 * x1 + w2 * x2 + wo = x1 + x2 - 0.5

o를 0으로 설정하면 직선의 방정식을 얻는다. (특징 공간을 분할하는 결정 경계)

x1 + x2 - 0.5 = 0 또는 x2 = -x1 + 0.5

위의 직선을 기준으로 나누는 이진 분류기가 된다. 

 

    2.3. 행렬 표기

퍼셉트론 행렬 표기 방법(왼쪽), 간략화 방법(오른쪽)

W와 X는 1*d 행렬, X의 전치 행렬인 X^T는 d*1 행렬

WX^T는 1*1 행렬로 스칼라이다.

보다 간결한 표현을 위해 바이어스를 첫 번째 요소로 추가한다.

W를 1*(d+1) 행렬로, X를 1*(d+1) 행렬로 확장하면 오른쪽과 같은 식이 된다.

 

실제 동작 예시는 위의 그림을 참고하자.

 

3. 퍼셉트론 학습 알고리즘

    3.1. 손실 함수 설계

손실 함수 J가 만족해야 하는 조건

손실 함수(J)는 학습 알고리즘에서 예측한 값과 실제 정답값을 비교하기 위해 사용하는 함수이다.

이때 손실 함수 J의 값을 낮추는 방향을 찾는 것이 곧 정답률을 높이는 길이다.

 

이때 함수 J는 위의 2가지 조건을 만족해야 만한다.

그러한 식은 다양하지만 위에 써있는 예시는 이해하기 쉬운 함수 중 하나이다.

 └ I는 w가 틀리는 샘플을 말한다.

 

    3.2. 학습 알고리즘 설계

경사 하강법(Gradient Descent)

경사 하강법의 원리가 여기서 적용된다.

간단하게 말하면 어떤 손실 함수 J = f(w)가 있을 때, J의 최저점이 되는 w를 찾아야 하는 것이다.

왼쪽의 경우는 매개변수가 1개일 때, 오른쪽은 매개변수가 2개일 때의 상황이다.

 

학습 규칙 유도: 매개변수가 하나일 때(왼쪽), 매개변수가 여럿일 때(오른쪽)

경사 하강법은 미분을 이용하여 최적의 해를 찾는 기법이다.

매개변수가 하나일 때의 왼쪽 식을 살펴보자.

미분값 αJ / αw1의 반대 방향이 최적 해에 접근하는 방향이므로, 현재 w1에 더했을 때 최적 해에 가까워진다.

이는 곧 왼쪽 식의 학습 규칙이다.

방향은 알지만 얼마나 가야 하는지 모르기 때문에 학습률 ρ를 곱하여 조금씩 이동한다.

 └ ρ는 하이퍼 매개변수로, 보통 0.001이나 0.0001처럼 작은 값을 사용한다.

 

매개변수가 여럿일 때의 오른쪽 식을 살펴보자.

매개변수 별로 독립적으로 미분을 하는 편미분으로 구한 gradient를 사용한다.

 

편미분 과정

매개변수가 여럿인 경우에 편미분을 하는 중간 과정이다.

 

이에 따라 퍼셉트론 학습 규칙은 위의 방정식이며, 행렬 표기로 나타내면 아래의 방정식이다.

행렬 표기식에서 Σ에 해당하는 부분이 퍼셉트론 학습 알고리즘이 사용하는 핵심 공식이다.

 

퍼셉트론 학습 알고리즘의 절차

훈련 집합에 있는 샘플 전체를 한 번 처리하는 일을 세대(Epoch)라고 부른다.

퍼셉트론 알고리즘은 전방 계산(순전파), 오차 계산, 후방 가중치 갱신(역전파)을 반복한다.

딥러닝을 포함하여 신경망 학습 알고리즘은 모두 이 절차를 따른다.

딥러닝은 많은 층을 거쳐 전방 계산과 후방 가중치 갱신을 수행한다.

 

4. 현대 기계 학습으로 확장

    4.1. 현대적인 기계 학습의 복잡도

기계 학습에서는 세 가지 문제로 나눌 수 있다.

분류(Classification) : 지정된 몇 가지 부류로 구분하는 문제

물체 검출(Object Detection) : 물체 위치를 바운딩 박스

물체 분할(Object Segmentation) : 화소 수준으로 물체를 찾아내는 문제

 

각 상황에 따라서 적절한 손실 함수가 필요하다.

분류 : 참 값과 예측 값의 차이를 손실 함수에 반영

물체 검출 : 참 바운딩 박스와 예측한 바운딩 박스의 겹침 정도를 손실 함수에 반영

물체 분할 : 화소 별로 레이블이 지정한 물체에 해당하는지 따지는 손실 함수에 반영

 

    4.2. 스토케스틱 경사 하강법

기계 학습에서의 경사 하강법은 표준 경사 하강법과는 사뭇 다르다.

잡음이 섞인 데이터가 개입하기도 하고, 매개변수가 방대하기도 하고, 일반화가 필요하기도 하는 등.

이런 특성들은 최적해 탐색을 어렵게 만든다.

 

Stochastic(스토케스틱)은 확률적이라는 뜻이다.

확률적 경사하강법(SGD)은 2가지 모드가 있다.

 

배치 모드 : 틀린 샘플을 모은 다음 한꺼번에 매개변수를 갱신하는 방법

패턴 모드 : 특정 패턴마다 매개변수를 갱신하는 방법 (세대 시작 시 샘플을 섞어 랜덤 샘플링 효과를 제공한다.)

 

딥러닝에서는 두 모드를 적절히 섞은 '미니 배치'를 사용한다.

훈련 집합을 일정한 크기의 부분 집합으로 나누고, 부분 집합 별로 처리한다.

부분 집합으로 나눌 때 랜덤 샘플링을 적용하기 때문에 SGD(Stochastic Gradient Descent)라고 부른다.

 

5. 퍼셉트론 프로그래밍

    5.1. OR 데이터 인식

두 개의 이진수 입력이 있을 때, 둘 다 거짓(0)일 경우 0을, 하나라도 참(1)일 경우 1을 뱉는 OR 연산

이를 파이썬으로 작성한 코드이다.

 

    5.2. 필기 숫자 데이터 인식

sklearn에서 제공하는 숫자 데이터를 퍼셉트론에 적용하는 코드이다.

전문은 길기에 핵심 일부만 발췌하여 올린다.

이를 실행시키면 정확률은 약 93.88%에 달하는데 98.74%의 SVM 모델보다 조금 낮은 수치이다.

이는 퍼셉트론이 선형 분류기이기 때문에 나타나는 현상이다.

 

    5.3. 기계 학습의 디자인 패턴

sklearn의 디자인 패턴

기계 학습의 디자인 패턴은 위와 같다.

보통 어떤 모델을 사용하냐만 달라지고 나머지는 유사한 경우가 많다.

 

소프트웨어 공학론에서도, 프로그래밍에서도 어떠한 틀을 잡기 위해서는 디자인 패턴이 중요하다.

 └ 소프트웨어의 디자인 패턴을 강조: Design Patterns: Elements of Reusable Object-oriented Software

예를 들어서 리스트에서 최소ㆍ최대 값을 찾는 과정은, list는 Iterator라는 디자인 패턴 하에 동작한다는 것을 알아야 한다.

 

6. 다층 퍼셉트론

    6.1. 특징 공간 변환

위와 같은 상황의 두 그래프가 있다고 해보자.

좌측은 선형 분리가 가능하지만, 우측은 선형 분리가 불가능하다.

이를 은닉층을 추가한 다층 퍼셉트론을 사용해, 비선형으로 확장해야 한다.

 

퍼셉트론 2개로 XOR 데이터를 인식하는 방법

2개의 퍼셉트론을 사용하여 특징 공간을 세 부분으로 나눈다.

그리고 각각의 퍼셉트론을 오른쪽과 같이 표현해준다.

 

퍼셉트론 2개를 병렬 결합하여 특징 공간을 변환

위에서 생성한 2개의 퍼셉트론을 병렬로 결합한다.

(x1, x2) 좌표 공간을 (z1, z2) 공간으로 변환한다.

 

새롭게 만든 공간은 선형 분리가 가능해진 공간으로 바뀐다.

하나의 퍼셉트론을 더 추가하면, 오른쪽과 같이 XOR 문제를 푸는 신경망을 만들 수 있다.

 

위에 (z1, z2) 같은 임시 공간에 해당하는 층을 은닉층(Hidden Layer)라고 부른다.

 └ 임시 공간을 은닉 공간(Hidden Space) 또는 잠복 공간(Latent Space)라고도 부른다.

새로운 공간은 이전 공간보다 분류에 더 유리하도록 학습된다.

은닉층을 수십에서 수백 개를 갖는 깊은 신경망 학습을 딥러닝이라고 부른다.

 

    6.2. 다층 퍼셉트론의 구조

여러 개의 퍼셉트론으로 이루어진 구조를 다층 퍼셉트론이라고 한다.

이 다층 퍼셉트론은 입력층, 은닉층, 출력층으로 구성한다.

이때 가중치 뭉치가 얼마나 있느냐로 층을 센다.

 └ 왼쪽은 가중치 뭉치가 2개이기 때문에 2층 신경망, 오른쪽은 가중치 뭉치가 1개이기 때문에 단층 신경망

또한 데이터에 의해 입력층과 출력층의 노드 개수가 확정된다.

은닉층의 노드 개수는 하이퍼 매개변수로 사용한다.

 └ 은닉 노드가 많으면 신경망 용량이 커지지만, 과적합 가능성이 높아짐

 

U1ji는 i번째 입력 노드와 j번째 은닉 노드를 연결하는 가중치이다.

U2kj는 j번째 은닉 노드와 k번째 출력 노드를 연결하는 가중치이다.

 

    6.3. 다층 퍼셉트론의 동작

노드와 첨자가 많아 복잡해보이기는 하지만 각 노드별로 Σ 연산을 하는 것은 변함 없다.

 

활성화 함수 τ1은 주로 ReLU(Rectified Linear Unit), τ2는 주로 Softmax를 사용한다.

위의 행렬은 훈련 집합에 있는 샘플들에 대한 값이고,

아래는 전체 과정을 하나의 행렬로 표현한 것이다.

 

U1과 U2는 각각 가중치 뭉치를 행렬로 표현한 것이다.

위에서 언급한 전체 과정을 표현한 행렬에 대입을 하면 오른쪽의 연산 과정을 거친다.

이때 X = (0, 1) 샘플을 처리하는 과정이라 가정하고, 계단 함수를 사용하며, 바이어스 항을 추가해 (1, 0, 1)의 형식이다.

 

위는 여러 개의 데이터를 한꺼번에 처리하는 경우의 연산 과정이다.

출력 노드가 하나이고 샘플이 4개이므로, 출력 벡터 O는 1*4의 행렬이다.

 └ 일반적으로 출력 노드가 c이고, 샘플이 n개이면, 출력 벡터 O는 c*n 행렬이다.

 

1*N이 아닌 N*M 형태의 행렬이 나올 수도 있다.

위는 숫자 인식을 하고 나온 행렬 결과값이다.

이때는 여러 값들 중 값이 가장 큰 인덱스를 최종 분류 결과로 출력한다.

 

    6.4. 활성 함수

인공 신경망에서의 다양한 활성화 함수

계단 함수는 무언가를 이진분류하기에는 적합하나, 그런 상황만 있는 것은 아니다.

따라서 다층 퍼셉트론은 시그모이드(Sigmoid), 딥러닝은 ReLU, Softmax 함수를 주로 사용한다.

 

출력층에서는 주로 소프트맥스(Softmax) 함수를 사용하는데, 확률로 간주할 수 있기 때문이다.

위는 Softmax 함수식이다.

 

7. 오류 역전파 알고리즘

    7.1. 손실 함수 설계

신경망의 출력 벡터(예측값) O가 부류 벡터(참값) y와 같을수록 매개변수 U1과 U2는 데이터를 잘 인식한다.

출력 벡터와 부류 벡터가 다르면 가까워지도록 U1과 U2를 갱신해야 한다.

이때 오차가 클수록 갱신하는 양이 크다.

 

샘플 하나의 오차를 측정하는 '손실 함수'를 사용하여 오차를 갱신한다.

보통 부류 벡터 y는 원핫 코드로 표현한다.

두 식 중 위의 식을 확장하면 아래의 식이 된다.

 └ 평균 제곱 오차식(MSE; Mean Squared Error)

 

계산 편의를 위해 제곱을 하여 제곱근을 제거한다.

미니 배치 단위로 처리하는데, 이는 곧 샘플 오차의 평균을 의미한다.

 

    7.2. 학습 알고리즘

오류 역전파 학습 알고리즘

가중치 갱신 규칙은 퍼셉트론과 비슷하다.

출력층에서 시작하여 역방향으로 오류를 전파한다는 뜻에서 오류 역전파라고 한다.

 └ 오류 역전파 : Error-Backpropagation

정확한 갱신값을 구하는 방법은 미분을 통해서 구한다.

 

8. 하이퍼 매개변수 최적화

    8.1. 하이퍼 매개변수 살피기

하이퍼 매개변수는 모델의 구조와 모델의 학습 과정을 제어하는 역할의 매개변수이다.

MLPClassifier 함수는 6개의 매개변수를 갖는데 이 중 5개는 하이퍼 매개변수이다.

ㆍ hidden_layer_sizes = (100) : 100개의 노드를 가진 은닉층 한 개를 둠

ㆍ learning_rate_init = 0.001 : 학습률 ρ을 0.001로 설정

ㆍ batch_size = 32 : 미니 배치 크기를 32로 설정

ㆍ max_iter = 300 : 최대 세대(반복) 수를 300으로 설정

ㆍ solver = 'sgd' : 최적화 알고리즘으로 SGD(Stochastic Gradient Descent) 알고리즘을 사용

 

dir(MLPClassifier)

MLPClassifier 함수는 실제로 23개의 매개변수를 갖는다.

 └ 파란색이 사용한 매개변수, 나머지는 기본값을 사용하였다.

 └ Ex) activation = 'relu'가 기본값이므로 활성화 함수로 ReLU를 사용

 └ Ex) shuffle = True가 기본값이므로 세대를 시작할 때마다 훈련 집합 샘플 순서를 섞음

 └ Ex) tol = 0.0001, n_iter_no_change = 10 : 10세대 동안 손실 함수 감소량이 0.0001 이하이면 멈춤

 

이처럼 매개변수는 함수 별로 설정해주는 것이 다르다.

매개변수, 특히 하이퍼 매개변수 설정은 논문이나 공식 문서의 가이드라인을 따라가야 함을 참고하자.

 

    8.2. 단일 하이퍼 매개변수 최적화: validation_curve 함수 이용

x_train, x_test, y_train, y_test
     = train_test_split(digit.data, digit.target, train_size = 0.6)

훈련 집합과 테스트 집합을 6:4 비율로 나눈다.

 

mlp = MLPClassifier(learning_rate_init = 0.001,
                    batch_size = 32,
                    max_iter = 300,
                    solver = 'sgd')
prange = range(50, 1001, 50)
train_score, train_test = validation_curve(mlp,
                                           x_train,
                                           y_train,
                                           param_name = "hidden_layer_sizes",
                                           param_range = prange,
                                           cv = 10,
                                           scoring = "accuracy",
                                           n_jobs = 4)

50에서 1000까지 50씩 증가하는 값을 범위(prange)에 넣는다.

cv = 10는 10겹 교차 검증으로 성능을 측정하라는 의미이다.

n_jobs = 4는 코어 4개를 사용하여 병렬 처리하라는 의미이다.

 └ 데이터가 크거나 여러 번 학습을 수행하는 등의 시간이 많이 걸리는 경우 병렬 처리 기능으로 실행 시간을 줄여야 한다.

 

핵심 코드를 포함한 코드 전문을 실행시킨 결과는 위와 같다.

1. 기계 학습과 기초

    1.1. 데이터셋 읽기

    1.2. 기계 학습 적용: 모델링과 예측

2. 인공지능 제품의 설계와 구현

    2.1. 인공지능 설계 사례: 과일 등급을 분류하는 기계

    2.2. 규칙 기반 vs 고전적 기계 학습 vs 딥러닝

3. 데이터에 대한 이해

    3.1. 특징 공간에서 데이터 분포

    3.2. 영상 데이터 사례: 필기 숫자

    3.3. 영상 데이터 사례: Ifw 얼굴 데이터셋

    3.4. 텍스트 데이터 사례: 20newsgroups

4. 특징 추출과 표현

    4.1. 특징의 분별력

    4.2. 특징 값의 종류

5. 성능 측정

    5.1. 혼동 행렬과 성능 측정 기준

    5.2. 훈련/검증/테스트 집합으로 쪼개기

    5.3. 교차 검증

6. 인공지능은 어떻게 인식을 하나?

    6.1. 특징 공간을 분할하는 결정 경계

    6.2. SVM의 원리


1. 기계 학습과 기초

    1.1. 데이터셋 읽기

sklearn에서 datasets 클래스를 불러온다.

load_iris() 함수로 iris 데이터셋을 읽어온 뒤 d의 DESCR 변수를 출력한다.

 └ 데이터셋 : 기계 학습이 사용하는 여러 개의 샘플을 담은 데이터

 

데이터 샘플을 특징 벡터와 레이블로 표현한다.

특징 벡터는 x로, 특징 벡터의 차원은 d로 나타낸다.

레이블은 0 ~ c-1 또는 1 ~ c 또는 원핫인코딩으로 나타낸다.

 └ 원핫인코딩(One hot encoding) : 한 요소만 1인 이진 배열, (1, 0, 0), (0, 1, 0), (0, 0, 1) 같은 배열이다.

 

    1.2. 기계 학습 적용: 모델링과 예측

SVM(Support Vector Machine)이라는 기계 학습 모델을 사용한다.

이때 9번 줄의 gamma는 하이퍼 매개변수, 10번 라인은 훈련 집합, 13번 라인은 테스트 집합이다.

 

훈련 집합 : 기계 학습 모델을 학습하는데 쓰는 데이터로, 특징 벡터와 레이블 정보를 모두 제공한다.

테스트 집합 : 학습을 마친 모델의 성능을 측정하는데 쓰는 데이터로, 예측할 때는 특징 벡터만 결과로 정확률을 측정할 때는 레이블 정보만 사용한다.

하이퍼 매개변수(Hyper Parameter) : 모델의 동작을 제어하는 데 사용하는 변수이다. 모델 학습 시작 전 설정해야 하는데, 적절한 값으로 설정해야 좋은 성능을 낼 수 있다.

 

2. 인공지능 제품의 설계와 구현

    2.1. 인공지능 설계 사례: 과일 등급을 분류하는 기계

1. 데이터 확보

     └ 데이터 편향을 방지하기 위해 여러 곳에서 데이터를 수집

     └ 데이터 편향 : 여러 데이터셋이 중심으로부터 얼마나 떨어져 있는가

2. 특징 벡터와 레이블 준비

     └ 어떤 특징을 사용할 것인가 고려

3. 학습하는 과정을 프로그래밍 (훈련 데이터 사용)

4. 예측 과정을 프로그래밍 (테스트 데이터 사용)

 

    2.2. 규칙 기반 vs 고전적 기계 학습 vs 딥러닝

규칙 기반 방법

분류하는 규칙을 사람이 구현한다.

규모가 큰 데이터셋에서는 불가능하고, 데이터가 바뀌면 처음부터 작업을 새로 해야 하기에 비효율적이다.

 

기계 학습 방법

특징 벡터를 추출하고 레이블을 붙이는 과정은 규칙 기반과 동일하다.

규칙을 만드는 일은 기계 학습 모델을 이용하여 자동으로 수행한다. 

 

딥러닝 방법

레이블을 붙이는 과정은 기계 학습과 동일하다.

특징 벡터를 학습을 통해 자동으로 알아낸다.

 └ 특징 학습(Feature Learning) 또는 표현 학습(Representation Learning)을 한다고 말한다.

특징 추출과 분류를 동시에 최적화하여 뛰어난 성능을 보장한다.

 

원샷 학습 vs 퓨샷 학습 vs 준지도 학습

레이블을 붙이는 작업은 전문가(사람)가 직접 수동으로 해야 하므로 비용이 많이 소요된다.

따라서 딥러닝에서는 레이블이 있는 샘플을 하나만 사용해 학습하는 원샷 학습(1-shot learning),

몇 개의 샘플만을 사용하는 퓨샷 학습(few-shot learning),

레이블이 있는 소량의 샘플과 레이블이 없는 대량의 샘플을 같이 사용하는 준지도 학습(semi-supervised learing)이 있다. 

 

3. 데이터에 대한 이해

    3.1. 특징 공간에서 데이터 분포

iris 데이터셋은 특징이 4개이므로 4차원 특징 공간을 형성한다.

 └ 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비

150개 샘플 각각은 4차원 특징 공간의 한 점이다.

꽃잎 길이를 제외한 3차원 특징 공간으로 표현한 것이 오른쪽의 그림이다.

 

꽃받침 너비(sepal width) 축은 세 부류가 많이 겹쳐 분별력이 낮다.

전체적으로 보면 세 부류가 3차원 공간에서 서로 다른 영역을 차지하는데 몇 개 샘플은 겹쳐서 나타난다.

 

다차원 특징 공간

사람이 인식할 수 있는 종이에 표현 가능한 공간은 현재 3차원이 최대이다.

하지만 수학은 아주 높은 차원까지 다룰 수 있다.

단순하게 표현하면 2차원이 여러 묶음이면 3차원, 3차원이 여러 묶음이면 4차원이다. N차원 여러 묶음 = N+1차

이를 수식으로 표현하면 d(x, y) = (Σdi=1(xi-yi)^2)^(1/2)이다.

 

    3.2. 영상 데이터 사례: 필기 숫자

sklearn 데이터셋 : 8*8 화소, 1797개 샘플, [0, 16] 명암값

MNIST 데이터셋 : 28*28 화소, 7만개 샘플, [0, 255] 명암값

 

    3.3. 영상 데이터 사례: Ifw 얼굴 데이터셋

Ifw(Labeled faces in the wild) 데이터셋

5749명의 유명인 얼굴 양상 13233장, 50*37 화소, [0, 255] 명암값

데이터 편향 주의 : 어린이, 흑인 등의 얼굴 데이터가 적어 얼굴 인식 프로그램 제작에는 부적절하다.

 

    3.4. 텍스트 데이터 사례: 20newsgroups

웹에서 수집한 문서를 20개 부류로 구분한다.

텍스트로 구성되어 샘플의 길이가 다르다.

시계열(時系列) 데이터로 단어가 나타나는 순서가 중요하다.

 

4. 특징 추출과 표현

기계 학습의 과정

실제에서는 다양한 형태로 나타나지만, 일반적인 기계 학습의 과정이다.

 

    4.1. 특징의 분별력

사람의 직관은 높은 분별력(Discriminating power)을 가지고 있다.

예를 들어 두 개의 컵이 있을 때 무엇이 다른지(손잡이, 색상, 뚜껑 유무 등)를 한 눈에 알아본다.

이런 특징(높은 분별력)을 기계 학습에서 사용해야 한다.

실제 세상은 (c)와 (d) 같은 비 선형 데이터를 생성한다.

데이터의 측정이나 레이블링 오류, 비합리적인 특징을 추출하는 알고리즘에 기반한다. 

 

    4.2. 특징 값의 종류

수치형 특징

ㆍ iris처럼 4개의 특징 실수값을 가지고 있다.

ㆍ 거리 개념이 존재한다.

ㆍ 실수 또는 정수 또는 이진값이다.

 

범주형 특징

ㆍ 순서형 : 학점, 등급 등이 속하고, 거리 개념이 있다. 순서대로 정수를 부여하면 수치형으로 취급이 가능하다.

ㆍ 이름형 : 혈액형, 지역 등이 속하고, 거리 개념이 없다. 보통 원핫 코드로 표현한다.

 

5. 성능 측정

    5.1. 혼동 행렬과 성능 측정 기준

혼동 행렬(Confusion Matrix)

혼동 행렬(Confusion Matrix)

ㆍ 부류 별로 옳은 분류와 틀린 분류의 개수를 기록한 행렬

ㆍ nij는 모델을 i라고 예측했는데 실제 부류는 j인 샘플의 개수

 

이진 분류에서 긍정(Positive)과 부정(Negative) 구분

ㆍ 검출하고자 하는 데이터가 긍정

ㆍ 참 긍정(TP), 거짓 긍정(FP), 참 부정(TN), 거짓 부정(FN) 4가지로 분류

 

위 3가지 공식은 널리 쓰이는 성능 측정 기준이다. 

정확률(Accuracy) : 부류가 불균형일 때 성능을 제대로 반영하지 못한다.

특이도(Specificity), 민감도(Sensitivity) : 의료 분야에서 주로 사용

정밀도(Precision), 재현률(Recall) : 정보 검색에서 주로 사용

 

    5.2. 훈련/검증/테스트 집합으로 쪼개기

주어진 전체 데이터를 적절한 비율로 훈련, 검증, 테스트 집합으로 나누어 사용한다.

모델 선택 포함 시 훈련, 검증, 테스트 집합으로 데이터를 나눈다.

모델 선택 제외 시 훈련, 테스트 집합으로만 데이터를 나눈다.

 

Line 8 : train_test_split 함수로 훈련 60% 테스트 40%로 랜덤 분할

 └ 난수를 사용하여 데이터를 분할하기 때문에 실행할 때마다 결과가 다르게 나온다.

Line 12 : 훈련 집합 x_train, y_train을 fit 함수에 주어 학습 수행

Line 14 : 테스트 집합의 특징 벡터 x_test를 predict 함수에 주어 예측 수행

Line 17~20 : 테스트 집합의 레이블 y_test를 가지고 혼동 행렬 계산

 

    5.3. 교차 검증

K-겹 교차 검증의 예시(K가 5인 경우)

훈련, 테스트 집합 나누기의 한계가 있다.

우연히 높은 정확률이나 낮은 정확률이 발생할 가능성이 있다.

따라서 교차 검증을 통해 정확하게 학습할 필요가 있다.

 

K-겹 교차 검증(K-fold cross validation)

훈련 집합을 k개의 부분집합으로 나누어 사용한다.

한 개를 남겨두고 K-1개로 학습한 다음 남은 1개의 데이터로 성능을 측정한다.

 K개의 성능을 평균으로 신뢰도를 높이는 방법이다.

 

6. 인공지능은 어떻게 인식을 하나?

    6.1. 특징 공간을 분할하는 결정 경계

특징 공간의 변환 예

인공지능의 인식과 연산은 철저하게 수학에 의존한다.

샘플은 특징 벡터로 표현하며, 특징 벡터는 특징 공간의 한 점에 해당한다.

인식 알고리즘은 원래 특징 공간을 더 유리한 새로운 특징 공간으로 변환하여, 부류를 결정한다.

위의 그림처럼 XOR를 좌표 평면으로 나타낸다면 왼쪽과 같지만, 특정 연산 후 오른쪽으로 선형 분류가 가능해진다.

 

특징 공간을 분할하는 결정 경계(Decision Boundary)

왼쪽은 2차원에서의 결정 경계(직선)의 예시이고, 오른쪽은 3차원에서의 결정 경계(평면)의 예시이다.

현대 기계 학습이 다루는 데이터는 수백에서 많게는 수만 차원의 특징 공간을 지닌다.

딥러닝에서 여러 특징 공간 변환을 수행하는데 이를 '특징 학습' 또는 '표현 학습'이라고 부른다.

 

언제나 선형 분류가 불가능하기에 비선형 분류기(Nonlinear Classifier)를 사용하여 분류를 한다.

이때 과잉 적합(Overfitting)을 회피하는 것이 중요하다.

 └ 과잉 적합은 아웃라이어를 맞추려고 과다하게 복잡한 결정 경계를 만드는 현상이다.

 └ 훈련 집합에 대한 성능은 높지만 테스트 집합에 대해서는 낯은 성능을 보여준다.

 

    6.2. SVM의 원리

여백을 최대화하여 일반화를 극대화하는 SVM 예시

(a)에서 2와 3번 분류기를 보았을 때, 어느 것이 더 분류를 잘했다고 할 수 있을까?

둘 다 100%의 정확도를 지니지만 두 분류를 같다고 할 수 있을까?

 

 이런 관점에서 기계 학습의 목적은 일반화 능력을 극대화하는 것이 목표이다.

이말은 SVM을 활용해 여백을 최대화 한다는 것이다. 

 └ SVM(Support Vector Machine) : 기계 학습의 분야 중 하나로 패턴 인식, 자료 분석을 위한 지도 학습 모델

SVM은 두 부류까지의 거리인 2s를 여백(margin)이라고 부른다.

SVM 학습 알고리즘은 여백을 최대화하는 결정 경계를 찾는다.

 

원래 SVM은 선형 분류기이지만 비선형 분류기로 확장하여 사용한다.

커널 함수로는 polynomial function, radial basis function, sigmoid 함수를 사용한다.

커널 함수의 종류와 모양을 조절하는 매개변수는 하이퍼 매개변수이다.

 

예를 들면 위의 식에서는 C라는 하이퍼 매개변수를 사용한다.

C를 크게 하면 여백이 작아지고, C를 작게 하면 여백은 커지지만 잘못 분류한 샘플이 많아진다.

이에 따라 적당한 하이퍼 매개변수값을 설정하는 것이 중요하다.

본 글에서는 프로그래밍 환경 구축, 모듈 설치, 파이썬 코드들에 대한 설명은 생략한다. 
 

1. 프로그래밍 환경

클라우드 방식(왼쪽), 스탠드얼론 방식(오른쪽)

클라우드 방식
ㆍ 프로그램과 데이터가 서버에 저장되고 관리된다.
ㆍ 서버에 환경이 대부분 갖추어져 있어 로그인하면 바로 프로그래밍이 가능하다.
ㆍ 인터넷 연결만 가능하면 어느 곳에서나 개발이 가능하다.
ㆍ 구글의 Colab, 아마존의 SageMaker, 마이크로소프트의 Azure 등이 있다.
ㆍ 내 프로젝트에 최적의 환경은 갖출 수 없다는 한계가 있다. 
 
스탠드얼론 방식
ㆍ 자신에게 최적인 환경을 나만의 환경에 구축하여 프로그래밍 한다.
ㆍ 프로그램과 데이터를 자신의 컴퓨터에 저장한다.
ㆍ 소프트웨어를 설치하고 환경을 스스로 구축해야 한다는 한계가 있다.
 

2. 파이썬

프로그래밍 언어 번역은 두 가지 방식이 있다.
 
컴파일러(Compiler) 방식
ㆍ 프로그램 전체를 번역한 다음 한꺼번에 실행하는 방식이다.
ㆍ 실행이 빠르다는 장점이 있다.
ㆍ C, C++ 등에서 사용하는 방식이다.
 
인터프리터(Intrepreter) 방식 
ㆍ 한 라인씩 번역하고 실행하는 일을 순차적으로 수행하는 방식이다.
ㆍ 일부 코드만 선택하여 실행 가능하다는 장점이 있다. 
ㆍ JavaScript, SQL, Python 등에서 사용하는 방식이다. 
 

파이썬 인공지능 개발에서 자주 사용하는 라이브러리 목록

넘파이(Numpy) : 다차원 배열 연산 지원
맷플롯립(Matplotlib) : 데이터 시각화(그래프 및 좌표 표현 등)에 사용
사이킷런(Scikit-learn) : 고전적인 기계 학습 지원 라이브러리
텐서플로(TensorFlow) : 딥러닝 지원 라이브러리
케라스(Keras) : 텐서플로를 한 단계 추상화한 라이브러리
파이토치(PyTorch) : 딥러닝 라이브러리

1. 개요

해석 기관은 우리가 명령하는 방법을 알고 있는 것은 무엇이든 계산해낼 수 있다.
- 에이다 러브레이스(Ada Lovelace) 1843年 -

 

최초의 프로그래머인 그녀가 남긴 말이다. 더 정확하게는 "해석 엔진은 숫자 이외의 것도 처리할 수 있을 것이다. 예를 들어 화음과 음조를 해석 엔진의 표기에 맞출 수 있다면 해석 엔진은 꽤 복잡한 곡을 작곡할 수도 있다." 라고 말하였다.

 

그로부터 170여년이 지난 2016년. 알파고가 이세돌을 이기는 일이 일어났다.

시간이 더 지나 일론 머스크에 의해 자율주행 자동차가 거리를 다니고 있고,

그녀의 말처럼 작곡하는 마젠타 프로젝트가 생기기도 하였다. 

 

2. 인공지능

인공지능을 강한 인공지능과 약한 인공지능으로 나누어 보기도 한다.

 └ 강한 인공지능은 다양한 지능의 복합체로서, 인조인간이나 휴머노이드 등을 말한다.

 └ 약한 인공지능은 한 가지 지능에 특화된 인공지능으로, 현재의 번역기나 알파고 등을 말한다. 

 

튜링 테스트(왼쪽), 중국어 방 논제(오른쪽)

최근 튜링 테스트를 통과하는 인공지능들도 속속이 나오고 있다.

앨런 튜링에 의하면 튜링 테스트를 통과한 기계는 생각한다고 간주해도 된다고 한다.

 

또한 이와 유사하게 '중국어 방 논제'가 있다.

중국어를 할 수 없는 사람이 방 안에 중국어 사전(중국어로 된 질문 목록 등)을 들고 들어간다.

그 사람은 중국어 질문이 들어오면 사전을 보고 중국어로 된 답변을 내놓는다.

이럴 때, "이 사람은 중국어를 할 수 있느냐?"고 논의하는 것이다.

정답은 "YES"이고, 이는 현재 인공지능의 과정과 동일하다.

 

3. 인공지능 활용

현재 인공지능은 자율주행, 의료, 예술, 언어, 게임 등 다양한 분야에 사용하고 있다.

블록 코딩으로 쉽게 가르치는 "Scratch"처럼 쉽게 인공지능을 활용할 수 있는 "Teachable Machine"도 나오고 있다.

또한 블록 코딩으로 앱을 제작하는 "App Inventor"에서 인공지능 관련 컴포넌트를 제공하고 있다.

 └ SpeechRecognizer(음성 인식), TextToSpeech(음성 합성), YandexTranslate(언어 번역) 등

 

이외에 다양한 인공지능 활용과 개념에 대해서는 하단의 자료들을 참고하자.

ㆍ 작곡 인공지능 마젠타, http://magenta.tensorflow.org

ㆍ 표준국어대사전 인공지능, https://stdict.korean.go.kr/search/searchView.do?word_no=472435&searchKeywordTo=3

ㆍ 인공지능 학문, 『Artificial Intelligence: Foundations of Computational Agents』 2017 Poole 

ㆍ 인공지능 역사, https://en.wikipedia.org/wiki/History_of_artificial_intelligence

ㆍ 인공지능 역사, https://www.ai.nl/artificial-intelligence/timeline-of-ai-a-brief-history-of-artificial-intelligence-its-highlights/

ㆍ Teachable Machine, https://teachablemachine.withgoogle.com/

ㆍ App Inventor, https://appinventor.mit.edu/

 

4. 인공지능 이해

인공지능 접근 방법의 두 가지 관점

ㆍ 과학적 : 인간의 지능을 충분히 연구한 후, 그 원리를 충실히 모방하는 지능 기계 제작

ㆍ 공학적 : 쓸만한 지능 기계를 만들 수 있다면, 굳이 인간 지능 원리를 따르지 않아도 괜찮음

> 현재는 공학적 접근 방법이 지배적이다.

 

두 가지 방법론

ㆍ 규칙 기반 방법론

개념 : 사람이 사용하는 규칙을 수집하여 프로그래밍한다.

특징 : 한계점이 명확하다. 규칙에 위반되는 예외 샘플들에 대한 처리가 난해하다.

 

ㆍ 기계 학습 방법론

개념 : 충분한 데이터를 수집한 다음 기계 학습 모델을 통해 학습한다.

특징 : 1990년대부터 기계 학습 방법론을 주도적으로 활용하고 있다. 

 

프로그래밍 언어 : Python

파이썬은 벡터와 행렬 처리를 코딩하는데 편리한 언어이다.

기계 학습은 벡터와 행렬 처리를 많이 수행하므로 파이썬을 주로 사용한다.

+ Recent posts