해당 포스팅은 AIFFEL에서 제공한 학습자료를 통해 공부한 것을 정리한 것임을 밝힙니다.
학습 목표
- 번역 모델이 발전해 온 과정을 살펴본다.
- 번역을 생성하는 여러 가지 방법을 이해한다.
- 주어진 데이터로 더 높은 성능을 만들어 내는 법을 배운다.
- 자연어 처리의 성능을 측정하기 위한 지표를 배운다.
1. 번역의 흐름
1.1 규칙 기반 기계 번역
번역할 때 경우의 수를 직접 정의해 주는 방식이 규칙 기반 기계 번역(RBMT, Rule-Based Machine Translation)이다. 수 많은 규칙들은 모두 언어학을 기반으로 하기에 개발 과정에 언어학자가 동반되어야만 했다.
1945년, 미국의 조지타운대와 IBM이 직접 정의한 언어 규칙을 통해 60개의 러시아어 문장을 영어로 번영하는데 성공했다.
규칙 기반 기계 번역은 한계가 명확하다. 규칙에 없는 문장이 들어올 경우 번역이 불가하고 유연성이 떨어진다. 또한 모든 규칙을 정의하는 과정이 너무나도 복잡하고 오랜 시간이 필요하다.
1.2 통계적 기계 번역
단점이 명확한 규칙 기반 기계 번역을 개선하고자 하는 시도들이 존재했다.
1988년에 IBM이 Model1을 통해 새로운 번역 방식을 선보였는데, 그것이 바로 수많은 데이터로부터 통계적 확률을 구해 번역을 진행하는 통계적 기계 번역(SMT, Statistical Machine Translation)이다.
통계적 기계 번역은 통계적 언어 모델을 기반으로 동작한다.
위키독스: 통계적 언어 모델
1) 아래와 각 단어에 대한 예측 확률이 주어졌을 때, 문장 "나는 커피를 마신다" 에 대한 확률
P(는|나) = 0.9, P(커피|나는) = 0.5, P(밥|나는) = 0.3, P(를|나는 커피) = 0.95, P(마신다|나는 커피를) = 0.73, P(먹는다|나는 밥을) = 0.81
▼▼
P(나는 커피를 마신다) = P(는|나) x P(커피|나는) x P(를|나는 커피) x P(마신다|나는 커피를) = 0.9 x 0.5 x 0.95 x 0.73 = 0.312075
2) 통계적 모델의 장점과 한계점
- 장점 : 일일이 규칙을 정의해야 하는 규칙 기반 모델보다 개발에 대한 Cost가 훨씬 적다.
많은 데이터가 뒷받침될 경우, 훨씬 더 유연한 문장 생성이 가능하다. (많이 사용되는 문장)
- 한계점 : 본 적이 없는 문장에 대한 모델링이 불가능하다. 데이터 의존적이다.
문장의 어순에 대한 고려가 없기 때문에 다소 어색한 문장이 생성될 수 있다.
3) 희소문제란?
목표하는 문장이 훈련 데이터에 없었던 시퀀스일 경우 올바른 문장임에도 확률이 0으로 정의되는 문제이다.
즉 충분한 데이터를 관측하지 못하여 언어를 정확히 모델링하지 못하는 문제이다.
번역은 자연스러운 문장을 생성하는 것 뿐만 아니라 번역문의 문법 구조도 고려해야 하기 때문에 P(Target | Source) 만을 고려해서는 안된다. 원문과 번역문, 각 단어 간의 매핑 관계를 추가로 고려해야 하는데, 그 관계를 정렬(Alignment)이라고 부른다.
정렬에는 퍼틸리티(Fertility)와 왜곡(Distortion) 두 가지 요소가 포함된다.
- 퍼틸리티 : 원문의 각 단어가 번역 후에 몇 개의 단어로 나타나는지를 의미하는 값
퍼틸리티에 대한 확률은 p(n|w)로 정의된다. (n = 퍼틸리티 값, w = 원문의 단어)
'music'은 높은 확률로 '음악'으로만 번역될테니 p(1|music) = 0.9 정도로 표현할 수 있다. 🔍
- 왜곡 : 원문의 단어가 번역문에서 존재하는 위치
'clapped'는 손뼉(6) 을(7) 쳤다(8)로 번역되므로 clapped의 왜곡은 (6, 7, 8)로 나타난다.
왜곡에 대한 확률은 p(t|s, l)로 정의된다. (t = 번역문에서 각 단어의 위치, s = 원문에서 각 단어의 위치, l = 번역문의 길이)
'Everyone(1)'으로 시작하는 문장은 모두(1) 가(2) 라고 번역될 확률이 높으니 p(1|1, 8) x p(2|1, 8) 역시 제법 높을 것을 추측할 수 있다.
통계적 언어 모델에서 파생된 확률에 위 모든 확률을 곱하여 학습하는 것이 바로 통계적 기계 번역이다.
[예문]
E: Everyone(1, 2) clapped(6, 7, 8) in(4) time(5) to(·) the(·) music(3)
→ K: 모두(1) 가(2) 음악(3) 에(4) 맞춰(5) 손뼉(6) 을(7) 쳤다(8)
[수식]
p(E|K) =
{p(2|Everyone) x p(1|1, 8) x p(2|1, 8) x p(모두|Everyone) x p(가|Everyone)} x
{ p(3|clapped) x p(6|2, 8) x p(7|2, 8) x p(8|2, 8) x p(손뼉|clapped) x p(을|clapped) x p(쳤다|clapped)} x
{p(1|in) x p(4|3, 8) x p(에|in)} x
{p(1|time) x p(5|4, 8) x p(맞춰|time)} x
{p(0|to) x} x
{p(0|the) x} x
{p(1|music) x p(3|7, 8) x p(음악|music)}
'in time to'를 묶어서 한 번에 '~에 맞춰'로 번역이 되면 좋을텐데 그렇게 번역이 되지 않았다.
이에 두 단어 이상으로 정렬을 구하는 구문 기반 번역(PBMT, Phrase Based Machine Translation)이 등장하였다. 또 규칙 기반 번역과 결합하여 하이브리드로 사용된 사례도 있다.
1.3 신경망 기계 번역
신경망 기계 번역(Neural Machine Translation)에는 seq2seq나 transformer 모델이다.
2. 지적 생성을 위한 넓고 얕은 탐색
2.1 Greedy Decoding
def generate_text(model, tokenizer, init_sentence="<start>", max_len=20):
test_input = tokenizer.texts_to_sequences([init_sentence])
test_tensor = tf.convert_to_tensor(test_input, dtype=tf.int64)
end_token = tokenizer.word_index["<end>"]
while True:
predict = model(test_tensor)
predict_word = tf.argmax(tf.nn.softmax(predict, axis=-1), axis=-1)[:, -1]
test_tensor = tf.concat([test_tensor, tf.expand_dims(predict_word, axis=0)], axis=-1)
if predict_word.numpy()[0] == end_token: break
if test_tensor.shape[1] >= max_len: break
generated = ""
for word_index in test_tensor[0].numpy():
generated += tokenizer.index_word[word_index] + " "
return generated
위의 함수는 훈련시킨 모델이 문장을 생성할 수 있게 해주는 함수이다. 그 중에서 우리가 주목해야 하는 부분은 '단어를 결정하는 부분'이다.
predict_word = tf.argmax(tf.nn.softmax(predict, axis=-1), axis=-1)[:, -1]
모델이 예측한 'predict' 값을 Softmax를 통해 확률값으로 변환한 후, 가장 높은 확률을 갖는 단어가 다음 단어로 결정된다. 이것은 탐욕 알고리즘(Greedy Algorithm)이 사용된 것이다. 탐욕적인 방법으로 문장을 Decoding하니 기계 번역에서는 이를 Greedy Decoding이라고 칭한다.
탐욕적인 방법은 효율적이지만 최적의 해를 구해준다는 보장이 없다. 즉, 우리는 지금 최고의 번역을 생성하고 있는 것이 아니다.
우리는 통계적 기계 번역 파트에서 배운 것처럼 문장이 존재할 확률을 구할 수 있다.
우리는 '커피를 한 잔 가져도 될까요?' 보다 '커피를 한 잔 마셔도 될까요?'가 높은 확률로 존재할 것을 예상할 수 있다. 하지만 have가 마시다로 사용되는 경우가 훈련 데이터에 적거나 없다면 탐욕적인 방법은 have를 가장 높은 확률로 가지다로 번역할 수 밖에 없을 것이다.
단어 사전으로 만들 수 있는 모든 문장을 만든 후, 실제 세계에 존재하는 우리가 직접 고르는 방법으로 이를 해결할 수 있다. 하지만 1,000개의 단어를 갖는 사전으로 3개 단어 문장 하나를 만드는 데에 1,000,000,000개 문장이 서비스로 온다는 것이 다소 문제가 될 수 있다.
2.2 Beam Search
Bean Search는 단어 사전으로 만들 수 있는 모든 문장을 만드는 대신, 지금 상황에서 가장 높은 확률을 갖는 Top-k 문장만 남기는 방식으로 진행되는 알고리즘이다.
상위 몇 개의 문장을 기억할지는 Beam Size(혹은 Beam Width)로 정의해 줄 수 있다.
위 예시는 Beam Size를 2로 하는 Beam Search를 표현한 것이다. Beam Size는 연산량과 성능 간의 Trade-off 관계를 가지고 있다. 자원이 무한하다면 Beam Size를 키우면 키울수록 성능이 좋아진다는 것이다. 직접 실험을 통해 찾아보는 것이 좋으나 대체로 5나 10을 적합한 값으로 택하곤 한다.
간단한 예제로 Beam Search를 이해해보자.
import math
import numpy as np
def beam_search_decoder(prob, beam_size):
sequences = [[[], 1.0]] # 생성된 문장과 점수를 저장
for tok in prob:
all_candidates = []
for seq, score in sequences:
for idx, p in enumerate(tok): # 각 단어의 확률을 총점에 누적 곱
candidate = [seq + [idx], score * -math.log(-(p-1))]
all_candidates.append(candidate)
ordered = sorted(all_candidates,
key=lambda tup:tup[1],
reverse=True) # 총점 순 정렬
sequences = ordered[:beam_size] # Beam Size에 해당하는 문장만 저장
return sequences
vocab = {
0: "<pad>",
1: "까요?",
2: "커피",
3: "마셔",
4: "가져",
5: "될",
6: "를",
7: "한",
8: "잔",
9: "도",
}
prob_seq = [[0.01, 0.01, 0.60, 0.32, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01],
[0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.75, 0.01, 0.01, 0.17],
[0.01, 0.01, 0.01, 0.35, 0.48, 0.10, 0.01, 0.01, 0.01, 0.01],
[0.24, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.68],
[0.01, 0.01, 0.12, 0.01, 0.01, 0.80, 0.01, 0.01, 0.01, 0.01],
[0.01, 0.81, 0.01, 0.01, 0.01, 0.01, 0.11, 0.01, 0.01, 0.01],
[0.70, 0.22, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01],
[0.91, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01],
[0.91, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01],
[0.91, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]]
prob_seq = np.array(prob_seq)
beam_size = 3
result = beam_search_decoder(prob_seq, beam_size)
for seq, score in result:
sentence = ""
for word in seq:
sentence += vocab[word] + " "
print(sentence, "// Score: %.4f" % score)
커피 를 가져 도 될 까요? <pad> <pad> <pad> <pad> // Score: 42.5243
커피 를 마셔 도 될 까요? <pad> <pad> <pad> <pad> // Score: 28.0135
마셔 를 가져 도 될 까요? <pad> <pad> <pad> <pad> // Score: 17.8983
굳이 고정된 개수의 문장을 얻지 않아도 된다면 적당한 Beam Size를 설정해 준 후 Score를 기준으로 필터링하는 방법도 좋다.
❗ 주의 ❗
Beam Search는 사람이 직접 좋은 번역을 고를 수 있게 상위 K개의 결과를 보여줄 뿐이라서 학습에 직접적으로 적용할 수는 없다. 그래서 모델 학습 단계에서 Beam Search를 사용하지 않는다.
2.3 Sampling
Sampling은 언어 모델은 반복적으로 다음 단어에 대한 확률 분포를 생성하기 때문에 그 확률 분포를 기반으로 랜덤하게 단어를 뽑아보는 아이디어를 기반으로 제안된 방법이다.
높은 확률을 갖는 단어를 택하는 경우가 가장 많기 때문에 랜덤이지만 지나치게 뜬금없는 문장이 생성되지는 않을 것이다.
"Sampling은 대체 어디에 사용해야 하지..?"
Sampling은 간혹 난해한 문장을 생성할 수 있기 때문에 실제 서비스에서는 거의 사용되지 않는다. 대신 모델을 학습시킬 때 사용되는 경우가 있는데, 대표적인 사례로는 Back Translation(역번역)이 있다. 또한 강화 학습의 입실론 그리디(E-Greedy)와도 궤를 함께하기 때문에 자연어 처리에 강화 학습을 적용한 경우에 등장하기도 한다.
3. 방과 후 번역 수업
3.1 Data Augmentation
Data Augmentation은 '데이터 증가', '데이터 확대' 등으로 직역되며 훈련 데이터를 수십배까지도 부풀리는 기술을 의미한다. 주로 이미지 처리 영역에서 많이 사용된다.
[Augmentation 기법]
좌우 반전 (Flipping과 중복): 이미지를 좌우로 반전시킨다.
Crop: 이미지의 특정 부분을 잘라낸다.
밝기 조절: 이미지의 밝기를 변화시킨다.
Rotation: 이미지를 0 ~ 360도 회전시킨다.
Shifting: 이미지를 약 10px 움직인다. 끝단이 잘려 나가는 효과가 있다.
Rescaling: 이미지를 1.0 ~ 1.6배 키운다.
Flipping: 이미지를 상하 / 좌우 반전을 한다.
Shearing: 약 -20 ~ 20도 정도로 이미지를 찌그러트린다.
Stretching: 이미지를 가로 / 세로 약 1.0 ~ 1.3배 늘린다.
이미지 데이터에서만 사용 가능한 것이 아니라 자연어 처리에 적용할 수 있는 기법들도 만들어졌다. 대신 이미지 처리처럼 단순한 방법은 아니라서 이해하는데에 시간이 필요할 수 있다.
3.2 Lexical Substitution
Lexical Substitution은 '어휘 대체'로 직역된다. 대체할 어휘를 선정하는 기준에 따라서 기법이 세부적으 나뉜다.
3.2.1 동의어 기반 대체
시소러스(Thesaurus)란, 어떤 단어의 동의어나 유의어를 집중적으로 구축해놓은 사전을 의미한다. 동의어 기반 대체는 시소러스를 활용한 방법이다. 워드넷(WordNet)은 대표적인 시소러스이다.
시소러스를 활용한 단어 의미 파악
1) 워드넷은 트리 구조가 아닌 유향 비순환 그래프 형태로 구축되었는데, 그 이유는 한 노드가 여러 개의 상위 노드를 가질 수 있기 때문이다.
2) 한국어로 구축된 워드넷
- 부산대학교의 KorLex
- 카이스트의 Korean WordNet(KWN)
시소러스 방식을 통해 Augmentation을 하면 위의 이미지와 같이 될 것이다.
동의어를 기반으로 대체하는 것은 아주 좋은 방법이지만, 규칙 기반 기계 번역처럼 모든 것을 사람이 정의해야 한다는 것이 단점이다.
3.2.2 Embedding 활용 대체
Pre-training Word Embedding을 활용하는 방법이다. Word2Vec이나 GloVe 등의 기법들을 통해 학습된 Embedding은 유사한 단어들끼리 비슷한 공간에 밀집된다. 사람이 일일이 정의한 데이터베이스 대신, 이 Embedding의 유사도를 기반으로 단어를 대체하면 훨씬 편리할 것이다.
gensim 라이브러리를 활용하면 이 방법은 아주 쉽게 사용할 수 있다. 단어를 유사도 순으로 정렬해 보여주는 most_similar() 함수를 사용할 수 있다.
3.2.3 TF-IDF 기반 대체
TF-IDF는 여러 문서를 기반으로 단어마다 중요도를 부여하는 알고리즘이다.
문서의 핵심이 되는 소년, 피리 같은 단어들은 높은 TF-IDF값을 부여받고, 한,를과 같은 단어들은 낮은 TF-IDF 값을 가지게 된다. 이 때, 낮은 TF-IDF 값을 갖는 단어들은 핵심 단어가 아니기 때문에 다른 단어로 대체해도 문맥이 크게 변하지 않는다는 것에 주목한 아이디어이다.
3.3 Back Translation
Back Translation은 단일 언어 데이터는 구하기 쉽고 많지만 병렬 쌍을 이룬 언어 데이터를 찾기는 어렵다는 문제를 해결하고자 등장했다. 번역 모델에 단일 언어 데이터를 학습시키는 방법이다.
Seq2seq의 구조를 되새겨보면, Source 문장을 Encoding하는 부분과 Target 문장을 Decoding하는 부분을 분리하여 모듈들이 각 언어를 더 잘 처리할 수 있게 했었다.
그렇다면 Encoder에는 Source 언어로 된 문장을, Decoder에는 Target 언어로 된 문장을 훈련해보는 것은 어떨까.
Back Translation 정리
1) Synthetic Source Sentence를 생성하는 과정
S(source) - T(target) 병렬 말뭉치가 있다고 가정하면, S → T 방향 번역 모델 A를 학습함과 동시에 T → S 방향 번역 모델 B도 동시에 학습한다. 후에 T 언어로 된 단일 언어 데이터에 모델 B를 활용해 인공적인 S 언어 데이터를 생성하고 인공적인 S 언어 데이터와 T를 병렬 쌍으로 사용한다. 이때 생성되는 인공적인 S 언어 데이터가 Synthetic Source Sentence이다.
2) Back Translation을 적용할 때, 문장을 생성하는 기법 중 가장 좋은 성능을 보인 생성 기법
▶ Beam Search에 Noise를 추가한 Beam + Noise
3) Sampling 기법으로 생성한 Back Translation이 효과적인 최소 데이터 수
- Back Translation : 데이터 수에 무관하게 효과적
- Sampling : 64만 개 이상
딥러닝 모델을 사용한다는 점이 이미지 처리에서 GAN으로 Augmentation 하는 것을 떠올리게 한다.
Back Translation은 현재 번역 데이터셋으로 가장 유명한 WMT2014에서 State-of-the-art 성능을 보인 알고리즘이다.
3.4 Random Noise Injection
데이터에 포함된 적당한 노이즈는 때때로 학습에 도움이 되기도 한다. 그래서 문장에 노이즈를 주는 것도 괜찮은 Augmentation 기법이 될 수 있다. 노이즈를 주는 기준에 따라서 방법이 여러 가지로 나뉜다.
3.4.1 오타 노이즈 추가
타이핑을 할 때 주변 키가 눌려 발생하는 오타는 굉장히 자연스럽다. 이를 이용한 Augmentation 기법이 바로 오타 노이즈를 추가하는 것이다.
'올 때 아이스크림 사와'를 '놀 때 아이스크림 사와'로 바꾸는 등 QWERTY 키보드 상에서 키의 거리를 기반으로 노이즈를 추가하는 방법이다.
3.4.2 공백 노이즈 추가
_ 토큰을 활용하며 이를 Placeholder Token(공백 토큰)이라고 부른다. 문장의 일부 단어를 공백 토큰으로 치환하는데, 학습의 과적합을 방지하는데에 좋은 효과를 볼 수 있다.
3.4.3 랜덤 유의어 추가
위의 2가지 방법은 대체로 문장의 의미를 유지하며 문장을 변환하는 형태인 반면, 이 방식은 노이즈를 추가한다.
주어진 문장에서 불용어(Stop word)가 아닌 단어를 랜덤하게 뽑은 후, 해당 단어와 유사한 단어를 골라 문장에 아무렇게나 삽입하는 방식이다.
앞서 배운 Lexical Substitution과 비슷한 느낌이지만 원본 단어가 손실되지 않는다.
Word2Vec의 아이디어를 생각하면 유사어를 삽입하는 것이 모델의 Embedding 층을 더 견고하게 만들어 줄 것이다.
4. 채점은 어떻게?
BLEU(Bilingual Evaluation Understudt) Score는 '기계가 실제 번역을 얼마나 잘 재현했는가?'를 평가하는 번역 평가 지표이다.
BLEU Score
1) BLEU Score 계산하기
- Real : 귀여운 고양이 는 아침 식사 를 즐긴다
- Pred : 고양이 고양이 고양이 고양이
▶ 2-gram 이상에서 매치되는 경우가 없으므로 Precision 값은 0, 따라서 BLEU는 0점
2) Precision^4 계산하기 (Clipping 포함)
- Real : 귀여운 고양이 는 아침 식사 를 즐긴다
- Pred : 귀여운 고양이 는 아침 귀여운 고양이 는 아침
▶ 1-Gram : 4/8 = 1/2
2-Gram : 3/7
3-Gram : 2/6 = 1/3
4-Gram = 1/5
Precision^4 = 1/70
위키독스: BLEU Score
1) BLEU가 생각하는 3가지 문제점과 나쁜 예 (BLEU Score는 3가지 문제점을 방지한 N-Gram 지표임)
- 같은 단어가 반복되어 높은 점수를 받는 것을 지양한다. (the the the the the the)
- 단어를 잘 재현하더라도 어순이 엉망인 번역을 지양한다. (am boy i good)
- 지나치게 짧은 번역이 높은 점수를 받는 것을 지양한다. → 브레버티 페널티 (It is)
기계 번역은 BLEU Score로 줄 세우기가 가능하다. 다른 Task에 대한 평가 지표도 있다.
GLUE는 기계 번역 너머의 자연어 이해를 평가하기 위해 고안된 지표이다.
5. 실례지만, 어디 챗씨입니까?
5.1 챗봇과 번역기
[번역] 챗봇을 위한 딥러닝 1. 개요
1) 챗봇을 만드는 방법
- 검색 기반 모델
- 생성 모델
2) Open Domain과 Closed Domain의 차이점
- Open Domain : 어떤 토픽이라도 오고 갈 수 있는 대화, 무한정의 주제를 다루는 소셜미디어가 대표적인 예시
- Closed Domain : 한정된 분야에 대해서만 대화를 주고 받는다. 주제를 벗어나면 답변을 생성할 수 없다.
사용자 또한 주제 외적인 것을 기대하지 않는다.
우리는 생성모델에 대해서 알아볼 것이다. 번역 모델을 챗봇에 적용하는 아이디어는 Sequence-to-Sequence에서 시작한다.
Sequence-to-Sequence의 구조를 되새겨보면, Source 문장을 Encoding하는 부분과 Target 문장을 Decoding하는 부분을 분리하여 모듈들이 각 언어를 더 잘 처리할 수 있게 했다.
- Back Translation 설명 中-
챗봇은 사람과 대화를 하는 것이 목적인 모델이다. 그렇다면 질문만 하는 나라의 언어를 Source 언어라고 하고 답변만 하는 나라의 언어를 Target 언어라고 하면 Source문장을 Target문장으로 번역하는 행위가 곧 질문에 답하는 행위가 된다.
Encoder는 Source문장을 읽고 이해한 내용을 추상적인 고차원 문맥 벡터로 압축한다.
Decoder는 Encoder가 만든 문맥 벡터를 바탕으로 Target 문장을 생성한다. 이 과정은 Source 언어의 Embedding 공간 속 문장을 Target 언어의 Embedding 공간으로 매핑한다고 할 수 있다. 수 많은 데이터로 학습하는 것은 그 과정을 더 잘 해내기 위함이다.
이것은 Source 문장에 대해 매핑될 수 있는 고유한 Target 번역이 존재하기 때문에 가능하다. 그렇기에 번역기를 챗봇으로 사용하는 게 가능하다.
5.2 좋은 챗봇이 되려면
5.2.1 200ms
200ms는 대화가 자연스럽게 느껴지는 답변의 공백 마지노선이다. 인간이 챗봇한테 말을 걸었을 때, 0.2초 이내에 답변이 나오는 것이 바람직하다는 것이다.
실제로는 10개 이상의 모듈이 동작하기 때문에 각 모듈에 0.01초 수준의 시간이 주어진다고 한다.
5.2.2 시공간을 담은 질문
'오늘 무슨 요일이야?', '오늘 금천구 날씨 어때?'와 같은 특정 시공간에 의해 결정되는 질문은 단순한 학습으로 답변을 할 수 없다. 그래서 보통은 질문의 의도를 파악한 후, 시공간에 대한 질문은 다른 모듈로 연결하여 예외 처리를 하곤 한다.
5.2.3 페르소나
인격의 일관성 (Coherent Personality)이라는 주제로 다뤄진 것과 유사한 이야기다.
학습에는 주로 많은 사람들의 채팅 데이터를 모아서 사용할 수 밖에 없기 때문에 모델이 대답의 일관성을 갖는다는 것은 굉장히 도전적이다. 이 때의 일관성을 모델의 인격이라고 칭하며, 그것을 페르소나라고 부른다.
한 연구팀에서 페르소나에 대한 설명과 챗봇 적용 과정을 정리해주었으니 살펴보자.
챗봇UX 4편, 챗봇이 다른 서비스와 다른 점, 페르소나
1) 챗봇의 페르소나를 설정할 때 고려해야 하는 요소
페르소나는 제품이나 서비스의 목적에 맞게 설정되어야 한다. 목적, 개성이 나타날 수 있는 요소 (성격, 목표, 동기부여, 니즈 등)
5.2.4 대화의 일관성
챗봇이 페르소나를 가지는 것처럼, 사용자의 페르소나도 어딘가에 저장해놓고 적재적소에 사용한다면 정말 좋겠지만, 아직까지 사용자에 관한 정보를 기억하고 이를 활용하는 모델은 없다. 대신 너무 뜬금없는 대답을 막아서 대화의 일관성을 유지하려는 시도는 있다.
기존의 Source 질문을 Target 답변으로 매핑하는 훈련법은 정답을 맞히게끔 학습하기 때문에 문제가 발생한다. 모든 질문에 대한 정답인 '무슨 말인지 모르겠어요'가 존재하기 때문이다.
또한 'See you later'를 'See you later'로 대답하는 것은 정답이지만 그 대답에다 또 'See you later'를 하는 것은 이상하다. 다음에 만나자는 무한 루프에 빠지고 말것이다.
논문의 저자들은 좋은 대화를 정의하고 그걸 학습하게끔 모델을 설계했다.
1) 상대방이 답변하기 좋고
2) 새로운 정보를 담고 있으며
3) 일관성이 있는 말을 각각 보상으로 정의하여 이를 최대화하는 방향으로 학습을 진행하였다.
딥러닝이 Loss를 최소화하듯이, 강화학습은 보상을 최대화한다.
'일관성이 있는 말'에 대해 자세히 살펴보자.
대화를 [q1, a1, q2, a2, ...]라고 정의하고 q, a는 각각 질문과 답변이다. a2를 생성할 때에는 a1, q2를 보고 생성을 하고 해당 문장이 생성될 확률이 곧 보상이 된다. 하지만 '모르겠어요'는 모든 질문에 대해 생성될 확률이 높은 문장이므로 자칫하면 a2가 '모르겠어요'여도 큰 보상을 주게 될 것이다.
이에 저자들은 a2를 보고 q2를 유추할 수 있는지를 보상에 추가하였다. 그렇게 되면 a2가 q2의 정보를 포함하지 않을 때 좋은 보상을 받을 수 없을 것이다. 이는 곧 일관성 있는 대화를 생성하는 방향으로 학습이 진행되게끔 한다.
5.3 대표적인 챗봇
5.3.1 Meena
Meena는 구글이 만든 챗봇이다. 매우 거대한 GPT-2보다 2배 가량 큰 모델을 9배 더 많은 데이터로 학습한 챗봇이다. 모델 구조는 Evolved Transformer를 사용하였다. 무엇보다 자체적인 대화 평가 지표인 SSA를 제안하고 이를 분석하였다.
SSA는 대화의 일관성을 위해 'Hi!'로 대화를 시작하며, 이후 평가자는 챗봇이 생성한 발언에 대해 구체적인지와 합리적인지를 T/F로 평가한다.
5.3.2 Blender
Facebook의 Blender도 이후에 등장하였다.
모델에 페르소나를 부여하고자 하는 시도와 자체적인 평가 지표 ACUTE-Eval을 제안한 것이 인상적이다.
Blended Skill Task는 저자들이 데이터를 그냥 학습시키는 것이 아닌 모델에게 특정 부분에 대해 초점을 맞추고 학습사게끔 제안한 방법이다.
ACUTE-Eval은 생성된 두 개의 긴 대화를 보고 평가자는 어떤 대화가 더 사람 같은지와 어떤 챗봇과 대화하고 싶은지를 양자택일로 평가하는 방법이다.
'AIFFEL > Going Deeper(NLP)' 카테고리의 다른 글
[Going Deeper(NLP)] 15. NLP Framework의 활용 (0) | 2022.04.21 |
---|---|
[Going Deeper(NLP)] 10. Transformer로 번역기 만들기 (0) | 2022.04.12 |
[Going Deeper(NLP)] 9. Transformer가 나오기까지 (0) | 2022.04.06 |
[Going Deeper(NLP)] 7. Seq2seq와 Attention (0) | 2022.03.30 |
[Going Deeper(NLP)] 6. 임베딩 내 편향성 알아보기 (0) | 2022.03.29 |