https://www.youtube.com/watch?v=cKtg_fpw88c&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=30 

Lec10 

*) 입력과 출력 층에서 보이지 않는 층을 hidden layer라고 한다. 

#unit을 만들다. 
#이전 층의 출력 수는 다음 층의 입력 수
w1=tf.Variable(tf.random_uniform([2,5],-1.0,1.0))
w2=tf.Variable(tf.random_uniform([5,4],-1.0,1.0))
w3=tf.Variable(tf.random_uniform([4,1],-1.0,1.0))

# bias의 크기는 각 층의 출력 수만큼
b1=tf.Variable(tf.zeros([5]),name="Bias1")
b2=tf.Variable(tf.zeros([4]),name="Bias2")
b3=tf.Variable(tf.zeros([1]),name="Bias3")

#hypothesis
L2.tf.sigmoid(tf.matmul(X,W1)+b1)
L3.tf.sigmoid(tf.matmul(X,W1)+b2)
hypothesis = tf.sigmoid(tf.matmul(L3,W3)+b3)

 

기울기 소멸 문제의 해결 

1. 시그모이드 대신 ReLU 사용

L1 = tf.nn.relu(tf.matmul(X,W1)+b1)

ReLU를 사용하면 cost가 빨리 감소한다. 

 

다양한 Activation Function 

ReLU가 잘 작동한다는 것이 알려지자 다른 Activation Function들이 등장함 

  • tanh : 시그모이드의 단점 극복
  • Leaky ReLU
  • Maxout
  • ELU

Activation function의 정확도

 

2. Weight 초기화 

if 초기값을 모두 0으로 준다면?

미분값을 구했을 때 0이 된다

-> 입력 방향의 가중치가 모두 0이 되어 기울기 소멸 문제가 발생한다. 

따라서 가중치를 0으로 주면 안된다. 

 

Hinton (2006) "A Fast Learning Algorithm for Deep Belief Nets"

-Restricted Boatman Machine RBM 

1. 값을 그대로 보낸다.(forward/encoder)

2. 가중치를 그대로 곱해서 입력층으로 보낸다. (backward/decoder)

1과 2의 차가 최소가 되도록 weight를 조절한다. 

두 층 사이에서 encode와 decode를 반복하며 weight를 조절함 

-> deep belief network 

 

Deep Belief Network 

두 층 사이에서 encode와 decode를 반복하며 weight를 조절함 

->이를 모든 단계의 층에서 반복 

여기서 조절된 weight를 통해 weight를 초기화함

(fine tuning이라고 한다. )

 

Xavier/He initialization 

입력과 출력에 따라 초기값을 설정한다. 

W=np.random.randn(fan-in,fan_out)/np.sqrt(fan_in)
#He et al.2015
W=np.random.randn(fan-in,fan_out)/np.sqrt(fan_in/2)

 

초기값과 Activation Function에 따른 정확도

 

Overfitting

1. Overfitting인지 아는 방법?

빨간선은 test 데이터에 대한 error, 파란선은 train 데이터에 대한 error

test 데이터에 대한 error가 줄어들다가 증가하는 경계선 이후가 overfitting 

 

overfiting의 해결방법 

- More training data

- reduce the number of features

- Regularization

  : cost + $\lambda \sum W^2$ 

또 다른 방법이 Dropout

 

2. Dropout

- neural network에서 랜덤한 노드의 가중치를 0으로 설정하여 학습한다.

- 마지막에 전체 노드를 통해 예측한다. 

dropout_rate = tf.placeholder("float")
_L1 = tf.nn.relu(tf.add(tf.matmul(X,W1),B1))
L1=tf.nn.dropout(_L1,dropout_rate)

TRAIN:
	sess.run(optimizer, feed_dict={X: batch_xs, Y:batch_ys, dropout_rate: 0.7})
    
# 학습하는 동안에만 dropout을 시키고 실전에는 모든 노드가 참여해야 한다. 
# dropout_rate = 1
EVALUATION:
	print "Accuracy:", accuarcy.eval({X: mnist.test.images,Y: mnist.test.labels, dropout_rate: 1})

 

3. Ensemble

 

1. 같은 형태의 neural network를 3개 만든다. 

2. 각각 학습을 시킨다. 

3. 마지막에 합친다. 

-> 2~4% 성능 향상 

 

NN Lego Play

1. Fast forward

그림과 같이 출력 값을 다음 층이 아니라 다다음 층에 전달할 수 있음 

 

2. Split & Merge

이런식으로 나누거나 합칠 수 있다. 

 

3. Recurrent network

forward만 하는 것이 아니라 옆으로도 값을 전달한다. 

-> RNN

 

Lec 11 ConvNet

배경

:고양이가 그림을 볼 때 동시에 동작하는 것이 아니라 부분에 따라 다른 신경이 활성된다는 아이디어에서 착안함

 

