밑바닥 부터 시작하는 딥러닝 2 -chapter5 : RNN

이전 단어를 통해서 wt단어를 추출해 나가는거라고 생각하면 된다.


손실함수는 이렇게된다.
언어모델
특정 단어 시퀀스에 대해서 그 시퀀스가 일어날 가능성을 판단하는거 / -> 기계번역과 음성 인식이 사용되며 얼마나 자연스러운지 확률로 알수 있다.


그림으로 설명하면 이런 그림
5.1.3 cBow 모델을 언어모델로?
이전의 글에서 cbow 의 모델을 설명하였다 즉 맥략이 2 개인 단어 사이에 들어갈 단어를 추측하는 모델이였다.

맥락의 크기에 따라서 모델이 이해 못하는 상황이 발생한다. == > 맥략의 크기를 키우면 이해할것인가? => 맥략안에 단어 순서가 무시되는 한계가 발생한다.
맥략의 단어 순서가 무시되는 예

RNN 은 이런 weight 가 커지는 것을 방지하며 맥략의 정보를 기억하는 메커니즘을 가지고 있따.
5.2 RNN 이란?
Rnn = recurrent 재귀 라는 의미 => 재귀는 다시 돌아간다 (재귀함수 생각해라) 재귀하면서 정보가 업데이트 된다.

재귀처럼 같은 함수에 매개변수만 업데이트 한다고 생각하면 편하다.
RNN 가 같은계층이라는게 같은 함수라고 생각하자

xt : 입력
wt: h 으로 출력을 위한 w
ht-1 : 이전 h
wh: 다음 시각의 출력으로 변환하기 위한 가중치 ( t시간 출력으로 변호나하기 위한 가중치
여기서 ht-1 과 xt 는 행백터이다 . 행백터란? 이런거

rnn 은 h 이란 상태를 가지고 있다 => ht 의 형태로 갱신된다 .-> 기억력이 있는 계층이라고 한다.
(은닉 상태 / 은닉 상태 벡터라고 부른다 )
5.2.3 BPTT
bptt 는 : backpropagation trough time 이라고 부른다. 시간을 통해서 backpropagtion 을 한다 뜻 )
5.2.3 Truncated BPTT
신경망 연결을 적당한 길이로 끊어서 신경망 여러개로 만든다는 아이디어
순전파 연결은 안끊음 오로지 역전파만 끊어낸다.

그보다 미래의 데이터는 생각하지 않는다 독립적으로 오차역전파법을 완결시킨다.
순전파는 아까부터 게속 연결된다고 했다. 이것은 순서대로 데이터를 입력해야된다는 뜻이다.

입력할때는 h9 와 같은 은닉상태가 필요하다 이것으로 연결된다
5.2.3 Truncated BPTT 미니배치

배치라는 것은 데이터의 양이 많을때 데이터의 부분을 잘라서 계산하는 방식이였다.
여기서도 데이터를 반으로 잘라서 하면된다.


5.2.3 RNN 구현하기

주목할점은 self.cache 에 무엇을 넣었냐 는것이다.
그리고 self.grad 에 변화된것을 입력할것이라는것
\

중요! 역전파 해석


1권에서 배웠던 backprogation 은 다른것을 곱해주면 된다고 배웠다 . 내적을 사용하는데 내적은 곧
다른 차원을 이차원으로 투영시킨뒤 곱해라 이기 대문에 T 을 해줘야된다 .( 내적의 기본 정의 )
5.3.2 Time RNN 계층 구현
뭔개 소리 인가 싶어서 두시간 동안 고민함 ; ㅗ^^

https://luminitworld.tistory.com/75
(2)-5-2 RNN 구현
(1) RNN 구현 구현해야 할 신경망은 가로 방향으로 성장한 신경망입니다. 이 가로 방향으로 성장하는 신경망을 '하나의 계층'으로 구현하면 다음과 같습니다. 위의 그림과 같이 상하 방향의 입출
luminitworld.tistory.com
여기 글 참조
여기 부분이 좀 어려워서 세시간 동안 고민함 그래서 틀릴수도 있음

우리는 xs은 주어진 상태이다. 이 ws은 위와 같이 x0 ---- xt-1 까지 존재한다.
h 는 h_pre라고 생각해보면 그전의 h 를 사용할지 ( 활성화 시킬지 )안시킬지를 결정하는거라고 생각하면된다.
따라서 이전의 h_pre 를 사용하고 싶으면 그냥 사용하고 아니면 h_pre 여기서는 self.h 를 0 으로 놓은다음
layer.forward() 을 하면되는데 여기서 layer는 RNN 이다. 따라서 RNN 은 h_next 를 반환한다.
이반환된 h_next를 다음 for 문에서 또 사용한다는 의미이디ㅏ.
hs 는 사실 어디에다가 쓰는지 잘 모르겠으나 내가 사용한 self. h 를 하나로 묶는다는 의미인거 같다.
self.layer 는 RNN 으로 만들었던 layer 들을 append 즉 모은다고 생각하면된다. 이 layer 는 backward 에서 사용되는것을 볼수 있다.

backward 해석
여기도 forward 의 (xs) 같이 우선 dhs 를 선언받는다.
주의 할점은 hs=h0 ...ht-1 처럼 이렇게 존재한다는 의미이다.
for 문에서 reversed 를 통해서 rnn 을 돌린다. 그다음 t를 통해서 하나씩 순회한다고 생각한다.

이런식으로 가게된다.
layer 는 rnn 으로 구성되어있으니 (class rnn ) 으로 구성되어있으니 rnn .backward 를 해서 dx,dh 를 뽑아내고
dxs에 dx를 변경한 결과를 넣는다.
그다음 timeRNN 의 self.grads에 현재까지 변경한 grad 를 넣는다.
for i grad in enmuerate(layer,grads):
grads[i]+=grad 인것은 Rnn layer 의 안의 backward 를 통해 변경된 grad 를 뽑아서 여기 TIME RNN grad 에 다 더한다 라는 의미이다.
5.5.2 언어 모델의 평가
퍼플렉서티 => 혼란도 라는 뜻 perplexity
확률의 역수로 나타낸다.
그림이 안보이네
어쨋든 you 다음 나올 확률이 say 가 가장 높았고 그것이 0.8 이면 그것의 역수는 1.25인데
이것은 분기의 수로 해석할수 있다.
분기수 ? =>>> 다음에 취할수 있는 선택사항의 수 여기서는 1.25 후보가 1 개 이다.
만약 5.0 이다? -> 후보가 5개가 있다는 뜻
나머지는 나중에 해석함 너어무 어려움 \



