인공지능 서비스 만들기

1인 지식 기업을 꿈꾸는 30, 40대 직장인을 위한 실무 프로젝트
Deep Learning, NLP, Computer Vision, Tensorflow

[모두를 위한 딥러닝] 강좌 요약 - Section 7~10

Deep Learning

모두를 위한 딥러닝 Section 7부터 요약을 한다. 




학습 Rate, Overfitting, Regularization


Gradient Descent(GD) 알고리즘앞에 * 는 알파값은 Learning Rate 이다. 

  - GD는 Cost function의 최소값을 구해가는 알고리즘

  - Overshooting: Learning rate을 너무 크게 잡는 경우

  - local minimum: rate이 너무 작을 경우 오래 걸리고, local이 최소라 판단할 수도 있다. 

대략 0.01 로  시작



Feature Data 선처리 

  - X 데이터이다. 

  - GD를 위하여 선처리 과정이 필요하다

  - 데이터가 둘쭉날쭉할 때 데이터를 0과 1사이 값으로 Standardization하는 것을 Normalization 한다라고 표현함. 두가지 경우로 preprocessing한다.

    + 특정 범위안에 들어있도록 만들거나

    + zero-centered data로 만들거나

  


  - 평균과, 분산을 통해 Standardization한다. MinMaxScaler를 사용하면 0과 1사이의 값으로 치환된다.



Overfitting

머신러닝이 학습을 통하는데 너무 학습에 딱 맞는 데이터이면 엉뚱한 데이터를 줄 때 예측이 틀릴 수 있다. 

  - 데이터에 맞추어진 Model이 Overfitting되었다 표현함.


  - 많은 데이터로 훈련, 중복 feature수를 줄임. 

  - Regularization통해 구불구불한 데이터를 펴준다. 

  - Regularization strength 함수를 준다 - 람다. l2reg (L2 regular) . 필요한 값은 취하고 필요없는 것은 버리는 것이다. 




Training / Testing 데이터 셋


전체 데이터중에 training set과 test set을 나누고, 훈련시에는 training set만을 사용한다. 

  - training = training + validation

  - testing = testing


Online Learning

  - 한번 학습후 추가되는 데이터를 이전 생성된 모델에 추가하여 다시 학습시켜서 모델을 발전시키는 학습형태


Accuracy

  - 정확도: Model이 prediction한 값과 Y (레이블) 실제값에 대한 맞춘 퍼센트


MNIST 데이터

  - 28*28*1 image = 784 

  - 한번에 몇개씩 학습 = 1 Batch

  - 전체 training data set 학습 = 1 Epoch (에포크)




Deep Learning 기본 개념


Input X와 신호의량 W(weight) 과 편향값 b (bias)를 더하여 어떤값을 넘으면 1, 아니면 0으로 된다. 이때 Activation Function이 이용된다.

  - 1958 OR, AND는 기계가 풀수 있었지만 XOR 문제를 못 풀게되었다. 

  - 1969 MIT AI Lab, Marvin Minsky 교수 - Perceptrons, MultiLayer로 풀 수 있다. 

     input layer -> hidden layers -> output layer

  - 1974, 1982 Backpropagation, Paul Werbos, 1986 by Hinton

     더 복잡한 형태의 계산이 가능해짐

  - 1995 Backprogagation은 몇개 layer는 잘 동작하나 몇십개가 되면 Backpropagation의 값이 희석되어 성능이 더 떨어지는 현상이 발생함. 

    1987 캐나다 Hinton 교수 주도의 CIFAR 기구에서 연구를 계속 진행함. 

  - 2006 Breakthrough 통해 초기값을 잘 주면 학습가능하다. Hinton

     Neural Network 을 Deep Net, Deep Learning으로 이름을 바꿔 부름

  - 2010 ImageNet Classification 통해 인식율 대회 -> 2015년 Deep Learning이용 3% 에러까지 올라옴

     Speech Recognition - 시끄러운 곳에서 음성인식, Game

  - 2016 Convolution Neural Networks LeCun(라쿤)

   

배열 다루기

0부터 시작, 마지막 -1

  - Rank: 차원, [] 하나가 1차원. 예) [[]] 2차원

  - Shape: 자신 차원안의 데이터 원소갯수 예) [[[1,2],[2,3],[4,5]]] 3차원 (1차원 원소갯수, 2차원 원소갯수, 3차원 원소갯수) => (1, 1, 2)

  - Slice: 원소 n개 묶음. 슬라이싱한다고 표현

  - Axis: Rank 4차원이면 맨 바깥쪽이 Axis=0, 제일 안쪽이 Axis=3이 된다.


