최근 수정 시각 : 2024-11-23 16:37:22

인공신경망

Deep Learning에서 넘어옴
인공지능
인공지능기계학습인공신경망딥 러닝
인공지능 - 인공지능 구현을 위한 몇 가지 기술이 존재한다.
기계학습 - 많은 매개변수를 넣어주면 모델이 스스로 규칙을 학습하는 방식의 인공지능 구현 방법이다.
인공신경망 - 인간의 뉴런 구조를 본떠 만든 기계 학습 방법론이다.
딥 러닝 - 입력층과 출력층 사이에 있는 은닉층에 인공 뉴런을 여러 겹 쌓고 연결한 인공신경망 방법론 중 하나이다. 즉, 단일층이 아닌 실제 뇌처럼 다층 구조로 되어있다. 21세기에 와서는 (인공신경망=딥러닝)이라고 이해해도 무방하다.
인지 컴퓨팅 - 기계학습을 이용하여 특정한 인지적 과제를 해결할 수 있는 프로그램 또는 솔루션을 이야기한다.
뉴로모픽 컴퓨팅 - 인공 신경망을 하드웨어적으로 구현한 것이라고 생각하면 된다.


[[컴퓨터공학|컴퓨터 과학 & 공학
Computer Science & Engineering
]]
[ 펼치기 · 접기 ]
||<tablebgcolor=#fff,#1c1d1f><tablecolor=#373a3c,#ddd><colbgcolor=#0066DC><colcolor=white> 기반 학문 ||수학(해석학 · 이산수학 · 수리논리학 · 선형대수학 · 미적분학 · 미분방정식 · 대수학(환론 · 범주론) · 정수론) · 이론 컴퓨터 과학 · 암호학 · 전자공학 · 언어학(형태론 · 통사론 · 의미론 · 화용론 · 음운론) · 인지과학 ||
하드웨어 구성 SoC · CPU · GPU(그래픽 카드 · GPGPU) · ROM · RAM · SSD · HDD · 참조: 틀:컴퓨터 부품
기술 기계어 · 어셈블리어 · C/C++ · C# · Java · Python · BIOS · 절차적 프로그래밍 · 객체 지향 프로그래밍 · 해킹 · ROT13 · 일회용 비밀번호 · 사물인터넷 · 와이파이 · GPS · 임베디드 · 인공신경망 · OpenGL · EXIF · 마이크로아키텍처 · ACPI · UEFI · NERF · gRPC · 리버스 엔지니어링 · HCI · UI · UX · 대역폭 · DBMS · NoSQL · 해시(SHA · 브루트 포스 · 레인보우 테이블 · salt · 암호화폐) · RSA 암호화 · 하드웨어 가속
연구

기타
논리 회로(보수기 · 가산기 · 논리 연산 · 불 대수 · 플립플롭) · 정보이론 · 임베디드 시스템 · 운영 체제 · 데이터베이스 · 프로그래밍 언어{컴파일러(어셈블러 · JIT) · 인터프리터 · 유형 이론 · 파싱 · 링커 · 난해한 프로그래밍 언어} · 메타데이터 · 기계학습 · 빅데이터 · 폰노이만 구조 · 양자컴퓨터 · 행위자 모델 · 인코딩(유니코드 · MBCS) · 네트워크 · 컴퓨터 보안 · OCR · 슈퍼컴퓨터 · 튜링 머신 · FPGA · 딥러닝 · 컴퓨터 구조론 · 컴퓨터 비전 · 컴퓨터 그래픽스 · 인공지능 · 시간 복잡도(최적화) · 소프트웨어 개발 방법론 · 디자인 패턴 · 정보처리이론 · 재귀 이론 · 자연어 처리(기계 번역 · 음성인식) · 버전 (버전 관리 시스템 · Git · GitHub)


1. 개요2. 상세3. 본론
3.1. 인공지능의 구현 원리3.2. 구조3.3. 전달/활성 함수3.4. 학습 방법3.5. 생물학적 뇌와의 차이3.6. 명예회복, 그리고 부활
4. 종류
4.1. 아키텍처에 기반한 분류
4.1.1. 퍼셉트론(Perceptron)
4.1.1.1. 단층 퍼셉트론(Single-Layer Perceptron)4.1.1.2. 다층 퍼셉트론(Multi Layer Perceptron, MLP)
4.1.2. 심층학습(Deep Learning)
4.1.2.1. Deep Belief Network4.1.2.2. 합성곱 신경망(Convolutional Neural Network, CNN)
4.1.2.2.1. 알고리즘4.1.2.2.2. 1차원 CNN
4.1.2.3. 순환 신경망(Recurrent Neural Network, RNN)
4.1.2.3.1. 장단기 기억 신경망(Long Short Term Memory, LSTM)4.1.2.3.2. Gated Recurrent Unit(GRU)
4.1.2.4. 트랜스포머(Transformer)4.1.2.5. 혼합모델
4.1.2.5.1. 오토인코더4.1.2.5.2. GAN
4.2. 학습방식에 기반한 분류
4.2.1. 지도학습4.2.2. 비지도학습(자율학습)
4.2.2.1. 진화전략
4.2.3. 강화학습
5. 학습법
5.1. 경사 하강법5.2. 확률적 경사 하강법5.3. Adam5.4. Nadam
6. 공학적인 기술7. 문제점8. 기술 동향9. 기타10. 관련 문서

1. 개요

/ artificial neural network

인공신경망(人工神經網, 영어: artificial neural network, ANN)은 기계학습인지과학에서 생물학의 신경망(동물의 중추신경계중 특히 뇌)에서 영감을 얻은 알고리즘이다.

2. 상세

인공신경망은 시냅스의 결합으로 네트워크를 형성한 인공 뉴런(노드)이 학습을 통해 시냅스의 결합 세기를 변화시켜, 문제 해결 능력을 가지는 모델 전반을 가리킨다. 좁은 의미에서는 오차역전파법을 이용한 다층 퍼셉트론을 가리키는 경우도 있지만, 이것은 잘못된 용법으로, 인공신경망은 이에 국한되지 않는다.

이름에서 알 수 있듯이 생물의 신경망, 특히 인간의 시각/청각 피질을 본떠 만든 알고리즘이다.[1] 인간의 신경 구조를 재현했다는 말이 많지만 실제로는 말 그대로 인간의 신경 매커니즘을 인공적으로 최대한 비슷하게 구현해서 그렇게 보이는 것일 뿐이다. 실제 인간의 뇌가 어떻게 구현되는지는 뇌과학적 영역에서 봐야 한다.

처음부터 이렇게 유망한 분야였던 것은 아니다. 인공신경망은 학습에서 사용하는 단층 퍼셉트론과 기울기 하강법과 관련된 문제도 문제지만[2] 하드웨어 및 병렬 연산의 성능이 매우 낮은 시기에 등장한 것이 크다. 모델을 학습할 여건 자체가 안 됐기에 이론상으로만 모델들이 존재해왔고 한동안 서포트 벡터 머신나이브 베이지안 알고리즘 등에 밀려 거의 사장되다시피 했다. 하지만 현대에 와서 하드웨어 환경이 갖춰지자 비로소 빛을 보게 된 것이다. 물론 암달의 법칙, 4 GHz의 벽처럼 하드웨어의 발전 속도가 언제나 좋은 전망만 있지는 않기에 현재는 관심도에 비해 발전이 살짝 정체되었다.

3. 본론

파일:MultiLayer_Perceptron.svg
3blue1brown의 간단한 설명

인공신경망은 수많은 '노드'들로 구성된다. 하나의 노드는 여러 함수로 이루어진 하나의 계단 단위[3]인데, 이 단위 자체가 뉴런을 모방한다. 그리고 각 노드를 용도별로 분리한 단위를 '층'이라고 한다. 또한 각 노드가 얼마나 많은 노드와 신호(정보)를 주고 받는지 따질 수 있는 그 연결의 수를 '망'이라 한다. 그래서 최종적으로 인공신경망이라고 하는 것이다.

3.1. 인공지능의 구현 원리

현재의 인공지능은 인공신경망에 의해 이루어진다. 그리고 인공신경망이 지능이 있는 것으로 보이게 만드는 원리는 수많은 코드(노드/계산 단위)가 각자의 계산을 수행한다는 과정에 있다.

인공지능에 어떠한 질문(신호)이 주어질 때 각 노드 별로 질문에 반응하며 다음 노드에 신호를 전달한다. 그래서 신호를 받는 개별 노드는 자신에게 주어진 가중치를 통해 편향(bias/기준치)으로 신호를 거르고 다시 산출하는데, 그렇게 걸러진 산출된 신호들의 총합이 바로 인공지능이 우리에게 전달하는 '대답'이 된다.

만약 모습이 일부 가려진 강아지 사진을 주고 인공지능에 이미지 속 물체가 강아지가 맞냐고 물어보자. 그러면 인공지능은 각 노드에서 자신이 가진 가중치, 순화해서 말하자면, 노드 별로 기억하는 각자의 강아지 특성에 따라 사진에 대한 신호를 거른다. 만약 눈이 가려진 강아지 사진이라고 해보면, 강아지의 눈을 학습한 노드는 사진에 강아지의 눈이 없으니 잘못된 이미지(신호)라고 판단해서 해당 사진은 False(거짓/가짜/잘못된)를 의미하는 0을 출력한다. 하지만 강아지의 코, 입, 귀, 다리 등 다른 부위를 학습한 노드들은 해당 사진을 맞는 이미지라고 판단해서 True(진실/진짜/옳은)를 의미하는 1을 출력한다. 이때 눈을 제외한 다른 부위들에 의해 0보다 1의 값이 더 많이 산출되니 인공지능은 최종적으로 해당 사진에 대한 대답을 '강아지'가 맞다고 산출한다. 이러한 인공지능의 특성(방식)은 설령 질문에 오타가 있거나 중간에 잘못된 단어가 있어도 마치 사람처럼 알아서 오류를 무시하고 옳은 대답을 산출하는 데에 기여한다. 그래서 일부 전문가들은 인공지능의 대답에 대해 확률적인 대답이라고 하는 것이라고 표현하는 것이다.

그런데 인공지능의 특성(방식)은 환각(Hallucinations)을 일으킬 수 있다. 잘못된 가중치가 주어지거나, 주어진 질문에 대한 정보가 애초에 없다면 관계 없는 편향과 가중치가 입력된 노드까지 신호가 흘러들어가는데 이때 자칫하면 마치 없어도 있듯이, 잘못된 것이라도 맞다고 하거나, 맞아도 잘못된 것이라는 틀린 대답(정보)을 산출하는 것이다.

할루시네이션(착각)은 인공지능에서 해결해야 하는 거의 1위의 문제다. 참고로 0순위는 어떻게든 사용 전력량과 서버 부하를 줄이는 것이다.

인공지능을 구현하는 인공신경망의 원리는 뉴런과 같다. 뉴런도 편향에 따라서 신호를 걸러서 다른 뉴런에 전달하기 때문이다. 하지만 두뇌를 가진 생물이 인공신경망과 같은 편향을 잘 일으키지 않은 이유는 완벽하게 밝혀지지 않았다. 사람이 무언가를 설령 살짝 '착각(Hallucinations)'할 수는 있어도, 편집증이나 조현병이 있지 않은 이상 인공신경망처럼 아예 잘못된 대답을 진실처럼 구현하지는 않는다. 그래서 인공지능에서 이 할루시네이션을 어떻게 해결해야 할지, 아직 연구 중이다.

또한 수학적 계산이 약한 이유가 여기에 있다. 인간이 암산 영재가 아닌 이상 도구를 사용해야만 수학에 능할 수 있고 또한 속도는 무진장 느린다. 그러나 컴퓨터는 아무리 복잡한 문제라도 수초 내에 계산을 완료한다. 인간의 두뇌의 연산능력이 현존하는 CPU나 GPU 보다 좋다면서 계산이 느린 이유는 '매번' 주어진 신호(질문)를 여러 뉴런에 하나씩 걸쳐서 편향에 따라 신호를 걸러 최종적으로 대답을 산출하기 때문이다. 인공신경망은 겉보기라도 인간의 뉴런 원리를 따라하기 때문에 인공신경망을 작동하는 컴퓨터의 계산 능력은 빠를지언정 인공신경망 자체는 기존의 알고리즘과 원리가 다르기 때문에 수학적 계산에 취약한 것이다.

3.2. 구조

1. 노드의 구조
  • 전이함수: 뉴런으로 따지자면 수상돌기다. 가중치가 사용된다. 전이함수란 받은 신호를 가중치와 곱하고, 그렇게 해서 나온 각각의 값들을 모두 더해서 가중합(평균값)이라는 값을 내는 기전(함수)이다.
    • 가중치: 가중치를 알기 위해선 간략하게라도 편향의 개념을 알아야 한다. 역치라고도 하며, 각 노드마다 정해진 관문이다. 이 관문은 신호가 특정 값(임계치)을 넘으면 1(진실), 넘지 못하면 0(거짓)으로 처리한다. 각 회사에서 개발하는 인공신경망마다 이 역치값이 세부적으로는 노드마다 조금씩 다를지라도, 일단 이해를 위해 기본적으로 한 인공신경망의 노드는 동일한 역치를 지닌다고 생각하면 좋다. 이때 들어오는 신호마다 다른 가중치를 정해 어떤 신호는 개발자가 보기엔 진실이니 가중할 수치를 세게 줘서 역치를 넘게 해 진실을 의미하는 1을 내게 하고, 어떤 신호는 거짓이니 가중치를 적게 줘서 역치를 못 넘게 해서 거짓을 의미하는 0을 내게 한다. 이게 학습의 원리다. 물론 세부적으로는 인공신경망의 층마다 노드의 역치도 어느 정도 조절은 할 수 있지만, 학습의 기본은 이러한 가중치 업데이트를 통해 이루어진다. 또한 실질적으로는 그 수만~수억 개나 되는 노드의 가중치를 개발자가 업데이트할 수는 없는 노릇이니 '상과 벌'이라는 개념(프로그램)을 통해 인공지능이 스스로 가중치를 업데이트하도록 유도하는 방법을 주로 쓴다.
  • 활성함수: 뉴런으로 따지자면 핵이자 축삭 말단이다. 가중합을 걸러 정보를 내는 함수다. 출력함수라고도 한다. 활성함수는 전이함수로부터 받은 가중합(데이터의 크기)이 일정량을 넘느냐의 여부로 특정 값(0, 1)을 출력할 수 있게 해준다. 이때 일정량의 기준이 되는 값을 역치 또는 임계값, 혹은 '편향'이라고 한다.
    • 역치(편향)란 데이터를 불 논리의 XOR(참/거짓)이라는 2진법의 논리 구조로 처리하기 위한 기준이다. 다르게 말해 얼마나 쉽게 노드가 활성화(신호 내보내기)할지 결정하는 기준점이다. 전이함수를 통해 받은 신호(데이터)가 임계값(역치)을 넘으면 참을 뜻하는 1로 값을 출력하고, 넘지 못하면 거짓인 0으로 표현한다는 것이다. 참고로 역치를 '편향'이라고도 하는 이유는 마치 편견을 가진 사람처럼, 잣대(기준)를 내세워서 '이건 기준에 부합하지 않으니 거짓이고, 기준에 부합하니 참이다'라고 분류하기 때문이다.
  • 파라미터는 가중치와 역치를 의미한다. 노드 간의 연결에 따라 한 노드에 여러 개의 가중치를 가진다. 그러나 편향은 항상 하나다. 가령 이해를 쉽게 하기 위해 다음과 같이 설명을 해보자. 1층(이전 층)에는 노드가 10개, 2층(현재 층)에는 노드가 한 개, 3층(다음 층)에는 노드가 7개가 있다고 가정해보자. 1층에서 신호를 받아 3층에서 내보내는 것이다. 2층 노드의 파라미터만 가지고 설명하겠다. 2층의 노드는 신호를 주는 1층의 노드들이 10개니까 10개의 가중치를 가진다. 왜냐하면 1층의 노드들은 각자의 기준(편향)에 따라 신호를 주기 때문에, 그 기준에 알맞게 각각의 신호를 처리해야 필요성이 있어서, 2층의 노드는 자신에게 연결된 1층 노드들의 수만큼의 가중치를 갖는다. 전술했지만 가중치란 신호를 받을 때 쓰는 수치다. 하지만 2층 노드의 편향은 항상 하나다. 얼마나 다양하게 많은 신호들을 받아서 처리하건 결과적으로 내보내는 진실(편향에 따라 걸러진 값)은 항상 하나라는 것이다. 진실이 여러 개면 그건 진실이라 볼 수 없다. 그래서 3층에 노드가 7개건 100개건 개발자가 특별한 의도를 갖지 않은 이상 2층 노드의 편향은 항상 1개 뿐이다.
  • 연결: 각 노드는 개발자의 의도에 따라 다른 노드들과 연결을 가진다. 하나의 노드마다 주변 모든 노드들과 연결하도록 설정한 것은 완전 연결이라고 하고, 하나의 노드를 특정 노드들하고만 연결하도록 설정한 것은 부분 연결이라고 한다. 완전 연결은 단순한 패턴 인식 정도에만 쓰이는 옛스러운 연결방식이고, 현재 추세는 부분연결이다. 비디오, 이미지 처리에 뛰어난 성능을 보이는 것은 물론, 현재 인공지능의 붐을 일으킨 자연어 처리에도 월등한 성능을 보여주기 때문이다.

2. 층의 구조
  • 노드들을 묶어서 용도 별로 나눈 것을 '층'이라고 한다. 최초로 신호를 받는 쪽에 위치한 노드들은 '입력층'이라고 하고, 최후에 정보를 내는 쪽에 위치한 노드들을 출력층이라고 한다. 그리고 성능을 높이기 위해 그 중간에 둔 노드 무리를 '은닉층'이라고 한다.
  • 이렇게 여러 층들로 구성된 상태를 퍼셉트론이라고 한다.

