Main Content

trainAutoencoder

오토인코더 훈련

설명

예제

autoenc = trainAutoencoder(X)X의 훈련 데이터를 사용하여 훈련된 오토인코더 autoenc를 반환합니다.

autoenc = trainAutoencoder(X,hiddenSize)는 은닉 표현 크기가 hiddenSize인 오토인코더 autoenc를 반환합니다.

예제

autoenc = trainAutoencoder(___,Name,Value)는 위에 열거된 입력 인수와 하나 이상의 Name,Value 쌍 인수로 지정된 추가 옵션에 대해 오토인코더 autoenc를 반환합니다.

예를 들어, 희소성 비율이나 최대 훈련 반복 횟수를 지정할 수 있습니다.

예제

모두 축소

샘플 데이터를 불러옵니다.

X = abalone_dataset;

X는 전복 껍데기 4,177개의 8가지 특성, 즉 성별(M, F, I(미숙 객체)), 길이, 지름, 높이, 전체 중량, 속살 중량, 내장 중량, 껍데기 중량을 정의하는 8×4,177 행렬입니다. 이 데이터셋에 대한 자세한 내용을 보려면 명령줄에 help abalone_dataset을 입력하십시오.

디폴트 설정으로 희소 오토인코더를 훈련시킵니다.

autoenc = trainAutoencoder(X);

{"String":"Figure Neural Network Training (24-Jul-2022 21:30:15) contains an object of type uigridlayout.","Tex":[],"LaTex":[]}

훈련된 오토인코더를 사용하여 전복 껍데기 나이테 데이터를 다시 생성합니다.

XReconstructed = predict(autoenc,X);

이 재구성에 대한 평균 제곱 오차를 계산합니다.

mseError = mse(X-XReconstructed)
mseError = 0.0167

샘플 데이터를 불러옵니다.

X = abalone_dataset;

X는 전복 껍데기 4,177개의 8가지 특성, 즉 성별(M, F, I(미숙 객체)), 길이, 지름, 높이, 전체 중량, 속살 중량, 내장 중량, 껍데기 중량을 정의하는 8×4,177 행렬입니다. 이 데이터셋에 대한 자세한 내용을 보려면 명령줄에 help abalone_dataset을 입력하십시오.

은닉 크기 4, 최대 Epoch 400회, 디코더에 대한 선형 전달 함수로 희소 오토인코더를 훈련시킵니다.

autoenc = trainAutoencoder(X,4,'MaxEpochs',400,...
'DecoderTransferFunction','purelin');

{"String":"Figure Neural Network Training (24-Jul-2022 21:32:31) contains an object of type uigridlayout.","Tex":[],"LaTex":[]}

훈련된 오토인코더를 사용하여 전복 껍데기 나이테 데이터를 다시 생성합니다.

XReconstructed = predict(autoenc,X);

이 재구성에 대한 평균 제곱 오차를 계산합니다.

mseError = mse(X-XReconstructed)
mseError = 0.0044

훈련 데이터를 생성합니다.

rng(0,'twister'); % For reproducibility
n = 1000;
r = linspace(-10,10,n)';
x = 1 + r*5e-2 + sin(r)./r + 0.2*randn(n,1);

훈련 데이터를 사용하여 오토인코더를 훈련시킵니다.

hiddenSize = 25;
autoenc = trainAutoencoder(x',hiddenSize,...
        'EncoderTransferFunction','satlin',...
        'DecoderTransferFunction','purelin',...
        'L2WeightRegularization',0.01,...
        'SparsityRegularization',4,...
        'SparsityProportion',0.10);

{"String":"Figure Neural Network Training (24-Jul-2022 21:36:48) contains an object of type uigridlayout.","Tex":[],"LaTex":[]}

테스트 데이터를 생성합니다.

n = 1000;
r = sort(-10 + 20*rand(n,1));
xtest = 1 + r*5e-2 + sin(r)./r + 0.4*randn(n,1);

훈련된 오토인코더 autoenc를 사용하여 테스트 데이터를 예측합니다.

