정보공간_1

[4기 부산 김한남] Hopfield Network를 이용한 패턴 인식#2 본문

IT 놀이터/Elite Member Tech & Talk

[4기 부산 김한남] Hopfield Network를 이용한 패턴 인식#2

알 수 없는 사용자 2013. 10. 24. 18:44

안녕하세요!? 부산 멤버십 22-1기 김한남 회원입니다. 

이번 회는 지난 회에 이어서 Hopfield Network 알고리즘에 대한 얘기를 계속 이어가려 합니다. 지난 회에서 홉필드 네트워크에 대한 개념과 구조에 대한 설명을 드렸었는데요. 알고리즘에 대한 수학적인 구조나 설명만 듣고서는 동작 방식을 이해하기가 다소 어려울 수 있습니다. 

그래서 이번 회에는 홉필드 네트워크 알고리즘을 이용하여 간단한 패턴 인식을 설계하고 구현해보는 예제를 하나 진행해보려 합니다. 실제 서비스를 위해 연구되거나 응용되는 수준의 시스템을 여러분들께 보여드리기 위해서는 글 내용이 너무 방대해지기 때문에 그렇게는 못 하지만, 간단히 제가 준비한 두 개의 패턴을 학습하고 그 후 어떤 불완전한 입력에 대해서 어떤 결과를 수렴하는지 여러분들께 보여드리려고 합니다. 

자, 그럼 본격적으로 제가 준비한 예제를 진행해보겠습니다.


제가 학습시킬 패턴은 다음과 같습니다. 

 

 

 학습 패턴 'ㄱ'

학습 패턴 'ㄴ' 


'ㄱ', 'ㄴ'을 이차원 배열 4×4 크기로 위와 같이 디자인하였고, 쉬운 계산을 위해 일차원 배열로 다음과 같이 표현하였습니다. 

 

 'ㄱ'

 

 'ㄴ'

일차원 배열로 본다면 입력 패턴의 크기가 총 16(4×4)이므로 학습 가중치 행렬의 크기는 16×16이 됩니다. 그럼 본격적으로 학습을 시작해보겠습니다.


< 학습 >

학습 식에 의해 가중치 집합 W는 다음과 같습니다. 



그리고 위 식을 다음과 같이 표현할 수 있습니다. 
여러분들의 빠른 이해를 위해 식을 직접 풀어 보았습니다. 





계산된 학습 가중치 집합(W)은 다음과 같은데, 결과를 유심히 보면 행렬의 대각 요소가 모두 0이고 행렬의 형태가 대칭 행렬인 것을 알 수 있습니다. 즉, 계산이 제대로 되었다면 학습 가중치 집합(W)은 대칭 행렬을 나타냅니다. 


자, 이제 학습을 완료했습니다. Perceptron 알고리즘과는 달리 반복적으로 가중치 집합을 수정하는 구조가 아니라 학습 과정이 굉장히 심플하단 것을 알 수 있습니다.



< 검증 >

다음으로 학습이 제대로 되었는지 검증을 해보도록 하겠습니다. 검증 과정은 학습한 데이터('ㄱ','ㄴ')들을 입력으로 각각 주었을 때 결과로 입력한 그대로를 출력하는지를 보면 됩니다. 검증은 인식과 동일한 식을 이용하여 첫 번째 뉴런부터 마지막 뉴런까지 차례대로 계산하는 방식으로 진행하겠습니다. 만약 학습한 그대로의 데이터를 입력시켰는데 그대로의 데이터가 출력되지 않는다면 학습 과정에서 문제가 생긴 것입니다. 

인식을 위한 식에 의한 각각의 뉴런에 대한 결과값은 다음과 같이 계산됩니다. 



Y1 = 1 + (2+2+2+2+2) = 11

func(Y1) = 1


Y2 = 1 + (2+2+2+2+2+2+2+2+2) = 19

func(Y2) = 1


Y3 = 1 + (2+2+2+2+2+2+2+2+2) = 19

func(Y3) = 1

Y4 = 1 + (2+2+2+2+2+2+2+2+2) = 19

func(Y4) = 1


Y5 = -1 + (-2-2-2-2-2-2-2-2-2) = -19

func(Y5) = -1


Y6 = -1+(-2-2-2-2-2) = -10

func(Y6) = -1


Y7 = -1+(-2-2-2-2-2) = -11

func(Y7) = -1


Y8 = 1 + (2+2+2+2+2+2+2+2+2) = 11

func(Y8) = 1


Y9 = -1+(-2-2-2-2-2-2-2-2-2) = -19

func(Y9) = -1


Y10 = -1 + (-2-2-2-2-2) = -11

func(Y10) = -1


Y11 = -1 + (-2-2-2-2-2) = -11

func(Y11) = -1


Y12 = 1 + (2+2+2+2+2+2+2+2) = 19

func(Y12) = 1


Y13 = -1 + (-2-2-2-2-2-2-2-2-2) = -19

func(Y13) = -1


Y14 = -1 + (-2-2-2-2-2-2-2-2-2) = -19

func(Y14) = -1


Y15 = -1 + (-2-2-2-2-2-2-2-2-2) = -19

func(Y15) = -1


Y16 = 1 + (2+2+2+2+2) = 11

func(Y16) = 1



[ 입력값 ]



[ 출력값 ]


와우! 입력한 값이 그대로 출력되었습니다!

즉, 입력 값 ‘ㄱ’에 대하여 정상 인식된다는 것을 알 수 있습니다. 원래대로라면 학습시킨 입력 값 전부('ㄱ', 'ㄴ')에 대하여 검증을 진행하여야 하지만, 내용이 너무 길어지므로 'ㄱ’에 대한 검증 과정만 진행하기로 하겠습니다.