Conv 레이어

1. 기본 개념 

32x32x3 이미지와 5x5 필터가 있다고 했을 때

- 이 필터를 통해 이미지의 일부분에서 하나의 숫자(특징)를 만들어낸다. 

- one number = Wx+b = ReLU(Wx+b)

- 필터를 옆, 아래로 움직이며 전체 이미지에서 특징을 만들어낸다. 

- input : 7x7, filter : 3x3, stride :1 일때 

(stride = 움직이는 칸 수)

- 이런식으로 필터를 움직인다. 

- 이때 output 은 5x5

- output 크기 계산 방법 : $((input size - filter) / stride)+1$

- input : 7x7, filter : 3x3, stride :2 일때 

output = ((7-3) / 2)+1 = 4/2 +1 =3

output = 3x3

- 이런식으로 계속 필터를 적용하면 이미지의 크기가 작아진다 -> padding 사용

- padding : 이미지의 외부 테두리에 0인 값을 준다. 

- padding의 목적 

1.  이미지가 급격하게 작아지는 것을 막는다. 

2. 테두리라는 것을 알린다. 

- padding : 1, input : 7, filter 3, stride: 1

- output = ((input + 2*padding) - filter) / stride +1 = (7+2-3)/1+1=6/1+1=7

- output = 7x7

 

2. Convolution layers 

-input : 32X32x3

- filter 여러개를 동시에 적용시켜 activation maps를 만든다.  

- activation maps : 깊이는 6, 크기는 28x28

- activation maps에 filter를 다시 적용한다. 

 

Pooling layer(sampling)

- conv layer 에서 한 레이어를 뽑고, 그 레이어에서 특정한 값을 뽑아 resize한다. 

- 이를 다른 레이어들에 대해서 반복하여 pooling layer를 만든다. 

 

1. Max Pooling 

- filter를 적용하여, 한 filter 내에서 최대 값을 선택한다. 

 

Fully Connected Layer

- conv, relu, pool을 원하는 대로 쌓는다. 

- 마지막 출력을 일반적인 neural network에 넣고, 마지막 출력에 softmax를 적용하여 하나의 label를 출력한다.

 

ConvNet의 예 

- LeNet-5

- AlexNet

: input 227x227x3 images

처음으로 ReLU를 사용함 

7 CNN ensemble: 18.2% -> 15.4%

 

-GoogleNet

inception module

 

- ResNet

error : 3.6% 

fast forward 개념 사용

 

Lec 12 RNN

Sequence data

- 하나의 단어가 아닌 하나의 맥락을 이해한다. 

- 이전의 결과가 다음 결과에 영향을 줄 수 있어야함

- 기존의 NN/CNN은 할 수 없음

- 어떤 입력에 대한 상태가 다음 것을 계산할 때 영향을 준다. 

- $h_t = f_w(h_{t-1},x_t)$

$h_t$ : new state

$f_w$ : some function with parameters W, 모든 RNN에 대해 function이 동일하다.

$h_{t-1}$ : old state

$x_t$ : input vector at some time step

 

Vanilla RNN

$h_t = f_w(h_{t-1},x_t)$

$h_t = tanh(W_{hh}h_{t-1}+W_{xh}x_t)$

$y_t=W_{hy}h_t$

 

Character-level language model example

- Vocabulary: [h,e,l,o]

- Example training sequence "hello"

- 문자열 하나를 입력했을 때 그 다음에 오는 단어를 예측하고 싶다. 

- one hot encoding을 통해 문자열을 표시함 

(one hot encoding : 각 문자열에 해당하는 자리만 1로 표시함)

- 옆의 결과 값에 가중치를 곱한 값과 입력 값에 가중치를 곱한 값을 더하여 학습을 진행한다. 

-> 이전의 값을 잘 기억하게 된다. 

- hidden layer의 값에 가중치를 곱해서 결과값을 낸다. 

- 이 output layer값에 softmax를 적용하여 값을 결정한다. 

- cost 값을 통해 학습을 진행한다. 

 

RNN application 

- Language Modeling

- Speech Recognitaion

- Machine Translation

- Conversation Modeling/Question Answering 

- Image/Video Captioning

- Image/Music/Dance Generation

 

다양한 형태의 RNN

 

RNN을 훈련하는 데 어려움이 있음 

-> LSTM, GRU

'STG 퀸트고 (딥러닝 기초) > 딥러닝 기초 (모두의 딥러닝 시즌1)' 카테고리의 다른 글

Lec 7 ~ 9  (0) 2021.12.27
Lec 4 ~ 6  (0) 2021.12.26
모두의 딥러닝 Lec00~03  (0) 2021.11.08

https://www.youtube.com/watch?v=BS6O0zOGX4E&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=1 

 