tensorflow 계산식 (참조)

  - matrix1 * matrix2 또는 matrix1 + matrix2 같은 사칙연산 => Broadcasting Shape이 달라도 연산이 가능하게 함. 

  - matmul(matrix1, matrix2) 사용

  - reduce_mean, reduce_sum: 결과가 float이면 입력값도 float이어야 소수점까지 출력된다. axis 설정이 있어서 차원의 계산값이 다를 수 있다. 

  - Argmax: axis에 따라 결과의 원소 갯수가 틀려진다. 

  - Reshape: 가장 많이 사용함. shape(3,2,3)을 변경. 가장 안쪽의 값은 항상 그대로 가져간다. 

     tf.reshap(t, shape=[-1, 3]).eval()

    +  squeeze 는 안쪽의 값을 1차원 배열로 reshape한다. 

    + expand_dims 는 값을 차원이 있는 배열로 reshape한다. squeeze의 반대

  - one_hot: 전체 값중에 선택된 것만 1로 만들고 나머지는 0으로 만듦. 1차원 배열(백터)에 해당함.

  - cast: 형변환 float -> integer, 또는 true/false를 1/0으로 변환.

  - stack: 여러 개별 배열을 한 배열로 넣음. axis 설정가능 

  - ones_like, zeros_like: 똑같은 배열 차원의 1 또는 0으로 만들어줌

  - zip: 복수개의 tensor를 가지고 있을 때 한번에 묵어서 for 루프등에서 처리하고 싶을 때




XOR 문제 Neural Network (Deep Learning)으로 풀기


Cell별 W, b를 구하는 학습이 가능 한가를 증명

  - sigmoid를 이용함

  - 3개의 cell로 XOR문제 풀기


하나의 네트워크를 구성하면 다음과 같다. 


이것을 하나의 배열로 만들면 Multinomial Classification이된다. 



Backpropagation과 Derivation 하기

미분이란

  - 순간 변화율, 기울기로 나타남

  - f(x + A) - f(x) / A 로 A를 작은 값으로 사용. 

  - f(g(x)) 에서 x가 f에 미치는 영향에 대해 미분을 하면 df/dx로 나온다. 이것은 df/dg * dg/dx 의 결과이다.

편미분

  - Partial Derivation

  - 내것만 미분하고 나머지는 상수로 본다.

  - xy 에 대한 x 편미분은 y 이고 x+y에 대한 x편미분은 1이다. 이는 더하기는 각각을 편미분하기 때문이다.


각각의 Weight에 대한 미분값을 구하기 어렵다. 1974, 1982 Paul/Hinton에 의해 backpropagation으로 해결됨.

  - 편미분: 식마다 편미분, g, f

  - Chain rule의 경우 미분 f(g(x)) : x값이 f에 영향을 미치는 정도. 

  - 편미분값이 다음에 영향을 미칠 값이 된다. 

  - f는 g를 사용하는 chain rule 사용

    편미분에 대한 복합함수를 chain rule을 사용하면 뒤로가면서 w의 편미분값을 얻을 수 있다. (참조)


  - 뒤의 것의 미분값과 자신의 미분값을 사용한다. 

  - Tensorflow에서 graph형태인 것은 BP를 적용하기 위함이다. 


TensorBoard

  - loss의 변화를 차트로 보거나, 텐서의 그래프를 볼 때 사용

  - name_scope를 사용해서 작은 단위의 텐서를 논리적으로 묶어서 그래프로 보여줄 수 있다. 

  - 지정한 디렉토리에 있는 모든 텐서 로그파일을 한번에 불러와서 차트에 보여줄 수 있다.

  $ tensorboard --logdir=<path>

//브라우져에서 http://127.0.0.1:6006/ 호출




섹션 10 - ReLU


네트워크 연결되어 최종 값은 sigmoid같은 Activation function을 통해 변환되어 다음 네트워크로 전달된다. 

  - Hypothesis는 여러 Layer를 두어서 만들어 진다. 

  - Layer종류: Input, Hidden, Output

  - layer별로 W(weight) 과 B (bias)가 주어진다. 

  - hidden layer가 많을 경우 Accuracy가 떨어진다. => Backpropagation의 문제점이 발생. 

    + Vanishing Gradient : 기울기기 사라짐. 아주 작은값들이(weight값, 0.01같은 값) layer가 뒤로(backward propagation) 갈수록 곱해지면서 문제가 발생함 . 


  - Hinton교수가 밝힘. Sigmoid를 잘 못 쓴것 같다. =>  Rectified Linear Unit (ReLU)를 사용한다. 이제 sigmoid는 사용하지 말자!  즉, 1 또는 0으로 나와야 하기 때문에 마지막만 sigmoid사용

  - ReLU(렐루) 0이하는 모두 0으로 처리한다. 




초기값 설정 잘 하기


초기값 W를 잘 정해야 한다. 

  - 초기값을 0으로 준다면: BP하면 앞의 W값들이 0이되어 VG (Vanishing Gradient)됨. 

  - 2006 Hinton이 Restricted Boatman Machine (RBM) 사용함 - Deep Belief Nets

    + 처음 2개 layer에 대한 encoder/decoder를 통해 weight를 구함. 

    + 그다음 2개를 en/de하면서 weight을 학습시킴

     각 학습을 통해서 initial weight값을 가지고 학습시킴. 이것을 fine tunning이라함. 

  - 2010 Xavier initialization => RBM 처럼 비슷하게 쉽게 나온다. 

  - 2015 He initialization 초기화 잘됨




