케라스 창시자에게 배우는 딥러닝/ 결론

핵심 개념 리뷰

AI를 위한 여러 방법

  • 딥러닝은 AI나 머신 러닝과 동의어가 아니다. 인공 지능은 역사가 깊고 광범위한 분야로 일반적으로 인지 과정을 자동화 하기 위한 모든 방법을 말한다. 다른 말로 하면 사고의 자동화이다.
    • 엑셀의 스프레드시트처럼 단순한 것부터 휴머노이드 로봇 같이 고수준인 것까지 해당된다.
  • 머신 러닝은 훈련 데이터를 사용하여 자동으로 프로그램(모델이라 부른다)을 개발하는 AI의 특정 하위 분야이다.
    • 데이터를 프로그램으로 바꾸는 과정을 학습이라 부른다.
    • 머신 러닝 역사는 오래됐지만 1990년대 들어서 각광 받기 시작했다.
  • 딥러닝은 머신 러닝의 여러 종류 중 하나이다. 기하학적 변환 함수들이 번갈아 가며 연속적으로 길게 연결된 모델이다. 이 연산들은 층이란 모듈을 구성한다.
    • 전형적인 딥러닝 모델은 층을 쌓아 올린 것이다. 더 일반적으로 말하면 층의 그래프이다.
    • 층은 훈련하는 동안 학습되는 가중치 파라미터를 가진다. 이 가중치에 모델의 지식이 저장된다. 학습 과정은 좋은 가중치를 찾는 것이다.
  • 딥러닝이 여러 머신 러닝 방법 중 하나일 뿐이지만 다른 방법들과 대등한 위치에 있지 않다. 딥러닝은 큰 성공을 거두었다.

머신 러닝 분야에서 딥러닝이 특별한 이유

  • 불과 몇 년 만에 딥러닝은 역사적으로 컴퓨터에서 매우 어렵다고 인식된 다양한 종류의 문제에서 큰 성과를 거두었다. 특히 이미지, 비디오, 사운드 등에서 유용한 정보를 추출하는 기계 인지 (machine perception) 분야이다.
    • 충분한 훈련 데이터(특히 사람이 적절히 레이블링한 훈련 데이터)가 주어지면 사람이 인식하는 거의 모든 것을 데이터에서 추출할 수 있다.
    • 이런 문제로 딥러닝이 지각 문제를 해결한다고 이야기하는데, 사실 지각을 아주 좁게 정의했을 때만 맞다.
  • (딥러닝 미래 전망 생략)

딥러닝에 대하여

  • 딥러닝에서 가장 놀라운 점은 단순함에 있다. 10년 전에는 경사 하강법으로 파라미터 기반의 단순한 모델을 훈련하여 기계 인지 문제에 놀라운 성과를 달성하리라 예상한 사람은 없지만 이제는 경사 하강법으로 충분히 큰 모두 모델을 충분히 많은 샘플에서 훈련하는 것이 필요한 전부라는 것을 안다.
  • 딥러닝에서 모든 것은 벡터이다. 모두가 기하학적 공간에 놓인 하나의 포인트이다. 
    • 모델 입력과 타깃이 먼저 벡터로 바뀌어야 한다. 초기 입력 벡터 공간과 타깃 벡터 공간으로 바꾸는 것이다. 딥러닝 모델의 각 층은 데이터에 간단한 기하학적 변화을 수행하여 통과시킨다.
    • 모델은 층을 연결하여 복잡한 기하학적 변환을 구성한다. 잘게 쪼개어보면 단순한 변환이 연결되어 있다.
    • 이런 복잡한 변환이 입력 공간을 타깃 공간으로 한 번에 하나의 포인트씩 매핑한다. 변환을 결정한느 파라미터는 층의 가중치이다. 모델이 얼마나 잘 작동하는지를 기반으로 반복적으로 업데이트 된다.
    • 기하학적 변환의 핵심 특징은 미분 가능해야 한다는 점이다. 경사 하강법으로 파라미터를 학습하기 위해 필수적이다. 이 말은 입력에서 출력으로 바뀌는 기하학적 변환이 부드럽고 연속적이어야 한다는 뜻이다. 이는 아주 큰 제약 사항이다.
  • 복잡한 기하학적 변환을 입력 데이터에 적용하는 전체 과정은 사람이 뭉쳐진 종이 공을 펼치는 것과 비슷하다. 뭉쳐진 종이 공은 모델이 처음 보게 되는 입력 데이터의 매니폴드이다.
    • 사람이 종이 공을 펼치는 움직임이 각 층에서 수행되는 간단한 기하학적 변환과 비슷하다. 종이 공을 펼치는 전체 손놀림은 모델 전체의 복잡한 변환이 된다.
    • 딥러닝 모델은 고차원 데이터의 복잡한 매니폴드를 펼치는 수학 장치이다.
  • 이것이 딥러닝의 마술 같은 기법이다. 데이터가 가진 의미를 벡터와 기하학적 공간으로 변환한 후 공간에서 다른 공간으로 매핑하는 복잡한 기하학적 변환을 점진적으로 학습한다. 원본 데이터게 있는 모든 형태의 관계를 찾기 위해 충분히 큰 고차원 공간이 필요한 전부이다.
  • 모든 것이 하나의 핵심 아이디어에서 출발한다. 
    • 의미는 어떤 두 가지 사이 관계에서 유도되고 이 관계는 거리 함수로 측정할 수 있다. 우리의 뇌가 기하학적 공간을 통해 의미를 해석하는지 여부는 완전히 다른 이야기다. 벡터 공간은 컴퓨터 입장에서는 계산하기 매우 효율적이다.
    • 지능을 표현하기 위해서는 그래프 같은 다른 데이터 구조가 더 좋다. 신경망은 초기에 그래프를 사용하여 의미를 인코딩하려는 아이디어에서 시작되었다. 이것이 신경망(neural network)이란 이름으로 부르게 된 이유이다. 다른 연구 분야에서는 연결주의(connectionism)이란 이름으로 부르기도 한다.
  • 요즘 신경망이란 이름은 역사적인 이유로만 남아 있다. 신경이나 네트워크와 관련되어 있지 않기 때문에 오해를 일으키기 쉬운 이름이다.
    • 특히 신경망은 뇌와 아무런 관련이 없다. 좀 더 적절한 이름은 층 기반 표현 학습(layered representations learning)이나 계층적 표현 학습(hierarchical representations learning)이다.
    • 또는 연속하여 기하학적 공간을 조작한다는 핵심 사실을 강조하기 위해 심층 미분 모델(deep differentiable model)이나 기하학적 변환 연결(chained geometric transform)도 가능하다.

