Main Content

사용자 지정 훈련 루프, 손실 함수 및 신경망 정의

대부분의 딥러닝 작업의 경우, 사전 훈련된 신경망을 사용하고 이를 사용자 자신의 데이터에 맞게 적응시킬 수 있습니다. 새로운 영상 세트를 분류할 수 있도록 전이 학습을 사용하여 컨벌루션 신경망을 다시 훈련시키는 방법을 보여주는 예제는 Retrain Neural Network to Classify New Images 항목을 참조하십시오. 또는 trainnet 함수와 trainingOptions 함수를 사용하여 신경망을 처음부터 만들고 훈련시킬 수 있습니다.

trainingOptions 함수가 작업에 필요한 훈련 옵션을 제공하지 않는다면 자동 미분을 사용하여 사용자 지정 훈련 루프를 만들 수 있습니다. 자세한 내용은 Train Network Using Custom Training Loop 항목을 참조하십시오.

trainnet 함수가 작업에 필요한 손실 함수를 제공하지 않는다면 사용자 지정 손실 함수를 trainnet에 함수 핸들로 지정할 수 있습니다. 예측값과 목표값보다 더 많은 입력값이 필요한 손실 함수(예: 신경망 또는 추가 입력값에 액세스해야 하는 손실 함수)의 경우 사용자 지정 훈련 루프를 사용하여 모델을 훈련시킵니다. 자세한 내용은 Train Network Using Custom Training Loop 항목을 참조하십시오.

Deep Learning Toolbox™가 작업에 필요한 계층을 제공하지 않는다면 사용자 지정 계층을 만들 수 있습니다. 자세한 내용은 사용자 지정 딥러닝 계층 정의하기 항목을 참조하십시오. 계층 신경망으로 지정할 수 없는 모델의 경우 모델을 함수로 정의할 수 있습니다. 자세한 내용은 Train Network Using Model Function 항목을 참조하십시오.

어느 훈련 방법을 어느 작업에 사용해야 하는지에 대한 자세한 내용은 Train Deep Learning Model in MATLAB 항목을 참조하십시오.

사용자 지정 손실 함수 정의하기

trainnet 함수는 훈련에 사용할 수 있는 여러 내장 손실 함수를 제공합니다. 예를 들어, "crossentropy""mse"를 각각 손실 함수 인수로 지정하여 분류의 경우 교차 엔트로피 손실을 지정하고 회귀의 경우 평균제곱오차 손실을 지정할 수 있습니다.

trainnet 함수가 작업에 필요한 손실 함수를 제공하지 않는다면 사용자 지정 손실 함수를 trainnet에 함수 핸들로 지정할 수 있습니다. 함수의 구문은 loss = f(Y,T)여야 합니다. 여기서 YT는 각각 예측값과 목표값입니다.

사용자 지정 손실 함수를 만들 때 다음 표에 나와 있는 딥러닝 함수를 활용할 수 있습니다. 이들 함수를 trainnet 함수에 함수 핸들로 직접 전달할 수도 있습니다.

함수설명
softmax소프트맥스 활성화 연산은 입력 데이터의 채널 차원에 소프트맥스 함수를 적용합니다.
sigmoid시그모이드 활성화 연산은 입력 데이터에 시그모이드 함수를 적용합니다.
crossentropy교차 엔트로피 연산은 단일 레이블 및 다중 레이블 분류 작업에서 신경망 예측과 목표값 사이의 교차 엔트로피 손실을 계산합니다.
l1lossL1 손실 연산은 신경망 예측값과 목표값이 주어진 경우 L1 손실을 계산합니다. Reduction 옵션이 "sum"이고 NormalizationFactor 옵션이 "batch-size"일 때 계산된 값을 평균절대오차(MAE)라고 합니다.
l2lossL2 손실 연산은 신경망 예측값과 목표값이 주어진 경우 L2 손실(L2 노름의 제곱에 기반함)을 계산합니다. Reduction 옵션이 "sum"이고 NormalizationFactor 옵션이 "batch-size"일 때 계산된 값을 평균제곱오차(MSE)라고 합니다.
huberHuber 연산은 회귀 작업에서 신경망 예측과 목표값 사이의 Huber 손실을 계산합니다. 'TransitionPoint' 옵션이 1이면 smooth-L1 손실이라고도 합니다.
mse평균제곱오차의 절반 연산은 회귀 작업에서 신경망 예측과 목표값 사이의 평균제곱오차의 절반을 취하는 손실을 계산합니다.
ctcCTC 연산은 정렬되지 않은 시퀀스 간의 연결주의적 시간 분류(CTC: Connectionist Temporal Classification) 손실을 계산합니다.