Dropout 과 앙상블


훈련시킬 때 적용할 수 있는 방법

Overfitting은 학습데이터를 가지고 accuracy를 측정해보면 99% 맞는데, 전혀 다른 test data를 넣으면 0.8%이면 오버피팅이다. 

  - layer를 많을 쌓을 수록 overfitting될 확률이 높다. 

  - 방지하는 방법

    + 데이터를 많이

    + Regularization: 구부러진 데이터를 펴기 =>  l2reg

  

    + NN에서는 Dropout도 사용함. 몇개의 layer를 skip한다. 학습할때 dropout = 0.7 정도 실전에서는 dropout rate = 1이다.

       텐서플로우에서는 dropout layer를 하나 더 추가함. keep_prob = 0.7 학습, 1 실전 (참조)

   


앙상블 (Ensemble)

  - 모델들 학습시킬 때, 데이터 셋을 몇개로 만들어 각각 Model을 만들어 Model들을 합쳐 결과를 만든다. 실전에 많이쓴다. 

  - Model = Hypothesis + Cost + Optimizer



Optimizer

다양한 옵티마이져가 존재한다.

  - ADAM(아담) 을 기본으로 써보자. 




네트워크 조립하기


어떤 Net을 구성하느냐의 상상력이 필요

  - 여러 layer를 구성하고, 몇단의 layer를 건더뛰게하는 Fast Forward 방식이 있다. ResNet구조이다. 


  - Split & Merge하여 layer 조립하기  - CNN


  - Recurrent Network: 앞으로만 나가는 것이 아니라 옆으로도 layer가 증가 - RNN



MNIST 98 % 올리기



=> CNN을 사용하면 99% 까지 올라간다. 




정리


- NN(Neural Net)이 깊어지면 Backpropagation할 수록 Vanishing Gradient가 발생하여 Sigmoid를 사용하지 않고 ReLU를 쓴다. 

- NN 구성 방법

  + 초기값 설정을 잘 하자. Xavier 사용. Tensorflow에 함수 존재함

  + NN의 layer가 깊어지면 모델이 Overfitting될 수 있다. 이것은 학습을 하면서 이전것을 기억하기 때문인데 이를 Dropout으로 해결한다. 

  + 많은 데이터를 여러 set으로 나누어 학습한 모델들을 최종 결과물로 만드는 앙상블을 실전에서 많이 사용한다. 

  + 옵티마이저도 기본 ADAM(아담)을 사용한다. 

  + NN의 구성은 CNN, RNN방식이 있고 본인만의 상상력을 발휘하여 만들 수 있다. 

'Deep Learning' 카테고리의 다른 글

[모두를 위한 딥러닝] 강좌 요약 - Section 1~6  (0) 2019.01.09

[모두를 위한 딥러닝] 강좌 요약 - Section 1~6

Deep Learning

성김교수의 모두를 위한 딥러닝을 요약한다. 


  - ML 개념 이해

  - Linear Regression과 Multi-Variables Linear Regression 개념

  - Logistic Regression (Classification)에서 Binary Classification과 Multinomial Classification 개념




기본적인 ML 용어와 개념 설명


프로그램이 학습을 통해 배우는 프로그래밍

  - Supervised Learning: 결과가 있는(Labeled) 데이터를 통해 학습. 예) 이미지 학습, 이메일 스팸 필터링, 시험성적 예측

  - Unsupervised Learning: un-labeled 데이터를 통해 학습. 예) Word Clustering

 

지도학습

  - 값, label, y

  - input data, x, training dataset


지도학습 종류

  - regression(회귀): 0~100 연속값으로 결과(label)를 통해 새로운 input을 주었을 때 값을 예측

  - classification(분류): true or false, pass or not pass

  - multi-label classification: A, B, C or D, F


Tensorflow

  - pip install --upgrade tensorflow

  - 또는 아나콘다를 설치하여 가상환경으로 python버전까지 설정해서 사용한다. 

  - 가장 쉬운 방법은 구글의 코랩에서 수행한다.

    

    결과의 b = bytes literals 의미

  - tensor 수행은 session.run(tensor) 해주어야 한다.

     step-1) Tensor들의 flow graph 만들고

     step-2) data를 입력해서 graph를 수행한다.

     step-3) session.run(tensor)을 통해 graph안의 변수를 업데이트 하거나, 결과값을 반환한다. 

     


Tensorflow data feed

  - tf.placeholder(tf.float32) 처럼 자료형을 갖는 placeholder를 만듦

  - session.run(tensor, feed_dict=<data>) 처럼 데이터를 placeholder에 넣어준다. 


Tensorflow

  - Ranks: 차원, n-Tensor

  - Shapes: 엘러먼트에 몇개씩 들어 있느냐?

  - Types: 데이터타입, float32를 많이 사용함




Linear Regression


용어: Hypothesis, Cost Function, Gradient Descent


