반응형
"딥러닝 텐서플로 교과서" 책을 공부하고 정리한 것입니다.
감사합니다.
개요
- RNN이란 무엇인가
- RNN의 유형
- RNN의 구조
- RNN 계층과 셀
(1) RNN (Recurrent Neural Network)
시간적으로 연속성이 있는 데이터를 처리하려고 고안된 인공 신견망이다.
이전 은닉층이 현재 은닉층의 입력이 되면서 반복되는 순환구조를 가진다.
기존 네크워크와 달리 '기억'을 가지고 있으며, 새로운 입력이 네트워크로 들어올 때마다 기억은 조금씩 수정된다.
대표적으로 자연어 처리에서 사용이 되고 있다.
첫 번째 입력이 들어오면 첫 번째 기억(h1)이 만들어진다.
두 번째 입력이 들어오면 기존 기억(h1)과 새로운 입력을 참고하여 새 기억(h2)을 만든다.
RNN은 외부 입력과 자신의 이전 상태를 입력받아 현재 상태를 갱신한다.
(2) RNN 입력과 출력에 따른 유형
(2-1) 일대다 모델
- 입력이 하나이고, 출력이 다수인 구조이다.
- 예를들어, 이미지를 입력해서 이미지에 대한 설명을 문장으로 출력하는 이미지 캡션의 경우가 일대다이다.
(2-2) 다대일 모델
- 입력이 다수이고, 출력이 하나인 구조이다.
- 문장을 입력해서 긍정/부정을 출력하는 감성 분석기에서 사용된다.
# 간단하게 RNN 다대일 모델의 코드
In_layer = tf.keras.input(shape=(3,1), name='input')
RNN_layer = tf.keras.layers.SimpleRNN(100, name='RNN')(In_layer)
Out_layer = tf.keras.layers.Dense(1, name='output')(RNN_layer)
(2-3) 다대다 모델
- 입력과 출력이 다수인 구조이다.
- 언어를 변역하는 자동 변역기가 대표적인 사례이다.
- 입력 문장으로 부터 대답 문장을 출력하는 챗봇과 입력 문장으로부터 번역된 문장을 출력하는 번역기, 개체명 인식이나 품사 태깅과 같은 작업이 속한다.
# 간단하게 RNN 다대다 모델의 코드
In_layer = tf.keras.input(shape=(3,1), name='input')
RNN_layer = tf.keras.layers.SimpleRNN(100, return_sequences=True ,name='RNN')(In_layer)
Out_layer = tf.keras.layers.TimeDistributed(keras.layers.Dense(1), name='output')(RNN_layer)
(3) RNN 구조 파악하기
- RNN은 은닉층 노드들이 연결되어 이전 단계 정보를 은닉층 노드에 저장할 수 있도록 구성한 신경망이다.
- RNN에서는 입력층, 은닉층, 출력층을 가지며 추가로 가중치를 3개를 가진다.
W(hx) : 입력층 => 은닉층으로 전달되는 가중치
W(hh) : t 시점의 은닉층 => t+1 시점의 은닉층으로 전달되는 가중치
W(yh) : 은닉층 => 출력층으로 전달되는 가중치
x(t-1)에서 h(t-1)을 얻고 => 다음 단계에서 h(t-1)과 x(t)를 사용하여 과거 정보와 현재 정보를 모두 반영한다.
위 방식, 과거와 현재 정보를 반복해서 반영하여 예측을 수행한다.
RNN의 오차는 심층 신경망에서 전방향 학습과 달리 각 단계마다 오차를 측정한다. (주로 평균 제곱 오차를 사용)
RNN에서 역전파는 BPTT를 이용하여 모든 단계마다 처음부터 끝까지 역전파를 한다.
( BPTT란 각 단계마다 오차를 측정하고 이전 단계로 전달되는 것을 의미한다. )
이와 같은 역전파를 통해 가중치 3개를 업데이트한다.
하지만, BPTT는 오차가 멀리 전파될 때 계산량이 많아지고 전파되는 양이 점차 적어지는 기울기 소멸 문제가 발생하는 단점이 있다. 이를 개선하고자 LSTM, GPU 모델이 만들어졌습니다.
(4) RNN 계층과 셀
RNN 계층은 입력된 배치 순서열을 모두 처리한다. ( 셀을 래핑하여 동일한 셀을 여러 단계에 적용한다.)
반면에, RNN 셀은 오직 하나의 단계만을 처리한다. (RNN 셀을 RNN 계층의 for loop 구문의 내부라고 할 수 있다.)
셀은 실제 계산에 사용되는 RNN 계층의 구성 요소로, 단일 입력과 과거 상태를 가져와서 출력과 새로운 상태를 생성한다.
(4-1) RNN 계층 구현하기
class RNN_Build(tf.keras.Model):
def __init__(self, units):
super(RNN_Build, self).__init__()
self.embedding = tf.keras.layers.Embedding(total_words, embedding_len, input_length=max_review_len)
self.rnn = tf.keras.Sequential([
tf.keras.layers.SimpleRNN(units, dropout=0.5, return_sequences=True),
tf.keras.layers.SimpleRNN(units, dropout=0.5)
])
self.outlayer = tf.keras.layers.Dense(1)
def call(self, inputs, training=None):
x = inputs
x = self.embedding(x)
x = self.rnn(x)
x = self.outlayer(x)
prob = tf.sigmoid(x)
return prob
(4-2) RNN 셀 구현하기
class RNN_Build(tf.keras.Model):
def __init__(self, units):
super(RNN_Build, self).__init__()
self.state0 = [tf.zeros([batch_size, units])]
self.state1 = [tf.zeros([batch_size, units])]
self.embedding = tf.keras.layers.Embedding(total_words, embedding_len, input_length=max_review_len)
self.RNNCell0 = tf.keras.layers.SimpleRNNCell(units, dropout=0.2)
self.RNNCell1 = tf.keras.layers.SimpleRNNCell(units, dropout=0.2)
self.outlayer = tf.keras.layers.Dense(1)
def call(self, inputs, training=None):
x = inputs
x = self.embedding(x)
state0 = self.state0
state1 = self.state1
for word in tf.unstack(x, axis=1):
out0, state0 = self.RNNCell0(word, state0, training)
out1, state1 = self.RNNCell1(out0, state1, training)
x = self.outlayer(out1)
prob = tf.sigmoid(x)
return prob
반응형
'AI > Deep Learning' 카테고리의 다른 글
CNN 합성곱 신경망 구조와 원리 - 합성곱층, 폴링층, 필터의 작동 방식 (0) | 2022.06.28 |
---|---|
[딥러닝] 학습 모델 저장하기 / 불러오기 / 보기 (0) | 2022.06.22 |
[딥러닝] 모델 성능 최적화하기 (배치정규화, 드롭아웃, 조기종료) (0) | 2022.06.21 |