Supervised neural network의 exercise를 끝내고, Convolutional neural network의 exercise를 해보았다.
Neural network, 특히 CNN에 관심이 있다면 매우 훌륭한 tutorial이라고 생각된다.
Linear regression부터 차근차근 MATLAB으로 실습하면서 배울 수 있다.



여기서부터는 구현하면서 잡설

MNIST input -> Convolution -> Pooling -> Softmax 의 구성.
Softmax layer의 delta와 gradient를 구하는 것은 기존의 supervised neural network에서와 동일.
Pooling layer와 conv layer에 error를 전파하는 것을 개념적으로 이해하는것이 중요.
delta_pool = (Wd' * delta_softmax); % no activate function (pooling layer)
Pooling layer는 activation function이 없기 때문에 f’(z^L) 은 항상 1이다. (identical function)
Conv. layer는 아래와 같이 구한다.
delta_conv = delta_pool2 .* (activations .* (1 - activations));

이전의 supervised nn 실습에서는 W를 앞에 곱해주었는데, 여기서 delta_conv를 구할때는 W를 곱하지 않는다.
Conv layer의 filter는 fully connected layer의 W와 다르게 특정 neuron들에 묶여 있기 때문에, 
Conv. filter와 pooling error와의 연산은 filter gradient를 구할 때 한번에 다음과 같이 계산해준다. 
        Wc_grad(:,:,filterIdx) = Wc_grad(:,:,filterIdx) + ...
            conv2(images(:,:,imageIdx), ...
            rot90(delta_conv(:,:,filterIdx, imageIdx), 2), 'valid');
위에서도 말했듯이, convolution의 weight는 fully connected와 다르게 특정 뉴런들에 묶여 있으므로 fully connected와 계산이 다르게 된다.
정답 코드를 보면 conv_delta error와 이미지를 convolution해서 gradient를 구한다.
결국 미분해보면 같은 식으로 나올지 ?? (fully connected 는 미분식이 W^T * delta 인데..)

Tutorial의 exercise에서 시키는대로 구현해보았더니 iteration을 돌다가 발산해 버려서 할 수 없이 솔루션코드를 보고 문제점을 찾았더니, 
문제는 learning rate를 주는 부분에서 각 weight parameter별로 gradient의 2norm을 분모로 alpha를 나눈 값을 learning rate로 사용한다.
        if isempty(sum_gradients)
            sum_gradients = grad .^ 2;
        else
            sum_gradients = sum_gradients + grad .^ 2;
        end
        learning_rate = alpha ./ sqrt(1 + sum_gradients);
즉, 어떤 parameter의 gradient 값을 그대로 update에 사용하는 것이 아니라, normalization을 하여 사용하겠다는 것으로 생각된다.
(어떤 weight가 작은 값의 gradient 들이 나오다가 큰 값이 나오는 경우, 큰 값이 계속 나오던 경우보다 weight에 많이 반영하게 될 듯.)



결과: 


동일한 learning rate alpha를 준 경우 (발산한다)

        velocity = mom * velocity + alpha * grad;
        theta = theta - velocity;

>> cnnTrain
Epoch 1: Cost on iteration 1 is 638.789275
Epoch 1: Cost on iteration 2 is Inf
Epoch 1: Cost on iteration 3 is 1457.666470
Epoch 1: Cost on iteration 4 is 1581.362140
Epoch 1: Cost on iteration 5 is 1467.729831
Epoch 1: Cost on iteration 6 is 1894.806809
Epoch 1: Cost on iteration 7 is 1695.544653
Epoch 1: Cost on iteration 8 is 1877.625576
Epoch 1: Cost on iteration 9 is 1737.336655
Epoch 1: Cost on iteration 10 is 1739.594208
Epoch 1: Cost on iteration 11 is 1589.624996
Epoch 1: Cost on iteration 12 is 1731.826654
Epoch 1: Cost on iteration 13 is Inf
Epoch 1: Cost on iteration 14 is 2671.770646
Epoch 1: Cost on iteration 15 is 2860.173187
Epoch 1: Cost on iteration 16 is 3144.917557
Epoch 1: Cost on iteration 17 is 3525.974768
Epoch 1: Cost on iteration 18 is 2933.235133
Epoch 1: Cost on iteration 19 is 2893.149310
Epoch 1: Cost on iteration 20 is 3454.369426
Epoch 1: Cost on iteration 21 is 2851.723443
Epoch 1: Cost on iteration 22 is Inf
Epoch 1: Cost on iteration 23 is NaN
Epoch 1: Cost on iteration 24 is NaN
Epoch 1: Cost on iteration 25 is NaN
Epoch 1: Cost on iteration 26 is NaN
...



각 parameter마다 다르게 learning rate를 주는 경우

        velocity = mom * velocity + learning_rate .* grad;
        theta = theta - velocity;

>> cnnTrain
Epoch 1: Cost on iteration 1 is 609.508667
Epoch 1: Cost on iteration 2 is 25406.446805
Epoch 1: Cost on iteration 3 is 20452.159696
Epoch 1: Cost on iteration 4 is 8794.225061
Epoch 1: Cost on iteration 5 is 8655.889132
Epoch 1: Cost on iteration 6 is 3925.461289
Epoch 1: Cost on iteration 7 is 2139.816842
Epoch 1: Cost on iteration 8 is 1805.844468
Epoch 1: Cost on iteration 9 is 1275.379768
Epoch 1: Cost on iteration 10 is 1151.133646
Epoch 1: Cost on iteration 11 is 859.827331
Epoch 1: Cost on iteration 12 is 617.373896
Epoch 1: Cost on iteration 13 is 509.149070
Epoch 1: Cost on iteration 14 is 404.800826
Epoch 1: Cost on iteration 15 is 365.095783
Epoch 1: Cost on iteration 16 is 308.166993
Epoch 1: Cost on iteration 17 is 324.043019
Epoch 1: Cost on iteration 18 is 302.039560
Epoch 1: Cost on iteration 19 is 328.277577
Epoch 1: Cost on iteration 20 is 292.860982
...






결과
Accuracy is 0.980100


Posted by 헬벨