-
[자연어 처리] 기계 번역 Seq2Seq🤖𝗔𝗜/🤖광주 인공지능사관학교 2020. 8. 11. 15:33
Seq2Seq
: 입력된 시퀀스로부터 다른 도메인의 시퀀스를 출력하는 분야에서 사용되는 모델
봇(Chatbot)과 기계 번역(Machine Translation), 내용 요약(Text Summarization), STT(Speech to Text) 등에서 쓰인다.
구성 :
인코더와 디코더로 구성된다.
인코더 : 입력 문장의 모든 단어들을 순차적으로 입력받은 뒤에, 마지막에 이 모든 단어 정보들을 압축해서 하나의 벡터로 만든다.
=> 컨텍스트 벡터
-> 디코더로 전송한다.
즉, 한글 문장 받아서 LSTM 마지막 시점의 은닉/셀 상태 리턴하도록.
디코더 : 컨텍스트 벡터를 받아서 번역된 단어를 한 개씩 순차적으로 출력한다.
인코더와 디코더는 RNN 형태이다. 성능 문제로 인해 LSTM 셀로 구성.
인코더 : 입력 문장을 받는 RNN 셀
-> 입력문장은 단어 토큰화를 통해 단어 단위로 쪼개지고, 단어 토큰 각각은 RNN 셀의 각 시점의 입력이 된다.
-> 인코더 RNN 셀의 마지막 시점의 은닉 상태를 디코더 RNN 셀로 넘겨준다. ( 컨텍스트 벡터 )
디코더 : 출력 문장을 출력하는 RNN 셀
-> 컨텍스트 벡터는 디코더 RNN 셀의 첫번째 은닉 상태로 사용된다.
디코더는 초기 입력으로 문장의 시작을 의미하는 <start> 들어간다.
그리고, 다음에 등장할 확률이 높은 단어를 예측한다.
예측된 단어를 다음 시점의 RNN 셀의 입력으로 입력한다.
문장의 끝을 의미하는 <end>가 다음 단어로 예측될 때 까지 반복한다.
훈련 과정과 테스트 과정 작동 방식이 다름.
훈련 : 디코더에게 인코더가 보낸 컨텍스트 벡터와 실제 정답을 알려주면서 훈련한다.
테스트 : 디코더는 오직 컨텍스트 벡터와 <start> 만을 입력으로 받은 후에 다음에 올 단어를 예측하고,
그 단어를 다음 시점의 RNN 셀의 입력으로 넣는 행위를 반복한다.
나는 개와 산책을 하고 있다. -> 인코더를 거치면서 셀/은닉 상태 리턴
셀 상태와 은닉 상태 + <start>가 인풋으로 들어가면
지금까지 쌓아진 셀/은닉 상태 값, 현재 단어 -> 다음 단어
기계는 텍스트보다 숫자를 잘 처리한다.
자연어 처리에서 텍스트를 벡터로 바꾸는 방법으로 워드 임베딩이 사용된다.
seq2seq에서 사용되는 모든 단어들은 워드 임베딩을 통해 나온 임베딩 벡터이다.
단어 개수 만큼 임베딩 벡터를 만든다. 정수 인코딩 할 때는 1부터 인덱스를 부여.
입력할 때는 임베딩 레이어를, 출력할 때는 소프트맥스 함수를 거친다.
LSTM 마지막 은닉 상태값, 마지막 은닉 상태값, 마지막 셀 총 3개 리턴. return_state = True라고 하면..!
디코더 모델. 인코더의 상태값(h,c)랑 영어 문장을 입력받아서, LSTM의 출력값(은닉 상태)을 받아서 softmax 통과
Dense( len(tokenizer_en.word_index) + 1,
모든 단어의 확률값을 출력하고, 그 중에서 가장 높은 확률 값을 얻어야 해서.
참고 : https://wikidocs.net/24996
Prediction
인코더가 출력하는 마지막 시점의 셀/은닉 상태 값 따로 구하고,
<start> 라는 인풋을 따로 디코더 모델의 lstm에 집어 넣어서,
lstm에서 내는 아웃풋 다시 lstm에 계속 집어넣는 형태로 ! 그러다가 <end>가 보이면 그만.
인코더가 출력하는 마지막 시점의 셀/은닉 상태 값 따로 구하고
h_state, c_state는 아웃풋 레이어 (LSTM)를 명시한 것
훈련을 하고 나면 레이어 별로 가중치를 학습, 훈련이 되었으니 학습된 가중치를 가진 레이어를
디코더 모델을 만들 건데, 디코더 모델에 초기값으로 넣을 상태값의 모양을 지정한다.
우리가 시퀀스를 넣을 게 아니라, 단어 단어를 넣을 것이기 때문에, 한 시점만 존재
상태값을 자동으로 넘겨주지 않기 때문에, 직접 넘겨줘야 한다.
lstm 셀 통과하면서 예측, softmax 함수를 통과한 출력값 ( 각 단어별 다음 단어일 확률 )
다시 그 단어 + 전 시점의 디코더의 상태 값이 디코더 인풋으로 들어간다.
챗봇 만들기
질문이 인코더, 답변이 디코더로 들어가는 것이다.
'🤖𝗔𝗜 > 🤖광주 인공지능사관학교' 카테고리의 다른 글
Kaggle 타이타닉 데이터로 생존자 규칙 찾기. (0) 2020.08.14 [머신러닝] Boosting, GradientBoosting, 분류 알고리즘 정리 (0) 2020.08.12 MobileNET에 대한 고찰. (0) 2020.08.11 알고리즘 (0) 2020.07.16 pivot table과 groupby (0) 2020.07.16