RSNNS - 6.Examples

Neural Networks in R Using the Stuttgart Neural Network Simulator: RSNNS



6. Examples

이 절에서 우리는 회귀, 분류, 그리고 군집의 예로써 패키지 사용을 설명한다. 게다가, 우리는 약간의 다른 유용한 기능 그리고 RSNNS 와 원본 SNNS 소프트웨어의 분리된 설치 둘 모두에서 사용 이점에 대해 언급한다. 모든 예를 여기에서 보여주고 그리고 고수준의 사용과 저수준 인터페이스를 설명하는 다양한 다른 하나는 데모로 패키지에 포함되었다. R에서 명령어 demo()는 사용가능한 데모 목록을 준다, e.g., 데모 "laser"는 demo("laser")로 시작할 수 있다. 예제는 또한 위에 언급된 패키지 웹 페이지에서 찾을 수 있다.

6.1. 회귀를 위한 반복 신경망 (Recurrent neural networks for regression)

이 예제에서, 우리는 시계열 회귀(time series regression)를 위한 엘만 네트워트(Elman network: Elman 1990)의 사용을 보여준다. 5절에서 보여준 것처럼 데이터를 적재한 후에, 모델을 4절에서 보여준 하나와 비슷한 방법으로 훈련된다. 의미있는 기본 값(특히 사용할 함수를 위해) 이미 주어졌고, 그래서 그것만으로 학습 변수를 조정으로 종종 충분하다.
R> model <- elman(patterns$inputsTrain, patterns$targetsTrain,
+                 size = c(8, 8), learnFuncParams = c(0.1), maxit = 500,
+                 inputsTest = patterns$inputsTest, targetsTest = patterns$targetsTest,
+                 linOut = FALSE)
R에서 데이터 시각화를 위한 강력한 툴은 신경 망 모델 생성을 쉽게 한다. 예를 들어, 입력 데이터와 적합된 값을 아래의 방법으로 시각화 할 수 있다(그림은 Figure 1에서 보여준다) :
R> plot(inputs, type = "l")
R> plot(targets[1:100], type = "l")
R> lines(model$fitted.values[1:100], col = "green")
Figure 1: (a)레이저 예제 시계열 (b) 열의 처음 100개 값(검정), 그리고 상응하는 적합 (초록).
R에서 이미 사용 가능한 시각화 툴을 추가하기 위해, 시각화 및 분석으로 다양한 다른 방법은 패키지로 제공된다. 함수 plotIterativeError는 합 제곱 에러(summed squared error: SSE)를 보여주는 반복 에러 그림(iterative error plot)을 생성한다, i.e., 모든 사건에서 모든 패턴의 제곱된 에러의 합(the sum of the squared errors of all patterns for every epoch). 만약 검증 집합이 제공되면, 그것의 SSE는 또한 그림으로 보여지고, 검증 집합 비로 SSE를 나누어 정규화 한다(검증 집합에서 총 패턴은 훈련 집합에서 총 패턴으로 나눔). 함수 plotRegressionError는 회귀의 정량을 설명하는 회귀 플롯을 생성하기 위해 사용할 수 있다. 그것은 x-축에 목표 값 그리고 y-축에 적합된/예측된 값을 가진다. 최적 적합은 기울기 1을 가지고 0을 통과하는 직선을 만든다. 최적 직선을 보여주고, 뿐만 아니라 실제 데이터에서 선형 적합도 보여준다. R의 표준 모델 사용으로, 또한 다른 평가 기술로 쉽게 구현할 수 있다, e.g., 에러 히스토그램 (그림은 Figure 2에서 보여줌)
R> plotIterativeError(model)
R> plotRegressionError(patterns$targetsTrain, model$fitted.values)
R> plotRegressionError(patterns$targetsTest, model$fittedTestValues)
R> hist(model$fitted.values - patterns$targetsTrain)
Figure 2: 레이저 예제 데이터를 가지고 훈련된 엘만 망(Elman net). (a) 훈련(검정) 및 검증(빨강) 에러 모두 반복 에러 그림. (b) 훈련 데이터에서 회귀 그림, 최적의 경우(검정)에서 선형 적합을 보여줌, 그리고 현재 데이터(빨강). (c) 검증 데이터에서 회귀 그림. (d) 훈련 에러의 에러 히스토그램.

