Seq2Seq  for Encoder & Decoder

concept of this algorithm

위 그림에 각 박스는 가장 일반적으로 GRU 쎌이거나 LSTM 쎌인 RNN 쎌을 나타낸다(RNN Tutorial를 참조하길 바란다). 인코더와 디코더는 가중치를 공유 할수 있거나, 더 일반적으로는 다른 매개변수 집합을 사용한다. 다중층 쎌들은 역시 시퀸스-투-시퀸스에서 성공적으로 사용되어 왔다. 예로 번역 Sutskever et al., 2014 (pdf)에서 알수 있다.

위에서 설명된 기본 모델에서, 모든 입력은 디코더에 전달되는 유일한 것이기 때문에 고정된 크기를 가진 상태 벡터로 인코딩 되어져야 한다. 디코더가 입력에 더 직접적인 접근을 가능케 하기 위해, 주의(attention) 메카니즘이 Bahdanau et al., 2014(pdf)에서 소개된다. 주의(attention) 메카나즘에 대해서 상세히 보지 않을 것이다(논문을 참고), 그것은 디코더가 모든 디코딩 단계에서 입력을 엿보게 해주는 것이라고 언급하는 것만으로도 충분하다. LSTM 쎌을 가진 여러층의 시퀸스-투-시퀸스 네트워크와 디코더 안에 어탠션 메카니즘은 이처럼 보인다.

[번역] 가장 대표적인 사용예는 번역이 될 것이다. 요즘 Google 번역기가 매우 좋아진 것도 바로 이런 이유이다.
Encode : 안녕하세요. 오늘 기분은 어떠세요?
Decode : Hello. How are you feel today?
위와 같이 데이터를 구성하고 아래의 Network 을 이용하여 훈련을 시키면 “안녕하세요. 오늘 기분은 어떠세요?” 라고 입력을 하였을때, “Hello. How are you feel today?”라는 답을 하는 네트워크가 구성되는 것이다.

[대화]번역뿐만 아니라 간단한 문/답에도 아래와 같이 적용해 볼 수 있을 것이다. (※단순 Seq2Seq 로 Alex 같은 것은 구현할 수 없다)
Encode : 안녕하세요!?
Decode : 잘가세요!?

[분류]Time Series 한 Classification 문제도 생각해 볼 수가 있다. 아래의 데이터를 주가의 흐름이라고 하자
Encode : 1900, 1800, 1700, 1600, 2000
Decode : Up/Down
예를 들면 종합 주가지수가 1900, 1800, 1700, 1600, 2000 와 같이 변동해 왔을때, 내일의 주가는 내려갈까요? 올라갈까요? 와 같은 형태의 질문도 훈련을 할 수가 있을 것이다.

APIs – Define Neural Network

import requests
import json, os

nn_id = 'seq2seq003'

####(1) 네트워크 생성 ####
resp = requests.post('http://' + url + '/api/v1/type/common/target/nninfo/nnid/' + nn_id + '/',
                     json={
                         "biz_cate": "MES",
                         "biz_sub_cate": "M60",
                         "nn_title" : "test",
                         "nn_desc": "test desc",
                         "use_flag" : "Y",
                         "dir": "wdnn",
                         "config": "N"
                     })
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))

####(2) 버전 생성 ####
resp = requests.post('http://' + url + '/api/v1/type/common/target/nninfo/nnid/' + nn_id + '/version/',
                 json={
                     "nn_def_list_info_nn_id": "",
                     "nn_wf_ver_info": "test version info",
                     "condition": "1",
                     "active_flag": "Y"
                 })
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))

모든 네트워크가 공통적으로 사용하는 기능으로 비지니스를 정의하고 해당 비지니스에서 어떤 아키택쳐를 사용하고 어떤 파이프라인을 사용할 것인가에 따라서 버전을 정의할 수 있다. 상세한 정의 내용은 아래와 같다.
-nn_id : Neural Network ID
-biz_cate : Business 대분류
-biz_sub_cate : Business 소분류
-nn_title : Neural Network Title
-nn_desc : Neural Network Description
-use_flag : 사용여부
-dir : 문제유형
-config : Custom 여부

APIs – Create Graph Flow

# Work Flow 틀을 구성하도로고 지시한다. (정해진 틀을 강제로 생성)
resp = requests.post('http://' + url + '/api/v1/type/wf/target/init/mode/simple/' + nn_id +'/wfver/1/',
                     json={
                         "type": 'seq2seq_csv'
                     })
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))

Simple Type 으로 정해진 그래프 플로우를 강제로 생성합니다.  위의 경우에는 csv type 의 데이터를 받아서 seq2seq 로 처리하는 플로우를 만들겠다로 이해하시면 됩니다.

APIs – Upload local data

import os

return_dict = {}
return_dict['test'] = open('../../data/seq2seq.csv', 'rb')

resp = requests.post('http://' + url + '/api/v1/type/wf/state/framedata/src/local/form/raw/prg/source/nnid/'+nn_id+'/ver/1/node/data_csv_node/',
                     files = return_dict)

data = json.loads(resp.json())
print("evaluation result : {0}".format(data))

간단하게 로컬 데이터를 업로드하여 훈련에 사용한다.

APIs – Data Configuration

resp = requests.put('http://' + url + '/api/v1/type/wf/state/framedata/src/local/form/raw/prg/source/nnid/'+nn_id+'/ver/1/node/data_csv_node/',
                     json={
                         "type": "csv",
                         "source_server": "local",
                         "source_sql": "all",
                         "preprocess":  "none"
                     })

데이터를 로딩하기 위한 파라메터를 세팅한다.

APIs – Data Feeder Configuration

# (2) Network 에 데이터를 Feed하는 Node 의 속성을 정의 
resp = requests.post('http://' + url + '/api/v1/type/wf/state/pre/detail/feed/src/frame/net/seq2seq/nnid/'+nn_id+'/ver/1/node/feed_fr2seq/',
                     json={
                         "encode_column" : "encode",
                         "decode_column" : "decode",
                         "encode_len" : 10,
                         "decode_len" : 10,
                         "preprocess": "mecab",
                     })
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))

데이터를 어떻게 이해하고 가공하여 신경망 훈련에 사용할 것인지 지정한다.

-encode_column : Csv 파일에서 Encode 에 사용할 컬럼 명
-decode_column : Csv 파일에서 Decode 에 사용할 컬럼 명
-max_sentence_len : 문장의 길이를 최대 어디까지 인지할 것인지 지정
-preprocess : 사용할 Pos Tagger 를 지정 (mecab, kkma, twiter 등)

APIs – Network Configuration

# update source_info
resp = requests.put('http://' + url + '/api/v1/type/wf/state/netconf/detail/seq2seq/nnid/'+nn_id+'/ver/1/node/netconf_node/',
                     json={
                         "encoder_len" : 10,
                         "decoder_len" : 10,
                         "encoder_depth" : 2,
                         "decoder_depth" : 2,
                         "cell_type" : "lstm",   #vanila, lstm, gru
                         "cell_size" : 500,
                         "drop_out" : 0.8,
                         "word_embed_type" : "onehot",   #w2v, onehot
                         "word_embed_id" : "",
                         "vocab_size" : 200,
                         "batch_size" : 74,
                         "iter" : 100,
                         "early_stop" : 0.9,
                         "learning_rate" : 0.001
                     })
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))

Seq2Seq 알고리즘을 사용하기 위한 파라메터를 지정한다.

-encoder_len : 인코더 부분의 길이 지정
-decoder_len : 디코더 부분의 길이 지정
-encoder_depth : 인코더 Hidden Layer 깊이
-decoder_depth : 디코더 Hidden Layer 깊이
-cell_type : vanila, lstm, gru
-cell_size : cell 의 Vector size
-drop_out : Train 시 Drop Out Rate
-word_embed_type : onehot encoder or word2vector를 사용할 것
-word_embed_id : Word2Vector인 경우 사용한 기 훈련된 Network ID 를 지정해야 함
-batch_size : 한번에 훈련할 데이터 건수
-iter : 반복해서 훈련할 횟수
-early_stop : 지정횟수 이전에 훈련을 종료하기 위한 적중률 기준
-learning_rate : Weight 값 갱신시 사용한 Hyper Parameter

APIs – Run Train

resp = requests.post('http://' + url + '/api/v1/type/runmanager/state/train/nnid/'+nn_id+'/ver/1/')
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))

지금까지 정의한 파이프라인을 실행한다.

APIs – Predict Service

resp = requests.post('http://' + url + '/api/v1/type/service/state/predict/type/seq2seq/nnid/'+nn_id+'/ver/active/',
                     json={"input_data" : "[회의] 를 [이름] [이름] 참석자로 예약해줘" , "num": 0, "clean_ans":True}
                     )
data = json.loads(resp.json())
print("evaluation result(7) : {0}".format(data))
evaluation result(2) : [['@', '2/SN', 'SF'], ['-1', '-1', '-1'], ['-1', '-1', '-1'], ['-1', '-1', '-1']]

 

Categories: Seq2Seq

Leave a Reply

Your email address will not be published. Required fields are marked *