1. 자연어 처리
1.1) 종류
- 규칙 기반 처리 : 미리 정해놓은 규칙을 가지고 if, else를 수행해서 모델링
- 확률 기반 처리
자연어 이해 : 입력에 적합한 답변이나 0 또는 1을 출력
자연어 생성 : 이전 문장의 맥락을 파악해서 다음 단어나 문장을 생성
1.2) 실제 가장 많이 사용되는 모델
- BERT(Bidirectional Encoder Representations from Transformer) - 자연어 이해(분류, 군집 등)에 주로 사용되는데 입력 문장의 좌우 문맥을 모두 고려해서 단어의 임베딩 벡터를 생성
Fine Tuning(미세 조정) 단계에서 해당 과제의 데이터로 추가 학습하여 성능을 개선
- GPT(Generative Pre-trained Transformer) - 단방향 언어 모델로 이전 단어 바탕으로 다음 단어를 예측함.
주로 생성에 이용됨. 챗봇의 문답 형식에서는 유사한 문장이더라도 주어지는 문장의 길이와 선택 가능성에 따라 뒤에 올 수 있는 단어의 수는 제한
1.3) 자연어 처리에 필요한 알고리즘
- 토큰화(문장을 단어 단위로 분할)
영문의 경우는 공백을 가지고 분할
한글의 경우는 형태소 분석
- 임베딩 - 단어 사전을 만들고 그 사전을 이용해서 문장을 숫자 벡터로 만드는 것
단어 사전을 만들 때 숫자를 어떻게 부여할 것인가 하는 문제 : TD-IDF(여러 문서에 공통으로 등장하는 단어는 가중치를 낮추고, 하나의 문서에서 여러번 등장하는 단어는 가중치를 높여주는 것)
- 패딩 - 딥러닝은 기본적으로 입력되는 데이터의 길이가 같아야 하므로 문장을 숫자로 변경했을때 문장의 길이가 모두 일치해야 합니다. -> 앞이낟 뒤에 0 을 추가해줌.
2. 자연어 전처리
2.1) 토큰화
- 단어(corpus라고 부르는 경우가 많습니다.) 단위로 분할을 해서 수치화 시키는 과정
- Tensorflow 에서는 문장의 list를 대입하면 각 문장을 공백을 기준으로 분할해서 단어 사전을 만들어 주는데 자주 등장하는 단어의 앞쪽에 인덱스를 부여. 이 객체를 이용해서 문장들을 임베딩 하는 과정도 수행
- 이 클래스를 직접 사용하는 경우는 드문데 이유는 이 클래스는 오로지 공백만을 가지고 분할을 수행합니다.
영어의 경우 과거형, 현재 진행형 등의 시제가 다르면 다른 단어로 판단하게 되고 한글 같은 경우는 조사에 따라서도 다른 단어로 간주
- OOV : 단어 사전에 없는 단어
기본적으로는 인코딩할 때 무시
단어 사전을 만들 때 OOV에 대한 옵션을 설정할 수 있습니다.
2.2) 빈도 수
- 빈도 수가 작거나 아주 많은 단어가 존재하는 경우 처리
- 사전을 만들 때는 모든 단어를 전부 만들지만 임베딩을 할 때 사용하고자 하는 목적에 따라 선택을 해야합니다.
2.3) 패딩
- 모든 문장의 길이를 동일하게 맞추는 작업
- 옵션을 이용해서 앞에 0을 붙일 수도 있고 뒤에 0을 붙일 수도 있고 앞과 뒤에서 자를 수도 있습니다.
2.4) 중복 제거
- 리뷰나 이메일 데이터를 가지고 분석을 하는 경우 동일한 데이터가 여러 번 존재하는 경우가 발생할 수 있기 때문에 중복을 제거해야 주는 것이 좋습니다.
3. Tagging
- 단어에 의미를 부여하는 것
- 개체명 인식기와 품사 태거가 대표적인 서비스
- RNN의 Sequence To Sequence 모델이며 앞과 뒤 모두를 참고하는 RNN(Bidirectional RNN) 문장(단어의 Sequence)을 대입해서 각 단어와 품사나 개체명을 출력
- 지도 학습의 일종
X(단어 데이터) 와 Y(레이블 데이터) 형태의 병렬 구조를 가짐
- 품사 태깅과 같이 사용하는 경우가 많음
영문의 경우는 nltk에서 지원
- 챗봇에서 필요로하는 전처리 작업 중 하나
챗봇은 도메인 또는 목적에 특화되도록 만들어지는 경우가 많기 때문에 객체명 인식을 정화갛게 해야 하므로 직접 훈련을 시키는 방법을 사용
- BIO 방법
B는 Begin의 약자로 개체 명이 시작되는 부분에 B를 할당하고 개체 명 내부에는 I 그리고 개체 명 외부에는 O를 할당하는 방식
- 영화 제목에서 개체를 인식 : 해리보터 보러가자 -> B I I I OOOO
- 2가지 종류 이상을 인식하고자 할 때는 접두어를 사용 : 영화 제목과 극장 이름 찾기 -> 해리포터 보러 메가박스 가자 -> B I I I O O B I I I O O
- 영문의 경우는 기본 형태를 제공
데이터의 형태는 [단어] [품사 태깅] [개체명 태깅]으로 되어 있음
EU - NNP(고유 명사) LOC(location)
rejects - VBZ(3인칭 단수 명사)
- 챗봇 처럼 데이터가 계속해서 쌓여서 활용하는 분야에서는 사용자의 질문을 받으면 이 데이터를 태깅을 해두는 것이 중요합니다.
챗봇은 이 태깅된 것을 가지고 정답을 찾아갑니다.
입력된 문장에서, 태그를 가진 중요한 단어들을 읽어 그에 맞는 동작을 취하는 것.
4. Subword Tokenizer
4.1) 개요
- 자연어 처리에서 가장 어려운 일 중 하나는 단어 사전에 없는 단어(OOV)가 출현하는 경우
- Subword Segmentation : 하나의 단어는 더 작은 단위의 의미있는 여러 서브 워드들의 조합으로 구성된 경우가 있기 때문에 하나의 단어를 여러 서브워드로 분리해서 단어를 인코딩 및 임베딩 하겠다는 것
이렇게 하면 희귀 단어나 신조어 문제를 완화시킬 수 있습니다.
4.2) BPE
- 데이터 압축 알고리즘이었는데 자연어 처리의 서브 워드 알고리즘으로 응용됨
aaabdaaabas 라는 문장이 제공
가장 많이 등장하는 바이트의 쌍을 찾음
aa 가 가장 많이 2번 등장 - aa를 다른 문자로 치환
Z = aa 로 치환
- 자연어 처리에서의 BPE
서브 워드 분리 알고리즘으로 기존에 있던 단어를 분리한다는 의미
글자 단위에서 점차적으로 단어 집합(vocabulary)을 만들어내는 Bottom Up 방식으로 접근을 사용하는데 훈련 데이터에 있는 단어들을 모든 글자 또는 유니코드 단위로 단어 집합을 만들고 가장 많이 등장하는 유니그램을 하나의 유니그램으로 통합
기존은 단어들의 빈도 수를 가지고 딕셔너리를 생성
4.3) Wordpiece
- 구글이 BERT를 구현할 때 사용한 알고리즘
- BPE의 변형으로 BPE는 빈도 수를 기반으로 병합을 수행하는데 우도(Likelihood - 가능도)를 가장 높이는 쌍을 병합
확률 : 어떤 일이 발생할 가능성, 확률 분포를 고정시킨 상태에서 관측되는 사건이 변화할 때 확률
우도 : 어떤 일이 발생할 가능성, 관측된 사건을 고정시킨 상태에서 확률 분포가 변할 때의 확률
4.4) SentencePiece
- 구글이 만든 알고리즘으로 BPE 알고리즘과 Unigram Language Model Tokenizer를 구현한 서브워드 토크나이저 알고리즘
- 기존 단어 분리 알고리즘이 성능이 우수하기는 한데 한국어는 사용하기 어려움
한국어는 단어 토큰화가 어려움
이런 경우에는 사전 토큰화 작업없이 바로 단어 분리 알고리즘을 사용할 수 있도록 한 알고리즘 사전 토큰화 작업을 수행하지 않기 때문에 언어에 종속되지 않음
- sentencepiece 패키지를 이용해서 수행 - 간혹 인터넷에서는 버전을 명시해서 설치하는 경우가 있는데 버전을 명시하면 지금은 에러가 발생
대부분의 기능과 관련된 패키지들은 사용 중에 버그가 발생하면 기존 버전을 두고 새로운 버전을 론칭하는 경우가 많은데 구글이 제공하는 알고리즘과 관련된 것들은 이전 버전을 삭제하고 새로운 버전을 올리는 경우가 많음
- 텍스트 데이터를 수집해서 이 텍스트 데이터를 이용해서 단어 사전을 생성
이 작업은 도메인이 다르면 별도로 수행
새로운 데이터가 주기적으로 만들어 진다면 일정한 주기를 가지고 다시 수행
4.5) OOV 문제를 해결하기 위해서 단어 사전을 만드는 알고리즘
- BPE : 등장 횟수를 가지고 단어 사전을 만드는 방식
- WordPiece : 토큰화 없이 사용하는 방식 - 한국어
- SentencePiece : 토큰화 없이 사용하는 방식 - 한국어
자연어 처리를 일정량의 데이터가 모이면 자신만의 단어 사전으로 만들어 사용
5. 마르코프 체인 - 생성 모델
5.1) 개요
- 확률을 기반으로 하는 알고리즘
- 물리학과 통계학의 기본 모델로 응용
- 과거의 상태를무시하고 현재의 상태만을 기반으로 다음 상태를 선택하는 것
- 기존 문장을 기반으로 문장을 자동으로 생성할 수 있으며 문장을 요약하는 기능도 가지고 있음
한국어 형태소 분석의 Okt 에 자동으로 등록하는 트위터 봇에 내장
5.2) 문장을 만드는 과정
- 문장을 단어 단위로 분할 - Subword Tokenizing 이나 형태소 분석
- 단어의 전후 연결을 디셔너리에 등록
- 디셔너리를 이용해서 임의의 문장을 생성
5.3) 마르코프 체인 실습
- 기존의 사전으로 사용되고 있는 markov-toji.json
추가학습으로 사용할 데이터를 가지고 있는 BEXX003.txt
6. Sequence To Sequence Model
- 줄여서 seq2seq 라고도 부르는 모델
- 시퀀스를 입력으로 받아서 시퀀스를 출력하는 모델
- 초창기에는 RNN 층을 이용해서 구현을 했는데 2015 년에 중요한 부분에만 집중하는 Attention 메커니즘이 등장하고 RNN을 제거하고 Attention 만으로 구현한 모델이 2017년에 등장하는데 이 모델이 Transformer 이다.
- 이 Transformer를 기반으로 GPT1, 2, 3, 4 그리고 BERT가 등장
- RNN은 순차적으로 데이터를 입력하기 때문에 학습 속도가 느린 단점이 있는데 트랜스포머는 병렬화가 가능
- Seq2Seq -> Seq2Seq2 + Attention -> Transformer -> BERT, GPT
- 구성
- Encoder와 Decoder로 구성
- Encoder -> 맥락 벡터 -> Decoder
- 초창기 모델에서는 Encoder와 Decoder를 LSTM 으로 구현
- 인코더는 단어 단위로 쪼개서 단어 토큰을 하나씩 받아서 처리하고 인코더는 모든 단어를 입력받은 후 RNN 셀의 마지막 시점의 은닉 상태를 Decoder 의 RNN 셀에게 넘겨주는데 이를 Context Vector라고 합니다.
- 디코더는 입력을 ㅂ다으면 다음에 등장할 확률이 높은 단어를 예측하고 그 다음 셀은 이전 단어를 입력으로 받아서 다음 단어를 예측하는 형태로 동작
- 이런 형태로 챗봇이나 언어 번역기 같은 것을 구현하는 것이 가능
- seq2seq, attention, transformer 가 이전의 딥러닝 모델과 다른 점은 입력과 출력을 별도로 구현합니다.
- 입력 모델과 출력 모델을 별개로 구현합니다.
- 입력 모델을 Encoder 라고 하고 출력 모델을 Decoder 라고 합니다.
6.1) BLEU Score(Bilingual Evaluation Understudy Score)
- 기계 번역 성능이 얼마나 뛰어난가를 측정하기 위해 사용하는 방법
- 단어 개수로 측정
6.2) 언어 번역기와 챗봇을 만드는 원리는 동일
- 언어 번역기는 번역을 원하는 문장을 입력해서 다른 언어로 생성하는 것
- 챗봇은 질문을 받아서 질문에 해당하는 답변을 출력
6.3) Attention
- 출력을 만들때 마다 입력을 확인하고 입력 데이터의 각 단어의 가중치를 다르게하여 예측을 해나가는 방식
6.4) Transformer
- RNN을 제거하고 Attention만으로 만든 seq2seq
6.5) 사전 훈련된 모델
- Transformer는 모델을 만들기 위한 구조에 대한 개념
- BERT는 Transformer를 이용해서 만든 사전 훈련된 모델
- BERT를 사용할 때는 BERT에 나의 데이터를 추가하여 미세조정 (Fine Tuning)을 해서 사용
- 서비스를 구현할 때 데이터가 충분하지 않은 경우 모델을 직접 만드는 것은 아무런 의미가 없습니다.
- 구글은 BERT를 훈련할 때 위키피디아의 데이터 뉴스 데이터를 이용해서 몇 가지 작업을 미리 수행했습니다.
'LG 헬로비전 DX DATA SCHOOL > Python' 카테고리의 다른 글
Tensorflow를 이용한 회귀 와 분류 (0) | 2023.09.15 |
---|---|
TensorFlow (0) | 2023.09.15 |
Association_Analysis (연관 분석) (0) | 2023.09.07 |
NLP(Natural Language Processing) 자연어 처리 (0) | 2023.09.05 |
차원 축소 (DimensionalityReduction) (0) | 2023.09.04 |