Chapter3 – 1. 분석과제 정의

1. 분석 과제 정의

(1) 개요

가) 주요 분석 지연 요소 : 데이터 지연, 분석지연, 의사결정 지연

나) 도입 성공 요소 : Question First 방식 접근, 선택과 집중 (핵심분석 도출) , 자동화된 분석업무 프로세스 내재화 (하위 95%에 대한 5%와 같은 효율 부여)

(2) 분석 기회 발굴

가) 접근 방법 : Top-Down ,Bottom-Up, 경로접근(Path-Finding-Approach), 벤치마킹 접근 방식

나) Top-Down 접근 방식

– 비지니스 모델 이해

. 비지니스 컨택스트 파악 : 시장요인(마켓이슈, 마켓세그먼트, 니즈/수요, 전환비용, 기대수익) , 산업요인(기존 경쟁자, 신규진입자, 대체 상품, 가치사슬, 이해 당사자),

주요 트렌드(기술트렌드, 규제 트렌드, 사회/문화 트렌드, 경제 트렌드), 거시경제 요인(글로벌시장, 자본시장, 원자재, 경제 인프라)

. 고객 니즈 파악 : 기능적 가치, 재무적 가치, 무형의 가치, 감성 가치

. 미충족 니즈 파악 : 경쟁사 선점 영역, 공통 경쟁 영역, 자사 선점 영역, 미충족 고객 니즈

. 경쟁 요인 선택 및 제공 가치 수준 설정

– 비지니스 모델 상세화

. 전략 테마와 실행활동 간 관계 분석 : 활동 체계 지도(Activity Sysyem Map)을 통한 전략 테마 설정

. 비지니스 운영 시나리오 상세화 : 선택(정책, 자산, 거버넌스) , 결과(민감한 결과, 견고한 결과), 이론 (인과지도 [Casual Loop Diagram] , 선택과 결과 지도 )

– 분석 유즈 케이스 정의 단계

. 분석 유즈 케이스 발굴 (CLD 분석) : [업무] 재무 -> [분석 유즈 케이스] 자금시재 예측, 구매 최적화 -> [설명, 효과]

. 분석 유즈 케이스 정의 (이벤트 반응 분석) : 예) 보험금청구 -> 보험청구 심사 -> 수동 심사 -> 자동심사 요청

외부 이벤트 (동사_명사) , 시간 이벤트 (~시간) 으로 정의

. 분석 평가 : 정의된 USE CASE 들 중에 핵심 분석을 발견해야 함 , 평가 기준(중요도, 영향도, 난이도)

다) Bottom-Up 방식

– 프로세스 분류 : (가치사슬, 메가 프로세스, 메이저 프로세스, 프로세스 단계로 구분)

– 프로세스 흐름 분석 : 프로세스 맵을 통한 업무 흐름 표현

– 분석 요건 식별 : 각 프로세스 맵상의 주요 의사 결정 포인트를 식별

– 분석 요건 정의 : 각 의사결정 시점에 무엇을 알아야 의사결정을 할 수 있는지 정리

라) 분석 유즈 케이스 벤치마킹을 통한 발굴 :분야, 업무를 그룹핑하여 밴치 마킹 대상을 쉽게 찾을 수 있도록 함

(3) 분석 기회 구조화

가) 유저 스토리 정의

– 분석에서 발굴한 분석기회(무엇을 결정해야 하는지에 대한 정의) 를 유저 스토리를 통해 명확히 정의한다.

나) 목표 가치 구체화

– 목표 가치를 측정 가능한 지표 형태로 정의하여 관리하여야 한다.

다) 분석 질문 구체화

– 분석 질문 도출

. 연속질문 방식: 연속적인 질문을 통해 답을 도출

. 에이전트(버스 이용자/노선 설계자), 객체/장소(민원 채널/버스앱/지하철/배차특성), 이벤트 관점의 질문(환승)

– 분석 질문 정련 : 1차 도출한 질문 (서브 질문) 을 통해 핵심 질문(예:환승 시스템 개선 방안)에 영향을 주는가

(4) 분석 방안 구체화

가) 의사결정 요소 모형화

– 정의 : 분석 질문 정의 -> 분석 질문별 분석 컨텍스트와 분석 도출 ->[분석 컨택스트 간 상관관계 모형화]

– 표기방식 : 추구하는 가치 <- 의사결정활동 <- 분석 컨택스트

나) 분석 체계 도출

– 컨택스트 단위로 수행할 분석을 정리하여 의사결정을 위한 전체 분석 세트와의 관계 도출

– 예) 만족도 향상 <- 노선 개선 <- 승객 과대 노선 (버스별 시간대별 평균 승객수 분석)

다) 분석 필요 데이터 정의

– [분석대상]-[분석명]-[분석설명]-[필요데이터]-[데이터출처] 와 같은 필요 데이터 리스트 도출

라) 분석 ROI 평가

– 분석 소요 비용과(난이도) 효과에 대한 분석

(5) 분석 활용 시나리오 정의

가) 업무 프로세스의 AS-IS / TO-BE 를 정의 한다.

(6) 분석 정의서 작성

가) 분석 정의서 예시

– 분석명 , 분석정의, 소스데이터, 데이터 입수 난이도, 데이터 입수 사유, 분석 방법, 분석 적용 난이도, 분석 적용 난이 사유 , 분석 주기, 분석 결과 검증 Owner

(7) 전사관점 분석적용 시 고려요소

가) 분석 선순환 구조 맵

– 분석결과에 따른 의사결정이 각 조직별로 어떻게 상충되는지의 여부를 맵을 통해 연관성을 파악, 각 조직의 목적에 부합될 수 있도록 상충되는 부분을 조율

전사 관점에서 최적화 될 수 있도록 함

나) 분석 내재화 프로세스 정의

– 분석 결과가 업무 Process 에 녹아들어 내재화 될 수 있도록 내재화 프로세스를 정의하고 실행한다.

다) 분석 패턴 서비스 아키텍처 정의

– 중복/공통 부분을 전사 관점에서의 공통 서비스로 제공 할 수 있도록 패턴 아키텍처를 정의한다.

Chapter1 – 3. 가치 창조를 위한 데이터 사이언스와 전략 인사이트

3. 가치 창조를 위한 데이터 사이언스와 전략 인사이트

(1) 빅데이터 분석과 전략 인사이트

가) 열풍과 회의론

나) 분석 기반 경영이 도입되지 못하는 이유

– 기존 관행을 따를 뿐 중요한 시도를 하지 않음

– 분석에 따른 결정보다는 직관적인 결정을 더 중요한 재능으로 여긴다

– 분석적 실험에 대한 역량을 갖춘 사람이 없다

– 아이디어 자체 보다는 아이어를 낸 사람에 관심을 두는 경향

다) 빅데이터의 분석의 핵심

– 음성, 텍스트, 로그, 이미지 등 새로운 정보 원천이 주는 기회

– 비지니스 핵심에 대한 객관적이고 종합적인 통찰

– 분석적 방법과 성과에 대한 이해

라) 전략적 통찰이 없는 분석의 함정

– 전략적 통찰과 성과는 정관계가 있다

마) 전략 도출을 위한 가치 기반 분서

– 일차원 적인 분석이 아닌 전략적 Insight 를 가진 가치 분석 필요

(2) 전략 인사이트 도출을 위한 필요 역량

가) 데이터 사이언스

– 데이터로 부터 의미 있는 정보를 추출해 내는 학문

