번역 흐름
규칙 기반 기계 번역(RBMT, Rule-Based Machine Translation)
참조링크 https://m.blog.naver.com/newheater/221763031420
- 규칙에 없는 문장이 들어올 경우 번역이 불가능
- 모든 규칙을 정의하기가 사실상 불가능
- 유연성이 떨어짐
통계적 기계 번역(SMT, Statistical Machine Translation)
참조링크 https://wikidocs.net/21687
- 규칙 기반 모델에 비해 개발 비용이 저렴함
- 데이터가 많을 수록 유연한 문장 생성이 가능
- 데이터에 문장이 나온 적이 없으면 번역 불가능
- 어순에 대한 고려가 없어 어색한 문장 생길 수도 있음
- 희소문제, 올바른 문장이지만 확률을 0으로 정의하게 됨
SMT의 동작은 문장의 자연스러움과, 문법 구조를 고려해야 하기 때문에 단순히 확률 적인 계산으로만 문장을 생성할 수 없음. 이에 따라 원문과 번역문간의 단어 매핑 관계를 추가로 고려하는데 이때 관계를 정렬(Alignment)이라고 함
정렬의 종류
퍼틸리티
원문의 각 단어가 번역 후에 몇 개의 단어로 나타나는지 의미하는 값으로, 위의 예에서 Everyone의 퍼틸리티는 2, Clapped의 퍼틸리티는 3
번역에 직접 등장하진 않지만 p(n|w)로 정의됨
왜곡
원문의 단어가 번역문에서 존재하는 위치를 나타내는 값으로 위 예에서 Clapped는 손뼉(6) 을 (7) 쳤다(8)로 번역되어 Clapped의 왜곡은 (6,7,8)로 나타남
p(t|s, l)로 정의되며 t=번역문에서 단어의 위치, s=원문에서 단어의 위치, l은 번역문의 길이
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]
가장 높은 확률을 갖는 단어가 다음 단어로 결정 되는 순간으로, 탐욕 알고리즘이 사용됨, Greedy Decoding
일반적인 경우 잘 작동하지만 have가 마시다라는 뜻으로 사용되는 데이터가 적다면 greedy 알고리즘은 가지다로 밖에 번역할 수 없음
Beam Search
지금 상황에서 가장 높은 확률을 갖는 Top-k 문장만 남김
상위 몇 개의 문장을 기억할지 = Beam Size( 또는 Beam Width)
Beam Size를 키울수록 성능이 좋지만 그만큼 연산량이 증가하게 됨
대체로 5나 10을 사용하나 스스로 찾아보는 노력이 필요함
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
좋은 번역을 고르는 방법일 뿐 학습에 적용할 수는 없음
Sampling
언어 모델이 반복적으로 다음 단어에 대한 확률 분포를 생성하는데 이때 그 확률 분포를 기반으로 랜덤하게 단어를 뽑는 방법
실제 서비스에는 거의 사용하지 않지만 모델 학습시에 사용되는 경우가 있음. BackTranslation이 대표적 사례
Data Augmentation
개념 참조 사이트
Lexical Substitution(어휘 대체 방법)
동의어 기반 대체
Thesaurus란 어떤 단어의 동의어나 유의어를 집중적으로 구축해놓은 사전으로 대표적으로 WordNet이 있음
한국어 버전으로 부산대학교의 KorLex, 카이스트의 Korean Word Net(KWN)이 있음
사용 예시
Embedding 활용
Pre-training Word Embedding을 활용하는 것
Embedding의 유사도를 기반으로 단어를 대체함
gensim의 most_simillar()
TF-IDF
TF-IDF는 여러 문서를 기반으로 단어마다 중요도를 부여하는 알고리즘
TF-IDF가 값을 갖는 단어들은 핵심 단어가 아니므로 다른 단어로 대체해도 문맥이 크게 변하지 않는 방법을 사용
Back Translation
Synthetic Source Sentence
Source - Target 병렬 말뭉치가 있을 때 S-T 학습한 모델 A, T-S 학습한 모델 B를 통해서 서로 반대 방향에 대한 언어 데이터를 생성하여 병렬쌍으로 활용함
이때 문장 생성하는 기법 중 가장 효과를 보인 것이 Beam + Noise 기법
back translation은 데이터수와 관련없이 효과를 볼 수 있음
Random Noise Injection
오타 추가
사람들이 주로 사용하는 QWERTY 키보드상에서 키의 거리를 기반으로 노이즈를 추가하는 방법
공백 추가
_ 토큰을 활용하는 방법으로 Placeholder Token(공백 토큰)을 사용하며 문장 일부 단어를 공백 토큰으로 치환해서 학습 과적합을 방지하는 효과를 봄
유의어 추가
주어진 문장에서 불용어(Stop word)가 아닌 단어를 랜덤하게 뽑은 후 해당 단어와 유사한 단어를 골라 문장에 삽입
Lexical Substitution 비슷하지만 원본 단어의 손실이 없음
기계 번역의 평가
BLEU(Bilingual Evaluation Understudy) Score로 기계가 실제 번역을 얼마나 재현했는지에 대한 평가
- n-gram을 통해 순서쌍이 얼마나 겹치는지 측정
- 문장 길이에 대한 과적합 보정
- 같은 단어가 연속적으로 나올 때 과적합 보정
참조 GLUE
챗봇과 번역기
- 만드는 방법에 따라 검색 기반 모델, 생성 모델이 있음
- Open Domain은 어떤 토픽이든 오고 갈 수 있는 대화, 다양한 주제를 주고 받음
- Closed Domain은 한정된 분야에 대해서만 대화를 주고 받으며, 주제를 벗어나면 답변 생성이 불가함
질문하는 언어를 Source언어, 답변하는 언어를 Target언어라고 한다면 번역하는 행위를 곧 질문하는 방법으로 바꿀 수 있음
Encoder는 Source 문장을 읽고 이해한 내용을 고차원 문맥 벡터로 압축하며, Decoder는 Encoder가 만든 문맥 벡터를 바탕으로 Target 문장을 생성함
챗봇 고려사항
200ms
대화가 자연스럽게 느껴지는 마지노선 시간으로 0.2초 이내 답변이 나와야 함
모델 외에도 사용되는 시간이 필요한 만큼 각 모듈마다 제한 시간이 더 짧음
시공간에 대한 질문
오늘이 무슨 요일인지에 대한 내용은 같은 질문이더라도 답변이 항상 달라져야하는 부분
페르소나
인격의 일관성(Coherent Personality)에 관한 내용으로 다양한 사람들의 데이터를 모아서 사용할 수 밖에 없기 때문에 모델의 인격이 일관성을 갖기가 어려움
대화의 일관성
너무 뜬금 없는 대답을 막아 대화의 일관성을 유지하려는 시도가 있음
참조링크 https://arxiv.org/pdf/1606.01541.pdf
기존의 Source 질문 Target 답변 방식으로 매핑하는 훈련법은 정답을 맞히게만 학습하기 때문에 문제가 발생함
모든 질문에 대해 "무슨말인지 모르겠어요"가 존재하기 때문
저자들이 정의한 좋은 대화
- 상대방이 답변하기 좋으며
- 새로운 정보를 담고
- 일관성이 있는 말
을 보상으로 이를 최대화하는 방향으로 학습을 진행함
대화에서 [q1, a1, q2, a2, ...] 가 이어질 때 a2는 a1,q2를 보고 문장을 생성하는데 모르겠어요의 경우 모든 질문에 해당될 확률이 높은 문장이므로, a2를 보고 q2를 유추할 수 있는지를 보상으로 추가하여 일관성 있는 대화를 생성하는 방향으로 학습이 진행되게끔 만들었음
대표 챗봇
Meena
구글의 챗봇으로 GPT-2보다 2배가량 큰 모델이며, 9배 많은 데이터로 학습한 모델로 모델 구조는 Evolved Transformer를 사용했으며, 대화 평가 지표인 SSA를 제안함
SSA는 Hi 대화로 시작하여 이후 챗봇이 생성한 발언에 대해 구체적인지 합리적인지 T/F로 평가함
Blender
Facebook의 모델이며, 모델에 페르소나를 부여하는 시도, 자체적인 평가 지표 ACUTE-Eval을 제안함
ACUTE-Eval은 생성된 두 개의 긴 대화를 보고 어떤 대화가 더 사람 같은지와 어떤 챗봇과 대화하고 싶은지 양자택일 평가함
'23년 이전 글 > 모두의연구소 아이펠' 카테고리의 다른 글
NLP Framework (0) | 2022.04.20 |
---|---|
BERT Pretrain with TPU (0) | 2022.04.19 |
Attention to Transformers (0) | 2022.04.04 |
Attention translator (0) | 2022.04.04 |
Seq2seq과 Attention (0) | 2022.03.30 |