Lec 7 Application & Tips

Learning rate

- gradient descent 알고리즘에서 learning rate인 $\alpha$을 임의로 사용함(주로 0.001)

- learning rate를 굉장히 크게 설정하는 경우 overshooting이 발생하여 학습이 제대로 이루어지지 않을 수 있다. 

- 값이 줄어들지 않고 발산하는 경우 overshooting을 의심해야한다. 

- learning rate가 굉장히 작은 경우 학습 시간 동안 최저점에 도달하지 못할 수 있다. 

- cost를 출력해보고 값의 변화가 작은 경우 learning rate를 올려서 학습해본다. 

- learning rate를 정하는 데는 특별한 답은 없다 -> 환경, 데이터에 따라 다르다. 

- 처음에 0.01로 설정해보고, 값이 발산하면 작게, 변화량이 너무 작으면 크게 설정해본다.

 

Data (X) preprocessing for gradient descent

(그래프를 등고선으로 이해하자)

- 데이터 간의 차이가 큰 경우 그래프가 편향돼서 나타나게 된다. 

- 어느 한 점에서 경사를 따라 이동할 떄,

최저점을 따라 직선상으로 움직이는 것이 아니라 지그재그로 이동할 수 있다. 

-> 정규화가 필요함 

- zero-centered data : 데이터의 중심이 중앙에 위치하도록 정규화 

- normalized data : 데이터가 특정한 범위에 있도록 정규화 

- 정규화를 하는 방법 

X_std[:,0] = (X[:,0]-X[:,0].mean()) / X[:0].std()

 

Overfitting 

- 학습 데이터에 너무 잘 맞는 경우 

- 학습 데이터가 아닌 데이터(테스트 데이터)에 대해서는 좋은 성능을 발휘하지 못하는 경우 

- 오른쪽의 경우 학습 데이터에만 잘 맞는다. -> 실제로 사용할 때는 잘 맞지 않는다.

- 왼쪽과 같이 일반적인 모델이 더 좋다. 

 

Solution for overfitting 

- training data를 많이 사용한다. 

- feature의 수를 줄인다. 

- regularization

 

Regularization 

- weight를 너무 큰 값을 가지지 않는다. 

- cost function에 $\lambda \sum W^2$를 추가하여 weight도 최적화한다. 

- $lamda$ : regularization strength으로 이를 통해 Regularization 정도를 정할 수 있다. 

- tensorflow로 구현하는 경우 

l2reg = 0.001 * tf.reduce_sum(tf.square(W))

 

Learning Machine Evaluation 

- 가지고 있는 데이터의 일부는 training set으로, 다른 일부분은 test set으로 이용한다. 

- traing set으로 model을 학습시키고, test set을 통해 model의 성능을 평가한다. 

- Training set을 가지고 model을 학습시킴

- Validation set을 통해 learning rate와 regularization strength 값을 튜닝한다. 

- test set을 통해 model의 성능을 평가한다. 

 

Online learning 

- data set을 한번에 학습하기 어려운 경우 

- training set이 100만개가 있다고 가정하자

- 10만개씩 잘라서 학습시킨다. 

- model은 이전에 학습했던 결과가 model에 남아 있어야한다. 

- 새로운 데이터가 추가되는 경우, 이전의 데이터를 새로 학습하는 것이 아니라 model에 남아있는 결과를 이용하여 추가로 학습할 수 있다. 

 

Accuracy

- 실제값과 모델이 예측한 값을 비교하여 정확도를 측정할 수 있다. 

- 최근 이미지 학습 정확도는 95%를 넘는 수준이다. 

- 실제로 측정하는 방법은 lab에서 확인 가능 

 

Lec 8 딥러닝의 기본 개념 

딥러닝의 시작 

- 우리를 대신해서 골치아픈 문제를 생각하는 model을 만들자

-> 뉴런을 모방하여 모델을 만듦 (Activation Function)

 

Activation Function 

- cell body : 합을 구함 

- 어떤 신호 x가 들어오면 w를 곱한다. 

- 모든 wx를 합하면 어떤 bias(b)를 더한다.

- activation function을 통해 어떤 값 이상이면 값을 전달하고(1), 그렇지 않으면 값을 전달하지 않는다(0).

 

 Logistic regression units

- activation function을 모은 형태 

 

AND/OR/XOR problem

- OR 와 AND는 linear 하게 해결 할 수 있지만, XOR는 linear하게 해결 할 수 없음

- MLP (multilayer perceptrons)을 통해 해결 할 수 있다. 

- 그러나 각 layer의 weight와 bias를 어떻게 학습 시킬지가 과제였다. 

-> backpropagation을 통해 학습이 가능하게 되었다. 

 

Convolutiaonal Neural Networks

- 고양이가 그림을 보게하고 시신경을 관찰한 결과 