나) 데이터 사이언스 구성 요소

– 구성요소 : Analytics , IT (DB Management .. etc) , 비지니스 분석

– 데이터 사이언 티스트 필요 역량

.Hard Skill : 빅데이터에 대한 이론적 지식, 분석 기술에 대한 숙련

.Soft Skill : 통찰력 있는 분석 (창의적사고, 논리적 비판, 호기심), 설득력 있는 전달, 다분야간 협력(커뮤니케이션)

다) 데이터 사이언스

– 과학과 인문의 교차로 : 데이터 사이언티스트에 요구하는 사고방식과, 비지니스 이슈에 대한 감각, 고객들에 대한 공감 능력 등 인문학적 능력의 강조

라) 인문학적 사고의 특성과 역할

– 요체 : 왜 우리는 여태 이런 식으로 생각했나, 왜 우리는 세상이 그런줄만 알았나? 라는 질문을 던지는 것

– 분석으로 다룰 수 있는 핵심 문제

. 리포팅 : 무슨일이 일어 났는가 ?

. 경고 : 무슨일이 일어나고 있는가?

. 추출 : 무슨일이 일어날 것 인가??

. 모델링 : 어떻게, 왜 일어 났는가?

. 권고 : 차선 행동은 무엇인가 ?

. 예측, 최적화, 시뮬레이션 : 최악 또는 최선의 상황은 무엇인가?

마) 인문학적 통찰력 활용 사례

– 성향적 관점 , 행동적 관점, 상황적 관점

(3) 빅데이터 그리고 데이터 사이언스의 미래

가) 빅데이터의 시대 : 기업에 비용절감, 시간절약, 매출증대, 고객서비스 향상, 신규 비지니스 창출, 내부 의사결정 지원 등에 가치

나) 가치 패러다임의 변화

다) 데이터 사이언스의 한계와 인문학

Chapter1 – 2. 데이터의 가치와 미래

2. 데이터의 가치와 미래

(1) 빅데이터의 이해

가) 정의 : 규모, 형태, 속도

나) 출현 배경 : 데이터의 축적, 데이터 관련 기술 발전(저장, 클라우드, 모바일) , 데이터 활용 과학 확산

다) 빅데이터의 기능

– 철, 원유, 렌즈 (예:Ngram), 플랫폼(예 : FaceBook)

라) 빅데이터가 만드는 변화

– 사전처리 -> 사후처리

– 표본조사 -> 전수조사

– 질 -> 양

– 인과관계 -> 상관관계

(2) 빅데이터의 가치와 영향

가) 빅데이터의 가치

– 가치 산정이 어려운 이유 : 다목적 용도로 데이터가 개발되고 활용 됨 , 새로운 가치를 창출 (기존의 없던 분야) , 분석 기술 발전 (기존 분석 하지 못하던 형태의 데이터 분석 가능 ,텍스트 마이닝)

– 가치를 만들어 내는 방식

.투명성 제고로 연구개발 및 관리 효율성 제고

.시뮬레이션을 통한 수요 포착 및 주요 변수 탐색으로 경쟁력 강화

.고객 세분화 및 맞춤 서비스 제공

.알고리즘을 활용한 의사 결정 보고 혹은 대체

.비지니스 모델과 제품 서비스 혁신

(3) 비지니스 모델

가) 활용 사례

– 기업 : 구글 PageRank 검색 시스템, 월마트 상품진열

– 정부 : 실시간 교통정보, 기후, 지질활동, 소방, SNS, 통화 기록등 분석

– 개인 : 정치인, 가수의 Target 분석 활동 전략 수립

나) 활용 기본 테크닉

– 연관규칙 학습 : 예) 커피를 구매하는 사람이 탄산음료를 더 많이 사는가? (연관 분석)

– 유형분석 : 예) 온라인 수강생들의 특성에 따른 고객 분류 (Clustering 분석)

– 유전 알고리즘 : 예) 최적화, 응급실에서 어떻게 의사를 배치하는 것이 효율적인가? (Linear Prgorman 등 최적화)

– 기계학습 : 예) 기존의 시청기록을 바탕으로 시청자가 현재 보유 영화중 어떤 영화를 보고 싶어할지 예측 (Machine Learing)

– 회귀분석 : 예) 물건의 가격이 올라가면 판매량에 어떤 영향을 주는가? (선형회귀, 다중선형회귀, 다항선형회귀, 비선형회귀 분석 등)

– 감정분석 : 예) 새로운 환불 정책에 대한 고객의 평가는? (Text Mining 을 통한 긍정도 분석)

– 소셜 네트워크 분석 : 예) Influencer 는 누구인가?

(4) 위치 요인 및 통제 방안

가) 위기요인

– 사생활 침해, 책임원칙훼손, 데이터 오용

나) 통제방안

– 동의에서 책임으로, 결과 기반 책임 원칙 고수, 알고리즘 접근 허용

(5) 미래의 빅데이터

가) 데이터 : 모든 것의 데이터화

나) 기술 : 진화하는 알고리즘, 인공지능

다) 인력 : 데이터 사이언티스트

라) 데이터 사이언티스트 필요 역량

– SOFT SKILL : 통찰력 있는 분석 (창의적 사고, 호기심, 논리적 비판), 설득력 있는 전달, 다분야간 협력

– HARD SKILL : 빅데이터에 대한 이론적 지식, 빅데이터 분석 기술의 숙련

Chapter1 – 1. 데이터의 이해

1. 데이터의 이해

(1) 데이터와 정보

가) 데이터 유형 : 정성적 데이터 , 정량적 데이터

나) 암묵지와 형식지

– 암묵지 (공통화, 내면화) -> 형식지(표출화, 연결화)

다) DIKW 피라미드

– Data > Info > Knowledge > Wisdom

(2) 데이터 베이스

가) 정의 : 문자, 기호, 음성, 화상, 영상 등 관련된 다수의 코텐츠를 정보 처리 및 정보 통신 기기에 의하여 체계적으로 수집,축적하여 다양한 용도와

방법으로 이용할 수 있도록 정리한 정보의 집합체

나) 특징 : 통합된 데이터, 저장된 데이터, 공용 데이터, 변화하는 데이터

(3) 데이터베이스 활용

가) 관련 용어

– CRM : Cunsumer Relationship Management

– SCM : Syupply Chain Management

– ERP : Enterprise Resource Planning

– BI : Business Intelligence

나) 기업

– 제조부분 , 금융부문, 유통부문

다) 사회기반

– 물류(CVO, 화물운송정보, EDI, 항만운영정보, 철도운영정보, 항공정보.. 등) , 지리(NGIS 국가지리정보 체계) , 교통(ITS , 지능형교통시스템) , 의료 (의료 EDI) , 교육

[DL4J] Complex Network

[목차]

(0) 환경 설정 : DL4J 개발 환경 설정 및 예제 설명 (完)

(1) Data Iterator : 사용하고자 하는 데이터를 DL4J 에서 사용가능한 형태로 변환하는 작업 개발 필요

• Canova: The Rosetta Stone of Vectorization

• Spark

• Hadoop

• JDBC

Text ,CSV (完)

• Image (完)

• Sound

• Video

(2) Net : 사용할 신경망의 형태가 어떤 것이 있는지 이해하고 선택, 활용 할 수 있어야 함
• Restricted Boltzmann machines (完)
• Convolutional nets (完)
• Recursive autoencoders (完)
• Recurrent nets: Long Short-Term Memory (LSTM) (including bi-directional LSTMs)
• Deep-belief networks
• Denoising and Stacked Denoising autoencoders
• Deep autoencoders

