자연 언어 처리(Natural Language Processing)을 공부하다보니
자연스럽게 RNN(Recurrent Neural Networks)를 접하게 됐다, 이 알고리즘 말고도 LSTM(Long Short-Term Memory Models)도 접하긴했지만, 다음 포스팅에서 정리를 해봐야겠다.
제일먼저 RNN을 이해하기전에 일반적인 인공 신경망을 이해해야함.
일반적인 인공 신경망이란 영어로 FFNets이라고도 하는데 이는 Feed-Forward Neural Networks의 준말.
영어에서도 보이다시피 "Forward"란 단어가 있고, 신경망에는 Input Layer, Hidden Layer, Output Layer가 있고, 데이터를 입력하면 입력층에서 은닉층을 거치며 최종적으로 출력층으로 전해진다.
이렇게 점차적 "Forward"하게 전해지는 반면에, RNN은 같은 은닉층에 다시 돌아오면서 업데이트를 해준다.
다음은 출처에서 읽은 것중에 중요한 부분이다:
FFNets은 라벨을 붙여놓은 이미지 데이터로 학습을 진행하면서 점점 오차를 줄여 갑니다. 학습이 이루어지기 전에 데이터의 일부를 따로 관리하는데, 이를 테스트 셋이라고 합니다. 테스트 셋은 학습 과정에서는 사용하지 않습니다. 비유하자면 시험에 나올 문제의 유형과 범위는 알려주지만 출제할 문제는 정확히 알려주지 않는 것입니다. 한편 신경망은 학습 과정에서 사용하는 데이터를 독립적으로 학습합니다. 즉, 데이터의 순서는 중요하지 않습니다.
다시말해, FFNets은 시간 순서를 무시하고 현재 주어진 데이터만 가지고 판단합니다. 즉, 이 데이터 전에 봤었던 데이터가 무엇인지 기억하려 들지 않습니다. 그야말로 오늘만 사는 FFNets이라고 할 수 있습니다.
RNN은 FFNets와는 다르다. RNN은 지금 들어온 데이터와 과거에 입력 받았던 데이터를 동시에 고려합니다.
먼저 RNN이 활용되는 사례는 다음과 같다
1. RNN은 히든 노드가 방향을 가진 엣지로 연결되 순환구조를 이루고있음. 음성, 문자 등 순차적으로 등장하는 데이터 처리에 적합한 모델.
2. RNN의 활성화 함수는 비선형 함수인 하이퍼볼릭탄젠트를 쓰고있음. 비선형 함수를 쓰는 이유는 다음과 같다
선형 함수인 h(x) = cx를 활성 함수로 사용한 3층 네트워크를 떠올려 보세요. 이를 식으로 나타내면 y(x) = h(h(h(x)))가 됩니다. 이 계산은 y(x) = c*c*c*x처럼 세번의 곱셈을 수행하지만 실은 y(x) = ax와 똑같은 식입니다. a =c^3 이라고만 하면 끝이죠, 즉 히든레이어가 없는 네트워크로 표현할 수 있습니다. 그래서 층을 쌓는 혜택을 얻고싶다면 활성함수로는 반드시 비선형함수를 사용해야 합니다.
간단하게 선형함수와 비선형함수의 차이를 보자면:
1. 선형함수는 어떤 값을 넣었을 때 출력 값을 예측할 수 있는 반면에, 비선형함수는 예측할 수가 없다. 따라서 선형함수는 직선, 비선형함수는 곡선 또는 직선이 아닌 형태를 띔
출처:
[1] https://deeplearning4j.org/kr/lstm
[2] https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/
'Data > Data Science' 카테고리의 다른 글
[SQL] Coalesce 함수를 이용한 NULL값 처리 (0) | 2019.01.21 |
---|---|
[Pytorch] CrossEntropy, BCELoss 함수사용시 주의할점 (0) | 2018.11.07 |
[Pytorch] MNIST CNN 코드 작성 & 공부 (0) | 2018.10.08 |
[Pytorch] MNIST DNN 코드 작성 & 공부 (0) | 2018.10.04 |
[Tensorflow] 텐서플로우를 이용한 간단한 RNN 코딩 (0) | 2018.03.02 |