예측값과 목표값보다 더 많은 입력값이 필요한 손실 함수(예: 신경망 또는 추가 입력값에 액세스해야 하는 손실 함수)의 경우 사용자 지정 훈련 루프를 사용하여 모델을 훈련시킵니다. 자세한 내용은 사용자 지정된 훈련 루프 손실 함수 정의하기 항목을 참조하십시오. 예제는 Train Network Using Custom Training Loop 항목을 참조하십시오.

사용자 지정 훈련 루프를 위한 딥러닝 모델 정의하기

대부분의 작업에서는 trainingOptionstrainnet 함수를 사용하여 훈련 알고리즘 세부 정보를 제어할 수 있습니다. trainingOptions 함수가 작업에 필요한 옵션을 제공하지 않는다면(예: 사용자 지정 학습률 조정 계획) 자체 사용자 지정 훈련 루프를 정의할 수 있습니다.

모델을 신경망으로 정의하기

배열로 지정하거나 계층 신경망으로 지정할 수 있는 모델의 경우 모델을 dlnetwork 객체로 지정합니다. 예를 들어 사용자 지정 훈련 루프에 간단한 LSTM 신경망을 정의하려면 다음을 사용하십시오.

layers = [
    sequenceInputLayer(3)
    lstmLayer(100,OutputMode="last")
    fullyConnectedLayer(4)
    softmaxLayer];
net = dlnetwork(layers);

사용자 지정 훈련 루프를 사용하여 신경망을 훈련시키려면 신경망을 초기화해야 합니다. 신경망을 초기화하려면 initialize 함수를 사용하십시오.

net = initialize(net);

사용자 지정 학습률 조정 계획을 사용하여 신경망을 훈련시키는 방법을 보여주는 예제는 Train Network Using Custom Training Loop 항목을 참조하십시오.

모델을 함수로 정의하기

계층으로 구성된 배열 또는 신경망을 사용하여 만들 수 없는 아키텍처의 경우, 모델을 [Y1,...,YM] = model(parameters,X1,...,XN) 형식의 함수로 정의할 수 있습니다. 여기서 parameters는 신경망 파라미터를 포함하고, X1,...,XNN개의 모델 입력값에 대한 입력 데이터에 해당하며, Y1,...,YMM개의 모델 출력값에 대응됩니다. 함수로 정의된 딥러닝 모델을 훈련시키려면 사용자 지정 훈련 루프를 사용하십시오. 예제는 Train Network Using Model Function 항목을 참조하십시오.

딥러닝 모델을 함수로 정의할 때는 학습 가능한 파라미터를 수동으로 초기화해야 합니다. 자세한 내용은 Initialize Learnable Parameters for Model Function 항목을 참조하십시오.

사용자 지정 신경망을 함수로 정의한 경우 모델 함수는 자동 미분을 지원해야 합니다. 다음 표에 나와 있는 딥러닝 연산을 사용할 수 있습니다. 여기에 나와 있는 함수는 일부에 불과합니다. dlarray 입력값을 지원하는 함수의 전체 목록은 List of Functions with dlarray Support 항목을 참조하십시오.

