기타

김성훈 딥러닝 8 - 딥러닝의 기본개념

하늘이푸른오늘 2018. 2. 14. 00:58

Lec 08-1 딥러닝의 기본 개념 : 시작과 XOR 문제

https://www.youtube.com/watch?v=n7DNueHGkqE

  • 인간의 궁극적 목적 : 대신 생각해주는 기계

    • 전체적으로 매우 복잡하지만, 그것을 구성하는 뉴런은 매우 단순함
    • 이것을 수학적으로 만들면 다음과 같음.
      • body에서 여러개의 신호 $ x_0 , x_1 $ 등을 가중치 $ w_0 w_1 $로 받아 모두 합치고, 
      • 여기에 bias를 추가한 값이 activation function의 일정한 threshold를 넘으면 output =1

  • 이는 Logistic regression 과 유사

  • Hardware 구현

    • AND/OR 연산을 하면 스스로 학습가능하고 재생산가능한 인공지능이 가능할 것이라고 생각함. 이는 단순한 전기적 신호처리로도 가능하다.

    • 그런데 단순한 XOR도 처리할 수 없었다.

  • MIT AI Lab에서 Perceptrons(1969) 에서 불가능함을 수학적으로 증명
    • 여러개를 합치면 MLP (MultiLayer perceptros) 가능하지만, 학습이 불가능하다고 함
    • 이후 인공지능에 대한 관심이 10년 이상 후퇴함

  • 1974년... 80년대 후반에 이르러 이 학습문제 해결가능해짐

  • 고양이 실험 LeCun
    • 특정 모양에 대해서 특정 뉴런만 반응한다는 것을 알게됨
    • 일부 신경들의 신경망들이 나중에 조합

  • Convolutional Neural Networks
    • 부분을 잘라서 보낸 뒤 나중에 합치는 방법으로
    • Alphago도 이 방법 사용
    • 글자 인식 등에 90% 이상의 성능을 발휘.

    • 84-94 : 자동주행차량 연구에 사용

    • 터미네이터2 에도 Neural-net 이 나옴.
  • 문제에 봉착함.
    • Backpropagation이 layer가 많아질수록 성능이 나빠짐.
    • SVM 등의 새로운 간단한 알고리듬이 나옴.
    • LeCun 교수도 1995 년에 비효율적이라고 하고 포기함.

Lec- 08-2 Back-propagation 과 2006/2007 '딥'의 출현

  • CIFAR (Canadian Institute for Advanced Research)
    • 당장 성과가 없어도 연구하도록 장려. 1987년 Hinton은 캐나다로 이주함.
  • 2006, 2007 년 Hinton/Bengio 가 장벽을 깨는 논문을 발표함.
    • Layer가 많을 경우에도, weight를 잘 초기화시키면 training이 가능핟.
    • 어려운 문제에 대해서는 Deep machine learning 방법이 훨씬 효율적이다.
    • 이름을 Deep Learning 으로 Rebranding
  • IMAGENET 대규모 시각인식 챌린지 대회에서 주목을 받게됨.
    • 140만개의 영상에서 1000개의 object class 를 분류하는 것.

    • 2010년에 에러율 30%. 겨우 몇 %정도씩 발전. 그런데 2012년에 급격한 발전. 박사과정 논문. 계속 발전하여, MSRA 연구에서 3% 대 오류로. 사람(스탠포드 학생) 보다 더 나음.

    • 그림을 설명할 수 있게됨

    • Deep API
      • 자연어를 해석하여 필요한 API를 자동으로 끌어와서 프로그램 생성
      • 정확도가 65% 정도로 올라갔음.

  • 소음이 많은 환경에서 음성 인식도 획기적으로 개선.

  • Alphago

  • Geoffrey Hinton 박사가 발견한 사항
    • 아직 labelled dataset이 수천분의 일 수준으로 부족하다.
    • 컴퓨터가 백만배 더 빨라야 한다.
    • 아직도 가중치 초기화가 불합리하다.
    • 비선형 유형을 잘못사용하고 있다.
  • 왜 인공지능에 신경을 써야 하나?
    • 뭔가 데이터를 만지고, 판매하고 있다면 인공지능에 대해 아는 것이 도움 많다.
      • 유튜브 자막, 페이스북 추천, 구글 검색결과
      • 네플릭스, 아마존 등의 경우도 추천.
    • 실생활에서도 활용가능. 진열품 배치 등

  • 왜 지금 해야 하나?
    • 지금 시작해도 세계적인 전문가가 되기에 늦지 않다.
    • 수학적으로도 복잡하지 않다.
    • 현재 90% 이상의 정확도.
    • 도구가 많이 공개되어 있다. 
    • Python 과 같은 쉬운 언어.
    • 매우 즐겁다!!

