밑바닥부터 시작하는 딥러닝 2 - 8장

Jajuna_99·2022년 10월 1일
0

8장 어텐션

어텐션의 구조(p.335)

seq2seq의 문제점으로 Encoder의 출력이 '고정 길이 벡터'라는 점이 있다. -> 입력 문장이 아무리 짧던 길던 고정 길이로 변환되니 중요한 정보가 흩어지거나 소실될 수 있다.

  • Encoder 개선
    • 마지막 LSTM 계층의 Encoder 출력(단일 벡터)만 Decoder에 전달했던 방식을 입력 문장의 길이에 따라 바꿔준다.(복수 벡터) -> 시각별 LSTM(단어들)의 벡터를 모두 이용.
  • Decoder 개선 1

    • 위 Encoder 개선과 마찬가지로 Decoder의 모든 시각의 LSTM 계층이 Encoder 출력, 은닉 상태,를 받도록 개선한다.
    • 입력과 출력의 여러 단어 중 어떤 단어끼리 서로 관련되어 있는가? 라는 대응관계를 seq2seq에 학습시키는 기술이 어텐션이다. -> 단어들끼리의 대응관계를 얼라인먼트(alignment)라고 한다.
    • 원래 얼라인먼트는 수작업이었지만, 어텐션이 이를 자동화시켰다. -> 즉, '도착어 단어'와 대응 관계에 있는 '출발어 단어'의 정보를 골라내는 것, 다시 말해, 필요한 정보만 주목하여 시계열 변환을 수행하는 것이 이 기술이겠다.
    • 전체적인 구조는 (p.341)에 있다. LSTM 다음층에 LSTM 출력과 Encoder 출력을 같이 받는 Attention 계층이 추가될 것을 볼 수 있는 그림이다.
    • 예를 들어, Decoder가 'I'를 출력할 때 Encoder 출력에서 '나'에 대응하는 벡터를 선택하면 된다.
      • 근데 여기서 여러 대상에서 몇 개를 선택하는 작업은 미분을 할 수 없다. -> 학습이 되지 않는다.
      • 해결책으로 모든 단어를 선택해서 단어의 중요도를 나타내느 가중치(확률분포와 같이)를 별도로 계산해서, 이 가중치와 Encoder의 출력의 가중합(weighted sum)을 구하면, 원하는 벡터(선택된 벡터)를 얻는다.
      • 미니배치 처리용 가중합 구현 (p.345) -> 디코더 출력을 인코더 출력 형상에 맞춰 변환시키고, 원소별 곱을 계산한 다음 합을 구한다.(p.346에 그래프 노드 그림)
      • 주의할 점은 디코더 출력을 현상 변화할 때는 효율을 위해 넘파이 브로드캐스트를 사용하고, 역전파는, Repeat노드의 역전파를 수행한다.
  • Decoder 개선 2

    • 위에서 얘기한 단어의 중요도, 가중치 aa를 데이터로부터 자동으로 학습할 수 있도록 할 것이다.
    • 이 가중치를 구하는 목표는 'Encoder의 출력(이하 hshs)과 Decoder(이하 hh)의 출력 단어 벡터가 얼마나 비슷한가를 수치로 나타내는 것'이다. -> 이를 위해 벡터의 '내적'을 이용한다.(얼마나 같은 방향을 나타내는가를 알려주니까)
      벡터 aabb의 내적 계산 공식
      • a×b=a1b1+a2b2++anbna \times b = a_1b_1 + a_2b_2 + \cdots + a_nb_n
    • hshs의 모든 벡터를 hh와 내적을 구해 유사도를 산출하고 softmax로 정규화하면 되겠다. (p.350에 위 내용 구현)
  • Decoder 개선 3

    • decoder 개선 1절에서는 Weight Sum 계층, 2절에서는 Attention Weight 계층을 구현했었고 이번 절에서는 두 계층을 결합해본다. -> (p.354에 구현)
    • 드디어 '고양이'를 입력하면 어텐션으로(여러 단어들중에서 선택해서)'cat'이 나오는 모델을 구현한 것이다.
    • Weight Sum 계층과 Attention Weight 계층을 합친 계층을 책에서는 Attention 계층이라고 한다.
    • 시계열 방향으로 펼쳐진 다수의 Attention 계층을 (앞 장에서와 같이)합친 Time Attention 계층 또한 구현한다. (p.357)