그런데 이렇게만 할 경우 전송되는 신호는 그냥 입력 신호의 선형 합이 될 뿐이고, 선형 합을 아무리 복잡하게 반복해 봤자 나오는 건 그냥 입력 신호의 선형 합밖에 없다. 다시 말해 아무리 많은 층을 쌓아봤자 행렬 곱하기 연산을 한 번 한 것과 동일한 결과가 나오는 것이다.

이와 같은 문제점은 은닉층의 노드의 활성함수에 비선형 함수를 도입하여 해결할 수 있다. 비선형 함수를 도입할 경우 인공신경망 모델로 비선형 문제를 풀 수 있고, 많은 층을 쌓을 경우 대체적으로 결과물이 향상된다. 더욱이 이러한 비선형 활성 함수의 경우 일반적으로 입력 값이 특정 값보다 큰 경우 함수의 국부적인 특성이 판이하게 변하게 되는데, 이는 노드가 임계치(편향) 이상의 자극을 받으면 활성화(참) 되어 반응을 하는 것과 매우 유사하기 때문에 이러한 비선형 함수가 활성 함수라고 불리게 되었다.

정리하자면 기본 원리는 단순하다. 다층 퍼셉트론이 기본인데, 몇 개의 층위를 만들어서 그 안에 '노드'들을 집어넣고, 이들을 무작위 연결 강도(가중치나 역치 등의 매개변수)로 연결한다. 각 '노드'들은 자신에게 들어온 신호를 곱해 모두 더해서([math(wx)]) 신호의 평균을 계산한 가중합을 낸 후, 이 가중합을 역치(기준 값)와 비교해서([math(wx + b)]) 참 또는 거짓이라는 정보로 판명한 뒤 이를 다음 뉴런(노드)으로 전달한다. 노드란 신호를 받고 내보내는 역할을 수행하는 프로그램(함수)이라고 생각하면 된다.

3.3. 전달/활성 함수

앞서 언급했듯이 입력 신호의 선형 합을 활성화 함수에 집어넣으면서 최종적으로 신호의 강도를 계산하는데, 그냥 주먹구구식으로 이것저것 함수를 대입해 보면서 가장 결과가 좋은 함수를 사용하는 중이다. 초기에는 실제 노드의 실무율을 잘 모사할 것으로 보이는 sigmoid 함수를 사용한 logistic 모델이 사용되었고, tanh함수나 softmax 함수가 사용되었다. 그러나 해당 함수를 활성 함수로 쓸 경우 은닉 층의 수가 증가하면 연결 강도를 학습시킬 때 활성 함수 미분 값을 곱한 값이 0으로 수렴하여 학습이 잘 되지 않는다는 문제가 있었다. 이에 따라 최근에는 sigmoid, tanh와 같은 squashing function이 아니라, ReLU와 같이 입력 값이 증가할수록 출력 값도 증가하는 함수가 많이 사용되고 있다. ReLU함수는 max(0, x)의 꼴을 가지는데, 입력 값이 0 이하면 항상 0의 출력 값을 가지므로, 음수인 입력 값에 대하여 해당 뉴런(노드)의 학습이 진행되지 않는다는 문제점이 있었다. 이를 해결하기 위하여 음수의 입력 값에서도 0이 아닌 출력 값을 가지는 Leaky ReLU 함수 및 Parametric ReLU 함수가 제안되었으며, 일반적으로 ReLU보다 좋은 성능을 낸다고 알려져있다. 더불어 함수의 미분 값이 연속적인 ELU 함수 또한 활성 함수로 널리 사용되고 있다.

다만 최근 배치 정규화라는 방법이 제안되면서, 입력의 값 분포를 최적화할 수 있게됨에 따라, sigmoid 함수를 활성함수로 쓰더라도 은닉층이 많은 인공 신경망을 잘 학습시킬 수 있게 되었다. 이와 같은 현상은 sigmoid 함수가 [math(x=0)] 근방에서 직선과 같은 형태를 가지고 있으므로 입력을 잘 처리해주면 주로 해당 영역에서 입력 데이터를 처리할 수 있다는 것에서 기인한다.

3.4. 학습 방법

먼저 전이함수에서 '가중치(Weight)'란 외부의 자극으로 들어오는 신호의 정확도(평균 값)를 높이기 위한 매개변수를 말하고, 활성함수에서 역치(편향)란 얼만큼의 신호(데이터)가 들어와야 이를 참 또는 거짓으로 구분(반응)할지 기준을 잡는 매개변수를 의미한다.
  • 편향(역치)의 약자는 Bias에서 따와서 b라고 표기한다.
  • 전이함수에서는 들어온 신호에 가중치를 곱한 뒤, 각 곱한 값을 합산해서 평균 값을 내는데, 이를 값을 가중합(데이터)이라고 한다.

학습(업데이트)이란 노드의 매개변수인 가중치나 역치의 값을 조절하는 것을 의미한다. 어떤 신호를 받을 때 값이 너무 크거나 작거나, 혹은 잘못된 방향으로 출력되면 상황에 맞게 가중치나 역치를 조절해서 그 출력 값을 사람이 보기에 올바르게 나오도록 조정한다는 것이다. 다시 말해, 인공 신경망의 학습을 진행하면 학습 데이터와의 오차를 최소화할 것으로 예상되는 방향으로 가중치 [math(w)]와 역치 [math(b)]의 업데이트가 이루어진다. '역치'라고 표현하기는 하지만, 관점에 따라서 가중치의 일종이라고 보기도 한다. 그래서 몇몇 자료에선 가중치 [math(w)]에 역치 [math(b)]가 포함되어 있는 경우도 있다.

학습은 학습 데이터를 넣은 후 결과가 원하던 결과보다 크면 결과가 작아지게 패러미터(매개변수: 가중치나 역치)를 조정하고 원하던 결과보다 작으면 커지게 패러미터를 조정하는 것을 반복한다. 이것으로 학습이 가능하다는 것은 perceptron convergence theorem이란 이름으로 증명이 되어 있다.

그래서 학습을 진행할 때, 가중치를 한 번에 많이 업데이트하는 것이 아니라, 조금씩 업데이트를 여러 번 하게된다. 그 이유는, 오차를 줄일 것으로 보이는 가중치 업데이트 방향이, 장기적으로 보면 그렇지 않은 경우가 많기 때문이다. 예를 들어서, 어떤 목적지로 걸어 갈 때 눈을 감고 있다가 한 번씩 눈을 떠서 주변 상황을 파악한 뒤(데이터 입력), 다시 눈을 감고 움직여야 하는 상황에 있다고 생각해보자. 눈을 한 번 떠서 주변 상황을 파악했다고 한들 눈을 감고 너무 많은 거리를 걸어가면 벽에 부딪힐 수도 있는 둥의 사고(오류)가 날 수도 있다. 즉 데이터(신호)에 대한 정확도가 낮아진다. 반면에 짧은 거리를 걸어간 후, 눈을 떠서 주변 상황을 파악하고, 다시 짧은 거리를 걸어가면 사고가 나지 않을 수 있으나(높은 정확도), 목적지에 도달할 때까지 너무 많은 시간이 걸릴 수 있다. 따라서 걸어갈 때 적절한 거리를 걸어가는 것이 중요한 문제가 된다. 즉 가중치라는 매개변수를 딱 한 번만 주변 환경에 맞춰서 조절하는 것보다는 여러 번 조절하는 것이 더 나은데, 그렇다고 너무 많이 조절하면 값을 내는 데에 시간이 오래 걸린다. 그래서 인공 신경망을 학습할 때 적절한 학습률(업데이트 빈도)로 가중치를 업데이트 하지 않으면, 인공 신경망이 발산하거나, 학습하는데 너무 오래걸리는 등의 문제가 발생하게 된다.

3.5. 생물학적 뇌와의 차이

인공 신경망이라는 단어 자체가 나타내고 있듯이 인공 신경망은 생물학적인 뇌와 큰 차이점을 보인다. 생물의 뇌, 특히 인간의 뇌는 1,000억 개 이상의 세포로 구성되어있는데, 현재 2020년대 초반의 기술로는 이와 같은 수의 뉴런을 시뮬레이션 할 수 없다. 비록 인공 신경망의 구조 자체가 생물학적인 뇌의 구조를 모사하며 시작되었으나, 뉴런의 수 말고도 구조적인 차이가 존재한다. 일반적인 세포는 역치 이상의 자극을 받지 않으면, 아예 반응을 하지 않고, 역치 이상의 자극을 받으면 반응을 하는 실무율 특성을 보인다. 자극이 세지면 반응의 크기가 커지는 것이 아니라, 반응의 빈도가 높아지는데, 사실 이러한 특성은 계단 함수(step function), 혹은 디랙 델타 함수와 비슷하다고 볼 수 있다. 그런데 컴퓨터에서 단위 계단 함수와 같은 계단 함수의 경우 [math(x=0)]인 곳에서 불연속적이므로 미분을 할 수가 없고, 그래서 학습을 할 수 없다는 매우 큰 문제점이 존재했다. 따라서 그 당시의 과학자들과 공학자들은 미분이 가능한 부드러운 계단 함수 형태인 sigmoid함수, tanh 함수 등을 썼던 것이다. 비록 sigmoid 함수가 계단 함수와 매우 비슷한 함수라고 할 수 있으나, 생물학적인 뇌와는 큰 차이가 있는데, 생물학적인 뇌는 시간의 흐름 없이는 작동할 수 없다는 것이다. 반면 인공 신경망의 경우 입력 값만 주면, 시간의 흐름과는 상관 없이 출력 값이 정해져있다. 다만 이건 해석하기 나름인데 전기신호도 물리적인 시간이 필요하고, 다층퍼셉트론이나 순환신경망처럼 출력데이터를 다시 입력데이터로 사용하는 경우도 많으니 시간이 필요하다고 볼수도 있다. 사용자측에서는 버튼을 누르자마자 나오니 시간이 필요없는것처럼 느껴질수는 있다.