6.2. 분류를 위한 다층 퍼셉트론 (Multi-layer perceptron for classification)

분류 또는 회귀 분석의 수행은 패키지에서 매우 비슷하다. 뉴런 출력(neural output)은 전형적으로 선형 함수 대신에 로지스틱 함수를 설정한다, 그리고 출력된 뉴런(output neuron)은 각 가능한 분류로 사용된다. 훈련 목표는 옳바른 분류를 표현하는 뉴런의 활성화를 강제한다, i.e., 로지스틱 함수의 사용으로 그것의 출력은 1에 가깝게 될 것이다. 다른 뉴런은 0에 가까운 값을 출력할 것이다. 이런 과정을 용이하게 하기 위해 전- 그리고 후처리 방법이 RSNNS에 표현되었다. 아래에서, 우리는 표준 역전파 알고리즘(standard backpropagation algorithm, Rumelhart et al. 1986)을 사용하는 다층 퍼셉트론을 훈련하는 방법의 예를 보여준다. 우리는 이 예제를 위해 R에서 소개된 유명한 iris 데이터셋을 사용한다.
데이터는 적재되고(loaded), 혼합되고(shuffled), 그리고 전처리(preprocessed) 된다. 함수 decodeClassLabels은 분류 딱지를 표시하는 정수-입력 벡터에서 이진 메트릭을 만든다. splitForTrainingAndTest으로, 데이터는 훈련과 검증 집합으로 나눠진다, 그것은 그러면 함수 normTrainingAndTestSet를 사용하여 정규화 된다, 다른 정규화 형식으로 구현됨. 우리는 0인 평균 그리고 분산이 1인 정규화를 사용한다, 기본 설정임.
R> data("iris")
R> iris <- iris[sample(1:nrow(iris), length(1:nrow(iris))), 1:ncol(iris)]
R> irisValues <- iris[, 1:4]
R> irisTargets <- iris[, 5]
R> irisDecTargets <- decodeClassLabels(irisTargets)
R> iris <- splitForTrainingAndTest(irisValues, irisDecTargets, ratio = 0.15)
R> iris <- normTrainingAndTestSet(iris)
이 구조의 훈련 집합은 그러면 다-층 퍼셉트론 훈련을 사용할 수 있다(또는 어떤 다른 감독 학습 모델):
R> model <- mlp(iris$inputsTrain, iris$targetsTrain, size = 5,
+               learnFuncParams = 0.1, maxit = 60, inputsTest = iris$inputsTest,
+               targetsTest = iris$targetsTest)
R> predictions <- predict(model, iris$inputsTest)
다시, 반복 및 회귀 에러 플롯은 분석에서 사용할 수 있다, 그러나 회귀 에러 플롯은 회귀 문제에서 보다 더 정보가 없다 (Figure 3을 보라). 또한, 수신자 동작 특성 (receiver operating characteristics, ROC)을 보여주는 함수가 이 패키지에 포함되었다. ROC 플롯은 2개의 분류를 가지는 분류 문제의 분석에서 일반적으로 사용된다. 더 많은 분류에서, 모든 분류에서 ROC 플롯은 모든 다른 분류를 하나의 분류로 묶어서 생성할 수 있다, 그리고 ROC 플롯을 그리기 위한 상응하는 뉴런의 출력만으로 출력을 사용 (예제를 위해 Figure 3을 보라) :
R> plotIterativeError(model)
R> plotRegressionError(predictions[, 2], iris$targetsTest[, 2], pch = 3)
R> plotROC(fitted.values(model)[, 2], iris$targetsTrain[, 2])
R> plotROC(predictions[, 2], iris$targetsTest[, 2])
Figure 3: iris 데이터셋으로 훈련된 다-층 퍼셉트론. (a) 훈련(검정) 그리고 검증(빨강) 에러 둘 모두의 반복 에러 플롯. (b) 검증 데이터의 회귀 플롯. 분류가 수행됨에 따라, 이상적으로 오로지 점 (0, 0) 그리고 (1, 1)에 분포된다. (c) 모든 다른 분류에 대한 두번째 분류를 위한 ROC 플롯, 훈련 집합에서. (d) (c)d와 같음, 그러나 검증 데이터에서.
어쨌든, 이 방법에서 ROC 플롯의 사용은 혼란스러울 것이다, 특히 만약 많은 분류가 데이터에 존재한다면. 그러나 3개의 분류를 가지고 주어진 예에서 그것은 아마도 혼동 메트릭(confusion matrices)을 분석하기 위한 더 많은 정보가 있다, 함수 confusionMatrix를 사용함. 혼동 메트릭은 분류 X의 패턴을 분류 Y의 수가 되게 잘못된 분류한 네트워크의 총 횟수를 보여준다. 만약 분류 딱지가 함수 confusionMatrix의 메트릭으로 주어진다면, 그것은 그들을 표준 설정을 사용하여 해석한다. 지금은, 이 표준 설정은 최대 출력 활성화를 가지는 뉴런으로 표현되는 분류에서 각 패턴을 분류하는 엄격한 승자 독식(strict winnertakes-all, WTA) 알고리즘이다, 다른 유닛의 활성화를 제외. 다른 해석 알고리즘에서, 분류 딱지를 수작업으로 해석할 수 있다. 아래의 예제에서, 기본값 제외, 402040 method를 사용, 그것의 기본 변수 후에 명명됨, 두개의 임계값 l = 0.4 , 그리고 h = 0.6. 이 구성에서, 이런 두개의 임계값은 [0, 1]-구간을 값의 40%를 가지는 하위 부, 값의 20%를 가지는 중간 부 그리고 값의 40%를 가지는 상단 부로 분리한다. 메서드는 출력 뉴런에 상응하는 분류로 패턴을 분류한다, 만약 이 출력 뉴런이 상위 부에서 활성화를 가지고, 그리고 다른 뉴런이 하위 부에서 활성화를 가진다면. 그렇지 않으면, 패턴은 미분류(unclassified)로 처리된다. 지금 구현에서, 미분류 패턴은 분류 딱지로 0을 표시한다. 만약 WTA가 표준 설정을 가진다면, 미분류 패턴이 발생하지 않음. 402040 와 WTA 둘 모두는 Zell et al. (1998)의 설명으로 구현되었다. 아래에서, 우리는 훈련과 검증 데이터셋을 위한 혼동 메트릭의 결과를 보여준다.
R> confusionMatrix(iris$targetsTrain, fitted.values(model))

        predictions
targets  1  2  3
      1 42  0  0
      2  0 40  3
      3  0  1 41
      
R> confusionMatrix(iris$targetsTest, predictions)

        predictions
targets 1 2 3
      1 8 0 0
      2 0 7 0
      3 0 0 8
      
R> confusionMatrix(iris$targetsTrain, encodeClassLabels(fitted.values(model),
+                  method = "402040", l = 0.4, h = 0.6))

        predictions
targets 0  1  2  3
      1 0 42  0  0
      2 5  0 38  0
      3 3  0  0 39
마지막으로, 우리는 새롭게 훈련된 망의 가중치를 볼 수 있다, 함수 weightMatrix 사용 (출력 빠짐):
R> weightMatrix(model)

6.3. 군집을 위한 자가-조직화 지도(or 맵) (Self-organizing map for clustering)

자가-조직화 지도는 군집을 위한 비감독 학습 방법이다(Kohonen 1988). 비슷한 입력 패턴은 지도에서 공간적으로 가깝게 출력되는 결과가 나타난다. 예를 들어, SOM을 iris 데이터를 가지고 훈련할 수 있다:
R> model <- som(irisValues, mapX = 16, mapY = 16, maxit = 500,
+               targets = irisTargets)
target 변수는 옵션이다. 만약 주어지면, SOM의 분류된 버전(labeled version)이 산출된다, 만약 같은 경우의 패턴이 지도에서 그룹으로 표현됨을 보기 위해. 큰 패턴 집합 계산 출력을 위해서는 많은 시간을 가져야 한다, 변수 calculateMap, calculateActMaps, calculateSpanningTree, 그리고 saveWinnersPerPattern은 결과 산출을 통제하기 위해 사용할 수 있다. 컴포넌트 맵(Component maps)은 항상 계산된다. 결과의 더 상세한 설명:
  • model$actMaps: 활성화 지도는 단순한 하나의 패턴을 위한 망 활성화이다. 활성화 맵 목록 actMaps은 각 패턴에서 활성화 지도의 목록을 가진다. 만약 많은 패턴이 있으면, 이 목록은 매우 커질 수 있다. 모든 다른 결과는 이 목록으로 계산할 수 있다. 그래서, 중간 결과가 있음, 만약 많은 패턴이 표현된다면 제한된 결과를 가짐, 그것은 만약 변수 calculateActMaps로 명확하게 요구하지 않는다면 저장되지 않는다.
  • model$map: 자가-조직화 지도에서 가장 일반적인 표현. 각 패턴을 위해, 승자 뉴런은 그것의 활성화 맵으로 계산된다. 유닛 활성화가 유클리드안 거리(Euclidean distances)로 표현되므로, 승자는 최소 활성화를 가지는 유닛이다. 지도는 그다음 보여진다, 얼마나 많은 패턴이 각 뉴런에서 승자인지를 위해.
  • model$componentMaps: 각 입력 차원을 위해 하나의 컴포넌트 맵이 있다, 지도에서 이 입력 컴포넌트는 높은 활성화로 이끄는 경우를 보여줌.
  • model$labeledMap: 각 유닛을 위해 목표 분류 수가 결정되는 경우 지도의 버전, 뉴런이 승자에 속한 경우 어느 것이 중요 패턴인지 나타냄. 그래서, (비감독) SOM 학습의 성능을 감독 방법을 가지고 훈련되는 문제를 사용하여 통제할 수 있다.
  • model$spanningTree: 이것은 model$map과 같다, 번호는 뉴런이 승리한 경우에 패턴의 총 량을 표시하지 않는 점을 제외하고, 그러나 번호는 뉴런에서 최소 활성화로 이끄는 마지막 패턴을 구별한다. SOM 훈련의 다른 결과와 대조적으로, 스패닝 트리(spanning tree)는 SNNS 커널에서 직접 사용할 수 있다. 다른 결과들이 아마도 더 많은 정보가 있는 것 처럼, 만약 다른 함수가 많은 계산 시간을 요구한다면 스패닝 트리에 관심을 가진다, 또는 원본 SNNS 수행이 필요하다면. calculateSpanningTree=TRUE로 설정해야 생성됨