(3) Activation : Weight + Bias 결과 다음 적용할 함수 결정 (예 : SigMoid : Chap1 에서 설명한 것)

• ReLU (完)
• Leaky ReLU
• Tanh
• Sigmoid
• Hard Tanh
• Softmax
• Identity
• ELU: Exponential Linear Units
• Softsign
• Softplus

(4) Loss&Objective Functions : 일부 데이터를 누락함으로써 더 Robust 한 모델을 만들 수 있다.
• Reconstruction entropy
• Squared loss
• Mean squared error
• Multi-class cross entropy for classification
• Negative log likelihood
• RMSE_XENT

(5) Hyperparameters : 모든 Layer 에 공통적으로 적용되는 파라메터로 숙지 필요

• Dropout (random ommission of feature detectors to prevent overfitting)
• Sparsity (force activations of sparse/rare inputs)
• Adagrad (feature-specific learning-rate optimization)
• L1 and L2 regularization (weight decay)
• Weight transforms (useful for deep autoencoders)
• Probability distribution manipulation for initial weight generation
• Gradient normalization and clipping

(6) Event Listener & Result Anal : 분석 중간 발생하는 이벤트를 받아서 처리 및 결과에 대한 검증 및 비지니스 연동 등

(7) 모델 저장 및 로딩

• 매번 모든 데이터를 로딩하여 학습 시키는 것이 아니라, 모델 자체를 저장하고, 새로 발생하는 데이터만 학습 시킴으로써,

모델의 즉각적인 학습효과와 대량 데이터 처리에 따른 Performacne 문제를 해결 할수 있을 것으로 보임

http://deeplearning4j.org/modelpersistence

(8) Grapth 의 종류

MultiLayerNetwork

ComputationGraph

1. DL4J 제공 Grapth 의 종류와 차이

(1) MultiLayerNetwork : 지금까지의 예제에서 일반적으로 사용했던 형태로 어느정도 정해진 틀을 손쉽게 사용할 수 있도록 제공하는 형태

(2) ComputationGraph : 더 자유롭게 변형이 가능한 형태로 저금 더 정의가 복잡하지만 (1) 에서 제공하는 기능 전체 수용가능하며, 추가적인 변형 가능

– Multiple network input arrays : 복수의 Input 을 받는 node 설계

– Multiple network outputs (including mixed classification/regression architectures) : Out put 값을 그 다음 Layer 의 복수의 Node 로 전송

– Layers connected to other layers using a directed acyclic graph connection structure (instead of just a stack of layers) : 별도의 직접 연결 경로 지정

※ 위 3가지 Case 를 구현하는 방법은 아래서 다루도록 함

2. ComputationGrapth 의 기본 구성

(1) LayerVertex

MultiLayerNetwork를 사용할때 layer(1, DenseLayer.Builder() …. 와 같이 정의했던 것과 같은 맥락으로 LayerVertex 에서는 아래와 같은 두 가지 방법으로 정의

.addLayer(레이어명,레이어 클래스,인풋값 Label)

.addLayer(레이어명,레이어 클래스,전처리 클래스, 인풋값 Label)

EX) .addLayer(“L1”, new GravesLSTM.Builder().nIn(5).nOut(5).build(), “input”)

※ 결국 MultiLayerNetwork 와 동일한 형태이지만, Layer 와 Layer 간의 관계를 좀더 자유롭게 정의할 수 있게 되겠다~

아래 예제는 .addLayer(“L2”,new RnnOutputLayer.Builder().nIn(5+5).nOut(5).build(), “input”, “L1”) 와 같이 정의하여

OUTPUT 을 두군데로 연결하도록 하는 것이다.

K-052

[예제]

ComputationGraphConfiguration conf = new NeuralNetConfiguration.Builder()
.learningRate(0.01)
.graphBuilder()
.addInputs("input") //can use any label for this
.addLayer("L1", new GravesLSTM.Builder().nIn(5).nOut(5).build(), "input")
.addLayer("L2",new RnnOutputLayer.Builder().nIn(5+5).nOut(5).build(), "input", "L1")
.setOutputs("L2")//We need to specify the network outputs and their order
.build();

ComputationGraph net = new ComputationGraph(conf);
net.init();

 

(2) InputVertex

MultiLayerNetwork에서는 INDArrays 에 정의된 형태 그대로 신경망의 데이터로 사용한다

반면에 ComputationGraph 에서는 원하는 데이터 항목명 및 순서를 정의할 수 있다

.addInputs(String…) 형태로 사용 INDArrays 에서 사용하는 Label 명을 넣으면 됨

(3) ElementWiseVertex

MultiLayerNetwork에서는 불가능 했던 행위들로 한개 이상의 Activation 을 받아서 누락시키거나, 더하거나 하는 행위를 하는 Vertex

인풋에 사용되는 Activation들의 사이즈는 모두 같아야 하며, 인풋과 아웃풋의 사이즈도 같아야 한다.

[예제]

 public void testBasicIrisWithElementWiseNode(){

ElementWiseVertex.Op[] ops = new ElementWiseVertex.Op[]{ElementWiseVertex.Op.Add, ElementWiseVertex.Op.Subtract};

for( ElementWiseVertex.Op op : ops ) {

Nd4j.getRandom().setSeed(12345);
ComputationGraphConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(12345)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.weightInit(WeightInit.DISTRIBUTION).dist(new NormalDistribution(0, 1))
.updater(Updater.NONE).learningRate(1.0)
.graphBuilder()
.addInputs("input")
.addLayer("l1", new DenseLayer.Builder().nIn(4).nOut(5).activation("tanh").build(), "input")
.addLayer("l2", new DenseLayer.Builder().nIn(4).nOut(5).activation("sigmoid").build(), "input")
.addVertex("elementwise", new ElementWiseVertex(op), "l1", "l2")
.addLayer("outputLayer", new OutputLayer.Builder().lossFunction(LossFunctions.LossFunction.MCXENT)
.activation("softmax").nIn(5).nOut(3).build(), "elementwise")
.setOutputs("outputLayer")
.pretrain(false).backprop(true)
.build();

ComputationGraph graph = new ComputationGraph(conf);
graph.init();

int numParams = (4 * 5 + 5) + (4 * 5 + 5) + (5 * 3 + 3);
assertEquals(numParams, graph.numParams());

Nd4j.getRandom().setSeed(12345);
int nParams = graph.numParams();
INDArray newParams = Nd4j.rand(1, nParams);
graph.setParams(newParams);

DataSet ds = new IrisDataSetIterator(150, 150).next();
INDArray min = ds.getFeatureMatrix().min(0);
INDArray max = ds.getFeatureMatrix().max(0);
ds.getFeatureMatrix().subiRowVector(min).diviRowVector(max.sub(min));
INDArray input = ds.getFeatureMatrix();
INDArray labels = ds.getLabels();

if (PRINT_RESULTS) {
System.out.println("testBasicIrisWithElementWiseVertex(op=" + op + ")");
for (int j = 0; j < graph.getNumLayers(); j++)
System.out.println("Layer " + j + " # params: " + graph.getLayer(j).numParams());
}

boolean gradOK = GradientCheckUtil.checkGradients(graph, DEFAULT_EPS, DEFAULT_MAX_REL_ERROR,
PRINT_RESULTS, RETURN_ON_FIRST_FAILURE, new INDArray[]{input}, new INDArray[]{labels});

String msg = "testBasicIrisWithElementWiseVertex(op=" + op + ")";
assertTrue(msg, gradOK);
}
}

 

(4) MergeVertex

MultiLayerNetwork에서는 불가능 했던 행위들로 복수개의 Activation 을 Merging 하는 행위를 수행한다.

예를 들어 두개의 Activation 이 각각 IN(3) , OUT(5) 라고 하면 MergeVertex 는 IN(10) , OUT(3) 이 된다.

K-051

[예제]

ComputationGraphConfiguration conf = new NeuralNetConfiguration.Builder()
.learningRate(0.01)
.graphBuilder()
.addInputs("input1", "input2")
.addLayer("L1", new DenseLayer.Builder().nIn(3).nOut(4).build(), "input1")
.addLayer("L2", new DenseLayer.Builder().nIn(3).nOut(4).build(), "input2")
.addVertex("merge", new MergeVertex(), "L1", "L2")
.addLayer("out", new OutputLayer.Builder().nIn(4+4).nOut(3).build(), "merge")
.setOutputs("out")
.build();

 

(5) SubsetVertex

MultiLayerNetwork에서는 불가능 했던 행위들로 다른 Layer 의 일부를 추출하여 별도의 Layer 로 만들 수 있다.

.addVertex("subset1", new SubsetVertex(0,4), "layer1")

 

(6) Multi-Task Learning

MultiLayerNetwork에서와 같이 최종적인 Output Layer 에서는 복수개의 결과를 갖을 수 있다. 그 예제는 아래와 같다.

K-053

[예제]

