Use CharCNN for train model
Concept of this algorithm
워드 임베딩이 인기를 끌고 그 성능 또한 검증된 이후, 단어 결합이나 n-gram으로부터 높은 수준의 피처를 추출해내는 효율적인 함수의 필요성이 증대됐다. 이러한 추상화된 피처들은 감성분석, 요약, 기계번역, 질의응답(QA) 같은 다양한 NLP 문제에 사용될 수 있다. 콘볼루션 신경망은 컴퓨터 비전 분야에서 뛰어난 성능으로 인해 자연스런 선택이었다(Krizhevsky et al., 2012; Sharif Razavian et al., 2014; Jia et al., 2014). 문장 모델링에서 CNN을 활용하는 것은 Colobert and Weston(2008)로 거슬러 올라간다. 이 연구는 다범주 예측 결과를 출력하기 위해 multi-task learning을 사용했다. 품사태깅, 청킹, 개체명인식, 의미역결정, 의미적으로 유사한 단어 찾기, 랭귀지모델 같은 NLP 과제 수행을 위해서다. 참조테이블(look up table)은 각 단어를 사용자가 정의한 차원의 벡터로 변형해 사용된다. 따라서 n개의 단어로 이뤄진 입력문장 {s1,s2,..,sn}은 참조테이블을 활용해 벡터들의 나열인 {ws1,ws2,…,wsn}으로 변환된다. (그림 5)
이는 학습 과정에서 단어 벡터(가중치)가 학습되는 초기 단어 임베딩 기법의 아이디어로 생각할 수 있다. Collobert et al. (2011)은 넘쳐나는 NLP 문제를 해결하기 위해 그의 이전 업적을 확장해 일반적인 CNN 기반의 프레임워크를 제안했다. Colobert and Weston(2008)과 Collobert et al. (2011)은 NLP 연구자들 사이에 CNN이 큰 인기를 끌도록 촉발시켰다. CNN이 이미 컴퓨터 비전 태스크에서 괄목할 만한 성능을 보인 상황에서 사람들이 CNN의 성능을 믿는 것은 쉬웠다. CNN은 문장의 잠재적인 semantic represention을 만들어내기 위해 입력 문장으로부터 핵심적인 n-gram 피처를 추출하는 능력을 갖고 있다. 이 분야의 선구적인 업적은 Collobert et al. (2011), Kalchbrenner et al. (2014), Kim(2014)이다(본 블로그). 이들은 후속 연구에서 CNN 기반의 네트워크가 크게 확산되도록 했다.
APIs – Define Neural Networks
import requests import json, os nn_id = 'wcnntest97' ####(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": "purpose?", "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))
신경망을 정의하는 작업은 모든 종류의 알고리즘이 동일하게 사용한다.
APIs – Set Up Graph
# Work Flow 틀을 구성하도로고 지시한다. (정해진 틀을 강제로 생성) resp = requests.post('http://' + url + '/api/v1/type/wf/target/init/mode/simple/' + nn_id +'/wfver/1/', json={ "type": 'wcnn' }) data = json.loads(resp.json()) print("evaluation result : {0}".format(data))
Graph Flow 를 정의하는 작업을 수행한다. 여기서는 정해진 Simple Flow 를 생성한다
APIs – Data Upload
import os return_dict = {} return_dict['test'] = open('/hoya_model_root/aug/pattern.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_node/', files = return_dict) data = json.loads(resp.json()) print("evaluation result : {0}".format(data))
훈련하고자 하는 데이터를 업로드 합니다.
APIs – Data Configuration
# (1) Train Data Node 의 속성을 정의 # 어디서 Source 를 어떻게 가지고 올것인지 파라메터 정의 resp = requests.put('http://' + url + '/api/v1/type/wf/state/framedata/src/local/form/raw/prg/source/nnid/'+nn_id+'/ver/1/node/data_node/', json={ "type": "csv", "source_server": "local", "source_sql": "all", }) # 전처리는 어떤 것을 할지 정의 resp = requests.put('http://' + url + '/api/v1/type/wf/state/framedata/src/local/form/raw/prg/pre/nnid/'+nn_id+'/ver/1/node/data_node/', json={ "preprocess": "none", }) # 전처리가 완료된 데이터는 어디에 저장을 할지 resp = requests.put('http://' + url + '/api/v1/type/wf/state/framedata/src/local/form/raw/prg/store/nnid/'+nn_id+'/ver/1/node/data_node/',) data = json.loads(resp.json()) print("evaluation result : {0}".format(data))
데이터를 어디서 어떻게 가지고 올 것인지 정의합니다.
APIs – Data Feeder Configuration
# (2) Network 에 데이터를 Feed하는 Node 의 속성을 정의 resp = requests.post('http://' + url + '/api/v1/type/wf/state/pre/detail/feed/src/frame/net/wcnn/nnid/'+nn_id+'/ver/1/node/pre_feed_train/', json={ "encode_column" : "encode", "decode_column" : "decode", "channel" : 1, "encode_len" : 15, "preprocess": "none", "vocab_size" : 100, "char_encode" : False, "char_max_len" : 5, "lable_size" : 22, #총 label 수에서 3개 더해야함 "embed_type" : 'onehot' }) data = json.loads(resp.json()) print("evaluation result : {0}".format(data))
데이터를 어떤 형태로 이해하고 가공해서 신경망에 제공할 것인지를 정의합니다
APIs – Neural Network configuration
resp = requests.put('http://' + url + '/api/v1/type/wf/state/netconf/detail/wcnn/nnid/'+nn_id+'/ver/1/node/netconf_node/', json={ "param":{"epoch": 200 #Train Iteration ,"traincnt": 1 ,"batch_size":64 ,"predictcnt": 10 }, "config": {"num_classes":22, "learnrate": 0.001, "eval_type":"category", "optimizer":"AdamOptimizer" } ,"layers": {"active": "relu", "cnnfilter": [2, 3, 4, 2, 3], "droprate": "0.5", } ,"out": { "active": "softmax", "padding": "SAME" } ,"labels":[] }) data = json.loads(resp.json()) print("evaluation result : {0}".format(data))
신경망의 구조를 정의하고, 필요한 하이퍼 파라메터를 정의합니다.
APIs – Run Train
# Run All Workflow 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
expected_intent_no = "1" intent_array= [ "tagname 의 tagsuper" ] for intent in intent_array : resp = requests.post('http://' + url + '/api/v1/type/service/state/predict/type/wcnn/nnid/'+nn_id+'/ver/active/', json={"input_data" : intent }) data = json.loads(resp.json()) print( intent + "\t\t\t\t\t evaluation result("+ expected_intent_no + ") : {0}".format(data))
훈련이 끝나면 위와 같은 형태로 예측 서비스를 사용할 수 있습니다.