함수설명
attention어텐션 연산은 가중 곱셈 연산을 사용하여 입력값의 일부에 집중하여 연산을 수행합니다.
avgpool평균값 풀링 연산은 입력값을 풀링 영역으로 나누고 각 영역의 평균값을 계산하여 다운샘플링을 수행합니다.
batchnorm배치 정규화 연산은 각 채널에 대한 모든 관측값에서 입력 데이터를 독립적으로 정규화합니다. 컨벌루션 신경망의 훈련 속도를 높이고 신경망 초기화에 대한 민감도를 줄이려면 컨벌루션 연산과 비선형 계층(예: relu) 사이에 배치 정규화를 사용하십시오.
crossentropy교차 엔트로피 연산은 단일 레이블 및 다중 레이블 분류 작업에서 신경망 예측과 목표값 사이의 교차 엔트로피 손실을 계산합니다.
crosschannelnorm교차 채널 정규화 연산은 여러 채널의 국소 응답을 사용하여 각 활성화를 정규화합니다. 교차 채널 정규화는 일반적으로 relu 연산을 따릅니다. 교차 채널 정규화는 국소 응답 정규화라고도 합니다.
ctcCTC 연산은 정렬되지 않은 시퀀스 간의 연결주의적 시간 분류(CTC: Connectionist Temporal Classification) 손실을 계산합니다.
dlconv컨벌루션 연산은 입력 데이터에 슬라이딩 필터를 적용합니다. 딥러닝 컨벌루션, 그룹화된 컨벌루션 및 채널별로 분리 가능한 컨벌루션에 dlconv 함수를 사용합니다.
dlode45신경망 상미분 방정식(ODE) 연산은 지정된 ODE의 해를 반환합니다.
dltranspconv전치된 컨벌루션 연산은 특징 맵을 업샘플링합니다.
embed임베드 연산은 숫자형 인덱스를 숫자형 벡터로 변환합니다. 여기서 인덱스는 이산 데이터에 대응됩니다. 임베딩을 사용하여 categorical형 값이나 숫자형 벡터와 같은 이산 데이터를 매핑하십시오.
fullyconnect완전 연결 연산은 입력값에 가중치 행렬을 곱한 다음 편향 벡터를 더합니다.
geluGELU(Gaussian Error Linear Unit) 활성화 연산은 가우스 분포의 확률에 따라 입력값에 가중치를 부여합니다.
groupnorm그룹 정규화 연산은 각 관측값에 대해 그룹화된 채널 서브셋에서 입력 데이터를 독립적으로 정규화합니다. 컨벌루션 신경망의 훈련 속도를 높이고 신경망 초기화에 대한 민감도를 줄이려면 컨벌루션 연산과 비선형 계층(예: relu) 사이에 그룹 정규화를 사용하십시오.
gru게이트 순환 유닛(GRU) 연산을 사용하면 신경망이 시계열 및 시퀀스 데이터에서 시간 스텝 간의 종속성을 학습할 수 있습니다.
huberHuber 연산은 회귀 작업에서 신경망 예측과 목표값 사이의 Huber 손실을 계산합니다. 'TransitionPoint' 옵션이 1이면 smooth-L1 손실이라고도 합니다.
instancenorm인스턴스 정규화 연산은 각 관측값에 대해 각 채널에서 입력 데이터를 독립적으로 정규화합니다. 컨벌루션 신경망의 훈련 수렴을 개선하고 신경망 하이퍼파라미터에 대한 민감도를 줄이려면 컨벌루션 연산과 비선형 연산(예: relu) 사이에 인스턴스 정규화를 사용하십시오.
l1lossL1 손실 연산은 신경망 예측값과 목표값이 주어진 경우 L1 손실을 계산합니다. Reduction 옵션이 "sum"이고 NormalizationFactor 옵션이 "batch-size"일 때 계산된 값을 평균절대오차(MAE)라고 합니다.
l2lossL2 손실 연산은 신경망 예측값과 목표값이 주어진 경우 L2 손실(L2 노름의 제곱에 기반함)을 계산합니다. Reduction 옵션이 "sum"이고 NormalizationFactor 옵션이 "batch-size"일 때 계산된 값을 평균제곱오차(MSE)라고 합니다.
layernorm계층 정규화 연산은 각 관측값에 대해 모든 채널에서 입력 데이터를 독립적으로 정규화합니다. 순환 다층 퍼셉트론 신경망의 훈련 속도를 높이고 신경망 초기화에 대한 민감도를 줄이려면 학습 가능한 연산(예: LSTM, 완전 연결 연산) 다음에 계층 정규화를 사용하십시오.
leakyreluLeaky ReLU(Rectified Linear Unit) 계층 활성화 연산은 0보다 작은 모든 입력값에 고정된 스칼라 인자를 곱하는 비선형 임계값 연산을 수행합니다.
lstm장단기 기억(LSTM) 연산을 사용하면 신경망이 시계열 및 시퀀스 데이터에서 시간 스텝 간의 장기 종속성을 학습할 수 있습니다.
maxpool최댓값 풀링 연산은 입력값을 풀링 영역으로 나누고 각 영역의 최댓값을 계산하여 다운샘플링을 수행합니다.
maxunpool최댓값 언풀링 연산은 최댓값 풀링 연산의 출력값을 업샘플링하고 0으로 채워서 언풀링합니다.
mse평균제곱오차의 절반 연산은 회귀 작업에서 신경망 예측과 목표값 사이의 평균제곱오차의 절반을 취하는 손실을 계산합니다.
onehotdecode

one-hot 디코딩 연산은 분류 신경망의 출력값과 같은 확률 벡터를 분류 레이블로 디코딩합니다.

입력값 Adlarray가 될 수 있습니다. A의 형식이 지정된 경우 함수는 데이터 형식을 무시합니다.

reluReLU(Rectified Linear Unit) 활성화 연산은 0보다 작은 모든 입력값을 0으로 설정하는 비선형 임계값 연산을 수행합니다.
sigmoid시그모이드 활성화 연산은 입력 데이터에 시그모이드 함수를 적용합니다.
softmax소프트맥스 활성화 연산은 입력 데이터의 채널 차원에 소프트맥스 함수를 적용합니다.

사용자 지정된 훈련 루프 손실 함수 정의하기

