[목차]
(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. Supervissed Learning & Unsupervised Learning
앞에서 마치 Deep Learning 은 비지도 학습인 것처럼 이야기 하였는데, 조금 혼란스럽게도 Recursive autoencoders는 비지도 학습 알고리즘이라고 한다.
DL 의 정의는 다시 생각해 보고도록하고, 우선 비지도 학습이라함은 데이터 관점으로 정담을 사람이 가이드 해주지 않는 것을 말한다.
IRIS 데이터의 경우 1,2,3,4 Factor 와 5의 종류가 가이드 되어 있다. 요런 데이터를 분석하여 결로적으로 Output Layer 에 어떤 꽃이다~ 혹은 손글씨
인식이라고 하면 0~9 중에 하나다. 사람 고양이 인식이라고 하면 사람 혹은 고양이다. 이런식으로 답을 알려주고 Training 을 시키는 것을 지도 학습
답도 없이 그냥 마구 학습 시키는?? 것을 비지도 학습이라고 한다.
그래서 위의 그림을 보면 Input 과 Ouput 이 같음을 볼수 있다. 이게 바로 비지도 학습이기 때문에 나타나는 모양인데, 주어진 Input 예를 들면 78X78 이미지라고
하면 해당 이미지가 고양이인지, 사람인지 뭔가 학습시키고 싶은 내용이 없기 때문에 전반부에서는 Encoding 을 통해서 30 node 까지 압축을 시키고 후반부에서는
다시 원래 노드수 (78 X78) 로 Decoing 을 시킨다. 그리고 물론 Input 과 OutPut 이 얼마나 일치하는가가 Compressed Feature Vector 의 신뢰도를 나타낼 것이라고 생각된다.
[Encoding]
784 (input) —-> 1000 —-> 500 —-> 250 —-> 100 —–> 30
[Decoding]
784 (output) <—- 1000 <—- 500 <—- 250 <—- 30
785 는 78 X 78 이미지의 Pixel 수이고 1000으로 처음에 증가 시키는 것은 Overfitting 을 위함니다. 그럼 이런식의 비지도 학습 모델은 어디가가 써먹는가?
2. 활용
세 가지 정도 예가 있을 수 있는데,
하나는 이미지 서칭이다. 이미지들을 위와 같이 학습을 시켰다가 검색시에는 유사한 이미지들은 검색해서 보여주는 식으로 사용
두번째는 semantic Hashing 이라고 하는데 잘 이해는 못하겠으니.. 추가적으로 검색 해보시길..
세번째는 문서에서 주제 찾기라고 하는데 이해하기로는 문서를 Deep Autoencoder 를 사용해서 압축하고 압축된 Conpresse Feature Vector 에 가이드 테크글 달아서
데이터 셋을 다시 구성한 후에 해당 데이터를 다시 RBM 모델에 학습을 시킨다는 말 같다. 이렇게 되면 최종적인 RBM 모델에 글을 넣으면 주제는 XXX 입니다.
이런식으로 예측을 할 수 있을 것 같다.
3. Code Sample
코드를 많이 보다보니 딱보면 척 하고 느낌이 오는 것 같다. 아래의 코드는 위의 그림과 동일하게 이미지를 받아서 100부터 30가지 RBM 모델을 이용해서 Encoding 하고
다시 역으로 이미지 픽셀수 만큼의 아웃풋 노드를 Decoding 하는 신경망 설계이며 이미지 Iterator 는 MnistDataSetIterator 를 사용하는데 데이터 추출 부분에 대해선는
따로 정의하도록 하겠다. 이와 유사한 것으로 Denoising and Stacked Denoising autoencoders 라는 것이 있는데 이는 AutoEncoder 로 학습시 발행하는 쓰레기 값을 보정하는
Process 를 추가한 신경망이라고 보면 된다. (이 내용도 나중에 정리)
DataSetIterator iter = new MnistDataSetIterator(batchSize,numSamples,true); log.info("Build model...."); MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(seed) .iterations(iterations) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .list(10) .layer(0, new RBM.Builder().nIn(numRows * numColumns).nOut(1000).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(1, new RBM.Builder().nIn(1000).nOut(500).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(2, new RBM.Builder().nIn(500).nOut(250).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(3, new RBM.Builder().nIn(250).nOut(100).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(4, new RBM.Builder().nIn(100).nOut(30).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) //encoding stops .layer(5, new RBM.Builder().nIn(30).nOut(100).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) //decoding starts .layer(6, new RBM.Builder().nIn(100).nOut(250).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(7, new RBM.Builder().nIn(250).nOut(500).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(8, new RBM.Builder().nIn(500).nOut(1000).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(9, new OutputLayer.Builder(LossFunctions.LossFunction.RMSE_XENT).nIn(1000).nOut(numRows*numColumns).build()) .pretrain(true).backprop(true) .build(); MultiLayerNetwork model = new MultiLayerNetwork(conf); model.init(); model.setListeners(Arrays.asList((IterationListener) new ScoreIterationListener(listenerFreq))); log.info("Train model...."); while(iter.hasNext()) { DataSet next = iter.next(); model.fit(new DataSet(next.getFeatureMatrix(),next.getFeatureMatrix()));
Hello.This article was really motivating, especially because I was browsing for thoughts on this issue last Sunday.