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
resp = requests.post('http://' + url + '/api/v1/type/common/target/nninfo/nnid/' + nn_id + '/',
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))
resp = requests.post('http://' + url + '/api/v1/type/common/target/nninfo/nnid/' + nn_id + '/version/',
"nn_def_list_info_nn_id": "",
"nn_wf_ver_info": "test version info",
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))
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))
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/',
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))
# 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))
# 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
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/',
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))
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))
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/',
"source_server": "local",
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/',
# 전처리가 완료된 데이터는 어디에 저장을 할지
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))
# (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))
# (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/',
"encode_column" : "encode",
"decode_column" : "decode",
"lable_size" : 22, #총 label 수에서 3개 더해야함
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))
# (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))
# (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/',
"param":{"epoch": 200 #Train Iteration
"config": {"num_classes":22,
"optimizer":"AdamOptimizer"
"cnnfilter": [2, 3, 4, 2, 3],
data = json.loads(resp.json())
print("evaluation result : {0}".format(data))
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))
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
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))
# 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))
# 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
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))
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))
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))
훈련이 끝나면 위와 같은 형태로 예측 서비스를 사용할 수 있습니다.