선형회귀, 연속된 데이터를 통해 다음것을 예측하고자 할 때 사용한다. Hypothesis 가설을 통해 Linear한 1차원 선의 기울기를 찾는다.


H(x) = Wx + b


Cost Function

  - 가설 Linear선과 실 데이터 사이의 거리를 측정함

  - 가설값 - 실데이터의 차이로 계산함

  - +, -  일수 있으므로 제곱을 한다.


코스트 펑션의 W, b의 펑션이다. 가장 작은 cost를 (minimize cost) 구할 수 있는 W, b의 값을 구하는 것이 목표이다. 

    



Tensorflow로 Linear Regression 구현해 보기

  - 깃헙 소스

  - tf.Variable: 텐서플로우가 변경하는 값으로 trainable variable로 본다. 

  - Minimize cost를 구하는 알고리즘으로 GradientDescent를 사용한다.

import tensorflow as tf

tf.set_random_seed(777)

x_train = [1,2,3]

y_train = [1,2,3]


W = tf.Variable(tf.random_normal([1]), name="weight")

b = tf.Variable(tf.random_normal([1]), name="bias")


h = x_train * W + b


cost = tf.reduce_mean(tf.square(h - y_train))


optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)

train = optimizer.minimize(cost)


sess = tf.Session()

sess.run(tf.global_variables_initializer())


for step in range(2001):

  sess.run(train)

  if step % 20 == 0:

    print(step, sess.run(cost), sess.run(W), sess.run(b))


placeholder를 사용할 경우 

import tensorflow as tf

tf.set_random_seed(777)


X = tf.placeholder(tf.float32, shape=[None])

Y = tf.placeholder(tf.float32, shape=[None])


W = tf.Variable(tf.random_normal([1]), name="weight")

b = tf.Variable(tf.random_normal([1]), name="bias")


h = x_train * W + b


cost = tf.reduce_mean(tf.square(h - y_train))


optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)

train = optimizer.minimize(cost)


sess = tf.Session()

sess.run(tf.global_variables_initializer())


for step in range(2001):

  cost_val, W_val, b_val, _ = sess.run([cost, W, b, train], feed_dict={X: [1,2,3], Y: [1,2,3]})

  if step % 20 == 0:

    print(step, cost_val, W_val, b_val)




Cost Function


Cost(W) 에서 W를 x축으로 보고 Cost( W)을 y축으로 볼때. Cost(W)이 최소가 되는 값을 찾는다. 

  - 최소값을 찾아가는 앍리즘 Gradient Descent Algorithm => cost minimization

  - 경사도를 따라서 내려가서 최종 최소값을 구하기

   + 경사도(기울기): 미분

   + 내려가기: step


미분식

  - 알파값 0.1

  - Cost(W)에 대한 미분 === 기울기

import tensorflow as tf

import matplotlib.pyplot as plt

X = [1,2,3]

Y = [1,2,3]


W = tf.placeholder(tf.float32)

h = X * W


cost = tf.reduce_mean(tf.square(h - y_train))


sess = tf.Session()

sess.run(tf.global_variables_initializer())


W_val=[]

cost_val=[]

for i in range(-30, 50):

  feed_W = i * 0.1

  curr_cost, curr_W = sess.run([cost, W], feed_dict={W:feed_W})

  W_val.append(curr_W)

  cost_val.append(curr_cost)

  

plt.plot(W_val, cost_val)

plt.show()


W = 1 일때 Cost(W)의 기울기가 0이되어 최소값을 갖는다. 

  - Gradient Descendent는 W := W-기울기 값을 측정한다. 

     descent = W - learning_rate * gradient




Multi Variable Linear Regression


용어: Sigmoid

Hypothesis: 가설 -> Cost function -> Cost 최적화 하기 Gradient descent algorithm


- W, b 두개의 값을 학습

- W, b관계의 함수: 예측값과 실제값의 차이의 제곱의 평균

- GD convex 밥그릇 모양


3개의 변수가 주어질 경우

  - H(x1, x2, x3) = w1x1 + w2x2 + w3x3 +b 

  - 변수가 엄청많을 경우 처리 방법 = Matrix를 이용함


Matrix

  - [2*3] * [3*2] = [2*2]

  - 매트릭스 사용시 앞에 X를 사용 뒤에 W를 사용한다. 

  - 데이터의 row를 instance라고 한다. 

  - [ n개 instance 갯수, x 변수 갯수 ] * [ x 변수를 위한 Weight, 1 ] = [ n개 instance 갯수, 1 ]  = Shape

    보통 n개 instance를 None으로 표현한다. 

  - bias는 결과값의 갯수에 따른다. 여기서는 1개 

  - 많은 데이터를 batch로 가져온다.





Logistic (regression) Classification


Deep Learning 에 이용되는 컴포넌트이다. 

  - Binary Classification: 둘중하나 고르기

  - g(z) = 1/(1+ e-z) -> sigmoid 로 0, 1을 얻을수 있게 하고 이를 logistic function이라 한다. 

     + 값이 커지면 1에 수렴

     + 값이 작아지면 0에 수렴

  - Linear Hypothesis에 대한 지수함수 = 시그모이드 함수


