자연어 문제에 많이 사용되는 방법은 순환 신경망이다.
먼저 Char-RNN 모델을 어떻게 만드는지 살펴본다.
1. 훈련 데이터셋을 만들어준다.
2. tf.keras.layers.TextVectorization층을 사용해 텍스트를 인코딩 한다.
3. 문자 id로 구성된 긴 시퀀스를 입력과 타깃 윈도 쌍의 데이터셋으로 변환하는 작은 유틸리티 함수를 만든다.
이 함수의 실행 방식은 다음과 같다.
- 시퀀스를 입력으로 받고 원하는 길이의 모든 윈도를 담은 데이터셋을 만든다.
- 타깃을 위한 다음 문자가 필요하기 때문에 길이를 하나 증가시킨다.
- 윈도를 섞고, 배치로 묶고, 입력/출력 쌍으로 나누고, 프리페칭을 활성화한다.

그림으로 요약하면 위와 같은 형태이다.
4. 다음과 같이 훈련 세트, 검증 세트, 테스트 세트를 준비한다.
5. 모델을 구축하고 훈련시켜준다.
위의 코드를 요약하자면
- Embedding 층을 사용하여 문자 ID를 벡터로 인코딩한다. 입력 차원은 고유 문자 수로 설정하고, 출력 차원은 16으로 설정하여 3D 텐서 형태의 임베딩 벡터를 얻는다.
- Dense 층을 사용하여 각 문자에 대한 확률을 출력한다. 출력 차원은 고유 문자 수(39)와 동일하게 설정하고, 소프트맥스 활성화 함수를 사용하여 각 타임스텝의 확률 합이 1이 되도록 한다.
- 손실 함수로 sparse_categorical_crossentropy를 사용하고, 옵티마이저로 Nadam을 사용한다. 모델 학습 시 ModelCheckpoint 콜백을 사용하여 가장 성능이 좋은 모델을 저장한다.
Char-RNN 모델은 초기 텍스트를 주입하고 모델이 가장 가능성 있는 다음 글자를 예측한다. 그런 다음 예측한 글자를 텍스트 끝에 추가하고 늘어난 텍스트를 모델에 전달하여 다음 글자를 예측하는 식이다. 이를 그리디 디코딩 이라 한다.
온도라고 불리는 숫자로 로짓을 나눌 수 있다. 온도를 원하는 값으로 설정할 수 있는데 0에 가까울수록 높은 확률을 가진 글자를 선택한다. 온도가 높으면 모든 글자가 동일한 확률을 가진다.
뉴클리어스 샘플링 : 상위 K개의 문자에서 샘플링하거나 총 확률이 특정 임곗값을 초과하는 가장 작은 상위 문자 집합에서만 샘플링하는 것을 말한다.
지금까지는 상태가 없는 RNN을 알아봤다. 다음으로는 상태가 있는 RNN을 알아보자.
💡 여기서 '상태'란 뭘 말하는 걸까?
RNN은 시퀀스 데이터를 처리할 때 이전의 정보를 기억해서 다음 출력을 만든다.
이 "기억"을 hidden state (숨겨진 상태)라고 부르고, 이게 바로 RNN의 상태(state)이다.
상태가 없는 RNN이란
- 한 배치(batch)의 시퀀스를 처리한 후, hidden state를 초기화함.
- 즉, 매번 새로 시작함.
- EX) 문장을 한 줄씩 독립적으로 읽고 처리함. 다음 문장을 볼 땐 이전 문장을 기억하지 않음.
상태가 있는 RNN이란
- 한 배치에서 얻은 hidden state를 다음 배치로 넘긴다.
- 즉, 이전 시퀀스의 정보를 계속 이어서 기억한다.
- EX) 긴 문장을 여러 줄로 나눠서 읽되, 앞줄의 내용을 계속 기억하면서 처리함.
상태가 있는 RNN은 어떻게 만들까?
상태가 있는 RNN은 배치에 있는 각 입력 시퀀스가 이전 배치의 시퀀스가 끝난 지점에서 시작해야 한다. 따라서 첫 번째로 할 일은 순차적이고 겹치지 않는 입력 시퀀스를 만드는 것이다.
아래는 과정을 그림으로 요약한 것이다.

