Deep Learning/from scratch II

[밑바닥부터 시작하는 딥러닝 2] - 8장 어텐션 III

해파리냉채무침 2024. 2. 23. 14:58

어텐션에 관한 남은 이야기

양방향 RNN

https://wegonnamakeit.tistory.com/25

양방향 LSTM은 역방향으로 처리하는 LSTM 계층도 추가한다. 각 시각에서는 이 두 LSTM 계층의 은닉 상태를 연결 시킨 벡터를 최종 은닉 상태로 처리한다(연결 외 합(sum), 평균(average) 내는 방법도 있다)

양방향으로 처리함으로써 각 단어에 대응하는 은닉상태 벡터에는 좌와 우 양쪽 방향으로부터의 정보를 집약하여 균형 잡힌 정보가 인코딩 되게 한다. 

입력문장을 왼쪽->오른쪽(순방향 LSTM) 과 오른쪽->왼쪽(역방향 LSTM) 각 출력을 연결되게 한다.

출처: https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/common/time_layers.py

class TimeBiLSTM:
    def __init__(self, Wx1, Wh1, b1,
                 Wx2, Wh2, b2, stateful=False):
        self.forward_lstm = TimeLSTM(Wx1, Wh1, b1, stateful) #순방향 lstm
        self.backward_lstm = TimeLSTM(Wx2, Wh2, b2, stateful) #역방향 lstm
        self.params = self.forward_lstm.params + self.backward_lstm.params
        self.grads = self.forward_lstm.grads + self.backward_lstm.grads

    def forward(self, xs):
        o1 = self.forward_lstm.forward(xs)
        o2 = self.backward_lstm.forward(xs[:, ::-1])
        o2 = o2[:, ::-1]#뒤집기

        out = np.concatenate((o1, o2), axis=2) #순방향 #역방향 연결
        return out

    def backward(self, dhs):
        H = dhs.shape[2] // 2
        do1 = dhs[:, :, :H]
        do2 = dhs[:, :, H:]

        dxs1 = self.forward_lstm.backward(do1)
        do2 = do2[:, ::-1] #그래디언트 뒤집어서 전달
        dxs2 = self.backward_lstm.backward(do2)
        dxs2 = dxs2[:, ::-1]
        dxs = dxs1 + dxs2
        return dxs

attention 계층 사용 방법

attention을 사용하는 계층이 무조건 LSTM 계층과 Affine 계층 사이에 있을 필요는 없다.

https://yerimoh.github.io/DL19/#%EC%96%B4%ED%85%90%EC%85%98%EC%97%90-%EA%B4%80%ED%95%9C-%EB%82%A8%EC%9D%80-%EC%9D%B4%EC%95%BC%EA%B8%B0

위의 그림에서는 attention 계층의 출력(맥락 벡터)가 다음시각의 LSTM 계층에 입력되도록 연결했다. 이렇게 하면 LSTM 계층이 맥락 벡터의 정보를 이용할 수 있다. 

seq2seq 심층화와 skip 연결

LSTM 계층을 3개씩 깊게 쌓았다. LSTM 계층의 은닉상태를 attention에 입력하고, attention 계층의 출력인 맥락 벡터를 decoder의 여러 계층(LSTM, Affine) 계층으로 전파한다.

계층을 깊게 할때는 일반화 성능을 떨어뜨리지 않는 것이 중요하다. 드롭아웃과 가중치 공유 같은 기술들을 활용한다. 

층을 깊게 할때 사용되는 기법 중 skip 연결이란 것이 있다. 잔차 연결 또는 숏컷이라고 한다.

 skip 연결은 계층을 넘어 '선을 연결' 하는 기법이다. skip 연결의 접속부에서는 2개의 출력이 더해진다(원소별 덧셈)

덧셈은 역전파시 기울기를 그대로 흘려보내므로 , skip 연결의 기울기가 아무런 영향을 받지 않고 모든 계층으로 흐른다

 

이후 attention is all you need 논문 리뷰를 통한 트랜스포머 모델에 관해 심층적으로 공부해볼 예정이다.