본문 바로가기
Research/Machine Learning

Natural Language Processing

by IMCOMKING 2017. 8. 14.

NLP 기초

# 용어
- consonant: 자음
- vowel: 모음
- morpheme: 형태소, 뜻을 갖는 최소 단위
- syntactic: 문법적인
- semantic: 의미적인
- delexicalization: 3시15분 -> [Time]으로 바꿈

# Beam search
greedy 탐색 알고리즘(휴리스틱 탐색)이다. DP가 아니다. 적당히 쓸만한 solution을 구하는 것이다.
빔서치는

 

 

# IOB format: token classification(Slot filling)에서 New York과 같든 2개의 word로 된 녀석들을 처리하기 위한 것.
- New: B-city
- York: I-city
이런식으로 B가 등장하고, 같은 종류의 sub-slot에 해당하는 I slot이 연속해서 나오면 하나로 묶어서 처리함. 그리고 O의 경우 None slot을 의미함.
inside, outside, beginning
https://en.wikipedia.org/wiki/Inside%E2%80%93outside%E2%80%93beginning_(tagging)
- 그런데 이 방식보다 그냥 I를 쓰지 않고, 단순히 최초에 등장하는 B이후의 모든 (O를 만나기전) token을 묶어버리는 방식이 더 성능이 좋다고 함.

# state tracking
slot:value pair를 context혹은 domain에 맞게 계속해서 만들거나 수정해 가는 과정.

# subword
subword는 word dictionary 사이즈가 너무 크기 때문에 이를 작게 쪼개고 싶은 니즈가 있음.
그런데 char는 너무 단순함. 그 중간이 필요하다는 것은 다들 동의할 수 있음.
그런데 BPE같은걸 하면 문제가, an 같은 단어가 fan에서 쓰이는거랑 단독으로 an에서 쓰이는게 완전히 다른데 이걸 같은 걸로 처리하는 문제가 있음..

# word piece
https://wikidocs.net/22592
http://aidev.co.kr/nlp/7777
https://lovit.github.io/nlp/2018/04/02/wpm/
word piece는 byte pair encoding하고 거의 똑같고, 디테일만 차이남.(BPE에서 띄어쓰기인 ‘/w’ 만 언더바로 바꾸면 똑같은듯)
그냥 word dictionary를 만들면 사이즈가 너무 크니까, 이걸 N개로 딱 지정하고, 그냥 character level에서 자주 나오는 단위순으로 자른 것

* 그런데 이렇게 word piece를 사용하면 문제가 "아웃백" 같은 단어는 등장빈도가 매우 낮으므로, 아 ## 웃 ## 백 이렇게 쪼개져서 token이 나눠진 채로 토큰 임베딩이 뽑힘 되어버림.
그런데 우리가 원하는 결과는 "아웃백" 이렇게 띄어쓰기로 구분된 녀석에 대해서 tagging을 하고 싶은것임. 그래서 IOB 포멧을 사용함.

# Teacher forcing
seq2seq에서 병렬화+캐스케이딩 에러를 줄이기 위한 트릭. sequential prediction을 끊고, 걍 각 GT word들이 next word만 예측함. 커리큘럼러닝과 관련

# GLUE
가장 공신력있는 NLP모델 성능측정 지표. 굉장히 여러개의 데이터셋과 task에 대해서 종합적으로 모델을 평가함. 개중에는 서로 코릴레이션이 음수인 task도 있다고 함.

# Language Model
next word를 예측하는 모델

# Task oriented dialog(==Goal oriented dialog)
- user 혹은 agent 혹은 둘다가 대화를 통해서 특정한 목표를 달성에 성공해야하는 문제. ex) 음식 주문하기

# Slot normalizer
룰베이스로 입력된 slot:value 에 대해서 특정 값으로 변환시킴. 모르는 값이 들어오면 처리 불가.

# Token classification
각 word piece 그대로 value로 사용해서, 어떤 slot인지만 분류하는 방식. ASR에서 발생한 에러 때문에 무한가지 value가 가능.

# Structured Prediction: Supervised Learning에서 graph구조를 가진 multi-label들을 예측함.
ex) 의문문 생성
여기서 어려운 점은, 각각의 multi-label이 서로 독립이 아니고 의존성을 갖고 있다는 점임. 
(예를 들어 주어 다음 동사는 되지만, 주어 다음 명사는 안됨 등등)
https://en.wikipedia.org/wiki/Structured_prediction

 


 

- Character-level BPE
일반적으로 BPE가 적용되는 경우 보통 Character-level로 데이터를 표현하고 여기에 대해 BPE 알고리즘을 적용한다.

 

- Byte-level BPE
그런데 BPE는 압축 알고리즘이므로 원래는 bit나 byte에 대해서도 충분히 적용할 수 가 있다. sequence에서 반복되는 고빈도 패턴을 묶어주는 알고리즘이기 때문이다.
문서를 char가아니라 byte 로 표현하고, 여기에 대해서 BPE를 적용하는 방법이 더 최근에 자주 쓰인다고 한다.

이렇게 했을 때의 장점은 무엇일까?

추측컨데 아마도 CBPE보다 BBPE를 쓰면, 똑같이 멱급수를 따라서 token 마다의 빈도수 그래프가 그려진다고 했을 때, BBPE가 좀 더 continous한 그래프가 나오지 않을까 생각한다.

 

 

 

 

 

댓글