에포크 끝마다 텍스트를 다시 시작하기 전에 상태를 재설정해야 한다. 이를 위해 사용자 정의 콜백 함수를 사용한다.
그 후 모델을 컴파일하고 이 콜백을 사용하여 훈련한다.
그 다음으로 감성 분석을 살펴보자.
감성 분석은 NLP에서 가장 일반적인 애플리케이션이다.
예를 들어 리뷰가 부정적인지 긍정적인지 이진분류 하는 등의 모델이 있다.
모델을 구축하려면 텍스트를 전처리해야 하지만 이번에는 문자가 아닌 단어로 자른다. 이를 위해서 tf.keras.layers.TextVectorization층을 사용할 수 있다. 이 층은 단어 경계를 식별하기 위해 공백을 사용하므로 일부 언어에서는 제대로 작동하지 않을 수 있다.
이를 해결하기 위한 기술중 바이트 페어 인코딩이 있다. 이것은 전체 훈련 세트를 개별 문자로 분할한 다음 어휘 사전이 원하는 크기에 도달할 때까지 가장 빈번하게 등장하는 인접 쌍을 반복적으로 병합한다.
이외에도 부분 단어 규제라는 것이 있다. 이는 훈련 중에 토큰화에 약간의 무작위성을 도입하여 정확도와 견고성을 향상시킬 수 있는 새로운 규제 기법을 말한다.
이제 모델을 만들고 훈련해보자.
위 코드의 작동 방식
- TextVectorization 층으로 텍스트를 숫자 ID 시퀀스로 바꾼다.
- Embedding 층은 이 숫자 ID를 의미 있는 벡터로 변환한다. (단어 사전 크기 × 128차원)
- GRU 층이 시퀀스를 처리한다. SimpleRNN보다 더 나은 성능을 낸다.
- Dense 층이 결과를 예측한다. (긍정/부정 리뷰일 확률)
이 모델은 SimpleRNN 층보다 훨씬 나은 GRU 층을 사용하고 있지만, 단기기억은 여전히 좋지 않기에 패딩 토큰을 거치면 리뷰 내용을 잊어버리게 된다. 해결책은 모델에 동일한 길이의 문장으로 구성된 배치를 주입하는 것이다. 또 다른 해결책은 RNN이 패딩 토큰을 무시하도록 하는 것이다. 마스킹을 사용하여 이렇게 해결 할 수 있다.
마스킹
모델이 패딩 토큰을 무시하게 만드는 방법은 Embedding 층을 만들 대 mask_zero = True 매개변수를 추가하는 것이다. 이렇게 하면 이어지는 모든 층에서 패딩 토큰을 무시한다.
구체적인 순서
- Embedding 층에서 tf.math.not_equal(inputs, 0) 같은 방식으로 마스크 텐서를 만든다.
→ 입력과 같은 크기의 불리언 텐서이며, 값이 0이면 False, 아니면 True. - 이 마스크는 다음 층으로 자동 전달되고,
→ 해당 층의 call() 메서드에 mask 인자가 있으면 자동으로 마스크를 받는다. - 이 마스크를 통해, 층은 불필요한 시퀀스 위치(=패딩) 를 무시할 수 있다.
→ False로 표시된 위치의 타임스텝을 무시하고, 이전 출력만 복사해 넘긴다. - 층의 supports_masking=True이면, 마스크가 다음 층으로 계속 전달된다.
→ 예: 순환 층 여러 개에서 return_sequences=True로 계속 연결된 경우. - 하지만 return_sequences=False인 마지막 순환 층에서는
→ 마스크를 더 이상 쓸 일이 없기 때문에 supports_masking=False가 되고, 마스크 전달이 중단된다. - 따라서 순환 층 여러 개 중 마지막만 return_sequences=False일 경우
→ 그 마지막 층까지만 마스크가 전달되고, 그 뒤로는 더 이상 마스크가 전달되지 않음. - 즉, Embedding(mask_zero=True)로 마스크를 만들어도
→ 그 뒤에 오는 GRU 층이 return_sequences=True로 설정되지 않으면 마스크는 중간까지만 전달되고 끝난다.
사전 훈련된 임베딩과 언어 모델 재사용하기
사전 훈련된 단어 임베딩을 사용하는 것은 몇 년 동안 인기가 있었지만 이 방식에는 한계가 있다. 특히 단어가 매우 다른 두 가지 의미를 가지고 있음에도 불구하고 동일한 방식으로 인코딩 되는 문제가 있다. 이러한 한계를 해결하기 위해 ELMo가 있다. 이것은 심층 양방향 언어 모델의 내부 상태에서 학습된 문맥이 반영된 단어 임베딩이다. 모델에 사전 훈련된 임베딩을 사용하는 대신 사전 훈련된 언어 모델의 일부를 재사용할 수 있다.
신경망 기계 번역 (NMT)
구조를 정리하자면 영어 문장을 인코더에 입력으로 주입하면 디코더는 스페인어 번역을 출력한다. 스페인어 번역도 한 스텝 뒤쳐져서 디코더의 입력으로 사용된다. 실제 무엇이 출력되는지 상관하지 않고 디코더는 이전 스텝에서 출력되어야 할 단어를 입력으로 사용한다. 모델의 성능을 향상하고 훈련 속도를 크게 높이는 이런 기법을 티처 포싱 이라 한다.
맨 처음 단어로 디코더는 SOS 토큰을 받는다. 그리고 디코더는 문장의 끝에 EOS 토큰이 있을 것으로 기대한다. 각 단어는 초기에 1차원으로 표현되어 있다. 그 다음 임베딩 층이 단어 임베딩을 반환한다. 이 단어 임베딩이 인코더와 디코더로 주입된다.