어텐션을 갖춘 seq2seq 구현(p.358)

어텐션을 갖춘 seq2seq을 구현한다. 위에서 설명한 개선안을 바탕으로 AttentionEncoder, AttentionDecoder, AttentionSeq2seq 클래스 순으로 구현한다.

어텐션 평가(p.361)

날짜 데이터셋을 받아 날짜 형식을 일괄되게 바꾸는 문제로 효과를 확인해본다. (나중에 번역 문제도 직접 해봐야지!)

  • 작가님이 본인 리포지토리에 준비해둔 날짜 데이터(5만개)를 변환한다.
  • 어텐선seq2seq 학습 구현(p.363) -> 정확도와 어텐션 가중치를 시각화한 내용도 있다.

어텐션에 관한 남은 이야기(p.369)

양방향 RNN(LSTM) : 기존의 LSRM 계층에 더해 역방향으로 처리(연결, 합, 곱, 평균 등이 있을 수 있다.)하는 LSTM 계층을 추가한 모델 (p.371) -> 각 단어에 대응하는 은닉 상태 벡터에는 양쪽 방향으로부터의 정보를 집약할 수 있다.(균형 잡힌 정보)

Attention 계층 사용 방법 (p.372)

  • Attention 계층의 출력(맥락 벡터)이 다음 시각의 LSTM 계층에 입력되게 연결

seq2seq 심층화와 skip 연결 (p.374)

  • 현실에서 사용되는 문제들은 훨씬 복잡해서 더 높은 표현력이 요구되고, 이럴때 사용하는 방법이 층을 깊게 하는것이겠다. -> 이럴 때 자주 사용하는 기법이 skip 연결(skip connection)(혹은 잔차 연결(residual connection), 숏컷(short-cut)이라고도 한다.)

  • skip 연결은 단순히 계층을 건너뛰어 연결하는 기법이다.

어텐션 응용(p.376)

구글 신경망 기계 번역(GNMT)

  • 우리가 위에서 배운 내용을 조금 더 개선 시켜 만든 기계 번역 모델 -> 번역을 신경망 기반으로 한다는 것에 의미가 있겠다.

트랜스포머(transformer)

  • RNN의 단점인 시간 방향으로 병렬 계산하기가 (기본적으로) 불가능하다는 점에서 나온 모델이다.
  • RNN을 없애는 다양한 연구들이 시도되고 있다고 한다.
  • 이 트랜스포머 모델은 RNN이 아닌 어텐션을 이용한다. -> RNN을 대체하기 위해 self-attention을 사용
  • 책에서 3장 분량으로 간략하게 다루지만 현재 많이 연구되고 있는 주제이니 공부할 가치가 있다.

뉴럴 튜링 머신(NTM)

  • Encoder 가 필요한 정보를 (외부) 메모리에 쓰고, Decoder는 그 메모리로부터 필요한 정보를 읽어 들이는, 외부 메모리를 통한 확장을 기반으로 한 개념
  • RNN 외부에 정보 저장용 메모리 기능을 배치하고, 어텐션을 이용하여 필요한 정보를 읽거나 쓰는 방법 중 유명한 연구가 NTM이겠다. -> 후에 DNC로 개선된 논문도 실렸다.

요약

딥러닝 이론은 물론, 수학, 통계적으로도 인사이트가 깊어야 이해가 쉽겠지만, 어느 정도 괘도에 오르면, 응용의 싸움인 것 같다. 어떤 창의적인 방법으로 성능과 정확도를 높일 것인가.

그리고 당연한 얘기겠다만, 알면 알수록 공부할 것이 늘어나서 끝이 없어 보인다. 새로운 기법들이 계속 나온다는 얘기를 이 책을 읽으며 살짝이나마 체감한 듯 했다.

profile
Learning bunch, mostly computer and language

0개의 댓글