xReconstructed = predict(autoenc,xtest');

실제 테스트 데이터와 예측값을 플로팅합니다.

figure;
plot(xtest,'r.');
hold on
plot(xReconstructed,'go');

Figure contains an axes object. The axes object contains 2 objects of type line.

훈련 데이터를 불러옵니다.

XTrain = digitTrainCellArrayData;

훈련 데이터는 각 셀에 손으로 쓴 숫자를 표현한 합성 영상을 나타내는 28×28 행렬이 있는 1×5,000 셀형 배열입니다.

25개의 뉴런을 포함하는 은닉 계층 1개를 갖는 오토인코더를 훈련시킵니다.

hiddenSize = 25;
autoenc = trainAutoencoder(XTrain,hiddenSize,...
        'L2WeightRegularization',0.004,...
        'SparsityRegularization',4,...
        'SparsityProportion',0.15);

테스트 데이터를 불러옵니다.

XTest = digitTestCellArrayData;

테스트 데이터는 각 셀에 손으로 쓴 숫자를 표현한 합성 영상을 나타내는 28×28 행렬이 있는 1×5,000 셀형 배열입니다.

훈련된 오토인코더 autoenc를 사용하여 테스트 영상 데이터를 재생성합니다.

xReconstructed = predict(autoenc,XTest);

실제 테스트 데이터를 표시합니다.

figure;
for i = 1:20
    subplot(4,5,i);
    imshow(XTest{i});
end

재생성한 테스트 데이터를 표시합니다.

figure;
for i = 1:20
    subplot(4,5,i);
    imshow(xReconstructed{i});
end

입력 인수

모두 축소

훈련 데이터로, 훈련 샘플로 구성된 행렬 또는 영상 데이터로 구성된 셀형 배열로 지정됩니다. X가 행렬인 경우, 각 열에는 하나의 샘플이 있습니다. X가 영상 데이터로 구성된 셀형 배열인 경우, 각 셀의 데이터는 차원 수가 같아야 합니다. 영상 데이터는 회색조 영상의 픽셀 명암 값일 수 있으며, 이 경우 각 셀에는 하나의 m×n 행렬이 있습니다. 영상 데이터는 RGB 데이터일 수도 있으며, 이 경우 각 셀에는 하나의 m×n×3 행렬이 있습니다.

데이터형: single | double | cell

오토인코더의 은닉 표현 크기로, 양의 정수 값으로 지정됩니다. 이 수치는 은닉 계층에 있는 뉴런의 개수입니다.

데이터형: single | double

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: 'EncoderTransferFunction','satlin','L2WeightRegularization',0.05는 오토인코더의 전달 함수를 양의 포화 선형 전달 함수로 지정하고 L2 가중치 정규화를 0.05로 지정합니다.

오토인코더의 전달 함수로, 'EncoderTransferFunction'과 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.

전달 함수 옵션정의
'logsig'

로지스틱 시그모이드 함수

f(z)=11+ez

'satlin'

양의 포화 선형 전달 함수

f(z)={0,if z0z,if 0<z<11,if z1

예: 'EncoderTransferFunction','satlin'

디코더의 전달 함수로, 'DecoderTransferFunction'과 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.

전달 함수 옵션정의
'logsig'

로지스틱 시그모이드 함수

f(z)=11+ez

'satlin'

양의 포화 선형 전달 함수

f(z)={0,if z0z,if 0<z<11,if z1

'purelin'

선형 전달 함수

f(z)=z

예: 'DecoderTransferFunction','purelin'

최대 훈련 Epoch 횟수 또는 반복 횟수로, 'MaxEpochs'와 함께 양의 정수 값이 쉼표로 구분되어 지정됩니다.

예: 'MaxEpochs',1200

비용 함수(LossFunction)에서 L2 가중치 정규화 함수의 계수로, 'L2WeightRegularization'과 함께 양의 스칼라 값이 쉼표로 구분되어 지정됩니다.

예: 'L2WeightRegularization',0.05

훈련에 사용할 손실 함수로, 'LossFunction'과 함께 'msesparse'가 쉼표로 구분되어 지정됩니다. 다음과 같이 희소 오토인코더를 훈련시키기 위해 조정된 평균 제곱 오차 함수에 해당됩니다.

E=1Nn=1Nk=1K(xknx^kn)2mean squared error+λ*ΩweightsL2regularization+β*Ωsparsitysparsityregularization,

여기서 λ는 L2 정규화 항의 계수이고 β는 희소 정규화 항의 계수입니다. 오토인코더를 훈련시키는 중에 L2WeightRegularizationSparsityRegularization 이름-값 쌍 인수를 사용하여 각각 λ와 β의 값을 지정할 수 있습니다.

훈련 창을 표시할지 여부 표시자로, 'ShowProgressWindow'와 함께 true 또는 false가 쉼표로 구분되어 지정됩니다.

예: 'ShowProgressWindow',false

뉴런이 응답하도록 할 훈련 표본의 비율로, 'SparsityProportion'과 함께 양의 스칼라 값이 쉼표로 구분되어 지정됩니다. 희소 비율은 희소 정규화 함수의 파라미터입니다. 은닉 계층의 출력값의 희소 정도를 제어합니다. 일반적으로 SparsityProportion의 값이 작으면 은닉 계층의 각 뉴런이 적은 수의 훈련 표본에 대해서만 높은 출력값을 부여함으로써 "특화"됩니다. 따라서 희소 비율이 낮으면 높은 희소성이 유발됩니다. 자세한 내용은 희소 오토인코더를 참조하십시오.

예: 'SparsityProportion',0.01은 은닉 계층의 각 뉴런이 훈련 표본에 대해 평균 출력값 0.1을 가져야 한다고 지정하는 것과 같습니다.

비용 함수에서 희소 정규화 함수의 영향력을 제어하는 계수로, 'SparsityRegularization'과 함께 양의 스칼라 값이 쉼표로 구분되어 지정됩니다.

예: 'SparsityRegularization',1.6

오토인코더를 훈련시키는 데 사용할 알고리즘으로, 'TrainingAlgorithm'과 함께 'trainscg'가 쉼표로 구분되어 지정됩니다. scg는 스케일링된 켤레 경사하강법(scaled conjugate gradient descent) [1]을 나타냅니다.

입력 데이터를 다시 스케일링할지 여부 표시자로, 'ScaleData'와 함께 true 또는 false가 쉼표로 구분되어 지정됩니다.

오토인코더는 출력값으로 입력값과 똑같은 값을 만들어내려는 시도를 합니다. 이것이 가능하려면 입력 데이터의 범위가 디코더에 대한 전달 함수의 범위와 일치해야 합니다. trainAutoencoder는 오토인코더를 훈련시킬 때 훈련 데이터를 자동으로 이 범위로 스케일링합니다. 오토인코더를 훈련시킬 때 데이터가 스케일링된 경우, predict, encode, decode 메서드도 데이터를 스케일링합니다.

예: 'ScaleData',false

훈련에 GPU를 사용할지 여부 표시자로, 'UseGPU'와 함께 true 또는 false가 쉼표로 구분되어 지정됩니다.

예: 'UseGPU',true

출력 인수

모두 축소

훈련된 오토인코더로, Autoencoder 객체로 반환됩니다. 이 객체의 속성과 메서드에 대한 자세한 내용은 Autoencoder 클래스 페이지를 참조하십시오.

세부 정보

모두 축소

오토인코더

오토인코더는 출력값을 입력값과 동일하게 복제하도록 훈련된 신경망입니다. 오토인코더는 심층 신경망을 학습하는 툴로 사용할 수 있습니다. 오토인코더 훈련은 레이블이 지정된 데이터가 필요하지 않다는 점에서 비지도 학습입니다. 훈련 과정은 여전히 비용 함수의 최적화를 기반으로 합니다. 비용 함수는 입력값 x와 출력값 x^에서 재생성된 값 간의 오차를 측정합니다.

오토인코더는 인코더와 디코더로 구성됩니다. 인코더와 디코더는 여러 개의 계층을 가질 수 있지만, 문제를 단순화하기 위해 각각 1개의 계층을 갖는다고 가정하겠습니다.

오토인코더에 대한 입력값이 벡터 xDx이면, 인코더는 다음과 같이 벡터 x를 또 다른 벡터 zD(1)로 매핑합니다.

z=h(1)(W(1)x+b(1)),

여기서 위 첨자 (1)은 첫 번째 계층을 나타냅니다. h(1):D(1)D(1)은 인코더에 대한 전달 함수이고, W(1)D(1)×Dx는 가중치 행렬이고, b(1)D(1)은 편향 벡터입니다. 그런 다음 디코더가 다음과 같이 인코딩된 표현 z를 원래 입력 벡터 x에 대한 추정값으로 다시 매핑합니다.

x^=h(2)(W(2)z+b(2)),

여기서 위 첨자 (2)는 두 번째 계층을 나타냅니다. h(2):DxDx는 디코더에 대한 전달 함수이고,W(1)Dx×D(1)은 가중치 행렬이고, b(2)Dx는 편향 벡터입니다.

희소 오토인코더

비용 함수에 정규화 함수를 추가하면 오토인코더의 희소성을 유발하는 것이 가능해집니다[2]. 이 정규화 함수는 뉴런의 평균 출력 활성화 값에 대한 함수입니다. 뉴런 i의 평균 출력 활성화 측정값은 다음과 같이 정의됩니다.

ρ^i=1nj=1nzi(1)(xj)=1nj=1nh(wi(1)Txj+bi(1)),

여기서 n은 훈련 표본의 총 개수입니다. xj는 j번째 훈련 표본이고, wi(1)T는 가중치 행렬 W(1)의 i번째 행이고, bi(1)은 편향 벡터 b(1)의 i번째 요소입니다. 출력 활성화 값이 매우 높으면 뉴런이 '발화'(활성)한다고 간주됩니다. 출력 활성화 값이 낮으면 은닉 계층의 뉴런이 적은 개수의 훈련 표본에 반응하여 발화함을 의미합니다. 비용 함수에 ρ^i의 값이 낮도록 제약하는 항을 추가하면, 오토인코더는 은닉 계층에 있는 각 뉴런이 적은 개수의 훈련 표본에 반응하여 발화하는 표현을 학습하도록 유발됩니다. 즉, 각 뉴런은 훈련 표본 중 작은 일부에만 존재하는 특정 특징에 반응하도록 특화됩니다.

희소성 정규화

희소 정규화 함수는 은닉 계층에서의 출력값의 희소성에 제약 조건을 적용하려고 시도합니다. 뉴런 i의 평균 활성화 값 ρ^i와 그에 대한 원하는 값 ρ가 비슷하지 않으면 큰 값을 갖는 정규화 항을 추가하여 희소성을 유발할 수 있습니다[2]. 이러한 희소 정규화 항의 예로 쿨백-라이블러(Kullback-Leibler) 발산을 들 수 있습니다.

Ωsparsity=i=1D(1)KL(ρρ^i)=i=1D(1)ρlog(ρρ^i)+(1ρ)log(1ρ1ρ^i)

쿨백-라이블러 발산은 두 분포가 얼마나 다른지 측정하는 함수입니다. 이 경우에 쿨백-라이블러 발산은 ρρ^i가 서로 같으면 값이 0이 되고, 두 값이 서로 발산하면 값이 커집니다. 비용 함수를 최소화하면 이 항을 작게 만들 수 있고, 따라서 ρρ^i가 비슷해지도록 할 수 있습니다. 오토인코더를 훈련시키는 중에 SparsityProportion 이름-값 쌍 인수를 사용하여 평균 활성화 값의 원하는 값을 정의할 수 있습니다.

L2 정규화

희소 오토인코더를 훈련시킬 때 가중치 w(l)의 값을 더 크게 하고 z(1)의 값을 더 작게 하여 희소 정규화기를 작게 만들 수 있습니다[2]. 비용 함수에 대한 가중치에 정규화 항을 추가하면 이런 일이 생기는 것을 막을 수 있습니다. L2 정규화 항이라고 부르는 이 항은 다음과 같이 정의됩니다.

Ωweights=12l=1Lj=1nli=1kl(wji(l))2,

여기서 L은 은닉 계층의 개수이고, nl은 계층 l의 출력 크기, kl은 계층 l의 입력 크기입니다. L2 정규화 항은 각 계층에 대한 가중치 행렬 요소의 제곱합입니다.

비용 함수

희소 오토인코더 훈련을 위한 비용 함수는 다음과 같이 조정된 평균 제곱 오차 함수입니다.

E=1Nn=1Nk=1K(xknx^kn)2mean squared error+λ*ΩweightsL2regularization+β*Ωsparsitysparsityregularization,

여기서 λ는 L2 정규화 항의 계수이고 β는 희소 정규화 항의 계수입니다. 오토인코더를 훈련시키는 중에 L2WeightRegularizationSparsityRegularization 이름-값 쌍 인수를 사용하여 각각 λ와 β의 값을 지정할 수 있습니다.

참고 문헌

[1] Moller, M. F. “A Scaled Conjugate Gradient Algorithm for Fast Supervised Learning”, Neural Networks, Vol. 6, 1993, pp. 525–533.

[2] Olshausen, B. A. and D. J. Field. “Sparse Coding with an Overcomplete Basis Set: A Strategy Employed by V1.” Vision Research, Vol.37, 1997, pp.3311–3325.

버전 내역

R2015b에 개발됨