각 단계마다 디코더는 출력 어휘 사전에 있는 단어에 대한 점수를 출력한다. 그 다음 소프트 맥스 활성화 함수가 이 점수를 확률로 바꾼다. 가장 높은 확률의 단어가 출력된다.

(훈련이 끝나고) 추론 시에는 디코더에 주입할 타깃 문장이 없다. 대신 위 사진처럼 그냥 이전 스텝에서 디코더가 출력한 단어를 주입한다.
출력 중 최적화
출력하는 어휘의 개수가 많은 경우 가능한 모든 단어에 대해 확률을 출력하면 상당히 느릴 수 있다. 이를 피하기 위해 모델이 타깃 단어에 대한 로짓과 타깃이 아닌 단어 중 랜덤하게 샘플링한 단어의 로짓을 살펴보고, 이 로짓만을 기반으로 손실의 근사치를 계산한다. 이를 샘플링 소프트맥스 기법이라고 한다.
샘플링 소프트맥스와 호환되며 훈련 속도를 높일 수 있는 또 다른 방법은 출력 층의 가중치를 디코더의 임베딩 행렬의전치와 묶는 것이다. 이렇게 하면 모델 파라미터 수가 크게 줄어들어 훈련 속도가 빨라지고 특히 훈련 데이터가 많지 않은 경우 모델의 정확도가 향상될 수 있다.
양방향 RNN

동일한 입력에 대해 두 개의 순환 층을 실행한다. 하나는 왼쪽에서 오른쪽으로 단어를 읽고 다른 하나는 오른쪽에서 왼쪽으로 읽는다. 그 다음 일반적으로 타임 스텝마다 이 두 출력을 연결한다. 이것이 바로 양방향 순환 층이 하는 일이다.
❗ 한 가지 문제가 있다.
이 층은 두 개가 아니라 네 개의 상태를 반환한다. 정방향 LSTM 층의 마지막 단기 상태와 장기 상태, 역방향 LSTM 층의 마지막 단기 상태와 장기 상태를 반환한다. 이 네개의 상태를 디코더의 LSTM 층의 초기 상태로직접 사용할 수 없다.
LSTM은 두 개의 상태만 기대하기 때문이다. 디코더는 인과관계를 유지해야 하므로 양방향으로 만들 수 없다. 그렇지 않으면 훈련 중에 속임수를 쓰는 것이며 추론에서 제대로 작동하지 않을 것이다. 대신 두 개의 단기 상태와 두 개의 장기 상태를 연결할 수 있다.
빔 서치
: K개의 가능성 있는 문장의 리스트를 유지하고 디코더 단계마다 이 문장의 단어를 하나씩 생성하여 가능성 있는 K 개의 문장을 만든다 파라미터 K를 빔 너비라고 부른다.