Logistic Regression의 Cost 함수

  - 선형함수는 매끄럽게 그려진다. 

  - 시그모이드 함수로 하면 매끄럽지 않고 울퉁불퉁하다. 

    => 어디서 시작하느냐에 따라서 최소값을 찾고 끝날 수 있음. local minimum이 아니라 global minimum을 찾는게중요 함

    => 따라서 GDA를 사용하기 어렵다. 

    => exponantail과 반대가 log 함수를 이용한 Sigmoid함수를 이용한다.

 



cost와 H(x)의 로그함수



위의 두경우 함수를 하나의 Cost 함수로 표현한다. 


해당 cost 함수에 대한 최소값을 구한다. 

  - 해당 함수를 GradientDescentOptimizer().minimize(cost)로 호출한다.

  - 최소값을 구한 좌표의 x좌표의 값 W를 찾을 수 있게된다. 



W, b -> Hypothesis -> Cost (H-y) -> GD Minimize -> Training -> Predicted

  - W, b 값을 구할 H(가설) 수립: sigmoid를 사용함

  - W, b를 변경해 가며 가설값 - 결과값의 제곱에 대한 cost 함수를 만듦: y=0일때와 y=1일때의 로그함수값을 사용함

  - cost 함수의 최소값을 구함: Gradient Descent = cost함수의 미분

  - Training을 수행함. training이 되면서 cost값이 작아지고 W, b의 값도 내부적으로 변경이 된다. 




Multinomial Classification


용어: Softmax, Cross Entropy, One hot encoding


Logistic Classification

  - 위에서 H(x) = wx 를 g(z)로 만들어 아무리 큰값이거나 작아도 1 또는 0으로 만들어주는 sigmoid함수를 이용한 Logistic Classification을 다루었음.

  - 1차원위에 (Hyper Plane)에서 데이터를 구분하는 선을 구하는 것이다.

  - g(z) = 1 / (1 + e-2)  에서 g(z) 을 logistic 또는 sigmoid함수라고 한다. 

  - Y : real result value, Y hat: predict value


Multinomial Classification 

> Hypothesis 구하기

  - 예로 3개의 Binary classification을 각각 독립된 classification을 구함.

  


  - A or not, B or not, C or not  3개를 하나의 식으로 표현. Y햇에 sigmoid를 각각 적용하지 않고 효율적으로 적용하는 방법은 matrix manuplication!

  


  - logistic classifier를 통해 나온 결과값을 sigmoid를 사용하지 않고, 모두 0~1 사이값으로 만들고, 0~1사이의 결과값을 모두 더하면 1이되게 만든다.

    이렇게 만들어주는 것이 softmax 함수이다. 

  


  - Softmax를 통해 Y값을 넣으면 각각 0~1 사이값이면서 모두 더하면 1의 값이 되므로 확률로 볼 수 있다. => Hypothesis 함수가 된다.

   


  - 또한 이것중 하나를 고르는 (제일 큰값을 고르는) One-Hot Encoding를 사용한다. (arg max)

   


> Cost function 구하기

  - Cross Entropy를 사용한다. Y햇 값이 1이면 classification이 맞고, 엄청크면 맞지 않은 것이다. 

  - Y햇 값과 Y햇 로그한것을 곱한 후 합하여 cost값을 구한다. (즉, Y햇 예측값에 log함수값을 곱하여 확률을 구하는 것이다.)

  


  - Logistic cost가 cross entropy이다. 

  - 위의 식을 여러개의 Training Set에 대하여 구할 때는 D(S, L)에 대한 합에 대한 갯수로 나누어 평균을 구한다. 

     


> Minimize

  - Gradient Descent 알고리즘을 사용해 W값을 구함.

  - 기울기는 cost함수를 미분하는 것이다. 이렇게 내려가면서 최소값을 찾으면 최적의 W값을 찾게됨.

  - 내려가는 값의 간격은 알파(learning_rate)이다. 

   



Tensorflow 구현하기 

> Hypothesis

  - tf.nn.softmax(tf.matmul(X,W) + b)

  


> Cost function

  - 깃헙 소스

  




Fancy Softmax Classifier

 

용어: Logits (score), Reshape


 - Score(Logits)을 softmax에 넣으면 확률이 나옴. tf.nn.softmax_cross_entropy_with_logits 호출


  - one_hot을 사용하게 되면 rank가 N에서 N+1로 변해서 reshape을 해주어야 한다. (잘 이해안감), 깃헙소스

     + Hypothesis 와 cost function을 만듦 

      


  + 학습을 시킴 => 결과를 측정해봄

    



정리


W,B -> Hypethesis -> Const fuction -> Minimize(Convex에 대해 GD 사용) -> Train -> Prediction