심층 신경망 모델을 훈련시키는 것은 최적화 작업입니다. 딥러닝 모델을 함수 f(X;θ)(X가 모델 입력값이고 θ가 학습 가능한 파라미터 세트임)로 취급하면, 훈련 데이터를 바탕으로 어떤 손실 값을 최소화하도록 θ를 최적화할 수 있습니다. 예를 들어, 주어진 입력값 X와 이에 대응하는 목표값 T에 대해 예측값 Y=f(X;θ)와 T 간의 오차를 최소화하도록 학습 가능한 파라미터 θ를 최적화할 수 있습니다.

사용자 지정 훈련 루프를 사용하여 딥러닝 모델을 훈련시키려면 경사하강법 방법을 사용하여 손실을 최소화할 수 있습니다. 예를 들어 모델의 학습 가능한 파라미터를 반복적으로 업데이트하여 손실을 최소화할 수 있습니다. 예를 들어, lbfgsupdate, adamupdate, rmspropupdate, sgdmupdate 함수를 사용하여 학습 가능한 파라미터를 업데이트할 수 있으며, 이 경우 손실에 대한 학습 가능한 파라미터의 기울기가 필요합니다. 이 기울기를 계산하기 위해 자동 미분을 사용할 수 있습니다. 모델과 훈련 데이터를 받고, 학습 가능한 파라미터에 대한 손실과 손실의 기울기를 반환하는 사용자 지정 손실 함수를 만드십시오.

dlnetwork 객체로 지정된 모델의 경우, [loss,gradients] = modelLoss(net,X,T) 형식의 함수를 만듭니다. 여기서 net은 신경망이고, X는 신경망 입력값이고, T는 목표값을 포함하고, lossgradients는 각각 반환된 손실과 반환된 기울기입니다. 선택적으로, 기울기 함수에 추가 인수를 전달하거나(예: 손실 함수에 추가 정보가 필요한 경우) 추가 인수를 반환할 수 있습니다(예: 업데이트된 신경망 상태).

함수로 지정된 모델의 경우, [loss,gradients] = modelLoss(parameters,X,T) 형식의 함수를 만듭니다. 여기서 parameters는 학습 가능한 파라미터를 포함하고, X는 모델 입력값이고, T는 목표값을 포함하고, lossgradients는 각각 반환된 손실과 반환된 기울기를 포함합니다. 선택적으로, 기울기 함수에 추가 인수를 전달하거나(예: 손실 함수에 추가 정보가 필요한 경우) 추가 인수를 반환할 수 있습니다(예: 업데이트된 모델 상태).

modelLoss 함수에서 기울기를 계산하려면 dlgradient 함수를 사용하십시오.

사용자 지정 훈련 루프를 위해 모델 손실 함수를 정의하는 것에 대한 자세한 내용은 Define Model Loss Function for Custom Training Loop 항목을 참조하십시오.

사용자 지정 손실 함수를 사용하여 영상을 생성하는 생성적 적대 신경망(GAN)을 훈련시키는 방법을 보여주는 예제는 생성적 적대 신경망(GAN) 훈련시키기 항목을 참조하십시오.

자동 미분을 사용하여 학습 가능한 파라미터 업데이트하기

자동 미분을 사용하여 모델 손실 함수를 평가하려면, 자동 미분이 활성화된 상태로 함수를 평가하는 dlfeval 함수를 사용하십시오. dlfeval의 첫 번째 입력값으로는 함수 핸들로 지정된 모델 손실 함수를 전달합니다. 이어지는 입력값으로는 모델 손실 함수에 필요한 변수를 전달합니다. dlfeval 함수의 출력값으로는 모델 손실 함수와 동일한 출력값을 지정합니다.

학습 가능한 파라미터를 업데이트하기 위해 다음 함수를 사용할 수 있습니다.

함수설명
adamupdateAdam(적응적 모멘트 추정)을 사용하여 파라미터 업데이트
rmspropupdateRMSProp(RMS 전파)를 사용하여 파라미터 업데이트
sgdmupdateSGDM(모멘텀을 사용한 확률적 경사하강법)을 사용하여 파라미터 업데이트
lbfgsupdate메모리 제한 BFGS(L-BFGS)를 사용하여 파라미터 업데이트
dlupdate사용자 지정 함수를 사용하여 파라미터 업데이트

예를 들어 SGDM을 사용하여 학습 가능한 파라미터를 업데이트하려면 사용자 지정 훈련 루프의 각 반복에서 다음을 사용하십시오.

[loss,gradients] = dlfeval(@modelLoss,net,X,T);
[net,velocity] = sgdmupdate(net,gradients,velocity,learnRate,momentum);

참고 항목

| | |

관련 항목