ComputationGraphConfiguration conf = new NeuralNetConfiguration.Builder()
.learningRate(0.01)
.graphBuilder()
.addInputs("input")
.addLayer("L1", new DenseLayer.Builder().nIn(3).nOut(4).build(), "input")
.addLayer("out1", new OutputLayer.Builder()
.lossFunction(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.nIn(4).nOut(3).build(), "L1")
.addLayer("out2", new OutputLayer.Builder()
.lossFunction(LossFunctions.LossFunction.MSE)
.nIn(4).nOut(2).build(), "L1")
.setOutputs("out1","out2")
.build();

 

(7) 데이터의 학습

학습용 데이터 구성시 하나의 Input 과 하나의 Output 값을 갖는 Activation 을 정의하는 것이라면 MultiLayerNetwork에서 사용한

데이터셋을 그대로 사용할 수 있다. 그러나, 복수의 인폿, 아웃풋을 갖는 Activation 을 설계하고자 한다면 별도의 과정이 필요하다.

int numLinesToSkip = 0;
String fileDelimiter = ",";
RecordReader rr = new CSVRecordReader(numLinesToSkip,fileDelimiter);
String csvPath = "/path/to/my/file.csv";
rr.initialize(new FileSplit(new File(csvPath)));

int batchSize = 4;
MultiDataSetIterator iterator = new RecordReaderMultiDataSetIterator.Builder(batchSize)
.addReader("myReader",rr)
.addInput("myReader",0,2) //Input: columns 0 to 2 inclusive
.addOutput("myReader",3,4) //Output: columns 3 to 4 inclusive
.build();

 

[DL4J] 실무적용 계획

1. Business Target

현재는 근무자가 유선상으로 수집한 정보와 감에 의존하여 수행하고 있는 제품 창고 만고 예측과 이에 대한 후속 조치로 이루어 지는

이송조치 업무를 시스템화 하는 것을 그 대상으로 선정하였다.

단, 과제 수행원의 운영, 프로젝트 및 복수 개선 과제 수행에 따른 업무 부하를 고려하여 , 현실적인 수준에서 만고 여부를 Neural Net 을

이용 학습 및 예측 현재 근무자가 만고 판단을 위해 사용하고 있는 단순 기준보다 높은 정합성을 확보하는 것까지를 목표로 설정하였다.

본 과제의 예상되는 효과는 아래와 같다.

– Neural Net 기법을 실무 환경에 적용하는 Know How 를 확보

. Architecture 적인 접목, 데이터 연동, 비지니스 활용 등

– Java 기반 Deep Learning Open Source 인 DL4J 에 대한 Know How 확보

– 제한된 범위의 Neural Net 적용을 통해 그 효용성(정확성)을 검증하여 향후 사업에 참고 자료로 사용

– JDK1.7 기반의 새로운 서비스 아이템으로서의 Neural Net 기법의 가능성 검토

2. Neural Net 구성 방안

현재 기준 Neural Net 을 업무에 적용하고자 하는 방안은 아래와 같이 현 적치상황, 입고 예측, 출고 예측 크게 3가지 Factor 를 Input 으로

사용자가 나름의 판단으로 이송지시를 내린 시점을 Output 으로 데이터를 구성하고 네트워크를 설계하고자 한다.

– 적치 상황 : 적치 상황을 Matrix 형태의 데이터르 변환하여 Input Layer 로 사용한다.

. 전체 야드를 대상으로 할 경우 배열의 크기가 너무 커져 Single Server 에서는 Memory 문제를 야기할 수 있어 특정 동하나만 대상으로 진행

– 입고 추이 : 입고 추이를 실제적으로 예측하기 위해서는 이전 프로세스의 정보들이 다수 필요한바, 본 과제에서는 시계열을 이용하여 대략적 정보 유추

– 출고 추이 : 출고 정보의 경우 선적계획 , 하역기 운영계획 및 선이송 예측 3가지 팩터가 고려 되어야 하며, 여기서는 마찬가지로 최소화 하여 진행

※ 더 자세한 내용은 별도의 문서로 작성 중

K-049 K-048

 

3. System 개발 대상

DL4J 및 Neural Network 에 대한 모든 지식을 습득한 후 개발에 착수하면 좋겠지만, 여건상 이론 학습과 개발을 병행하고자 함

아래는 개발하고자 하는 대상과 기능 Flow 로 크게 학습, 검증, 예측 3가지로 구분하였으며 현재 업무 체인의 자원과 머징하여

개발할 수 있도록 로컬 개발환경 및 빌드 환경을 구성하여 일부 대상 개발중에 있음

– 모델 학습을 위한 적치 정보 추출, 신경망 학습, 저장, 로드, 예측 화면 연결 View 까지 뼈대만 Test 수준으로 개발되어 있는 상황

K-050

(1) DL 학습 공통 Class

– 학습을 요청하는 클래스로 화면, CM 등 다양한 경로에서 요청시 복잡한 시스템 구조를 이해하지 않고도 실행 할 수 있는 Interface 제공

Case 별로 수집 데이터, 모델 구조 등 모든 것이 다른 관계로 여러가지 모델을 포괄적으로 수용할 수 있는 설계가 필요

(2) DL 예측 공통 Class

– 위와 동일한 의미의 Interface Classs 로 개발 예정이며, (1)과는 달리 학습이 아닌 예측을 위해 사용

(3) 입고/출고 예측

– 과제 수행 규모 조정을 위해 SQL 을 통해 CSV 파일 추출, CSV 으로 모델을 만들고 실행하는 Rjava 기반 Class를 간단하게 개발 예정

(4) 적치 현황 추출

– 동, 열, 스판, 순서로 구성되어 있는 데이터를 DB 에서 추출하고 이미지와 같이 Matrix 기반의 데이터로 변환하는 작업 수행

. 특정 동 기반으로 개발되어 있으나, 범용성있게 사용할 수 있도록 개선 필요

(5) 신경망 학습

– RBM 기반 3Level 신경망을 설계하였으며, 모델 학습 후 그 결과를 서버에 파일 형태로 저장하도록 개발됨

(6) 신경망 예측

– 파일로 저장된 학습된 결과 값으로 신경망으르 재 생성하여 입력되된 값으로 예측 실행하도록 개발됨

(7) 스케줄 가이던스

– HTML5 기반 Rich UI 로 학습, 예측 기동 및 그 결과를 화면에 출력하도록 개발 진행중

(8) 신경망 검증

– 현재 DB 구조로는 복수의 CASE 를 저장하고 관리 할 수 없음

입고, 출고, 적치 현황을 이벤트 시점별로 관리 할 수 있도록 개발 필요 (Hadoop 환경 제공 여부에 따라 진행 방향 변경)

※ 과제원 두분은 어떤 내용을 개발해야 할지 확인하시기를 바라며,추가적으로 관심있으시면 과제원 모집합니다.

감사합니다.

[DL4J] Image

[목차]

(0) 환경 설정 : DL4J 개발 환경 설정 및 예제 설명 (完)

(1) Data Iterator : 사용하고자 하는 데이터를 DL4J 에서 사용가능한 형태로 변환하는 작업 개발 필요

• Canova: The Rosetta Stone of Vectorization

• Spark

• Hadoop

• JDBC

Text ,CSV (完)

• Image

• Sound

• Video

(2) Net : 사용할 신경망의 형태가 어떤 것이 있는지 이해하고 선택, 활용 할 수 있어야 함
• Restricted Boltzmann machines (完)
• Convolutional nets (完)
• Recursive autoencoders (完)
• Recurrent nets: Long Short-Term Memory (LSTM) (including bi-directional LSTMs)
• Deep-belief networks
• Denoising and Stacked Denoising autoencoders
• Deep autoencoders

(3) Activation : Weight + Bias 결과 다음 적용할 함수 결정 (예 : SigMoid : Chap1 에서 설명한 것)

• ReLU (完)
• Leaky ReLU
• Tanh
• Sigmoid
• Hard Tanh
• Softmax
• Identity
• ELU: Exponential Linear Units
• Softsign
• Softplus

(4) Loss&Objective Functions : 일부 데이터를 누락함으로써 더 Robust 한 모델을 만들 수 있다.
• Reconstruction entropy
• Squared loss
• Mean squared error
• Multi-class cross entropy for classification
• Negative log likelihood
• RMSE_XENT

(5) Hyperparameters : 모든 Layer 에 공통적으로 적용되는 파라메터로 숙지 필요

• Dropout (random ommission of feature detectors to prevent overfitting)
• Sparsity (force activations of sparse/rare inputs)
• Adagrad (feature-specific learning-rate optimization)
• L1 and L2 regularization (weight decay)
• Weight transforms (useful for deep autoencoders)
• Probability distribution manipulation for initial weight generation
• Gradient normalization and clipping

(6) Event Listener & Result Anal : 분석 중간 발생하는 이벤트를 받아서 처리 및 결과에 대한 검증 및 비지니스 연동 등

(7) 모델 저장 및 로딩

• 매번 모든 데이터를 로딩하여 학습 시키는 것이 아니라, 모델 자체를 저장하고, 새로 발생하는 데이터만 학습 시킴으로써,

모델의 즉각적인 학습효과와 대량 데이터 처리에 따른 Performacne 문제를 해결 할수 있을 것으로 보임

http://deeplearning4j.org/modelpersistence

0.개요

Canova Lib 는 다양한 입출력 데이터를 지원한다. DL4J 사이트에서 정리된 자료를 찾고자 하였으나 찾지 못하여,

ND4J 사이트에서 Canova 관련 카테고리에서 유사한 내용을 찾아 정리하고자 한다.

(ND4J 는다양한 수학함수를 제공하는 라이브러리로 Nuppy 보다 4배정도 빠른 연산속도를 보여준다고 함)

http://nd4j.org/get-data-into-canova

○ FileRecordReader (Raw Text as Input)

– Input Format : org.canova.cli.formats.input.TextInputFormat

. FileRecordReader 를 상속받음 한나의 라인을 하나의 Record 로 생각함

– output Format : { csvLineString, dirLabelString }

. 폴더 이름이나, 고유한 ID 로 Label 를 자동으로 생성함

CSVRecordReader (CSV Records as Input)

– Input Format : org.canova.api.formats.input.impl.LineInputFormat

. CSV 는 이미 정형화된 구조임으로 nomalize, binarize, skip, label 만 정의하면 됨

– output Format : { string }

. 라벨 값은 CSV 데이터 안에 포함되어 있음

ImageRecordReader (Image Data as Input)

– Input Format : org.canova.api.formats.input.impl.ImageInputFormat

– output Format : { [array of doubles], directoryLabelID }

. 이미지 데이터와 라벨 값

MNISTRecordReader (Custom Binary Format Data)

– Input Format : org.canova.image.format.MNISTInputFormat

– output Format : { [array of doubles], classIndexID}

1. ImageRecordReader

(1) Loading Labels

이미지에 라벨을 붙이는 과정 , 서브 폴더명을 라벨로 사용하는 예

※ 아래와 같은 과정이라면 폴더명이 아닌 다른 기준으로 라벨링 가능하다고 보여짐

// Set path to the labeled images
String labeledPath = System.getProperty("user.home")+"/lfw";

//create array of strings called labels
List<String> labels = new ArrayList<>();

//traverse dataset to get each label
for(File f : new File(labeledPath).list Files()) {
labels.add(f.getName());
}

 

(2) Reading Records, Iterating Over Data

28 X 28 사이즈로 이미지를 Input Data 로 변환함 이 사이즈는 변경 가능함

true 파라메터는 라벨 값을 append 하는 것에 대한 허용

// Instantiating RecordReader. Specify height and width of images.
RecordReader recordReader = new ImageRecordReader(28, 28, true, labels);

// Point to data path.
recordReader.initialize(new FileSplit(new File(labeledPath)));

 

(3) Canova to DL4J

Canova 데이터 형을 최종적으로DL4J 데이터 형으로 변환한다.

DataSetIterator iter = new RecordReaderDataSetIterator(recordReader, 784, labels.size());

 

※ 위와 같이 실제 이미지에 라벨을 붙이고 DL4J 분석을 위한 Iterator 로 변환하는 과정을 거친다고 하면,

Location 2 Image 형태의 분석 아이디어를 서버에 구축하기 위한 아키택쳐를 어떻게 구성해야 할지 고민이 된다.

DB -> Image 생성 -> Canova -> DL4J 라고 하면 전처리 과정이 너무 많아 지는 것이 아닌지 고민됨

직접 DB 에서 DL4J 로 학습시키는 것과 차이가 있는지 고민 필요

[DL4J] Save&Load

[목차]

(0) 환경 설정 : DL4J 개발 환경 설정 및 예제 설명 (完)

(1) Data Iterator : 사용하고자 하는 데이터를 DL4J 에서 사용가능한 형태로 변환하는 작업 개발 필요

• Canova: The Rosetta Stone of Vectorization

• Spark

• Hadoop

• JDBC

Text ,CSV (完)

• Image

• Sound

• Video

(2) Net : 사용할 신경망의 형태가 어떤 것이 있는지 이해하고 선택, 활용 할 수 있어야 함
• Restricted Boltzmann machines (完)
• Convolutional nets (完)
• Recursive autoencoders (完)
• Recurrent nets: Long Short-Term Memory (LSTM) (including bi-directional LSTMs)
• Deep-belief networks
• Denoising and Stacked Denoising autoencoders
• Deep autoencoders

(3) Activation : Weight + Bias 결과 다음 적용할 함수 결정 (예 : SigMoid : Chap1 에서 설명한 것)

• ReLU (完)
• Leaky ReLU
• Tanh
• Sigmoid
• Hard Tanh
• Softmax
• Identity
• ELU: Exponential Linear Units
• Softsign
• Softplus

(4) Loss&Objective Functions : 일부 데이터를 누락함으로써 더 Robust 한 모델을 만들 수 있다.
• Reconstruction entropy
• Squared loss
• Mean squared error
• Multi-class cross entropy for classification
• Negative log likelihood
• RMSE_XENT

(5) Hyperparameters : 모든 Layer 에 공통적으로 적용되는 파라메터로 숙지 필요

• Dropout (random ommission of feature detectors to prevent overfitting)
• Sparsity (force activations of sparse/rare inputs)
• Adagrad (feature-specific learning-rate optimization)
• L1 and L2 regularization (weight decay)
• Weight transforms (useful for deep autoencoders)
• Probability distribution manipulation for initial weight generation
• Gradient normalization and clipping

(6) Event Listener & Result Anal : 분석 중간 발생하는 이벤트를 받아서 처리 및 결과에 대한 검증 및 비지니스 연동 등

(7) 모델 저장 및 로딩

• 매번 모든 데이터를 로딩하여 학습 시키는 것이 아니라, 모델 자체를 저장하고, 새로 발생하는 데이터만 학습 시킴으로써,

모델의 즉각적인 학습효과와 대량 데이터 처리에 따른 Performacne 문제를 해결 할수 있을 것으로 보임

http://deeplearning4j.org/modelpersistence

1. Save an Interoperable Vector of All Weights

– Neural Network 의 Cofiguration 값을 JSON 형태로 저장

– Neuron 의 모든 Weight 값과 Bias 값 등을 Binary 형태로 저장

– 아래는 모델을 저장하고 로딩하는 Sample 코드 이다, Code 상에는 File 로 되어 있지만,

Binary 형태로 변환하여 DB 에 Save & Load 를 하는 것도 가능할 것으로 보인다.

[Sample Code]

// 네트워크 파라메터 저장

try(DataOutputStream dos = new DataOutputStream(Files.newOutputStream(Paths.get("coefficients.bin")))){
Nd4j.write(net.params(),dos);
}

//네트워크 Configuration 저장
FileUtils.write(new File("conf.json"), net.getLayerWiseConfigurations().toJson());

//네트워크 Configuration 로딩
MultiLayerConfiguration confFromJson = MultiLayerConfiguration.fromJson(FileUtils.readFileToString(new File("conf.json")));

//네트워크 파라메터 로딩
INDArray newParams;
try(DataInputStream dis = new DataInputStream(new FileInputStream("coefficients.bin"))){
newParams = Nd4j.read(dis);
}

//저장된 정보로 네트워크 생성
MultiLayerNetwork savedNetwork = new MultiLayerNetwork(confFromJson);
savedNetwork.init();
savedNetwork.setParameters(newParams);

 

2. A Note on Updaters

데이터를 로딩한 후에 계속해서 Training 을 진행하고 싶다면, 네트워크의 부분만 저장하는 방법을 사용한다.

더 이상 Training 이 필요 없는 경우 더 이상 Save & Load 를 할 필요가 없다.

데이터 트레이닝에 momentum, AdaGrad and RMSProp와 같은 기법을 사용하는데, 이러한 기법들은

Trainging 의 이력을 남긴다. 이러한 이력 값 없이 그냥 파라메터를 저장하고 로딩할 경우 이후에 발생하는

Training 에서 데이터가 외곡될 가능성이 크다. 이러한 것을 방지하기 위해서 Update 를 저장하는 방법은

아래와 같다.

[Code Sample]

// Update 를 저장

try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("updater.bin"))){
oos.writeObject(model.getUpdater());
}