위 그림에서는 빔 너비가 3인 빔 서치 이므로 매 단계마다 확률이 높은 상위 3개 문장만 유지한다.
- 매 단계마다 가능한 다음 단어들을 확장해본다.
- 전체 문장 확률을 계산한다 (곱셈).
- 상위 N개의 경로만 남기고 나머지는 버린다.
- 이 과정을 반복해 문장을 생성한다.
어텐션 매커니즘

위 그림은 인코더-디코더 모델에 어텐션 매커니즘을 추가한 것이다.
- 왼쪽에 인코더와 디코더가 있다.
- 각 타임스텝에서 인코더의 마지막 은닉 상태와 이전 스텝의 타깃 단어만 디코더에 보내는 것이 아니라 인코더의 모든 출력을 디코더로 전송한다.
- 디코더는 모든 인코더 출력을 한 번에 다룰 수 없으므로 이를 집계해야 한다. 즉, 각 타임스텝에서 디코더의 메모리 셀은 모든 인코더 출력의 가중치 합을 계산한다. 이 단계에서 주의를 집중할 단어를 결정한다.
- 디코더의 나머지 부분은 앞서 본 것과 동일하게 작동한다.
- 타임 스텝마다 메모리 셀이 앞서 언급한 입력과 이전 타임 스텝의 은닉 상태를 받는다.
- 마지막으로 이전 타임 스텝에서 타깃 단어를 받는다.
- 먼저 하나의 뉴런으로 구성된 Dense 층이 인코더의 모든 출력과 디코더의 이전 은닉 상태를 처리한다.
- 이 층은 각 인코더 출력에 대한 점수를 출력한다.
- 이 점수는 각 출력이 디코더의 은닉 상태와 얼마나 잘 맞는지를 측정한다.
💡 a가중치는 어디서 오는 걸까?
이 가중치는 정렬 모델이라 부르는 작은 신경망에 의해 생성된다. 이 모델은 인코더-디코더 모델의 나머지 부분과 함께 훈련된다.
주어진 디코더 타임 스텝에 대한 모든 가중치 합은 1이 된다. 이런 종류의 어텐션 매커니즘을 바흐다나우 어텐션이라고 부른다.
인코더의 출력과 디코더의 이전 은닉 상태를 연결하기 때문에 연결 어텐션이라고도 부른다.
널리 알려진 또 다른 어텐션 메커니즘은 루웅 어텐션 또는 곱셈 어텐션이다.
목적
: 인코더의 출력 하나와 디코더의 이전 은닉 상태 사이의 유사도를 측정하는 것.
그러므로 저자들은 간단히 두 벡터 사이의 점곱을 제안했다.
점곱은 꽤 좋은 유사도 측정 방법이며 현대적인 하드웨어는점곱을 매우 효율적으로 계산할 수 있다. 이렇게 하려면 두 벡터는 동일한 차원을 가져야 한다. 점곱은 하나의 점수를 만든다. 이 점수가 모두 소프트 맥스 층을 통과해 최종 가중치를 만든다.
또 다른 간소화 버전은 이전 타임 스텝이 아니라 현재 타임 스텝에서 디코더의 은닉 상태를 사용하는 것이다. 그 다음 어텐션 메커니즘의 출력을 사용하여 바로 디코더의 예측을 계산한다.

💡 요약하면 어텐션 층은 입력의 일부에 모델의 주의를 집중시키는 방법을 제공한다. 하지만 이 층을 다른 방식으로 생각하면 미분 가능한 메모리 검색 메커니즘처럼 작동한다고 볼 수 있다.
어텐션 층의 역할
: 쿼리와 딕셔너리에 있는 각 키 사이의 유사도를 계산하는 것. 그 다음 소프트 맥스 함수를 사용해 이러한 유사도 점수를 가중치로 변환하여 모두 더했을 때 1이 되도록 만든다.
트랜스포머
- 순환 층이나 합성곱 층을 전혀 사용하지 않고 어텐션 메커니즘만 사용하여 NMT 분야의 최신 기술을 크게 향상 시킴.
- 순환하지 않기 때문에 RNN 처럼 그레디언트 소실이나 폭주 문제가 발생하지 않으며, 더 적은 단계로 학습할 수 있고, 여러 GPU에 걸쳐 병렬화하기 쉬우며, RNN보다 장기 패턴을 더 잘 포착할 수 있다.
트랜스포머의 구조