더욱이 인공 신경망 모델 자체가 발전하며, sigmoid 함수가 아닌 ReLU 계열의 함수가 활성 함수로 널리 쓰이게 되었는데, 이러한 함수는 계단 함수와는 다소 거리가 있으므로 생물학적인 뇌와는 더욱 큰 차이가 발생했다고 볼 수도 있다. 물론, ReLU 계열의 함수가 자극에 따른 반응의 빈도를 나타낸다고 생각할 경우 거리가 좁혀졌다고 볼 수도 있겠다. 문제는 과거의 연구자들이 생물학적인 뇌와 차이가 큰 인공 신경망을 연산 성능이 떨어져 컴퓨터로 계산을 하기도 힘든데, 굳이 연구를 해야되냐는 생각을 많이 했다는 것이고, 그렇게 인공 신경망 모델은 역사의 뒤안길로 사라질 뻔 했다. 물론 이와 같은 무관심에는 컴퓨터 성능과 관련된 문제 뿐 아니라, 은닉층이 많아질수록 학습이 잘 되지 않는다는 문제(Vanishing Gradient)가 해결되지 않았다는 것도 한 몫 했다.

3.6. 명예회복, 그리고 부활

그런데 이렇게 역사에 묻힐 것 같던 이 이론은 돌연 딥러닝이라는 이름으로 화려하게 부활했다. 이는 '구시대의 산물'로 받아들여졌던 인공 신경망에 대해서 계속해서 연구를 진행했던 연구자들이 큰 진보를 이루어냈기 때문인데, 인공 신경망을 사전 훈련 해주거나, sigmoid 계열의 함수가 아니라 ReLU 계열의 함수를 쓰면 은닉층이 많아도 인공 신경망이 학습이 잘 된다는 것이 밝혀졌던 것이다. 더불어 각종 대회에서 인공 신경망 모델이 기존의 모델을 말 그대로 박살내버리면서 수많은 연구자들이 놀라면서 인공 신경망으로 다시 관심을 돌리게 된 것이다. 물론 은닉층의 수가 지나치게 많아질 경우 이와 같은 방법을 사용해도 결과물의 열화가 발생할 수도 있다는 연구 결과가 보고되었으나, 이를 해결하기 위해 배치 정규화, ResNet등의 해결 방법이 제안이 되었으며, 실제로 효과가 있다는 것이 밝혀졌다. 이와 같이 인공 신경망으로 연구자의 관심이 쏠리고 인공 신경망 모델이 발전하는데에는 기존에 난제로 보였던 문제들이 해결된 것도 무시할 수 없으나, 컴퓨터의 연산속도가 무지막지하게 빨라지면서 느린 수렴 속도가 그렇게까지 부각되지 않게 되었다는 것도 무시할 수 없는 요인이다. 왜냐하면, 난제들은 결국 시간이 지나면 누군가는 해결을 했을 것이기 때문이다.

아직 인공신경망 알고리즘은 인간 뇌의 성능의 발끝에도 미치지 못한다. 인간의 시각피질은 고작 몇백g밖에 무게가 안 되고 에너지원 역시 설탕 한 스푼만 주면 몇 시간이고 굴려먹을 수 있지만, 기계가 그 일을 하기 위해서는 집채만한 슈퍼컴퓨터로도 모자라다. 엄청 딸리는 소프트웨어의 효율을 압도적인 하드웨어로 찍어누르고 있는 셈. 도밍고스 교수의 말마따나 아직 기계학습에 대한 우리의 이해는 연금술 수준이라는 것이 정확할 것이다. 인공신경망은 만드는 사람도 쓰는 사람도 이게 왜 잘 작동하는지 잘 모를 만큼 부속과 출력의 상호관계가 천차만별이다. 그냥 결과가 나오니까 쓰는 거지. 특히 알고리즘의 성능 개선을 위해 접근하는 각종 시도의 경우 인간 뇌세포의 작동 방식과 전혀 관련이 없는 것은 물론이고, 이 방법을 사용하면 어떻게 성능이 나아지는지에 관한 이론적 근거가 조악하게라도 붙어 있는 경우가 훨씬 드물다. 그냥 '이렇게 하니까 학습이 더 잘 되더라.' 라는 말이 도는 편. 부족한 것이 많지만 그렇기에 발전할 여지가 많은 논리이며, 사람들이 인공신경망 알고리즘에 관해선 인간의 지능을 뛰어넘는 강인공지능, 발달을 추구하는 인공'지성'이 해결하기를 바라는 가장 큰 이유이기도 하다.

다만 사실 위의 연금술 발언은 Ali Rahimi라는 학자가 한 발언인데, 이 발언의 구체적인 맥락은 우리가 인공신경망이 어떻게 작동하는지 전혀 모른다는 의미가 아니라 당시 2017,18년의 인공지능 알고리즘 연구 프로그램이 너무 주먹구구식으로 진행된다는 점에 대한 비판이었다. 2023년 기준 현재 인공신경망의 이론들은 크게 universal approximation theorem 즉 특정 조건들 하에 인공신경망이 '학습'할 수 있는 함수공간에서의 함수의 class들을 규명하는 방법, 인공신경망의 capacity, 최적화모델링, 인공신경망의 overtraining 등 일어날 수 있는 오류를 탐지하고 수정하는 통계학적 접근법 등이며 아직 구체적으로 필요한 뉴런들의 숫자나 매개변수들의 성질등에 대해서는 제한적인 이론이 존재하는 상황이다. 하지만 그렇다고 인공신경망이 이론적으로 아예 규명이 되지 않은 상태와는 다소 거리가 있으며 이미 해당 발언이 나온 당시에도 인공신경망에서 자주 쓰이는 stochastic gradient descent나 backpropagation 등 굵직한 방법론들은 수학적으로도 규명이 꽤 잘 되어있는 편이었다. 다만 문제는 당시에 실제 알고리즘 개발을 할때 학자들이 일단 대충 알고리즘들을 괜찮은 결과가 나올 때까지 짜깁기를 하면서 정확히 어떤 알고리즘이 어떤 상황에서 어떻게 쓰여야 하는지를 명확히 규명하지 않고 다소 주먹구구식으로 알고리즘들을 짜고 있다는 것이며 이를 비판한 셈이다. 일반적으로 어떤 알고리즘이 왜 제대로 작동하는지 모른다는건 정말로 어떠한 수학적 근거도 없다는 의미보다는 blackbox 문제를 일컫는 것인데, 이는 예를 들어 gradient descent로 어떻게 결론에 도달할 수 있는지는 수학적으로 규명이 되었지만 실제 알고리즘을 짰을 때 layer들의 개수가 터무니없을 정도로 불어나고 덤으로 각종 매개변수들도 미친듯이 수가 불어나니 구체적으로 각 layer가 결론에 도달하는데에 도대체 어떤 역할을 하는지 가늠하기가 거의 불가능하다는 의미이다.

이런 과정을 통해 인공신경망은 2013년 즈음부터 현재까지 가장 주목받고 있는 머신러닝 알고리즘이 되었다.

4. 종류

4.1. 아키텍처에 기반한 분류

주의할 사항은 한 프로그램에 하나만 쓰이는 것이 아니라는 것이다. 가령 이미지 처리자연어 처리를 동시에 하기 위해 CNN과 RNN을 동시에 사용할 수도 있다.[4]

4.1.1. 퍼셉트론(Perceptron)

퍼셉트론(Perceptron)은 위에서 설명한 뉴런의 수학적 모델을 일컫는 용어이기도 하고, 최초로 제안된 신경망 프로그램 알고리즘 (1957)이기도 하다. 노드 자체가 수학적(함수)으로 뉴런을 모방한 것인데, 이 노드들의 묶음인 '층'으로 다시 뉴런을 모방한 구조를 퍼셉트론이라고 한다. '입력층(수상돌기), 은닉층(핵), 출력층(축삭 말단)'의 세 층로 이루어져 있다. 이 알고리즘은 이름 그대로 하나의 뉴런을 사용하며 학습 데이터를 가장 잘 설명할 수 있는 최적의 패러미터( [math(w, b)] )값을 찾는다.
4.1.1.1. 단층 퍼셉트론(Single-Layer Perceptron)
입력층과 출력층만 있는 구조를 단층 퍼셉트론이라고 한다.

