(DeepLearning) Perceptron, ANN

고독한 키쓰차·2020년 11월 19일
0

Algorithm

목록 보기
1/1

딥러닝 강의 수강 후 느낀 점 및 기억해야할 점 정리한다.
우선 여기서 말하는 딥러닝은 ANN(Artificial Neural Network) 정도로 함축하여 설명 할 예정이다.(ANN 스펠링이 왜이리 자꾸 틀리는지...ㅋ)
우선 딥러닝을 이해하려면
Linear Classifier -> Perceptron -> ANN 의 순서대로 개념을 잡아갈 예정.

Linear Classifier

  • 선형분류법은 y=axy=ax 에서 기울기값을 어떻게 주어야 분류하고자 하는 데이터들을 정확하게 분류할 수 있는 선을 그릴 수 있는지 알아보는것
  • 처음엔 아무렇게나 기울기를 설정하여 그리고, 오차를 계산하여 기울기를 수정함(target 을 알고있으니, Error 구할 수 있음)
    Error=delta(a)xError = delta (a)x
    delta(a)=E/xdelta(a) = E/x
  • 이렇게 기울기를 계속해서 수정해서 잘 나오는 classifier 만듬
    t = (a + delta(a)) x
  • learning rate 을 주면 조금 더 부드럽게 기울기를 변화시킬 수 있음
  • **문제점 : XOR 같이 선형으로 분류가 안되는 경우는 못 함

  

Single Layer Perceptron

  • 입력 벡터값에서 weight라는 가중치를 둬서 합한 값에 Activation function(step function)에 입력하여 나온 결과값을 target(정답)과 비교
    이 과정에서 맞으면 ok, 틀리면 weight 조정
  • 초기 가중치는 -0.5~0.5 로 설정 , x_0 = -1 or 1 (수학자들이 깊은 공식을 통해 구해낸 것임)
  • 가중치 조정은,
    wi=wi+LearningRateXi(Tf(net))w_i = w_i + LearningRate*X_i(T-f(net))

f(net)f(net) 은 activation 함수 지난 결과값
 

Three Layer Neural Network

  • Forward Propagation 으로 입력값과 가중치를 연산하여 Activation Function을 통해 나온 결과값으로 오차 계산
  • Back Propagation 으로 오차를 이전 계층으로 전달해줌
  • Back Propagation에서 오차를 이전 계층으로 전달해줄 때, 각각의 weight 비례해서 던져줌(영향도가 높은 간선에는 더 많이 돌려줌)
  • 하지만, hidden layer 의 target value를 찾을 수 없기 때문에 input layer 로 weight update 불가능함
  • 그래서, 그냥 error 만 던져줌 (Forward Propagation과 vector dot 동일, 하지만, weight 을 transpose 해줘야함
  • 여기서 문제점은, 하나의 weight 간선을 수정하면 그 이전 layer의 weight 간선까지 영향을 받게 됨.
  • Gradient Descent 를 이용해서, 미분의 관점으로 가중치 weight의 값의 변화에 따라 오차 E가 얼마나 변하는지 알아보게됨.
    Ewjk=wjk(tnon)2\frac{\partial E}{\partial w_{jk}} = \frac{\partial}{\partial w_{jk}} \sum(t_n - o_n)^2
    Ewjk=wjk(tkok)2\frac{\partial E}{\partial w_{jk}} = \frac{\partial}{\partial w_{jk}}(t_k - o_k)^2
    sigma 삭제 가능(o_n 은 이전의 모든 노드와 연결되어있지 않고 오직 연결된 가중치에대해 영향을 받게됨)
    Ewjk=2okwjk(tkok)\frac{\partial E}{\partial w_{jk}} = -2\frac{\partial o_k}{\partial w_{jk}}(t_k - o_k)
    여기서, o_k 는 sigmoid 함수를 적용한 상태라,
    Ewjk=2wjk(tkok)sigmoid(wjkoj)\frac{\partial E}{\partial w_{jk}} = -2\frac{\partial}{\partial w_{jk}}(t_k - o_k)sigmoid(\sum w_{jk}o_j)
    로 변환이 가능하다.
    xsigmoid(x)=sigmoid(x)(1sigmoid(x)\frac{\partial }{\partial x}sigmoid(x) = sigmoid(x) (1-sigmoid(x)
    인해,
    Ewjk=2(tkok)sigmoid(wjkoj)(1sigmoid(wjkoj))wjk(wjkoj)\frac{\partial E}{\partial w_{jk}} = -2(t_k - o_k)sigmoid(\sum w_{jk}o_j)(1- sigmoid(\sum w_{jk}o_j))\frac{\partial}{\partial w_{jk}}(\sum w_{jk}o_j)
    여기서, 마지막의 sum 과, w_jk 를 제거해줄 수 있기 때문에,
    Ewjk=2(tkok)sigmoid(wjkoj)(1sigmoid(wjkoj))oj\frac{\partial E}{\partial w_{jk}} = -2(t_k - o_k)sigmoid(\sum w_{jk}o_j)(1- sigmoid(\sum w_{jk}o_j))o_j
    이렇게 남음
    최종 식에서, t_k - o_k 는 e_k 이고, 그 뒤 sigmoid()는 o_k이기 때문에,
    결국 = e_k o_k(1-o_k)o_j 라고 볼 수 있다.
    gradient descent 에 의해,
    new w_jk = oldw_jk - learning_rate* partial E/ partial w_jk

주의해야할 점

  • 신경망이 잘 작동하지 않을때, 학습데이터, 가중치의 초기값, 결과값의 범위등을 수정해줘야함
  • Activation Function 에서 sigmoid 함수를 쓰기때문에, 양 끝점의 기울기가 거의 0이기 때문에 아주 미세하게 변화해서 성능이 안좋아짐
  • 그래서 입력값을 0~1 사이의 값이 오도록 조정(MinMax Scaler) 다만, 0 은 안됨 (가중치도 0이 되므로) 그래서 0.01 을 더해줌
  • 목표값 또한 0.01~0.99 로 변경 ( sigmoid 함수의 한계)
  • weight 의 간선의 숫자 또한 조정해줘야함. 간선의 수가 너무 많아지면, 결과값이 너무 커질 수 있음
    가중치값 = +-(1/sqrt(노드갯수))

이제, 초기 input node, hidden layer, hidden node, output node, epoch 결정한다.
epoch 란, 학습의 수행 횟수인데, 수정된 weight 값으로 처음부터 끝까지 몇바퀴 돌리는지이다. (너무 많이 돌리게되면 overfitting)
이러한 과정들을 그래프로 나타내어, hyper parameter optimization 필요!

profile
Data Scientist or Gourmet

0개의 댓글