< 인식 >

이제 어떤 불완전한 입력에 대하여 홉필드 네트워크가 결과를 어떻게 출력(인식)하는지 확인해보도록 하겠습니다. 아래와 같은 패턴을 입력값으로 주도록 하겠습니다.



'입력 패턴'

 'ㄱ'

 

 

 'ㄴ'

 

 


'어떤 패턴과 더 비슷한가요?
'


눈으로 분별하여 볼 때 입력 데이터는 ‘ㄱ’과 ‘ㄴ’ 두 패턴 중에 ‘ㄱ’에 더 가까운 패턴임을 알 수 있습니다. 


그러므로 홉필드 네트워크가 이를 올바르게 인식한다면 결과는 ‘ㄱ’을 출력할 것입니다. 이차원 배열 형태의 입력 패턴을 쉬운 계산을 위해 다음과 같이 일차원 배열로 보도록 하겠습니다.



그럼 위와 동일한 방법으로 각 뉴런에 대한 출력을 보도록 하겠습니다.

Y1 = 1 + (2+2-2+2+2) = 7

func(Y1) = 1


Y2 = 1 + (-2+2+2+2+2-2+2+2+2) = 11

func(Y2) = 1


Y3 = -1 + (2+2+2+2+2-2+2+2+2) = 13

func(Y3) = 1

*값이 바뀌었네요!


Y4 = 1 + (2-2+2+2+2-2+2+2+2) = 11

func(Y4 = 1


Y5 = -1 + (-2+2-2-2-2+2-2-2-2) = -11

func(Y5) = -1


Y6 = -1 + (-2-2+2-2-2) = -7

func(Y6) = -1


Y7 = -1 + (-2-2+2-2-2) = -7

func(Y7) = -1


Y8 = 1 + (2-2+2+2+2-2+2+2+2) = 11

func(Y8) = 1


Y9 =1 + (2+2-2+2+2) = 7

func(Y9) = 1


Y10 = 1 + (-2-2-2-2-2) = -9

func(Y10) = -1

*값이 바뀌었습니다!

Y11 = -1 + (-2-2-2+2-2) = -7

func(Y11) = -1


Y12 = -1 + (2-2+2+2+2+2+2+2+2) = 13

func(Y12) = 1

*값이 바뀌었습니다!


Y13 = -1 + (-2+2-2-2-2-2+2-2-2) = -11

func(Y13) = -1


Y14 = -1 + (-2+2-2-2-2-2+2-2-2) = -11

func(Y14) = -1


Y15 = -1 + (-2+2-2-2-2-2+2-2-2) = -11

func(Y15) = -1


Y16 = 1 + (2+2+2-2+2) = 7

func(Y16) = 1



이렇게 총 16개의 뉴런에 대해 각각의 출력을 계산해 본 결과 다음과 같은 값이 출력되었습니다. 


 

 입력값

 

 출력값


출력값을 이차원 배열로 표현하면 다음 패턴과 같습니다.


와우! 불완전한 데이터로 ‘ㄱ’을 완벽하게 연상(인식) 해냈습니다! 

3번, 10번, 12번 뉴런의 값이 변경되면서 단번에 'ㄱ'으로 결과를 수렴한 것입니다. 이제 홉필드 네트워크가 어떻게 동작하는지 감이 오시나요?

부가적인 설명을 드리자면 지난 회에서 홉필드 네트워크가 입력 값을 갱신하며 특정 결과에 수렴을 한다고 했는데, 위 예제에서는 단번에 ‘ㄱ’에 수렴하는 결과를 나타내었습니다. 이와 같이 단번에 수렴을 하는 경우도 있지만, 만약 입력 데이터의 개수가 이보다 많아진다거나 학습 패턴들의 형태가 복잡해진다면 단번에 수렴 되지 않을 수도있으므로 그 때는 특정 한 결과에 수렴할 때까지(값이 한 학습 데이터와 동일해질 때 까지) 반복적으로 인식 과정을 수행하여야 합니다.


시간관계상 저는 하지 않겠지만 여러분들께서는 아래 패턴에 대해서도 인식을 시도해 보시기 바랍니다^^


입력 데이터의 크기가 16이기 때문에 이 가중치 집합은 이론상으로 1.35(0.15×9)개의 패턴만을 완벽히 인식 할 수 있습니다. 하지만 말 그대로 이론상 결과이므로 학습 패턴들의 시각적 형태에 따라 저장 가능 용량은 달라질 수 있습니다.

만약 ‘ㄱ’과 ‘ㄴ’ 외에도 ‘ㄷ’과 ‘ㄹ’, ‘ㅁ’등을 추가로 기억하고 인식하기 위해서는 위 예제에 어떠한 변화를 주면 될까요? 

지난 회에 언급했듯이 학습 패턴들을 완전히 복구(인식)하기 위해서는 입력 데이터의 크기가 충분히 커야합니다. 즉, 입력 데이터의 크기가 커질수록 가중치 집합의 크기 또한 커지고, 기억할 수 있는 패턴의 수도 커지는 것입니다.

홉필드 네트워크는 이와 같이 불완전한 데이터를 완전한 데이터로 복원하거나 노이즈가 섞인 데이터를 인식하는 곳에 다양하게 응용할 수 있습니다.

이로써 홉필드 네트워크에 대한 설명과 예제 모두 끝이 났습니다. 다음 회에 다룰 내용은 양방향 연상 메모리(BAM ; Bidirectional Associative Memory)입니다. 긴 내용 읽어주셔서 감사합니다!