//Update 를 로드
org.deeplearning4j.nn.api.Updater updater;
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("updater.bin"))){
updater = (org.deeplearning4j.nn.api.Updater) ois.readObject();
}

//Update 값을 모델에 사용
model.setUpdater(updater);

 

3. Model Utils

– Model Util을 사용해서 모델을 업데이트하고 로드하는 예제

– 모델의 Save & Load 를 사용하여 한번에 대량의 데이터를 로딩하지 않음으로써,

서버의 부하를 줄이고, 지속적으로 발생하는 데이터를 학습시켜 모델의 정합성을

올리는 방식으로 사용할 수 있지 않을까 기대 함

/**
* Project utility class to save and load models and parameters.
*/
@Deprecated
public class ModelUtils {

private static final Logger log = LoggerFactory.getLogger(ModelUtils.class);

private ModelUtils(){}

public static void saveModelAndParameters(MultiLayerNetwork net, String basePath) {
String confPath = FilenameUtils.concat(basePath, net.toString()+"-conf.json");
String paramPath = FilenameUtils.concat(basePath, net.toString() + ".bin");
log.info("Saving model and parameters to {} and {} ...", confPath, paramPath);

// save parameters
try {
DataOutputStream dos = new DataOutputStream(new FileOutputStream(paramPath));
Nd4j.write(net.params(), dos);
dos.flush();
dos.close();

// save model configuration
FileUtils.write(new File(confPath), net.conf().toJson());
} catch (IOException e) {
e.printStackTrace();
}
}

public static MultiLayerNetwork loadModelAndParameters(File confPath, String paramPath) {
log.info("Loading saved model and parameters...");
MultiLayerNetwork savedNetwork = null;
// load parameters
try {
MultiLayerConfiguration confFromJson = MultiLayerConfiguration.fromJson(FileUtils.readFileToString(confPath));
DataInputStream dis = new DataInputStream(new FileInputStream(paramPath));
INDArray newParams = Nd4j.read(dis);
dis.close();

// load model configuration
savedNetwork = new MultiLayerNetwork(confFromJson);
savedNetwork.init();
savedNetwork.setParams(newParams);
} catch (IOException e) {
e.printStackTrace();
}
return savedNetwork;
}

public static void saveLayerParameters(INDArray param, String paramPath) {
// save parameters for each layer
log.info("Saving parameters to {} ...", paramPath);

try {
DataOutputStream dos = new DataOutputStream(new FileOutputStream(paramPath));
Nd4j.write(param, dos);
dos.flush();
dos.close();
} catch(IOException e) {
e.printStackTrace();
}
}

public static Layer loadLayerParameters(Layer layer, String paramPath) {
// load parameters for each layer
String name = layer.conf().getLayer().getLayerName();
log.info("Loading saved parameters for layer {} ...", name);

try{
DataInputStream dis = new DataInputStream(new FileInputStream(paramPath));
INDArray param = Nd4j.read(dis);
dis.close();
layer.setParams(param);
} catch(IOException e) {
e.printStackTrace();
}

return layer;
}

public static void saveParameters(MultiLayerNetwork model, int[] layerIds, Map<Integer, String> paramPaths) {
Layer layer;
for(int layerId: layerIds) {
layer = model.getLayer(layerId);
if (!layer.paramTable().isEmpty()) {
ModelUtils.saveLayerParameters(layer.params(), paramPaths.get(layerId));
}
}
}

public static void saveParameters(MultiLayerNetwork model, String[] layerIds, Map<String, String> paramPaths) {
Layer layer;
for(String layerId: layerIds) {
layer = model.getLayer(layerId);
if (!layer.paramTable().isEmpty()) {
ModelUtils.saveLayerParameters(layer.params(), paramPaths.get(layerId));
}
}
}
public static MultiLayerNetwork loadParameters(MultiLayerNetwork model, int[] layerIds, Map<Integer, String> paramPaths) {
Layer layer;
for(int layerId: layerIds) {
layer = model.getLayer(layerId);
loadLayerParameters(layer, paramPaths.get(layerId));
}
return model;
}

public static MultiLayerNetwork loadParameters(MultiLayerNetwork model, String[] layerIds, Map<String, String> paramPaths) {
Layer layer;
for(String layerId: layerIds) {
layer = model.getLayer(layerId);
loadLayerParameters(layer, paramPaths.get(layerId));
}
return model;
}

public static Map<Integer, String> getIdParamPaths(MultiLayerNetwork model, String basePath, int[] layerIds){
Map<Integer, String> paramPaths = new HashMap<>();
for (int id : layerIds) {
paramPaths.put(id, FilenameUtils.concat(basePath, id + ".bin"));
}

return paramPaths;
}

public static Map<String, String> getStringParamPaths(MultiLayerNetwork model, String basePath, String[] layerIds){
Map<String, String> paramPaths = new HashMap<>();

for (String name : layerIds) {
paramPaths.put(name, FilenameUtils.concat(basePath, name + ".bin"));
}

return paramPaths;
}

public static String defineOutputDir(String modelType){
String tmpDir = System.getProperty("java.io.tmpdir");
String outputPath = File.separator + modelType + File.separator + "output";
File dataDir = new File(tmpDir,outputPath);
if (!dataDir.getParentFile().exists())
dataDir.mkdirs();
return dataDir.toString();

}

}

 

