brunch

You can make anything
by writing

C.S.Lewis

by 라인하트 Jan 10. 2021

머신러닝 옥타브 실습(4-3):신경망손글씨 인식

   온라인 강의 플랫폼 코세라의 창립자인 앤드류 응 (Andrew Ng) 교수는 인공지능 업계의 거장입니다. 그가 스탠퍼드 대학에서 머신 러닝 입문자에게 한 강의를 그대로 코세라 온라인 강의 (Coursera.org)에서 무료로 배울 수 있습니다. 이 강의는 머신러닝 입문자들의 필수코스입니다. 인공지능과 머신러닝을 혼자 공부하면서 자연스럽게 만나게 되는 강의입니다. 



Programming Exercise 4: Neural Networks Learning

프로그래밍 실습 4 : 신경망 학습   


2. Backpropagation (역전파)


   In this part of the exercise, you will implement the backpropagation algo- rithm to compute the gradient for the neural network cost function. You will need to complete the nnCostFunction.m so that it returns an appropriate value for grad. Once you have computed the gradient, you will be able to train the neural network by minimizing the cost function J(Θ) using an advanced optimizer such as fmincg.

   You will first implement the backpropagation algorithm to compute the gradients for the parameters for the (unregularized) neural network. After you have verified that your gradient computation for the unregularized case is correct, you will implement the gradient for the regularized neural network.


   이번 실습은 신경망 비용 함수에 대한 기울기를 계산하기 위해 역 전파 알고리즘을 구현합니다.  nnCostFunction.m 파일에 코드를 작성하고  변수 grad로 적정한 값을 반환합니다. 기울기를 계산한 후에 fmincg() 함수로 고급 최적화 프로그램을 사용하여 비용 함수 J(Θ)를 최소화하는 신경망을 훈련할 수 있습니다. 

   정규화하지 않은 신경망의 파라미터를 위한 경사를 계산하기 위해 역전파 알고리즘을 구현합니다. 정규화되지 않은 ㄱ여우에 기울기 계산이 제대로 되었는 지를 확인한 후 정규화된 신경망에 대한 기울기를 구현합니다. 


2.1 Sigmoid gradient (시그모이드 기울기)


  To help you get started with this part of the exercise, you will first implement the sigmoid gradient function. The gradient for the sigmoid function can be computed as


   When you are done, try testing a few values by calling sigmoidGradient(z) at the Octave/MATLAB command line. For large values (both positive and negative) of z, the gradient should be close to 0. When z = 0, the gradi- ent should be exactly 0.25. Your code should also work with vectors and matrices. For a matrix, your function should perform the sigmoid gradient function on every element.

   You should now submit your solutions.


   이번 실습은 시그모이드 기울기 함수를 구현합니다. 시그모이드 함수 기울기는 다음과 같습니다. sigmoidGradient(z)를 호출하여 몇 가지 값을 테스트합니다. z의 값이 큰 경우에 기울기는 0에 가깝습니다. 정확히는 0.25입니다. 코드는 벡터 및 행렬에서 동작해야 합니다. 행렬은 모든 성분에 대해 시그모이드 기울기 함수가 동작합니다. 

    완료된 후 솔루션을 제출합니다. 


<해설>


(1) 데이터 업로드 및 기본 변수 설정 


clear; close all; clc         

load ('ex4data1.mat');  % 5000X 400의 손글씨 숫자 흑백 이미지 행렬을 업로드   

[m, n] = size(X);              % 행렬 X가 5000X 400차원일 때 m = 5000, n= 400    


(2) 신경망 변수 설정


input_layer_size  = 400;    % 20x20 이미지를 입력하기 위한 유닛 수

hidden_layer_size = 25;     % 25 은닉 유닛의 수 

num_labels = 10;                   % 멀티 클래스의 수, 0은 10으로 처리


load('ex4weights.mat');   

nn_params = [Theta1(:) ; Theta2(:)];   % Theta1과 Theta2를 벡터로 변환하고 합침 

lambda = 1;                          % 정규화 파라미터 λ를 초기화                 


(3) sigmoidGradient.m 파일 분석


function g = sigmoidGradient(z)

%SIGMOIDGRADIENT z에 대한 시그모이드 함수의 기울기를 반환 

%

%   g = SIGMOIDGRADIENT(z) z에 대한 시그모이드 함수의 기울기를 반환

%   z는 스칼라, 행렬 또는 벡터일 경우 성분에 대한 기울기를 반환


g = zeros(size(z));   % z의 차원에 맞추어 g를 초기화


% ====================== YOUR CODE HERE ======================

% Instructions:  z에 대한 시그모이드 함수의 기울기를 계산  

%                          z는 스칼라, 행렬 또는 벡터





% =============================================================


end


(4) 시그모이드 기울기의 이해


   역전파 알고리즘을 통해 δ


   역전파란 이름은 δ의 계산을 출력층부터 시작해서 세 번째 은닉층의 δ^(3)를 거쳐 δ^(2)까지 

역으로 계산한다는 의미로 붙여졌습니다. δ^(l)j는  l 번째 층의 j 노드가 오차가 있는 지를 나타냅니다.  a^(l)j는 l층에 있는 j유닛의 활성화 함수이고, δ^(l)j는 활성화된 노드의 오차를 나타냅니다. 시그모이드 함수 g(z)에 대한 미분이 g'(z)입니다. 미분 결과는 다음과 같습니다. 


     g'(z) = g(z) .*(1- g(z))


   옥타브 프로그램에서 수식으로 표현하면 다음과 같습니다. 

   

    g = sigmoid(z) .* (1-sigmoid(z));

   


(5) sigmoid() 함수 분석

   sigmoid() 함수는 로지스틱 회귀 실습에서 제일 먼저 구현한 함수입니다. 너무 잘 알고 있는 함수이므로 함수의 내용만 공유합니다.



 function g = sigmoid(z)

%SIGMOID Compute sigmoid functoon

%   J = SIGMOID(z) computes the sigmoid of z.


g = 1.0 ./ (1.0 + exp(-z));

end


< 정답>


function g = sigmoidGradient(z)

%SIGMOIDGRADIENT z에 대한 시그모이드 함수의 기울기를 반환 

%

%   g = SIGMOIDGRADIENT(z) z에 대한 시그모이드 함수의 기울기를 반환

%   z는 스칼라, 행렬 또는 벡터일 경우 성분에 대한 기울기를 반환


g = zeros(size(z));   % z의 차원에 맞추어 g를 초기화


% ====================== YOUR CODE HERE ======================

% Instructions:  z에 대한 시그모이드 함수의 기울기를 계산  

%                          z는 스칼라, 행렬 또는 벡터



    g = sigmoid(z) .* (1-sigmoid(z));



% =============================================================


end


<결과 확인>


clear; close all; clc         

load ('ex4data1.mat');    

[m, n] = size(X);              


input_layer_size  = 400;    

hidden_layer_size = 25;     

num_labels = 10;                 


load('ex4weights.mat');   

nn_params = [Theta1(:) ; Theta2(:)];     


z = [-1 -0.5 0 0.5 1];               % z를 지정

g = zeros(size(z));                  % g를 초기화

g = sigmoidGradient(z);         % sigmoidGradient(z)를 호출



>> g = sigmoidGradient([-1 -0.5 0 0.5 1])

g =

   0.19661   0.23500   0.25000   0.23500   0.19661




매거진의 이전글 머신러닝 옥타브 실습(4-2):신경망손글씨 인식
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari