ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 챌린지 최종 후기
    패스트캠퍼스 환급챌린지(딥러닝 300제) 2021. 12. 7. 17:07

    한달동안 쉴새 없이 달려 온 느낌이다. 매일 매일 강의를 듣고 블로그 글을 쓰는 것은 성실도 측면이나 꾸준함에서 쉬운 일은 아니였다. 그럼에도 최종 후기까지 온 내 스스로에게 칭찬을 받아 마땅하다. 오늘은 30일동안 써온 블로그들을 리마인드하며 내가 배웠던 것들과 느꼈던 것들을 말해보는 시간을 가질 것이다.

     딥러닝 300제 강의를 선택하게 된 이유는 머신러닝과 딥러닝에 관한 이론들을 많이 접했지만 실제로 어떻게 적용되는지에 대한 연습이 부족하다고 판단했기 때문이다. 이것을 30일동안 모두 들을 예정이므로 200개의 강의 / 30 = 하루에 6~7 개 정도 들으면 얼추 끝낼 수 있다는 나의 첫번째 목표였다. 하지만 계획은 언제나 틀어지기 마련. 4일차부터 원인 모를 에러가 떠서 이때부터 강의듣는 갯수가 급격히 줄어들었다. 며칠 내내 원인을 찾았지만 해결을 하지 못한 채 다른 주제로 넘어갔다. 이때부터 part3의 텍스트 분류 기초를 먼저 수강했다. 5일차에 나의 고충(?)이 느껴지는 대목이 있는데 

     

    "그리고 다시 생각해 보았다. 한달 동안 모든 강의를 수강하려고 하는 의지가 자칫 나를 억누른 건 아닐까? 물론 기한 내에 다 듣는 건 좋지만 그것 나름대로 스트레스를 받는 것 같다. 게다가 하나하나 가볍게 듣는 것이 아닌 딥러닝 부분이라 강의가 끝날 때마다 개념들을 다시 찾고 공부해야 하는 시간도 생각을 해봐야 하니 말이다. 마음 가볍게 생각하자. 지금 하고 있는 것 만으로도 나는 나아가고 있고, 충분히 열심히 하고 있으니까."

    라는 말을 했다. 그 당시 나를 다독였던 것 같다. 

     

    10일차 때부터 깨달은 게 있었다. 딥러닝300제는 개념에 대해서 말해주지 않는다. 말 그대로 실습에 해당한다. 그럼에도 나는 이것을 먼저 들어보는 것이 좋다고 생각하는 게 내가 얼마나 모르는지 알 수 있게 해주기 때문이다. 나는 너무나 부족하다는 것을 느꼈고, 바로 "케라스 창시자에게 배우는 딥러닝" 책을 꺼내서 처음부터 공부하고 읽었다. 또한 강의 내용을 따라가기 위해 일부로라도 공부를 더 할 수 있게 자극을 시켜준다는 점이 이번 환급챌린지를 하면서 가장 좋지 않나 싶다. 그리고 이때 본격적으로 시작하기 위해 내 노트북 환경에서 gpu를 돌리기 위해 cuda를 설치했다. 하지만.. 우분투나 코랩이 아니기 때문에 버전을 맞추는 건 상당히 어려웠고, 오늘 내내 설치하고 지웠다 설치하는 작업을 반복했다.

     

    시각이미지 주제에 대해 데이터셋을 불러일으키는 데서 오류가 난 뒤부터 나는 자연어 처리 쪽으로 주제를 바꾸었고 대부분이 이 내용이다. 여기서 내가 배웠던 것들을 다시 한번 정리해 보았다.

     

     

     seq2seq는 Encoder-Decoder로 많이들 부른다고 한다. 이름이 말해주듯이 2개의 모듈(Encoder, Decoder)가 있다. Encoder는 입력 데이터를 인코딩하고, Decoder는 인코딩된 데이터를 디코딩하는 역할을 한다.

     

    인코더는 데이터를 입력받아서 하나의 벡터로 정보를 압축해준다. 이 때의 벡터를 컨텍스트 벡터라고 하며, 디코더는 이 컨텍스트 벡터를 이용해서 번역같은 것을 수행한다. 그 다음 Encoder는 RNN을 이용하여 데이터를 hidden state vector로 변환한다. 즉, "인코딩한다"는 말은 결국 임의 길이의 시계열 데이터를 고정 길이 벡터로 변환하는 작업이 된다.

     

    Decoder는 Encoder로부터 Context Vector (h)를 넘겨받는다. 그리고 첫 입력으로 문장의 시작을 의미하는 심볼인 <s>가 들어간다.

     

    모델 학습 (7일차)

     keras는 sequential 함수를 제공하는데, 층을 차례대로 쌓은 모델을 만들어준다.

     

    512개의 유닛을 가진 입력 layer를 만든다고 한다면, activation은 층의 활성화함수(의사결정 함수)를 설정하는 매개변수다.

     

    컴파일이란 모델을 학습시키기 위한 학습과정을 설정하는 단계이다.

     

    그 다음 손실함수를 지정한다. 손실함수를 최소화하는 방향으로 가중치(w)와 역치(k)를 수정하게 된다. 대표적인 손실함 수 중 하나인 categorical_crossentropy 함수를 사용한다. 

     

    훈련과정을 설정한다. 이 함수를 최적화하는 방향으로 학습이 일어나는 대표적인 함수 중 하나인 adam을 사용한다.

     

    훈련과정을 모니터링하는 방식을 지정한다. accuracy를 지정하면 학습과정에서 정확도를 수집한다.   

     

    MLP 모델은 데이터를 작은 배치로 나누고 훈련과정에서 순회하는 방식으로 학습을 진행한다.

     

    batch_size는 1회 계산에 사용한 데이터를 지정한다. 

     

    epoch = 1 은 전체 입력 데이터를 한번 순회한다는 것을 의미한다.

     

    epoch가 한번 끝날 때마다 검증데이터를 통해 데이터의 손실과 측정 지표를 출력한다. 검증데이터로 쓸 데이터를 지정한다. 

     

    학습은 주어진 입력을 정확한 타깃에 매핑하기 위해 신경망의 모든 층에 있는 가중치 값을 찾는 것을 의미한다. 목표는 가중치의 정확한 값을 찾는 것이고, 신경망이 한 샘플에 대해 얼마나 잘 예측했는지 측정하기 위해 손실 함수가 신경망의 예측과 진짜 타킷의 차이를 점수로 계산한다. 손실 점수를 피드백 신호로 사용하여 현재 샘플의 손실 점수가 감소되는 방향으로 가중치 값을 조금씩 수정하고, 수정 과정은 역전파(backpropagation) 알고리즘을 구현한 옵티마이저(optimizer)가 담당한다. 

     

    손실 함수(loss function)의 정의는 훈련 데이터에서 신경망의 성능을 측정하는 방법으로 네트워크가 옳은 방향으로 학습될 수 있도록 도와준다.

     

    옵티마이저(optimizer)의 정의는 입력된 데이터와 손실 함수를 기반으로 네트워크를 업데이트하는 메커니즘

     

    훈련 반복 루프는 다음과 같다.

    1. 훈련 샘플 x와 이에 상응하는 타깃 y의 배치를 추출한다.
    2. x를 사용하여 네트워크를 실행하고(정방향 패스 단계), 예측 y_pred를 구한다.
    3. y_pred와 y의 차이를 측정하여 이 배치에 대한 네트워크의 손실을 계산한다.
    4. 배치에 대한 손실이 조금 감소되도록 네트워크의 모든 가중치를 업데이트한다.

     

    reuter 실습(9일차)

    reuters Dataset은 11,228개의 뉴스기사와 46개의 주제를 가지고 있다고 한다. 모든 단어는 빈도에 따른 정수로 교체 되어있다. 이것을 하기 전에는 딥러닝의 구조. 신경망에 대해 알아 볼 필요가 있다. 신경망의 구조는 다음과 같다.

    • 네트워크(또는 모델)를 구성하는 층
    • 입력 데이터와 그에 상응하는 타깃
    • 학습에 사용할 피드백 신호를 정의하는 손실 함수
    • 학습 진행 방식을 결정하는 옵티마이저

    층은 하나 이상의 텐서를 입력을 받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈이고, 가중치는 확률적 경사 하강법에 의해 학습되는 하나 이상의 텐서이며, 여기에 네트워크가 학습한 지식이 담겨 있다.

     

    seq2seq2 모델 (12일차)

    Seq2Seq모델은 encoder 그리고 decoder로 이루어져 있다. encoder의 마지막 hidden state가 decoder의 초기 hiddent state로 사용이 된다.

    바로 유추해볼수 있는 내용은, 만약에 encoder의 sequence data의 길이 가 매우 길 경우 관련된 정보는 매우 양이 많은데 비해서 그 내용을 함축적으로 하나의 hidden state로 넣는다면 정보의 손실이 있을수 있으며, 이는 곧 catastrophic forgetting 현상으로 이어질수 있다.

    이러한 문제를 해결하기 위해서 Attention을 사용해서 문제를 해결할수 있다.

     

    GRU는 게이트 메커니즘이 적용된 RNN 프레임워크의 일종으로 LSTM에 영감을 받았고, 더 간략한 구조를 가지고 있다.

    첫번째로 Reset Gate는 과거의 정보를 적당히 리셋시키는 게 목적으로 sigmoid 함수를 출력으로 (0,1) 값을 이전 은닉층에 곱해준다. 직전 시점의 은닉층의 값과 현시점의 정보에 가중치를 곱하여 얻을 수 있다.

     

    그리고 Update Gate는 LSTM의 forget gate와 input gate를 합쳐놓은 느낌으로 과거와 현재의 정보의 최신화 비율을 결정한다. 그리고 Candidate는 현 시점의 정보 후보군을 계산하는 단계이다. 핵심은 과거 은닉층의 정보를 그대로 이용하지 않고 리셋 게이트의 결과를 곱하여 이용해준다.

     

    마지막으로 update gate결과와 candidate 결과를 결합하여 현시점의 은닉층을 계산하는 단계이다. sigmoid 함수의 결과는 현시점 결과의 정보의 양을 결정하고, 1-sigmoid 함수의 결과는 과거 시점의 정보 양을 결정한다.

     

    keras (15일차)

    tf.keras (tensorflow.keras)는 TensorFlow의 하이레벨 구현을 위한 Keras API 모듈이다.

    tf.keras 모듈의 Sequential 클래스는 Neural Network의 각 층을 순서대로 쌓을 수 있도록 한다.

    tf.keras.layers 모듈의 Dense 클래스는 (완전 연결된) 하나의 뉴런층을 구현한다.

    units는 뉴런 또는 출력 노드의 개수를 의미하며, 양의 정수로 설정한다.

    input_shape는 입력 데이터의 형태를 결정한다.

     

    다음으로 Neural Network 모델을 컴파일하는 과정에서는, 모델의 학습에 필요한 손실함수 (loss function) 옵티마이저 (optimizer)를 결정한다.

    손실함수는 Neural Network의 예측이 얼마나 잘 맞는지 측정하는 역할을 하고, 옵티마이저는 더 개선된 예측값을 출력하도록 최적화하는 알고리즘이다.

     

    Sequantial 클래스의 fit() 메서드는 주어진 입출력 데이터에 대해 지정한 횟수만큼 Neural Network를 훈련한다.

    훈련이 이루어질 때마다, Neural Network는 주어진 입력에 대해 주어진 출력값에 더 가까운 값을 출력하게 된다.

     

    => 이 부분에서는 기초를 다시 공부했다.

     

    순환 신경망(Recurrent Neural Network, RNN)은 입력과 출력을 시퀀스 단위로 처리하는 모델이다. 시퀀스의 원소를 순회하면서 지금까지 처리한 정보를 상태(state)에 저장한다. RNN의 상태는 2개의 다른 시퀀스를 처리하는 사이에 재설정된다. 하나의 시퀀스가 여전히 하나의 데이터 포인트로 간주된다. 또 다른 정의로는 히든 노드가 방향을 가진 엣지로 연결돼 순환구조를 이루는(directed cycle) 인공신경망의 한 종류이다. 시퀀스 길이에 관계없이 인풋과 아웃풋을 받아들일 수 있는 네트워크 구조이기 때문에 필요에 따라 다양하고 유연하게 구조를 만들 수 있다는 점이 RNN의 가장 큰 장점이다.

     

     

     

    19일차에서 챗봇에 대해 강의를 들었는데 이 부분 역시 초기에 데이터셋을 불러오지 못해 하루를 날렸었다. 이때는 개의치 않고 빠르게 다른 주제로 넘어 갔던 것 같다.

     

    주식 예측 (20일차)

     

    20일부터 하나 느낀 건 확실히 강의를 들으면서, 어떤 강사분이냐에 따라 강의력이 달라지는 것 같다. 나의 주관적인 의견으로는 강의 첫부분의 기초 파트보다 조금 심화된 버전 부분이 훨씬 더 와 닿고 있다. 왜냐하면 이 함수나 이런 개념을 왜 써야 하는지 세세하게 알려주기 때문이다. 덕분에 딥러닝에 흥미가 훨씬 더 생기게 되었고, 하루만에 주가 예측 파트를 모두 들을 수 있었다. 

     

    tensorflow의 expand_dim은 차원 늘리기이다. 그리고 tf.data.Dataset.from_tensor_slices 는 numpy array 나 list를 tensor dataset으로 변환해준다. (from_tensor_slices는 list와 numpy array 모두 변환하도록 지원하고 있다.)

     

    batch는 model에 학습시킬 때 batch_size를 지정하여 size만큼 데이터를 읽어 들여 학습시킬 때 유용한 method이다. 예를 들어 이미지와 같은 큰 사이즈는 memory에 한 번에 올라가지 못하기 때문에, 이렇게 batch를 나누어서 학습한다.

    또한, model이 weight를 업데이트 할 때, 1개의 batch가 끝나고 난 후 업데이트를 하게 되는데, 업데이트 빈도를 조절하는 효과도 있다.

     

    drop_remainder는 마지막 남은 데이터를 drop 할 것인지 여부이다.

     

    window는 그룹화 할 윈도우 크기(갯수)이다.

     

    shift는 1 iteration당 몇 개씩 이동할 것인지 이다.

     

    flat_map은 dataset에 함수를 apply해주고, 결과를 flatten하게 펼쳐 준다.

     

    steps_per_epoch에 대하여

    1. fit()함수를 취할 때, 버젼별로 `steps_per_epoch`과, `validation_steps`의 값이 지정되어 있지 않으면 학습이 안되는 현상이 있다.
    2. 따라서, 위의 2가지 파라미터에 값을 넣어 주면 정상적으로 학습하기 시작한다.
    3. `steps_per_epoch`은 weight를 업데이트 하는 주기 입니다. 보통은 이미지 데이터셋의 총 갯수가 1000개 일 때, `batch_size`가 128개 이면, 이미지갯수/배치사이즈만큼 weight를 업데이트한다. 쉽게 말해서, batch가 다 돌때마다 weight를 업데이트하는 것이다.
    4. 1000개 이미지 / 128 하면 7.8125 (소수점)이 나온다.

     

    콜백은 학습 과정의 특정 단계에서 적용할 함수의 세트이다. 학습 과정 중 콜백을 사용해서 모델의 내적 상태와 통계자료를 확인 할 수 있다. 콜백의 리스트는 (키워드 인수 callbacks로) Sequential이나 Model 클래스의 .fit() 메서드에 전달이 가능하다. 그에 따라 학습의 각 단계에서 콜백의 적절한 메서드가 호출된다.

     

     

    이번 최종 후기를 적으면서 한달이지만 참 많은 것을 배웠다는 것을 느꼈다. 10월 말만 해도 딥러닝에 대해서 제대로 개념이 잡히지 않았었는데 지금은 모델을 보면 바로 구조를 파악할 수 있는 실력을 갖추게 되었다. 값진 시간이 된 것 같아 기분이 좋다. 

    그리고 환급챌린지는 노력을 하면 보상을 주기 때문에 좋은 동기부여가 된다. 만약 내년에도 환급챌린지가 또 열린다면 한번 더 참여할 의사가 있다. (그 때는 딥러닝 보다는 쉬운 주제로..) 아무튼 오늘은 여기까지이고, 모두 2022년을 잘 맞이 했음 하는 바람이다.

     

     

     

     

     

     

     

    #패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #퀴즈처럼풀면서배우는파이썬딥러닝300제+연습문제패키지Online

     

     

     

     

    본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

     

    패스트캠퍼스 링크 : https://bit.ly/3FVdhDa

Designed by Tistory.