[DL4J] CSV

[목차]

(0) 환경 설정 : DL4J 개발 환경 설정 및 예제 설명 (完)

(1) Data Iterator : 사용하고자 하는 데이터를 DL4J 에서 사용가능한 형태로 변환하는 작업 개발 필요

• Canova: The Rosetta Stone of Vectorization

• Spark

• Hadoop

• JDBC

Text ,CSV

• Image

• Sound

• Video

(2) Net : 사용할 신경망의 형태가 어떤 것이 있는지 이해하고 선택, 활용 할 수 있어야 함
• Restricted Boltzmann machines (完)
• Convolutional nets (完)
• Recursive autoencoders (完)
• Recurrent nets: Long Short-Term Memory (LSTM) (including bi-directional LSTMs)
• Deep-belief networks
• Denoising and Stacked Denoising autoencoders
• Deep autoencoders

(3) Activation : Weight + Bias 결과 다음 적용할 함수 결정 (예 : SigMoid : Chap1 에서 설명한 것)

• ReLU (完)
• Leaky ReLU
• Tanh
• Sigmoid
• Hard Tanh
• Softmax
• Identity
• ELU: Exponential Linear Units
• Softsign
• Softplus

(4) Loss&Objective Functions : 일부 데이터를 누락함으로써 더 Robust 한 모델을 만들 수 있다.
• Reconstruction entropy
• Squared loss
• Mean squared error
• Multi-class cross entropy for classification
• Negative log likelihood
• RMSE_XENT

(5) Hyperparameters : 모든 Layer 에 공통적으로 적용되는 파라메터로 숙지 필요

• Dropout (random ommission of feature detectors to prevent overfitting)
• Sparsity (force activations of sparse/rare inputs)
• Adagrad (feature-specific learning-rate optimization)
• L1 and L2 regularization (weight decay)
• Weight transforms (useful for deep autoencoders)
• Probability distribution manipulation for initial weight generation
• Gradient normalization and clipping

(6) Event Listener & Result Anal : 분석 중간 발생하는 이벤트를 받아서 처리 및 결과에 대한 검증 및 비지니스 연동 등

(7) 모델 저장 및 로딩

• 매번 모든 데이터를 로딩하여 학습 시키는 것이 아니라, 모델 자체를 저장하고, 새로 발생하는 데이터만 학습 시킴으로써,

모델의 즉각적인 학습효과와 대량 데이터 처리에 따른 Performacne 문제를 해결 할수 있을 것으로 보임

http://deeplearning4j.org/modelpersistence

1. 참고 사이트

Data Load 관련하여서는 종합적으로 잘 정리된 사이트가 없어 이런저런 사이트나 소스코드를 참조

http://deeplearning4j.org/canova

http://deeplearning4j.org/image-data-pipeline.html

https://github.com/deeplearning4j/dl4j-0.4-examples/blob/master/src/main/java/org/deeplearning4j/examples/misc/csv/CSVExample.java

https://github.com/deeplearning4j/Canova/blob/master/canova-api/src/main/java/org/canova/api/records/reader/impl/CSVRecordReader.java

https://github.com/deeplearning4j/deeplearning4j/blob/3e5c6a942864ced574c7715ae548d5e3cb22982c/deeplearning4j-core/src/main/java/org/deeplearning4j/datasets/canova/RecordReaderDataSetIterator.java

https://github.com/deeplearning4j/Canova/tree/master/canova-api/src/main/java/org/canova/api/records/reader/impl

https://github.com/deeplearning4j/Canova/blob/master/canova-nd4j/canova-nd4j-image/src/main/java/org/canova/image/recordreader/ImageRecordReader.java

http://javadox.com/org.nd4j/canova-api/0.0.0.12/org/canova/api/records/reader/class-use/RecordReader.html

https://github.com/deeplearning4j/Canova

http://idosi.com/javadoc/DL4J/index.html?org/nd4j/jdbc/mysql/class-use/MysqlLoaderTest.html

2. Canova 개요

Canova 는 아래와 같은 특징을 갖는다.

– text, CSV, Image, Video, Sound 등을 DL4J 에서 사용하는 데이터 포맷 타입으로 변환하는 기능을 수행한다.

– 신경망 분석에 적합한 ARFF, SVMLight 등 포맷으로 변경한다

– Command Line으로도 실행할 수 있다.

– 특이한 데이터를 위하여 Custom 으로 Input Format 을 만들 수 있다.

Spark ,Hadoop, JDBC 연동 및 text, CSV, Image, Video, Sound 데이터 로딩 등 다양한 데이터 연동 방법이 있는데

각각의 케이스가 사용법이 달라서 따로 정리가 필요하다고 보여진다.

3. CSV Example

csv 파일을 신경망 분석에 적합한 포맷으로 변경하는 부분 예제