그러나 초기에는 노드를 구성하는 함수 중 하나인 활성함수에 비선형 함수를 사용할 수 없기에 퍼셉트론이란 기술이 빠르게 사장됐다. 즉 단층 퍼셉트론으로는 실질적인 XOR 문제 하나 제대로 해결할 수 없었다. 활성함수가 XOR 논리로 참/거짓을 내서 정보를 추출하는데, 정작 XOR 형식의 문제에는 정확한 답을 내지 못했다는 것이다. 이 XOR 문제 하나 때문에 연구 자체가 기나긴 암흑기를 맞이했다.

이러한 암흑기를 전문가들마저 이를 핵겨울에 빗대 AI 겨울(AI Winter)이라고 했을 정도. 이에 대한 대안으로 후술할 MLP(다층 퍼셉트론)가 나오고 나서야 겨우 숨통이 트이게 되었다. 또한 1986년, 제프리 힌튼 교수에 의해 (오차)역전파(backpropagation) 알고리즘이 증명되어 은닉층에 비선형 함수를 사용할 수 있게 되었다. 신경망계통 알고리즘답게 초창기에 반짝하며 신드롬을 일으킬정도로 관심을 받았다.
4.1.1.2. 다층 퍼셉트론(Multi Layer Perceptron, MLP)
본격적으로 인공신경망이라고 부르는 단계다. 단층 퍼셉트론에 대한 개선으로 노드에 비선형 함수를 사용하기 위해 입력층과 출력층 사이에 수많은 추가 층을 둔 것이 바로 다층 (Multi Layer) 퍼셉트론이다. 추가 층을 은닉층이라고 한다. 은닉층을 통해 퍼셉트론은 여러 층(Layer)을 구성하게 되며, 보통 은닉층을 1~4개 정도 둔다.

그런데 은닉층이 많으면 파라미터(연결관계)가 많아지니 무조건 좋아 보이지만, 필요 이상으로 많은 은닉층을 두는 것은 오히려 성능이 떨어진다고 알려져 있다. 그래서 다층 퍼셉트론은 입력층과 출력층까지 합쳐도 고작 보통 3~6개 층으로 되어 있다. 그런데 뉴스 등에서, 개발된 인공신경망을 살펴 보면 파라미터(연결관계)가 막 몇 억개나 된다고 한다. 그건 각 층을 이루는 노드의 수를 무진장 늘리고, 또한 각 노드에 할당된 파라미터(연결관계)의 개수를 다시 무진장 늘리고 합산해서 낸 수다. 전술했지만 한 층에는 여러 노드가 있을 수 있다.

다층 퍼셉트론은 단층 퍼샙트론보다 정확도가 높다. 그러나 사라지는 경사 문제 [5], 과적합 문제 등이 있었고 당시 연산능력의 한계가 심했기 때문에 금세 사장되고 만다.

4.1.2. 심층학습(Deep Learning)

심층학습 문서 참조. 21세기에 들어서는 심층학습=인공신경망이라 봐도 무방할 정도의 주류 방법론으로 거듭난다.[6] 3개 이상의 레이어를 쌓으면 딥러닝이라 하는데, 레이어를 두개만 사용하는 단층 퍼셉트론과 같은 인공신경망은 요즘 실용적인 용도로는 사용되지 않기 때문이다. 변종이 많지만 요즘 많이 쓰이는 딥러닝 알고리즘은 CNN, RNN 혹은 Transformer 크게 세 가지로 나눠 볼 수 있다.[7]
4.1.2.1. Deep Belief Network
2006년 개발된 인공신경망 알고리즘. 훈련 데이터가 적을 때 유용하다. 층별로 사전학습을 통해 사라지는 경사 문제에 대한 해결 가능성을 보이기 시작하였다. Restricted Boltzmann Machine을 쌓은 형태로 되어 있다.

2020년대부터는 값을 잘 초기화 하기만 하면 된다는 사실 (Xavier initialization) 을 알게 되어 쓰이지 않는다.
4.1.2.2. 합성곱 신경망(Convolutional Neural Network, CNN)
1989년 인간의 시신경 구조를 모방해 만들어진 인공신경망 알고리즘. 다수의 Convolutional Layer(이때의 작은 행렬을 필터라 부른다)으로 부터 특징맵(Feature map)을 추출하고 서브샘플링(Subsampling)을 통해 차원을 축소하여 특징맵에서 중요한 부분만을 가져온다. 이미지 분류, semantic segmentation, optical flow등등 대부분의 컴퓨터 비전(computer vision)분야에서 필수적으로 사용되는 기술이며, 기존의 MLP 대비 적은 연산량과 높은 성능을 보여줘 각광받고 있다.

ML 기술의 선구자 중 한명인 얀 르쿤 교수가 개발한 LeNet이 초기 CNN 구조의 대표적인 역할을 했고, 이후 ImageNet 이미지 분류 대회에서 InceptionV3 등 새로운 모델 구조들이 나오며 성능이 비약적으로 개선되었다. 요즘에는 ResNet을 자주 쓰는데, TfNet이나 Torchvision에서 제공하는 pretrained weights를 사용하여 transfer learning을 하면 많은 분야에서 훌륭한 성능을 뽑아주기 때문에 애용된다. ResNet의 무거움을 해결하기 위한 MobileNetV2나 EfficientNet도 주목받고 있다.

R-CNN(Region-CNN)이라는 물건도 있다. Object Detection 할때 사용한다.

합성곱 신경망은 일반적으로 다음과 같은 구조의 순서로 이루어진다.
  • 합성곱 층 및 풀링 층의 결합
    • 합성곱 층 (Convolutional layer)
    • 풀링 층 (Pooling layer)
      • 일반적으로 최대 풀링 (Max Pooling) 및 평균 풀링 (Average Pooling) 알고리즘을 많이 이용한다. 필터라는 행렬 형태의 파라미터를 학습할 수 있는 합성곱 층과 달리 최대 또는 평균을 그대로 이용하는 정해진 알고리즘을 사용하므로 학습 가능한 파라미터가 존재하지 않는다.
    • 드롭아웃 층 (Dropout layer)
      • 신경망 모델의 과적합을 줄이기 위해서 합성곱 층 사이에 추가할 수 있다.
  • Flatten layer
    • 합성곱 신경망은 여러 개의 필터를 가지고 있고 합성곱 층의 결과 역시 일반적으로 선형이 아닌 2차원 배열(행렬) 이상의 데이터 형태이므로, 이를 1차원으로 Flatten시켜서 Fully-connected layer로 입력시켜 준다.
  • Fully-connected layer

여기서 원본 이미지는 모델의 첫 번째 합성곱 층으로 입력되고, '개', '고양이'와 같이 딥러닝 모델이 판단한 결과가 Fully-connected layer의 마지막 출력층의 출력에 해당한다.

활성화 함수로는 sigmoid 함수가 아닌 ReLU 함수가 많이 쓰이는데, 이는 sigmoid 함수에서 발생하는 Gradient Vanishing을 방지하기 위해서이다.
4.1.2.2.1. 알고리즘
합성곱 층은 말 그대로 합성곱을 이용하며, 다음과 같이 계산한다. 이때 입력되는 [math(m \times n)] 크기의 데이터 [math(D)]와 [math(p \times p)] 크기의 필터 [math(F)]가 다음과 같다고 하자. (단, stride의 값은 1이다.)
[math(D=\begin{pmatrix}d_{11} & d_{12} & \cdots & d_{1n} \\ {d_{21}} & {d_{22}} & {\cdots} & {d_{2n}} \\ \vdots & \vdots & \ddots & \vdots \\ d_{m1} & d_{m2} & \cdots & d_{mn}\end{pmatrix}, F=\begin{pmatrix}{f_{11}} & f_{12} & \cdots & f_{1p} \\ {f_{21}} & f_{22} & \cdots & f_{2p} \\ {\vdots} & \vdots & \ddots & \vdots \\ {f_{p1}} & f_{p2} & \cdots & f_{pp}\end{pmatrix})]
그러면 이 행렬을 이용하여 구한 합성곱은 [math((m - p + 1) \times (n - p + 1))] 행렬이며, 그 행렬의 [math(i)]행 [math(j)]열 성분은 다음과 같다.
[math(d_{ij}f_{11}+d_{i(j+1)}f_{12}+\cdots+d_{i(j+p-1)}f_{1p}+\cdots+d_{(i+p-1)j}f_{p1}+d_{(i+p-1)(j+1)}f_{p2}+\cdots+d_{(i+p-1)(j+p-1)}f_{pp})]
특히 그 행렬의 1행 1열의 성분은 다음과 같이 동일한 위치의 성분들의 곱을 합산한 것과 같다.
[math(d_{11}f_{11}+d_{12}f_{12}+\cdots+d_{1p}f_{1p}+\cdots+d_{p1}f_{p1}+d_{p2}f_{p2}+\cdots+d_{pp}f_{pp})]

예를 들어 [math(D)] ([math(4 \times 5)] 행렬), [math(F)] ([math(3 \times 3)] 행렬)가 다음과 같을 때,
[math(D=\begin{pmatrix}1 & 2 & 3 & 4 & 5 \\ 2 & 3 & 4 & 5 & 6 \\ 3 & 4 & 5 & 6 & 7 \\ 4 & 5 & 6 & 7 & 8\end{pmatrix})], [math(F=\begin{pmatrix}1 & 0 & 1 \\ 1 & 1 & 0 \\ 0 & 1 & 0\end{pmatrix})]
합성곱은 [math((4 - 3 + 1) \times (5 - 3 + 1))] 행렬, 즉 [math(2 \times 3)] 행렬이며, 다음과 같다.
[math(\begin{pmatrix}13 & 18 & 23 \\ 18 & 23 & 28\end{pmatrix})]

즉, 필터 [math(F)]를 데이터 행렬 [math(D)]의 가장 왼쪽 위부터 시작해서 1 (또는 지정된 stride)의 간격으로 가로, 세로 방향으로 격자 형태로 이동해 가면서, 대응되는 성분들의 곱을 모두 합한 결과를 구해 나간다고 생각하면 된다.

만약 stride의 값 [math(s)]가 1이 아니면 합성곱 결과물 행렬의 크기는 [math(\displaystyle (\frac{m - p}{s}+1) \times (\frac{n - p}{s}+1))]이다. 예를 들어 [math(m=n=28, p=4)]일 때, [math(s=1)]이면 결과물 행렬의 크기는 [math(25 \times 25)]이고, [math(s=2)]이면 [math(13 \times 13)]이다.

데이터 행렬 [math(D)]에 대해 실제 데이터에 해당하는 부분의 상하좌우로 패딩(padding)[8]을 추가할 수 있는데, 이때 패딩의 크기(상하좌우 각각 늘어나는 행과 열의 수)를 [math(a)]라고 하면 가로, 세로 각각 [math(2a)]만큼 늘어난다. 따라서 결과물 행렬의 크기는 [math(\displaystyle (\frac{m - p + 2a}{s}+1) \times (\frac{n - p + 2a}{s}+1))]이다. stride의 값이 1이면서 필터의 크기 [math(p)]보다 패딩으로 인해 늘어나는 길이가 더 길면 결과물 이미지가 더 커질 수 있다.

여러 개의 필터에 대해 이런 방식으로 계산한 결과를 합산 또는 평균하는 등의 적절한 방법을 이용하여 풀링 층 또는 다음 합성곱 층으로 전달되는 행렬을 생성한다.

풀링 층은 입력 데이터를 일정 간격의 정사각형 형태의 행렬들로 나누고, 다음과 같은 작업을 수행한다. 일반적으로는 [math(2 \times 2)] 행렬들로 나누기 때문에 풀링 층을 통과한 결과물은 입력 데이터에 비해 가로 및 세로 길이가 각각 반으로 줄어든다.
  • 최대 풀링 (Max Pooling) : 해당 행렬에서 최댓값을 구한다.
  • 평균 풀링 (Average Pooling) : 해당 행렬의 모든 값의 평균값을 구한다.

예를 들어 입력 데이터가 다음과 같을 때,
[math(D=\begin{pmatrix}1 & 4 & 2 & 0 \\ 2 & 2 & 3 & 1 \\ 3 & 3 & 5 & 1 \\ 0 & 2 & 0 & 4\end{pmatrix})]

이것을 [math(2 \times 2)] 크기의 정사각형 형태의 행렬들로 나누면 다음과 같다.
[math(D_{11}=\begin{pmatrix}1 & 4 \\ 2 & 2\end{pmatrix})], [math(D_{12}=\begin{pmatrix}2 & 0 \\ 3 & 1\end{pmatrix})], [math(D_{21}=\begin{pmatrix}3 & 3 \\ 0 & 2\end{pmatrix})], [math(D_{22}=\begin{pmatrix}5 & 1 \\ 0 & 4\end{pmatrix})]

이 행렬들에 대해 최대, 평균 풀링을 한 결과는 [math(D_{11})], [math(D_{12})], [math(D_{21})], [math(D_{22})]에 대해서 각각 다음과 같다.
  • 최대 풀링 : 각각 4, 3, 3, 5
  • 평균 풀링 : 각각 2.25, 1.5, 2, 2.5
4.1.2.2.2. 1차원 CNN
이미지를 인식하는 딥러닝 모델을 개발할 때는 일반적으로 2차원 CNN을 사용하고 그것이 CNN의 용도로 널리 알려져 있지만, 1차원 CNN도 시계열 데이터 예측 및 자연어 처리에서 기존의 RNN, LSTM 등을 대체하는 용도로 사용된다. 즉, 시계열이나 자연어 데이터를 일종의 1차원 이미지처럼 생각하는 것이다.

합성곱 층 및 풀링 층의 알고리즘은 2차원 CNN의 것을 1차원으로 단순히 낮춘다고 생각하면 된다. 예를 들어 합성곱 층의 경우, 필터 [math(F)]를 데이터 행렬 [math(D)]의 가장 왼쪽부터 시작해서 일정 간격(stride)으로 오른쪽으로 이동해 가면서 대응되는 성분들의 곱의 합을 구한다. 또한 그 결과물 행렬의 크기가 2차원에서 [math(\displaystyle (\frac{m - p + 2a}{s}+1) \times (\frac{n - p + 2a}{s}+1))] (단, [math(m)], [math(n)], [math(p)], [math(a)]는 각각 원래 데이터의 행과 열의 수, 필터 크기, 패딩) 이라면, 1차원에서는 원래 데이터의 길이가 [math(m)]일 때 그냥 [math(\displaystyle \frac{m - p + 2a}{s}+1)]이다.
4.1.2.3. 순환 신경망(Recurrent Neural Network, RNN)
뉴런의 출력이 다시 입력으로 feedback되는 재귀적인 연결 구조를 갖는 신경망. 다층 퍼셉트론 신경망은 입력이 출력 방향으로만 활성화되고 은닉 뉴런이 과거의 정보를 기억하지 못한다는 단점이 있다. 이러면 입력이 들어온 문맥을 기억할 수 없다. 이런 단점은 시계열 분석[9] 관련 문제에서 매우 해롭다. RNN은 이런 단점을 해결했다.

앞에서 무슨 단어가 나왔는지의 문맥이 다음에 나올 단어를 예측(prediction)하는 문제를 푸는 데 유용하다. 이런 문제에는 음성 인식, 필기체 인식, 텍스처 인식이 있다. 또 분류에도 유용하다. 언어 모델말뭉치를 이용한 기계 번역에 도움이 되었다.

기존의 DNN(Deep Neural Networks)의 경우 각 layer마다 parameter들이 독립적이었으나, RNN은 이를 공유하고 있다. 따라서 현재의 출력 결과는 이전 time step의 결과에 영향을 받으며, hidden layer는 일종의 메모리 역할을 하게 된다.

RNN의 기본적 작동원리는 ht = g1 ( xtU + Wh(t-1) + bx), ot = g2 (Vh(t)+bh) 이다.
g1 g2 : 비선형 활성화 함수 (Sigmoid, tanh 등)
xt: 입력값
ht: t(시간)단계의 은닉변수 (hidden state)
ot: t(시간)단계의 출력값
b: 편향 (bias)
UVW: xt ht ht-1의 가중치 (weight)
위 식에서 입력 X = (x1 , x2 , x3 , ... , xn)이 입력되면 ot가 출력된다.

변종으로 Bi-directional RNN이 있다. 이 모델은 과거 및 미래 상태도 반영한다. 언어 모델링을 할 때 앞뒤 단어를 모두 고려하게 되므로 정확성이 높아진다. 하지만 학습이 오랫동안 진행지면서 초기 학습이 잊혀질 단점이 있다.

하지만 전통적인 RNN 모형 및 Bi-directional RNN의 경우 Vanishing gradient problem을 지닌다. [10]

이 해결책으로 제시되고 있는 것이 다음 알고리즘들이다.
  • LSTM
  • elman NN: RNN에 context layer가 추가되어 있어 vanishing gradient problem을 어느 정도 해결했다. context layer는 hidden layer에서 나온 결과 중 기억하고 싶은 부분을 저장해 두었다가 필요할 때 꺼내올 수 있는 피드백 신호 역할을 한다.
4.1.2.3.1. 장단기 기억 신경망(Long Short Term Memory, LSTM)
1997년 나온 RNN의 개선판. 학습이 오래 지속될 경우 초기 학습한 내용이 잊혀진다는 단점이 있는데 이를 개선한 architecture이다. RNN의 입력, forget, 출력 부분에 Gate라는 셀들을 붙여 값을 조절한다. Forget gate는 이전 상태 정보를 저장할지를 결정하고, input gate는 입력되는 새로운 정보를 저장할지 결정하고, output gate는 갱신된 cell의 출력값을 제어한다.

망각 게이트 (forget gate)는 기존의 소자변수를 얼마나 잊어버릴지 결정한다. ft = σ (Uf xt + Wf ht-1 + bf)이다.
Uf xt + Wf ht-1 + bf는 xt, ht-1 , b의 가중합이다. ft는 이 가중합에 sigmoid함수(σ)를 씌운 것이다. 1은 모두 기억하겠다는 뜻이고 0은 모두 잊어버린다는 뜻이다.
4.1.2.3.2. Gated Recurrent Unit(GRU)
역시 크게 보면 RNN의 일종이며 LSTM의 개선판이라고 할 수 있다. 2014년 뉴욕대학교 조경현 교수가 발표한, LSTM의 장기기억능력은 보존하면서 연산은 적은 모델이다.
4.1.2.4. 트랜스포머(Transformer)
파일:상세 내용 아이콘.svg   자세한 내용은 트랜스포머(인공신경망) 문서
번 문단을
부분을
참고하십시오.
4.1.2.5. 혼합모델
대개 CNN이나 RNN, Transformer로 구성된다. 가령 DCGAN(Deep Convolutional Generative Adversarial Network)는 CNN을 discriminator로 삼은 것이며 C-RNN-GAN은 generator 겸 discriminator로 RNN을, TransGAN은 generator 겸 discriminator로 Transformer를 사용한다.
4.1.2.5.1. 오토인코더
자기부호화기 (Autoencoder)

이미지 같은 복잡한 데이터는 높은 차원에 존재한다. 복잡한 데이터를 저차원으로 표현하면 처리가 간단해질 수 있다. 이 때문에 데이터의 차원을 축소하려는 노력들이 있어 왔다. 그 예로 Singular Value Decomposition (SVD) 혹은 주성분 분석 (PCA)이 있다. RNN 역시 시계열 데이터를 직접적으로 이용하는 것이 아니라 은닉 상태를 추론하여 문제를 풀어 나간다. 이렇게 차원을 축소하면 분류도 쉬워진다.

정보를 압축하는 인코더와 압축된 정보를 바탕으로 데이터를 복원하는 디코더를 만들 수 있다. 오토인코더는 데이터의 효율적인 인코딩을 찾는 방법이다.[11] 인공신경망에서 입력 레이어의 뉴런과 출력 레이어의 뉴런을 같은 개수로 두고, 입력과 출력이 같은 값이 되게끔 신경망을 학습시키게 된다. 이렇게 하고 은닉층에 있는 뉴런의 개수를 입력층의 뉴런의 개수보다 적게 하여 신경망을 구성하면, 입력층에서 은닉층으로 가는 과정은 인코딩 과정이 되고, 은닉층에서 출력층으로 가는 과정은 디코딩 과정이 된다. 이 때 은닉층의 각 뉴런의 활성화 정도는 입력 데이터의 새로운 코드가 된다. 선형 뉴런을 사용하면 오토인코더의 결과는 PCA와 거의 유사한 결과를 갖게 된다. 따라서 선형 뉴런 대신 시그모이드 뉴런을 사용함으로써 비선형적인 코딩을 얻을 수 있게 된다.

오토인코더를 한 번 사용하여 데이터를 한 번에 인코딩하는 방법으로 신경망을 구성할 수도 있지만, 뉴런의 개수가 크게 줄어들게 되면 신경망의 학습이 이루어지기 어렵고, 신경망의 표현 능력도 떨어지게 된다. 신경망의 표현 능력을 향상시키기 위하여 오토인코더를 쌓아 올리게 되는데 각각의 오토인코더는 입력 데이터를 표현할 수 있는 조금 더 좋은 코드를 찾게 되고 최상위 오토인코더는 매우 적은 수의 코드로 처음 주어진 입력값을 표현할 수 있게 된다.

단, 쌓아 올린 오토인코더는 일반적인 역전파(back propagation) 방법으로는 학습이 잘 되지 않는데 이를 극복하기 위해서 RBM(Restricted Boltzmann Machine)을 이용해 오토인코더를 미리 학습시키고, 미리 학습된 결과를 초기 추측으로 사용하여 역전파 방법으로 튜닝하면 쌓아 올린 오토인코더를 제대로 학습할 수 있게 된다.

반대로, 오토인코더의 디코더를 이용하면 축소된 공간에서 임의의 점에 해당하는 가상의 데이터를 원공간에서 생성해낼 수 있다. 결함 데이터가 일반적으로 부족한 고장진단 분야의 경우 (데이터 불평형 문제), 축소된 공간에서의 고장분포를 파악하여 이에 해당하는 다양한 고장데이터를 가상으로 생성할 때 사용할 수 있다. 이밖에도 정보를 압축하고 복원하는 구조로 Convolutional layer 를 통한 오토인코더 방법 (Convolutional Autoencoder), 베이지안적 사고를 바탕으로 신경망을 최적화시키는 방법 (Variational Autoencoder) 등이 제안되었다.

구체적인 방법은 다음과 같다. 입력 값 x가 주어지면 인코더를 통해 압축된 데이터 y로 변환하고 디코더를 통해 압축된 데이터 y를 z로 풀어낸다.
y = fθ(x) = s (Wx+b)
z = gθ(y) = s (W'y + b')
4.1.2.5.2. GAN
generative adversarial networks

2014.6 제안된 방식.
Classification (분류) 문제는 접근법을 discriminative 모델과 generative model로 나눌 수 있다.
  • discriminative model (지도학습의 일종): 입력 x에서 출력 y로 가는 관계인 조건부확률 p(y|x)를 추정하려고 시도한다. 클래스를 분류하려 한다. 만약 generative model에서 만들어진 output이 실제인지 아닌지 판단하는 탐정 역할이라고 최초 논문에는 서술되어 있다. 다중 회귀 분석, 나이브 베이지안 분류기 등.
  • generative model (비지도학습의 일종): p (x,y)을 추정하려고 한다. 분류 경계선 (decision boundary)을 만들려고 한다. 우도 (likelihood)나 사후확률 (posterior probability)를 사용한다. 밀도 기반 추정법들. 최초 논문에는 탐정을 속이기 위해 점점 더 나은 모형의 위조 지폐를 만드는 위조 지폐범이라고 비유되어 설명되어있다.

GAN은 두 모형을 함께 사용하고 서로 경쟁시킴으로써 정확도를 향상시키고자 한다.

출처
[math( \underset{G}{\min} \underset{D}{\max} V (D,G) = E_{x \sim P_{data}(x)} \,[log D(x)] )]
[math( + E_{z \sim P_{z}(z)} \,[log (1-D(G(z)))])]

위 식에서 G는 생성 모델, D는 분류 모델을 가리킨다. 좌변은 생성자가 구분자의 정확도를 최소화시키면서 구분자는 자신의 정확도를 최대화시키는 minimax 최적화 문제를 의미한다. 이 값은 0~1로 주어진다.