- 그림의 형태에 따라 일부의 뉴런만 활성화되고, 그림의 형태에 따라 다른 뉴런이 활성화됨 

- 그림을 볼때 신경망이 동시에 그림 전체를 보는 것이 아니라, 일부를 담당하는 신경망이 있고, 나중에 조합된다고 생각함

-> convolutional Neural Network 개발 

- 한번에 전체를 학습하는 것이 아니라 부분적으로 학습하고, 나중에 합친다.

- 특히 문자열, 숫자를 인식하는 데 약 약 90% 이상의 성능을 발휘함 

 

A BIG problem 

- 10여개 이상의 layer를 학습하는 경우, backprogation을 이용하면 기울기 소멸 문제가 발생한다. 

(기울기 소멸 문제 : MLP에서 은닉층을 많이 거칠수록 전달되는 오차가 크게 줄어들어 학습이 되지 않는 현상을 의마함)

- 층이 많아질 수록 성능이 저하됨 

- SVM, RandomForest 등 MLP이외의 알고리즘이 등장함 

- 오히려 이러한 단순한 알고리즘이 더 잘 작동함

 

Breakthrough (2006 & 2007 by Hinton and Bengio)

- 초기값을 잘 주면 deep net을 학습할 수 있다는 것을 보여줌 

- 깊은 신경망을 통해 어려운 문제를 해결할 수 있다는 것을 보여줌 

-> 다시 신경망에 관심을 갖게 됨 

 

ImageNet Classification 

- 2012년도에 deep learning 기반의 ImageNat Classification의 오류가 26.3%에서 15.3%로 크게 감소함 

- 2015년 기준 오류는 3%대

- 심지어 Neural network는 사진을 설명할 수 있게 됨 

 

딥러닝은 점점 발전하여 여러 기술에 이용되고 있다. 

 

Lec 9 

Neural Nets for XOR

- XOR를 다음의 3개 unit을 이용해서 풀어본다. 

- 우선 W, b가 주어졌다고 생각하자 

1. $y_1 : W = \begin{bmatrix} 5 \\ 5 \end{bmatrix}, b=-8$

2. $y_2 : W = \begin{bmatrix} -7 \\ -7 \end{bmatrix}, b=3$

3. $y : W = \begin{bmatrix} -11 \\ -11 \end{bmatrix}, b=6$

1과 2의 결과 값이 3의 입력으로 주어진다.

모델의 모습을 그림으로 나타내면 다음과 같다. 

이 모델의 결과 값과 XOR의 결과 값을 비교해보면 다음과 같다. 

x1 x2 y1 y2 y XOR
0 0 0 1 0 0
0 1 0 0 1 1
1 0 0 0 1 1
1 1 1 0 0 0

$x_1$과 $x_2$로 이루어진 하나의 층은 multi-variable linear regression으로 볼 수 있다. 

따라서 W를 matrix로 나타낼 수 있고 이를 그림으로 그래면 다음과 같다. 

이를 수식으로 작성해보자 

$K(X) = sigamoid(XW_1+B_1)$

$Y=H(X) = sigmoid(K(X)W_2+b_2)$

tensorflow로 구현하면 다음과 같다. 

K=tf.sigmoid(tf.matmul(X,W1)+b1)
hypothesis = tf.sigmoid(tf.matmul(K,W2)+b2)

 

Back propagation (chain rule)

$g = wx, f=g+b, f=wx+b$

1. forward

: 학습 데이터에서 실제 값을 가져온다 . EX) w=2, x=5, b=3

이 값을 통해 그래프에 값을 입력한다. 

2. backward

: 실제 미분 값을 계산한다

$g = wx, f=g+b$

$\frac{\partial g}{\partial w} = x, \frac{\partial g}{\partial x} = w, \frac{\partial f}{\partial g}=1 \frac{\partial f}{\partial b}=1$

$\frac{\partial f}{\partial w}$를 미분하기 위해 chain rule을 이용한다.

$\frac{\partial f}{\partial w} = \frac{\partial f}{\partial g} \cdot \frac{\partial g}{\partial w} = 1\cdot x= 1\cdot 5=5$

$\frac{\partial f}{\partial x} = \frac{\partial f}{\partial g} \cdot \frac{\partial g}{\partial x} = 1\cdot w= 1\cdot -2 = -2$

같은 방법으로 계산하면 $\frac{\partial f}{\partial b} = 1$

$\frac{\partial f}{\partial b} = 1$ : b의 변화가 f에 미치는 영향이 거의 1:1이다. 

$\frac{\partial f}{\partial w}$ : w가 1만큼 변하면 f는 5배 바뀐다. 

따라서 이러한 결과를 통해 출력을 조절할 수 있다. 

 

