
지각·학습·커넥셔니즘 ― 비트맵에서 3차원 모델, 변별 네트워크, 병렬 분산 처리까지
요약
기호주의 AI의 한계를 극복하기 위한 지각, 학습, 커넥셔니즘의 발전 과정을 다룹니다. 비트맵에서 3차원 모델 복원, 오차 역전파, 병렬 분산 처리 등 현대 AI의 근간이 된 핵심 연구 개념들을 정리합니다.
핵심 포인트
- 시각 인지를 2차원 이미지에서 3차원 모델로 복원하는 역문제로 정의
- 기호주의의 한계인 지각과 지식 습득 병목 현상을 학습 기계로 해결 시도
- 퍼셉트론에서 오차 역전파로 이어지는 커넥셔니즘의 발전 과정 기술
- 데이터 병렬 처리를 통한 지각 및 병렬 분산 프로그래밍의 중요성
인공지능 시리즈의 최종회로서, 기호를 조작하는 프레임워크의 외부에 있는 세 가지 영역을 다룹니다. 컴퓨터에 의한 시각에서는 비트맵 (Bit-map)에서 원시 스케치(Primitive sketch)·2.5차원 스케치·3차원 모델 표현으로 단계적으로 나아가는 사고방식과, 가우스의 컨볼루션 (Convolution) 법에 의한 경계 검출을 구현합니다. 학습 기계에서는 실행 부분과 학습 부분이라는 구조, 단일 표현의 트릭, 신뢰도 할당 문제를 정리하고, EPAM의 변별 네트워크와 버전 공간 (Version space)의 후보 배제 알고리즘을 구동합니다. 커넥셔니즘 (Connectionism)에서는 퍼셉트론 (Perceptron)의 한계부터 오차 역전파 학습 (Error backpropagation learning)으로의 전개를 따라가며, 철자에서 음소로의 변환, 측 억제 (Lateral inhibition)와 네커 큐브 (Necker cube), 커넥션 머신 (Connection machine)의 데이터 병렬 프로그래밍을 Swift로 확인합니다. 마지막으로, 1990년 전후의 이러한 구상들이 그 후 30년 동안 무엇이 되었는지 살펴봅니다.
- 서론
-
- 지각이라는 역문제
-
- 비트맵에서 3차원 모델로
-
- 경계 검출과 가우스의 컨볼루션 법
-
- 원시 스케치와 2.5차원 스케치
-
- 학습 기계의 구조
-
- 단일 표현의 트릭과 반복 학습
-
- 신뢰도 할당 문제
-
- 개념의 학습과 특성 벡터
-
- EPAM 모델과 변별 네트워크
-
- 버전 공간과 후보 배제 알고리즘
-
- 커넥셔니즘 ― 병렬 분산 처리
-
- 퍼셉트론과 선형 분리
-
- 오차 역전파 학습과 피드포워드 네트워크 (Feedforward network)
-
- 음성 합성에의 응용 ― 철자에서 음소로
-
- 병렬 처리에 의한 지각 ― 측 억제와 네커 큐브
-
- 순차 처리의 문제점
-
- 커넥션 머신과 데이터 병렬
-
- 그 후의 30년
- 요약
- 주석
- 참고 자료
이 시리즈에서는 지식을 어떻게 표현할 것인가, 규칙으로부터 어떻게 추론할 것인가, 가능성의 공간을 어떻게 탐색할 것인가라는 문제를 다루어 왔습니다. 모두 기호를 조작하는 프레임워크 안에 있습니다. 의미 네트워크 (Semantic network)의 노드, production rule의 조건부, 게임 트리 (Game tree)의 노드. 모두 인간이 읽고 의미를 알 수 있는 기호로 이루어져 있었습니다.
이 기호주의 프레임워크에는 제대로 다루기 어려운 영역이 두 가지 남습니다.
하나는 지각입니다. 카메라가 돌려주는 것은 기호가 아니라 수백만 개의 밝기 수치입니다. "이것은 의자이다"라는 기호에 도달하기까지, 애초에 "여기에 물체의 윤곽이 있다"는 것을 찾아내야만 합니다. 이 첫걸음을 규칙으로 써 내려가는 것을 아무도 할 수 없었습니다.
다른 하나는 학습입니다. 전문가 시스템 (Expert system)은 전문가로부터 규칙을 물어내어 수작업으로 기록해야 했습니다. 이 작업(지식 습득의 병목 현상)이 실용화의 최대 장애였습니다. 규칙을 경험으로부터 스스로 만들 수 없을까 하는 질문이 남습니다.
이 기사에서는 이 두 가지를 다룬 연구를 다룹니다. 그리고 그것들을 쫓아가다 보면 기호를 단위로 하지 않는 **커넥셔니즘 (Connectionism)**이라는 또 다른 프레임워크에 도달하게 됩니다. 1990년 전후, 이것은 기호주의에 대한 도전으로서 등장했습니다. 그 후 어떻게 되었는지는 마지막 절에서 살펴봅니다.
시각을 계산 문제로 정식화하면 그 어려움의 정체를 볼 수 있습니다.
3차원 세계에 있는 물체가 빛을 반사하고, 렌즈를 통과하여, 2차원 평면에 투영됩니다. 카메라가 하는 일은 여기까지입니다. 시각이 해야 하는 일은, 이 과정을 거꾸로 거슬러 올라가는 것입니다.
세계 (3차원) ──투영──→ 이미지 (2차원) ← 카메라가 하는 일
세계 (3차원) ←──복원── 이미지 (2차원) ← 시각이 하는 일
투영은 정보를 버립니다. 깊이가 상실되고, 숨겨진 면이 사라지며, 조명과 반사율의 구분이 불가능해집니다. 버려진 정보를 복원하려고 하는 것이기에, 답은 일의적으로 결정되지 않습니다. 같은 이미지를 만드는 3차원 세계는 무수히 많습니다. 이를 **부적정 문제 (ill-posed problem)**라고 부릅니다.
그럼에도 불구하고 인간은 대부분의 경우 단 하나의 해석에 도달합니다. 왜냐하면, 세계에 대한 전제를 암묵적으로 사용하고 있기 때문입니다.
| 전제 | 내용 |
|---|---|
| 물체는 연속되어 있다 | 인접한 점은 대개 같은 면에 속한다 |
| ... |
이러한 전제를 계산에 심는 것이 컴퓨터에 의한 시각 설계 그 자체가 됩니다. "지각은 무의식적인 추론이다"라는 헬름홀츠 (Helmholtz)의 주장(19세기)이 그대로 계산의 언어로 번역되었다고 볼 수 있습니다 (주석 1).
시각을 한꺼번에 해결하려 하지 않고, 단계적인 표현의 계열로 구성한다. 이 방침을 명확히 한 것이 David Marr입니다 (주석 2).
출발점은 비트맵 (bitmap), 즉 밝기 수치가 가로세로로 나열된 배열뿐입니다. 여기에는 '물체'도 '윤곽'도 기록되어 있지 않습니다. 있는 것은 수치뿐입니다.
이미지 (밝기 배열)
↓ 어디에서 밝기가 급격히 변하는가
원시 스케치 (primal sketch)
...
| 단계 | 무엇이 표현되어 있는가 | 좌표계 |
|---|---|---|
| 이미지 | 각 화소의 밝기 | 이미지 |
| ... | ||
| 이 분류 방식에서 중요한 것은, 2.5차원 스케치와 3차원 모델 표현 사이의 단절입니다. |
2.5차원 스케치는 '보이는 것'에 대한 기술입니다. 앞쪽에 있는 면까지의 거리는 알 수 있지만, 뒷면은 알 수 없습니다. 좌표의 원점은 보는 사람에게 있습니다. 고개를 움직이면 모든 수치가 변합니다.
3차원 모델 표현은 '물체의 형태'에 대한 기술입니다. 원점은 물체 그 자체에 있습니다. 고개를 움직여도 변하지 않습니다. 그렇기에 기억 속의 형태와 대조할 수 있습니다. '2.5차원'이라는 어중간한 이름은, 시점에 묶여 있는, 면까지의 거리를 나타내는 지도라는 이 단계의 성질을 나타냅니다.
그리고 이 계열의 첫걸음, 이미지에서 원시 스케치로의 변환이 바로 경계 검출(boundary detection)입니다.
**경계 (edge, 윤곽)**란 밝기가 급격히 변하는 지점입니다. 물체의 가장자리, 면의 방향이 바뀌는 지점, 그림자의 경계 등이 이미지 상에서는 밝기의 급변으로 나타납니다.
단순하게 생각하면 인접한 화소의 차이를 구하면 될 것 같습니다. 하지만 실제 이미지에는 노이즈가 섞여 있습니다. 차이를 구하면 노이즈도 똑같이 '급변'으로 포착되어 버립니다.
그래서 먼저 평활화 (smoothing)를 한 뒤에 변화를 조사합니다. 평활화에 사용하는 것이 **가우스 함수 (Gaussian function)**입니다.
G(x) = exp( −x² / (2σ²) ) (전체의 합이 1이 되도록 정규화한다)
이 가중치로 인접 화소를 섞는 것을 **가우스 컨볼루션 (Gaussian convolution)**이라고 부릅니다. σ (표준 편차)가 어느 정도의 범위로 섞을지를 결정합니다. 이처럼 인접한 값들의 가중치 합을 구하는 처리를 일반적으로 **필터 (filter)**라고 부릅니다. 가우스 컨볼루션은 평활화 필터의 대표적인 예이며, 나중에 사용할 라플라시안 (Laplacian)은 변화를 추출하는 필터입니다.
2차원 가우스 함수는 가로세로로 분리할 수 있으므로, 가로 방향으로 1번, 세로 방향으로 1번의 1차원 컨볼루션만 수행하면 됩니다. 계산량이 O(r²)에서 O(r)로 줄어드는 구현상의 핵심 포인트입니다.
struct Image {
let width: Int, height: Int
var pixels: [Double]
...
평활화된 이미지에서 밝기의 변화가 가장 급격한 지점을 찾습니다. 1차 미분의 극댓값을 찾는 방법도 있지만, 여기서는 2차 미분이 0이 되는 지점을 사용합니다. 밝기가 급변하는 중심에서는 2차 미분이 양(+)에서 음(-)으로 (또는 음에서 양으로) 부호를 바꾸기 때문입니다. 이 부호가 바뀌는 지점을 **제로 크로싱 (zero crossing)**이라고 부르며, 그 위치가 경계점이 됩니다.
2차 미분에 해당하는 것이 **라플라시안 (Laplacian)**입니다.
func laplacian(_ img: Image) -> Image {
var out = Image(width: img.width, height: img.height)
for y in 0..<img.height {
...
"가우스로 평활화한 뒤 라플라시안을 추출하고, 제로 크로싱을 경계로 삼는다"는 절차는 Marr와 Ellen Hildreth가 정식화한 것으로, **가우시안 라플라시안 (Laplacian of Gaussian)**이라고 불립니다 (주석 3).
밝은 사각형과 원을 배치한 장면에 강한 노이즈를 섞어 입력값으로 사용합니다.
=== 노이즈가 없는 장면 ===
@@@@@@@@@@@@
@@@@@@@@@@@@
...
여기에 노이즈를 섞은 것이 실제로 프로그램에 주어지는 비트맵입니다.
=== 노이즈를 섞은 입력 이미지 ===
.. :.. . : :.. :.:...: ... : .
. ::.. : :. . ... :. . .: :.. .
...
σ를 바꾸어 경계 검출을 수행하면 다음과 같습니다.
--- 평활화 없음: 경계점 897 개 ---
################ ###### ###############
## ### ######### # ## ####### #########
...
평활화(smoothing)를 하지 않고 제로 크로싱(zero-crossing)을 취하면, 화면의 대부분이 경계점(boundary point)이 됩니다. 노이즈에 의한 미세한 부호 변화를 모두 경계로서 잡아내기 때문입니다. σ를 높여가면,
--- σ = 1.0: 경계점 507개 ---
--- σ = 2.0: 경계점 126개 ---
--- σ = 3.0: 경계점 90개 ---
...
사각형과 원의 윤곽이 노이즈 속에서 복원되었습니다. 경계점은 897개에서 90개로 줄어들었습니다 (노이즈가 없는 동일한 장면을 σ=1.0으로 처리했을 때의 경계점이 86개이므로, 거의 타당한 수입니다).
이 실험에는 중요한 논점이 그대로 포함되어 있습니다. σ를 얼마로 설정해야 할지는 원리적으로 정해져 있지 않습니다.
- σ가 작을 때: 미세한 변화를 잡아낼 수 있다. 하지만 노이즈도 함께 잡아낸다.
- σ가 클 때: 노이즈에 강하다. 하지만 미세한 구조가 사라지고 경계의 위치도 어긋난다.
'올바른 σ'는 존재하지 않습니다. 보고자 하는 대상의 크기에 따라 달라지기 때문입니다. 나뭇잎의 윤곽을 보고 싶은지, 숲의 윤곽을 보고 싶은지에 따라 답이 달라집니다.
이러한 상황에 대처하는 방법이 여러 σ로 동시에 처리하여 결과를 통합하는 방식입니다. 이를 **스케일 공간(scale space)**이라고 부릅니다. 서로 다른 σ에서 얻은 경계 중, 어떤 σ에서도 나타나는 것은 실재하는 경계일 가능성이 높다는 생각입니다. '하나의 정답을 구하는' 것이 아니라 '여러 해상도로 보고 대조한다'는 이 발상은, 뒤에서 살펴보겠지만 현대의 시각 시스템에도 그대로 살아남아 있습니다.
경계점을 구하더라도 그것은 아직 점들의 집합일 뿐입니다. 원시 스케치(primitive sketch)는 이를 구조화해 나갑니다.
| 단계 | 내용 |
|---|---|
| 가공되지 않은 원시 스케치 | 경계점, 선분의 파편, 점, 그리고 그것들의 방향과 밝기 차이 |
| 완전한 원시 스케치 | 그것들을 모은 선·곡선·경계·영역, 그리고 반복되는 구조 |
하나로 묶어내는 과정에는 근접성, 방향의 일치성, 연결 용이성 같은 단서들이 사용됩니다. 이는 20세기 초 게슈탈트 심리학(Gestalt psychology)이 '그룹화의 법칙(laws of grouping)'으로 기술한 현상을 계산 절차로 치환한 것입니다.
원시 스케치에서 2.5차원 스케치로 나아가기 위해서는 깊이(depth) 정보가 필요합니다. 여기서 사용되는 단서가 이른바 '◯◯로부터의 형상(shape from X)'입니다.
| 단서 | 사용하는 것 |
|---|---|
| 양안 시차(binocular disparity) | 양쪽 눈에 비치는 위치의 차이 |
| ... |
어떠한 단서도 단독으로는 답이 정해지지 않습니다. 음영으로부터의 형상(shape from shading)은 광원의 위치를 가정해야 풀 수 있고, 질감으로부터의 형상(shape from texture)은 원래의 패턴이 균일하다고 가정합니다. 따라서 여러 단서를 조합하여 서로 모순되지 않는 해를 선택해야 합니다.
개별 단서는 모호하지만, 다수의 제약을 동시에 만족하는 해는 거의 하나로 결정된다. 이 사고방식을 **제약 충족(constraint satisfaction)**이라 부르며, 시각뿐만 아니라 지각 전반을 관통하는 원리가 됩니다. 이후 제15절에서 다룰 네커 큐브(Necker cube)는 이 원리가 적나라하게 드러난 예시입니다.
여기서부터 학습(learning) 이야기로 넘어갑니다.
학습하는 프로그램은 기능이 다른 두 부분으로 나누어 생각하면 정리하기 쉽습니다.
| 부분 | 역할 |
|---|---|
| 실행 부분 (performance element, PE) | 실제로 과제를 수행한다. 체스를 두거나, 병을 진단하거나, 글자를 읽는다. |
| 학습 부분 (learning element, LE) | 실행 부분의 행동을 보고 그 내부를 다시 쓴다. |
환경 (문제, 사례, 정답, 보상)
│
┌───────────┴───────────┐
...
이러한 분류가 유효한 이유는, 학습 부분에게 실행 부분은 '다시 쓸 대상인 데이터'라는 관계가 명확해지기 때문입니다. 실행 부분이 프로덕션 규칙(production rule)의 집합이라면, 학습 부분의 일은 규칙의 추가·삭제·수정이 됩니다. 실행 부분이 평가 함수라면, 학습 부분의 일은 가중치(weight)의 조정이 됩니다.
지난번 게임 관련 기사에서 보았던 Arthur Samuel의 체커 프로그램은 이 구조의 초기 실례였습니다. 실행 부분은 α-β 탐색(alpha-beta search)과 정적 평가 함수를 담당하고, 학습 부분은 대국 결과로부터 평가 함수의 가중치를 조정하는 메커니즘입니다.
학습 부분을 설계할 때 결정해야 하는 네 가지가 있습니다.
- 실행 부분의 어느 부분을 다시 쓸 것인가 (규칙인가, 가중치인가, 네트워크의 형태인가)
- 그 부분을 어떻게 표현할 것인가
- 어떤 정보를 얻을 수 있는가 (정답이 포함된 사례인가, 승패뿐인가, 아니면 아무런 단서가 없는가)
- 얻은 정보를 어떤 수정(書き換え)과 연결할 것인가
세 번째는 학습의 종류 그 자체를 결정합니다. 하나하나의 사례에 정답이 따라온다면 지도 학습 (supervised learning), 행동의 결과로서 좋고 나쁨만이 돌아온다면 강화 학습 (reinforcement learning), 정답도 평가도 없이 구조만을 찾아낸다면 **비지도 학습 (unsupervised learning)**입니다. 그리고 네 번째가 다음에 서술할 신뢰도 할당 문제입니다.
학습 부분이 '사례'와 '가설'을 대조할 때, 양자의 표현이 다르면 비교를 위한 변환이 필요하게 됩니다. 이 변환 자체가 어려운 문제가 될 수 있습니다.
그래서 사용되는 것이 **단일 표현 트릭 (single-representation trick)**입니다. 사례와 가설을 동일한 표현의 언어로 쓰는 것. 그렇게 하면 양자를 직접 대조할 수 있습니다.
구체적으로는, 사례를 '모든 속성이 구체적인 값으로 채워진 가설'로 간주합니다. 그러면 가설과 사례의 관계는 '일반과 특수'라는 하나의 축 위에 나란히 놓이게 됩니다.
〈?, ?, ?〉 ← 가장 일반적인 가설 (무엇에든 적용 가능)
〈?, 빨강, ?〉
〈?, 빨강, 큼〉
...
제10절의 버전 공간 (version space)은 이 트릭을 바탕으로 성립합니다. 학습이란 '이 축의 어디에 선을 그을 것인가'를 결정하는 작업이 됩니다.
또 하나, 학습의 기본적인 형태가 **반복 학습 (incremental learning, 순차 학습)**입니다. 사례를 모아서 한꺼번에 처리하는 것이 아니라, 하나씩 주면서 그때마다 가설을 수정하는 방식입니다.
| 일괄 학습 | 반복 학습 | |
|---|---|---|
| 사례를 주는 방식 | 전부 모은 후 | 하나씩 |
| ... |
반복 학습은 기억량을 적게 차지하며, 학습하면서 동시에 작동할 수 있다는 장점이 있습니다. 반면, 제시된 순서에 결과가 좌우된다는 성질을 가집니다. 제9절의 EPAM에서 이 성질을 실제로 확인합니다.
학습의 중심에 있는 난제는 **신뢰도 할당 문제 (credit-assignment problem)**입니다. Marvin Minsky가 1961년에 정식화했습니다 (주4).
문제는 이렇습니다. 결과가 좋았을 때 (혹은 나빴을 때), 그 공로 (혹은 책임)를 어떤 판단에 할당해야 하는가.
체커(checker) 게임에서 졌다고 가정해 봅시다. 60수를 두었습니다. 어떤 수가 나빴을까요? 마지막 한 수가 아닐 수도 있습니다. 20수째의 무심코 둔 한 수가 패인이었을지도 모릅니다. '졌다'라는 1비트의 정보를 60개의 판단에 어떻게 배분해야 할까요.
이 문제는 두 가지 방향으로 나뉩니다.
| 종류 | 내용 |
|---|---|
| 시간 방향의 할당 | 일련의 행동 중 어느 시점의 행동이 결과에 영향을 미쳤는가 |
| 구조 방향의 할당 | 시스템을 구성하는 다수의 요소 중 어느 요소가 결과에 영향을 미쳤는가 |
시간 방향 문제에 대한 고전적인 해결책이 Samuel이 사용한 방식입니다. 최종 결과를 기다리지 않고, 다음 국면의 평가치를 '잠정적인 정답'으로 삼아 현재의 평가치를 수정한다. 평가는 최종 승패로부터 점차 앞쪽으로 스며들어 갑니다. 이 생각은 나중에 **TD 학습 (시간차분 학습, temporal difference learning)**으로 정식화되어 강화 학습의 기초가 되었습니다 (주5).
구조 방향 문제에 대한 해결책이 제13절에서 다루는 **오차 역전파 학습 (error backpropagation learning)**입니다. 출력의 오차를 각 단위가 오차에 얼마나 기여했는지에 따라 역방향으로 배분합니다. 미분의 연쇄 법칙 (chain rule)이 그대로 신뢰도 배분 규칙이 된다는 발견이었습니다.
신뢰도 할당은 이 기사의 이후 세 개 절에서 반복해서 등장합니다. 학습이라는 행위의 중심에 있는 문제이기 때문입니다.
학습 중에서도 가장 기본적인 형태가 **개념 학습 (concept learning)**입니다. "새란 무엇인가", "이 병의 환자란 무엇인가"와 같은 카테고리의 경계를 사례로부터 찾아냅니다.
대상을 표현하는 가장 단순한 형태가 **특성 벡터 (feature vector, 속성 벡터)**입니다. 미리 정해둔 속성의 배열에 값을 넣은 것입니다.
속성: 〈 모양, 색, 크기 〉
사례1: 〈 원, 빨강, 큼 〉 ← 이 개념에 속함 (정적 사례)
사례2: 〈 사각형, 빨강, 큼 〉 ← 정적 사례
...
특성 벡터를 통한 표현에는 명확한 한계가 있습니다. 속성 사이의 관계를 기술할 수 없습니다. "A 위에 B가 있다"라는 관계는 정해진 수의 속성 배열로는 표현할 수 없습니다. 이 시리즈의 지식 표현 기사에서 다루었던 의미 네트워크(semantic network)나 프레임(frame)은 바로 이 한계를 넘기 위해 만들어진 것이었습니다.
그렇다고는 해도, 한계와 맞바꾸어 얻는 것이 있습니다. 특성 벡터의 공간에는 구조가 들어갑니다. 구체적인 값을 ?
(무엇이든 좋다)로 대체해 나가면, 가설은 자연스럽게 일반(general)과 특수(specific)의 순서로 나열됩니다. 학습을 "이 순서가 매겨진 공간의 탐색"으로 정식화할 수 있는 것입니다.
개념 학습을 탐색으로 간주하면, 이 시리즈에서 다루었던 탐색의 프레임워크를 그대로 사용할 수 있습니다. 상태(state)는 가설, 연산자(operator)는 "일반화하기", "특수화하기", 목표는 "모든 정례(positive example)를 포괄하되, 어떤 부례(negative example)도 포괄하지 않는 가설"입니다.
여기서 결정적으로 중요한 사실을 하나 확인해 두겠습니다. 사례(example)만으로는 올바른 개념을 결정할 수 없습니다.
정례와 부례를 모두 설명하는 가설은 대개 여러 개 존재합니다. 어떤 것을 선택할지는 사례가 알려주는 것이 아니라, **학습하는 측이 미리 가지고 있는 편향(bias)**이 결정합니다. 이를 **귀납 편향 (inductive bias)**이라고 부릅니다.
특성 벡터의 연언(conjunction, AND로 연결된 형태)만을 가설로 인정한다는 제한도 하나의 편향입니다. 이 제한이 있기 때문에 탐색이 유한하게 끝나고 수렴도 가능합니다. 편향이 없는 학습은 일반화할 수 없습니다. 이는 기술적인 편의 때문이 아니라 원리적인 사실입니다 (주6).
**EPAM (Elementary Perceiver and Memorizer)**은 Edward Feigenbaum과 Herbert Simon이 인간의 지각과 기억을 설명하기 위해 만든 계산 모델입니다 (주7). 이름 그대로 "지각과 기억의 기본 요소"를 다루는 모델로, 인간이 의미 없는 철자를 외우는 실험 결과를 재현하는 것이 목적이었습니다.
EPAM의 중심에 있는 것이 **변별 네트워크 (discrimination network)**입니다. 이는 트리 구조이며,
- **내부 노드 (internal node)**는 하나의 속성을 조사하는 분기점 -
- **잎 (leaf)**은 기억된 대상 (이미지)
대상이 제시되면 루트(root)에서부터 속성을 조사하며 가지를 따라 내려가 잎에 도달합니다. 이것이 **변별 (sorting)**입니다.
indirect enum Net {
case empty
case image(Object) // 기억된 이미지
...
학습 메커니즘이 EPAM의 특징적인 부분입니다. 네트워크는 구분에 실패했을 때만 성장합니다.
func learn(_ net: Net, _ obj: Object) -> Net {
switch net {
case .empty:
...
6종류의 동물을 차례로 제시하며 키운 결과입니다.
=== 네트워크를 하나씩 키우기 ===
개 제시: (루트) 빈 잎에 도달 → 그대로 기억
고양이 제시: (루트) "개"와 혼동 → 분기점 생성
...
속성은 4개(크기·다리 수·체표·사는 곳)가 있지만, 사용된 분기점은 3개뿐입니다. "체표"도 "사는 곳"도 한 번도 조사되지 않았습니다. EPAM은 대상을 통째로 기억하는 것이 아니라, 다른 것과 구별하는 데 필요한 최소한의 정보만을 축적합니다.
이 점은 미지의 대상을 주었을 때 명확하게 나타납니다.
=== 미지의 대상을 제시하면, 이미 아는 것 중 하나로 끌려간다 ===
늑대: 크기=중 → 다리 수=4 → "개"로 판정
상어: 크기=대 → "말"로 판정
...
상어가 말로 판정되었습니다. 네트워크가 알고 있는 "큰" 것은 말뿐이기에, 크기를 본 시점에서 바로 말이라고 결론 내려버립니다. 이는 버그가 아니라, EPAM이 인간의 기억에 대해 주장하는 바 그 자체입니다. 학습이 진행되지 않은 단계에서는 거친 특징만으로 판단하다가, 전문가가 될수록 세밀한 분기점이 늘어납니다. 이는 체스 숙련자 연구 등에서 관찰된 현상과 일치합니다.
그리고 제6절에서 예고한 반복 학습의 성질도 확인할 수 있습니다.
=== 제시 순서를 바꾸면, 다른 형태의 네트워크가 된다 ===
[다리 수는?]
0:
...
개와 뱀(크기는 같고 다리 수가 다른)을 먼저 제시하면, 루트의 분기점이 "크기"에서 "다리 수"로 바뀝니다. 같은 6종류를 외워도 외운 순서가 다르면 내부 구조가 다릅니다. 무엇을 배웠느냐뿐만 아니라 어떤 순서로 경험했느냐가 기억의 형태를 결정합니다. EPAM이 인지 모델로서 주장했던 점이 바로 이것이었습니다.
EPAM은 하나의 가설(네트워크)을 가지며 실패할 때마다 수정했습니다. 이와 대조적으로, 사례와 모순되지 않는 모든 가설을 동시에 유지한다는 방침이 있습니다. Tom Mitchell의 버전 공간 (version space) 모델입니다 (주8).
버전 공간 (version space)이란 주어진 사례를 모두 설명하는 가설의 집합입니다. 단순하게 생각하면, 모든 가설을 열거하여 유지하는 것은 비현실적입니다. 여기서 제6절의 단일 표현 트릭이 효과를 발휘합니다. 가설은 일반적인 것과 특수한 것의 순서로 나열되어 있으므로, 집합을 '경계'만으로 표현할 수 있습니다.
| 기호 | 내용 |
|---|---|
| S (specific boundary) | 버전 공간 내에서 가장 특수한 가설의 집합 |
| G (general boundary) | 버전 공간 내에서 가장 일반적인 가설의 집합 |
S와 G 사이에 끼어 있는 가설이 모두 버전 공간의 요소입니다. 두 개의 경계만으로 집합 전체를 나타낼 수 있습니다.
enum Constraint: Equatable {
case value(String) // 구체적인 값
case any // 무엇이든 상관없음 (?)
...
**후보 제거 알고리즘 (candidate-elimination algorithm)**은 사례가 들어올 때마다 S와 G를 움직입니다.
정례 (positive example)가 들어오면: 그에 맞지 않는 G의 요소를 버리고, S를 "그 정례를 포함할 때까지" 최소한으로 일반화한다 -
부례 (negative example)가 들어오면: 그에 맞아버리는 S의 요소를 버리고, G를 "그 부례를 제외할 때까지" 최소한으로 특수화한다 -
mutating func update(example e: Example, isPositive: Bool) {
if isPositive {
G.removeAll { !matches($0, e) }
...
"빨갛고 큰 것 (형태는 상관없음)"이라는 개념을 가르친 결과입니다.
초기 상태
S = 〈⊥, ⊥, ⊥〉
G = 〈?, ?, ?〉
...
48개였던 후보가 4개의 사례로 1개로 압축되었습니다. S와 G가 만나는 시점에서 학습은 완료됩니다.
이 방식에는 다른 학습법에는 없는 성질이 있습니다.
첫째, 언제 학습이 끝났는지 알 수 있습니다. S와 G가 일치하면 수렴, 아직 틈이 있으면 정보가 부족하다고 스스로 판정할 수 있습니다.
둘째, "아직 모른다"라고 말할 수 있습니다.
학습한 개념으로 미지의 사례를 판정한다:
〈사각형, 빨강, 작음〉 → 개념에 속하지 않음
〈삼각형, 초록, 큼〉 → 개념에 속하지 않음
...
수렴 전이라면, S의 모든 조건에 맞으면 "속한다", G의 어떤 조건에도 맞지 않으면 "속하지 않는다", 그 중간이라면 "판정할 수 없다"라고 답할 수 있습니다. 버전 공간에 남아 있는 가설들 사이에서 의견이 갈리고 있다는 상태를 그대로 표현할 수 있는 것입니다.
셋째, 다음에 무엇을 물어봐야 할지 알 수 있습니다. 버전 공간을 정확히 절반으로 나누는 듯한 사례를 선택하여 질문하면, 가장 효율적으로 후보를 줄일 수 있습니다. 이는 현재의 능동 학습 (active learning) 개념 그 자체입니다.
한편으로 한계도 명확합니다. 사례에 노이즈가 있으면 파탄 납니다. 잘못된 라벨이 붙은 사례가 하나만 섞여도, 올바른 가설이 후보에서 제거되어 버전 공간이 비어버리고 다시는 회복되지 않습니다. "모든 사례와 완전히 모순되지 않을 것"을 요구하는 설계의 당연한 귀결입니다. 현실의 데이터는 반드시 오염되어 있으므로, 이 점이 후보 제거 알고리즘을 실용적인 영역에서 멀어지게 했습니다. 이후 통계적인 머신러닝 (machine learning)이 오류를 허용하는 프레임워크로서 주류가 되어갑니다.
지금까지의 학습은 모두 기호를 단위로 삼았습니다. 속성, 값, 가설, 규칙. 모두 인간이 읽을 수 있는 기호입니다.
**커넥셔니즘 (connectionism)**은 이 전제를 버립니다. 단순한 처리 단위를 다수 연결하여, **연결의 강도 (가중치, weight)**에 지식을 갖게 합니다. 기호는 어디에도 적혀 있지 않습니다.
이 입장은 **병렬 분산 처리 (parallel distributed processing, PDP)**라고도 불립니다 (주9). 이름의 세 단어가 각각의 주장을 나타냅니다.
| 용어 | 주장 |
|---|---|
| 병렬 (parallel) | 다수의 단위가 동시에 움직인다. 순차적인 절차가 아니다 |
| 분산 (distributed) | 하나의 개념이 다수의 단위에 걸쳐 표현된다. 단위와 개념이 1대 1로 대응하지 않는다 |
| 처리 (processing) | 기억과 처리가 분리되어 있지 않다. 가중치가 곧 지식이며, 동시에 계산 장치이기도 하다 |
계산 내용은 단순합니다. 각 단위는 들어오는 신호에 **가중치 연결 (weighted link)**의 가중치를 곱하여 더하고, 그 합을 함수에 통과시켜 출력합니다.
출력 = f( Σ wᵢ xᵢ + b )
기호주의 (Symbolism)와의 차이점은 대조해 보면 명확해집니다.
| 기호주의 (Symbolism) | 커넥셔니즘 (Connectionism) |
|---|---|
| 지식의 단위 | 기호 (규칙, 프레임, 명제) |
| ... |
마지막 두 줄이 이 입장의 성격을 잘 나타냅니다. 우아한 성능 저하 (graceful degradation) — 일부가 고장 나더라도 갑자기 완전히 망가지지 않는 특성 — 은 뇌의 성질로서도, 실용적인 시스템의 성질로서도 매력적이었습니다. 반면, **내용을 읽을 수 없다 (uninterpretable)**는 것은 전문가 시스템 (expert system)이 갖추고 있던 "왜 그렇게 판단했는지 설명할 수 있다"는 장점을 잃는 것을 의미합니다. 이 트레이드오프 (trade-off)는 현재까지도 그대로 이어지고 있습니다.
커넥셔니즘의 출발점은 Frank Rosenblatt의 퍼셉트론 (perceptron) (1958년)입니다 (주10). 가중치 연결 (weighted link)을 단 한 층만 가지며, 가중치 합이 임계값 (threshold)을 넘으면 발화 (fire)합니다.
struct Perceptron {
var weights: [Double]
var bias: Double
...
학습 규칙은 놀라울 정도로 단순합니다. 틀렸을 때만, 올바른 방향으로 가중치를 조금씩 움직인다. 그것만으로 다음 정리가 성립합니다.
퍼셉트론 수렴 정리 (Perceptron Convergence Theorem): 해 (solution)가 존재한다면, 이 규칙은 유한한 횟수 내에 반드시 그곳에 도달한다 (주10).
실제로 구동해 보면, 정말로 그렇습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기