핵심 기술

  • 딥러닝은 다음과 같은 많은 요인들이 누적되어 만들어진 결과이다. 
    • 알고리즘 혁심이 계속 늘어난다. 처음에 역전파를 개발한 이후 20년이 걸렸지만, 2012년 이후 많은 연구자가 딥러닝에 참여하여 갈수록 더 빨라지고 있다.
    • 지각에 관련된 많은 양의 데이터를 사용할 수 있다. 충분히 많은 데이터에서 충분히 큰 모델을 훈련하는 것이 필요한 전부이다. 이는 인터넷의 성장과 무어의 법칙이 적용된 저장 매체 덕분이다.
    • 고성능 병렬 컴퓨터 하드웨어를 값싸게 사용할 수 있다. NVIDIA에서 만든 GPU는 게임을 위한 장치였지만 딥러닝을 위해 새롭게 디자인 되었다.
    • 이런 컴퓨팅 파워를 활용할 수 있는 다양한 소프트웨어 스택(stack)이 마련되었다. CUDA 라이브러리, 자동 미분을 수행하는 텐서플로 같은 프레임워크, 딥러닝을 쉽게 사용하도록 도와주는 케라스 등이다.

일반적인 머신 러닝 작업 흐름

  • 머신 러닝 작업 흐름에서 정말 어려운 부분은 종종 모델을 설계하고 훈련하기 전에 있는 것들이다. 예측 대상, 활용 데이터, 성공 지표를 결정하기 위해 문제 영역을 이해하는 것이 성공적인 머신 러닝 애플리케이션을 위한 필수 조건이다. 케라스나 텐서플로 같은 도구들이 도와줄 수 없는 부분이다.
  • 전형적인 머신 러닝 작업 흐름을 요약하면 다음과 같다.
    1. 문제를 정의한다.
    2. 목표 달성을 측정하기 위해 신뢰할 수 있는 방법을 찾는다.
    3. 모델을 평가하기 위해 사용할 검증 과정을 준비한다.
    4. 데이터를 벡터화하고 신경망에 잘 맞는 형태로 전처리한다. (정규화 등)
    5. 상식 수준의 기본 모델보다 나은 첫 번째 모델을 만든다. 머신 러닝이 주어진 문제를 해결할 수 있는지 확인한다. 
    6. 하이퍼파라미터를 튜닝하고 규제를 추가하여 모델 구조를 점진적으로 개선한다. 테스트 데이터나 훈련 데이터를 사용하지 않고 검증 데이터의 성능만 사용하여 조정한다. 모델이 과대적합된 후 규제를 추가하거나 모델의 크기를 줄인다.
    7. 하이퍼파라미터를 튜닝하면 검증 세트에 과대적합 된다는 사실을 유념하라. 하이퍼파라미터가 검증 세트에 지나치게 특화될 수 있다. 이 때문에 테스트 세트를 따로 떼어 놓는다.