- 왼쪽 부분이 인코더, 오른쪽 부분이 디코더이다.
- 임베딩 층은 크기가 [배치 크기, 시퀀스 길이, 임베딩 크기]인 3D 텐서를 출력한다.
- 그 후 이 텐서는 트랜스포머를 통과하면서 점차 변형되지만 크기는 동일하게 유지된다.
인코더의 역할 : 각 단어의 표현이 문맥 앙ㄴ에서 단어의 의미를 완벽하게 포착할 대까지 입력을 점진적으로 변환하는 것이다.
하지만 인코더를 통과한 후 단어의 표현은 주어진 문장에서 정확한 의미와 번역에 필요한 기타 정보를 포착해야한다.
디코더의 역할 : 번역된 문장의 각 단어 표현을 다음 번역 단어의 표현으로 점진적으로 변환하는 것이다.
더 자세히 보자면??
- 인코더와 디코더 모두 N번 반복해 쌓아 올린 모듈을 포함하고 있다.
- 인코더 스택의 최종 출력이 N번의 디코더에 모두 주입된다.
- 두 개의 임베딩 층, 여러개의 스킵 연결과 그 뒤르 잇는 층 정규화, 두 개의 밀집 층으로 구성된 여러 개의 피드포워드 모듈, 출력 층은 소프트맥스 활성화 함수를 사용하는 밀집 층이다.
- 필요한 경우 어텐션 층과 피드포워드 모듈 뒤에 약간의 드롭아웃을 적용할 수도 있다.
- 모든 층은 타임 스텝에 독립적이다.
- 각 단어는 다른 모든 단어에 대해 독립적으로 처리된다.
- 인코더의 멀티 헤드 어텐션 층은 같은 문장에 있는 다른 모든 단어에 주의를 기울여 각 단어 표현을 업데이트한다.
- 디코더의 마스크드 멀티 헤드 어텐션층은 한 단어를 처리할 대 그 뒤에 있는 단어에는 관심을 기울이지 않는 인과적 층이다.
- 디코더 위에 있는 멀티 헤드 어텐션 층은 디코더가 영어 문장의 단어에 주의를 기울이는 곳, 셀프 어텐션, 크로스 어텐션이라고 한다.
- 위치 인코딩 : 문장에서 각 단어의 위치를 나타내는 밀집 벡터이다. N 번째 위치 인코딩이 각 문장에 있는 N번째 단어의 단어 임베딩에 더해진다. 이렇게 하는 이유는 트랜스포머 구조에 있는 모든 층이 단어 위치를 무시하기 때문이다.
위치 인코딩
위치 인코딩을 구현하는 가장 쉬운 방법은 Embedding 층을 사용해 0부터 배치에 있는 최대 시퀀스 길이까지 모든 위치를 인코딩한 다음 그 결과를 단어 임베딩에 추가하는 것이다. 모든 입력 시퀀스에 위치 인코딩이 적용된다.

훈련 가능한 위치 임베딩 대신 논문에서 저자들은 여러 가지 주기의 사인과 코사인 함수에 기반한 고정된 위치 인코딩을 선택했다. 이 방법은 학습된 위치 임베딩과 동일한 성능을 내면서 모델에 파라미터를 추가하지 않고 임의의 긴 문장으로 확장할 수 있다.

또한 진동 함수 선택에 따라 모델이 상대적인 위치도 학습 할 수 있다.
멀티 헤드 어텐션
멀티 헤드 어텐션 층의 작동 방식을 이해하려면 먼저 기본이 되는 스케일드 점곱 어텐션 층을 이해해야 한다.
스케일링 인자만 제외하면 루웅 어텐션과 같다.
식 및 설명


- Attention 층의 입력은 배치 차원이 추가로 있는 것을 제외하면 Q,K,V와 같다.
- 내부적으로 이 층은 배치에 있는 모든 문장에 대한 어텐션 점수를 한 번 호출해 계산하므로 매우 효율적이다.

