티스토리 뷰
언어를 기계가 인식할 수 있도록 형태로 바꾸려면 어떻게 해야 할까요?
인공신경망으로 분석할 데이터는 실수로 이루어진 벡터나 매트릭스 등 다차원의 실수 데이터, 즉 텐서(Tensor) 타입이어야 합니다.
언어의 경우도 텐서로 바꾸어 인식시킬 수 있습니다.
일반적으로 NLU는
Step1) 토크나이징 : 자연어 인풋을 분석의 단위 (어절/형태소/음절 등)으로 쪼개는 과정
Step2) 인코딩 : 토큰을 단어 사전을 이용해 One-hot-Encoding으로 바꾸는 과정
Step3) 토큰 임베딩 : One-hot-Encoding 벡터를 의미 있는 실수 벡터로 변환하는 과정
Step4) 모델 : 변환된 벡터를 이용해 수행하는 목적에 따라 딥러닝 모델을 통해 결과를 내는 과정
(감성분석 예시)
"가게 건물은 별론데 맛은 최고다."
[토크나이징] 가게 / 건물 / 은 / 별론데 / 맛 / 은 / 최고 / 다
[인코딩] 2/ 50893 / 4728 / 97 / 9347 / 4 / 712 / 9
[토큰임베딩] [0.531, 0.129] / [.... ] / [....]
[모델] 긍정 score : 0.92 / 부정 score : 0.08
Step1. Tokenizing(Parsing)
문장을 인공신경망에 인식시키기 위해 세부 단위로 자르는 작업을 의미합니다.
이 쪼개진 단위를 토큰(token)이라 합니다.
문장을 쪼개는 방법은 데이터의 특징과 수행하는 목적에 따라 다릅니다.
특히 언어마다도 일반적으로 사용하는 방식이 다른데, 영어의 경우 어절, 즉 띄어쓰기 단위로 자를 수 있고 중국어의 경우 문자마다 뜻이 담겨 있어 글자 단위로 쪼갤 수 있습니다.
한국어의 경우에는 복합어 이므로 문장을 형태소 단위로 자르거나 음절단위로 쪼갭니다.
[문장] 여행은 떠나기 전이 가장 설레다
* [어절] : 여행은 + 떠나기 + 전이 + 가장 + 설레다
* [형태소] : 여행(NNG) + 은(JX) + 떠나(VV) + 기(ETN) + 전(NNG) + 이(JKS) + 가장(MAG) + 설레(VA) + 다(E)
(NNG : 일반명사, JX : 보조사, VV : 동사, ETN : 명사형 전성 어미, JKS : 주격조사, MAG : 일반 부사, VA : 형용사)
* [음절] : 여 + 행 + 은 + + 떠 + 나 + 기 + + 전 + 이 + + 가 + 장 + 설 + 레 + 다
* [자소] : ㅇ + ㅕ +ㅎ + ㅐ + ㅇ + ㅇ + ㅡ + ㄴ+ + ㄸ + ㅓ + ㄴ + ㅏ + ㄱ + ㅣ + + ㅈ + ㅓ + ㄴ + ㅇ + ㅣ + + ㄱ + ㅏ +ㅈ + ㅏ + ㅇ + ㅅ + ㅓ + ㄹ + ㄹ + ㅔ + ㄷ + ㅏ
형태소 단위의 경우 논문이나 뉴스기사, 연설문처럼 잘 정제된 글을 잘 쪼갤 수 있습니다. 그러므로 상대적으로 신조어나 맞춤법이 맞지 않는 글에는 취약합니다. 형태소 단위는 형태소 분석기에 따라 달라질 수 있습니다. (어휘 리스트는 형태소 수 만큼)
음절 단위의 경우 맞춤법이나 띄어쓰기가 제대로 지켜지지 않는 SNS글이나 채팅글에 적합합니다.(어휘 리스트는 13,000개 수준)
형태소 분석은 한국어 자연어 처리의 기본이라 할 수 있습니다. 한국어 형태소 분석에는 어떠한 특징이있을까요?
⬛ 한국어 형태소 분석
- 사용할 데이터의 특성(띄어쓰기 유무 등)이나 개발 환경(Python, Java)에 따라서 적합한 형태소 분석기를 선택합니다.
- 한나눔, 꼬꼬마(kkma), 코모란, OKT 분석기는 konlpy(코엔엘파이) 설치로 이용 가능합니다.
- MeCab : 처리 속도가 빠르고 품질도 상위권
- Khaiii : 카카오에서 만든 딥러닝 기반의 형태소 분석기
- 분석기마다 품사 tag도 조금씩 달라 통일이 안 되어 있다.
- 한국어 단어가 너무 많아 단어사전 생성 시 OOV 문제가 발생한다.
Step2. 인코딩
워드임베딩(Word Embedding)은 쪼개진 토큰들을 인공신경망이 계산할 수 있도록 N 차원의 실수로 벡터화하는 것을 의미하고
인코딩은 모든 문장, 문서들을 토크나이징하고 토큰들의 중복을 제거한 사전 만든 후 토큰을 단어 사전을 이용해 One-hot-Encoding으로 바꾸는 과정을 의미합니다.
정확히는 사전의 길이(중복 제외된 토큰 수) 만큼 벡터를 정의하고 벡터에서 토큰의 순서에 해당하는 위치만 1, 나머지는 0으로 채워 벡터를 구성
(※ 1,2,3,... 으로 스칼라 값 하나가 아닌 [1,0,0,...] 으로 표현하는 이유는 각 토큰들을 서로 대등하고 동일한 양의 정보를 갖게 표현하게 하기 위해서입니다.)
문장 : "I am a boy" "I am a student"
▶ (어절단위로 토크나이징, 단어 중복제거하여 단어 사전 만들고, 사전의 단어 각각을 One-hot Vector로 인코딩힙니다.)
a → [1 0 0 0 0 ], am → [0 1 0 0 0 ] , boy → [0 0 1 0 0 ] , I → [0 0 0 1 0 ] , student → [0 0 0 0 1]
▶(문장의 각 단어를 벡터로 교체)
" [0 0 0 1 0 ] [0 1 0 0 0 ] [1 0 0 0 0 ] [0 0 1 0 0 ]" " [0 0 0 1 0 ] [0 1 0 0 0 ] [1 0 0 0 0] [0 0 0 0 1] "
⬛ 단어 사전
단어 사전은 각각의 토큰을 정수 인덱스로 매핑한 것을 의미합니다.
가지고 있는 코퍼스에 대해 중복을 제거하고 빈도수 기준 Top V개를 이용해 단어 사전을 만듭니다. 예를 들어, 위키 백과나 뉴스를 크롤링하여 형태소분석을 시행하고 상위 빈도 10만개의 단어를 사용합니다.
- 사전에 포함하지 않은 단어는 [UNK] 토큰을 사전에 추가
- 딥러닝 배치 처리를 위해 시퀀스 길이를 맞추기 위해 [PAD] 토큰도 사전에 추가
- 번역 과제의 경우, 문장의 시작을 알리는 <sos>, 끝을 알리는 <eos> 를 추가
특히 모델링 시 중요한 점은 학습할 때와 추론할 때의 단어사전이 변해서는 안됩니다.
"가게 건물은 별론데 맛은 최고다."
[토크나이징] 가게 / 건물 / 은 / 별론데 / 맛 / 은 / 최고 / 다
* 단어사전 : {["[PAD]" : 0, "[UNK]" : 1, "가게" : 2, ...}
[인코딩] 2/ 50893 / 4728 / 97 / 9347 / 4 / 712 / 9
여기서 2 → [001 ...0]
위의 예시와 같이 하나의 토큰에 대해 단어사전 크기(V)만큼의 행렬로 표현되며,
모델에서는 해당 인덱스만 1, 나머지는 0의 값을 가지는 One-hot-Encoding 벡터로 처리합니다.
Step3. 토큰 임베딩
토큰 임베딩은 One-hot-Encoding 벡터[Size = V(단어사전 크기)]를 Projection(Wx)하여 의미 있는 실수 벡터[Size = N(임베딩 크기)]로 변환하는 과정을 의미합니다.
여기서 "의미 있는" 벡터란 무엇일까?
비슷한 의미를 가지는 단어를 비슷한 공간으로 임베딩하는 것을 의미합니다. 예를 들어, 운동 ~ 헬스
- 단어 사전의 크기(V)가 커지면 임베딩에 필요한 파라미터 수가 증가하게 됩니다.
(예를 들어, V=10만, N = 100이면 W = 1000만 차원) - 반대로, 단어 사전 크기가 작으면 [UNK] 개수가 많아기 떄문에 적정 개수를 유지하는 것이 중요합니다.
아래 그림에서 보면 One-hot Encoding 벡터를 Look-Up 테이블(W) 행렬에 곱해 원하는 차원으로 임베딩을 하게 됩니다.
Look-Up 테이블의 행은 워드 임베딩을 위한 전체 단어의 개수와 같은 값을 가지며, 열의 개수는 워드 임베딩에서 변환하고자 하는 차원의 개수와 같습니다.
가게 건물은 별론데 맛은 최고다."
[토크나이징] 가게 / 건물 / 은 / 별론데 / 맛 / 은 / 최고 / 다
[인코딩] 2/ 50893 / 4728 / 97 / 9347 / 4 / 712 / 9
[001 ...0] / ....
[토큰임베딩] [1.7184, -0.7530, ... 0.0074] / ....
토큰 임베딩 방법에는 CBOW와 Skip-Gram이 있습니다.
단어의 의미는 해당 단어의 문맥(Context)이 담고 있기 때문에 다음과 같은 행위가 가능해집니다.
ⅰ. 같은 문맥에서 비슷한 위치에 등장하는 단어끼리 유사한 의미를 갖는다. ▶CBOW
(예시) "운동하고 스트레칭하니 몸이 __했다"
"어제 술먹고 해장국을 먹으니 속이 __해졌다"
"가을바람이 불어 __하다"
→ __ 에는 '상쾌' 또는 '시원' 이라는 단어가 들어갈 수 있습니다.
ⅱ. 단어의 의미를 정확히 몰라도 문맥을 보면 대략적인 의미를 유추할 수 있다. ▶Skip-Gram
(예시) "그 투수는 신인임에도 9회에 팀 위기에 구원 등판해서 점수를 주지 않고 그 경기의 '매조지'를 잘 했다"
"A과장은 평소 세심한 스타일이며 주어진 일을 '매조지'하는 능력이 탁월하다"
"B가수는 전국순회공연을 '매조지'하고 앵콜공연만이 남았다"
→ '매조지'는 사용 예시를 보면 알 수 있듯, '일의 끝을 단단히 단속하여 마무리하다'라는 의미입니다.
⬛ CBOW(Continuous Bag of Words)
기계에게 문장을 알려주되, 주변에 있는 w개의 토큰을 보고 중간에 있는 토큰을 알아 맞추는 임베딩 사전학습 방법
학습된 토큰 임베딩은 의미 공간 상에 비슷한 단어를 비슷한 벡터로 저장합니다.
다음은 "I like ____ data analysis"의 CBOW의 예시입니다.
정보의 가공은 아래 그림에 W' 즉, Weight Matrix를 통해 이루어지고
Weight Matrix값은 학습을 통해 태스크를 잘 수행할 수 있는 방향으로 정해지게 됩니다.
(아래의 그림과 설명은 https://blog.naver.com/ollehw/221749978611 을 참조하였습니다.)
⬛ Skip-Gram
기계에게 단어(토큰) 하나를 알려주고, 주변에 등장할만한 그럴싸한 문맥을 만들도록 합니다.
많은 문장을 학습시킬수록 더 좋은 품질의 벡터가 나옵니다.
여기서 임베딩 파라미터를 학습하기 위해서는 Negative likelihood loss를 활용합니다.
앞서 설명한 CBOW와 Skip-Gram으로 학습된 워드 임베딩은
① 저장공간을 효율적으로 사용할 수 있고
② 유사한 단어 벡터를 밀집할 수 있고
③ 의미를 담은 수치 연산이 가능합니다.
이 워드임베딩 기법으로 의미 연산이 가능합니다. 이를 테면 '한국'-'서울'+'파리' = '프랑스' 같은 벡터 연산이 가능합니다.
(한국어 벡터 연산 사이트 : https://word2vec.kr)
Step4. 모델링
NLU를 하기 위해서는 토큰의 시퀀스로 이루어져 있는 자연어 문장으로부터 문맥적인 의미를 담은 representation(hidden state, h차원 벡터)을 추출하고 그를 이용해 내가 풀고자 하는 태스크를 수행하는 모델링하는 것이 필요합니다.
모델링에서 중요한 점은 다음과 같습니다.
1) 목적에 맞는 Deep Learning 아키텍처를 구성하는 것
2) 태스크의 인풋과 아웃풋을 정의하는 것
3) 예측하고자 하는 대상에 대해 좋은 representation(hidden state)를 만드는 것
⬛ Regression(회귀분석) - 모델의 아웃풋이 숫자인 문제
(예시) 유사도 분석
- [Input] "즐거운 하루 보내 " & "오늘 하루 행복해" → [Output] 0.9
- Loss : MSE(Mean Squared Error) / MAE(Mean Absolute Error)
⬛ Classification(분류분석) - 모델의 아웃풋이 클래스인 문제
(예시) 감성분석
- 문장이 부정/중립/긍정 중 어떤 감성 카테고리에 속하는지 분류
- [Input] "도와주셔서 정말 감사해요"
→ [문장에 대한 h차원 벡터]
→ Fully Connected Layer
→ [Output] 긍정 [0.01,0.02,0.96]
Ground Truth : '클래스'를 나타내는 번호(인덱스)
- → Loss : Sparse Categorical Cross Entropy
- Ground Truth : '클래스'를 나타내는 one-hot vector
→ Loss : Categorical Cross Entropy
'Data Science&AI' 카테고리의 다른 글
[딥러닝] LSTM(Long-Short Term Memory)에 대한 이해 (0) | 2023.02.13 |
---|---|
[딥러닝] RNN(Recurrent Neural Network)에 대한 이해 (0) | 2023.02.13 |
[추천시스템] 추천시스템의 한계와 좋은 추천시스템이란? (0) | 2023.02.12 |
[추천시스템] 추천시스템 A to Z : 추천 시스템 평가지표(NDCG, 그외) (0) | 2023.02.12 |
[추천시스템] 추천시스템 A to Z : 추천 알고리즘의 종류 (0) | 2023.02.12 |
- Total
- Today
- Yesterday
- 비즈니스 관점 AI
- 영화 인턴
- 추천시스템
- pandas-ai
- data drift
- Model Drift Detection
- Data Drift와 Concept Drift 차이
- 생성형BI
- Tableau vs QuickSight
- pandas-gpt
- Model Drift
- SQLD자격증
- amazon Q
- 영어공부
- Generative BI
- amzaon quicksight
- AutoEncoder
- 데이터 드리프트
- 모델 드리프트
- 최신시계열
- 모델 드리프트 대응법
- Concept Drift
- 모델 배포
- SQLD 정리
- NHITS설명
- Data Drift Detection
- 시계열딥러닝
- 오토인코더
- SQLD
- On-premise BI vs Cloud BI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |