더이상 미룰 수 없었던 NLP
전체적인 흐름을 보며 공부하면 훨씬 편할 것 같아
워크플로우를 정리해보려 한다
https://wikidocs.net/book/2155
딥 러닝을 이용한 자연어 처리 입문
많은 분들의 피드백으로 수년간 보완된 입문자를 위한 딥 러닝 자연어 처리 교재 E-book입니다. 오프라인 출판물 기준으로 코드 포함 **약 1,000 페이지 이상의 분량*…
wikidocs.net
자연어 처리 공부에 해당 위키독스가 정말 많이 도움이 되었다.
이번 포스팅은 굵직한 맥을 찝어놓은 글이라고 생각하시면 편하다.
1. task 정립
2. 전처리
3. 모델링
이렇게만 놓고 보았을때는 일반 머신러닝과 별반 큰 차이가 없어 보이지만,
task의 종류도 넘쳐나고, 그에 최적화된 모델들이 존재한다.
또한 전처리 과정도 훨씬 복잡하고 세분화 되어있어 많은 품과 지식을 요구하는 것이 사실이다.
하나씩 찬찬히 뜯어가며 설명을 해보겠다.
1. task 정립
자연어 처리란 일상생활에서 사용하는 언어의 의미를 분석하여 컴퓨터가 처리할 수 있도록 하는 일을 말한다.
당연하게도 활용 분야도 광범위하다. 음성인식, 내용요약, 번역, 감성분석, 텍스트 분류작업, 질의응답 시스템, 챗봇과 같이
생각보다 실생활에 밀접하고, 어떻게 보면 훨씬 실용적인 과제들이라 볼 수 있다.
NLP의 대표적인 라이브러리이자 AI 스타트업인 허깅페이스에서는 다음과 같이 분석 task를 분류한다
물론 이 안에서도 세부적으로 나뉠 수 있다. generation의 경우에는 text(ex. 소설생성), text2text(문단 요약)와 같이 구분될 수 있다. 허깅페이스에서는 관련 모델들과 데이터셋, transformer 관련 라이브러리까지 제공하며 자연어처리에 있어서 거부할 수 없는 흐름이 되어가는 듯 하다(만간 추가 포스팅 업로드 예정)
2. 전처리
이렇게 본인이 어떠한 목적을 가져야할지 선정하였다면,
그 용도에 알맞게끔 텍스트를 컴퓨터가 알아들을 수 있도록 전처리를 해주어야 한다.
2-1. 토큰화, 정제, 정규화
- 토큰화 : 텍스트를 토큰이라는 단위로 나눔
- 정제 : 불필요한 노이즈 데이터를 제거
- 정규화 : 표현방법이 다른 단어를 통합시켜 같은 단어로 정규화
우선 컴퓨터가 줄글로 되어있는 텍스트를 받아들여 이해하기는 힘들테니, 토큰으로 나눠서(짜개서) 분리해준다
위키독스에 있는 예시를 가져와보자면
이런 줄글을 컴퓨터가 이해하기 힘드니까,
이렇게 띄어쓰기로 토큰화를 시켜 세개의 토큰으로 나누는 것이다.
허나 이 단어토큰화도 컴퓨터는 이해하기 힘들 수 있다.
에디가는 '에디'+'-가' 가 합쳐진 단어이고
에디 뒤의 조사가 항상 '가'가 나온다는 보장도 없다.
이에 보통 위와 같이 형태소 단위까지 토큰화를 하는 편이다.
이렇게 문장이 예쁘게 형성되어있다면 좋겠지만
우리가 다루게 될 데이터에는 'ㅋㅋㅋㅋ'나 여러 문장부호들이 등장할 수도 있다.
이 친구들은 문장의 뜻을 파악하는데 큰 도움이 되지 않으므로 정제를 통해 제거한다.
(물론 도움이 되는 경우도 분명 존재한다. 각 상황에 알맞게 정제의 기준을 정해주면 된다.)
정제는 보통 토큰화의 전후로 진행한다.
그후로는 칸우와 박칸우같이 똑같은 뜻이지만 다른 단어로 표기되어있는 친구들을 통합시켜주는 정규화작업을 거치며 1차적인 전처리를 마무리해준다.
2-2. 인코딩, 임베딩
- 인코딩 : 단어에 정수를 부여하는 방식
- 임베딩 : 단어를 벡터로 표현하는 방식
앞서서 토큰화시킨 친구들을 컴퓨터가 바로 이해할 수 있을리는 없고, 이 친구들을 수치적인 어떤것으로 변환을 해주어야 컴퓨터가 받아들여서 처리를 할테니 우리는 그러한 작업을 해 주어야 한다.
인코딩은 원핫 인코딩(여러 단어의 풀에서 본인의 자리만 1, 나머지는 0)과 같이 정수를 부여하는 것이고,
임베딩은 저차원의 밀집벡터로 벡터화시키는 것이다.
위의 예시에서는 차원의 변화는 없긴하지만,,
임베딩은 인코딩보다 더 작은 차원에서 벡터형식으로 표현이 되므로
유사도를 뽑아내는 등 훨씬 다양한 작업을 가능케 한다.
3. 모델링
이제 이쁘게 수치화된 벡터들을 인풋으로 모델링을 하면 된다.
관련 모델들은 어마무시하게 많지만, 당연히 기본이되는 유형들이 존재한다.
통계기반의 과거 언어모델은 제외하고, 인공신경망 기본 언어모델들에 대해 간략하게 소개해보겠다.
- 순환신경망(RNN) : 연속형 데이터를 처리하기 위해 고안된 신경망, 기존 신경망과는 다르게 특정시점의 은닉 벡터가 입력벡터로 다시 들어감
- LSTM : 은닉층에 게이트를 추가하여 셀 상태라는 값을 통해 불필요한 기억은 지우고, 기억해야할 것들을 정함
- seq2seq : 번역기에서 대표적으로 사용되는 모델, 인코더와 디코더를 통해 다음단어 예측
- 트랜스포머 : 인코더-디코더를 따르면서도, 어텐션만으로 구현한 모델
- BERT : 트랜스포머 기반, 엄청난 양의 텍스트로 사전훈련된 모델, 파인튜닝을 통해 task에 알맞게 파라미터 재조정
- GPT : 트랜스포머 기반, BERT와 비슷하게 사전훈련&파인튜닝, generation에 강함
최근 2달동안 화두였던 chatgpt의 경우에는 GPT-3.5를 바탕으로 구축한 모델이다.
최근에는 거의 bert와 gpt같이 트랜스포머 기반 모델들이 거의 장악하고 있는 상황이라 하니
관련 개념들을 잘 쌓아놓으면 확장하시키기에도 좋지 않을까 싶다.
또 최근에 허깅페이스에서 제공하는 transformer 라이브러리를 보면 앞선 전처리과정을 다 진행해주고
레이어를 하나하나 쌓을 필요도 없이 훨씬 적은 코드로 학습기능까지 제공해준다.
하지만 전반적인 흐름과 기본 개념들을 잘 정리해 두어야 더 복잡하고 어려운 과제들을 수행할 수 있지 않을까 라는 생각에
해당 포스팅을 기점으로 세부적인 내용들도 하나 둘 씩 올려보려고 한다.
'NLP' 카테고리의 다른 글
3. 카운트 기반 단어 표현 (1) | 2023.03.05 |
---|---|
2. 텍스트를 숫자로 - 인코딩 (0) | 2023.03.03 |
1. NLP의 뿌리, 텍스트 전처리 (0) | 2023.02.28 |