- 멀티 헤드 어텐션은 스케일드 점곱 어텐션 층의 묶음이다.
- 각 층은 값, 키, 쿼리에 대한 선형 변환을 먼저 수행한다.
- 출력은 단순히 모두 연결되어 마지막 선형 변환을 통과한다.
⁉️ 위와 같이 하는 이유는???
- 단어 표현은 단어에 있는 많은 특징을 인코딩한다.
- 하나의 스케일드 점곱 어텐션 층만 사용한다면 한 번에 이런 특징을 모두 쿼리할 수 밖에 없다.
- 이것이 멀티 헤드 어텐션 층이 값, 키, 쿼리의 여러 가지 선형 변환을 적용하는 이유이다.
- 이를 통해 모델이 단어 표현을 여러 부분 공간으로 다양하게 투영할 수 있다. 이 부분 공간은 단어의 일부 특징에 주목한다.
- 선형 층 하나가 단어 표현을 해당 단어가 동사라는 정보만 남는 하나의 부분 공간으로 투영한다.
- 그리고 다른 선형 층은 현재형이라는 사실만 추출하는 식이다.
- 시케일드 점곱 어텐션 층이 룩업 단계를 구현하고 마지막으로 모든 결과를 연결하여 원본 공간으로 다시 투영한다.
언어 모델 분야의 최근 혁신
1. 알렉 래드 퍼드와 OpenAI 연구자들의 GPT 논문
- 비지도 사전 훈련의 효과를 보여주었다.
- 저자들은 원본 트랜스포머의 디코더와 같은 마스크드 멀티 헤드 어텐션 층만 사용한 트랜스포머 모듈 12개를 쌓아서 규모가 크지만 간단한 모델을 사전 훈련했다.
- 단순히 다음 토큰을 에측하는 셰익스피어 char-RNN에서 사용했던 자기 회귀 방식으로 대규모 데이터셋에서 모델을 훈련했다.
2. 구글의 BERT 논문
- 대규모 텍스트 데이터에서 자기 지도 사전 훈련의 효과를 보였다.
- GPT와 비슷한 구조지만 원본 트랜스포머의 인코더처럼 마스크가 없는 멀티 헤드 어텐션 층을 사용한다.
- 모델이 자연스럽게 양방향성을 가진다.
- 저자들은 모델의 강점을 잘 설명하는 두 가지 사전 훈련 작업을 제안했다.
- 마스크드 언어 모델 : 문장에 있는 각 단어는 15%의 확률로 마스킹 된다. 모델은 마스킹된 단어를 예측하도록 훈련된다. 선택된 각 단어는 80%의 확률로 마스킹되고 10%의 확률로 다른 단어로 바뀐다. 그리고 10%의 확률로 그대로 남겨진다.
- 다음 문장 예측 : 두 문장이 연속적인지 아닌지를 예측하도록 모델을 훈련한다.

- 이 모델은 이 두 가지 작업에서 동시에 훈련되었다.
- NSP 작업을 위해 저자들은 모든 입력 시작 부분에 클래스 토큰을 추가했다.
- 이에 해당하는 출력 토큰은 모델의 예측을 나타낸다.
- 두 입력 문장은 특수한 분할 토큰으로 연결되어 모델에 입력으로 주입된다.
- 각 입력 토큰이 어느 문장에 속하는지 모델에게 알려주기 위해 토큰의 위치 임베딩 위에 세그먼트 임베딩이 추가된다.
- 가능한 세그먼트 임베딩은 두 개이다.
- 하나는 문장 A에 대한 것, 다른 하나는 문장 B에 대한 것이다.
- MLM 작업을 위해 일부 입력 단어가 마스킹되고 모델이 해당 단어가 무엇인지 예측해야 한다.
- 손실은 NSP 예측과 마스킹된 토큰에 대해서만 계산되며, 마스킹되지 않은 토큰에 대해서는 계산되지 않는다.
⭐ 새로운 GPT 모델이 제로 샷 학습을 수행할 수 있다. 이는 미세 튜닝 없이 많은 작업에서 우수한 성능을 달성할 수 있단 의미이다.
DistilBERT
- 증류 기법을 사용하여 학습 되었다.
- 티처 모델에서 스튜던트 모델로 지식을 이전하는 것을 의미한다.
- 스튜던트 모델은 일반적으로 티처 모델보다 훨씬 작다.
- 일반적으로 훈련 샘플에 대한 티처 모델의 예측 확률을 스튜던트 모델의 타깃으로 사용하는 방식으로 수행된다.
- 증류기법은 티처 모델과 동일한 데이터셋으로 스튜던트 모델을 처음부터 훈련하는 것보다 더 효과적인 경우가 많다.
- 실제로 스튜던트 모델은 티처 모델이 만드는 미묘한 레이블로부터많은 이점을 얻을 수 있다.
비전 트랜스포머
- NMT를 넘어 사용된 첫 번째 어텐션 메커니즘 어플리케이션은 비주얼 어텐션을 사용한 이미지 캡션 생성이다.
- 합성곱 신경망이 먼저 이미지를 처리해 일련의 특성맵을 출력한다.
- 그다음 어텐션 메커니즘을 장착한 디코더 RNN이 한 번에 한 단어씩 캡션을 생성한다.
- 디코더 타임 스텝마다 디코더는 어텐션 모델을 사용해 이미지에서 적절한 부위에 초점을 맞춘다.