주요 네트워크 구조

  • 완전 연결 네트워크, 합성곱 네트워크, 순환 네트워크 이 세 종류의 네트워크 구조는 익숙해졌을 것이다. 각 네트워크 종류는 특정 입력 형식을 의미한다.
    • 네트워크 구조는 데이터의 구조에 대한 가정을 담고 있다. 좋은 모델을 탐색하기 위한 가설 공간이 된다.
    • 데이터 구조와 네트워크 구조의 가정 사이가 잘 맞는지에 따라 주어진 구조가 해당 문제에 잘 작동할지가 크게 좌우된다.
  • 이런 다양한 네트워크 종류는 더 큰 다중 네트워크를 만들기 위해 연결될 수 있다. 마치 레고 블록을 연결하는 것과 같다. 여기에서 딥러닝 층은 정보 처리를 위한 레고 블록이 된다. 다양한 입력한 적절한 네트워크 구조 사이의 관계를 간단히 정리해 보자.
    • 벡터 데이터: 완전 연결 네트워크(Dense 층)
    • 이미지 데이터: 2D 컨브넷
    • 사운드 데이터(예컨대 파형 데이터): 1D 컨브넷(권장)이나 RNN
    • 텍스트 데이터: 1D 컨브넷(권장)이나 RNN
    • 시계열 데이터: RNN(권장)이나 1D 컨브넷
    • 다른 종류의 시퀀스 데이터: RNN이나 1D 컨브넷. 데이터 순서에 중요한 의미가 있다면 RNN이 낫다.
    • 비디오 데이터: 3D 컨브넷(연속 동작을 감지할 필요가 있다면)이나 특성 추출을 담당하는 프레임별 2D 컨브넷과 그 뒤를 이어 시퀀스를 처리하는 RNN이나 1D 컨브넷의 조합
    • 볼륨을 가진 데이터: 3D 컨브넷

완전 연결 네트워크

  • 완전 연결 네트워크는 벡터 데이터(벡터의 배치)를 처리하는 Dense 층을 쌓은 것이다. 이런 네트워크는 입력 특성에 특별한 가정을 두지 않는다. 한 Dense 층의 유닛이 다른 층의 모든 유닛과 연결되어 있기 때문에 완전 연결이라 부른다.
    • 층은 모든 입력 특성 간의 관계를 매핑한다. 2D 합성곱은 이와 다르게 국부적인 관계만 바라본다.
  • 완전 연결 네트워크는 보스턴 주택 가격 데이터셋처럼 범주형 데이터에 많이 사용된다. (예컨대 입력 특성이 여러 속성 중 하나이다) 분류나 회귀 출력을 위해 다른 네트워크의 최종 단계에도 사용된다.
    • 예컨대 5장의 컨브넷과 6장의 순환 네트워크는 일반적으로 하나 또는 2개의 Dense 층으로 끝난다.
  • 다음을 기억하라. 이진 분류를 수행하려면 마지막 Dense 층이 하나의 유닛을 가져야 하고 시그모이드 활성화 함수를 사용해야 한다.
    • 손실은 binary_crossentropy를 사용한다. 타깃은 0 또는 1이 된다.
from keras import models, layers

model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')
  • 단일 레이블 다중 분류를 수행하려면 (각 샘플이 정확히 하나의 클래스에만 속한다) 마지막 Dense 층이 클래스 개수만큼 유닛을 가져야 하고 softmax 활성화 함수를 사용해야 한다.
    • 타깃을 원-핫 인코딩 한다면 catrgorical_crossentropy를 손실로 사용한다. 타깃이 정수 숫자라면 sparse_categorical_crossentropy를 손실로 사용한다.
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_classes, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
  • 다중 레이블 다중 분류를 수행하려면 (하나의 샘플이 여러 개의 클래스에 속할 수 있다) 마지막 Dense 층이 클래스 개수만큼 유닛을 가져야 하고 시그모이드 활성화 함수를 사용해야 한다. 
    • 손실로는 binary_crossentropy를 사용해야 한다. 타깃은 k-핫 인코딩이 되어야 한다.
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_classes, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')
  • 연속된 값을 가진 벡터에 대해 회귀를 수행하려면 마지막 Dense 층이 예측하려는 값의 개수만큼 유닛을 가져야 하고 (주택 가격 처럼 하나일 경우가 많다) 활성화 함수는 사용하지 않는다.
    • 회귀에는 여러 손실을 사용할 수 있다. 가장 널리 사용되는 것은 mean_squared_error(MSE)와 mean_absolute_error(MAE)이다.
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_values))

model.compile(optimizer='rmsprop', loss='mse')

컨브넷

  • 합성곱 층은 입력 텐서의 여러 위치(패치)에 동일한 기하학적 변환을 적용하여 공간 방향의 지역 패턴을 찾는다. 이는 이동 불변성을 가진 표현을 만들어 합성곱 층을 데이터 효율적으로 만들고 모듈화한다.
    • 이 아이디어는 1D(시퀀스), 2D(이미지), 3D(볼륨) 등 어느 차원의 공간에도 적용가능하다.
    • Conv1D 층을 사용하여 시퀀스(특히 텍스트 데이터, 시계열 데이터는 이동 불변 가정을 따르지 않는 경우가 많기 때문에 잘 맞지 않는다)를 처리하고 Conv2D 층을 사용하여 이미지를 처리하고 Conv3D 층을 사용하여 볼륨 데이터를 처리한다.
  • 컨브넷 또는 합성곱 네트워크는 합성곱과 최대 풀링 층이 쌓여 구성된다. 풀링 층은 공간 방향으로 데이터를 다운샘플링한다.
    • 특성 맵의 수가 증가함에 따라 적절한 크기로 특성 맵 크기를 유지하여 후속 합성곱 층이 입력에서 더 큰 부분을 볼 수 있게 한다. 컨브넷은 Flatten 연산이나 전역 풀링 층으로 끝나는 경우가 많다.
    • 이 층은 공간 특성 맵을 벡터로 변환한다. 그 뒤에 분류나 회귀를 위한 Dense 층이 이어진다.
  • 일반적인 합성곱이 동일하지만 더 빠르고 효율적으로 표현을 학습하는 깊이별 분할 합성곱으로 조만간 대부분 (또는 완전히) 바뀔 것이다. (SeparableConv2D 층). 3D, 2D, 1D 입력에도 해당 된다.
    • 새로운 네트워크를 처음부터 구축할 때는 당연히 깊이별 분할 합성곱을 고려해야 한다.
    • SeparableConv2D 층은 Conv2D 대신 그대로 바꾸어 쓸 수 있으며, 더 가볍고 빠른 네트워크를 만들고 더 높은 성능을 낸다.
  • 다음은 전형적인 이미지 분류 네트워크이다 (여기서는 다중 분류)
model = models.Sequential()
model.add(layers.SeparableConv2D(32, 3, activation='relu', input_shape=(height, width, channels)))
model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.GlobalAveragePooling2D())

model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_classes, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')

RNN

  • 순환 신경망(RNN)은 한 번에 하나의 타임스텝씩 입력 시퀀스를 처리하고 이 과정 동안 상태(state)를 유지한다. (상태는 하나의 벡터이거나 벡터의 집합이다. 즉, 기하학적 상태 공간의 한 포인트이다)
    • 시간 축을 따라 이동 불변성이 없는 패턴을 가진 시퀀스라면 1D 컨브넷 대신 사용하는 것이 바람직하다 (예컨대 최근 데이터가 오래된 과거보다 더 중요한 시계열 데이터)
  • 케라스에는 3개의 RNN 층이 있다. SimpleRNN, GRU, LSTM이다.
    • 대부분 실전 애플리케이션에는 GRU나 LSTM을 사용해야 한다. LSTM이 더 강력하지만 비용이 많이 들기 대문에 GRU는 좀 더 간단하고 값싼 LSTM의 대체물로 생각할 수 있다.
  • 여러 개의 RNN 층을 겹겹이 쌓으려면 마지막 층 이전의 모든 층은 전체 시퀀스를 출력해야 한다. (모든 입력 타임스탬프에 해당하는 출력이다) 추가적인 RNN 층을 쌓지 않는다면 전체 시퀀스 정보가 담긴 마지막 출력만 반환하는 것이 일반적이다.
model = models.Sequential()
model.add(layers.LSTM(32, input_shape=(num_timesteps, num_features)))
model.add(layers.Dense(num_classes, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')
  • 다음은 벡터 시퀀스의 이진 분류를 위해 RNN 층을 쌓은 모델이다.
model = models.Sequential()
model.add(layers.LSTM(32, return_sequences=True, input_shape=(num_timesteps, num_features)))
model.add(layers.LSTM(32, return_sequences=True))
model.add(layers.LSTM(32))
model.add(layers.Dense(num_classes, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')

딥러닝의 가능성

  • 딥러닝 모델을 만드는 것은 레고 블록을 조립하는 것과 같다는 것을 기억하라. 층을 서로 연결하여 어떤 것이라도 매핑할 수 있다. 적절한 훈련 데이터와 수용할 만한 복잡도가 있는 연속된 기하학적 변환을 통한 매핑이어야 한다. 가능한 조합은 무한하다. 
    • 전통적으로 기초적인 분류와 회귀 작업은 머신 러닝의 기본이다.
  • 다음은 입력과 출력의 종류에 따라 주목할 만한 애플리케이션을 정리한 것이다.
    • 벡터 데이터를 벡터 데이터로 매핑하기
      • 예측 의학
      • 행동 타기팅
      • 품질 제어
    • 이미지 데이터를 벡터 데이터로 매핑하기
      • 의료 진단 보조
      • 자율 주행 자동차
      • 보드 게임 AI
      • 식단 도우미
      • 나이 예측
    • 시계열 데이터를 벡터 데이터로 매핑하기
      • 날씨 예측
      • 뇌-컴퓨터 인터페이스
      • 행동 타기팅
    • 텍스트를 텍스트로 매핑하기
      • 스마트 답장
      • 질문 응답
      • 요약
    • 이미지를 텍스트로 매핑하기
      • 캡셔닝
    • 텍스트를 이미지로 매핑하기
      • 조건부 이미지 생성
      • 로고 생성/선택
    • 이미지를 이미지로 매핑하기
      • 초고해상도 변환
      • 공간 깊이 감지
    • 이미지와 텍스트를 텍스트로 매핑하기
      • 비주얼 QA
    • 비디오와 텍스트를 텍스트로 매핑하기
      • 비디오 QA

딥러닝의 한계

  • 딥러닝으로 구현할 수 있는 애플리케이션 영역은 무한하지만 사람이 레이블링한 데이터가 아주 많더라도 현재 딥러닝 기술로는 달성하기 어려운 애플리케이션이 많다.
    • 예컨대 제품 관리자가 작성한 소프트웨어 기능 정의서와 개발 팀이 이 요구사항에 맞춰 개발한 소스 코드로 이루어진 데이터를 이용하더라도 제품 설명서를 보고 소스 코드를 작성하는 딥러닝 모델은 훈련할 수 없다.
    • 일반적으로 프로그래밍처럼 논증이 필요하거나 장기 계획을 세워 과학적 방법을 적용하거나 알고리즘을 사용하여 데이터를 조작하는 일은 주입하는 데이터의 양의 상관 없이 딥러닝 모델로 달성할 수 없는 영역이다.
    • 심층 신경망으로는 정렬 알고리즘을 훈련하는 것 조차도 아주 어렵다.
  • 딥러닝 모델은 한 벡터 공간을 다른 벡터 공간으로 매핑하기 위해 단순하고 연속된 기하학적 변환을 연결한 것이다. 매니폴드 X에서 매니폴드 Y로 매핑하는 것이 할 수 있는 전부이다.
    • 딥러닝 모델은 일종의 프로그램으로 생각할 수 있지만 반대로 대부분의 프로그램은 딥러닝 모델로 표현할 수 없다.
  • (중간 설명 생략)
  • 딥러닝 모델이 표현할 수 있는 한계가 있고 대부분의 학습 대상 프로그램은 데이터 매니폴드에 대한 연속된 기하학적 변환으로 나타낼 수 없는 근본적인 문제를 해결하지 못한다.

머신 러닝 모델의 의인화 위험

  • 현대 AI에서 오는 실제 위험은 딥러닝 모델이 하는 일을 잘 이해하지 못하고 그 능력을 과대 평가하는 데서 온다. 
    • 사람들은 사진을 설명하는 캡션 생성 모델이 성공적으로 훈련될 때 모델이 그림의 내용을 ‘이해’하고 캡션을 만들었다고 오해하기 때문에 훈련 데이터에 있는 이미지와 조금만 달라져도 모델이 완전히 엉뚱한 캡션을 다는 것을 보고 놀라게 된다..

  • 특히 모델이 잘못 분류하도록 고안된 적대적인 샘플(adversarial example)을 딥러닝 네트워크에 주입할 때 이런 문제가 두드러진다.
    • 판다 이미지에 긴팔 원숭이 그래디언트를 더하면 신경망이 판다를 긴팔원숭이로 분류한다.
    • 이는 딥러닝 모델이 불안정하다는 증거이고, 입력-출력 매핑과 사람의 지각 사이에 큰 차이점을 보여준다.

  • 딥러닝 모델은 입력을 전혀 이해하지 못한다. 사람이 이미지, 소리, 언어를 이해하는 것은 인간의 지각 경험을 통해 형성된 것인데, 머신 러닝 모델은 이런 경험이 없으므로 사람과 같은 방식으로 입력을 이해할 수 없다.
    • 레이블된 많은 양의 훈련 샘플을 모델에 주입하여 데이터를 사람의 개념에 매핑하는 기하학적 변환을 학습한다.
    • 이 매핑은 사람이 경험에서 학습하여 마음 속에 내재된 진짜 모델을 단순하게 흉내낸 것이다. 이는 거울 속에 비친 흐릿한 이미지와 같다.

  • 머신 러닝 기술자는 항상 이를 기억해야 한다. 신경망이 수행하는 작업을 이해한다고 믿는 함정에 빠져서는 안 된다.

지역 일반화 vs 궁극 일반화

  • 딥러닝 모델이 수행하는 입력-출력 사이의 간단한 기하학적 변환과 사람이 생각하고 배우는 방식 사이에는 근본적인 차이가 있다.
    • 사람이 명시적인 훈련 샘플을 사용하는 대신 몸에 배인 경험에서 학습한다는 것만이 아니다. 학습 과정이 다른 것 이외에도 근본적인 표현에 차이가 있다.
  • 사람은 심층 네트워크 또는 곤충들처럼 자극과 반응을 매핑하는 것 이상을 수행한다. 현재 상황과 자기 자신, 다른 사람에 대한 복잡하고 추상적인 모델을 구성한다.
    • 이 모델을 사용하여 미래 가능성을 예측하고 장기 계획을 세운다. 우리는 경험하지 못한 어떤 것을 표현하기 위해 알고 있는 개념을 합친다.
  • 가상의 일을 다루는 이런 능력은 추상(abstraction)과 추론(reasoning)을 통해 우리 마음속에 있는 모델의 공간을 직접 경험할 수 있는 것 이상으로 확장한다.
    • 이것이 사람이 가진 인지 능력의 특징이다. 필자는 이른 궁극 일반화(extreme generalization)이라고 부른다. 
    • 데이터가 조금만 있거나 심지어 새로운 데이터가 전혀 없어도 이전에 경험한 적 없는 새로운 상황에 적응하는 능력이다.
  • (이하 예시 설명 생략)

  • 요약하면 기계 인지에 대한 발전에도 사람 수준의 AI는 아직 멀었다. 현재 모델은 과거 데이터와 비슷한 환경이 적용되는 지역 일반화만 수행할 수 있다.
    • 반면 사람의 인지 능력은 완전히 새로운 환경에 빠르게 적응하고 먼 미래으 상황을 계획할 수 있는 궁극 일반화이다.

정리

  • 딥러닝의 실제 성공은 연속된 기하학적 변환을 사용하여 공간 X에서 공간 Y로 매핑하는 능력이다. 이런 방식이 모든 산업을 획기적으로 변화시킬 것이다.
  • 하지만 사람 수준의 AI에는 한참 멀었다. 사람의 뇌와 경쟁할 수 있는 AI를 만들기 위해서는 단순한 입력-출력 매핑을 벗어나 추상과 추론을 해야 한다.

딥러닝의 미래

  • 필자가 기대하는 주요 방향은 다음과 같다.
    • 모델은 범용 목적의 컴퓨터 프로그램에 가까워질 것이다. 현재의 미분 가능한 층보다 더 뛰어난 모듈로 만들어질 것이다. 이것이 현재 모델의 근본적인 약점인 부족한 추상과 추론을 얻는 방법이 될 것이다.
    • 위 사항을 가능하게 만드는 새로운 형태의 학습 덕택에 미분 가능한 변환에서 탈피한 모델이 등장할 것이다.
    • 엔지니어는 모델에 덜 관여할 것이다. 끝도 없이 하이퍼파라미터를 튜닝하는 것은 우리의 일이 아니다.
    • 재사용 가능하고 모듈화된 프로그램 서브루틴을 사용한 메타러닝 시스템(meta-learning system)처럼 더 훌륭하고 체계적으로 이전에 학습한 특성과 구조를 재사용할 것이다.

프로그램 같은 모델

  • 머신 러닝 분야에서 기대하는 필수적인 변화는 순수한 패턴 인식을 수행하고 지역 일반화만 얻을 수 있는 모델을 탈피하는 것이다. 추상과 추론을 통해 궁극 일반화를 달성할 수 있는 모델이다.
    • 기본 형태의 추론을 할 수 있는 현재 AI 프로그램은 모두 프로그래머가 하드코딩한 것이다. 예컨대 탐색 알고리즘, 그래프 처리, 형식 논리에 기반한 소프트웨어이다.
    • 딥마인드의 알파고에서 가장 지능적인 부분은 전문 프로그래머가 설계하고 하드코딩한 것이다.(몬테 카를로 트리 탐색(Monte Carlo Tree Search)이 한 예)
    • 특정 서브모듈만 데이터에서 학습한다(가치 네트워크(value network)와 정책 네트워크(policy network))
    • 미래에는 이런 AI 시스템이 사람의 개입 없이 완전하게 학습될 것이다.
  • (예시 생략)
  • 우리는 하드코딩된 알고리즘의 지능(수동으로 만든 소프트웨어)과 학습된 기하학적 지능(딥러닝)에서 탈피할 것이다.
    • 그 대신 추론과 추상 능력을 가진 형식이 있는 알고리즘 모듈과 형식이 없는 직관가 패턴 인식 능력을 제공하는 기하학적 모듈이 합쳐질 것이다.
    • 전체 시스템은 사람이 거의 개입하지 않고 학습될 것이다.
  • 관련되어 크게 성장하리라 생각되는 AI의 하위 분야는 프로그램 합성(program synthesis)이다. 특히 신경망 프로그램 합성(neural program synthesis)이다.
    • 프로그램 합성은 탐색 알고리즘을 (유전 프로그래밍(genetic programming)처럼 아마도 유전 탐색 방식으로) 사용해서 거대한 프로그래밍 가능 공간을 탐색하여 자동으로 간단한 프로그램을 합성한다.
    • 프로그램이 입력-출력 쌍으로 제공되는 필요 사양을 만족시키면 탐색이 중지된다. 이는 머신 러닝이 하는 것과 같다.
    • 입력-출력 쌍으로 훈련 데이터가 주어지면 입력-출력을 매핑하고 새로운 입력에 일반화할 수 있는 모델을 찾는다.
    • 차이는 하드코딩된 프로그램(신경망)에서 모델 파라미터를 학습하는 것이 아니라 이산적인 탐색 과정(discrete search process)을 통해 소스 코드를 생성하는 것이다.
  • 이 분야가 다음 몇 년 안에 새로운 관심을 불러일으킬 것으로 확실히 예상된다. 특히 딥러닝과 프로그램 합성을 아우르는 분야가 등장하리라 기대한다. 
    • 범용 프로그래밍 언어로 프로그램을 생성하는 대신 for 루프 등 다양한 알고리즘 요소로 무장한 신경망을 생성할 것이다. 직접 소스 코드를 생성하는 것보다 훨씬 쉽고 유용하다.
    • 머신 러닝으로 풀 수 있는 문제의 범위, 즉 적절한 훈련이 주어졌을 때 자동으로 생성할 수 있는 프로그램 공간이 크게 확장될 것이다. 현재 RNN은 알고리즘-기하학적 혼합 모델의 선사시대 조상이라 볼 수 있다.

역전파와 미분 가능 층을 넘어서

  • 머신 러닝 모델이 좀 더 프로그램처럼 된다면 더는 미분 가능할 필요가 없다. 이 프로그램은 여전히 서브루틴으로 연속된 기하학적 변환 층을 사용하겠지만 전체 모델은 그렇지 않을 것이다.
    • 결국 고정되고 하드코딩된 네트워크의 가중치를 조정하기 위해 역전파를 사용하는 것은 미래에 모델을 훈련하는 방법이 되지 못할 것이다. 적어도 전부는 아닐 것이다.
  • 미분 가능하지 않은 시스템을 효율적으로 훈련할 방법을 찾아야 한다. 현재는 유전 알고리즘, 진화 전력, 일부 강화 학습, ADMM(Alternating Direction Method of Multipliers) 같은 방법이 있다.
    • 그렇다고 경사 하강법이 사라지는 것은 아니다. 그래디언트 정보는 미분 가능한 파라미터 모델보다 점점 더 발전할 것이다. 따라서 자동화된 개발은 역전파 그 이상이 필요할 것이다.
  • 역전파는 엔트-투-엔드(end-to-end)로 연속된 변환을 학습하는데 뛰어나지만 심층 네트워크의 모듈성을 십분 활용하지 않기 때문에 계산 효율성이 떨어진다.
    • 좀 더 효율적으로 만들기 위한 보편적이 한 가지 방법이 있는데 모듈화와 계층화이다.
    • 동기화 메커니즘을 추가하여 훈련 모듈을 독립적으로 분리하면 역전파를 좀 더 효율적으로 수행할 수 있다. 이런 전략이 딥마인드의 신태틱 그래디언트(synthetic gradient)에 관한 연구에 일부 반영되었다.
    • 필자는 가까운 미래에 이 부분에 더 많은 발전이 있을 것으로 기대한다. 그래디언트를 사용하지 않는 효율적인 탐색 과정을 거쳐 전체적으로 미분 가능하지 않은 (부분적으로는 미분 가능한) 모델이 훈련되는 미래를 상상한다.
    • 반면 미분 가능한 부분은 높은 효율의 역전파 방식을 사용하고 그래디언트의 이점을 살려 더 빨리 훈련될 것이다.

자동화된 머신 러닝

  • 미래에는 모델 구조가 전문 엔지니어에 의해 고안되는 것이 아니라 학습될 것이다. 구조를 학습하는 것은 프로그램 같은 머신 러닝 모델과 풍부한 구성 요소를 재사용하는 것에 밀접하게 관련되어 있다.
  • 현재는 딥러닝 엔지니어의 대부분 업무가 파이썬 스크립트로 데이터를 이리저리 처리하거나 작동하는 모델을 얻기 위해 심층 네트워크의 구조와 많은 하이퍼파라미터를 튜닝하는 것이다.
    • 용감한 엔지니어는 현존하는 최상의 모델을 얻기 위해 튜닝하기도 한다. 말할 필요도 없이 이는 최선이 아니다. 이 부분은 AI가 도울 수 있다.
    • 안타깝지만 데이터 전처리 부분은 자동화하기 어렵다. 도메인 지식은 물론 엔지니어가 하려는 것에 대한 명확한 고수준의 이해가 필요하기 때문이다.
  • 이에 반해 하이퍼파라미터 튜닝은 간단한 탐색 절차이다. 엔지니어가 원하는 바를 알고 있다면 튜닝되는 네트워크의 손실 함수로 정의될 수 있다. 이것이 모델 파라미터 튜닝을 담당하는 AutoML 시스템에서 널리 사용되는 방식이다.
    • 기본적으로 이런 시스템은 쌓여 있는 층의 개수와 순서, 유닛과 필터의 개수를 튜닝한다. 이것이 7장에서 이야기한 Hyperopt 같은 라이브러리가 하는 방식이다.
    • 좀 더 대담하게 가능한 제약을 최소화하기 위해 강화 학습이나 유전 알고리즘 등을 사용하여 아예 처음부터 적절한 구조를 학습할 수도 있다.
  • 또 다른 중요한 AutoML의 방향은 모델의 가중치와 함께 모델 구조를 학습하는 것이다. 조금씩 다른 구조를 실험할 때마다 밑바닥부터 새로운 모델을 훈련하는 것은 매우 비효율적이다.
    • 이런 이유 때문에 진짜 강력한 AutoML 시스템은 모델의 특성이 훈련 데이터에서 역전파로 튜닝됨과 동시에 구조를 찾을 것이다. 이런 방법은 이제 막 생겨나기 시작했다.
  • 이런 일이 이루어지더라도 머신 러닝 엔지니어의 직업이 사라지지 않는다. 오히려 엔지니어는 가치 창조 사슬 위로 이동할 것이다.
    • 비즈니스 목표를 잘 반영하는 손실 함수를 만들고 이 모델이 활동할 디지털 생태계(예컨대 모델의 예측을 소비하고 훈련 데이터를 생산하는 사용자들)에 미칠 영향을 이해하는데 더 많은 노력을 기울이게 될 것이다.

영구 학습과 모듈화된 서브루틴 재사용

  • 모델이 더 복잡해지고 풍부한 알고리즘 요소 위에서 구축되면 늘어난 복잡도 덕택에 작업 간의 재사용성이 증가할 것이다. 새로운 작업이나 새로운 데이터셋마다 새로운 모델을 처음부터 훈련하지 않아도 된다.
    • 많은 데이터셋은 새로운 복잡한 모델을 처음부터 만들기에 충분한 정보를 담고 있지 않다. 이전에 보았던 데이터셋에서 얻은 정보를 재사용할 필요가 있다.
    • 현재 작업과 이전 작업 사이에 중복되는 점이 많기 때문에 새로운 작업마다 처음부터 모델을 훈련하는 것이 비효율적이기도 하다.
  • 최근 몇 년간 한 가지 눈에 띄는 점이 반복적으로 관찰되었는데, 느슨하게 연관된 몇 개의 작업에서 같은 모델을 동시에 훈련하면 각 작업에서 더 뛰어난 모델을 만든다.
    • 예컨대 영어-독일어 번역과 프랑스어-이탈리어 번역에 동일한 기계 번역 신경망 모델을 훈련하면 각 언어 번역에서 더 뛰어난 모델을 얻게 된다.
    • 비슷하게 같은 합성곱 기반을 공유하는 이미지 분류 모델과 이미지 분할 모델을 함께 훈련하면 양쪽 작업에 더 뛰어난 모델을 만들 수 있다.
  • 아주 직관적인 현상인데, 겉으로 보기에 관련 없는 작업 사이에 일정량의 정보가 항상 중복되어 있다. 하나의 작업에서만 훈련된 모델보다 병합 모델이 많은 양의 정보를 활용할 수 있다.
    • 현재는 작업 간에 모델을 재사용할 때 시각 특성 추출 같은 공통 기능을 수행하는 모델의 사전 훈련된 가중치를 사용한다. 5장에서 이런 방식을 보았다.
  • 미레에는 이것이 좀 더 일반화 되어 어느 곳에나 등장할 것으로 기대한다. 이전에 학습된 특성(부분 모델의 가중치) 뿐만 아니라 모델 구조와 훈련 과정도 사용할 것이다.
    • 모델이 프로그램과 더욱 비슷해지면 프로그래밍 언어에 있는 함수나 클래스 처럼 모델의 프로그램 서브루틴을 재사용하기 시작할 것이다.
  • (이하 소프트웨어 개발 과정 설명 생략)

장기 비전

  • 머신 러닝 모델에 대한 장기 비전을 요약하면 다음과 같다.
    • 모델은 더 프로그램 같아질 것이다. 현재 우리가 수행하는 입력 데이터의 연속된 기하학적 변환 이상을 수행할 수 있는 능력을 가질 것이다.
      • 이런 프로그램은 사람이 주변 환경과 자신에 대해 가진 추상적인 정신 모델에 더 가까워질 것이며, 이런 모델은 풍부한 알고리즘 능력 때문에 더욱 강한 일반화 성능을 가질 것이다.
    • 특히 형식 추론, 탐색, 추상화 능력을 제공하는 알고리즘 모듈과 비형식적인 직관과 패턴 인식 능력을 제공하는 기하학적 모듈을 혼합할 것이다.
      • 알파고가 심볼릭과 기하학적 기반의 혼합된 AI 초기 버전을 보여주었다.
    • 이런 모델은 엔지니어가 하드코딩하는 대신 자동으로 만들어질 것이다. 재사용 가능한 서브 루틴의 전체 공통 라이브러리에 저장된 모듈을 사용한다.
      • 이 라이브러리는 수천 개의 작업과 데이터셋에서 고성능 모델을 학습하여 발전 시킨 것으로, 메타 학습 시스템에 의해 자주 발견되는 문제 해결 패턴은 재사용 가능한 서브루틴으로 바뀌어 전체 공통 라이브러리에 추가될 것이다.
      • 이 서브루틴은 소프트웨어 공학의 함수나 클래스와 매우 비슷하다. 이는 추상화를 구현하게 된다.
    • 전체 공통 라이브러리와 이와 연계된 모델 성장 시스템은 사람과 비슷한 궁극 일반화의 어떤 형태를 달성할 수 있을 것이다.
      • 새로운 작업이나 상황이 주어지면 시스템이 매우 적은 데이터를 사용하여 이 작업에 적절한 새로운 작동 모델을 조립할 수 있다.
      • 이는 일반화가 잘된 풍부한 프로그램적 요소와 비슷한 작업에서 얻은 폭넓은 경험 덕택이다.
      • 비슷한 방식으로 이전에 여러 게임을 플레이한 경험을 가지고 있다면 사람은 복잡한 새로운 비디오 게임을 빠르게 배울 수 있다. 이전 경험에서 유도된 모델은 자극과 행동 사이의 기본 매핑이 아니고 추상적이고 프로그램에 가깝기 때문이다.
    • 이런 식으로 영구 학습 모델 성장 시스템을 인공 일반 지능(Artificial General Intelligence, AGI)으로 생각할 수 있다.
      • 기술적 특이점을 추종하는 사람들이 생각하는 어떤 로봇 재앙도 기대하지 마라. 지능과 기술에 대한 아주 큰 오해가 깊게 쌓여 생긴 순수한 환상일 뿐이다. 이 책은 그런 견해를 따르지 않는다.

빠른 변화에 뒤처지지 않기

  • (이하 생략)
    • 캐글의 실전 문제로 연습하고
    • 아카이브(arXiv)에서 최신 논문을 읽고
    • 케라스 생태계를 활용해라.

맺음말

  • AI 분야의 배움은 아주 긴 여행이다. 이 분야는 확실히 아는 것보다 모르는 것이 훨씬 많다.
  • 지금까지 많은 발전이 있었지만 AI 분야에서 근본적인 질문들은 대부분 답을 찾지 못한 상태이다. 아지 많은 것들은 질문조차 되지 않았다.
[ssba]

The author

Player가 아니라 Creator가 되려는 자/ suyeongpark@abyne.com

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.