layer가 아무리 많더라도, 한 layer안에서의 미분값을 구할 수 있고, chain rule을 적용할 수 있기 때문에 최종 출력값과 입력값 간의 미분 값을 구할 수 있다. 

 

TensorFlow에서 Back propagation 

hypothesis = tf.sigmoid(tf.matmul(L2, W2)+b2)
#cost function 
cost = -tf.reduce_mean(y*tf.log(hypothesis)+(1-y)*tf.log(1-hypothesis))

tensorflow에서는 back propagation을 위해 각각을 그래프로 만든다. 

따라서 tensorflow에서는 back propagation을 구현할 필요가 없다. 

'STG 퀸트고 (딥러닝 기초) > 딥러닝 기초 (모두의 딥러닝 시즌1)' 카테고리의 다른 글

Lec10~12  (0) 2022.01.03
Lec 4 ~ 6  (0) 2021.12.26
모두의 딥러닝 Lec00~03  (0) 2021.11.08

https://www.youtube.com/watch?v=BS6O0zOGX4E&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=1 

이번 부터는 Lab을 제외하고 Lec을 우선적으로 정리했다. 

 

Lec 4 Multivariable linear regression

Recap : linear regression을 설계하기 위해 필요한 3가지

1. Hypothesis

W:가중치 b: bais W와b를 학습한다 

 

2. Cost Function : cost(loss)를 어떻게 계산할 것인가 

$y^{(i)}$ : 실제 값 (true)

$H(x^{(i)})$ : 예측 값(prediction)

 

3. Gradient descent algorithm : cost를 최적화 하는 방법 

Gradient를 통해 경사를 따라 움직이고, Gradient가 0인 지점이 cost가 최소

 

input이 하나인 경우 이와 같이 한다. input이 여러개인 경우?

 

Variable이 3개인 경우

1. Hypothesis

2. Cost Function

Multivariable linear regression

Hypothesis

이런식으로 variable이 많은 경우에도 식을 세울 수 있다

그러나 variable이 많을 수록 수식이 길어져서 복잡해질 수 있다 

-> Matrix를 이용한다. 

$X$ : X의 행렬

$W$ : W의 행렬

(bias는 일단 생략한다)

 

시험 점수를 예측하는 예시

regression using three inputs(x1,x2,x3)

데이터 low 하나를 instance라고 한다. 

여러번 반복해서 low를 수식에 대입하고 계산하는 것은 효율성이 떨어진다. 

->matrix이용

instance의 수만큼 x matrix를 늘린다. 

instance값이 많더라도 연산 값을 한번에 구할 수 있다. 

 

W의 크기를 결정하는 방법 

대부분의 경우 X와 H(Y)의 값은 정해진다. 

X [5,3] 5 : instance의 수, 3 : variable의 수

H(X) [5,1] 5: instance의 수, 1: y값  

W의 크기를 결정해야한다. 

-> X [5,3]에서 3을 가져오고, H(x) [5,1]에서 1을 가져와 [3,1]이 된다. 

([5,3]에 어떤 행렬을 곱해서 [5,1]이 되려면 그 행렬은 [3,1]이어야 한다.)

 

인스턴스의 수는 가변적인 요소이므로 n으로 표시하기도 한다. 

실제 tenserflow에선 none으로 표시하기도 한다. 

 

Lec 5 Logistic (regression) classification

Classification 

- Regression은 수치값을 예측하는 것 

- Classification은 어떠한 Category로 분류하는 것 

- 2개의 class로 분류하는 것을 binary classification이라고 한다. 

- 기계적 학습을 위해 0또는 1로 인코딩한다. 

ex) spam email detection : spam(1) or ham(0) 

ex) Facebook feed : show(1) or hide(0)

ex) Credit Card Fradulent Transaction detection: legitimate(0)/fraud(1)

ex) 주식을 살것인가 팔 것인가 

 

Linear regression으로 학습하는 경우의 문제점 

예시 : Pass(1)/Fail(0) base on study hours

1. False Negative / Fase Positive

여기에 새로운 데이터가 추가되어 WX가 변하는 경우를 생각해보자 

새로운 데이터에 의해 기울기가 변하게 된다.

기존과 동일하게 0.5 이상, 이하로 합격, 불합격으로 판단하게 되면,

합격인데도 불합격(false negative)이라고 판단하는 경우가 생기게 된다. 

 

2. Hypothesis

Hypothesis는 값이 0이상 1이하의 값으로 나와야 한다. 

그러나 $H(x) = Wx +b$를 Hypothesis로 그대로 사용하는 경우, 

classification에서는 1보다 큰 값이 나올 수 있다. 

ex ) W = 0.5, b=0 로 학습되었다고 하자. 

만약 x값이 100이라고 한다면 $H(x)=50$ 

