지난 시간까지 인디언 부족의 몇년동안 누적된 의료기록 데이터를 가져오고 전처리하는 과정을 하면서 딥러닝을 하기위한 모든 준비가 마쳤다
이번 시간에는 4번째 강의만에 드디어 딥러닝스러운 신경망을 만들어보는 차례다
원래 정공법은 다양한 활성화 함수라던가 역전파 이론이라던가 수학적인 배경을 채우면서 이론을 배경으로 구현하지만 실제로 내가 그렇게 해본결과 재미도없고 비전공자는 한단락 읽고 나갈것이 자명하다
(나와 우리 교우들은 이런거로 시작함;)따라서 레고들을 가지고 조립하며 구현하는 과정에서 우리 어렸을 적에 '김영만 종이접기' 처럼 경험적으로 배우는게 훨씬 기억에 잘 남고 이해가 잘된다고 생각한다.
(사실 인공지능이라는게 핫해진지 얼마 안되어서 정공법으로 배운다 라는 개념이 없긴함)
일단 오늘은 LSTM이나 GRU 같은 '순환 신경망' '시계열 데이터를 다루는 딥러닝' 등의 상위 개념인 '시퀀셜 모델 신경망'을 만들기 위해 신경망 레이어를 만들며 익혀볼것이다.
시계열데이터, 순환신경망, 시퀀셜 모델 이런것은 '시계열 데이터'를 분석 혹은 예측과 같은 작업을 위해 사용하는 신경망인데, 시계열 데이터는 지난 시간에 배웠듯이 시간 순서에 따라 벨류가 찍히는 시간적인 역학관계가 내포된 데이터다
지금 최대한 쉽게 설명하고 있는데 아마 비전공자 입장에서보면 슬슬 벽이 느껴질 수 있으니까 꼭 1편부터 보는것을 추천한다
아무쪼록 이런 시퀀셜 모델의 신경망을 케라스로 만들때는 굉장히 쉽다
일단 예제코드를 보면서 하나씩 설명을 하자면 ,
i) 우선 추후에 어떤 심화적인 딥러닝 코드를 하더라도, 보통 우선은 '케라스' 로 할 경우에 시계열 데이터를 처리할 떈, 일단 '이 모델은 시퀀셜 모델이다' 하는 model = Sequential()
을 선언을 해줘야 한다, 시퀀셜 모델이 아닐때는 안해도 된다.
ii) 또한 '케라스' 로 딥러닝 신경망을 짤 때는 굉장히 직관적으로 생각하면 편한데, 괄호() 안에 있는 '딥러닝 뇌신경' 을 'add' 해서 더한다 하고 생각을 하면된다.
그러므로 위 예제는 인디안 의료기록을 처리하는 딥러닝 신경망을 만들기 위해 시퀀셜 모델임을 선언했고, '뇌신경'을 세번 더해서 딥러닝 신경망을 구성했다고 생각하면 된다.
케라스로 딥러닝 신경망을 다룰 때는 model 뒤에 . 을 찍고 add 라던가, fit 이라던가, compile같은 작업을 하는데, 이번 시간에는 딥러닝 신경망을 만드니 add를 사용한것이고 차후에 complie, summary등의 사용법을 알려줄 것이다.
iii) 이제 add 뒤 괄호안의 내용(지금부터는 전문용어로 parameter라고 하겠다) 을 설명하자면, 2번째 코드인 Dense(12, input_shape=(8,), activation='relu') 는 12개의 '신경 뉴런'을 가지고 8개의 변수를 처리하는 데이터를 인풋으로 받는다는 말이다.
이 8개의 변수는 지난 시간에 8개의 라벨링과 2개의 클래스로 나눈 인디언 의료 데이터를 처리하기 위해 사용되었다.
실제 작업시 이게 좀 중요한데 라벨링 갯수랑 input_shape랑 안맞으면 오류가 난다.
이후 activation='relu' 는 relu라는 활성화 함수를 사용한다 하는 소리인데,
활성화 함수는 들어온 데이터를 다음 레이어로 어떻게 출력하는지 결정하는 함수이다.약간 조건을 맞추면 통과시켜주는 수문장 같은 느낌으로 생각하면 된다.
(너는 조건을 맞추니 통과=활성화 / 안통과 = 비활성화)
활성화 함수는 아래와 같이 굉장히 많은 종류가 있는데, 각 특징이 매우 다르니 상황에 맞춰 사용하면 된다,
하지만 본 시리즈는 비전공자를 위한 딥러닝이니 초보자용 암기세트를 주자면, 그냥 잘 모르겠으면 relu쓰면 된다는 속담이 있다.
하지만 마지막 model.add(Dense(1, activation='sigmoid')) 에서 시그모이드를 사용하는 이유는 인디언 데이터셋의 클래스였던 당뇨병 발병확률이 O ,X 였던 0과 1로 나누어서 출력을 위해 사용했다. 이처럼 ~~~한 패턴을 보여주는 데이터 셋의 미래를 예측하는 딥러닝을 만들때 미래의 ~~한 상황이 O 냐 X 냐 인 답이 필요한다면 시그모이드를 쓰면 된다.
마지막으로 뉴런을 나타내는 파라미터가 12 -> 8 -> 1로 작성되어있는것은 점점 특징을 추출하면서, 마지막에는 인디언 데이터의 클래스인 발병여부를 나타내기 위해 O 냐 X 냐 인 1개인 뉴런을 출력으로 사용했다
마지막 1개 짜리 뉴런이 O 냐 X 냐를 보여줌
뉴런이 많고, 레이어가 많을수록 데이터에서 특징을 쥐어짜내며 자세하게 추출하겠지만, 연산량 혹은 과적합이 일어날 수 있으므로 try & error 를 통해 적절한 신경망을 찾아내면 완성이다
숙제:ReLU, Sigmoid 및 Tanh 활성화 함수의 수식과 정의를 보면서 역할을 숙지 하기 (어려움)
추천 url:
https://www.aitude.com/comparison-of-sigmoid-tanh-and-relu-activation-functions/
or
https://github.com/christianversloot/machine-learning-articles/blob/main/relu-sigmoid-and-tanh-todays-most-used-activation-functions.md
댓글
댓글 쓰기