public class CSVExample {

private static Logger log = LoggerFactory.getLogger(CSVExample.class);

public static void main(String[] args) throws Exception {

//First: get the dataset using the record reader. CSVRecordReader handles loading/parsing
int numLinesToSkip = 0;
String delimiter = “,”;

/* 1. 데이터 Reader 정의

numLinesToSkip : 0으로 지정 보통 CSV 파일의 첫라인은 해더 명 등이 들어 있어서 SKIP

delimiter : 구분자 지정 여기서는 “,” */
RecordReader recordReader = new CSVRecordReader(numLinesToSkip,delimiter);
recordReader.initialize(new FileSplit(new ClassPathResource(“iris.txt”).getFile()));

//Second: the RecordReaderDataSetIterator handles conversion to DataSet objects, ready for use in neural network

/* 2. Data Set 변환

CSV 파일이라면, CSVRecordReader 와 RecordReaderDataSetIterator 별도의 개발 없이 두개 클레스를 활용하여

뉴런에 적합한 형태의 데이터로 충분히 변환 가능하다.

labelIndex : 몇개의 컬럼 데이터로 이루어져 있는지

numClasses : 가이드하고자 하는 구분자가 몇가지 종류인지

BatchSize : 몇개의 데이터를 로딩할 것인지 (Row 수)

*/

int labelIndex = 4; //5 values in each row of the iris.txt CSV: 4 input features followed by an integer label (class) index. Labels are the 5th value (index 4) in each row
int numClasses = 3; //3 classes (types of iris flowers) in the iris data set. Classes have integer values 0, 1 or 2
int batchSize = 150; //Iris data set: 150 examples total. We are loading all of them into one DataSet (not recommended for large data sets)
DataSetIterator iterator = new RecordReaderDataSetIterator(recordReader,batchSize,labelIndex,numClasses);

DataSet next = iterator.next();

final int numInputs = 4;
int outputNum = 3;
int iterations = 1000;
long seed = 6;

log.info("Build model....");
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed)
.iterations(iterations)
.learningRate(0.1)
.regularization(true).l2(1e-4)
.list(3)
.layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(3)
.activation("tanh")
.weightInit(WeightInit.XAVIER)
.build())
.layer(1, new DenseLayer.Builder().nIn(3).nOut(3)
.activation("tanh")
.weightInit(WeightInit.XAVIER)
.build())
.layer(2, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.weightInit(WeightInit.XAVIER)
.activation("softmax")
.nIn(3).nOut(outputNum).build())
.backprop(true).pretrain(false)
.build();

//run the model
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(new ScoreIterationListener(100));

 

/* 3. Data 훈련

DataSet 은 정규화, Shuffle 및 훈련용 데이터와 검증용 데이터를 분리하는 등 Util 성 기능도 제공하며

위에서 정의한 뉴런에 model.fit (Data) 와 같은 형태로 사용하여 모델을 훈련 시킬 수 있다.

*/

next.normalizeZeroMeanZeroUnitVariance();
next.shuffle();
split test and train
SplitTestAndTrain testAndTrain = next.splitTestAndTrain(0.65); //Use 65% of data for training

DataSet trainingData = testAndTrain.getTrain();
model.fit(trainingData);

 

/* 4. 모델 평가

테스트 데이터 Set 으로 모델 예측 결과와 원래 알고 있는 결과를 비교하여 모델의 정확도를 평가한다.

*/

//evaluate the model on the test set
Evaluation eval = new Evaluation(3);
DataSet test = testAndTrain.getTest();
INDArray output = model.output(test.getFeatureMatrix());
eval.eval(test.getLabels(), output);
log.info(eval.stats());
}

}

 

[DL4J] ReLu

[목차]

(0) 환경 설정 : DL4J 개발 환경 설정 및 예제 설명 (完)

(1) Data Iterator : 사용하고자 하는 데이터를 DL4J 에서 사용가능한 형태로 변환하는 작업 개발 필요

• Canova: The Rosetta Stone of Vectorization

(2) Net : 사용할 신경망의 형태가 어떤 것이 있는지 이해하고 선택, 활용 할 수 있어야 함
• Restricted Boltzmann machines (完)
• Convolutional nets (完)
• Recursive autoencoders (完)
• Recurrent nets: Long Short-Term Memory (LSTM) (including bi-directional LSTMs)
• Deep-belief networks
• Denoising and Stacked Denoising autoencoders
• Deep autoencoders

(3) Activation : Weight + Bias 결과 다음 적용할 함수 결정 (예 : SigMoid : Chap1 에서 설명한 것)

• ReLU <—
• Leaky ReLU
• Tanh
• Sigmoid
• Hard Tanh
• Softmax
• Identity
• ELU: Exponential Linear Units
• Softsign
• Softplus

(4) Loss&Objective Functions : 일부 데이터를 누락함으로써 더 Robust 한 모델을 만들 수 있다.
• Reconstruction entropy
• Squared loss
• Mean squared error
• Multi-class cross entropy for classification
• Negative log likelihood
• RMSE_XENT

(5) Hyperparameters : 모든 Layer 에 공통적으로 적용되는 파라메터로 숙지 필요

• Dropout (random ommission of feature detectors to prevent overfitting)
• Sparsity (force activations of sparse/rare inputs)
• Adagrad (feature-specific learning-rate optimization)
• L1 and L2 regularization (weight decay)
• Weight transforms (useful for deep autoencoders)
• Probability distribution manipulation for initial weight generation
• Gradient normalization and clipping

(6) Event Listener & Result Anal : 분석 중간 발생하는 이벤트를 받아서 처리 및 결과에 대한 검증 및 비지니스 연동 등

1. ReLu (Rectifier Linear Unit)

– 다른 Activator 인 Sigmoid 에 대해서 설명한 것 처럼 ReLu 는 Weight, Bias, Input 으로 이루어진 결과를 보정하는 역할을 하는

또 다른 종류의 알고리즘이다. 아래의 그래프에서 파란선은 원래 값, 빨간선은 ReLu 로 보정한 결과 값이다.

K-043 K-044

 

– ReLu를 어떤 경우에 사용할지 판단하려면 ReLu 의 특성을 알아야 한다. 그럼 ReLu 과 Sigmoid 등과 어떤 차이와 장단점이 있는가.

결국 확률로 표시하고자 할 경우는 Sigmoid 가 유용할 듯하고 다음 Hidden Layer 에 Real Number 를 넘겨야 하는 경우에는 ReLu 가

더 효과적인 그런 것인듯 하다..

(1) 차이점

– Sigmoid 는 0 ~ 1 사이의 값을 갖는 반면 ReLu는 0 ~ Infinite 의 값을 갖는다. 그 말인 즉슨 Sigmoid 는 확률적인 표현만 가능한 반면

ReLu는 다음 Hidden Layer에 실제 값에 가까운 값을 전달할 수 있다는 것이다. (굉장히 큰 차이군..)

– Sigmoid 등은 탐색 과정에서 사라지는 경우가 있는데 ReLu는 그렇지 않다 (??)

(2) 장점

– Hidden Layer 의 Sparsity 를 증가 시킨다.. 결국 Density 가 출어서 Perfomance 가 올라간다는 말 같은데 어떻게 인지 모르겠음..

– 위에 말한 것처럼 Sigmoid 나 tanh 처럼 탐색중 사라지는 문제가 없다.

– 사전 트레이닝 과정 없이도 효과적으로 Net 에 트레이닝이 된다

– RBM 에 실제 데이터를 적용할 수 있다.. (위에 말한거다..)

[참조]

DL4J 공식 문서에서도 아래와 같은 예를 들어 설명하고 있는데, 결국 위에 설명된 내용중 실수 값을 전달할 수 있다가 핵심이다.

아래 그림을 그리면서 설명한 예제는 집값에 영향을 주는 요소를 Input , 예상 집값을 Ouput 으로 NN 은 설계한 예를 들은 것

결국 Hidden Layer 에서 Activator 로 Sigmoid 를 사용했다면 예상 집값은 0 ~ 1 값의 SUM 이 되어 얼토 당토 않은 결과가 나왔겠지만

하지만 ReLu 를 써서 실수 값을 예상할 수 있다. 뭐 이런 내용이다.

K-045