-> $H(x)$를 0과 1사이 값으로 만들어주는 함수 $g(z)$를 찾는다. 

sigmoid(logistic function) : $g(z)=\frac{1}{(1+e^{-z})}$

 

 

Logistic Hypothesis

$z=WX$

$H(x)=g(z)$

$g(z)=\frac{1}{(1+e^{-z})}$

 

Cost Function 

Logistic Hypothesis는 이전의 Hypothesis와 달리 극소값이 하나가 아니다 

즉 시작한 위치에 따라 gobal minimun이 아니라 local minimun을 찾을 가능성이 있다. 

따라서 새로운 Cost함수가 필요하다. 

 

이와 같이 Cost를 정의하면 극소값이 1개이기 때문에 gradient decent 알고리즘을 적용할 수 있다. 

 

y가 1일 때와 0일때를 합쳐서 수식으로 나타내면 다음과 같다. 

 

Minimize cost - Gradient decent algorithm 

tensorflow를 사용하는 경우 GradientDecentOptimizer함수를 이용하여 구하면 된다. 

 

 

Lec 6 Softmax Classification Multinomial classification 

logistic regression을 학습한다는 것은 두가지를 구분하는 선(hyper plane)을 찾는 것 

이를 그대로 multinomial classification에 적용할 수 있다.(변수가 여러개인 경우)

예시 : 학점을 예상하기 

binary classification만을 가지고 multinomial classification을 구현할 수 있다. 

-> B인지 아닌지, A인지 아닌지, C인지 아닌지 구분하는  classification 3개를 이용한다. 

서로 독립된 binary classification을 구현하는 경우 행렬을 통한 연산은 다음과 같다. 

그러나 이런식으로 계산하는 것은 구현하기에도 복잡한다 따라서 W의 행을 늘린다.

W를 하나의 벡터로 처리하여 3가지 classification을 구현할 수 있다. 

이때 시그모이드를 어떻게 적용할 것인가? 

-> softmax를 적용한다. 

 

Softmax 

$S(y_i)=\frac{e^{y_i}}{sum_j e^{yi}} $

-결과 값을 0과 1사이의 값으로 만들어준다. 

-결과 값의 합을 1로 만든다. 

-softmax로 나온 결과 값을 확률로 볼 수 있다. 

-이 값을 one-hot encoding 을 이용하여 표현할 수 있다. (tensorflow에서 argmax 이용)

-> 확률이 가장 큰 값만 1로 표현하고 나머지 값은 0으로 표현한다. 

 

Cost Function

- Cross Entropy = $-\sum_i L_i log(s_i)$

- S(y) : 예측 값, L : 실제 값 

- $-\sum_i L_i log(s_i) = \sum_i (L_i) * (-log(s_i)) $

- $s_i$ : softmax를 통한 값이므로 0과 1사이의 값

- $-log(s_i)$ : $s_i$의 값이 0일 때는 값이 무한대이고, 1일 떄는 0이다.

- 그래프로 나타내면 다음과 같다. 

- 2가지 lable이 있다고 가정하자 

- $L=\begin{bmatrix} 0 \\ 1 \end{bmatrix} = B$ : 실제값이 B라고 하자 

- $Y=\begin{bmatrix} 0 \\ 1 \end{bmatrix} = B$ : B라고 예측 함

-> 맞는 예측 

-> cost function에 의한 값이 0이 나온다. 

- $Y=\begin{bmatrix} 1 \\ 0 \end{bmatrix} = A$ : A라고 예측 함

-> 틀린 예측 

-> cost function에 의한 값이 $\infty$가 된다. 

- 따라서 cost function이 잘 작동한다. 

(Logistic cost VS cross entropy 

- 실제로는 Logistic cost와 cross entropy가 같은 것이다. )

-training set이 여러 개인 경우 

 

 

Gradient descent 

이전과 같이 미분하고, 경사를 따라 이동하여 w가 최소인 지점을 찾는다. 

 

'STG 퀸트고 (딥러닝 기초) > 딥러닝 기초 (모두의 딥러닝 시즌1)' 카테고리의 다른 글

Lec10~12  (0) 2022.01.03
Lec 7 ~ 9  (0) 2021.12.27
모두의 딥러닝 Lec00~03  (0) 2021.11.08

모두의 딥러닝 시즌1과 학부에서 배운 인공지능 개념을 약간 덧붙여서 정리하고자 한다. 

https://www.youtube.com/watch?v=BS6O0zOGX4E&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm 

강의에서 사용한 코드

DeepLearningZeroToAll/ipynb at master · hunkim/DeepLearningZeroToAll · GitHub

 

GitHub - hunkim/DeepLearningZeroToAll: TensorFlow Basic Tutorial Labs

TensorFlow Basic Tutorial Labs. Contribute to hunkim/DeepLearningZeroToAll development by creating an account on GitHub.