설명 가능성 : 모델이 출력을 만들게 된 원인이 무엇인지 이해하기 쉽다는 것. 모델이 올바르게 예측하지 못할 때 유용하다.
비전 트랜스포머
- 이미지를 16X16의 작은 정사각형으로 자르고 정사각현의 시퀀스를 마치 단어 표현의 시퀀스처럼 취급하기만 하면 된다.
- 정사각형을 16X16X3 차원 벡터로 평편하게 만든 다음 벡터의 차원을 유지하면서 변환하는 선형 층에 통과시킨다. 이로부터 얻은 벡터 시퀀스를 단어 임베딩 시퀀스처럼 처리할 수 있다.
- 즉 위치 임베딩을 추가하고 결과를 트랜스포머로 전달한다
데이터 효율적인 이미지 트랜스포머
- 이 모델은 추가 훈련 데이터 없이도 이미지넷에서 경쟁력 있는 결과를 달성했습니다.
- 이 모델의 구조는 원본 ViT와 거의 동일하지만 저자들은 증류 기법을 사용하여 최신 CNN 모델에서 얻은 지식을 모델로 옮겼습니다.
멀티모달 트랜스포머
- 텍스트, 이미지, 오디오 등 거의 모든 종류의 데이터를 입력할 수 있다.
- 이전까지 트랜스포머는 어텐션 층의 성능과 메모리 병목 현상으로 인해 상당히 짧은 시퀀스로 제한되어있었다.
- 퍼시비어는 비교적 상당히 잛은 입력의 잠재 표현을 점진적으로 개선함으로써 이 문제를 해겷한다.
- 잠재 표현은 N개의 토큰으로 구성된다.
- 이 모델은 크로스 어텐션 층만 사용하며 잠재 표현을 쿼리로 사용하고 입력을 값으로 사용한다.
- M X N 행렬만 계산하면 되므로 계산 복잡도는 이차식이 아니라 M에 대해 선형적이다.
- 여러 번의 크로스 어텐션 층을 거친 후 모든 것이 순조롭게 진행되면 잠재 표현은 입력에서 중요한 모든 것을 포착하게된다.
- 저자들은 또한 연속적인 크로스 어텐션 층 간에 가중치를 공유할 것을 제안했다.
- 그러면 퍼시비어가 사실상 RNN이 된다.
- 실제로 공유된 크로스 어텐션 층은 서로 다른 타음 스텝에서 동일한 메모리 셀로 볼 수 있고, 잠재 표현은 셀의 문맥 벡터에 해당한다.
- 동일한 입력이 모든 타임 스텝에서 메모리 셀에 반복적으로 주입된다.
DINO
- 훈련 중에 복제되어 한 네트워크는 티처 역할을 하고 다른 네트워크는 스튜던트 역할을 한다.
- 경사하강법은 스튜던트에게만 영향을 미치며 티처의 가중치는 스튜던트 가중치의 지수 이동 평균이다.
- 티처의 예측과 일치하도록 스튜던트를 훈련한다. 거의 동일한 모델이기 때문에 이를 자기 증류라고 한다..
- 각 훈련 단계에서 입력 이미지는 티처와 스튜던트에게 다른 방식으로 증식되므로 완전히 동일한 이미지를 볼 수는 없지만 두 모델의 예측은 일치해야 한다.
- 따라서 두 모델은 고수준의 표현을 만들어내야 한다.
- 스튜던트와 티처가 입력을 완전히 무시하고 항상 같은 것을 출력하는 모드 붕괴를 방지하기 위해 DINO는 티처가 예측에 대해 높은 신뢰도를 갖도록 강제한다. 이를 선명화라고 한다.