SOM 결과는 열상 지도(heat map)를 표현하는 plotActMap 함수를 사용하여 시각화할 수 있다, 또는 어떤 다른 R 표준 메서드로, e.g., persp. 만약 약간의 승자 유닛이 대부분의 다른 유닛 보다 훨씬 더 많다면, 로그 척도가 적당할 것이다 (플롯은 Figure 4에서 보여줌):
R> plotActMap(model$map, col = rev(heat.colors(12)))
R> plotActMap(log(model$map + 1), col = rev(heat.colors(12)))
R> persp(1:model$archParams$mapX, 1:model$archParams$mapY, log(model$map + 1),
+        theta = 30, phi = 30, expand = 0.5, col = "lightblue")
R> plotActMap(model$labeledMap)
Figure 4: iris 데이터를 가지고 훈련된 SOM. (a) 유닛이 승자인 경우 각 유닛의 패턴의 량을 보여주는 열-지도, 패턴이 없는 경우(흰색)에서 부터 많는 패턴이 있는 경우(빨강). (b) (a)와 같음, 그러나 로그 척도임. (c) (b)와 같음, 그러나 열 지도 대신 관점 플롯(perspective plot). (d) 표기된 지도, 어느 곳에 중요 패턴이 속해 있는지 각각의 유닛 분류를 위한 보기, 승자 유닛을 위함.
컴포넌트 맵(component maps)는 다른 지도에서 처럼 같은 방법으로 시각화할 수 있다 (Figure 5에서 플롯이 보임)
R> for(i in 1:ncol(irisValues)) plotActMap(model$componentMaps[[i]],
+                                          col = rev(topo.colors(12)))
Figure 5: (a)-(d) iris 데이터를 가지고 훈련된 SOM의 요소 지도. iris 데이터셋은 4개의 입력을 가지므로, 4개의 요소 지도가 각 입력을 보여주기 위해 표현되었다, 지도에서 그것이 높은 활성화를 이끄는 경우.

6.4. An ART2 network

