💡 트랜스포머 : 2017년 구글이 제안한 ‘sequence-to-sequence’ 모델.
1️⃣ 시퀀스 투 시퀀스는 무엇인가??
Ex) 기계번역 : 어떤 언어의 토큰 시퀀스를 다른 언어의 토큰 시스로 변환하는 과제.
한국어 토큰 시퀀스 : 길이 6개.
영어 토큰 시퀀스 : 길이 10개.
→ 두 소스와 타깃의 길이가 달라도 해당 과제를 수행하는데 문제가 없어야 한다!
2️⃣ 인코더와 디코더 (Incoder & Decoder)
꼭 임의의 시퀀스를 다른 속성의 시퀀스로 변환하는 작업에서 기계번역만 고집할 필요는 없다.
Ex) 필리핀 앞바다의 한 달 치 기온 데이터를 가지고 앞으로 1주일 간 하루 단위로 태풍이 발생할 지를 맞혀본다면??
‘기온 시퀀스’ → ‘태풍 발생 여부의 시퀀스’
1️⃣ 인코더 : 소스 시퀀스의 정보를 압축해 디코더로 보내는 역할. 인코더가 소스 시퀀스 정보를 압축하는 과정을 인코딩이라고 한다.
2️⃣ 디코더 : 인코더가 보내준 시퀀스 정보를 받아서 타깃 시퀀스를 생성. 디코더가 타깃 시퀀스를 생성하는 과정을 디코딩이라고 한다.
모델 학습과 인퍼런스
인코딩 : 어제, 카페, 갔었어, 거기, 사람, 많더라 등의 소스 시퀀스를 압축함.
디코딩 : 압축한 소스 정보를 인코더로부터 전달받고 디코더 입력 <s>을 고려해 다음 토큰(I)를 맞힌다.
#️⃣ 트랜스포머의 최종 출력값은?? (=> 디코더 출력, 다음 토큰 확률.)
→ 타깃 언어의 어휘 수만큼의 차원으로 구성된 ‘벡터’
→ 요소값이 모두 ‘확률’이다.
Ex) 타킷 언어의 어휘가 총 3만 개라고 가정.
디코더의 출력은 모두 3차원의 벡터. 이 벡터의 요소값 3만 개 각각은 확률이므로, 0 이상 1 이하의 값을 가지고, 모두 더하면 1이 된다.
→ 트랜스포머의 학습은 인코더와 디코더 입력이 주어졌을 때 정답에 해당하는 단어의 확률값을 높이는 방식을 수행한다.
3️⃣ 트랜스포머 블록
인코더에서 반복되는 요소를 떼어내 나타내보면??
→ 블록, 레이어 단위의 인코더
1️⃣ 멀티 헤드 어텐션
2️⃣ 피드포워드 뉴럴 네트워크
+) 잔차연결, 레이어 정규화.
디코더는??
1️⃣ 마스크 멀티 헤드 어텐션
2️⃣ 멀티 헤드 어텐션
3️⃣ 피드포워드 뉴럴 네트워크
+) 잔차연결, 레이어 정규화
셀프 어텐션(멀티 헤드 어텐션)
💡시퀀스 입력에 수행하는 기계학습 방법의 일종. 어텐션은 시퀀스 요소 가운데 중요한 요소에 집중하고 그렇지 않은 요소는 무시해 테스크 수행 성능을 끌어올린다!
어텐션
타깃 언어를 디코딩할 소스 언어의 단어 시퀀스 가운데 디코딩에 도움되는 단어 위주로 취사 선택해서 번역의 품질을 끌어올릴 수 있다. (즉 디코딩 시 소스 시퀀스 가운데 중요한 요소만 추리는 것!)
셀프어텐션
스스로에게 수행하는 어텐션 기법. 입력 시퀀스 가운데 태스크 수행에 의미 있는 요소들 위주로 정보를 추출한다.
→ cafe에 대응하는 소스 언어의 단어는 카페. 소스 시퀀스의 초반부에 등장한 상황. RNN을 사용하면 초반에 등장한 언어라 후반부로 갈수록 모델이 잊을 가능성이 있다!
그래서 등장한 것이 어텐션. 디코더 쪽 RNN에 어텐션을 추가하는 방식을 사용하면 ‘카페’가 소스 시퀀스 초반에 등장하거나 소스 시퀀스의 길이가 길어지더라도 번역의 품질이 떨어지는 것을 막을 수 있다.
☝ 셀프 어텐션의 특징 및 장점 (자기 자신에 수행하는 어텐션)
1. ‘거기’라는 단어가 어떤 의미를 가지는지 계산하는 상황.
잘 학습된 셀프 어텐션 모델이면 ***‘거기’***에 대응하는 장소는 ‘카페’임을 알 수 있다. +) ***‘갔었어’***와도 연관이 있다. → 트랜스포머의 인코더 블록 내부에서는 이처럼 ‘거기’라는 단어를 인코딩할 때 ‘카페’, ‘갔었어’라는 단어의 의미를 강조해서 반영한다. 2. ‘카페’라는 단어가 어떤 의미를 가지는지 계산하는 상황.
→ 동일하게 ‘카페’라는 단어를 인코딩할 때 ‘갔었어’, ‘거기’라는 단어의 의미를 더 강하게 반영한다. 셀프 어텐션 수행의 대상은 입력 시퀀스 전체! 위처럼 특정 단어가 갖는 의미를 특정 단어들과 연관지어서 설명했지만, 실제로는 각 단어-전체 입력 시퀀스 간의 어텐션 계산을 모두 수행한다. 따라서 개별 단어와 전체 입력 시퀀스를 대상으로 어텐션 계산을 수행해 문맥 전체를 고려하므로 지역적 문맥만 보는 CNN보다 강점이 있다. 그리고 모든 경우의 수를 고려하기 때문에 시퀀스의 길이가 길어지더라도 정보를 잊거나 왜곡할 염려가 없다! 이는 RNN의 단점을 극복한 것.
합성곱 신경망 (CNN)
💡 합성곱 신경망? 합성곱 필터(데이터를 전체적으로 훑으면서 인접 정보를 추출하는 역할)를 사용해 시퀀스의 지역적 특징을 잡아내는 모델.
자연어는 기본적으로 '시퀀스(단어 or 형태소의 나열)'이며, 특정 단어를 기준으로 주변 문맥이 의미 형성에 중요한 역할을 한다.
→ 이때 합성곱 신경망, CNN이 자연어 처리에 널리 사용된다~!!
그렇다면 CNN은 문장을 어떻게 인코딩할까??
→ ‘어제 카페 갔었어’ → ‘카페 갔었어 거기’ → ‘갔었어 거기 사람’ …
네모 칸 안의 단어를 하나씩 넘기면서 차례대로 읽어들이는 방식. 하지만 CNN은 합성곱 필터 크기를 넘어서는 문맥은 읽어내기 어렵다는 단점이 있다!
순환 신경망 (RNN)
☝ 합성곱 신경망과 마찬가지로 시퀀스 정보를 압축하는데 강점이 있는 모델.
합성곱 신경망처럼 3, 4개의 단어씩 처리하는 방식이 아니라 나열된 단어를 주어진 배열에 따라 순차적으로 인코딩을 한다.
→ RNN은 시퀀스 길이가 길어질수록 정보 압축에서 문제가 발생한다. 오래 전 입력된 단어를 잊어버리거나, 특정 단어 정보를 과하게 반영해 전체 정보를 왜곡하는 경우도 생기는 것. (입력 정보를 차례대로 처리하고 오래 전에 읽었던 단어는 잊어버리는 경향이 있기 때문)