Main Content

얕은 다층 신경망 훈련시키고 적용하기

딥러닝 신경망을 훈련시키려면 trainNetwork를 사용하십시오.

이 항목에서는 일반적인 얕은 다층 신경망 워크플로의 일부를 보여줍니다. 자세한 내용과 그 밖의 단계는 얕은 다층 신경망과 역전파 훈련 항목을 참조하십시오.

신경망 가중치와 편향을 초기화했으면 신경망을 훈련시킬 준비가 된 것입니다. 다층 피드포워드 신경망은 함수 근사(비선형 회귀) 또는 패턴 인식을 위해 훈련시킬 수 있습니다. 훈련 과정에는 올바른 신경망 동작에 대한 일련의 예, 즉 신경망 입력값 p와 목표 출력값 t가 필요합니다.

신경망을 훈련시키는 과정에는 신경망의 가중치 및 편향 값을 조정하여 신경망 성능을 최적화하는 작업이 포함됩니다. 신경망 성능은 신경망 성능 함수 net.performFcn으로 정의됩니다. 피드포워드 신경망의 디폴트 성능 함수는 평균 제곱 오차 mse, 즉 신경망 출력값 a와 목표 출력값 t 사이의 평균 제곱 오차입니다. 이는 다음과 같이 정의됩니다.

F=mse=1Ni=1N(ei)2=1Ni=1N(tiai)2

(개별 제곱 오차에는 가중치가 적용될 수 있습니다. Train Neural Networks with Error Weights 항목을 참조하십시오.) 훈련을 구현하는 방법에는 증분 모드와 배치 모드, 두 가지가 있습니다. 증분 모드에서는 각 입력값이 신경망에 적용된 후에 기울기가 계산되고 가중치가 업데이트됩니다. 배치 모드에서는 가중치가 업데이트되기 전에 훈련 세트에 있는 모든 입력값이 신경망에 적용됩니다. 이 항목에서는 train 명령을 사용하여 배치 모드에 대해 설명합니다. adapt 명령을 사용한 증분 훈련에 대해서는 적응을 사용한 증분 훈련 항목에서 설명합니다. 대부분의 문제에서, Deep Learning Toolbox™를 사용할 때 배치 훈련이 증분 훈련보다 훨씬 빠르고 생성되는 오차도 작습니다.

다층 피드포워드 신경망 훈련의 경우, 임의의 표준적인 수치 최적화 알고리즘을 사용하여 성능 함수를 최적화할 수 있지만, 신경망 훈련에서 특히 뛰어난 성능을 보이는 몇 가지 주요 알고리즘이 존재합니다. 이러한 최적화 방법은 신경망 가중치에 대한 신경망 성능의 기울기를 사용하거나 가중치에 대한 신경망 오차의 야코비 행렬을 사용합니다.

기울기와 야코비 행렬은 역전파 알고리즘이라는 기법을 사용하여 계산됩니다. 역전파 알고리즘은 신경망을 거꾸로 통과하여 계산을 수행합니다. 역전파 계산은 미적분의 연쇄 법칙을 사용하여 유도되었으며, [HDB96]의 11장(기울기)과 12장(야코비 행렬)에서 설명합니다.

훈련 알고리즘

훈련이 작동하는 방식에 대한 예로, 가장 간단한 최적화 알고리즘인 경사하강법을 살펴보겠습니다. 경사하강법은 성능 함수가 가장 빠르게 감소하는 방향, 즉 기울기의 음의 방향으로 신경망 가중치와 편향을 업데이트합니다. 이 알고리즘의 1회 반복은 다음과 같이 작성할 수 있습니다.

xk+1=xkαkgk

여기서 xk는 현재 가중치 및 편향으로 구성된 벡터이고 gk는 현재 기울기이고 αk는 학습률입니다. 이 방정식은 신경망이 수렴할 때까지 반복됩니다.

다음 표에는 Deep Learning Toolbox에서 사용할 수 있는 훈련 알고리즘 중 기울기 또는 야코비 행렬 방법을 사용하는 훈련 알고리즘 목록이 나와 있습니다.

이러한 몇 가지 기법에 대한 상세한 설명은 Hagan, M.T., H.B. Demuth, and M.H. Beale, Neural Network Design, Boston, MA: PWS Publishing, 1996, 11장과 12장을 참조하십시오.

함수

알고리즘

trainlm

Levenberg-Marquardt

trainbr

베이즈 정규화

trainbfg

BFGS 준뉴턴

trainrp

탄력적 역전파

trainscg

스케일링된 켤레 기울기

traincgb

Powell/Beale 재시작 알고리즘을 사용한 켤레 기울기

traincgf

Fletcher-Powell 켤레 기울기

traincgp

Polak-Ribiére 켤레 기울기

trainoss

1스텝 할선법

traingdx

가변 학습률 경사하강법

traingdm

모멘텀을 사용한 경사하강법

traingd

경사하강법

가장 빠른 훈련 함수는 일반적으로 trainlm이며, 이것은 feedforwardnet의 디폴트 훈련 함수입니다. 준뉴턴 방법인 trainbfg도 상당히 빠릅니다. 이 두 방법은 수천 개의 가중치를 갖는 큰 신경망의 경우 더 많은 메모리와 계산 시간이 필요하므로 비교적 덜 효율적입니다. 또한, trainlm은 패턴 인식 문제보다 함수 피팅(비선형 회귀) 문제에서 더 나은 성능을 보입니다.

큰 신경망을 훈련시킬 때와 패턴 인식 신경망을 훈련시킬 때는 trainscgtrainrp가 적당합니다. 이러한 훈련 함수는 메모리 요구 사항이 상대적으로 작으면서도 표준 경사하강법 알고리즘보다 훨씬 빠릅니다.

위 표에 표시된 훈련 알고리즘의 전체 성능 비교를 보려면 다층 신경망 훈련 함수 선택하기 항목을 참조하십시오.

잠시 용어에 대해 설명하자면, “역전파”라는 용어가 신경망 훈련에서 사용되는 경우, 구체적으로 경사하강법 알고리즘을 지칭하는 경우가 있습니다. 신경망을 거꾸로 통과하여 계산을 수행함으로써 기울기와 야코비 행렬을 계산하는 절차는 위에 나열된 모든 훈련 함수에 적용되므로 여기서는 이 용어를 사용하지 않습니다. 역전파라는 용어만 단독으로 사용하는 것보다 사용되는 구체적인 최적화 알고리즘의 이름을 사용하는 것이 더욱 명확합니다.

또한, 다층 신경망을 역전파 신경망이라고 하는 경우도 있습니다. 그러나 다층 신경망에서 기울기와 야코비 행렬을 계산하는 데 사용되는 역전파 기법은 여러 다른 신경망 아키텍처에도 적용될 수 있습니다. 실제로 미분 가능한 전달 함수, 가중치 함수 및 순 입력 함수를 갖는 임의의 신경망의 기울기와 야코비 행렬은 Deep Learning Toolbox에서 역전파 절차를 통해 계산할 수 있습니다. 사용자 고유의 사용자 지정 신경망을 만들어서 위 표에 나와 있는 아무 훈련 함수나 사용하여 훈련시킬 수도 있습니다. 기울기와 야코비 행렬은 자동으로 계산됩니다.

훈련 예제

훈련 과정을 볼 수 있도록 다음 명령을 실행해 보겠습니다.

load bodyfat_dataset
net = feedforwardnet(20);
[net,tr] = train(net,bodyfatInputs,bodyfatTargets);

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

이때 train 함수에 의해 구성이 자동으로 수행되므로 configure 명령을 사용할 필요가 없다는 사실을 알 수 있습니다. 다음 그림에 표시된 대로 훈련 중에 훈련 창이 나타납니다. (훈련 중에 이 창을 표시하지 않으려면 파라미터 net.trainParam.showWindowfalse로 설정하면 됩니다. 훈련 정보를 명령줄에 표시하려면 파라미터 net.trainParam.showCommandLinetrue로 설정하면 됩니다.)

이 창에서 데이터가 dividerand 함수를 사용하여 분할되었고 Levenberg-Marquardt(trainlm) 훈련 방법과 평균 제곱 오차 성능 함수가 사용된 것을 볼 수 있습니다. 이것은 feedforwardnet에 대한 디폴트 설정이기도 합니다.

훈련 중에 훈련 창에 계속해서 진행 상황이 표시됩니다. 가장 주목할 것은 성능, 성능 기울기의 크기 및 검증 확인 횟수입니다. 기울기 크기와 검증 확인 횟수는 훈련을 종료하는 데 사용됩니다. 훈련이 성능 최솟값에 도달하면 기울기가 매우 작아집니다. 기울기 크기가 1e-5보다 작아지면 훈련이 중지됩니다. 이 한도는 파라미터 net.trainParam.min_grad를 설정하여 조정할 수 있습니다. 검증 확인 횟수는 검증 성능이 떨어지지 않고 연속으로 반복이 이루어지는 횟수를 나타냅니다. 횟수가 6(디폴트 값)이 되면 훈련이 중지됩니다. 이번 실행에서는 훈련이 검증 확인 횟수로 인해 중지되었음을 볼 수 있습니다. 이 조건은 파라미터 net.trainParam.max_fail을 설정하여 변경할 수 있습니다. (초기 가중치와 편향이 무작위로 설정되므로 사용자의 결과가 그림의 훈련 결과와 다를 수 있습니다.)

신경망 훈련을 중지시키는 데 사용할 수 있는 다른 조건도 있습니다. 다음 표에 이러한 조건이 나열되어 있습니다.

파라미터

중지 기준

min_grad

최소 기울기 크기

max_fail

검증 증가의 최대 횟수

time

최대 훈련 시간

goal

최소 성능 값

epochs

최대 훈련 Epoch 횟수(반복)

훈련 창의 중지 버튼을 클릭해도 훈련이 중지됩니다. 여러 반복을 거치면서도 성능 함수가 현저히 감소하지 않는다면 이 방법으로 중지해야 할 수 있습니다. 위에 나와 있는 train 명령을 사용하면 언제든지 훈련을 계속할 수 있습니다. 직전 실행이 완료된 시점부터 신경망이 계속해서 훈련됩니다.

훈련 창에서 성능, 훈련 상태, 오차 히스토그램 및 회귀와 같은 네 가지 플롯에 액세스할 수 있습니다. 성능 플롯에는 반복 횟수에 대한 성능 함수 값이 표시됩니다. 또한, 성능 플롯에는 훈련, 검증 및 테스트 성능이 플로팅됩니다. 훈련 상태 플롯에는 기울기 크기, 검증 확인 횟수 등과 같은 기타 훈련 변수의 진행 상황이 표시됩니다. 오차 히스토그램 플롯에는 신경망 오차 분포가 표시됩니다. 회귀 플롯에는 신경망 출력값과 신경망 목표값 사이의 회귀가 표시됩니다. 훈련 후에 얕은 신경망 성능 분석하기에서 설명하는 대로, 히스토그램 플롯과 회귀 플롯을 사용하여 신경망 성능을 검증할 수 있습니다.

신경망 사용하기

신경망의 훈련 및 검증이 완료된 후에는 network 객체를 사용하여 임의의 입력값에 대한 신경망 응답을 구할 수 있습니다. 예를 들어, 운동 데이터 세트의 다섯 번째 입력 벡터에 대한 신경망 응답을 구하려면 다음을 사용할 수 있습니다.

a = net(bodyfatInputs(:,5))
a =

   27.3740

이 명령을 사용할 경우 신경망이 초기화되었을 때의 난수 생성기의 상태에 따라 출력값이 다를 수 있습니다. 아래에서는 체지방 데이터 세트의 모든 입력 벡터의 동시 세트에 대한 출력값을 계산하기 위해 network 객체가 호출되었습니다. 이것은 시뮬레이션의 배치 모드 형식이며, 이 형식에서는 모든 입력 벡터가 하나의 행렬에 놓입니다. 이 방법은 벡터를 한 번에 하나씩 입력하는 것보다 훨씬 효율적입니다.

a = net(bodyfatInputs);

신경망을 훈련시킬 때마다 초기 가중치와 편향 값이 달라지고 데이터를 훈련 세트, 검증 세트, 테스트 세트로 분할하는 게 달라지므로 해가 다를 수 있습니다. 그 결과, 같은 문제에 대해 훈련받은 여러 신경망이 같은 입력에 대해 서로 다른 출력값을 제공할 수 있습니다. 정확도가 양호한 신경망을 발견한 것인지 확인하려면 여러 번 다시 훈련시키십시오.

더 높은 정확도를 원하는 경우 초기 해를 개선하기 위한 몇 가지 다른 기법이 있습니다. 자세한 내용은 얕은 신경망 일반화를 개선하고 과적합 방지하기 항목을 참조하십시오.