An RNN built with matrices and trained with SGD (explained.ai)
Explaining RNNs without neural networks
This article explains how recurrent neural networks (RNN's) work without using the neural network metaphor. It uses a visually-focused data-transformation perspective to show how RNNs encode variable-length input vectors as fixed-length embeddings. Include
explained.ai
RNN에서는 가중치를 3개를 쓰는데,
1) 임베딩 과정에서 쓰는 것 - word2vec에서 자세히 설명
2) Wx - Input x를 단순히 선형변환
3) Wh - 이걸 왜 쓰는지 몰랐는데, 이를 설명한 것이 위의 사이트
예시에서는 h의 각 위치마다 2의 n승을 곱함으로써 position을 보존할 수 있다고 했다. 그러나 이는 사실 말도 안 되는 방식이다. 문장 내지 알파벳이 많아지면 그걸 어떻게 감당할 것인가?
따라서, 이렇게 단일 스칼라로 곱하는 것으로는 적절한 인코딩이 불가하고, 따라서 h벡터에 W가중치행렬을 곱함으로써 해결한다고 한다.
Again, multiplying by 2 is nonsense, but the bigger issue is that multiplying by any single scalar is unlikely create a word encoding meaningful enough to distinguish these words properly.
To make a more sophisticated model, we need to multiply the h vector by a matrix W (@ is the matrix multiply operator), which represents many more model parameters than a lonely scalar value.
LSTM 코드
# 총 4개의 게이트의 각 Wx, Wh, b 파라미터를 결합해 아핀변환으로 한 번에 계산
class LSTM:
"""
Wx : 4개의 게이트에서 각각 입력벡터 Xt에 곱해지는 파라미터 Wx 4개
Wh : 4개의 게이트에서 각각 이전 은닉상태벡터 h_t-1에 곱해지는 파라미터 Wh 4개
b: 4개의 게이트에서 각각 더해지는 bias 패러미터 4개
"""
def __init__(self, Wx, Wh, b) :
self.params = [Wx, Wh, b]
self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)]
self.cache = None
def forward(self, x, h_prev, c_prev):
Wx, Wh, b = self.params
N, H = h_prev.shape # 은닉상태 벡터의 차원수 (Batch_size, 노드 수), 즉 N=배치수 / H=벡터차원 수
# 총 4개의 게이트에서의 아핀변환을 한 번에 계산
A = np.matmul(x, Wx) + np.matmul(h_prev, Wh) + b
# slicing해서 각 게이트에 보내기, :의 앞은 배치이므로 신경 크게 안 써도 됨.
f = A[:, :H]
g = A[:, H:H*2]
i = A[:, 2*H:3*H]
o = A[:, 3*H:]
f = sigmoid(f)
g = np.tanh(g)
i = sigmoid(i)
o = sigmoid(o)
c_next = f * c_prev + g * i
h_next = np.tanh(c_next) * o
self.cache = (x, h_prev, c_prev, f, g, i, o, c_next) # 역전파시 사용할 데이터의 캐싱
# 앞셀에서 dh와 dc가 내려왔을 때, 이를 어떻게 역전파로 weight를 수정하는가?
def backward(self, dh_next, dc_next) :
Wx, Wb, b = self.params
x, h_prev, c_prev, f, g, i, o, c_next = self.cache
# ================
# 역전파 게이트 수행
# ================
tanh_c_next = np.tanh(c_next)
ds = dh_next * o * (1- tanh_c_next **2) + dc_next
dc_prev = ds * f # 이전 기억셀의 기울기. tanh 미분은 (1-tanh)(1+tanh)
# output 게이트
do = dh_next * tanh_c_next
do *= o * (1-o)
# input 게이트
di = ds * g
di *= i * (1-i)
# 새로운 기억셀(main 게이트)
dg = ds * i
dg *= (1- g**2)
# forget 게이트
df = ds * c_prev
df *= f * (1-f)
# 4개 게이트의 기울기를 가로로 결합(horizontal stack)
dA = np.hstack((df, dg, di, do))
# ================================
# 아핀변환(행렬곱)에 대한 역전파 수행
# ================================
# 파라미터 기울기 계산
dWx = np.matmul(x.T, dA)
dWh = np.matmul(h_prev.T, dA)
db = dA.sum(axis = 0)
self.grads[0][...] = dWx
self.grads[1][...] = dWh
self.grads[2][...] = db
# 입력, 은닉상태 벡터 기울기 계산
dx = np.matmul(dA, Wx.T)
dh_prev = np.matmul(dA, Wh.T)
return dx, dh_prev, dc_prev
LSTM의 게이트들이 어떤 식으로 각자 역할을 맡는지
https://ai.stackexchange.com/questions/17216/how-does-the-forget-layer-of-an-lstm-work
How does the forget layer of an LSTM work?
Can someone explain the mathematical intuition behind the forget layer of an LSTM? So as far as I understand it, the cell state is essentially long term memory embedding (correct me if I'm wrong)...
ai.stackexchange.com
LSTM(Long Short-Term Memory) 네트워크에서 셀 상태와 숨겨진 상태는 별개의 목적을 수행하는 두 가지 다른 구성 요소이다.
셀 상태는 LSTM의 "메모리"이며 장기적인 정보를 저장하는 역할을 한다. 입력, 이전의 셀 상태 및 정보의 흐름을 제어하는 다양한 게이트를 기반으로 셀 상태에서 선택적으로 정보를 추가 또는 제거하는 일련의 작업을 통해 업데이트된다. 셀 상태는 LSTM이 초기의 정보를 순차적으로 기억하고 이후의 예측을 알려주는 데 사용할 수 있는 주요 방법이다.
반면, 숨겨진 상태는 현재 입력과 이전의 숨겨진 상태의 함수이다. 현재 입력과 LSTM의 내부 상태를 기반으로 예측하거나 출력을 생성하는 데 사용됩니다. 숨겨진 상태는 각 시간 단계에서 업데이트되며, LSTM의 출력은 종종 마지막 시간 단계의 숨겨진 상태를 기반으로 한다.
요약하자면, LSTM에서 셀 상태와 숨겨진 상태의 주요 차이점은 셀 상태가 장기적인 정보를 저장하는 역할을 하는 반면, 숨겨진 상태는 현재 입력과 LSTM의 내부 상태를 기반으로 예측하거나 출력을 생성하는 데 사용된다는 것이다.
Hello, Nice to meet you.
[0 1 2 3 4]
위와 같은 문장이 있다 하자. 임베딩을 8size로 한다 하면, Win은 [5X8]사이즈 가중치임.
맨 처음엔 Hello가 들어감. 그러면 이 idx에 해당하는 1x8 벡터가 xt로써 들어감.
맨 처음이므로 Hidden state, cell state는 0임.
Forget Gate는 곱하기다. 해당 xt가 잘 Hello를 대변한다면, h_{t-1}과 곱해진 값은 Affine변환 + Softmax시에 Nice가 나오게 하는 값을 갖고 있을 것이다. 따라서 xt에 Sigmoid를 취하면 Nice에 대한 정보는 1이 될 것이고, 나머지 단어에 대한 정보는 0이 될 것이다. 이를 cell state에 곱함으로써, 0에 가까운 단어들은 사라지고, 1에 가까운 단어는 살아남게 된다.
다음으로 Get Gate다. 이는 tanh를 한 다음에 +를 취하는데, 이것은 RNN에서 했던 것과 같다. xt의 정보를 그냥 cell state에 더하는 것임. 이를 통해 해당 xt가 잘 Hello를 대변한다면, Affine변환 + Softmax시에 Nice가 나오게 하는 값을 갖고 있을 것이고, 그 값을 더해주게 됨. 위의 Forget에서는 잊는 것만 했기 때문에, 아직 Nice가 나와야 한다는 정보(내지 값)는 증가과정이 없었다. 이를 더해줌으로써 더 크게 하는 것.
다음으로 Input gate다. 위의 Get Gate는 하이퍼볼릭 탄젠트이기에, [-1, 1]의 값을 지니고 있다. RNN에서 했던 그대로이기에, 각 G에서 얻은 값들에 원소값을 통해 어떠한 값이 더 중요한지 보고자 하는 것이다. 따라서 Sigmoid를 쓰며, 이를 통해 얻은 [0, 1]의 값들을 각각 곱한다. 이를 통해, xt 내의 Nice에 대한 값은 유지될 것이고, 나머지 맥락에 맞지 않는 값들은 작아질 것이다.
>> 위의 세 과정이 누적되면서, 정말 다양한 요소들이 0과 곱해지거나 때로는 1과 곱해지면서 각각의 분포도를 학습하게 됨.
마지막으로 Output 게이트이다. 위의 과정을 통해 얻은 ct는 잊을 건 잊고, 추가할 건 추가한 놈이다. 위의 글에서 보듯, cell state는 장기적으로 초기의 정보를 순차적으로 기억하고 이후의 예측을 알려주는 변수이다. 여기에 tanh와 sigmoid를 취한다. ht는 Nice에 대한 정보여야 하며, 기존 RNN 방식에서는 오직 h_{t-1}과 xt만을 이용해 만들어졌다. 즉, 오직 현재 입력과 이전의 h만을 이용해 만듦. 근데 LSTM에서는 여기에 c_{t-1}이 관여하게 됨.
c_{t-1}을 tanh로 정규화 && h_{t-1}과 xt를 버무려 Nice에 대한 정보를 얻음. 그렇다면, 여기에 sigmoid를 취하여 c_{t-1}에 곱하면, 정말 많은 값이 버무려진 c 중에서 특히 Nice에 대한 정보가 더욱 부각되게 된다. 이것이 곧 ht가 되는 것.
GRU는 c가 없어졌다. 대신 바뀐 것이 있다.
r(Reset) - 과거의 h를 얼마나 무시할 것인가? >> r이 0이라면, 새 h는 오직 입력 xt로만 구성됨(위에서 3번째 식)
z(Update) - h를 갱신. 즉, forget과 input 두 가지를 동시에 담당(4번째 식). >> gate의 기능은 (1-z) x h_{t-1}, input의 기능은 z * newh
위의 예를 다시 들어보자. Hello가 xt로 들어왔다.
1) r : 그러면 여기에 sigmoid를 취하면, 잘 학습된 상태에서라면 Nice를 나오게 할 것이다. 따라서, sigmoid를 취해 곱함으로써 Nice쪽엔 1에 가까운 값을, 먼 쪽엔 0에 가까운 값을 곱한다. h_{t-1}에 reset gate output이 곱해짐으로써, Nice쪽엔 1에 가까운 값을, 먼 쪽엔 0에 가까운 값을 지닌 벡터가 생성됨.
2) z : 이 sigmoid를 취한 값을 1에서 빼면, 먼 쪽은 1과 가까운 값이, Nice 쪽은 0과 가까운 값이 된다.
GRU에서는 h_{t-1}이 LSTM의 c의 역할을 해야 한다. 즉, 균형을 유지해야 한다. h는 전체적인 맥락, 문맥의 값을 가지고 있어야 하는데, LSTM으로 치면 input의 과정에서 Nice가 너무 크다면, 다음 노드, 그 다음 노드에서도 Nice가 큰 비중을 가지고 있을 것이다. 따라서 이를 제어하기 위해, 상관이 없는 값은 1, 다음이 되어야 하는 값은 0에 가깝게 하여 곱함으로써 전체적인 비중을 고르게 한다.
3) newh : 한편, 1에서 구한 값에 xt를 더하고 tanh를 취하면, 평범하게 xt(여기선 hello)가 들어가면 Nice가 나오는 RNN/LSTM의 가중치 내지는 함수가 만들어짐. 그럼 여기에 z를 곱하면, 이를 [0, 1]의 값으로 바꾸는 동시에 Nice를 1에 가깝게 바꿔주는 효과가 생성됨. 즉, 기존의 성능을 어느 정도 유지하면서 [0, 1]로 바꿔주는 셈. 그냥 tanh 후 sigmoid를 취하는게 아니라, z를 곱하는 이유는 (소수 * 소수 = 더 작은 소수)인 만큼, 말그대로 값이 극단적으로 가지는 않으면서 동시에 성능을 유지하게 하기 위함이 아닐까 조심스레 추측한다.
4) 마지막: 이 3의 값을 h_{t-1}에 더한다. 이를 통해, 2에서의 '모든 단어들 간의 균형 유지' + 3에서 '극단적으로 Nice에 크지는 않으면서 적당하게 Nice가 나올 만한 값'을 진행함으로써 ht = Nice가 나오도록 하는 것이 GRU의 목적.... 이 아닐까 생각함.
이를 토대로 RAFT의 GRU 구조를 파악할 수 있을 것이다.
GRU(Gated Recurrent Unit) 네트워크에서 재설정 게이트는 현재 시간 단계에서 이전의 숨겨진 상태 중 어느 정도를 잊어야 하는지 제어하는 구성 요소입니다. 리셋 게이트는 현재 입력과 이전의 은닉 상태를 입력으로 받아 0과 1 사이의 게이트 벡터를 출력하는 시그모이드 활성화 함수이다.
재설정 게이트는 현재 시간 단계에서 이전 숨겨진 상태의 어떤 부분을 무시해야 하는지 결정합니다. 재설정 게이트 출력이 0에 가까우면 GRU가 이전의 숨겨진 상태를 대부분 무시하고 현재 입력에 더 의존하여 숨겨진 상태를 업데이트해야 함을 의미합니다. 반대로, 재설정 게이트 출력이 1에 가까우면 GRU가 이전의 숨겨진 상태를 대부분 유지하고 숨겨진 상태를 업데이트하기 위해 전류 입력에 덜 의존해야 함을 의미합니다.
재설정 게이트 출력이 결정되면 GRU는 현재 입력 및 재설정 게이트 출력을 기반으로 후보 숨겨진 상태를 계산합니다. 이 후보 숨김 상태는 현재 입력과 이전 숨김 상태의 수정 버전의 선형 조합이며, 여기서 수정은 재설정 게이트 출력에 의해 결정됩니다. 그런 다음 후보 숨겨진 상태는 출력을 -1과 1 사이로 압축하는 쌍곡선 탄젠트 활성화 함수를 통해 현재 시간 단계에 대한 실제 숨겨진 상태를 생성합니다.
재설정 게이트를 통해 GRU는 현재 입력을 기반으로 이전 숨겨진 상태의 정보를 선택적으로 잊거나 유지할 수 있으며, 이를 통해 단순한 RNN보다 더 효과적으로 장기적인 의존성을 처리할 수 있다. 재설정 게이트는 LSTM의 망각 게이트와 기능이 유사하지만 계산이 더 간단하며 재설정 게이트를 통해 GRU가 숨겨진 상태를 더 빠르게 업데이트할 수 있다.
GRU에서 update 시 '1-' 연산이 있는 이유
GRU(Gated Recurrent Unit) 네트워크에서 업데이트 게이트는 일반적으로 0과 1 사이의 값을 출력하는 시그모이드 활성화 함수를 사용하여 구현된다. 업데이트 게이트가 이전 숨겨진 상태와 후보 숨겨진 상태의 기여도를 균형 있게 유지하도록 하기 위해 업데이트 게이트 출력을 1에서 뺍니다. 이는 업데이트 게이트 출력이 0에 가까우면 새로운 숨겨진 상태에 대한 이전의 숨겨진 상태의 기여도가 보존되고, 업데이트 게이트 출력이 1에 가까우면 후보 숨겨진 상태의 새로운 상태에 대한 기여도가 보존되도록 한다.
수학적으로, 업데이트 게이트 출력은 z로 표시되고, 새로운 후보 숨겨진 상태는 h_hat로 표시된다. 업데이트 게이트 출력은 1에서 (1 - z)로 차감되며, 이는 이전 숨겨진 상태와 후보 숨겨진 상태 간의 균형을 나타냅니다. 현재 시간 단계에 대한 최종 숨겨진 상태는 h = z * h_prev + (1 - z) * h_hat로 계산됩니다. 여기서 h_prev는 이전의 숨겨진 상태입니다.
GRU는 업데이트 게이트 출력을 1에서 빼면서 z의 특정 값에 관계없이 이전 숨겨진 상태와 후보 숨겨진 상태의 기여도가 적절하게 균형을 이루도록 보장합니다. 이는 GRU가 이전의 숨겨진 상태와 현재 입력의 정보를 선택적으로 잊거나 유지하는 데 도움이 되며, 이를 통해 단순한 RNN보다 더 효과적으로 장기 의존성을 처리할 수 있다.
GRU에서의 학습방법(또는 역전파)
What is the output and loss function of GRU and how does the weights changed during backropagation?
>> GRU(Gated Recurrent Unit) 신경망의 출력 및 손실 기능은 네트워크가 수행하도록 설계된 특정 작업에 따라 달라집니다. 다음은 몇 가지 예입니다:
시퀀스 분류 작업에서 마지막 단계의 GRU 출력은 종종 밀도가 높은 레이어를 통해 공급되며 클래스에 대한 확률 분포를 얻기 위해 소프트맥스 활성화 함수가 뒤따릅니다. 손실 함수는 일반적으로 예측 확률과 실제 레이블 사이의 교차 엔트로피 손실입니다.
시퀀스 투 시퀀스 변환 작업에서 각 시간 단계의 GRU 출력은 종종 출력 시퀀스를 생성하는 데 사용됩니다. 손실 함수는 일반적으로 예측 시퀀스와 실제 시퀀스 사이의 교차 엔트로피 손실입니다.
시계열 예측 작업에서 각 시간 단계의 GRU 출력을 사용하여 시퀀스의 다음 값을 예측할 수 있습니다. 손실 함수는 예측 값과 참 값 사이의 평균 제곱 오차와 같은 회귀 손실일 수 있습니다.
GRU 네트워크에서 역 전파하는 동안, 가중치와 편향은 네트워크의 각 가중치와 편향에 대한 손실 함수의 기울기를 기반으로 업데이트됩니다. 각 가중치와 바이어스에 대한 손실 기울기는 체인 규칙을 사용하여 계산되며, 손실 함수를 최소화하기 위해 가중치는 기울기의 반대 방향으로 업데이트됩니다.
구체적으로, 각 단계의 가중치 행렬 W에 대한 업데이트는 다음과 같습니다:
W_{t+1} = W_t - learning_rate * dW_t
여기서 learning_rate는 최적화 알고리즘의 학습 속도이고, dW_t는 시간 단계 t에서 W에 대한 손실 함수의 기울기입니다. 편견은 비슷한 방식으로 업데이트됩니다.
그레이디언트는 반복 신경망에 대한 역 전파의 확장인 역 전파 통과 시간(BPT)을 사용하여 계산됩니다. BPT는 시간 내에 반복 네트워크를 펼쳐 일련의 피드포워드 네트워크를 만듭니다. 그런 다음 그라데이션은 시퀀스의 각 시간 단계에 대해 계산되고 가중치는 이러한 그라데이션을 사용하여 업데이트됩니다.
Forward and Backpropagation in GRUs — Derived | Deep Learning | by Mihir | Medium
Forward and Backpropagation in GRUs — Derived | Deep Learning
An explanation of Gated Recurrent Units (GRUs) with the math behind how the loss backpropagates through time.
medium.com
위는 GRU에서의 역전파 등등...
What is the output, ground-truth and loss function of GRU in NLP and how does the weights changed during backropagation?
>> 자연어 처리(NLP)에서 GRU(Gated Recurrent Unit) 신경망은 언어 모델링, 감정 분석, 기계 번역 및 명명된 엔티티 인식과 같은 다양한 작업에 사용될 수 있다. NLP에서 GRU의 출력, 실측값 및 손실 함수는 네트워크가 수행하도록 설계된 특정 작업에 따라 달라집니다. 다음은 몇 가지 예입니다:
언어 모델링에서 GRU에 대한 입력은 단어의 시퀀스이고 출력은 시퀀스의 다음 단어에 대한 확률 분포이다. 각 단계의 실측 정보는 순서의 다음 단어입니다. 손실 함수는 일반적으로 각 시간 단계에서 예측된 확률과 실제 다음 단어 사이의 교차 엔트로피 손실이다.
감정 분석에서 GRU에 대한 입력은 문장이고 출력은 감정 점수 또는 레이블입니다. 사실은 문장의 진정한 감정 점수 또는 라벨이다. 손실 함수는 이진 분류 작업의 경우 이진 교차 엔트로피 손실이 될 수 있고, 다중 클래스 분류 작업의 경우 범주 교차 엔트로피 손실이 될 수 있다.
기계 번역에서 GRU에 대한 입력은 소스 언어의 단어 시퀀스이고 출력은 대상 언어의 단어 시퀀스이다. 각 단계에서의 지상 실측은 대상 언어의 진정한 다음 단어이다. 손실 함수는 일반적으로 각 시간 단계에서 예측된 확률과 실제 다음 단어 사이의 교차 엔트로피 손실이다.
NLP 작업을 위한 GRU 네트워크의 역전파 동안, 가중치와 편향은 네트워크의 각 가중치와 편향에 대한 손실 함수의 기울기를 기반으로 업데이트된다. 그레이디언트는 앞서 언급한 바와 같이 시간을 통한 역전파(BPT)를 사용하여 계산된다. 그런 다음 가중치는 확률적 경사 하강법(SGD), Adam 또는 Adagrad와 같은 최적화 알고리듬을 사용하여 업데이트된다.
각 단계에서 가중치 행렬 W와 바이어스 벡터 b의 업데이트는 다음과 같다:
W_{t+1} = W_t - 학습 속도 * dW_t
b_{t+1} = b_t - learning_rate * db_t
여기서 learning_rate는 최적화 알고리즘의 학습 속도이고, dW_t와 db_t는 각각 W와 b에 대한 손실 함수의 기울기이다. 그레이디언트는 체인 규칙과 역전파 알고리즘을 사용하여 계산된다.
RNN 코드
DLFromScratch2/notebook.ipynb at master · ExcelsiorCJH/DLFromScratch2 (github.com)
GitHub - ExcelsiorCJH/DLFromScratch2: 『밑바닥부터 시작하는 딥러닝 ❷』
『밑바닥부터 시작하는 딥러닝 ❷』 . Contribute to ExcelsiorCJH/DLFromScratch2 development by creating an account on GitHub.
github.com
GRU 순전파/역전파
Forward and Backpropagation in GRUs — Derived | Deep Learning | by Mihir | Medium
Forward and Backpropagation in GRUs — Derived | Deep Learning
An explanation of Gated Recurrent Units (GRUs) with the math behind how the loss backpropagates through time.
medium.com
RAFT의 3가지 Input의 Concat의 이유
RAFT(Recurrent All-Pairs Field Transforms)에서 저자는 이전 흐름 맵, 상관 맵 및 컨텍스트 맵의 세 가지 유형의 피쳐 맵을 연결합니다.
1. **이전 흐름도**: 이전 단계의 광학 흐름을 나타냅니다. 광학 흐름은 기본적으로 점이 한 이미지 프레임에서 다음 이미지 프레임으로 이동하는 방식을 측정합니다. 이전 흐름 맵을 사용하면 이전 단계에서 상황이 어떻게 진행되었는지에 대한 정보를 사용할 수 있으므로 다음 예측을 위한 좋은 시작점을 제공합니다.
2. **상관도**: 두 입력 이미지의 유사한 부분을 측정한 것입니다. 두 점의 상관 관계가 높으면 서로 다른 두 영상에서 동일한 점일 수 있습니다. 이를 통해 모델은 이미지의 어떤 부분이 일치하는지 파악할 수 있습니다.
3. **컨텍스트 맵**: 이는 모델이 장면의 전체적인 컨텍스트를 이해하는 데 도움이 되는 보다 전역적이고 높은 수준의 이미지 표현입니다. 여기에는 씬(scene)의 전체 이동 방향 또는 개체의 일반 레이아웃과 같은 정보가 포함될 수 있습니다.
이 세 가지 특징 맵을 연결함으로써 모델은 예측할 때 로컬 정보(상관 맵에서), 시간 정보(이전 흐름 맵에서) 및 더 많은 글로벌 정보(컨텍스트 맵에서)를 동시에 고려할 수 있습니다.
여러분이 비디오의 다음 프레임에서 새떼가 어떻게 움직일 것인지 예측하려고 한다고 상상해 보세요. 앞의 흐름도는 마지막 프레임에서 새들이 어떻게 움직였는지 보는 것과 같고, 상관관계 지도는 두 프레임에서 어느 새가 어떤 새인지 보는 것과 같고, 맥락 지도는 양떼의 전체적인 형성을 이해하는 것과 같습니다. 이 모든 정보를 함께 고려함으로써, 여러분은 새들이 다음 프레임에서 어떻게 움직일 것인지를 정확하게 예측할 수 있는 훨씬 더 좋은 기회를 갖게 될 것입니다. 이것이 기본적으로 RAFT가 이러한 연결된 피쳐 맵으로 수행하는 작업입니다.
ConvLSTM와 ConvGRU가 Concatenation을 통해 갖게 되는 역할
ConvLSTM과 ConvGRU는 모두 컨볼루션 연산을 가진 반복 신경망(RNN) 유형으로, 수신되는 입력의 상태를 관리하는 방법을 배웁니다. 이러한 모델의 반복 계층 상태는 새로운 입력이 수신될 때마다 업데이트되며, 이러한 업데이트는 당면한 작업에 "중요한" 정보의 우선순위를 지정하는 방식으로 수행됩니다. 이 우선순위 설정은 교육 과정에서 학습된 가중치를 통해 수행됩니다.
세 가지 피쳐 맵(이전 흐름, 상관 관계 및 컨텍스트)이 연결되어 RAFT의 GRU에 대한 입력으로 사용되는 경우, 각 유형의 정보는 시나리오에 따라 다르게 제공됩니다. 예를 들어, 움직임이 많은 장면에서는 이전 흐름 맵이 특히 유용할 수 있습니다. 다양한 개체가 있는 복잡한 장면에서는 컨텍스트 맵이 더 중요할 수 있습니다.
RAFT의 GRU는 최종 예측에 대한 중요성을 바탕으로 이러한 다양한 유형의 정보를 가중치로 평가하는 방법을 배웁니다. 새입력을 받을 때마다 내부 상태(일종의 "메모리")를 업데이트하여 이 작업을 수행합니다. 이 상태는 GRU가 각 입력에 적용하는 가중치를 조정하여 중요한 기능의 영향을 증가시키고 덜 중요한 기능의 영향을 줄이는 데 사용됩니다. 따라서 GRU의 출력은 광학 흐름을 예측하는 데 더 적합한 입력의 수정된 버전이 될 것입니다.
GRU가 입력에 적용하는 특정 변환은 훈련 중에 학습한 가중치에 따라 달라집니다. 이러한 가중치는 손실 함수에 의해 결정되는 모델의 예측과 실제 광학 흐름 간의 차이를 최소화하도록 최적화됩니다. 따라서 GRU는 광학 흐름을 가장 예측할 수 있는 입력의 특징을 강조하고 예측할 수 없는 특징을 경시하는 방법을 효과적으로 배우고 있습니다.