Linear Regression

  - One Variable

    + Hypothesis: 1차원  Wx + b  => H(x) = Wx + b

    + Cost function: Convex Function 형태로 만듦.

    + Gradient Descent Optimizer를 사용하려면 Convex 형태로 매끈한 모양이 나와야 함. Logistic Cost(Cross Entropy)도 convex로 만들어줌.


  - Multi Variables (Features): x값이 여러개 있을 경우

     + Hypothesis: n차원의 x와 w를 갖는 Wx + b => matrix를 이용한다. => H(X) = XW

     + Matrix의 row === instance 

        x [5,3] = 5개의 row와 3차원의 x갯수

        w [3,1] = 3차원의 x갯수 대응 w와 결과값 y갯수 1개

        예) W1x1 + W2x2 + W3x3 + b

        n차원의 x를 가짐


Logistic Regression (Classification)

  - Binary Classification: 분류값이 둘중 하나일 경우

     + Hypothesis: Sigmoid

     + Cost Function: Logistic Cost


  - Multinomial Classification: 분류값(y)이 여러개일 경우

    + Hypothesis: Softmax

    + Cost Function: Cross Entropy (=== Logistic Cost)

       y값이 multi classification임 



<참조>

- Tensorflow 구현한 강좌소스, 깃헙

- 강좌 파일 및 강좌 목차

- 회귀분석

- 구글 코랩 설명

- 선형회귀 이해

'Deep Learning' 카테고리의 다른 글

[모두를 위한 딥러닝] 강좌 요약 - Section 7~10  (0) 2019.01.17

[BERT] 개념 및 Chatbot 구현 세미나

NLP

인공지능 아카데미에서 인라이플 회사의 BERT 소개 및 챗봇 실습 세미나를 정리한다. 





임베딩


단어 기준 임베딩

  - Word2Vec: 비슷한 관계가 있는 단어들 끼리 벡터 공간을 값으로 갖는다. 

  - FastText: 학습속도를 빠르게 하기 위해 개선한다. 주변 단어의 벡터를 가지고 적용.


문장 기준 임베딩

  - CoVe (코브): 차가 car인지, tea인지 문맥을 통해 파악해야 한다. 

  - ELMo (엘모)




딥러닝 모델


자연어에 적용하는 기술. 문장에서 문장으로 적용

  - 딥러닝은 머신러닝을 기반으로 cell을 정의하고 => cell을 연결하여 다양한 신경망을 구성한다. => 통계처리함에 더 똑똑하다. (특정 패턴을 찾는 것임)

  - cell은 CNN, RNN, LSTM, GRU, DQN 등등.


  - CNN: 성능 떨어짐

     + 행렬 곱이여서 병렬처리가 가능한다.  

  - RNN: 회귀모델, 베이지안, CNN 

     + 순환신경망, 인풋/아웃풋/히든 을 활용하는 네트워크

     + 문장이 길때 문제 발생: 초기 입력값을 잃어버리는 문제 발생 => LSTM 적용하여 해결 (forgotten, use gate 사용-가중치주기), 역시 문제 남음

  - Seq2Seq: 문장에서 문장 분석하기 

     + 정확도 높이기 위해 Attention 사용: 인코더/디코더단의 연산결과를 attention에 저장하고 최종 결과 sequence를 만들어냄. 정보 소실을 줄이기 용도

     + Attention: 정보가 너무 많을 때 사람은 관심 있는 걸 찾는다. 즉, 딥러닝에게 관심 있는 정보를 찾는 능력을 부여함.

        질문(query)과 답(key)를 통해 관심 있는 것을 찾음

     + 병렬처리 가능


트랜스포머

  - RNN같은 시계열구조는 연산속도 느림 => Attention만 가지고 연산을 해보자

  - Positional Encoding을 넣어 같이 학습 (병렬처리를 위함) + Attention 사용

  - 더 긴 문장을 해석할 수 있게 되었다. 즉, 더 깊은 네트워크를 만들 수 있었다. => 빠른 학습 속도, 연산 속도를 나타냄.

  - BERT에서 사용함.




트랜스포머



2017년 구글이 개발한 self attention기반 인코더. 기존 seq2seq한계를 넘음. 

  - BERT는 positional encoding 사용하지 않음

 

셀프 어텐션 구조

  - 입력값은 같으나, 가중치로 Q,K,V를 구함

  - Q, K에서 어텐션 스코어를 구함. 이것을 V에 적용하여 Z를 구함

  - Q,K,V를 여러벌로 만들어 구함.

  - 마스크를 사용함

    + 인코더 마스크: 선택사항으로 값이 없는 값 => 버트에서 사용

    + 디코더 마스크: 다음 단어 예측을 위해 => 버트에서 사용안함


셀프 어텐션 효과

  - 단어간의 연관 관계 정보를 얻음

 

피드 포워드

  - 트랜스포머는 셀프 어텐션을 통해 나온 정보를 피드 포워드 네트워크르 통과시켜 정보를 정리한다. 


과적합 줄이(overfitting)기 방법

  - 드랍 아웃

    + 일부 노드연 연결을 임의로 삭제하는 것

  - 노말라이제시션

    + 값이 원하는 범위를 벗어나지 않토록 제한함

    + 배치 LN, 레이어 BN, 인스턴스 IN, 그룹 GN 노멀라이제이션등이 있다. 

    + BERT는 LN 사용한다. 


