✔ NN
- DNN (심층 신경망)
- Dense층을 주로 이용해 다양한 가중치를 가지고 예측을 해보자.
- 기존 머신러닝에서는 상관관계, 다중공선성 문제가 존재하였다.
- CNN (합성곱 신경망)
- 일부분의 특성을 이용해서 학습
- RNN (순환 신경망)
- 과거의 특성도 기억을 해야 한다.
✔ 순차 데이터
- 텍스트나 시계열 데이터와 같이 순서에 의미가 있는 데이터
- 랜덤하게 섞으면 안되는 데이터
- 일별 온도를 기록한 데이터를 랜덤하게 섞으면 안됨
- 순차 데이터를 다룰 떄는 이전에 입력한 데이터를 기억하는 기능이 필요
- 완전 연결망(Dense)나 합성곱 신경망(CNN)은 이런 장치가 없어서 하나의 샘플을 가지고 정방향 계산을 수행하고 나면 그 샘플을 버려지고, 다음 샘플을 처리할 때 재사용하지 않음
- 입력 데이터의 흐름이 앞으로만 전달되는 신경망을 FFNN(Feed Forward Neural Network)라고 합니다.
- 신경망이 이전에 처리했던 샘플을 다음 샘플을 처리하는데 재사용하기 위해서는 데이터의 흐름이 단방향으로만 전송되어서는 안되고, 다음 샘플을 위해서 이전 데이터가 신경망층에 순환이 될 필요가 있는데 이런 신경망을 RNN(순환 신경망)이라고 합니
✔ RNN (Recurrent Neural Network)
- 미래를 예측할 수 있는 네트워크
- 시계열 데이터를 분석해서 주식 가격을 예측해서 언제 사고 파는 것이 효율적인지, 자율 주행 시스템에서 차의 이동 경로를 예측
- 순차 데이터를 다룰 때, 일반적으로 RNN이 효율적이지만, 작은 시퀀스의 경우는 Dense를, 긴 시퀀스의 경우는 합성곱으로도 해결이 가능하기는 합니다.
Memory Cell
- 각 Time Step에 걸쳐서 어떤 상태를 보존하는 신경망의 구성 요소
입력 시퀀스와 출력 시퀀스
- 입력 데이터를 입력 시퀀스라고 표현하고, 출력 데이터를 출력 시퀀스라고 표현합니다.
- 형태는 여러가지 입니다.
- Sequence To Sequence(seq2seq), (sequence 여러개)
- 여러 개의 데이터를 대입해서 여러 개의 데이터를 출력하는 구조
- 과거의 주식 데이터를 대입해서 미래의 여러 날짜의 주가를 예측
- Sequence To Vector
- 여러 개의 데이터를 입력해서 하나의 결과를 만들어 내는 것
- Encoder - Decoder 구조
- encoder는 seq2vec 구조이고, decoder는 vec2seq 형태로 만들어져서 결과적으로는 sequence를 대입해서 sequence를 얻어내는 것
RNN 훈련
- 타임 스텝으로 네트워크를 펼치고 보통 역전파 알고리즘을 사용하는데, 이런 전략을 BPTT(Back Propagation Through Time)이라 합니다.
시계열 예측
- 시간 당 접속 사용자의 수, 도시의 날짜 별 온도, 여러 지표를 사용한 기업의 분기 별 재정 안정성 등은 모두 일정한 타임 스텝마다 하나 이상의 값을 가진 시퀀스
- 하나의 타임 스텝마다 하나의 값을 가지는 것을 단변량 시계열이라고 하고, 하나의 타임 스텝마다 여러 개의 값을 가지는 것을 다변량 시계열이라고 합니다.
- 시계열 예측은 두 가지 작업을 주로 하는데, 미래의 값을 예측하는 것(forecasting)이고, 비어 있는 값을 채우는 것(Imputation) 입니다.
순진한 예측
- 각 시계열의 마지막 값을 그대로 예측하는 것
- naive forecasting
- 샘플이 만든 데이터는 연속된 곡선의 형태를 가지므로, 미분을 하면 다음 데이터를 어느 정도 예측할 수 있음
가장 간단한 시계열 예측 - 선형 회귀로 해결
- 선형 회귀를 딥러닝으로 구현할 때는 1차원 입력을 만들고 출력 층은 뉴런을 1개로 만들어주면 됩니다.
- 선형 회귀는 Sequence To Vector의 구조
- 여러 개의 데이터를 받아서 하나의 값을 예측
- Dense층을 이용해서 예측이 가능
- SimpleRNN 층을 이용해서 예측 가능
- SimpleRNN은 입력 차원을 설정하지 않아도 됩니다.
- 길이에 상관 없이 처리가 가능합니다.
- 입력 층에 사용할 때, 앞쪽의 차원은 입력하지 않음
- 단순한 예측과 Dense층 그릐고 SimpleRNN을 사용하면, 일반적으로 Dense층을 사용한 회귀가 좋은 성능을 발휘하는 경우가 많습니다.
- bias 때문
- Dense는 모든 층에서 편향을 추가하지만, SimpleRNN은 입력과 은닉 상태 차원마다 편향을 추가(전체로 하나씩) 추가하기 때문입니다.
시계열 예측에서 주의할 점
- 트렌드와 계절성의 문제
- 시계열 예측에서는 일반적인 평균을 사용하지 않고, 가중 이동 평균(Weighted Moving Average)이나 자동 회귀 누적 이동 평균(Auto Regressive Integrated Moving Average- ARIMA)을 이용합니다.
- 트렌드나 계절성을 갖는 데이터들은 트렌드나 계절성을 제거해야합니다.
- 변동폭이 일정하지 않은 경우에는 로그 변환을 수행하고, 추세나 계절성을 갖는 경우는 차분(differencing)을 이용(평균이 일정)합니다.
- 차분은 매 타임 스텝과 작년도 값의 차이를 이용합니다.
- RNN은 일반적으로 이런 작업이 필요가 없음
심층 RNN
- RNN 층을 여러 개 쌓는 것
- 회귀에서는 마지막 층을 RNN 층으로 만드는 것은 자원의 낭비가 될 수 있음
- RNN은 이전의 결과를 기억하려고 하기 때문이다.
- RNN층을 여러 개 쌓아서 학습을 하게 된다면, Dense층만 사용하는 경우보다 성능이 우수함
- RNN을 이용하면 1개가 아니라 여러 개의 예측도 가능함
- 다음 하나의 값을 예측한 다음, 그 데이터를 다시 입력으로 사용하는 방식
- 하나의 타임 스텝이 50이라면 51번째 데이터는 입력된 50개의 데이터를 가지고 예측하고 다음 데이터를 예측하기 위해서 입력된 데이터 중 맨 처음을 제거하고 이전에 예측한 데이터를 추가해서 예측
✔ Embedding
- 텍스트는 컴퓨터가 바로 이해하지 못하기 때문에, 컴퓨터가 이해하는 벡터로 변경을 해주어야 하는데, 이를 Embedding이라고 합니다.
- 단어 수준의 임베딩(word2vec, fasttext등의 알고리즘)과 문장 수준의 임베딩(elmo, bert, gpt)으로 구분
- 단어 수준의 임베딩은 동음 이의어를 구별할 수 없지만, 문장 수준의 임베딩은 문장의 앞뒤를 보고 이를 파악할 수 있습니다.
- 단어 수준의 임베딩은 단어, 음절, 형태소 등으로 나누고 이를 수치화하는데 가장 쉬운 방법은 one-hot-encoding입니다.
- 이 방식은 간단하지만, 단어가 많아질수록 벡터의 공간이 커지고 비효율이 발샣아는 문제가 있는데, 원핫인코딩은 행렬 값이 대부분 0인 희소행렬이기 때문이며, 또한 단어의 유사도를 판단하기가 어렵습니다.
- 희소 행렬이 아닌 밀집 행렬로 표현한다면, 단어와 단어 사이의 유사도 계산을 할 수 있고, 자원의 낭비가 적다는 장점이 있습니다.
- 이를 위해서 텐서플로에서는 Embedding이라는 레이어를 제공합니다.
- Embedding 레이어를 사용하려면 입력 차원(단어의 개수)의 수와 임베딩 차원을 필요로 합니다. 데이터를 입력하면 임베딩 차원의 데이터로 변경을 수행해 줍니다.