ART 망 (Grossberg 1988)은 군집을 위한 비감독 학습 방법이다. 그들은 신경망에서 중앙 문제의 해결책을 제공한다, 안정성/적응성(plasticity, 가소성) 딜레마, 어떤 평균, 일반적으로 그것은 망에서 이전 표현을 변경/삭제 없이 새로운 학습은 신경망에서 어렵다. ART 망에서, 적응성(가소성)은 새로운 입력 패턴은 새로운 프로토타입/군집 중앙을 생성할 것이라는 방법으로 구현되었다, 만약 그들이 망에 다른 프로토타입으로 아직 표현되지 않았다면. 안정성은 표현된다, 프로토타입이 모든 새로운 패턴으로 변경되지 않았으므로, 단지 프로토타입과 비슷한 새로운 패턴을 제외하고. ART1 망 (Carpenter and Grossberg 1987b)은 오로지 이진 입력 패턴만을 허용한다, ART2 (Carpenter and Grossberg 1987a)는 실수-값 입력을 위해 개발되었다. SNNS 예제 art2_tetra 에서, 우리가 여기서 구현된 어떤 것, 입력은 사면체(tetrahedron) 코너의 좌표에 잡음이 있다.
구조 변수 f2Units은 망의 f2-층에서 표현되는 숨김 유닛의 량을 정의한다, 따라서 망에 저장할 수있는 군집의 최대 수가 주어진다(상세한 내용을 위해, Zell et al. (1998) and Herrmann (1992))를 보라).
모델은 아래의 방법으로 생성할 수 있다.
R> patterns <- snnsData$art2_tetra_med.pat
R> model <- art2(patterns, f2Units = 5,
+                learnFuncParams = c(0.99, 20, 20, 0.1, 0),
+                updateFuncParams = c(0.99, 20, 20, 0.1, 0))
이 예제의 시각화를 위해, 그것은 R 패키지 scatterplot3d(Ligges and Maechler 2003) 를 사용하는 것이 편리하다, 3-차원의 스케터 플롯(three-dimensional scatter plots).
R> library("scatterplot3d")
R> scatterplot3d(patterns, pch = encodeClassLabels(model$fitted.values))
Figure 6은 이 산점도(scatter plot)를 보여준다, 그리고 같은 과정의 결과, 그러나 입력 데이터 snnsData$art2_tetra_high.pat을 사용, 더 많은 잡음이 추가됨.

Figure 6: 3차원 사면체의 모서리를 표현하는 잡음이 있는 입력 데이터로 훈련된 ART2 망. (a) 중간 잡음 수준을 가지는 데이터, 메소드는 수집한 4개의 다른 군집과 그리고 군집의 포인트를 올바르게 추정한다. (b) 높은 잡음 수준을 가지는 데이터. 메서드는 3개의 군집을 생성한다. 모서리의 2개의 포인트는 공간적으로 가깝지 않지만 하나의 군집에 있음을 주목하라. ART2는 정규화 벡터를 사용하므로, 그것은 그것은 단지 벡터의 방향을 이해할 수 있게 해 준다, 비직관적인 결과를 초래(Herrmann 1992)

6.5. RSNNS와 독립적인 SNNS 소프트웨어의 사용 결합
(Combined use of RSNNS and independent SNNS software)

RSNNS는 SNNS 기능의 주요한 부분을 포함하지만, 약간 남겨 놓았다, 어떤 특별한 목적으로 관심이 있을만한 것: 예를 들어, SNNS GUI는 신경망 위상의 상호작용 화면(visual) 개발 또는 망 가중치 규칙의 수작업 분석을 위해 매우 편리한 툴이다. RSNNSSNNS과 상호작용하는 기능을 제공한다. 이것은 주로 읽기/쓰기에서 본래의 데이터셋 파일을 포함한다 (.pat, 변수 길이를 가지고 패턴을 가지는 파일은 현재 지원되지 않음) 또는 신경망 파일 (.net), 뿐만 아니라 res 파일을 위한 기본적인 해석기(rudimentary parser). 이 방법은, 데이터 그리고 망은 원래의 SNNS을 설치하여 교환할 수 있다, e.g., SNNS에서 망 구조를 시각화하기 위해, 또는 SNNS에서 망을 훈련하고 그리고 망의 능력을 분석하기 위해 R을 사용하기 위해.
R> exportToSnnsNetFile(model, filename)
R> readPatFile(filename)
R> savePatFile(inputs, targets, filename)
R> readResFile(filename)
.pat 파일 메서드는 원본 SNNS 메서드를 이용하여 만든다. 게다가, .net 파일은 보통의 SNNS 커널 메서드 loadNetsaveNet을 가지고 적재되고 저장될 수 있다.

댓글 없음:

댓글 쓰기