2017-12-18 26 views
1

방금 ​​RNN과 LSTM을 연구하기 시작했습니다. 내가 훑어 본 모든 자원에 대해 하나의 질문에 답을 얻지 못했습니다 :반복 NN : 매개 변수 공유의 요점은 무엇입니까? 어쨌든 패딩을하지 않습니까?

다음은 RNN에서 매개 변수 공유의 요점을 이해하는 방법입니다. 내 질문은 다음과 같습니다.

  1. 아래에 요약 된대로 RNN을 이해하고 있습니까?
  2. Keras의 실제 코드 예제에서 LSTM을 살펴 보았지만, 문장은 모두 길이가 같도록 문장을 채 웁니다. 그렇게함으로써 RNN에서 매개 변수 공유의 전체 목적을 씻어 내리지 못합니까?

일반적인 피드 포워드 신경망에서는 모든 입력 단위에 개별 매개 변수가 할당됩니다. 즉 입력 단위 (피쳐)의 수가 배울 매개 변수의 수와 일치 함을 의미합니다. 예를 들면. 이미지 데이터의 경우 입력 단위의 수는 모든 학습 예제에서 동일합니다 (대개 일정한 픽셀 크기 * 픽셀 크기 * rgb 프레임).

그러나 문장과 같은 순차 입력 데이터는 매우 다양한 길이가 될 수 있습니다. 즉, 문장의 예제에 따라 매개 변수의 수가 동일하지 않습니다. 이것이 연속 된 데이터를 효율적으로 처리하기 위해 매개 변수 공유가 필요한 이유입니다. 한 상태에서 다른 상태로의 전환이라는 측면에서 지정되었으므로 모델이 시퀀스 길이에 관계없이 항상 동일한 입력 크기를 갖도록합니다. 따라서 매 시간 단계마다 동일한 가중치 (숨겨진 가중치에 입력, 출력 가중치에 숨김, 숨겨진 가중치에 숨김)를 사용하여 동일한 전이 함수를 사용할 수 있습니다. 큰 장점은 트레이닝 세트에 나타나지 않은 시퀀스 길이를 일반화 할 수 있다는 것입니다.

고마워요.

+0

https://stats.stackexchange.com/q/221513/130598 – Maxim

+0

감사합니다. 좋은 힌트! –

답변

0

매개 변수

공유 길이를 변화하는 매개 변수 공유의 유일한 장점이 아닙니다의 효율적 시퀀스를 처리 할 수 ​​있다는. 당신이 말했듯이, 당신은 패딩으로 그것을 달성 할 수 있습니다. 매개 변수 공유의 주요 목적은 모델이 배워야하는 매개 변수를 줄이는 것입니다. 이것은 RNN을 사용하는 전체 목적입니다.

각 시간 단계마다 다른 네트워크를 배우고 첫 번째 모델의 출력을 두 번째 모델에 공급하는 경우 일반 피드 - 포워드 네트워크로 끝납니다. 20 단계의 시간 단계를 위해서는 20 가지 모델을 배워야합니다. Convolutional Nets에서 매개 변수는 컨볼 루션 필터에 의해 공유됩니다. 그림의 서로 다른 영역 (예 : 단순한 가장자리)에 비슷한 흥미로운 패턴이 있다고 가정 할 수 있기 때문입니다. 이것은 우리가 배워야하는 매개 변수의 수를 크게 줄입니다. 유사하게, 시퀀스 학습에서 우리는 서로 다른 시간 단계에서 유사한 패턴이 있다고 종종 가정 할 수 있습니다. 'Yesterday I ate an apple''I ate an apple yesterday'을 비교하십시오. 이 두 문장은 같은 의미이지만 'I ate an apple' 부분은 다른 시간 단계에서 발생합니다. 매개 변수를 공유하면 그 부분이 한 번 의미하는 바를 알면됩니다. 그렇지 않으면 모델에서 발생할 수있는 모든 시간 단계에 대해 학습해야합니다.

매개 변수를 공유하는 데는 단점이 있습니다. 우리 모델은 모든 타임 스텝에서 동일한 변환을 입력에 적용하기 때문에 이제는 모든 타임 스텝에 적합한 변환을 배워야합니다. 따라서 어떤 시간 단계에서 어떤 단어가 왔는지 기억해야합니다. 즉 'chocolate milk''milk chocolate'과 동일한 숨김 및 메모리 상태로 이어지지 않아야합니다. 그러나이 단점은 대형 피드 포워드 네트워크를 사용하는 것에 비해 작습니다.

패딩

시퀀스를 패딩에 관해서는

: 주요 목적이 모델은 다양한 길이의 시퀀스를 예측할 수 있도록 직접 없습니다. 당신이 말했듯이, 이것은 매개 변수 공유를 사용하여 수행 할 수 있습니다. 패딩은 효율적인 교육을 위해 사용됩니다. 특히 훈련 중 계산 그래프를 낮게 유지하는 것이 좋습니다. 패딩이 없으면 두 가지 교육 옵션이 있습니다.

  1. 각 교육 샘플의 모델을 언 롤합니다. 따라서 길이 7의 시퀀스가있을 때 모델을 7 개의 시간 단계로 풀고 시퀀스를 공급하고 7 개의 시간 단계를 통해 역 전파를 수행하고 매개 변수를 업데이트합니다. 이것은 이론 상으로는 직관적 인 것처럼 보입니다. 그러나 실제로 이것은 매우 비효율적입니다. TensorFlow를 사용할 때 TensorFlows 계산 그래프가 반복성을 허용하지 않기 때문에 각 훈련 단계에서 새로운 계산 그래프를 만들 것입니다.이 그래프는 피드 포워드입니다.
  2. 다른 옵션은 교육을 시작하기 전에 계산 그래프를 만드는 것입니다. 우리는 이들이 동일한 가중치를 공유하도록하고 훈련 데이터의 모든 시퀀스 길이에 대해 하나의 계산 그래프를 생성합니다. 그러나 우리의 데이터 세트가 30 개의 서로 다른 시퀀스 길이를 가질 때, 이것은 훈련 중 30 개의 다른 그래프를 의미하므로, 대형 모델의 경우 이것은 실현 가능하지 않습니다.

이 때문에 우리는 패딩이 필요합니다. 모든 시퀀스를 동일한 길이로 채운 다음 훈련을 시작하기 전에 하나의 계산 그래프 만 구성하면됩니다. 시퀀스 길이가 매우 짧고 매우 긴 경우 (예 : 5와 100) bucketing and padding을 사용할 수 있습니다. 즉, 시퀀스를 다른 버킷 길이로 채 웁니다 (예 : [5, 20, 50, 100]). 그런 다음 각 버킷에 대한 계산 그래프를 만듭니다. 이것의 장점은 길이가 5에서 100까지의 순서를 패딩 할 필요가 없다는 것입니다. 거기에 95 개의 패딩 토큰을 "학습"하는 데 많은 시간을 낭비하게됩니다.

+1

정말 고마워요! 이것은 정말 유용한 답변입니다! –