스킵 커넥션

  - 신경망도 깊이가 깊을 수록 이전것에 대한 기억을 잃어버린다. 이를 극복하기 위한 여러 방법이 있다. 

  - 기억 잃어버림(기울기 문제) => 스킵 커넥션으로 해결 노력


비선형성

  - ReLU는 시그모이드 보다 빠름 

  - ELU는(엘루) 경사 하강법에서 수렵 속도 빠름, 죽는 노드 없음

  - GELU는(겔루) 확률론적 개념을 도입하여 엘루 보다 계산 비용이 저렴하고 빠르게 수렴 => 성능 좋음




BERT


트랜스포머로 구성된 양방향 언어 표현. 자연어 처리 분야. 


접근법

  - 피처 기반 접근법: 미리 학습된 가중치의 단어별 특징을 뽑아 학습

  - 파인 튜닝 접근법: 미리 학습시킨 가중치를 불러와 미세조정(파인 튜닝)하여 사용하는 방식


구조

  - BASE: 트랜스포머 12개 

  - LARGE: 트랜스포머 24개


학습법

  - Masked 언어 모델: 양방향 맥락을 고려함, 무작위 마스킹, 파인튜닝시 마스킹안함 랜덤 사용. 

  - 다음 문장 예측: NLI, QA의 파인 튜닝을 위해 마스크된 단어를 맞추는 태스크. 50%연관된 문장들, 50% 연관안된 문장들을 찾음.


입력 데이터

  - 두개의 문장을 문장 구분자와 함께 합쳐 넣음

  - 트랜스포머 고려하여 두 문장 합쳐서 512단어 이하로 넣음

  - 워드 피스 토크나이저로 토큰된 단어를 넣음

    + 토큰 임베딩, 세그먼트 임베딩, 포지션 임베딩 합쳐 사용

    + 마지막은 패딩처리: 0000

  - https://googlebooks.byu.edu/ 8억단어, https://corpus.byu.... 25억 단어

  

파인 튜닝으로 이용하는 방법

  - 프리트레인된 가중치를 모델에 불러옴

  - 두 문장일때는 문장 구분자를 넣음 


피처 추출로 이용하는 방법

  - 문장을 넣어 단어별 가중치를 뽑아냄

  - 카카오에서 문장별 단어 벡터의 가중합의 거리를 계산하여 문장 유사도 시도 


장비

  - TPU 3.0 -> 16개 사용해서 4일 걸림 => 구글 클라우드에서 TPU v2, v3 사용가능 (1대 1시간당 $5 정도)

  - Tesla V100 -> 8개 42일 

  - RTX 2080 Ti -> 8개 68일, 64개 9일 가량 소요


한글 버트

  - 한글 버트 없음. 

  - 구글이 오픈소스로 제공하는 다국어 프리트레인 된 가중치는 베이스 모델임.

  - 한글은 프리트레인 -> 파인튠 -> 어브노멀리 해서 사용.




BERT를 위한 데이터 구성


3가지 셋을 가지고 모델을 만들어야 한다. 

  - 훈련셋: 모델 학습

  - 검증셋: 파라미터 튜닝 (1,000~10,000개)

  - 시험셋: 모델의 성능을 측정


데이터 구성 고려사항

  - 실 서비스는 검증셋, 시험셋을 동일하게 함

  - 0.01%라도 성능향상을 위해 검증셋은 10,000개 이상 구성

  - 가능하면 공인된 데이터(SQuad) 셋으로 모델을 구성한 후 그와 비슷한 데이터 구성 => 시간 낭비 줄여줌

  - 빠른 개발 사이클로 반복 검증한다. 원하는 경우 안나오면 데이터셋을 바꿔야 한다. 


데이터셋을 바꿔가며 학습 시키는 방법 종류

  - 교차 검증과 계층별 교차 검증

  - 임의 분할 교차 검증

  - 그룹 교차 검증


데이터 평가

  - 문제에 맞는 평가 지표를 선택한다. 즉, 문제에 맞는 평가지표가 필요

  - 에러분석 과정을 자동화 하면 좋다. 

   + 에러가 나면 수작업으로 데이터 분류하여 다시 데이터셋 만듦

   + 에러 분석하고 에러 제거 검증셋으로 검증의 반복


어떻게 개선할 것인가?

  - 서비스 진행하면서 데이터 셋을 추가로 반영한다.

  - 서비스 이점이 없는 데이터는(노이즈 데이터) 배제

  - 잘 못 분류된 레이블 개선




버트와 TF-IDF를 활용한 챗봇 실습


colab에서 실습함 

  - 하단 참조의 data.zip에서 train.json빼고 colab에서 파일 업로드함

  - 하단 참조의 ipynb 파일 import함


