일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 스펨메일 분류
- 코딩
- 27448
- 2247
- dfs
- 코테
- python
- ps
- dp
- 부분수열의 합2
- 정렬
- 백준
- 샤논 엔트로피
- 코복장
- 구현
- 딥러닝
- populating next right pointers in each node
- 아니메컵
- lgb
- BFS
- T tree
- 정답코드
- 파이썬
- 17070
- 다이나믹 프로그래밍
- C
- 힙 정렬
- 실질적 약수
- 코딩테스트
- 모두의 꿈
- Today
- Total
코딩복습장
[cs231n] 10강 순환 신경망(Recurrent Neural Network) 본문
지금까지 우리가 봤던 신경망은 vanilla feed forward network이다.
어떤 입력을 받고, 그 입력은 고정된 크기의 객체였다. (이미지나, vector)
그 입력이 몇가지 hidden layer를 통과하도록 넣고 단일 출력을 내는 것이다.
그러나 머신러닝 문맥에서 우리는 모델이 처리할 수 있는 데이터 종류에 있어서 더 많은 유연성을 가지고 싶다.
일단 RNN으로 넘어가면, 우리는 network가 해볼 수 이쓴 기회가 훨씬 더 많아진다.
그래서 일단 순환신경망이 있으면, 우리는 이런 일대다 모델을 사용할 수도 있다. 혹은 입력이 이미지 같은 정해진 객체 이지만, 우리의 출력은 caption같은 일련의 변수 길이가 될 수 있다.
또는 다대일 모델도 가질 수 가 있다. (one-to-many)
입력은 다양한 크기가 될 수 있다. (텍스트 조각일 수도 있음)
우리는 그 텍스트의 감성이 긍정인지 부정인지를 이야기 할 수도 있다.
혹은 비디오 프레임을 입력으로 받을 수도 있다. 그리고 해당 비디오에서 어떤 작업이 일어나는지 분류를 결정할 수도 있다
또 입력과 출력의 길이가 모두 다양한 경우도 있다. (many-to-many)
입력이 영어고 output이 프랑스어인 번역기를 생각할 수 있다. (어순이 다르기 때문에 문장을 모두 보고 판단)
또한 frame단위의 비디오 classification 문제도 생각해볼 수 있다.
그렇다면 RNN의 모델은 어떻게 생겼을까?
RNN은 weight를 반복해서 사용하는 구조를 따른다.
그리고 이전 hidden state를 현재 시점으로 끌고와 현재 시점의 input과 같이 사용한다.
hidden state는 input과 이전 hidden state의 값에 weight를 곱하고 tanh를 적용하여 구한다.
그리고 t시점의 output은 weight를 한번 더 곱하여 구한다.
many-to-many 그래프에서 RNN의 작동과정을 살펴보자
우선 hidden state는 0번째 시점부터 시작하고 보통 모든 원소를 0으로 초기화 한다.
그리고 모든 시점에서 동일한 weight를 사용한다.
이렇게 나온 hidden state와 계산된 input을 합하여 tanh를 적용하고 결과 weight를 곱하면 y가 나오게 된다.
우리는 이렇게 나온 y의 loss의 합을 최종 loss로 사용한다.
many-to-one의 경우는 다음과 같다.
그리고 many-to-many 모델을 many-to-one + one-to-many의 행태로 볼 수도 있다.
보통 기계학습에서 사용하는 형태이다.
다대일 모델로 입력받은 문장의 의미가 압축된 matrix를 받아서 번역한 문장을 나타내는 것이다.
RNN은 보통 자연어 처리를 하는데 사용된다.
입력이 주어지면 다음에 올 문자를 예측하는 형태로 작동하기도 한다.
최종 output을 softmax를 통해 알아내고 이것을 다음의 input으로 집어넣어서 output을 알아내는 방식이다.
틀린 문자가 나오면 loss를 사용해서 training 시킨다.
매 순간마다 입력을 받고 output을 내보내는 형태는 training하기가 매우 어렵다.
매 순간 입력을 따로 해야하고 모든 출력이 나올 때, backpropagation을 할 수 있기 때문이다 .
gradient를 업데이트하는 과정이 매우 느릴 것이다.
또한 모든 출력을 저장해야 하기 때문에 많은 메모리를 필요로 할 것이다.
따라서 보통 100개 정도 시점씩 잘라서 loss를 계산한다.
SGD와 비슷하다고 볼 수 있다.
image captioning에 경우 사진에 대한 feature를 conv net을 통해 추출하고 이것을 RNN의 hidden state에 집어넣어서
계산한다.
우리는 특수한 start token을 사용하여 문장을 생성하도록 만들고 end 토큰을 샘플링하면 생성을 멈추도록 만든다.
network는 이 과정을 반복하므로써, 문장의 시작부분과 끝 부분에 start, end token이 온다는 것을 학습할 수 있다.
다음은 이렇게 만든 이미지 갭셔닝의 결과이다.
하지만 이 모델들은 완벽하지 않다.
훈련데이터와 다른 데이터에 대해 실행시키면 잘 동작하지 않는다.
지금까지 우리는 단일 RNN에 대해 이야기 했는데, 앞으로는 multi-layerd recurrent network에 대해서 살펴볼 것이다.
이제 RNN의 문제점에 대해서 살펴볼 것이다.
RNN은 backpropagation을 할 때, 문제가 발생한다.
입력의 길이가 길어질 수록 마지막 output으로부터의 update의 값이 뒤로 가면서 작아진다.
또한 단일 값이 계속 1보다 크다면 경사가 폭발하는 경우도 생긴다.
사람들은 폭발하는 경사를 해결하기 위해 gradient clipping이라는 기법을 사용하곤 한다.
gradient clipping이란 gradient가 임의의 threshold(L2-norm계산)을 넘으면 더 커지지 못하게 고정하는 방식이다.
vanishing gradient문제를 해결하기 위해서 우리는 더 복잡한 모델을 쓸 필요가 있다.
vanishing gradient 문제를 해결하기 위해 나온 것이 바로 LSTM이다.
각 계산에 대해서는 이전 hidden state, ,현재 input에 대해 weight를 곱하는 연산이 모두 들어간다.
이 상태에서 forget gate의 경우는 sigmoid를 사용하여 이전의 cell state에 곱하는데, 이는 얼만큼의 이전의 정보를
잊어버릴지 정하는 행위로 해석할 수 있다.
그리고 input gate에서는 g에 tanh를 곱하여 현재 입력의 vector를 구하고 이것에 대해서 input gate의 sigmoid값을 곱하여
현재에 대해서 얼만큼의 기억을 할 건지 정한다.
이후에 forget gate값과 더하여 현재 cell state를 구한다.
이렇게 만들어진 cell state에 tanh를 적용하여 output gate값과 내적한 것이 현재의 hidden state가 된다.
(cell state의 정보를 얼마나 다음 hidden state에 반영할지 정하는 것)
RNN의 vanishing gradient문제를 해결할 수 있는가?
어느정도는 해결할 수 있다. 왜냐, cell state에 덧셈 연산이 있기 때문에 activation을 RNN보다는 덜 통과하여
gradient update를 할 수 있다.
하지만 결국 마지막 loss부터 첫번째 지점까지 backpropagation을 한다면 sigmoid가 여러번 곱해져서 vanishing gradient
문제가 발생한다.
'CS231n' 카테고리의 다른 글
[CS231n] 12강 Visualizing and Understanding (0) | 2025.06.23 |
---|---|
[CS231n] 11강 Detection and Segmentation (0) | 2025.06.23 |
[cs231n] 9강 CNN 아키텍처 (architecture) (0) | 2025.06.22 |
[cs231n] 7강 신경망 훈련하기 (4/4) (0) | 2025.06.21 |
[cs231n] 7강 신경망 훈련하기 (3/4) (0) | 2025.06.21 |