🏷️sec_rnn
:numref:sec_language_model
에서는
여기서
eq_ht_xt
:eqref:eq_ht_xt
에서 충분히 강력한 함수
:numref:chap_perceptrons
에서 은닉 유닛이 있는 은닉 레이어에 대해 논의한 적이 있습니다.숨겨진 레이어와 숨겨진 상태는 매우 다른 두 가지 개념을 나타냅니다.숨겨진 레이어는 설명된 대로 입력에서 출력까지 경로의 뷰에서 숨겨진 레이어입니다.숨겨진 상태는 주어진 단계에서 수행하는 모든 작업에 대해 기술적으로입력을 말하며 이전 시간 단계의 데이터를 살펴보아야 만 계산할 수 있습니다.
순환 신경망 (RNN) 은 숨겨진 상태를 가진 신경망입니다.RNN 모델을 도입하기 전에 먼저 :numref:sec_mlp
에 도입된 MLP 모델을 다시 살펴봅니다.
숨겨진 레이어가 하나뿐인 MLP를 살펴보겠습니다.숨겨진 레이어의 활성화 함수를
rnn_h_without_state
:eqref:rnn_h_without_state
에는 은닉 레이어에 대한 가중치 파라미터 subsec_broadcasting
참조) 이 적용됩니다.다음으로, 은닉 변수
여기서
이는 이전에 :numref:sec_sequence
에서 해결한 회귀 문제와 완전히 유사하므로 세부 사항을 생략합니다.특징-레이블 쌍을 무작위로 선택하고 자동 미분 및 확률 적 경사 하강을 통해 네트워크의 매개 변수를 학습 할 수 있다고 말하면 충분합니다.
🏷️subsec_rnn_w_hidden_states
숨겨진 상태가 있으면 문제가 완전히 다릅니다.구조를 좀 더 자세히 살펴 보겠습니다.
시간 단계
$$\mathbf{H}t = \phi(\mathbf{X}t \mathbf{W}{xh} + \mathbf{H}{t-1} \mathbf{W}_{hh} + \mathbf{b}_h).$$
:eqlabel:rnn_h_with_state
:eqref:rnn_h_without_state
와 비교하여 :eqref:rnn_h_with_state
는 용어 $\mathbf{H}{t-1} \mathbf{W}{hh}$을 하나 더 추가하여 :eqref:eq_ht_xt
을 인스턴스화합니다.인접한 시간 스텝의 은닉 변수 $\mathbf{H}t$와 $\mathbf{H}{t-1}$ 사이의 관계에서 이러한 변수가 신경망의 현재 시간 스텝의 상태 또는 메모리와 마찬가지로 시퀀스의 과거 정보를 캡처하고 현재 시간 스텝까지 유지한다는 것을 알 수 있습니다.따라서 이러한 숨겨진 변수를숨겨진 상태라고 합니다.은닉 상태는 현재 시간 스텝의 이전 시간 스텝과 동일한 정의를 사용하므로 :eqref:rnn_h_with_state
의 계산은recurrent입니다.따라서 반복 계산을 기반으로 숨겨진 상태를 가진 신경망의 이름이 지정됩니다.
순환 신경망.
RNN에서 :eqref:rnn_h_with_state
의 계산을 수행하는 계층을 순환 계층이라고 합니다.
RNN을 구성하는 방법에는 여러 가지가 있습니다.:eqref:rnn_h_with_state
로 정의된 숨겨진 상태의 RNN은 매우 일반적입니다.시간 스텝
$$\mathbf{O}_t = \mathbf{H}t \mathbf{W}{hq} + \mathbf{b}_q.$$
RNN의 파라미터는 출력 레이어의 가중치 ($\mathbf{W}{hq} \in \mathbb{R}^{h \times q}$) 및 바이어스 ($\mathbf{W}{hq} \in \mathbb{R}^{h \times q}$) 및 바이어스 ($\mathbf{b}q \in \mathbb{R}^{1 \times q}$) 와 함께 은닉 레이어의 가중치 ($\mathbf{W}{xh} \in \mathbb{R}^{d \times h}, \mathbf{W}_{hh} \in \mathbb{R}^{h \times h}$) 및 바이어스 (
:numref:fig_rnn
는 인접한 세 시간 단계에서 RNN의 계산 논리를 보여줍니다.임의의 시간 스텝 (rnn_h_with_state
입니다.현재 시간 스텝
우리는 방금 숨겨진 상태에 대한 $\mathbf{X}t \mathbf{W}{xh} + \mathbf{H}{t-1} \mathbf{W}{hh}$의 계산이 $\mathbf{X}t$과 $\mathbf{H}{t-1}$의 연결의 행렬 곱셈과 $\mathbf{W}{xh}$와 $\mathbf{W}{hh}$의 결합과 동일하다고 언급했습니다.이것은 수학에서 입증될 수 있지만, 다음에서는 간단한 코드 스니펫을 사용하여 이를 보여줍니다.먼저 행렬 X
, W_xh
, H
및 W_hh
을 정의합니다. 이 행렬의 모양은 각각 (3, 1), (1, 4), (3, 4) 및 (4, 4) 입니다.X
에 W_xh
를 곱하고 H
에 각각 W_hh
을 곱한 다음이 두 곱셈을 더하면 모양의 행렬 (3, 4) 을 얻습니다.
from d2l import mxnet as d2l
from mxnet import np, npx
npx.set_np()
#@tab pytorch
from d2l import torch as d2l
import torch
#@tab tensorflow
from d2l import tensorflow as d2l
import tensorflow as tf
#@tab mxnet, pytorch
X, W_xh = d2l.normal(0, 1, (3, 1)), d2l.normal(0, 1, (1, 4))
H, W_hh = d2l.normal(0, 1, (3, 4)), d2l.normal(0, 1, (4, 4))
d2l.matmul(X, W_xh) + d2l.matmul(H, W_hh)
#@tab tensorflow
X, W_xh = d2l.normal((3, 1), 0, 1), d2l.normal((1, 4), 0, 1)
H, W_hh = d2l.normal((3, 4), 0, 1), d2l.normal((4, 4), 0, 1)
d2l.matmul(X, W_xh) + d2l.matmul(H, W_hh)
이제 행렬 X
와 H
를 열 (축 1) 을 따라 연결하고 행렬 W_xh
과 W_hh
을 행 (축 0) 을 따라 연결합니다.이 두 연결은 각각 형상 (3, 5) 과 형상 (5, 4) 의 행렬을 생성합니다.이 두 개의 연결된 행렬을 곱하면 위와 동일한 모양의 출력 행렬 (3, 4) 을 얻습니다.
#@tab all
d2l.matmul(d2l.concat((X, H), 1), d2l.concat((W_xh, W_hh), 0))
:numref:sec_language_model
의 언어 모델링의 경우 현재 및 과거 토큰을 기반으로 다음 토큰을 예측하는 것을 목표로하므로 원래 시퀀스를 레이블로 하나의 토큰으로 이동합니다.Bengio et al. 은 언어 모델링을 위해 신경망을 사용할 것을 처음 제안했습니다.다음에서는 RNN을 사용하여 언어 모델을 구축하는 방법을 보여줍니다.미니 배치 크기를 1로 설정하고 텍스트 시퀀스를 “machine”으로 지정합니다.후속 섹션의 교육을 단순화하기 위해 텍스트를 단어가 아닌 문자로 토큰화하고문자 수준 언어 모델을 고려합니다. :numref:fig_rnn_train
는 문자 수준 언어 모델링을 위해 RNN을 통해 현재 및 이전 문자를 기반으로 다음 문자를 예측하는 방법을 보여줍니다.
훈련 프로세스 중에 각 시간 스텝에 대해 출력 계층의 출력에 대해 softmax 연산을 실행 한 다음 교차 엔트로피 손실을 사용하여 모델 출력과 레이블 간의 오차를 계산합니다.은닉 레이어에서 은닉 상태의 반복 계산으로 인해 :numref:fig_rnn_train
,
실제로 각 토큰은 subsec_rnn_w_hidden_states
에서 논의한 것과 동일합니다.
🏷️subsec_perplexity
마지막으로, 후속 섹션에서 RNN 기반 모델을 평가하는 데 사용될 언어 모델 품질을 측정하는 방법에 대해 설명하겠습니다.한 가지 방법은 텍스트가 얼마나 놀라운 지 확인하는 것입니다.좋은 언어 모델은 다음에 보게 될 내용을 높은 정확도의 토큰으로 예측할 수 있습니다.다른 언어 모델에서 제안한 것처럼 “비가 내리고 있습니다”라는 문구의 다음과 같은 연속을 고려하십시오.
- “밖에 비가 내린다”
- “비가 내리는 바나나 나무”
- “비가 내리고 있습니다. kcj pepoiut”
품질면에서 예제 1이 분명히 최고입니다.단어는 합리적이고 논리적으로 일관성이 있습니다.의미 론적으로 따르는 단어를 정확하게 반영하지는 못할 수도 있지만 (“샌프란시스코에서”와 “겨울”은 완벽하게 합리적인 확장이었을 것입니다) 모델은 어떤 종류의 단어가 뒤 따르는지 포착 할 수 있습니다.예 2는 무의미한 확장을 생성하면 상당히 나쁩니다.그럼에도 불구하고 적어도 모델은 단어의 철자를 쓰는 방법과 단어 간의 어느 정도의 상관 관계를 배웠습니다.마지막으로, 예 3은 데이터를 제대로 피팅하지 못하는 제대로 훈련되지 않은 모델을 나타냅니다.
시퀀스의 가능성을 계산하여 모델의 품질을 측정할 수 있습니다.불행히도 이것은 이해하기 어렵고 비교하기 어려운 숫자입니다.결국 긴 시퀀스보다 짧은 시퀀스가 발생할 가능성이 훨씬 높으므로 톨스토이의 매그넘 오푸스에서 모델을 평가합니다. 전쟁과 평화는 필연적으로 생텍쥐페리의 소설어린 왕자보다 훨씬 작은 가능성을 만들어 낼 것입니다.빠진 것은 평균과 같습니다.
정보 이론이 여기에 유용합니다.소프트맥스 회귀 (:numref:subsec_info_theory_basics
) 를 도입했을 때 엔트로피, 놀라움 및 교차 엔트로피를 정의했으며 online appendix on information theory에서 더 많은 정보 이론에 대해 논의합니다.텍스트를 압축하려면 현재 토큰 집합이 주어진 다음 토큰을 예측하는 방법을 물어볼 수 있습니다.더 나은 언어 모델을 통해 다음 토큰을 더 정확하게 예측할 수 있어야 합니다.따라서 시퀀스를 압축하는 데 더 적은 비트를 사용할 수 있습니다.따라서 시퀀스의 모든
eq_avg_ce_for_lm
여기서 eq_avg_ce_for_lm
의 지수입니다.
당혹성은 다음에 선택할 토큰을 결정할 때 실제 선택 횟수의 조화 평균으로 가장 잘 이해할 수 있습니다.몇 가지 사례를 살펴 보겠습니다.
- 최상의 시나리오에서 모델은 항상 레이블 토큰의 확률을 1로 완벽하게 추정합니다.이 경우 모델의 난처함은 1입니다.
- 최악의 시나리오에서 모델은 항상 레이블 토큰의 확률을 0으로 예측합니다.이 상황에서 당혹감은 양의 무한대입니다.
- 기준선에서 모델은 어휘의 사용 가능한 모든 토큰에 대해 균등 분포를 예측합니다.이 경우 혼란은 어휘의 고유 토큰 수와 같습니다.실제로 압축하지 않고 시퀀스를 저장한다면 인코딩할 수 있는 최선의 방법이 될 것입니다.따라서 이는 유용한 모형이 이겨야 하는 중요하지 않은 상한을 제공합니다.
다음 섹션에서는 문자 수준 언어 모델에 대한 RNN을 구현하고 이러한 모델을 평가하기 위해 perplexity를 사용합니다.
- 은닉 상태에 대해 반복 계산을 사용하는 신경망을 순환 신경망 (RNN) 이라고 합니다.
- RNN의 숨겨진 상태는 현재 시간 스텝까지 시퀀스의 히스토리 정보를 캡처할 수 있습니다.
- 시간 단계 수가 증가해도 RNN 모델 모수의 수는 증가하지 않습니다.
- RNN을 사용하여 문자 수준 언어 모델을 만들 수 있습니다.
- 당혹감을 사용하여 언어 모델의 품질을 평가할 수 있습니다.
- RNN을 사용하여 텍스트 시퀀스의 다음 문자를 예측하는 경우 출력에 필요한 차원은 무엇입니까?
- RNN이 텍스트 시퀀스의 모든 이전 토큰을 기반으로 특정 시간 단계에서 토큰의 조건부 확률을 표현할 수 있는 이유는 무엇입니까?
- 긴 시퀀스를 통해 역전파하면 그래디언트는 어떻게 됩니까?
- 이 섹션에서 설명하는 언어 모델과 관련된 몇 가지 문제점은 무엇입니까?
:begin_tab:mxnet
Discussions
:end_tab:
:begin_tab:pytorch
Discussions
:end_tab:
:begin_tab:tensorflow
Discussions
:end_tab: