adaptive learning rate는 지금까지의 상재적인 업데이트 양에 따라 step size를 조정해주는 방식이다.
그러나 이런 Apaptive learning rate를 사용하는 optimizer들은 'Bad local Optima convergence problem'이 발생한다.
Bad local Optima convergence problem 학습 초기에 샘플이 부족(?)하여 adaptive learning rate의 분산이 매우 커지고 이에 따라 최적이 아닌 local optima에 도달하게 되어 학습이 일어나지 않는 현상
❓ 몇 번 epoch를 별로 안돌아서 학습 초기에 샘플이 부족하다고 하는 것인지?
위 그래프를 보면 10 iteration만에 gradients 분포가 $e^{-20}$과 같이 매우 작은 값으로 몰리는 왜곡 현상이 발생함을 알 수 있다.
즉, 어떠한 bad local optima에 수렴하게되어서 더 이상 학습이 일어나지 않는다고 해석할 수 있다.
이러한 문제점을 해결하기 위해 사용한 방법이 Warmup heuristic이다.
학습 초기에는 learning rate가 선형적으로 조금씩 증가하게 하여 초기에 bad local optima에 빠지지 않도록 하는 것이다.
그러나 이러한 방식은 warmup step을 따로 정해주어야 하기 때문에 하이퍼파라미터가 하나 더 생긴다는 단점이 존재한다.
그래서 등장한 방법이
RAdam (Rectified Adam) adaptive learning rate 계산에 사용되는 분산을 Rectify하여 분산이 발산하는 문제를 해결한다. 계산에 사용되는 분산 식을 이용해 분산이 발산하지 않게 만들 수 있는 $r_{t}$ (rectification term)을 구하고 이를 곱해주는 방법
RAdam은 learning rate를 증가시킬 step 수를 지정하지 않아도 되기 때문에 Adam보다 지정해주어야 할 하이퍼파라미터가 적다는 장점이 있다.
또한 Adam이나 SGD는 learning rate에 따라 metric이 민감한 반면에 RAdam은 robust함을 알 수 있다.
AdamW? AdamP? AdamWR?
[Day03] 피어세션
Query, Key, Value의 개수에 대해서 이해가 안가는 부분
Scaled Dot-Product Attention
n_batch,n_head,d_K,d_V = 3,5,128,256
n_Q,n_K,n_V = 30,50,50 # n_K and n_V should be the same
Q = torch.rand(n_batch,n_head,n_Q,d_K)
K = torch.rand(n_batch,n_head,n_K,d_K)
V = torch.rand(n_batch,n_head,n_V,d_V)
n_K == n_V 이지만 != n_Q 여도 된다.
디코더의 Attention 부분의 경우 K, V 벡터는 인코더에서부터 들어오는 정보로, Q 벡터는 디코더에 들어가는 입력들로부터 만들어진다.
그래서 n_Q는 n_K와 같을 필요는 없다.
→ K, V 벡터는 인코더에서 들어오는 같은 정보로 만들어진것이기 때문에 n_K == n_V 여야 하는 것인가? 그렇게 생각하면 될 것 같다.
아니면 sotfmax를 취한 scores값에 V를 행렬곱해주려면 shape를 맞춰주어야해서?