Lab 8 - Tensor Manipulation

  • 텐서 행렬 처리

import tensorflow as tf
import numpy as np
import pprint

tf.set_random_seed(777)

pp = pprint.PrettyPrinter(indent=4)
sess=tf.InteractiveSession()

t = np.array([0, 1, 2, 3, 4, 5, 6])

print(t.ndim) # rank -> 1
print(t.shape) #shage ->7
print(t[0], t[1], t[-2])
print(t[2:5], t[4:-1])

t = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])
pp.pprint(t)
print(t.ndim)
print(t.shape)

  • Shape, Rank, Axis

t=tf.constant([1,2,3,4])
tf.shape(t).eval()  #4
t=tf.constant([[1,2,3], [5,4,6]])
tf.shape(t).eval()  # 2,3

t = tf.constant(
       [[[[ 1,  2,  3,  4],
         [ 5,  6,  7,  8],
         [ 9, 10, 11, 12]],

        [[13, 14, 15, 16],
         [17, 18, 19, 20],
         [21, 22, 23, 24]]]])
tf.shape(t).eval() # 제일 안쪽이 제일 뒷쪽. 안쪽부터 세기 (1, 2, 3, 4)

  • 축... rank =4 이므로 4개의 축이 있다.
    • 맨안쪽 [1,2,3,4]의 axis=3 (또는 -1) (0부터 시작하므로)
    • 1, 5, 9 방향이 axis=2
  • Matmul 과 multiply는 완전히 다른 개념. 주의할 것
    • 그냥 곱을 할 경우, broadcasting이 적용됨.
  • Broadcasting
    • shape가 다른 행렬에도 4칙연산이 가능하도록 확장시켜주는 것
    • 편리하지만, 잘못된 연산이 발생할 우려가 있음.

matrix1 = tf.constant([[1,2]])
matrix2 = tf.constant(3)
(matrix1+matrix2).eval()  # 3이 [3,3]으로 취급하여, [4,5]가 됨

  • Reduce mean

x = [[1., 2.],   [3,4]]
tf.reduce_mean(x).eval()   # 값 전체의 평균 : 2.5
tf.reduce_mean(x, axis=0).eval() # 세로방향 array([2., 3.])
tf.reduce_mean(x, axis=1).eval() # 가로방향 array([1.5, 3.5])

  • Reduce sum

tf.reduce_sum(x, axis=0).eval() # array([4,6], dtype=float32)
tf.reduce_mean(tf.reduce_sum(x, axis=-1)).eval() # [3, 7] -> 5.0

  • Argmax

x = [[ 0, 1, 2],
      [ 2. 1, 0]]
tf.argmax(x, axis=0).eval() # array([1, 0, 0])
tf.argmax(x, axis=1).eval() # array([2, 0])

  • Reshape ***

t = np.array([[[0, 1, 2],
                  [3, 4, 5]],
                 [[6, 7, 8],
                  [9,10,11]]])
t.shape # (2,2,3)
tf.reshape(t, shape=[-1,3]).eval()
tf.reshape(t, shape=[-1,1,3])eval()

  • Reshape(squeeze, expand)

tf.squeeze([[0], [1], [2]]).eval()   #array([0,1,2])
tf.expand_dims([0,1,2], 1).eval()  #array([[0], [1], [2]])

  • One hot

t=tf.one_hot([[0], [1], [2], [0]] , depth=3).eval() # array ([[[1,0,0]], [[0,1,0]], [[0,0,1]], [[1,0,0]]]) 
tf.reshape(t, shape=[-1,3]).eval() # array([[1,0,0], [0,1,0], [0,0,1], [1,0,0]]) 

  • Type Casting 

tf.cast([1.9, 2.2, 3.3, 4.9], tf.int32).eval()   # array ([1,2,3,4])
tf.cast([True, False, 1==1, 1==0], tf.int32).eval()   # array([1, 0, 1, 0])

  • Stack

x=[1,4]
y=[2,5]
z=[3,6]
tf.stack([x,y,z]).eval()   #array([[1,4], [2,5], [3,6]])
tf.stack([x,y,z], axis=1).eval()   #array([1,2,3], [4,5,6]])

  • Ones and Zeros like

x=[[0,1,2], [2,1,0]
tf.ones_like(x).eval()    #array([[1,1,1], [1,1,1]])
tf.zeros_like(x).eval()   #array([[0,0,0], [0,0,0]])

  • Zip

for x,y in zip([1,2,3], [4,5,6]) :
    print(x,y)                      # 1 4 / 2 5 / 3 6 으로 출력됨
for x,y,z in zip([1,2,3], [4,5,6], [7,8,9]) :
    print(x,y,z)                    # 1 4 7 / 2 5 8 / 3 6 9 로 출력됨