QA데이터셋을 사용 => QA 데이터: 6만건 - LG쪽에 문의

  - 사용자가 질문을 넣어서 TF-IDF에서 유사 문장을 찾아 줌. 

  - Standard Question And Answering 데이터셋: korquad dataset (http://korquad.github.io)


코드 설명

0) 준비작업

  colab에서 GPU 설정한다.


1) 문맥선택

  korquad에서 제공하는 질문/대답 데이터 셋에서 질문에 대한 문맥을 데이터세셍서 자동 선택하기.

  - TF-IDF 계산

  - 코사인 유사도를 통한 문맥 선택

[7.3.1]

if args.do_chat:

    logger.setLevel('CRITICAL')

    input_text = None

    qas_id = '56be4db0acb8001400a502ed'

    c = ContextFinder()

    c.build_model(args.predict_file)

    print('READY')


2) 데이터 전처리

  - SquadExample 객체 생성

  - 데이터 전처리 = 토큰화 + CSL / SEP + 마스크 제로패딩

  - FullTokenizer = BasicTokenizer + WordpieceTokenizer 

  - "CLS + 질문 + SEP + 문맥 + SEP" 구조를 만든다. 

  - max sequence length는 384, input sequence length 200

[7.3.2]

eval_examples = parse_input_examples(qas_id, context_text, question_text)

        eval_features = convert_examples_to_features(

            examples=eval_examples,

            tokenizer=tokenizer,

            max_seq_length=args.max_seq_length,

            doc_stride=args.doc_stride,

            max_query_length=args.max_query_length,

            is_training=False)


4) 버트모델

  - Colab의 4번 챕터 부분이 BERT관련 내용

  - 임베딩[4.4] + 트랜스포머12개 (인코딩) [4.11] [4.13] 으로 버트 모델을 구성한다. 

[4.13]

    def forward(self, input_ids, token_type_ids=None, attention_mask=None):

        if attention_mask is None:

            attention_mask = torch.ones_like(input_ids)

        if token_type_ids is None:

            token_type_ids = torch.zeros_like(input_ids)


        # We create a 3D attention mask from a 2D tensor mask.

        # Sizes are [batch_size, 1, 1, from_seq_length]

        # So we can broadcast to [batch_size, num_heads, to_seq_length, from_seq_length]

        # this attention mask is more simple than the triangular masking of causal attention

        # used in OpenAI GPT, we just need to prepare the broadcast dimension here.

        extended_attention_mask = attention_mask.unsqueeze(1).unsqueeze(2)


        # Since attention_mask is 1.0 for positions we want to attend and 0.0 for

        # masked positions, this operation will create a tensor which is 0.0 for

        # positions we want to attend and -10000.0 for masked positions.

        # Since we are adding it to the raw scores before the softmax, this is

        # effectively the same as removing these entirely.

        extended_attention_mask = extended_attention_mask.float()

        extended_attention_mask = (1.0 - extended_attention_mask) * -10000.0


        embedding_output = self.embeddings(input_ids, token_type_ids)

        all_encoder_layers = self.encoder(embedding_output, extended_attention_mask)

        sequence_output = all_encoder_layers[-1]

        pooled_output = self.pooler(sequence_output)

        return all_encoder_layers, pooled_output


  - 데이터가 트랜스포머를 12번 통과하는 것이다.  = all_encoder_layer

  - [4.10] 트랜스포머 layer

  - 버트는 프리트레인된 모델을 가지고 파인튠해서 내가 맞게 사용하는 것으로 버트에 맞춰줘야 한다. 

  - [4.7] Attention: multi-head attention = BertAttention cell + BertIntermediate cell + BertOutput cell

  - Query, Key => Value => concat을 함

  - [4.6] Self Output

  - [4.10] Layer 정리, 

  - [4.8], [4.9] Feed-Forward

  - [4.13] sequence output 리턴: 1개만 사용

  - [4.14] start_logit, end_logit을 뽑아냄 

  - [7.3.4]~[6.1] chatbot_prediction_answer함수를 통과해서 answer를 준다. 


* colab실행 속도 향상은 data는 자신의 googel driver에 올린 후 => 소스에서 위치를 수정해서 처리한다. 




실습


colab에서 질문을 넣고 하단의 소스를 실행하면 마지막에 답변이 나온다. 





후기


- 새로운 기술에 대한 열정과 실험정신을 흡수하고 온 자리

- 기술적인 발전이 있었고, Colab같은 인공지능 실험 플랫폼도 나오고 있다는 것. 이제 대중화로 가는 길들이 하나씩 제공되고 있는 느낌이지만 좋은 모델들이 지원이 풍부한 혁신 기업에 집중되고 있다는 아쉬움도 있다. 

- 모델을 만들기위해 비용이 많이 든다. 

- 모델은 인문적 소양을 통해 이것을 수식화 하고 다시 인공지능 모델로 만들어 갈 수 있는 능력이 있어야 한다고 느낌




<참조>

- Bert 소개

- Korean Question & Answering Set

- Pytorch BERT 소스

- 인라이플 회사

- 실습파일

AI_Academy_bert_chat.ipynb

data.zip