StoneSeller 2022. 10. 7. 12:11

[Day01] 피어세션

  • Regression Task와 Classification Task의 loss function이 다른 이유는 무엇인가요?

Regression Task연속적인  값을 예측

Classification Task는 미리 정의된, 가능성 있는 여러 클래스 레이블 중 하나를 예측

 

Regression Task는 loss function으로 MSE, RMSE, MAE을 사용하고

Classification Task는 Cross Entropy를 사용한다.(이진 분류에는 Binary Cross-entorpy, 멀티클래스 분류에는 Categorical cross-entropy)

 

 

 

Cross Entropy를 Classification Task의 loss function으로 사용하는 이유

 

layer들로 부터 출력된 logit값은 softmax를 거쳐서 확률로 바뀌게 된다.확률 출력값과 정답라벨(y)과의 Cross Entropy값을 최소로 하는 방향으로 학습을 하게 된다.

 

 

정보 이론 관점에서 본다면 Cross Entropy는 왼쪽 정답 라벨(원핫벡터 형태: [0, 0, 1])분포와 출력 probabiltiy값 $\hat(y)$

분포가 비슷할 수록 작은 값을 갖기 때문에, Cross Entropy값을 최소화하는 방향으로 학습하게 된다.

 

Cross Entropy의 식을 보면 정답인 클래스(t=1)인 경우에는 예측값이 1에 가까워질수록 loss값이 줄어들고

정답이 아닌 클래스(t=0)인 경우에는 예측값이 0에 가까워질수록 loss값이 줄어듬을 확인할 수 있다.

 

https://life-is-also-pizza.tistory.com/274?category=953226

 

 


 

 

[Day02] 피어세션

  • Gradient Descent Method중에 RAdam은 어떤 것인지?

Adam은 adaptive learning rate을 기반으로 한다.

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를 맞춰주어야해서?

이건 결과론적인 것 같다.

class ScaledDotProductAttention(nn.Module):
    def forward(self,Q,K,V,mask=None):
        d_K = K.size()[-1] # key dimension
        # Q: [n_batch, n_Q, d_Q]  
        # K: [n_batch, n_K, d_K(==d_Q)] 
        # V: [n_batch, n_V(==n_K), d_V]
        scores = Q.matmul(K.transpose(-2,-1)) / np.sqrt(d_K) # [n_batch, n_Q, n_K]

        if mask is not None:
            scores = scores.masked_fill(mask==0, -1e9)
        
        attention = F.softmax(scores,dim=-1) # [n_batch, n_Q, n_K]

        out = attention.matmul(V) # [n_batch, n_Q, d_V] 
        return out,attention

 

 

[Day04] 멘토링

  • 모델을 학습해볼 때 다른 optimizer를 사용해본다던가 batch-size를 바꾼다던가 모델을 바꾸는 등 여러가지 시도를 할 때, 보통 일반적으로 변경해보는 순서가 있을까요?

데이터 가공 ⇒ 모델 구조 ⇒ Loss 함수(Focal loss) ⇒ batch-size나 lr, 각종 하이퍼파라미터

데이터 가공과 모델 구조가 가장 큰 영향을 끼친다.

Focal loss는 imbalanced 한 문제가 있을 때 사용하면 좋다.

 

 

 

 

 

 

728x90