github.com

 

Lec 00

목적 

- 머신러닝에 대한 기본적인 이해 

: 딥러닝을 이해하기 위한 기본적인 알고리즘 (Linear regression, Logistic regression)을 이해한다. 

- Tensorflow과 Python을 통해 문제를 푼다. 

 

수업 형식 

- 10분의 강의 영상 

- Tensorflow 튜토리얼

수업과 실습 2가지로 나누어서 진행 

 

Lec 01 머신러닝의 기본적인 용어와 개념 설명

1. 머신러닝이란?

- 어떤 자료에서 학습하여 배우는 능력이 있는 프로그램

- Explicit programming의 한계 

: 기존의 프로그래밍은 입력을 바탕으로 프로그래머가 출력에 대해 코딩함 

-> 그러나 정확하게 코딩하기 어려운 경우가 있음 ex 스팸 필터, 자동 운전 차 

- Arthur Samuel이 자료 또는 현상에서 자동으로 배우는 것을 제안함 

-> 프로그래머가 일일히 정하지 않고, 어떤 자료에서 학습함

 

2. 머신러닝의 종류 

1) Supervised learning(지도 학습)

- labeled 된 자료(training set)를 통해 배운다 

(* 입력(문제)에 대한 출력값(답)이 정해짐)

ex) 동물 사진을 보고 고양이인지, 강아지인지 구분한다. 

 

2) Unspervised learning

- un-labeled data를 통해 학습한다. 

- 일일히 label을 주기 어려운 경우 

(* 출력에 대한 데이터가 없는 경우)

ex) Google news grouping : 알아서 유사한 것끼리 모은다. 

ex) Word clustering : 비슷한 단어들을 모은다 (데이터를 통해 스스로 학습함)

 

3. Supervised learning

이 강의에서는 Supervised learning 에 대해서 주로 배운다. 

ex) Image labeling, Email spam filter, Predicting exam score

 

1) Training data set 

이미 답이 정해져 있는 데이터가 있을 때 label을 통해 모델이 학습함 

-> 그러면 어떤 새로운 x에 대한 값을 모델이 답을 구함 

이때 모델이 학습하는 데 이용한 label이 있는 데이터를 학습 데이터라고 함 

ex) AlphaGo 

알파고도 기존의 기보를 학습함 

이세돌이 둔 수를 보고 기존에 학습했던 것을 바탕으로 어디에 바둑을 둘지 정함 

-> 일종의 supervised learning 

이때 기보가 training data set 

 

2) supervised learning의 종류

  1. regression(회귀) : 학습 데이터에 부합되는 출력값이 실수인 함수를 찾는 문제 ex) 기말고사 성적 예측 
  2. binary classification(이진 분류) : 2개의 종류로만 분류하는 문제 ex)Pass/non-pass 
  3. multi-label classification : 여러가지의 종류로 분류하는 문제 ex)Letter grade (A,B,C,D,F)

 

Lab1 실습 TensorFlow의 설치 및 기본적인 operations

TensorFlow란?

- data flow graph를 이용하여 수치 계산을 하는 라이브러리

 

Data Flow Graph란?

- 노드 : operation 

- edges : data array(tensors)

-> 노드와 edge를 거쳐서 연산이 일어나 원하는 결과를 얻는 것 

 

간단한 예시 

hello = tf.constant("Hello, TensorFlow!") // constant를 만듦 -> 그래프 안에 노드를 만듦
sess = tf.Session() // 실행하기 위해서는 Session을 만들어야함 
print(sess.run(hello)) // run을 통해 실행

 

TensorFlow의 흐름 

  1. graph를 만든다. 
  2. sess.run을 통해 그래프를 실행한다. 
  3. 그래프 안의 값이 업데이트되거나 출력값을 잔환한다. 

 

Placeholder 

- 그래프를 실행하는 과정에서 값을 던저주고 싶을 때 

-> placeholder로 노드를 만든다. 

- feed dict를 통해 값을 넘겨준다. 

 

Tensor

- Rank

Rank Math entity example
0 Scalar s=11
1 Vector v=[1,2,3]
2 Matrix m=[[1,2],[3,4],[5,6]]
n n-Tensor  

 

-Shape : 각 element가 몇개 들어 있는가

ex) t = [[4,5,6],[7,8,9]] 

     shape = (2 3) 또는 [2,3]

 

- Type 

대부분 사용하는 것은 tf.float32 (DT_FLOAT) 또는 tf.int32(DT_INT32)

 

Lec2 Linear Regression

- label이 있는 데이터를 기반으로 학습하여 실수값의 형태로 출력을 내보내는 것

 

Hypothesis

- Linear regression 모델을 학습한다는 것은 Linear 모델이 데이터에 맞을 것이다고 가정한다.