우변은 두 개의 항으로 나뉘어 있는데 이는 정보이론 (수학)에서 엔트로피를 최소화하는 것과 같다.[12] 우변 첫번째 항인 E x~Pdata(x) (log D(x))은 실제 데이터 x를 입력받았을 때 올바르게 '실제데이터'(D=1)라고 판단할 경우 최대화된다. 우변 두번째 항인 Ez~Pz(z) (log (1-D(G(z)))은 가상데이터 (z)를 입력받았을 때 올바르게 '가상데이터' (D=0)라는 것을 구분할 경우 최대화된다. 생성자는 그럴듯한 가상 데이터를 생성함으로써 두 번째 항을 최소화시키려고 노력한다.

오토인코더에는 단순히 데이터를 생성한다는 개념만 있었다. 하지만 GAN에는 경쟁이라는 요소가 들어간다. GAN이 오토인코더에 비해 양질의 데이터를 생성할 수 있다.

GAN에도 단점이 있다. 생성자가 그럴듯한 가상 데이터를 학습 초반부터 생성하기 힘들기 때문에 모델이 학습되지 않는 현상이 발생한다. 그리고 오토인코더가 주어진 데이터의 잠재 변수 (latent variable)를 추론할 수 있는 데 비해 GAN은 차원 축소의 개념이 존재하지 않는다.
  • DCGAN
위에서 설명한 딥 CNN과 GAN을 통합한 개념.
Radford, A. (2016) [13] 논문에서 시작되었다.

각 레이어에 Convolution layer를 사용한다. 단, CNN과 달리 Pooling layer, Fully connected layer는 사용하지 않는다. 레이어 계산 결과에 Batch Normalization를 사용한다. 활성 함수(Activation function)으로 ReLU 대신 LeakyReLU를 사용한다.

Generator는 랜덤 입력 ‘z’가 의미있는 잠재 특징 (latent feature)이 되도록 학습한다. 이 랜덤 입력의 의미가 무엇인지 우리는 알 수 없다.
  • cGAN
위에서 설명한 DCGAN으로는 latent feature가 어떤 의미를 가지게 학습시킬 수 없다. 그래서 input을 조절해서 output을 자신이 원하는 방향으로 만드는 것이 불가능하다. 이를 보완하기 위한 아이디어로 제시된 것이 cGAN인데, conditional GAN의 줄임말이다.

기본적인 GAN과 아이디어를 동일하게 가져간다. 하지만 차이가 있다면 DISCRIMINATOR와 GENERATOR에 단순히 LATENT VECTOR을 넣는 것 뿐만 아니라, 경향성을 나타내는 INPUT Y를 추가로 넣어준다. 초기 연구에서는 이 y에 one hot encoding의 방식으로 class를 집어넣어 줬다고 한다.(ex. 만약 1부터 10까지의 숫자 학습을 시킨다고 하면 y에 [1,0,0,0,0,0..]을 넣으면 y가 1일때는 output이 1이 나오는 경향성을 띄게 학습시킴.)

이러한 방법을 통해서 우리는 DCGAN에서는 할 수 없었던 OUTPUT의 경향성을 알 수 있고, 이를 다르게 표현하는 방법으로 INFOGAN등의 논문이 나오게 된다.

4.2. 학습방식에 기반한 분류

주의할 점은 위에서 열거된 아키텍처들이 하나의 학습방식과만 결부되는 것이 아니라는 것이다. 가령 CNN을 지도학습 알고리즘이냐 비지도학습이나 강화학습 알고리즘이냐를 물을 수 없으며 마찬가지로 RNN을 사용한 것 가운데서도 비지도학습 모형도 있고 지도학습 모형도 있다.

4.2.1. 지도학습

레이블링된 데이터를 가지고 훈련한다. 정답을 알고 있는 경우 학습하는 방법. 기계 학습의 분류와 회귀가 지도학습 방법에 속한다. 인공 신경망 역시 분류와 회귀를 적용하는 경우 지도학습으로 분류된다.

4.2.2. 비지도학습(자율학습)

PCA, K-means, DBSCAN등의 알고리즘이 비지도학습에 사용된다. 군집 분석 문서도 함께 볼 것.
4.2.2.1. 진화전략
2018년 진화전략 개발중 OpenAI

4.2.3. 강화학습

파일:상세 내용 아이콘.svg   자세한 내용은 강화학습 문서
번 문단을
부분을
참고하십시오.

5. 학습법

5.1. 경사 하강법

파일:상세 내용 아이콘.svg   자세한 내용은 기계학습 문서
번 문단을
부분을
참고하십시오.

5.2. 확률적 경사 하강법

5.3. Adam

5.4. Nadam

6. 공학적인 기술

  • 미니배치
  • Sparknet (2015말)
  • ReLU (Rectified Linear Unit): Sigmoid 함수에 비해 Vanishing gradient problem을 해결했다.
  • 빅 데이터 프로세싱: 과적합 문제를 다량의 학습 데이터 확보를 통해 해결했다.
  • Dropout: 과적합 문제를 해결하기 위해 일부 레이어의 데이터를 제거하는 기술. (1-p) 확률로 노드를 학습에서 무시하여, 노드에 연결된 edge가 없는 것으로 간주하고 매 주기마다 랜덤하게 갱신한다.
  • 관련 라이브러리: PyTorch, Theano, RNNLIB, CUDA-ConvNet, Pylearn, DL4J, 텐서플로 등.
  • 관련 계산 환경: CUDA, Apache Spark

7. 문제점

  • 학습이 일정하게 진행되지 않는다.
  • 일반 프로그램에 비해 높은 사양을 요구한다. 상술했듯이 뇌에 비해 압도적 열세인 소프트웨어의 격차를 메꾸기 위해 하드웨어 성능이 그만큼 필요하기 때문. CPU나 질 낮은 GPU로만 구동한다면 시간이 많이 걸린다. 신경망 종류에 따라서는 RAM도 수십 GB 이상 잡아먹는다.[14] 이 때문에 CPU, RAM, GPU 성능의 영향을 많이 받으며, 기업에서 딥러닝 개발용으로 쓰는 워크스테이션은 천만원 정도다. 취미로 하거나 독학하는 경우 노트북으로는 택도 없기 때문에, 보통은 일단 무료인 구글 Colab을 쓴다. 근데 이건 직접 데이터나 모델을 업로드 하기 번거롭고, 툭하면 Runtime이 꺼져버리기 때문에 결국 Colab Pro나 AWS, Azure 같은거로 가게 된다.
  • 인간은 아직 에 대해서도 모르는 부분이 많은데 이 인공신경망은 잘 알지도 못하는 뇌를 일단 본떠서 해보자는 것이다. 아이디어는 시냅스나 뉴런 등 인간의 신경을 구성하는 요소들과 그 요소들의 작용들을 통해 얻은 것이 많지만 정작 그 모티브인 뇌에 대해서도 잘 모르는 부분이 많다보니 명확하게 증명되거나 메커니즘이 이해되지 못한 부분은 그저 추측으로 구현되는 경우가 많다.
  • 아직까지 데이터를 정제하는데 사람의 손이 많이 들어가는 등 상당한 노가다가 필요하다.

8. 기술 동향

  • 2010년대 초중반 기준으로 미국이 굉장히 많은 성과를 냈다. 2011~2015년 NIPS에 1,845편의 논문이 발표되었는데 미국이 1,037건으로 과반이 넘었고, 이외에는 영국 110건, 프랑스 103건, 캐나다 97건, 독일 85건, 중국 73건, 스위스 61건, 이스라엘 44건, 일본 43건, 호주 29건, 인도 24건, 싱가포르 16건, 오스트리아/이탈리아/한국 14건 등이었다. 기관별로 보면 스탠퍼드 대학교 84건, 카네기 멜런 대학교 66건, MIT 63건, UC 버클리 61건, 텍사스 오스틴 59건, 유니버시티 컬리지 런던 41건 등이다.

9. 기타

  • 인공신경망과 유전 알고리즘을 결합하여 만드는 모델도 있다. 인공신경망을 다양하게 구성한 뒤 학습시켜 최적의 결과를 찾는다.

10. 관련 문서



[1] 물론 아직 기술력의 한계로 일부만 재현한 것이다.[2] 앞의 둘은 논리적인 문제다. 이 두 시기를 두고 1차 겨울, 2차 겨울이라고 부른다.[3] 엄밀히 따져서 일종의 프로그램이라고도 할 수 있지만 그러기엔 너무 거창한 표현이라서 보통 노드를 하나의 계산 단위라고 말한다.[4] 이같이 하나의 모델이 서로 다른 유형의 데이터를 학습하는 것을 멀티 모달이라고 부른다.[5] Vanishing Gradient Problem. MLP에서 층이 깊어질수록 역전파 알고리즘으로 의미있는 오류를 잘 전달하지 못하는 문제.[6] 거듭되는 인공신경망의 실패로 인하여 단어 자체가 부정적인 의미로 많이 쓰게 되었고, 딥러닝이라는 새로운 용어가 사실상 이를 대체한다.[7] 예를 들어 알파고는 CNN의 일종이다.[8] 일반적으로 패딩 부분은 일정한 값, 특히 0으로 처리한다.[9] 시간에 따라 연속성을 지니는 문제. 텍스트 역시 연속된 문장과 단어로 구성되어 있기 때문에 RNN으로 잘 풀린다.[10] networks의 weight가 업데이트 되는 과정에서 gradient(weight에 대한 일종의 업데이트 비율)가 1보다 작은 값이 계속 곱해지면서 gradient가 사라지는 현상. 따라서, 먼 과거의 상태는 현재의 학습에 아무런 영향을 미치지 못하게 됨[11] 이 문단의 출처: 오토인코더를 이용한 동작 데이터 분석(2013), 소음진동학회지 (2017.5)[12] Jensen-Shannon divergence 측도를 최소화한다고 말한다.[13] Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks. doi : arXiv:1511.06434[14] 진짜 제대로 된 환경에서 작정하고 실험을 돌리면 GB 단위로 세 자릿수를 찍어버린다. 학습에 주로 사용하는 GPU는 RTX A100인데 VRAM이 40GB에 달해 최상위급 소비자용 그래픽 카드인 RTX 4090의 24GB는 우습게 보이는데다가 그 마저도 부족해서 80GB 모델이 출시되었다. 이 녀석의 가격은 한 대에 무려 천 만원대가 넘으며 40GB나 80GB나 한 대로는 부족하기 때문에 여러대를 NVLink로 연결해서 사용한다. 냉각과 그래픽 카드 자체의 전력소모량을 생각하면 돈이 더 들어간다. GPT-3 같은 모델은 너무 무거워서 인퍼런스 조차도 이런 렌더팜으로 돌려야한다. 괜히 인공지능이 대기업이나 엄청나게 돈이 많은 사람만 가질 수 있다는 우려가 생기는게 아니다. 그나마 다행인 것은 대기업이나 정부 기관도 학습에 드는 비용을 줄이는게 이득이기 때문에 AI 전용 가속기가 활발하게 개발되고 있다는 점이다. 대표적인 예로는 구글의 TPU가 있으며 2022년 현재 구글, 마이크로소프트, 엔비디아 등 여러 빅테크 대기업은 물론이고 수 많은 스타트업들이 각자 독자적인 방향으로 가속기를 개발하고 있다.


파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 문서의 r239에서 가져왔습니다. 이전 역사 보러 가기
파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
[ 펼치기 · 접기 ]
문서의 r239 (이전 역사)
문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)


파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 문서의 r85에서 가져왔습니다. 이전 역사 보러 가기
파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
[ 펼치기 · 접기 ]
문서의 r85 (이전 역사)
문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)