컴퓨터 에이전트가 역동적인 환경에서 반복적인 시행착오 상호작용을 통해 작업 수행 방법을 학습하는강화 학습
자연어 처리를 통해 광범위한 분야에서 사용되는 NLP!
딥러닝 중에서도 가장 보편적이고 중요한 개념으로 손꼽히는 컨볼루션 신경망!
다양한 주제였던 만큼 강의시간만합쳐도 14시간이 넘는데요! 그 14시간의 가장 핵심적인 개념을 14분만에 알아봅시다!
강화 학습
강화 학습이란?
강화학습이란?
강화학습은 컴퓨터 에이전트가 역동적인 환경에서 반복적인 시행착오 상호작용을 통해 작업 수행 방법을 학습하는 머신러닝 기법의 한 유형입니다.
이 학습 접근법을 통해 에이전트는 인간 개입 또는 작업 수행을 위한 명시적인 프로그래밍 없이 작업에 대한 보상 메트릭을 최대화하는 결정을 내릴 수 있습니다.
강화학습의 특징
강화학습은 머신러닝의 한 부류입니다.
비지도 및 지도 머신러닝과 다르게 강화학습은 정적 데이터셋에 의존하는 것이 아니라 역동적인 환경에서 동작하며 수집된 경험으로부터 학습합니다.
데이터 점 또는 경험은 훈련하는 동안 환경과 소프트웨어 에이전트 간의 시행착오 상호작용을 통해 수집됩니다.
강화학습의 이런 점은 지도 및 비지도 머신러닝에서는 필요한 훈련 전 데이터 수집, 전처리 및 레이블 지정에 대한 필요성을 해소하기 때문에 중요합니다.
이는 실질적으로 적절한 인센티브가 주어지면 강화학습 모델은 인간의 개입 없이 학습 행동을 자체적으로 시작할 수 있다는 것을 의미합니다.
강화학습의 작동 방식
강화학습 용어를 사용해서 설명하자면 이 그림의 학습 목표는 강아지(에이전트) 가 강아지를 둘러싼 환경과 훈련사를 포함한 환경에서 행동을 완료하도록 강아지를 훈련하는 것입니다.
먼저 훈련사가 강아지에게 명령 또는 신호를 보내고 강아지는 이를 관찰합니다(관측값).
그런 다음 강아지는 행동을 취하여 응답합니다.
취한 행동이 원하는 행동과 근접한 경우 훈련사는 간식 또는 장난감과 같은 보상을 제공할 것입니다.
그렇지 않다면 보상이 제공되지 않습니다.
훈련 초반에 강아지는 특정 관측값을 행동 및 보상과 연관 짓기 위해서 "앉아"라는 명령에 구르는 등 무작위 행동을 더 많이 취할 것입니다.
이러한 관측값과 행동 사이의 연관성 또는 매핑을 정책이라고 합니다.
강아지의 관점에서 최적의 시나리오는 모든 신호에 올바르게 응답하여 최대한 많은 간식을 획득하는 것입니다.
즉, 강화학습 훈련의 의미는 강아지가 보상을 최대화하는 목표 행동을 배울 수 있도록 강아지의 정책을 "조정"하는 데 있습니다.
훈련이 완료되면 강아지는 자신이 개발한 내부 정책을 사용하여 보호자의 "앉아"라는 명령을 관찰하고 적절한 행동을 취할 수 있게 됩니다.
UCB
UCB
그림 1.은 3개의 밴딧 머신 (Bandit Machine=슬롯 머신)이 있을때, 각 밴딧 머신의 손잡이 (arm)를 눌러 얻을 수 있는 reward (Q)의 분포를 나타냅니다 (a_1: 파란색 , a_2: 빨간색, a_3:초록색).
그림에 대해 간단하게 예를 들면 a_3는 매번 누를 때마다 30만원에서 50만원사이의 돈을 받을 수 있다고 보고, a_1의 경우 어떨때는 돈을 잃거나 또는 200만원을 받아 일확천금할 수 있다고 받을 수 있다고 생각하시면 됩니다.
직관적으로 a_3 의 신뢰구간 (Confidence Interval)이 매우 짧은 것을 볼 수 있으며, 불확실환 상황 속에서도 a_3를 선택하면 높은 reward (Q) 를 어느정도 보장 받을 수 있음을 볼 수 있습니다.
그러나 그림 2와 같이 a_1과 a_2을 선택하면 a_3의 우측에 더 높은 reward을 받을 수 있는 확률이 있다는 것을 할 수 있습니다.
만약 이와 같은 상황에서 Exploitation, 즉 현재 time step에서 좋아 보이는 (cumulative sum of future reward 가 높은) 머신을 선택하게 되고, 이와 같은 과정을 반복하면, 더 높은 포텐셜을 갖고 있는 a_1을 탐험해 보지 못하고, 결국 sub optimal에 도달 할 수 밖에 없습니다.
이와 같은 문제를 해결하기 위해 UCB를 사용해 exploration을 장려합니다.
그림 3.과 같이 이와 같은 확률 분포는 정 가운데를 평균 (mean)으로 볼 수 있으며, 신뢰 구간을 어떻게 설정 하느냐에 따라 Upper confidence bound (UCB) U(a) 를 설정할 수 있습니다.
신뢰구간이 X% 라고 가정 하면, 보너스 구간 포함에서 리워드 Q(a) + U(a) 를 예측 할 수 있습니다.
reward 평균 100만원, 신뢰구간 X%의 보너스 구간 (+50만원) = 150만원
즉, 그림2와 같이 a_1 (파란색)은 평균이 a_3 (초록색) 비해 작지만, 같으면서 넓은 신뢰구간 (예: 95%)를 사용했을 때의 UCB가 더 크므로, 불확실성에 기대 더 높은 리워드를 받을 수 있다고 생각해 a_1을 선택합니다.
위와 같은 방법론을 기반으로 여러 가능한 action (어떤 bandit machine을 선택) 중 하나를 선택 하고자 할 때에는 그 action이 UCB를 최대화 하는 것을 선택하도록 합니다.
Thompson Sampling 이란?
Thompson Sampling 이란?
톰슨 샘플링이란, 도출된 베타 분포에서 RV(e-commerce에서는 일반적으로 전환율)를 샘플링하는 기법을 말합니다. 구조를 보면 이해가 더 잘 될수있다.
1.베타 분포 공간에 각 배너의 확률밀도함수(PMF)를 Draw
2.각 배너의 갯수만큼 random variate를 샘플링 -> 이값을 argMax()값을 비교하여 최대 값의 배너를 취함)
3.argMax로 선정된 배너 노출4.이후 클릭O/클릭X가 바뀐 값으로 다시 1번부터 실행
Code
밀도함수를 3회 실행을 했을때 구해진 샘플값을 보자.
배너 1 샘플값이 제일 높음
배너2 샘플값이 제일 높음
배너3 샘플값이 제일 높음
즉 아직 PMF가 수렴하기 전에는 샘플링에 의해 다른 배너가 선택될 여지가 있는 것이다.
반면 여러 차례 수행에 의해 아래와 같이 PMF값이 어느정도 수렴에 가까워 질때는 샘플링 값을 여러 차례 구해 보아도 배너 그래프의 확률 분포가 우세한 배너 쪽으로만 계속 선택이 되는것을 발견했다.
자세히 보면 아래의 샘플링 값은 미세하게 다르지만 선택되는 배너는 같다.
위 알고리즘 수도코드를 보면 결국 베타분포 공간에서 각 배너의 S(클릭한 횟수)와 B(클릭안한 횟수)를 이용하여 학률밀도함수(PMF)를 Draw하고 여기서 값을 샘플링하여 이 값중 가장 큰 값의 배너를 선택한다.
(argmax) 또한 이후 클릭율이 어떻게 바뀌었는지 다시 관측하고 클릭 성공(S)과 클릭 실패(F)를 기록하여 다시 톰슨샘플링을 반복한다.
NLP
자연어란?
자연어(natural language)란 우리가 일상 생활에서 사용하는 언어를 말합니다. 자연어 처리(natural language processing)란 이러한 자연어의 의미를 분석하여 컴퓨터가 처리할 수 있도록 하는 일을 말합니다.
자연어 처리는 음성 인식, 내용 요약, 번역, 사용자의 감성 분석, 텍스트 분류 작업(스팸 메일 분류, 뉴스 기사 카테고리 분류), 질의 응답 시스템, 챗봇과 같은 곳에서 사용되는 분야입니다.
토큰화(Tokenization)란?
토큰화(Tokenization)
자연어 처리에서 크롤링 등으로 얻어낸 코퍼스 데이터가 필요에 맞게 전처리되지 않은 상태라면, 해당 데이터를 사용하고자하는 용도에 맞게 토큰화(tokenization) & 정제(cleaning) & 정규화(normalization)하는 일을 하게 됩니다. 이번에는 그 중에서도 토큰화에 대해서 학습합니다.
주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업을 토큰화(tokenization)라고 합니다. 토큰의 단위가 상황에 따라 다르지만, 보통 의미있는 단위로 토큰을 정의합니다.
단어 토큰화(Word Tokenization)
토큰의 기준을 단어(word)로 하는 경우, 단어 토큰화(word tokenization)라고 합니다. 다만, 여기서 단어(word)는 단어 단위 외에도 단어구, 의미를 갖는 문자열로도 간주되기도 합니다.
예를 들어보겠습니다. 아래의 입력으로부터 구두점(punctuation)과 같은 문자는 제외시키는 간단한 단어 토큰화 작업을 해봅시다. 구두점이란 마침표(.), 컴마(,), 물음표(?), 세미콜론(;), 느낌표(!) 등과 같은 기호를 말합니다.
입력: Time is an illusion. Lunchtime double so!
이러한 입력으로부터 구두점을 제외시킨 토큰화 작업의 결과는 다음과 같습니다.
출력 : "Time", "is", "an", "illustion", "Lunchtime", "double", "so"
이 예제에서 토큰화 작업은 굉장히 간단합니다. 구두점을 지운 뒤에 띄어쓰기(whitespace)를 기준으로 잘라냈습니다. 하지만 이 예제는 토큰화의 가장 기초적인 예제를 보여준 것에 불과합니다.
보통 토큰화 작업은 단순히 구두점이나 특수문자를 전부 제거하는 정제(cleaning) 작업을 수행하는 것만으로 해결되지 않습니다. 구두점이나 특수문자를 전부 제거하면 토큰이 의미를 잃어버리는 경우가 발생하기도 합니다. 심지어 띄어쓰기 단위로 자르면 사실상 단어 토큰이 구분되는 영어와 달리, 한국어는 띄어쓰기만으로는 단어 토큰을 구분하기 어렵습니다.
구두점(문장의 논리적 관계를 밝혀 정확한 의미를 전달하기 위한 표기상의 부호. 문장부호. 문장의 논리적 관계를 밝혀 정확한 의미를 전달하기 위한 표기상의 부호.)
토큰화 중 생기는 선택의 순간
토큰화를 하다보면, 예상하지 못한 경우가 있어서 토큰화의 기준을 생각해봐야 하는 경우가 발생합니다. 물론, 이러한 선택은 해당 데이터를 가지고 어떤 용도로 사용할 것인지에 따라서 그 용도에 영향이 없는 기준으로 정하면 됩니다. 예를 들어 영어권 언어에서 아포스트로피를(')가 들어가있는 단어는 어떻게 토큰으로 분류해야 하는지에 대한 선택의 문제를 보여드리겠습니다.
다음과 같은 문장이 있다고 해봅시다.
Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop.
아포스트로피가 들어간 상황에서 Don't와 Jone's는 어떻게 토큰화할 수 있을까요? 다양한 선택지가 있습니다.
Don't
Don t
Dont
Do n't
Jone's
Jone s
Jone
Jones
이 중 사용자가 원하는 결과가 나오도록 토큰화 도구를 직접 설계할 수도 있겠지만, 기존에 공개된 도구들을 사용하였을 때의 결과가 사용자의 목적과 일치한다면 해당 도구를 사용할 수도 있을 것입니다. NLTK는 영어 코퍼스를 토큰화하기 위한 도구들을 제공합니다. 그 중 word_tokenize와 WordPunctTokenizer를 사용해서 아포스트로피를 어떻게 처리하는지 확인해보겠습니다.
코랩에서 실습시import nltknltk.download('punkt')적용해 주어야 정상적으로 실행이 됩니다!
우선 word_tokenize를 사용해봅시다.
print('단어 토큰화1 :',word_tokenize("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop."))
word_tokenize는 Don't를 Do와 n't로 분리하였으며, 반면 Jone's는 Jone과 's로 분리한 것을 확인할 수 있습니다.그렇다면, wordPunctTokenizer는 아포스트로피가 들어간 코퍼스를 어떻게 처리할까요?
print('단어 토큰화2 :',WordPunctTokenizer().tokenize("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop."))
WordPunctTokenizer는 구두점을 별도로 분류하는 특징을 갖고 있기때문에, 앞서 확인했던 word_tokenize와는 달리 Don't를 Don과 '와 t로 분리하였으며, 이와 마찬가지로 Jone's를 Jone과 '와 s로 분리한 것을 확인할 수 있습니다. 케라스 또한 토큰화 도구로서 text_to_word_sequence를 지원합니다.
print('단어 토큰화3 :',text_to_word_sequence("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop."))
케라스의 text_to_word_sequence는 기본적으로 모든 알파벳을 소문자로 바꾸면서 마침표나 컴마, 느낌표 등의 구두점을 제거합니다. 하지만 don't나 jone's와 같은 경우 아포스트로피는 보존하는 것을 볼 수 있습니다!
토큰화에서 고려해야할 사항
토큰화 작업을 단순하게 코퍼스에서 구두점을 제외하고 공백 기준으로 잘라내는 작업이라고 간주할 수는 없습니다. 이러한 일은 보다 섬세한 알고리즘이 필요한데 그 이유를 정리해봅니다.
구두점이나 특수 문자를 단순 제외해서는 안 된다.갖고있는 코퍼스에서 단어들을 걸러낼 때, 구두점이나 특수 문자를 단순히 제외하는 것은 옳지 않습니다. 코퍼스에 대한 정제 작업을 진행하다보면, 구두점조차도 하나의 토큰으로 분류하기도 합니다. 가장 기본적인 예를 들어보자면, 마침표(.)와 같은 경우는 문장의 경계를 알 수 있는데 도움이 되므로 단어를 뽑아낼 때, 마침표(.)를 제외하지 않을 수 있습니다.또 다른 예로 단어 자체에 구두점을 갖고 있는 경우도 있는데, m.p.h나 Ph.D나 AT&T 같은 경우가 있습니다. 또 특수 문자의 달러()나 슬래시(/)로 예를 들어보면, $45.55와 같은 가격을 의미 하기도 하고, 01/02/06은 날짜를 의미하기도 합니다. 보통 이런 경우 45.55를 하나로 취급하고 45와 55로 따로 분류하고 싶지는 않을 수 있습니다.숫자 사이에 컴마(,)가 들어가는 경우도 있습니다. 보통 수치를 표현할 때는 123,456,789와 같이 세 자리 단위로 컴마가 있습니다.
줄임말과 단어 내에 띄어쓰기가 있는 경우.토큰화 작업에서 종종 영어권 언어의 아포스트로피(')는 압축된 단어를 다시 펼치는 역할을 하기도 합니다. 예를 들어 what're는 what are의 줄임말이며, we're는 we are의 줄임말입니다. 위의 예에서 re를 접어(clitic)이라고 합니다. 즉, 단어가 줄임말로 쓰일 때 생기는 형태를 말합니다. 가령 I am을 줄인 I'm이 있을 때, m을 접어라고 합니다.New York이라는 단어나 rock 'n' roll이라는 단어를 봅시다. 이 단어들은 하나의 단어이지만 중간에 띄어쓰기가 존재합니다. 사용 용도에 따라서, 하나의 단어 사이에 띄어쓰기가 있는 경우에도 하나의 토큰으로 봐야하는 경우도 있을 수 있으므로, 토큰화 작업은 저러한 단어를 하나로 인식할 수 있는 능력도 가져야합니다.
표준 토큰화 예제이해를 돕기 위해 표준으로 쓰이고 있는 토큰화 방법 중 하나인 Penn Treebank Tokenization의 규칙에 대해서 소개하고, 토큰화의 결과를 확인해보겠습니다.규칙 1. 하이푼으로 구성된 단어는 하나로 유지한다.규칙 2. doesn't와 같이 아포스트로피로 '접어'가 함께하는 단어는 분리해준다.해당 표준에 아래의 문장을 입력으로 넣어봅니다."Starting a home-based restaurant may be an ideal. it doesn't have a food chain or restaurant of their own."트리뱅크 워드토크나이저 : ['Starting', 'a', 'home-based', 'restaurant', 'may', 'be', 'an', 'ideal.', 'it', 'does', "n't", 'have', 'a', 'food', 'chain', 'or', 'restaurant', 'of', 'their', 'own', '.']결과를 보면, 각각 규칙1과 규칙2에 따라서 home-based는 하나의 토큰으로 취급하고 있으며, dosen't의 경우 does와 n't는 분리되었음을 볼 수 있습니다.
정제(Cleaning) and 정규화(Normalization)
토큰화 작업 전후로 실행해야 하는 Cleaning and Normalization이다! 코퍼스에서 용도에 맞게 토큰을 분류하는 작업을 토큰화(tokenization)라고 하며, 토큰화 작업 전, 후에는 텍스트 데이터를 용도에 맞게 정제(cleaning) 및 정규화(normalization)하는 일이 필수적이다!
정제(cleaning) : 갖고 있는 코퍼스로부터 노이즈 데이터를 제거한다.
정규화(normalization) : 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어준다.정제 작업은 토큰화 작업에 방해가 되는 부분들을 배제시키고 토큰화 작업을 수행하기 위해서 토큰화 작업보다 앞서 이루어지기도 하지만, 토큰화 작업 이후에도 여전히 남아있는 노이즈들을 제거하기위해 지속적으로 이루어지기도 합니다. 사실 완벽한 정제 작업은 어려운 편이라서, 대부분의 경우 이 정도면 됐다.라는 일종의 합의점을 찾기도 합니다.
규칙에 기반한 표기가 다른 단어들의 통합
필요에 따라 직접 코딩을 통해 정의할 수 있는 정규화 규칙의 예로서 같은 의미를 갖고있음에도, 표기가 다른 단어들을 하나의 단어로 정규화하는 방법을 사용할 수 있다.
예를들어, USA와 US는 같은 의미를 가지므로 하나의 단어로 정규화해볼 수 있고, uh-huh와 uhhuh는 형태는 다르지만 여전히 같은 의미를 갖고 있습니다. 이러한 정규화를 거치게 되면, US를 찾아도 USA도 함께 찾을 수 있을 것입니다. 표기가 다른 단어들을 통합하는 방법인 어간 추출(stemming)과 표제어 추출(lemmatizaiton)에 대해서 더 자세히 알아보자!
대, 소문자 통합
영어권 언어에서 대, 소문자를 통합하는 것은 단어의 개수를 줄일 수 있는 또 다른 정규화 방법입니다. 영어권 언어에서 대문자는 문장의 맨 앞 등과 같은 특정 상황에서만 쓰이고, 대부분의 글은 소문자로 작성되기 때문에 대, 소문자 통합 작업은 대부분 대문자를 소문자로 변환하는 소문자 변환작업으로 이루어지게 됩니다.
소문자 변환이 왜 유용한지 예를 들어보자면, Automobile이라는 단어가 문장의 첫 단어였기때문에 A가 대문자였다고 생각해봅시다. 여기에 소문자 변환을 사용하면, automobile을 찾는 질의(query)의 결과로서 Automobile도 찾을 수 있게 됩니다. 검색 엔진에서 사용자가 페라리 차량에 관심이 있어서 페라리를 검색해본다고 합시다. 엄밀히 말해서 사실 사용자가 검색을 통해 찾고자하는 결과는 a Ferrari car라고 봐야합니다. 하지만 검색 엔진은 소문자 변환을 적용했을 것이기 때문에 ferrari만 쳐도 원하는 결과를 얻을 수 있을 것입니다.
물론 대문자와 소문자를 무작정 통합해서는 안 됩니다. 대문자와 소문자가 구분되어야 하는 경우도 있습니다. 가령 미국을 뜻하는 단어 US와 우리를 뜻하는 us는 구분되어야 합니다. 또 회사 이름(General Motors)나, 사람 이름(Bush) 등은 대문자로 유지되는 것이 옳습니다.
모든 토큰을 소문자로 만드는 것이 문제를 가져온다면, 또 다른 대안은 일부만 소문자로 변환시키는 방법도 있습니다. 가령, 이런 규칙은 어떨까요? 문장의 맨 앞에서 나오는 단어의 대문자만 소문자로 바꾸고, 다른 단어들은 전부 대문자인 상태로 놔두는 것입니다.
이러한 작업은 더 많은 변수를 사용해서 소문자 변환을 언제 사용할지 결정하는 머신 러닝 시퀀스 모델로 더 정확하게 진행시킬 수 있습니다. 하지만 만약 올바른 대문자 단어를 얻고 싶은 상황에서 훈련에 사용하는 코퍼스가 사용자들이 단어의 대문자, 소문자의 올바른 사용 방법과 상관없이 소문자를 사용하는 사람들로부터 나온 데이터라면 이러한 방법 또한 그다지 도움이 되지 않을 수 있습니다. 결국에는 예외 사항을 크게 고려하지 않고, 모든 코퍼스를 소문자로 바꾸는 것이 종종 더 실용적인 해결책이 되기도 합니다.
불필요한 단어의 제거
정제 작업에서 제거해야하는 노이즈 데이터(noise data)는 자연어가 아니면서 아무 의미도 갖지 않는 글자들(특수 문자 등)을 의미하기도 하지만, 분석하고자 하는 목적에 맞지 않는 불필요 단어들을 노이즈 데이터라고 하기도 합니다. 노이즈 데이터(noise data)는 예로들자면 한 영화에 대한 관람객의 평가중에 별점은 1점을 주었지만 "정말 잘~ 만든 영화네요~" 라는 식으로 작성된 글은 사람이 보았을 때는 분명 반어적으로 말한것을 알수 있지만, 기계는 그렇게 생각하지 않는 상황을 예로 들 수 있겠다.
등장 빈도가 적은 단어
때로는 텍스트 데이터에서 너무 적게 등장해서 자연어 처리에 도움이 되지 않는 단어들이 존재합니다. 예를 들어 입력된 메일이 정상 메일인지 스팸 메일인지를 분류하는 스팸 메일 분류기를 설계한다고 가정해보겠습니다. 총 100,000개의 메일을 가지고 정상 메일에서는 어떤 단어들이 주로 등장하고, 스팸 메일에서는 어떤 단어들이 주로 등장하는지를 가지고 설계하고자 합니다. 그런데 이때 100,000개의 메일 데이터에서 총 합 5번 밖에 등장하지 않은 단어가 있다면 이 단어는 직관적으로 분류에 거의 도움이 되지 않을 것임을 알 수 있다.
길이가 짧은 단어
영어권 언어에서는 길이가 짧은 단어를 삭제하는 것만으로도 어느정도 자연어 처리에서 크게 의미가 없는 단어들을 제거하는 효과를 볼 수 있다고 알려져 있습니다. 즉, 영어권 언어에서 길이가 짧은 단어들은 대부분 불용어에 해당됩니다. 사실 길이가 짧은 단어를 제거하는 2차 이유는 길이를 조건으로 텍스트를 삭제하면서 단어가 아닌 구두점들까지도 한꺼번에 제거하기 위함도 있습니다. 하지만 한국어에서는 길이가 짧은 단어라고 삭제하는 이런 방법이 크게 유효하지 않을 수 있는데 그 이유에 대해서 정리해보도록 하겠습니다.
단정적으로 말할 수는 없지만, 영어 단어의 평균 길이는 6~7 정도이며, 한국어 단어의 평균 길이는 2~3 정도로 추정되고 있습니다. 두 나라의 단어 평균 길이가 몇 인지에 대해서는 확실히 말하기 어렵지만 그럼에도 확실한 사실은 영어 단어의 길이가 한국어 단어의 길이보다는 평균적으로 길다는 점입니다.
정규 표현식(Regular Expression)
얻어낸 코퍼스에서 노이즈 데이터의 특징을 잡아낼 수 있다면, 정규 표현식을 통해서 이를 제거할 수 있는 경우가 많습니다. 가령, HTML 문서로부터 가져온 코퍼스라면 문서 여기저기에 HTML 태그가 있습니다. 뉴스 기사를 크롤링 했다면, 기사마다 게재 시간이 적혀져 있을 수 있습니다. 정규 표현식은 이러한 코퍼스 내에 계속해서 등장하는 글자들을 규칙에 기반하여 한 번에 제거하는 방식으로서 매우 유용하다
어간 추출(Stemming)과 표제어 추출(Lemmatization)
어간 추출(Stemming)과 표제어 추출(Lemmatization)
정규화 기법중 코퍼스에 있는 단어의 개수를 줄일 수 있는 기법으로는 Stemming과 Lemmatization이 있다. 자연어 처리에서의 정규화는 항상 주어진 코퍼스로 부터 복잡성을 줄이는 일이라고 생각하자!
Lemmatization
표제어추출은 단어들로부터 표제어를 찾아가는 과정을 말하게 된다. am,are,is가 be를 표제어로 갖는걸 예로 들수 있다.
표제어 추출을 하는 가장 세분화된 방법은 단어를 형태학적 파싱하는 과정으로 볼수 있다. 형태소는 어간과 접사를 아울러 말하는 단어이다.
어간
단어의 실질적 의미를 담고있는 부분
접사
단어에 추가적인 의미를 주는 부분.
이 두가지를 나누는 것이 형태학적 파싱 작업이다.NLTK에서는 표제어 추출을 위한 도구 WordNetLemmatizer를 지원하는데 이를 통해서 간단히 실습해보며 익혀보도록 하자!
실습
다소 부정확한 단어를 추출해 내는것을 볼수 있다. 이는 lemmatizer가 본래 단어의 품사정보를 알아야만 정확한 결과를 얻을수 있기 때문이다.WordNetLemmatizer는 입력으로 단어가 동사 품사라는 사실을 알려줄 수 있다. 다시 한번 품사정보를 알려주고 난뒤 결과를 출력해 보도록 하자!
정확하게 추출되는 것을 알 수 있다!
Stemming
어간(Stem)을 추출하는 작업을 어간 추출(stemming)이라고 한다! 어간 추출을 할 때는 알고리증을 사용하는데 알고리즘이라는 단어에서 알수 있듯이 정해진 규칙에 기반하여 실행되다 보니 그리 섬세한 작업은 아니다! 예제를 보고 쉽게 이해해 보도록 하자!
위의 예제에서 알 수 있듯이
ALIZE → AL
ANCE → 제거
ICAL → IC 이러한 규칙을 따르는걸 알 수 있다!
Stemming과 Lemmatization 차이 정리
Stemming am → am the going → the go having → hav
Lemmatizationam → bethe going → the goinghaving → have
딥 러닝
ANN
ANN이란
생체 신경망 구조와 유사하게 은닉 계층을 포함하는 인공신경망 기술이다.
입력, 은닉, 출력 계층으로 구성되어 있으며 은닉 계층을 한 개 이상 포함할 수 있고, 각 계층은 여러 노드로 구성된다.
은닉 계층 수나 각 은닉 계층의 노드 수는 사용자의 선택 사항이므로 입력 데이터아 목표로 하는 출력 데이터의 모양에 따라 적절한 값으로 선정해야 한다. 이러한 과정을 모델 최적화 또는 하이퍼 파리미터 최적화라고 한다.
물론 조금만더 심오하게 들어가보면 인간의 신경망 즉 뉴런의 작동방식을 통해 인간의 지성이 파생된다는 가정하에 컴퓨터에게도 인간의 생체신경망 구조를 그대로 이식하려하는 노력에서 착안된 아이디어이다.
하지만 인간의 지성이 무엇으로부터 파생되는지는 정확히 정의하기 어려우며 컴퓨터가 인공신경망을 갖는다면 인간과 비슷한 지성을 갖을수 있을거라는 가정으로부터 파생된 아이디어라는 것을 감안하고 생각해 보길 바란다.
ANN의 활용
크게 분류와 회귀로 나뉨
분류 ANN은 입력 정보를 클래스 별로(값이 연속적이지 않을때) 분류하는 방식이며, 회귀 ANN은 입력 정보로 다른 값을(값이 연속적일떄) 예측하는 방식
값이 연속적인 데이터도 데이터 재가공을 통해 클래스화 시켜서 분류로 풀 수 있고, 회귀문제의 데이터도 데이터 재가공을 통해 회귀로 접근이 가능하다.
분류 ANN
입력 정보를 바탕으로 해당 입력이 어느 클래스에 속하는 지를 결정
판별은 두 출력 노드의 값을 비교하여 더 큰 쪽을 선택하도록 구현
가중치의 학습은 예측값의 목푯값에 대한 오차를 역방향으로 되돌리면서 이루어지기 때문에 오차역전파(error back propagation)라고 한다.
오차역전파는 오차를 줄이는 경사 하강법(gradient descent)에서 유도된 방법
경사 하강법은 가중치에 대한 손실 함수를 미분하고, 그 미분 값의 방향과 크기를 활용해 가중치를 보상하는 방법
손실 함수(loss function)는 가중치에 따라 오차가 얼마나 커지거나 작아지는 지를 평가
손실함수로 교차 엔트로피(cross-entropy) 함수를 주로 사용하는데 이를 적용하려면 출력 노드의 결과를 확률값으로 바꿔야 함
확률값은 출력 노드 값을 소프트맥스 연산으로 구함
회귀 ANN
입력값으로부터 출력값을 직접 예측하는 방법
실제 데이터의 규칙을 잘 표현하는 함수를 찾는 것이 회귀
오차역전파 방법으로 학습시키려면 주로 평균제곱오차, 즉 MSE(mean-square error)를 손실 함수로 사용
학습에 의한 최적화 방법으로 확률적 경사 하강법을 많이 사용했으나 최근에는 더 발전된 방법인 Adam, Adagrad, RMSprop 등과 같은 방법을 사용
Adam : 경사의 분산과 평균으로부터 파라미터를 업데이트하는 적응 알고리즘 보편적으로 성능이 가장 좋다.
Adagrad : 밀집되지 않은 데이터에 적합하도록 경사 제곱을 통해 시간에 따라 학습률을 조정하는 적응 알고리즘
RMSprop : 학습률이 급격히 떨어지지 않게 감쇠 항을 추가한 적응 알고리즘
CNN
이중 가장많이 쓰이는 신경망을 3가지 뽑아보자면
합성곱 신경망(CNN)
순환 신경망(RNN)
생성적 적대 신경망(GAN)
위의 3가지가 될텐데 오늘은 CNN에 대해서 알아보려한다.
Convolutional Neural Networks (합성곱 신경망)
합성곱(Convolution)은 예전부터 컴퓨터 비전(Computer Vision, CV) 분야에서 많이 쓰이는 이미지 처리 방식으로 계산하는 방식은 아래 같다.
입력데이터와 필터의 각각의 요소를 서로 곱한 후 다 더하면 출력값이 되는 형태이다.
또한 합성곱하면 항상 등장하시는 Yann LeCun교수는 딥러닝 연구원들과 이 합성곱을 어떻게 딥러닝에 활용할 수 있을까 고민하다가, 1998년에 논문을 발표하는데 그내용은
르쿤 교수가 합성곱을 이용한 이 신경망 디자인을 합성곱 신경망(CNN)이라고 명칭하였고 이미지 처리에서 엄청난 성능을 보이는 것을 증명하였다.
CNN의 발견 이후 딥러닝은 전성기를 이루었다고 볼 수 있을 정도로 관심이 증가했다.
이후 CNN은 얼굴 인식, 사물 인식 등에 널리 사용되며 현재도 이미지 처리에서 가장 보편적으로 사용되는 네트워크 구조로 자리잡게 되었다.
Filter, Strides and Padding
합성곱 신경망에서 가장 중요한 개념은 합성곱 계층(Convolution layer)이라 할수 있다.
아래와 같이 5x5 크기의 입력이 주어졌을 때, 3x3짜리 필터를 사용하여 합성곱을 하면 3x3 크기의 특성맵(Feature map)을 뽑아낼 수 있다.
필터(Filter 또는 Kernel)를 한 칸씩 오른쪽으로 움직이며 합성곱 연산을 하는데요,
이 때 이동하는 간격을 스트라이드(Stride)라고 한다.
그런데 이렇게 연산을 하게 되면 합성곱 연산의 특성상 출력값인 특성 맵의 크기가 줄어들게 된다.
이런 현상을 방지하기 위해서 우리는 패딩(Padding 또는 Margin)을 주어, 스트라이드가 1일 때 입력값과 특성 맵의 크기를 같게 만드는 방법을 사용하게 된다.
CNN의 구성
합성곱 신경망은 합성곱 계층(Convolution layer)과 완전연결 계층(Dense layer)을 함께 사용한다.
합성곱 계층 + 활성화 함수 + 풀링을 반복하며 점점 작아지지만 핵심적인 특성들을 뽑아 내는데, 여기서 풀링 계층(Pooling layer)은 특성 맵의 중요부분을 추출하여 저장하는 역할을 한다.
아래의 이미지는 Max pooling의 예시이다. 2x2 크기의 풀 사이즈(Pool size)로 스트라이드 2의 Max pooling 계층을 통과할 경우 2x2 크기의 특성 맵에서 가장 큰 값들을 추출하게되는 형태이다.
아래는 Average pooling의 예시이다. Max pooling에서는 2x2 크기의 특성 맵에서 최대 값을 추출했다면 Average pooling은 2x2 크기의 특성 맵에서 평균 값을 추출하는 방식이다.
Max pooling과 Average pooling의 결과를 비교해보면
다시 이 그림으로 돌아와서 두 번째 풀링 계층을 지나면 완전연결 계층과 연결이 되어야 하는데 풀링을 통과한 특성 맵은 2차원이고 완전연결 계층은 1차원이므로 연산자체가 불가능하다.
따라서 우리는 평탄화 계층(Flatten layer)를 사용해서 2차원을 1차원으로 펼치는 작업을 하게 되는데. 아래는 간단하게 평탄화 계층의 동작을 설명한 그림이다.
평탄화 계층을 통과하게 되면 우리는 완전연결 계층(Dense layer)에서 행렬 곱셈을 할 수 있게되고
마찬가지로 완전연결 계층(=Dense=Fully connected) + 활성화 함수의 반복을 통해 점점 노드의 개수를 축소시키다가 마지막에 Softmax 활성화 함수를 통과하고
출력층으로 결과를 출력하게 되는 일련의 flow를 거치게 되는 것이다.
CNN의 활용 예
물체 인식(Object Detection) -YOLO (You Only Look Once)
이미지 분할(Segmentation)
자율주행 물체인식
자세 인식(Pose Detection)
화질개선(Super Resolution)
Style Transfer
사진 색 복원(Colorization)
위처럼 다양한 분야에서 사용되고 있음을 알수있다!
본 스터디는 Udemy의 <【한글자막】 머신러닝의 모든 것 with Python, R> 강의를 활용해 진행됐습니다. 강의에 대한 자세한 정보는 아래에서 확인하실 수 있습니다.
ai관련 stack이 어렵다고만 느끼시는 분들에게 같은 초심자로써 어떤 마음으로 입문하면 수월히 배워볼 수 있는지, 또한 머신러닝 엔지니어가 된다면 세상에 단 하나뿐인 프로그램을 설계해보는 흥미로운 일을 매일같이 반복할 수 있다는 것을 같이 알아가고 싶습니다! 저는 이 스터디를 다듣고난후 ai의 기본에대한 깊은 이해를 얻고 싶습니다! 어떤 일이든 기본이 제일 중요하다고 생각듭니다 :)