언어나 문장을 컴퓨터가 처리 하게 하는 자연어 처리도 이미지 인식이나 음성 인식과 함께 머신러닝의 중요 응용 분야입니다.
01. 문장 구조 이해
자연어처리 :
자연어에 대응하는 개념은 인공어 입니다.
기계가 자연어를 분석하고 해석해 의미를 이해한 결과로 사람에게 도움이나 피드백을 주는 것을 자연어 처리 라고 합니다. Natural Language Processing
자연어 처리는 문장을 단어로 나눠서 특징을 추출하고 다른 언어로 번역하는 등의 업무를 합니다.
텍서트 마이닝이라는 분석 처리는 방대한 양의 문장에서 특징 단어나 문장을 추출해 시각화(그래프 등)합니다 .
띄어쓰기와 형태소 분석
형태소 분석은 단어를 나누고 단어 분할로 얻은 단어의 품사를 인식하는 작업입니다. 품사 정보를 알면 단어 나누기 편히하므로 절 인식과 품사 인식을 함께 합니다.
한국어 형태소 분석을 위한 개발 환경으로는ㄴ MeCabl, 코엔엘파이 KoNLPy등이 있습니다.
형태소 분석과 다른 단어 분할 방법으로 n-gram이 있습니다.
문장으로 주어진 문자열을 n개 의 문자 창으로 설정해 문자 1개를 중복으로 포함하면서 단어를 생성한느 방법입니다.
문자 단위 n-gram
단어 단위 n-gram
형태소 분석이나 n-gram을 통해 단어 열로 분해한 상태(단어 각각의 배열이나 단어의 출현 횟수)를 하나의 묶음으로 나타내는 방법을 Bag-of-Words BoW모델이라고 합니다.
한편 베이즈 모델로 띄어쓰기하는 방법도 있습니다. 이를 비모수 베이즈 모델에 근거한 자율단어 분할법이라고 합니다.
단어 목록이 없는 상황에서도 단어를 나눌 수 있는 것이 특징입니다.
이 방법은 디리클레 과정을 기반으로 둔 n-gram모델을 확장한 피트만-요 과정을 더 확장한 것입니다.
디레클레 과정에서 나타나는 단어 종류가 많을 수록 단어의 확률분포가 정해집니다.
그밖에 피트만-요 과정을 계층화한 계층 피트만-요 언어 모델 , 계층 피트만-요 언어 모델을 응용한 중첩 피트만-요 언어 모델도 있습니다. 이들은 공백을 없앤 영어도 단어를 이해할 수 있는 형태로 띄어쓰기할 수 있고 고문이나 해석할 수 없는 미지의 언어 등에도 사용할 수 있습니다.
02. 지식 습득과 통계 의미론
지식 획득 knowledge acquisition
컴퓨터 시스템(전문가 시스템 등)에 주어진 자연어 데이터는 지식과 특징을 추출해 정보를 얻을 수 있습니다. 이 정보를 지식 기반에 저장하는 것
문서의 특징량 지표로 문서 검색에서 일반적으로 이용하는 TF-IDF가 있습니다.
TF 는 단어 빈도 (Term Frequency)라고 하며 문서 안 단어의 출현 빈도를 의미합니다.
IDF는 역문서 빈도(Inverse Document Frequency)라고 하며 전체 문서 중 어떤 단어가 나오는 문서 수 (전체 문서 수로 나눈 빈도)의 역수를 구한 후 로그를 취한 다음에 1을 더한 값입니다.
이를 피하는 방법으로는 잠재 의미 인덱싱 Latent Sematic Indexing LSI이 있습니다.
특잇값 분해로 차원을 압축해서 중요도가 낮아 보이는 단어를 없애 상대적인 유사도를 높입니다.
또한 행렬 분해 기법인 잠재 의미 인덱싱에 확률 요소를 도입한 언언 모델로 확률 잠재 의미 인덱싱 Probabilistic Latent Semantic Indexing , PLSI이 있습니다. 문서에 나오는 단어 주제의 분포에서 단어 분포가 생성된다는 것을 모델화한 것입니다.
모델화한 잠재 디리클레 할당
주제 모델 Topic model: 어떤 단어가 어떻게 문서나 주제에서 생성된느지 계산 모델로 검토하는 연구 영역
워드넷 WordNet
word2vec : 단어의 관계를 두 계층의 신경망에서 추정해 백터 공간에 나타낸 모델로
03. 구조 분석
할당 분석
할당은 단어와 단어 사이의 관계를 나타내는 것으로 관계를 파악하면 문장의 의미를 이해할 수 있습니다.
할당받은 구조를 기계적으로 처리해서 관계를 파악하는 방법을 할당 분석이라고 합니다.
이동-감축 shift-reduce법이고 두가지 작업을 반복하면 트리 구조를 형성합니다.
이동 처리는 분석하지 않은 단어 열의 왼쪽(첫번째)을 트리에 넣는 작업니다.
감축 처리는 트리 집합 중 오른쪽 2개의 단어를 화살표로 연결하는 작업니다.
최소 생성 트르 Minimum Spanning Tree, Mst : 단어를 노드로 구성하는 그래프를 작성합니다.
그리고 단어 사이의 관계에 점수를 설정한 후 높은 조합을 남겨서 트리 구조를 생성합니다.
이동-감축법이 단어를 하나씩 처리한다면 최소 생성 트리법은 한꺼번에 처리합니다.
정밀도 측면에서는 최소 생성 트리법이 좋지만 처리 시간이 길어서 시간 효율성은 이동- 감축법이 좋습니다.
술어 줄 구조 분석 : 문장의 의미는 술어 대상을 나타내는 명사구 절로 표현할 수 있으므로 이들을 식별하는 처리를 술어 절 구조 분석이라고 합니다.
어구 구조 분석 : 단어 열로 구성된 어구를 통해 구조를 파악하는 방법으로 는 어구 구조 분석이 있습니다.
딥러닝
순환 신경망 Long Short-Term Memory를 자주 이용합니다.
순환신경망 이용은 단어 열의 나열을 시계열 상의 입력 데이터로 취급하는 것이 핵심입니다.
Long Short-Term Memory은 순환 신경망을 더 안정적으로 처리할 필요가 있을 때 사용합니다
한편 절 구조를 갖는 트리 구조로 단어 열을 다루면 재귀 신경망을 이용할 수 도 있습니다.
04. 텍스트 생성
기계번역: 기계를 통해 이해하기 어려운 문장을 원래의 문장으로 되돌리는 처리
어순의 차이는 기계 번역의 큰 장애물입니다.
목적 언어의 구조 정보를 이용 string - to - tree : 목적 언어의 구조 분석에 의존하는 장점과 처리 비용이 높다는 단점이 있습니다.
원래 언어의 구조 정보를 이용 tree-to-string : 번역문 생성은 단 시간에 된다는 장점이 있고 , 입력 문장의 구조에 따라 성능은 제각각이라는 단점이 있습니다.
양쪽 언어의 구조 정보를 이용 tree-to-tree
=> 순서가 크게 다르면 번역하는데 어려움이 있습니다.
구글은 더 자연스러운 번역 Google Neral Machine Translation GNMT
자동요약
단일 문서의 추출형 요약 중 가장 단순하고 효과적인 방법으로 리드법이 있습니다.
통계 요약 Maximal Marginal Relevance, MMR알고리즘
문서 요약은 불필요한 구문 삭제 ,문장 결합, 구문 변형, 어휘 의역, 추상화/구체화 , 정렬 등의 여러가지 작업이 있습니다.
최대 피복 문제 Maximum coverage problem와 시설 입지 문제 Facility location problem 에 귀착시키는 것 등이 있습니다.
이미지에 설명 추가 및 문장 창작
집중 매커니즘 Attention mechanism: 인코더 -디코더 방법을 사용해 번역의 정화도를 높이는 것
Long Short-Term Memory을 이용한 음악 생성
순환 신경망을 이용한 영화 각본 생성
Conversation as a Platform-린나
린나는 TF-IDF와 word2vec 개념 외에도 순환 신경망을 중심으로 둔 딥러닝을 이용한다고 발표했습니다.
신경망의 활성화 함수는 출력 계층의 값이 커지면 최종 출력이 1로 수렴하는 단위 계단 함수와 로지스틱 함수를 사용했습니다.
쌍곡탄젠트 함수와 소프트 플러스
선형 유닛Rectified Linear Unit ReLU
시그모이드 함수와 쌍곡 탄젠트 함수는 미분 계산을 기반으로 두는 함수지만 ReLU는 0 또는 입력값을 그대로 내보내므로 계산이 편리합니다.
심층 신경망 Deep Neural Network,DNN은 시그모이드 함수에 전파와 역전파를 여러 번 적용하다 보면 가중치가 발산하거나 곡선의 기울기가 0이 되어 버리는 기울기 소실 문제가vanishing gradient problem 발생하므로 ReLU를 사용합니다.
확률 기반 경사 하강법 sgd stochastic gradient Descent : 신경망 학습에서는 데이터 일부를 뽑은 미니 배치를 이용해 가중치를 반복해서 업데이트 하는 것
훈련 오차와 테스트 오차
학습 과정에서 얼마나 지도 학습 데이터에 오차가 발생하는지 나타내는 값을 훈련 오차라고 합니다.
학습기 구축 과정의 목표는 훈련 오차를 작게 만드는 것입니다.
매개변수 업데이트 횟수를 가로축으로 , 오차를 세로축으로 설정했을 때 만들어지는 곡선을 학습 곡선이라고 합니다.
미지의 데이터를 준비하는 것은 어려우므로 테스트 데이터를 이용해 오차를 확인합니다. 이때 오차를 테스트 오차라고 합니다.
정규화와 드롭아웃
과적합을 억제하는 방법으로 가중치 계수에 제한을 가하는 정규화가 있습니다.
신경먕에서 과적합을 억제하는 또 한가지 방법으로는 드롭아웃이 있습니다.
드롭아웃은 확률 기반으로 다층 네트워크 유닛을 선별한 상태에서 학습을 실행하는 것입니다.
그밖의 신경망 학습
데이터 정규화
정규화 normalization
표준화 standardization
"평균을 0으로 한다." "분산(표준 편차)을 1로 한다."
"상관관계를 0으로 한다 " 같은 작업을 백색화 whitening라고 합니다.
정규화를 전처리
데이터 확장
여러가지 네트워크 이용
구조가 다른 여러 개의 신경망을 구축하고 각각 학습한 다음 모델의 평균을 구하면 학습의 일반화 성능을 향상시킬 수 있습니다.
학습률 ε의 결정 방법
학습률을 자동으로 결정하는 알고리즘으로 확률적 경사 하강법의 하나인 에이다그래드 AdaGrad를 많이 사용합니다.
02. 제한 볼츠만 머신
볼츠만 머신과 제한 볼츠만 머신
볼츠만 머신은 노드들이 무향 그래프로 연결된 네트워크입니다.
볼츠만 머신은 퍼셉트론처럼 입력과 출력을 하는 유향 그래프가 아니므로 계산하기 어렵습니다.
제한한 것이 제한 볼츠만 머신Restricted Boltzmann Machine,RBM
제한 볼츠만 머신은 볼츠만 머신의 두 계층 중 같은 계층의 유닛은 서로 연결하지 않도록 구성되어 있습니다.
선행 학습 pre-training
다층 네트워크를 입력받은 순서대로 제한 볼츠만 머신 같은 두 계층의 네트워크로 분리(오토인코더로 설정)합니다.
다층 네트워크는 기울기 소실 문제가 발생해 학습이 제대로 되지 않을 때가 있습니다. 계층을 깊게 할 수록 그 영향이 더 두드러집니다. 가중치 매개변수의 초깃값을 무작위로 결정하는 것도 원인 중 하나입니다. 이를 해결하는 방법으로 선행 학습이 있습니다.
03. 심층 신경망
지도학습과 자율 학습
심층 신경망: 유닛 수와 계층 수가 3가지 이상이 되도록 다층 구조를 취하는 신경망은 심층 신경망이라고 합니다.
심층 신경망을 사용하는 학습을 딥러닝이라고 합니다.
심층 신뢰 신경망 :
이 기술은 가시 계층에서 순서대로 제한 볼츠만 머신의 구조를 꺼내 학습합니다.
심층 신뢰 신경망은 제한 볼츠만 머신의 축적만으로는 단순한 자율학습입니다.
오토인코더
오토인코더는 전파형 네트워크의 하나입니다.
특징:
1. 입력 데이터 1을 통해 얻은 출력 데이터 1을 다시 입력 데이터 2로 설정합니다.
2. 입력 데이터 2에서 얻은 출력 데이터 2를 입력 데이터 1과 비교합니다.
3. 출력 데이터 2와 입력 데이터 1이 서로 더 가까운 상태가 되는 특징을 얻습니다.
4. 얻은 특정을 통해 더 나은 데이터를 얻습니다.
오토인코더는 지도 데이터가 없는 자율학습입니다.
스파스 코딩
수학에서는 백터나 행렬의 많은 원소가 0일 때 이를 스파스하다고 합니다.
04. 합성공 신경망
합성곱 처리
합성곱 신경망의 C는 합성공 Convolutional을 의미합니다.
2개의 함수 중 하나를 평행 이동시키면서 합성공을 취한 적분 값을 계산합니다.
합성공 신경망의 구성
합성공 계층과 풀링 계층을 거쳐 입력 이미지의 특징을 추출해서 출력하는 이미지인 특징 맵을 얻습니다.
합성공 계층과 풀링 계층 사이에 정규화 계층을 포함하기도 합니다.
정규화 계층을 합성곱 계층에서 처리된 이미지에 관해 전체 화소 값의 평균을 0으로 하는 감산 정규화 또는 분산을 정력하는 나누기 정규화 등을 수행합니다.
이처럼 합성곱 계층과 풀링 계층 사이를 반복해서 거친 후 마지막에는 완전 연결 계층 fully connected layer을 구성해서 출력합니다.
출력 내용으로 분류 결과 또는 식별 결과(라벨링한 사물의 이름)을 얻고 싶을 때는 소프트맥스 softmax함수를 이용합니다. 각 라벨을 모두 합한 값이 1이게 변환(정규화)해서 확률 형태로 나타낼 수 있습니다.
풀링 계층에서는 단순히 미이지를 축소합니다. 축소 처리는 필수는 아니지만 후속 네트워크에서의 처리 부담을 가볍게 하는 효과와 축소 처리에 의한 특징량의 압축 효과가 있습니다.
05. 순환 신경망
순환 신경망 : Recurrent Neral Network , RNN은 몇 단계 전으로 거슬러 올라가 데이터를 반영할 수 있는 신경망입니다.
시계열 데이터 등의 맥락을 고려해 학습할 수 있으므로 음성 같은 파형 데이터나 자연어 등의 학습에 이용합니다.
순환 신경망의 학습은 확률적 경사 하강법을 이용하며 실시간 순환 학습 Real-Time Recurrent Learning, RTRL이나 시간 기반 오차역전파BackPropagation Through Time, BPTT로 가중치를 업데이트합니다.
심층 순환 신경망Deep RNN과 양방향 순환 신경망 Bidirectional RNN도 있습니다.
Long Short- Term Memory LSTM
순환 신경망은 거슬러 올라가는 단계 수가 많아지면 기울기 소실 문제 때문에 제대로 학습할 수 없습니다. 이문제를 개선한 것이 Long Short -Term Memory입니다.
LSTM은 신경망의 중간 계층에서의 각 유닛을 LSTM블록이라는 메모리 유닛으로 치환한 구조입니다.
LSTM블록에는 입력 INPUT게이트, 망각 forget게이트 , 출력 output 게이트 라는 세가지 게이트가 있으며 메모리 셀에 저장된 1단계 이전의 상태를 망각 게이트에서 참조(요소곱)합니다. 그리고 입력 게이트와 망각 게이트를 잘 여닫으면서 출력을 조정합니다.
06. 텐서플로를 이용한 오토인코더 예제
오토인코더 모델 구성
오토인고더는 다음과 같은 조건으로 구성합니다.
1. 입력값으로 이미지만 포함합니다.(라벨 없음).
2. 은닉 계층의 노드 수가 입력 계층의 노드 수보다 적도록 구성합니다.
3. 출력 계층의 노드 수는 입력 계층의 노드 수와 같습니다.
4. 은닉 계층의 노드 수가 적으므로 주요 특징량(feature)위주로 추출합니다. 마치 주성분 분석과 비슷한 효과를 얻을 수 있습니다.
5. 출력 계층에서는 입력 계층의 값을 복원(reconstruction)할 수 있습니다.
필요한 모듈 불러오기
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./data/mnist/',one_hot = True)
이 경우 다시 수행하기
하이퍼파라미터 설정하기
#모델 관련 하이퍼파라미터 설정
num_input = 28 * 28
#'입력 계층 노드 수 == 출력 계층 노드 수'이므로 num_output은 따로 정의하지 않습니다.
num_hidden = 256
#학습 관련 하이퍼파라미터 설정
learning_rate = 0.01
training_epoch = 10
batch_size = 100
#평가 관련 하이퍼파라미터 설정
num_output_sample = 10
means = tf.concat([tf.reduce_mean(tf.gather(vectors, tf.reshape(tf.where(tf.equal(assignments,c)), [1,-1])),reduction_indices = [1])
for c in range(num_clusters)],0)
centroids_updated = tf.assign(centroids, means)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(num_epochs):
_, centroid_values, assignment_values = sess.run([centroids_updated, centroids, assignments])
print("중심점")
print(centroid_values)
시각화해 보여주기
data = {"x":[],"y":[],"cluster":[]}
for i in range(len(assignment_values)):
data["x"].append(dots[i][0])
data["y"].append(dots[i][1])
data["cluster"].append(assignment_values[i])
df = pd.DataFrame(data)
sns.lmplot("x","y", data = df, fit_reg = False, size = 7, hue = "cluster", legend= False)
plt.show()