-> 모델에 맞는 선을 찾는 것이 학습의 목표

- H(x) = Wx + b  이런 형태로 가설을 세운다. 

 

 Cost function (Loss funtion)

- 어떤 선이 데이터에 맞는지 알아내기 위해 오차를 계산함

- 가설과 실제 데이터 값이 얼마나 차이가 있는가 

- H(x) - y -> 값이 음수가 될 수 있기 때문에 좋지 않다. 

-> (H(x)-y)의 제곱을 이용함 -> 항상 양수 

- 일반화 된 식 (m=학습 데이터의 수)

-Linear regression의 목표는 이 함수의 값이 최소가 되는 W와 b를 구하는 것

 

Lab2 TensorFlow로 간단한 linear regression 구현 

# 학습 데이터 
x_train = [1, 2, 3]
y_train = [1, 2, 3]

# Variable -> 텐서플로가 사용하는 variable 
# 텐서플로가 학습하면서 갱신하는 값 
# W, b의 값을 랜덤한 값을 준다. 
W = tf.Variable(tf.random_normal([1]), name='weight') 
b = tf.Variable(tf.random_normal([1]), name='bias')

# Out hypothesis XW+b
hypothesis = x_train * W + b

# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - y_train)) #reduce_mean : 평균값

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost) # cost를 최소화해라 

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer()) # 텐서 플로우의 variable을 초기화한다. 

for step in range(2001):
    sess.run(train) # 학습을 실행한다. 
    if step % 200 == 0:
        print(step, sess.run(cost), sess.run(W), sess.run(b)) 

# train을 실행하면 cost, hypothesis, W, b가 연결되어 있어 W, b값도 변경가능 
# 학습이 진행될 수록 cost가 0에 가까워진다.

 

Placeholder를 이용하는 방법 

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

# ... (앞의 코드와 동일)

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 % 200 == 0:
        print(step, cost_val, W_val, b_val)

Placeholder를 이용하면 값을 직접 넘겨줄 수 있다. 

코드를 실행해보면 W와 b 모두 1에 가까운 값으로 학습되고, 

새로운 데이터를 통해 학습이 잘 되었는지 확인 할 수 있다. 

 

Lec3 How to Minize Cost

설명을 위해 가설의 식을 더 간단하게 만든다. 

 

학습 데이터를 통해 W에 따른 cost를 구한다. 

x y
1 1
2 2
3 3

W=1, cost(W) = 0

W=0, cost(W) = 4.67

W=2, cost(W) = 4.67

이를 통해 함수를 그려보면 다음과 같다. 

cost가 0인 지점을 어떻게 찾을 것인가

-> Gradient descent algorithm 

 

Gradient descent algorithm 

- 경사를 따라 움직임

- 경사가 0이 되는 곳이 최소 

- W를 바꾸고 경사도를 계산하는 과정을 반복함 

- 미분을 이용함 

- Formal definiton

(알파는 learning rate)

- 이 수식을 기계적으로 계산하여 최소로 하는 W값을 구한다. 

- global 극소가 아니라 local 극소를 찾을 위험이 있음 

 

Convex function 

- 어느 점에서 시작하든 극소점이 같음 

- Gradient descent algorithm이 최적해를 보장함 

- Gradient descent algorithm을 적용하기 전에 Convex function임을 확인해야 함 

 

 

Lab3 Linear Regression의 cost 최소화 구현 

x_data = [1, 2, 3]
y_data = [1, 2, 3]

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

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

# Our hypothesis for linear model X * W
hypothesis = X * W

# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Minimize: Gradient Descent using derivative: W -= learning_rate * derivative
learning_rate = 0.1
gradient = tf.reduce_mean((W * X - Y) * X) # gradient 값(미분한 값)
descent = W - learning_rate * gradient
update = W.assign(descent)

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())

for step in range(21):
    sess.run(update, feed_dict={X: x_data, Y: y_data})
    print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W))

이 예시의 경우 hypothesis가 간단하여 직접 Gradient를 구했지만 
복잡한 hypothesis의 경우 직접 미분하기 힘듦 -> tensorflow의 함수 이용

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train = optimizer.minize(cost)

Gradient를 변경하고 싶은 경우 

# Get gradients
gvs = optimizer.compute_gradients(cost, [W]) # gradient 계산한 것을 반환함 
# Optional: modify gradient if necessary
# gvs = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gvs]
# Apply gradients
apply_gradients = optimizer.apply_gradients(gvs)

 

'STG 퀸트고 (딥러닝 기초) > 딥러닝 기초 (모두의 딥러닝 시즌1)' 카테고리의 다른 글

Lec10~12  (0) 2022.01.03
Lec 7 ~ 9  (0) 2021.12.27
Lec 4 ~ 6  (0) 2021.12.26

+ Recent posts