현재 수강하고 있는 SK플래닛 T아카데미 ASAC 빅데이터 분석 & AI 전문가 양성과정 5기에서 기업 연계 프로젝트를 시작했습니다. 저는 국내 딥러닝 관련 스타트업 기업 팀에 참여해서 딥러닝 프로젝트를 진행하게 되었습니다. 주제는 Table Detection인데요.

이번 기업연계 프로젝트에서 저는 최신 논문을 직접 선정해서 리뷰하고 코드화, 서비스화를 할 예정입니다. 그래서 본격적인 프로젝트에 앞서, Microsoft가 2021년 발표한 PubTables-1m dataset 논문을 읽으면서 Table Detection의 전반적인 발전 흐름과 데이터 구성, 평가 지표에 대해서 짚어보는 시간을 가졌습니다.

논문을 읽으면서 궁금증이 생겨 DETR(Detection Transformer) 논문도 살펴보고, 트랜스포머 허깅페이스를 방문해 객체 탐지 pipeline으로 여러 가지 실험을 해보기도 했는데요. ( 포스팅 : https://smartest-suri.tistory.com/52  ) 이렇게 논문을 기반으로 딥러닝을 연구하고 아이디어를 확장해나가는 것이 되게..... 변태같이 재밌네요.........^__^

 

딥러닝 | Transformer Huggingface 탐방, pipline 가지고 놀기(객체 탐지)

Transformers지난번에 트랜스포머 논문을 처음부터 끝까지 열심히 읽고 리뷰를 포스팅했었습니다.https://smartest-suri.tistory.com/48 딥러닝 | Attention is all you need - 트랜스포머(2017) 논문 리뷰[참고] 본 포

smartest-suri.tistory.com

이번 PubTables-1m 논문 리뷰는 Table Detection의 발전 과정, 기본 아이디어와 중요 사항 등을 체크할 수 있었던 좋은 시간이었습니다. 그럼 리뷰 들어가겠습니다!



PubTables-1M: Towards comprehensive table extraction from unstructured documents
https://arxiv.org/pdf/2110.00061v3


0. 초록 Abstract

(중략) we develop a new, more comprehensive dataset for table extraction, called PubTables-1M. PubTables-1M contains nearly one million tables from scientific articles, supports multiple input modalities, and contains detailed header and location information for table structures, making it useful for a wide variety of modeling approaches.

(뭔들 아니겠냐만은...) Table detection task 분야에서 당시 가장 큰 문제가 되는 것은 '데이터'였고, 테이블 트랜스포머 팀은 그 해결방안으로 'PubTales-1M'(이하 펍테이블)이라는 데이터셋을 공개하는데요. 펍테이블은 과학 기사에서 추출한 약 1백만 여개의 테이블을 포함하며, multiple input modalities를 지원하는 데이터 셋입니다. 또한 표 구조에서 디테일한 header 정보나 위치 정보를 포함하고 있기 때문에 다양한 목적으로 사용될 수 있습니다.

It also addresses a significant source of ground truth inconsistency observed in prior datasets called oversegmentation, using a novel canonicalization procedure. We demonstrate that these improvements lead to a significant increase in training performance and a more reliable estimate of model performance at evaluation for table structure recognition. 

특히 이전 데이터셋에서 흔히 발생하는 과분할, 과세분화(oversegmentation) 문제를 해결했다고 하는데요. 이를 위해 새로운 정규화 절차(canonicalization procedure)를 도입했습니다. 결과적으로 학습이 잘되고 모델 성능이 좋더라!라고,,, 모든 연구 논문의 빼놓을 수 없는 주장을 하고 있습니다. (ㅋㅋㅋㅋ)

Further, we show that transformer-based object detection models trained on PubTables-1M produce excellent results for all three tasks of detection, structure recognition, and functional analysis without the need for any special customization for these tasks.

테이블 트랜스포머 팀은 여기서 약간은 애매한 닉값을 하는데, 트랜스포머를 기반으로 한 object detection 모델을 가지고 테이블 탐지, 구조 인식, 기능 분석이라는 3가지 과업을 아주 잘 수행했다고 합니다. 후에 얘기하겠지만, 그냥 갖다 써서 실험만 했거든요. 데이터만 새로 생성했고 아쉽게도 새로운 모델 구조까지 제안하지는않습니다. 그래서 테이블 트랜스포머,,,,,,라고 명명하긴 조금 짜치지 않나.. 하는 생각을 감히 하기도 했는데요. 그래도 이렇게 새로 구축한 데이터셋으로 학습한 최신 pre-trained model card를 배포하고 있으니 어쨌든 닉값을 하기는 합니다!

배우는 입장에서... 기존의 문제점을 해결하기 위해 새로운 모델 구조를 제안하는 것이 가장 혁신적, 혁명적으로 느껴지긴 합니다. 시간과 노력같은 비용뿐만 아니라 창의적인 아이디어에 재능까지 필요한 일이기 때문이죠. 하지만 때론 이렇게 '데이터의 품질'을 향상시키는 것또한 근본적인 문제 해결의 한가지 방안이 될 수가 있습니다. 어쩌면 모델 구조 변경보다 더 나은 획기적인 성능 향상을 불러 오기도 하죠. 데이터셋 논문을 굳이 리뷰하는 이유도 이와 같은 이유에서입니다. (아, 짜친다고 한거 취소할게요)


1. 서론 Introduction

The problem of inferring a table’s structure from its presentation and converting it to a structured form is known as table extraction (TE). (중략...) 

표의 구조를 추론하고 이를 구조화된 형태로 변환하는 문제를 표 추출(Table Extraction, TE)이라고 합니다. TE는 아래와 같이 세 가지 하위 작업으로 구성됩니다.

  • 표 탐지 (Table Detection, TD)
  • 표 구조 인식 (Table Structure Recognition, TSR)
  • 기능 분석 (Functional Analysis, FA)

Fig 2.

The primary advantage of DL methods is that they can learn to be more robust to the wide variety of table presentation formats. However, manually annotating tables for TSR is a difficult and time-consuming process [7]. 

딥러닝을 통한 TE는 다양한 표 형식을 탄탄(robust)하게 학습할 수 있다는 장점이 있습니다. 그런데 딥러닝 - 지도 학습(Supervised Learning) - 에는 labeling이 필요하잖아요? TSR(Table Structure Recognition)을 하려면 사람이 일일이 레이블링(annotating)을 해줘야 하는데, 이게 여간 번거로운 게 아니다 보니, 항상 데이터와 관련된 문제점이 존재했던 모양이에요. 아무래도 데이터 확보 자체가 쉽지 않았겠죠.

To overcome this, researchers have turned recently to crowd-sourcing to construct larger datasets [9,22,23]. These datasets are assembled from tables appearing in documents created by thousands of authors, where an annotation for each table’s structure and content is available in a markup format such as HTML, XML, or LaTeX.

문제 해결을 위해서 기존 연구진들은 크라우드 소싱이란 걸 활용해서 더 큰 데이터 세트를 구축했다고 합니다. 이렇게 만들어진 데이터셋은 각 표의 구조와 내용에 대한 annotation을 HTML, XML, LaTeX 같은 마크업 형식으로 제공하는 특징이 있는데요.

* 크라우드 소싱 

- 전문가가 풀지 못한 문제를 대중이 풀다
- 군중(crowd)과 아웃소싱(outsourcing)의 합성어
- 비용 효율적이고 빠른 문제 해결을 가능하게 함

- 생산과 서비스의 과정에 소비자 혹은 대중을 참여시켜 더 나은 아이디어, 제품, 서비스를 만들고 수익을 참여자와 공유하고자하는 방법을 칭한다. [참고 : 기획재정부 시사경제용어사전]
While crowd-sourcing solves the problem of dataset size, repurposing annotations originally unintended for TE and automatically converting these to ground truth presents its own set of challenges with respect to completeness, consistency, and quality. 

크라우드 소싱이 데이터셋의 사이즈 - 즉, 수량을 확보하는 데에는 도움이 되긴 했는데, 사실 이렇게 얻은 annotation이 애초에는 TE를 목적으로 한 게 아니었고, 그래서 TE용으로 적합하지가 않았습니다. 

Another significant challenge for the use of crowdsourced annotations is that these structure annotations encoded in markup often exhibit an issue we refer to as oversegmentation. Oversegmentation occurs in a structure annotation when a spanning cell in a header is split into multiple grid cells.

특히 oversegmentation(과세분화) 문제가 있었습니다. 과세분화는 header(머리글)의 셀이 여러 격자 셀로 나뉘는 경우를 말합니다. 과세분화가 발생해도 보기에는 문제가 없어보입니다만, 딥러닝 모델 학습과 평가를 위한 정답 데이터로 사용될 때는 큰 문제가 될 수 있습니다.

The first issue is that an oversegmented annotation contradicts the logical interpretation of the table that its presentation is meant to suggest. (중략....) would and does lead to ambiguous and inconsistent ground truth, due to there then being multiple possible valid interpretations for a table’s structure, such as in Fig. 3. This violates the standard modeling assumption that there is exactly one correct ground truth annotation for each table.

크게 표의 구조를 올바르게 해석하지 못하는 문제점, 표의 구조에 대해 여러 가지 해석을 내놓는 문제점이 발생할 수 있습니다. 그래서 ground truth가 애매 모호해지고, 1개의 정해진 정답이 있다는 가정을 위반하게 됩니다. 따라서 과세분화된 주석이 포함된 데이터셋은 학습 중 모순된 피드백을 제공하고 평가 시 실제 성능을 과소평가하게 만듭니다. 


PubTables-1M (주요 내용)

We introduce a novel canonicalization procedure that corrects oversegmentation and whose goal is to ensure each table has a unique, unambiguous structure interpretation.
  • 새로운 canonicalization(정규화) 방법을 통해 oversegmentation(과세분화) 문제를 바로잡고 하나의 테이블에 대해 명확한 하나의 구조 해석을 내놓도록 하는 방법을 보여준다고 합니다.
We show that data improvements alone lead to a significant increase in performance for TSR models, due both to improved training and a more reliable estimate of performance at evaluation.
  • (새로운 모델 구조 제안 없이) 좋은 데이터를 쓰는 것만으로도 TSR(Table Structure Recognition) 과업에 얼마나 큰 성능 향상을 보일 수 있는지 보여준다고 합니다.
Finally, we apply the Detection Transformer (DETR) [2] for the first time to the tasks of TD, TSR, and FA, and demonstrate how with PubTables-1M all three tasks can be addressed with a transformer-based object detection framework without any special customization for these tasks.
  • Detection Transformer(DETR)을 TD, TSR, FA 과업에 사용한 첫 사례로서, PubTables-1M 데이터랑 DETR이랑 같이 쓰면 얼마나 괜찮은지 보여준다고 합니다. (특별한 모델 변형이나 새로운 구조 제안은 없음 - 데이터셋이 중심이 되는 논문임을 확인)

2. 관련 연구 Related Work 

해당 부분은 chat-gpt 4o를 통해 간단히 정리만 하고 넘어가도록 하겠습니다.

구조 인식 데이터셋

  • ICDAR-2013: 표 탐지(TD), 표 구조 인식(TSR), 기능 분석(FA)을 모두 다루는 최초의 데이터셋으로, 규모는 작으며 TD와 TSR을 위한 248개의 표와 FA를 위한 92개의 표로 구성됨.
  • 대규모 데이터셋: TableBank, SciTSR, PubTabNet, FinTabNet 등은 크라우드 소싱 주석을 사용하여 확장되었으나, 여전히 완전성, 경계 상자, 과세분화 문제를 가지고 있음.

모델링 접근법

  • 일반 방법: 객체 탐지, 이미지-텍스트 변환, 그래프 기반 접근법 등이 사용됨.
  • 문제점: 포괄적인 훈련 데이터의 부족으로 인해 기존 모델의 성능이 낮음.
  • 특화된 방법: 다양한 경우를 처리하기 위해 맞춤형 파이프라인과 전문화된 방법이 사용되었으나, 아직 보편적이고 성능이 높은 솔루션은 존재하지 않음.

3. 데이터셋 PubTables-1M

마이크로소프트는 PubTables-1M 개발을 위해 수백만 개의 공개 과학 기사를 제공하는 PMCOA 코퍼스 선택했습니다. 각 기사는 기사 내용을 시각적으로 보여주는 PDF 파일, 내용 설명과 요소의 계층적 구성을 제공하는 XML 파일로 구성되는데요. 각 표의 내용과 구조는 표준 HTML 태그를 사용합니다.

  • 하지만 이것도 역시 애초에 TE 모델링의 레이블로 의도하고 만든 데이터가 아니었기 때문에
    • 예를 들어서 두 문서가 같은 표를 가지고 있을 때에 두 문서 간의 직접적인 대응 관계를 알 수도 없고, 문서 내에서 표의 공간적 위치도 특별히 제공되지 않는 한계점이 발생했습니다.
  • 또 품질 측면에서도 완벽하지 못했는데
    • 예를 들어서 주석이 달린 텍스트 내용이 PDF에 표시된 텍스트 내용과 정확히 일치한다고 보장할 수도 없었고, 가끔 일부 라벨(row header 등)은 아예 주석 처리되지 않기도 했습니다.

논문에서는 이러한 문제점을 어떻게 해결해서 PubTables-1M 데이터셋을 구축했는지 아래와 같이 단계별로 나누어 설명합니다.


[3. 1.] Alignment

PDF와 XML의 텍스트 내용을 일치시켜서 대응관계를 만들어주는 단계

  1. PDF 문서에 있는 모든 문자에 대해 bounding box 처리를 합니다. ([xmin, ymin, xmax, ymax]의 공간적 위치로 표시)
  2. XML 태그에서 표의 텍스트를 추출합니다. (예) coffee 추출
  3. PDF 문서의 bounding box를 합쳐 일치하는 문자열이 있는지 확인하고, 만약 있다면 align을 시켜줍니다. 이 때 Needleman-Wunsch 알고리즘을 사용합니다. (예) 합쳐서 coffee가 되는 부분이 있는지 확인 -> 발견시 align
  4. 이 과정을 통해 PDF 문서의 텍스트와 XML/HTML에서 추출한 표 내용 텍스트를 서로 pairing(alinging) 하게 됩니다.
Needleman-Wunsh 알고리즘 (간단히)
: 두 시퀀스를 비교하여 최적의 정렬을 찾는 알고리즘으로, 주로 생물유전학에서 사용됨. 본 데이터셋에서는 PDF 문서의 텍스트 시퀀스와 XML/HTML 텍스트 시퀀스를 정렬하여, 두 문서 간의 텍스트 대응 관계를 확립하고 각 텍스트의 위치 정보를 연결하기 위해 사용되었음.

[3. 2.] Completion

Alignment 이후 표 전체와 각 행, 열에 bounding box를 쳐서
spatial annotation(공간 주석)을 '완성(Completion)'하는 단계

  • 표 (entire table)
    • 표의 경계 상자는 모든 텍스트 셀 경계 상자의 합집합(union)으로 정의됩니다.
  • 행 (row)
    • 가로 : 각 행의 xmin과 xmax(가로 길이)는 표의 xmin과 xmax로 정의하여 모든 행이 동일한 수평 길이를 갖도록 합니다.
    • 세로 : 각 행의 ymin과 ymax(세로 길이)는 해당 행에서 시작하거나 끝나는 모든 셀의 텍스트 셀 경계 상자의 합집합으로 정의됩니다.
  • 열 (column)
    • 가로 : 각 열의 ymin과 ymax는 표의 ymin과 ymax로 정의하여 모든 열이 동일한 수직 길이를 갖도록 합니다.
    • 세로 : 각 열 n의 xmin과 xmax는 해당 열에서 시작하거나 끝나는 모든 셀의 텍스트 셀 경계 상자의 합집합으로 정의됩니다.
  • 그리드 셀 (grid cell)
    • 그리드 셀은 해당 셀의 행 경계 상자와 열 경계 상자의 합집합(교차 부분 - intersection)으로 정의됩니다. 빈 셀에도 그리드 셀이 정의됩니다.

[3. 3.] Canonicalization

oversegmentation을 바로잡는 단계

canonicalization을 검색하면 '정규화, 표준화, 정상화'정도로 번역이 되는데요. 제가 느끼기에 제일 직관적인 번역은 '정상화'라고 생각했습니다. 논문에 따르면, 간단히 말해 canonicalization이란 특정 조건 하에서 인접한 셀을 병합하는 것을 의미합니다. 아래 사진을 보면 이해가 빠른데요.

이렇게 과세분화된 셀(a)을 서로 병합해서 Canonical(b) - 정상, 표준으로 되돌려놓는 작업을 의미합니다. 

알고리즘 파트는 간단히만 정리하고 넘어가도록 하겠습니다.

example : Header

  • Wang 모델에 따르면 모든 표의 header(머리말)은 트리 구조를 따릅니다.
  • 표의 각 열(column)은 열 헤더 트리의 고유한 리프 노드에, 각 행(row)은 행 헤더 트리의 고유한 리프 노드에 해당합니다.
  • 열이나 행 헤더가 부분적으로 주석 처리되거나 주변에 빈 셀이 있는 경우 이를 확장하여 추가적인 열이나 행을 포함시키는 확장 단계를 거칩니다.
  • 열 헤더와 행 헤더의 인접한 빈 셀들을 재귀적으로 병합하여 일관성을 유지합니다.
  • 마지막으로, 부모 셀과 자식 셀 사이에 빈 그리드 셀이 있는 경우, 빈 셀을 자식 셀과 병합하는 등의 구조 보완 단계를 거칩니다.

[3. 4.] Limitation

3.3. canonicalization의 한계를 언급

  • Canonicalization의 목표는 모든 표 구조 주석에 적용 가능한 것이지만, Algorithm 1은 PMCOA 데이터셋의 주석을 위해 특별히 설계된 것으로, 다른 데이터셋의 표를 Canonicalization하려면 추가적인 가정이 필요하며, 이는 이 연구의 범위를 벗어남을 밝힘.
  • Canonicalization은 오류 없는 주석을 보장하지 않음.
  • Canonicalization 이후에도 남아 있는 문제들은 다음 단계인 3.5. Quality control을 통해 해결하고자 함.

[3. 5.] Quality control

품질 관리를 통해 데이터의 명확성과 일관성을 높이는 단계

  • overlapping rows or overlapping columns -> 데이터 폐기 처리
  • 원본 XML 주석과 PDF에서 추출한 텍스트 간의 편집 거리를 비교 -> 셀 평균 편집 거리가 0.05를 넘는 표는 오류로 간주하여 폐기
  • PDF 텍스트를 정답 데이터로 간주 -> 각 단어가 표 내부의 그리드 셀과 겹치는 비율이 0.9 미만인 표 폐기
  • 객체 수가 100개를 초과하는 표 폐기
  • PubTables-1M은 셀 수준에서 주석을 검증하여 일관성을 보장하는 최초의 데이터셋임을 강조

[3. 6.] Dataset statistics and splits

데이터 통계와 수를 나타내는부분으로, 자세한 리뷰 생략

  • TSR 데이터셋
    • 훈련용 표: 758,849개
    • 검증용 표: 94,959개
    • 테스트용 표: 93,834개
  • TD 데이터셋
    • 훈련용 페이지: 460,589개
    • 검증용 페이지: 57,591개
    • 테스트용 페이지: 57,125개

4. 제안 모델 Proposed Model

본 논문은 표의 구성 성분을 6개의 객체 클래스로 분류해서 이미지에서 찾아낸 다음 경계 상자로 표시하는 모델링을 수행했습니다. 6개의 객체 클래스는 아래와 같습니다.


  1. table 표 전체
  2. table row 행
  3. table column 열
  4. table column header 행 헤더(머리말)
  5. table projected row header 열 헤더(머리말)
  6. table spanning cell 확장 셀
  7. The intersection of each pair of table column and table row objects can be considered to form a seventh implicit class, table grid cell. -> 모든 행렬의 교차 부분은 'grid cell'이라는 7번째 추가 object로 간주할 수 있음

Fig 4. 클래스 6개 예시


To demonstrate the proposed dataset and the object detection modeling approach, we apply the Detection Transformer (DETR) [2] to all three TE tasks. We train one DETR model for TD and one DETR model for both TSR and FA. For comparison, we also train a Faster R-CNN [16] model for the same tasks.

TD, TSR+FA 2가지 과업에 DETR을 이용해 학습을 시키고, Faster-R CNN과 성능을 비교합니다.

All models use a ResNet-18 backbone pretrained on ImageNet with the first few layers frozen. We avoid custom engineering the models and training procedures for each task, using default settings wherever possible to allow the data to drive the result.
  • 모든 모델은 ResNet-18 사전학습 백본 사용, 초반의 몇 레이어는 freeze
  • 모델 커스터마이징을 안 한 이유 : 데이터가 결과를 주도하도록 하기 위해 (이해는 하지만 개인적으로 아쉬운 부분)

5. 실험 Experiments

모델링 결과

Faster R-CNN, DETR 성능을 비교해 본 결과 DETR의 성능가 더 좋았으며, Canonical 데이터의 중요성을 강조하고 있습니다.

평가 지표 (metrics)
For assessing TSR performance, we report the table content accuracy metric (AccCont), which is the percentage of tables whose text content matches the ground truth exactly for every cell, as well as several metrics for partial table correctness, which use different strategies to give credit for correct cells when not all cells are correct. For partial correctness, we use the F-score of the standard adjacent cell content metric [5] and the recently proposed GriTS metrics [19].
  • TSR 성능 평가 : 각 셀의 텍스트 내용이 정답과 정확히 일치하는 표의 비율 AccCont
  • 부분적 정확도 평가 : 표준 인접 셀 내용 지표의 F-score와 최근 제안된 GriTS 지표
GriTS

GriTS(이하 그리츠) 수식을 확인해 보니, F-score와 같은 것이라고 해석해도 무방할 것 같습니다. Image Segmentation에서 자주 사용되는 Dice Score와도 일맥상통하구요. 

Compared to other metrics for TSR, this formulation better captures the two-dimensional structure and ordering of cells of a table when comparing tables. 

다른 지표랑 비교했을 때 그리츠는 표를 비교할 때 표의 이차원 구조와 셀의 순서를 더 잘 반영하고, 기타 등등 여러 장점이 있다고 하네요. 

AccCont

AccCont는 논문에 수식이 따로 없길래, gpt 4o한테 수식을 써달라고 했더니, 이렇게 써주네요 (ㅋㅋㅋㅋㅋ) 나름 직관적입니다. 일반적인 Accuracy(정확도) 개념과 거의 유사하다고 봐도 무방할 것 같습니다.


6. 결론 Conclusion

  • 비정형 문서의 표 추출을 위한 새로운 데이터셋인 PubTables-1M을 소개
  • 과세분화 문제를 해결하기 위해 새로운 정형화 절차를 제안, 이를 통해 모델 성능이 크게 향상됨을 입증
  • DETR을 사용하여 표 추출 작업에서 최첨단 성능을 달성할 수 있음을 보임

(7장 Future Work는 생략하겠습니다.)




마무리

https://github.com/microsoft/table-transformer

 

GitHub - microsoft/table-transformer: Table Transformer (TATR) is a deep learning model for extracting tables from unstructured

Table Transformer (TATR) is a deep learning model for extracting tables from unstructured documents (PDFs and images). This is also the official repository for the PubTables-1M dataset and GriTS ev...

github.com

테이블 트랜스포머 팀 최신 뉴스(깃허브)에 따르면, PubTables-1M과 다른 데이터셋을 가지고 학습한 pre-trained model TATR-v1.1을 공개했다고 밝히고 있습니다. (2023년 8월 22일자)

https://huggingface.co/bsmock/TATR-v1.1-All

 

bsmock/TATR-v1.1-All · Hugging Face

Model Card for TATR-v1.1-All This repo contains the model weights for TATR (Table Transformer) v1.1, trained on the PubTables-1M and FinTabNet.c datasets, using the training details in the paper: "Aligning benchmark datasets for table structure recognition

huggingface.co

해당 허깅페이스 페이지에 가면 모델 카드를 확인하실 수 있는데요.

추후 해당 모델을 사용해서 직접 Table Detection을 실행해본 뒤 추가 포스팅을 하도록 하겠습니다.



이번 테이블 트랜스포머 논문 리뷰를 통해 Table Detection을 수행할 때 필요한 데이터의 특성, 레이블링 방법, 생소한 평가지표까지 전체적인 흐름을 파악할 수 있었습니다. 본 논문은 2021년 발표된 '데이터셋' 중심 논문인 만큼, 다음 번에는 새로운 '모델 구조'를 제안하는 최신 논문을 리뷰하고 코드로 구현하는 작업을 수행해보고자 합니다.

수리링의 Table Detection 정복 과정을 지켜봐 주세요!

감사합니다 :-)

Transformers

지난번에 트랜스포머 논문을 처음부터 끝까지 열심히 읽고 리뷰를 포스팅했었습니다.

https://smartest-suri.tistory.com/48

 

딥러닝 | Attention is all you need - 트랜스포머(2017) 논문 리뷰

[참고] 본 포스팅은 수리링 본인이 Attention is all you need 논문을 처음부터 끝까지 직접 읽으며 분석하고 리뷰하여 작성했습니다. 불펌 절대 금지! 본문 내용에 잘못된 부분이 있다면 댓글 달아주

smartest-suri.tistory.com


오늘은 Transformer팀의 Huggingface 페이지를 방문해서 트랜스포머의 무궁무진한 발전가능성을 체험해보겠습니다.

https://huggingface.co/docs/transformers/task_summary

 

What 🤗 Transformers can do

Reinforcement learning models

huggingface.co

위 링크를 클릭하시면 Transformer huggingface 다큐멘테이션 페이지 중에서 Conceptual Guidelienes - What 🤗 Transformers can do 코너로 이동하는데요.

설정에서 언어를 KO로 바꾸시면 한국어로도 보실 수 있습니다. 번역이 어색해서 저는 영어로 봅니다.

트랜스포머는 자연어처리(NLP), 컴퓨터 비전, 오디오 및 음성 처리 작업에 사용할 수 있는 pre-trained된 최첨단(SoTA) 모델 라이브러리라고 밝히고 있습니다. 이 페이지에서 간단하게 트랜스포머의 멋진 기능을 체험해볼 수 있는 짧은 코드를 소개하고 있습니다. (보시면 아시겠지만. ... 짱 쉬워요)

이렇게 pipeline을 사용해서 pre-trained된 트랜스포머 모델의 여러 기능을 체험해볼 수 있도록 다양한 코드가 제공되고 있었어요. 저는 이 파이프라인 중에서 객체 탐지 기능을 골라 가지고 놀면서 기능 맛보기를 통해 트랜스포머와 더욱 친숙해지는 시간을 가져보았습니다.


파이프라인이란?

허깅페이스 파이프라인(Hugging Face Pipelines)은 자연어 처리(NLP) 작업을 쉽게 수행할 수 있도록 허깅페이스에서 제공하는 API입니다. 이 API를 사용하면 복잡한 모델 로드 및 전처리 작업 없이도 다양한 NLP 작업을 빠르고 간편하게 수행할 수 있습니다.

  •  pipeline은 transformers 라이브러리의 가장 기본 객체
  •  사용 전에 transformers 라이브러리 설치해야 함
!pip install transformers
from transformers import pipeline

객체 탐지 실험

여러 개의 pipeline 실험 중 객체 탐지를 골라서 포스팅하게 된 이유는, 제일 재밌었기 때문 + Table Detection 프로젝트를 앞두고 객체 탐지와 조금 더 친숙해지고자 하는 목적입니다.

1. 크리스마스 사진

트랜스포머 객체탐지 기능은 이미지 속에 있는 객체를 탐지해서 score(확률), label(객체 명), box(위치 pixel) 3가지 결과값을 반환합니다. 어떤 사진을 고를까 고민하다가 저는 이 정신없는 크리스마스 사진을 고르게 되었습니다.

출처 : 나무위키

일부러 좀 정신없는 사진을 골라봤어요. 트랜스포머도 과연 저처럼 이 사진이 정신없다고 생각할까요? 그리고 과연 이렇게 정신없는 사진의 객체를 몇개나, 얼마나 정확하게 탐지할 수 있을까요?

import requests
from PIL import Image

# 이미지 데이터 가져오기
url = "https://i.namu.wiki/i/--GbZ0ptaE0KF8OgUej9I_SN4erfOc_ueyHgtJipMB0scNAJRSio6uWMcFviEGKO0d0qSqwWhla7xGfiB5NYoQgAPSmh8TQW1AAuYljDuveZiAwd8kcbOV4mFFpCVz6CMZ9cBBym3rPK19df_Blbhw.webp"
image_data = requests.get(url, stream=True).raw
image = Image.open(image_data)

# 이미지 확인하기
import matplotlib.pyplot as plt
plt.imshow(image)
plt.axis('off')
plt.show()

먼저 이미지 데이터를 불러오고 matplotlib을 통해 이미지를 확인해 보았습니다. 원하는 다른 이미지가 있으시면 image url을 대체해서 사용하시면 됩니다. 이미지는 어떻게 생겼는지 위에서 이미 보여드렸으니 결과값은 생략하고 넘어갈게요.

# 객체 탐지
from transformers import pipeline
detector = pipeline(task = 'object-detection') # 객체 탐지 task 설정
preds = detector(url) # 객체 탐지 실행
preds = [{"score": round(pred["score"], 4),  
          "label": pred["label"],
          "box": pred["box"]} for pred in preds] # 탐지 결과 보기좋게 차례대로 딕셔너리/리스트화

# 결과 확인
print(f"총 {len(preds)}개의 객체가 탐지되었습니다!")
for pred in preds:
	print(pred)

위와 같이 간단하게 pipeline을 이용해서 객체 탐지를 실행합니다. 사진 속에 여러개의 객체가 탐지될 경우 알아보기 쉽게 score, label, box 결과값을 하나의 딕셔너리로 묶어준 다음, 리스트화 합니다. for문을 사용해서 preds 안에 어떤 결과가 있는지 하나씩 프린트를 해봤는데요.

짜잔! 이렇게 총 12개의 객체를 탐지한 것을 확인할 수 있었습니다. label을 확인해 보니, 시계도 있고 고양이도 있고 말도 있고 식물도 있고... 이렇게 텍스트로 결과를 확인하면 직관적이지 못하니, 가지고 있는 이미지 위에 score, label, box값을 그려서 결과를 확인해 보겠습니다.

from matplotlib.patches import Rectangle

plt.figure(figsize = (15,8))
fig, ax = plt.subplots(1)
ax.imshow(image)
for pred in preds:
    box = pred["box"]
    label = pred["label"]
    score = pred["score"]
    xmin, ymin, xmax, ymax = box["xmin"], box["ymin"], box["xmax"], box["ymax"]
    width, height = xmax - xmin, ymax - ymin
    # 사각형 만들기
    rect = Rectangle((xmin, ymin), width, height, linewidth=2, edgecolor='r', facecolor='none')
    # 사각형 추가하기
    ax.add_patch(rect)
    # 레이블 추가하기
    plt.text(xmin, ymin, f'{label} ({score})', bbox=dict(facecolor='yellow', alpha=0.5))

plt.axis('off')
plt.show()

matplotlib의 patches중 Rectangle 기능을 이용해서 간단하게 사각형을 그려보았어요. 결과는 다음과 같습니다.

벽장에 있는 시계(저는 있는줄도 몰랐음), 구석에 있는 말(역시 눈에 안띄어서 잘 몰랐음), 뒤에 있는 사람, 아래 있는 고양이, 식물, 테이블, 꽃병... 정말 잘 감지한 것을 확인할 수 있었습니다. 기대 이상으로 성능이 좋아서 무척 놀라웠어요. 

preds = sorted(preds, key = lambda x: x['score'], reverse = True)[:5]

이 번엔 요렇게 preds 리스트를 score value값을 기준으로 내림차순 정렬해서 top 5개만 남기고 플롯을 그려봤습니다.

역시 고양이가 최고..! 0.9995의 score로 가장 높은 탐지 스코어를 기록했습니다.


2. 겨울왕국 포스터

이번엔 새로운 사진으로 바꿔봤는데요. 겨울왕국 포스터를 가져와 봤습니다. url만 갈아 끼우면 되니 코드는 이번에는 생략하고 결과만 바로 보여드리겠습니다.

아쉽게도 이번엔 크리스마스만큼 좋은 결과를 보이지 못했네요. 4개의 객체를 탐지했는데 대체적으로 score가 낮은 편입니다. 왼쪽 아래에 있는 괴물도 person으로 탐지를 했고, 오른쪽 아래에 있는 순록(?)은 아예 탐지가 되지 않았습니다. 

이렇게 예측 결과가 좋지 못한 경우를 발견했을 때 그 이유는 무엇인지, 비슷한 다른 사례로 일반화가 가능한지, fine-tuning하여 발전시킬 수 있을지를 생각해 보면서 프로젝트로 디벨롭해 나가면 좋겠다는 생각이 들었습니다. 


3. 치맥 사진

이번엔 아래 치맥 사진을 이용해서 객체탐지를 실행해 보겠습니다. 저는 가장궁금했던 것이,

  1. 여러 개의 치킨 조각을 하나로 '치킨'이라는 음식으로 탐지할 수 있을까?
  2. 잔에 담긴 액체를 보고 '맥주'라고 추론할 수 있을까?
  3. 큰 기대는 없긴 한데, 후라이드랑 양념치킨 구분은 안되겠지..? 였어요.

출처 : 나무위키에 치맥 검색

이쯤 되면 똑같은 코드를 계속 치기 번잡하니 함수화를 해줘야 국룰입니다. url을 넣으면 몇개의 객체가, 어떤 객체가 탐지되었는지 print를 하고, 결과를 그려 plot을 보여주는 함수로 만들어 보았습니다.

def object_detect_plot(url):
    image_data = requests.get(url, stream=True).raw # 이미지 데이터 가져오기
    image = Image.open(image_data)
    detector = pipeline(task = 'object-detection')
    preds = detector(url)
    preds = [{"score": round(pred["score"], 4), "label": pred["label"], "box": pred["box"]} for pred in preds]

    print(f"총 {len(preds)}개의 객체가 탐지되었습니다!")
    for pred in preds:
        print(pred)
    
    plt.figure(figsize = (15,8))
    fig, ax = plt.subplots(1)
    ax.imshow(image)
    for pred in preds:
        box = pred["box"]
        label = pred["label"]
        score = pred["score"]
        xmin, ymin, xmax, ymax = box["xmin"], box["ymin"], box["xmax"], box["ymax"]
        width, height = xmax - xmin, ymax - ymin
        # 사각형 만들기
        rect = Rectangle((xmin, ymin), width, height, linewidth=2, edgecolor='r', facecolor='none')
        # 사각형 추가하기
        ax.add_patch(rect)
        # 레이블 추가하기
        plt.text(xmin, ymin, f'{label} ({score})', bbox=dict(facecolor='yellow', alpha=0.5))

    plt.axis('off')
    plt.show()
chicken_n_beer = "https://i.namu.wiki/i/2JQMZZIxjIeZpag74qgmIQvBrS9gcBy-w_iTkHgQ34V8pS63SaWqUTgnMZGxJykuwBdXXPLUr6IRv7jCsLnQlVI-t6L37ZTo3CLlGIaCjDnnThCMtCzm4l1QjC2wLva-mkj4CqNtE716a1mERKcn5A.webp"
object_detect_plot(chicken_n_beer)

결과는 아래와 같습니다.

  1. 여러 개의 치킨 조각을 하나로 '치킨'이라는 음식으로 탐지할 수 있을까? -> 개별 치킨을 도넛으로 인식함(ㅋㅋㅋㅋ)
  2. 잔에 담긴 액체를 보고 '맥주'라고 추론할 수 있을까? -> 그냥 컵으로 인식함
  3. 큰 기대는 없긴 한데, 후라이드랑 양념치킨 구분은 안되겠지..? 였어요. -> 도넛부터 해결을 해야....
  4. + 다이닝 테이블에 대한집착...

네.. 생각보다 결과가 좋지 못했습니다. fried chicken이라는 label 자체가 없는 것으로 판단이 되는데, 하나의 치킨 조각을 도넛으로 인식을 하고, 여러 개의 치킨이 담겨 있는 전체를 하나의 음식 객체로 탐지하지도 못하는 것 같아요.


결론

이미지 객체 탐지 (Image Object detection)를 실행해 본 결과, 성능이 무척 좋긴 하지만 명확한 한계점이 여러 가지 보였습니다. 이러한 한계점은 파인튜닝 또는 새로운 SoTA 모델 연구를 통해서 극복할 수 있겠죠? 딥러닝 관련 프로젝트 주제를 선정할 때 이렇게 기존 SoTA 모델의 파이프라인으로 여러 가지 실험을 해보면서 프로젝트 방향을 설정한다면, 좋은 아이디어가 빠르게 도출될 수 있을 것 같습니다.

재미있었던 트랜스포머 파이프라인 가지고놀기 실험은 이것으로 마무리 하겠습니다 :-)

다음 포스팅에서는 트랜스포머 모델 PyTorch 구현을 해보도록 할게요. 감사합니다!

 

 

 

 

[참고] 본 포스팅은 수리링 본인이 Attention is all you need 논문을 처음부터 끝까지 직접 읽으며 분석하고 리뷰하여 작성했습니다. 불펌 절대 금지! 본문 내용에 잘못된 부분이 있다면 댓글 달아주세요.


Transformer

Transformer

이전 포스팅에서 다루었던 LSTM과 GRU와 같은 새로운 모델들은 기존 RNN 모델의 Long-term Dependency, Exploding Gradient 문제를 해결하기 위해 고안되었었죠. 하지만 안타깝게도 근본적인 문제가 완전히 해결된 것은 아니었다고 해요. 그 이유는 RNN이나 CNN이 가지는 연쇄적인 계산구조 때문이었는데요. 따라서 Recurrent 구조가 아닌 새로운 구조의 모델로 Sequence Data를 다루고자 하는 시도가 계속되었다고 합니다. 그리고 2015년, 인공지능 역사에 한 획을 긋는 Attention이라는 개념이 새롭게 도입됩니다.

You got me looking for attention...?

간단하게 말하면, 어텐션이란 모든 기억을 동등하게 기억하지 않고 연관성 있는 기억에 집중해서 기억하도록 구조화하는 기법을 말합니다. 어텐션이 정말 획기적인 메커니즘이긴 했지만, 초기에는 RNN, CNN 구조와 함께 사용되었기 때문에 여전히 시퀀스의 길이가 길어질수록 같은 문제가 발생하는 한계가 있었는데요. 2017년 구글은 Attention is all you need이라는 정말 멋있는,,, 제목으로 Transformer (트랜스포머) 모델을 제안합니다. 트랜스포머 모델은 RNN, CNN 구조를 완전히 배제하고 오롯이 어텐션 그 잡채! 에만 집중하는 아이디어로 기존의 문제점을 기냥,, 해결해버렸습니다.

본 포스팅에서는 트랜스포머 논문을 처음부터 끝까지 직접! 읽으며 분석한 내용을 정리하고 공유하고자 합니다 :)

논문 출처 :  https://arxiv.org/pdf/1706.03762


초록 Abstract

먼저 논문의 전체적인 아이디어와 내용을 파악할 수 있는 초록을 읽어 보도록 하겠습니다.

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks that include an encoder and a decoder. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely.

기존 모델들의 인코더-디코더에는 복잡한 RNN 구조나 CNN 구조가 포함되어 있는데, 우리는 RNN/CNN구조를 완전히 배제하고 온전히 어텐션 메커니즘에만 기반한 새로운 네트워크 구조 '트랜스포머'를 제안한다! 라고 되어 있습니다. Attention is all you need이라는 논문 제목도 그렇고, Transformer이라는 모델 이름도 그렇고, 너무 멋있어서 소름이 돋습니다.

We show that the Transformer generalizes well to other tasks by applying it successfully to English constituency parsing both with large and limited training data.

트레이닝 데이터가 많든지 적든지간에 관계없이 트랜스포머가 영어 구문 분석에 굉장히 성공적으로 적용이 되었는데, 영어 구문 분석 뿐만 아니라 다른 과업에도 트랜스포머가 잘 일반화되어 적용될 수 있다는 것을 보여주겠다고 합니다.

이제 서론을 봅시다.



서론 Introduction

Recurrent neural networks, long short-term memory [13] and gated recurrent [7] neural networks in particular, have been firmly established as state of the art approaches in sequence modeling and transduction problems such as language modeling and machine translation [35, 2, 5]. 

RNN, LSTM, GRU같은 모델들은 언어모델이나 번역기같은 sequence modeling과 transduction problems에 특히 잘 적용되어 왔는데요.

they generate a sequence of hidden states ht, as a function of the previous hidden state ht−1 and the input for position t. This inherently sequential nature precludes parallelization within training examples, which becomes critical at longer sequence lengths, as memory constraints limit batching across examples. ...... The fundamental constraint of sequential computation, however, remains.

이런 RNN 구조의 모델들은 시퀀스가 길어질수록  어쩔 수 없이 맛탱이가 가버렸고..... 이런 문제를 해결하기 위해 factiorization trick이나 conditional computation같은 방법이 고안되기도 했지만, 결국 Recurrent 구조는 그대로였기때문에 근본적인 문제점은 여전히 해결되지 못한 상태였습니다.

Attention mechanisms have become an integral part of compelling sequence modeling and transduction models in various tasks, allowing modeling of dependencies without regard to their distance in the input or output sequences [2, 19]. In all but a few cases [27], however, such attention mechanisms are used in conjunction with a recurrent network.

이때 혜성처럼 등장한 어텐션 메커니즘은 서로간의 dependency를 계산하면서 입출력 시퀀스의 길이가 길어져도 학습이 잘 되도록 도왔는데요. 안타깝게도 문제점의 근원이 되는 Recurrent 구조가 여전히 그대로 사용이 되었기 때문에, 상황이 좀 나아지긴 했으나, 시퀀스 길이가 길어지면 또 같은 문제점이 발생했다고 합니다.... 이쯤 되니 '이거 그냥 Recurrent 구조 자체를 쓰지 말아야 겠다'는 생각을 슬슬 시작했던 것 같습니다.

In this work we propose the Transformer, a model architecture eschewing recurrence and instead relying entirely on an attention mechanism to draw global dependencies between input and output. ...

그래서 구글이 제안하는 트랜스포머는 입출력 사이의 Global dependency를 계산할 수 있도록 오롯이 어텐션 메커니즘에만 집중하고 Recurrence 구조를 완전히 배제한다고 합니다. 그렇게 했더니.. 학습도 잘되고... 성능이.. 쩐다고 하네요!



연구 배경 Background

연구 배경에서는 다양한 이전 모델들에 대해서 거론하고 있습니다.

언급된 주요 모델 중 4가지에 대해 찾아보았는데요.

  • [9] ConvS2S (2017): CNN 구조로 시퀀스 간의 종속성을 학습, 병렬 처리를 통해 효율성을 높인 모델
  • [16] Extended Neural GPU (2016): CNN 구조로 긴 시퀀스를 병렬로 처리하는 데 중점
  • [17] Neural GPU (2016): CNN 구조로 알고리즘을 학습하고 긴 시퀀스 데이터를 병렬로 처리할 수 있도록 설계
  • [18] ByteNet (2016): 깊고 확장 가능한 CNN 구조로 입력 시퀀스와 출력 시퀀스 간의 종속성을 효과적으로 학습

대부분 어텐션을 적용하지 않은 모델들이었습니다. 이 밖에도 대체로 RNN, CNN 구조를 사용한 기존 모델들에 대해서 언급을 하면서, 우리가 걔네보다 월등하다는 걸 증명하겠다!는 이야기를 하고 있습니다.

To the best of our knowledge, however, the Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequencealigned RNNs or convolution.

마지막으로 현재까지(발표 시점까지) 트랜스포머가 입출력 사이의 관계를 규명하기위해 self-attention 계산에만 온전히 집중하며, 연쇄적인 RNN이나 CNN 구조를 전혀 사용하지 않는 유일한! 모델이라고 거듭 강조하고 있습니다.

그럼 이제 본격적으로 모델 구조에 대해서 알아보겠습니다.



모델 구조 Model Architecture

관심있는 분이라면 한번쯤은 보셨을 트랜스포머의 구조도입니다. 처음 봤을때 저는 이게 도대체 뭘까 굉장히 심란했었는데요, 관련 자료를 열심히 찾아 읽고 논문도 계속 뒤져보고 하면서 한 번 이해하고 나니, 생각보다 심플한 구조구나- 느껴져 재밌었습니다.


3-1. 인코더 - 디코더

먼저 왼쪽 구조도는 인코더, 오른쪽 구조도는 디코더에 해당합니다. 구조 양옆에 N* 이라고 표시된 부분은 해당 작업을 N번 반복하겠다는 것을 의미합니다. 논문에서는 인코더와 디코더에서 모두 N = 6을 사용한다고 밝히고 있습니다.

  • 인코더 레이어는 2개의 하위 레이어로 구성되어 있습니다. 첫 번째 레이어는 멀티헤드 어텐션을 수행하며, 두 번째 레이어는 간단한 Feed-Forward 구조로 이루어져 있습니다. 두 하위 레이어는 ResNet에서 제안했던 잔차연결(Residual connection)으로 연결되는데, 각 하위 레이어의 아웃풋은 인풋과 더해진 뒤(add) 정규화(Norm)됩니다.
  • 이런 더하기 작업은 모든 레이어의 아웃풋이 같은 차원으로 전부 통일되기 때문에 가능합니다.
  • 모든 결과물의 차원을 논문에서는 512로 고정하고 있습니다. 차차 알아보겠지만 레이어 안팎으로 벡터끼리 서로 계속 더하는 일이 많기때문에, 모든 벡터의 shape과 차원을 동일하게 통일할 필요가 있습니다.

  • 디코더는 3개의 하위 레이어로 구성되어 있는데, 인코더와 마찬가지로 모든 하위 레이어는 Residual connection으로 연결됩니다.
  • 특히 첫 번째 하위 레이어에서 Masked 멀티헤드 어텐션을 사용하는 이유 cheating을 방지하기 위함입니다. 해당 내용은 뒤에서 더 자세히 살펴보도록 하겠습니다.

3-2. 어텐션

An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. 

어텐션을 하나의 함수의 관점에서 생각해봅시다. 함수는 입력을 받아 결과를 출력하잖아요? 어텐션 함수는 인풋으로 3가지를 받아요. 바로 query, key, value인데요. 이렇게 3가지 인풋을 받아서 맵핑이란 걸 해가지고 결과물을 출력(output)합니다. 인풋으로 사용된 query(Q), key(K), value(V)와 출력물 output은 전부 벡터 형태로 이루어져 있습니다.

여기서부터 저는 이런 의문이 들었습니다. 그래서 Q는 뭐고, K는 뭐고, V는 뭔데? 의문을 해결하기 위해 잠깐 순서를 건너뛰고 3-2 대신 3-5를 먼저 보겠습니다.


3-5. 포지셔널 인코딩 (Positional Encoding)

포지셔널 인코딩을 먼저 이해하면 좋습니다. 간단하게 Input은 'I am hungry'이라는 영어 문장이고, Output은 '나는 배가 고프다'라는 한국어 문장이라고 생각해 봅시다. 논문 초록과 서론에서 누누이 봤지만, 트랜스포머는 이 문장들을 순차적으로 입력받지 않잖아요. 그렇다면 트랜스포머는 이 정보들을 도대체 무슨 수로 sequence data처럼 핸들링할 수 있는 걸까요? 그걸 가능하게 해주는 것이 바로 포지셔널 인코딩입니다.

Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence. To this end, we add "positional encodings" to the input embeddings at the bottoms of the encoder and decoder stacks. The positional encodings have the same dimension dmodel as the embeddings, so that the two can be summed. There are many choices of positional encodings, learned and fixed [9].

영어든 한국어든 단어로 된 문장을 받았다면, 기본적인 임베딩 작업을 해서 문장을 벡터화 해야겠죠. 포지셔널 인코딩은 쉽게 말해 이 임베딩 벡터값에 '위치(position) 정보'를 더해주는 일입니다. 위의 구조도에 잘 보면 Input Enbedding과 Positional Encoding 사이에 더하기(+) 기호가 있지요. 물론 두 벡터를 더해줘야 하므로 인풋 임베딩과 포지셔널 인코딩의 shape는 당연히 같도록 설계되었습니다. 어쨌든 이렇게 두 정보를 더함으로써 인코더와 디코더에 위치 정보가 더해진 벡터가 제공되고, 덕분에 마치 유사 sequence data처럼 인식을 할수 있게 되는 겁니다. 또, 이렇게 완성된 벡터에 각각 서로 다른 weight를 걸어서 어텐션 레이어의 서로 다른 입력 Q, K, V가 되는 것입니다. 어떤 weight를 걸어야 최적일지 찾는 건 결국 컴퓨터가 우리에게 해주는 일이 되겠죠!

포지셔널 인코딩을 하는 방법은 다양한데, 트랜스포머는 위의 식과 같은 삼각함수 형태의 식을 취하고 있습니다. 임베딩 벡터 내의 각 차원의 인덱스가 짝수인 경우에는 사인함수의 값을 사용하고, 홀수인 경우에는 코사인 함수의 값을 활용합니다. 이렇게 해야만 하는 건 아니고, 이렇게 했더니 계산과 학습이 용이하면서 성능도 잘 나오더라! 정도로 나름 간단하게 설명을 하고 있습니다. 

https://velog.io/@gibonki77/DLmathPE

포지셔널 인코딩에 대해서 좀더 직관적인 이해가 필요하시면, 위의 포스팅을 참고하시는 것을 추천합니다. 정리가 엄청 잘돼있습니다.


3-2. 어텐션

그럼 다시 Attention 설명파트로 돌아오겠습니다. 먼저 우리가 기존의 전체 구조도에서 살펴본 멀티헤드 어텐션이란 'Scaled Dot-Product Attention'이라는 걸 여러 번 실행하는 것을 의미하는데요. 굉장히 직관적인 작명을 해서... 크기를 줄이는 Scale과 Dot-product(행렬곱 내적)이 사용되는 싱글 어텐션이라고 생각을 하면 됩니다. 

  • 먼저 Q와 K를 행렬곱 계산합니다. Q와 K는 shape이 같은 벡터입니다. 따라서 벡터 내작 계산을 하기 위해 K를 Transpose 합니다. 따라서 두 행렬을 내적한 결과로 행렬은 정방형이 됩니다. (shape이 (a, b)라고 하면, 결과는 (a, a))
  • 그 다음 벡터 안의 숫자값을 작게 줄이는 Scaling 작업을 해줍니다. 논문에서는 벡터 안의 숫자값을 작게 해줌으로써 vanishing gradient 문제를 방지할 수 있게 된다고 밝히고 있습니다.
  • 만약 디코더라면 치팅 방지를 위해 Mask 작업을 추가합니다.
  • 이제 거기다가 Softmax 함수를 걸어주면, 벡터 안의 값이 확률화 되면서 weigt metrix로 간주할 수 있게 됩니다.
  • 그렇게 해서 나온 결과 벡터를 마지막으로 V와 행렬곱 계산합니다. 이 때, 결과 벡터의 shape은 기존 Q, K, V와 동일하게 유지됩니다.((a,a)•(a,b)=(a,b)) 여기까지가 바로 'Scaled Dot-Product Attention' 싱글 어텐션입니다.

  • 트랜스포머는 멀티 헤드 어텐션을 이용합니다. 위에서 살펴본 'Scaled Dot-Product Attention' 형태의 싱글헤드 어텐션을 h번 각각 수행하여 concat해서 이어 붙여준다는 건데요. 예를 들어서 논문에서는 512차원의 벡터를 다루고 있으므로, 이걸 64차원씩 8세트로 나누어서 각각 어텐션을 따로 수행하고 나서 Concat, 즉 이어 붙여서 다시 512차원으로 만들어 준다는 거예요.
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.
  • 멀티헤드 어텐션은 트랜스포머 모델의 성능을 높이는 핵심 요소 중 하나인데요. 그 이유를 살펴보겠습니다.
  • 먼저 Single head 어텐션은 하나의 문장에서 각 단어의 중요도를 계산한 후, 이 중요도를 이용해 모든 단어의 정보를 결합하여 하나의 벡터를 출력합니다. 이 과정에서 다양한 단어의 정보가 섞이게 되어 특정 단어의 중요한 세부 정보가 희석될 수 있는 가능성이 있고, 논문에서는 이것을 'averaging'이라고 부르고 있습니다. 중요한 패턴이나 특이점이 평균화되면서 사라지게 된다는 것이죠.
  • 반면 Multi head 어텐션은 여러 개의 어텐션 헤드를 사용하여 각 헤드가 특정 위치나 특징에 더 집중할 수 있게 돕고, 다양한 정보를 더 풍부하게 학습할 수 있게 됩니다. 즉 다양한 관점에서 입력 데이터를 이해하고 처리할 수 있게 되는 건데요. 이를 통해 모델은 입력 데이터의 여러 측면을 동시에 학습하고, 중요한 정보를 놓치지 않게 됩니다. 복잡하고 다양한 패턴을 효과적으로 인식하고 처리할 수 있을 뿐만 아니라 모델의 표현력도 향상시키는 거죠. 그래서 멀티헤드 어텐션이 트랜스포머 모델의 성능을 크게 향상시키는 핵심 요소라는 겁니다.

트랜스포머에서 어텐션은 크게 3곳에서 적용됩니다.

The encoder contains self-attention layers. In a self-attention layer all of the keys, values and queries come from the same place, in this case, the output of the previous layer in the encoder. 
  • 먼저 인코더는 self-attention layer를 사용하는데, 위에서 살펴봤듯이 인코더에 맨 처음 들어오는 입력값은 임베딩과 포지셔널 인코딩된 값이 더해진 벡터입니다. 이 벡터에 각각 서로 다른 weight가 걸려서 Q, K, V라는 입력값으로 들어오게 되지만, 실제로는 전부 같은 값을 가진 하나의 벡터로부터 근원합니다. 논문에서도 'keys, values and queries come from the same place'라고 밝히고 있죠. 
Similarly, self-attention layers in the decoder allow each position in the decoder to attend to all positions in the decoder up to and including that position. We need to prevent leftward information flow in the decoder to preserve the auto-regressive property. We implement this inside of scaled dot-product attention by masking out (setting to −∞) all values in the input of the softmax which correspond to illegal connections. See Figure 2.
  • 디코더에서도 똑같이 self-attention layer를 사용합니다. output에 해당하는 문장을 임베딩한 값과 포지셔널 임베딩한 값을 더한 벡터에 서로 다른 weight가 걸려 Q, K, V가 되고, Masked 작업을 추가한 멀티헤드 어텐션을 수행하죠. 그림의 2번에 해당합니다.
  • 우리가 마스크를 쓰면 마스크 아래 얼굴이 가려져서 보이지 않는 것처럼, 마스킹 작업은 어떤 값이 보이지 않게 가려버리는 것을 말합니다. 여기서는 벡터에서 마스킹할 부분을 마이너스 무한대로 발산하는 -inf값으로 바꿔버리는데, 그러면 이 -inf값이 다음 단계의 softmax 함수를 지나면서 0값을 가지게 됩니다.

참조

  • 기존의 RNN 모델들은 시퀀스가 순차적으로 입력되기 때문에, 앞쪽부터 순차적으로 업데이트 되어온 hidden state를 다음 시퀀스에 제공하면서 sequence 예측을 합니다. 하지만 트랜스포머 모델은 데이터가 순차적으로 제공되지 않고 한번에 제공됩니다. 따라서 현재 시점보다 뒤에 올 시퀀스의 정보까지 알 수 있게, 즉 'cheating'을 할 수 있게 되는 거죠.
  • 논문은 디코더에서 leftward information flow를 방지해야 한다고 언급합니다. 마스킹은 참조용 그림에서 보이는 것처럼 벡터의 대각선 왼쪽 아래 부분을 아예 0값으로 만들어버리고, 그래서 현재 시점보다 뒤에 있는 시퀀스를 참조하지 않도록 돕습니다. 쉽게 말하자면 현재 토큰보다 나중에 해당하는 토큰 값이 계산에 포함되는 부분을 모두 가려버린 것입니다.
In "encoder-decoder attention" layers, the queries come from the previous decoder layer, and the memory keys and values come from the output of the encoder. This allows every position in the decoder to attend over all positions in the input sequence. This mimics the typical encoder-decoder attention mechanisms in sequence-to-sequence models such as [38, 2, 9].
  • 마지막으로 그림 3번에 해당하는 어텐션입니다. 이 어텐션에도 Q, K, V가 필요하겠죠.
  • 먼저 디코더의 첫 번째 하위레이어를 지난 결과물이 Q가 됩니다. (queries come from the previous decoder layer) 그리고 인코더의 최종 결과물에 서로 다른 weight가 걸려서 각각 K, V,가 되고요. 이 결합 메커니즘을 통해 디코더의 각 위치가 입력 시퀀스의 모든 위치를 참조할 수 있게 됩니다.
  • 즉, 디코더의 특정 위치에서 다음 토큰을 예측할 때, 입력 시퀀스 전체의 정보를 활용할 수 있게 되는 것입니다. 이는 시퀀스-투-시퀀스(sequence-to-sequence) 모델에서 일반적으로 사용되는 인코더-디코더 어텐션 메커니즘과 유사한데요. 덕분에 디코더가 보다 정확하고 문맥에 맞는 출력을 생성할 수 있겠습니다.

3-3. Feed-Forward 네트워크

이전에 살펴본 바와 같이 인코더와 디코더는 각각 2개, 3개의 하위 레이어로 구성되어 있는데, 마지막 하위 레이어는 feed-forward 네트워크로 구성되어 있으며, 활성함수로는 ReLU가 사용됩니다. 레이어마다 사용된 웨이트는 모두 다르다고 밝히고 있습니다.


3-4. 임베딩 & 소프트맥스

  • input과 output 토큰을 벡터화하기 위해 learned embedding을 사용하는데, 이 임베딩에 필요한 weight matrix는 같은 것을 쓴다고 밝히고 있습니다. 또한 디코더 결과물을 선형 변환하는 과정에서도 같은 weight matrix를 쓴다고 합니다. 즉, 아래 그림에 빨간색으로 표시한 3곳에서 모두 같은 가중치 행렬을 사용합니다.

  • 디코더의 마지막 feed-forward를 지난 결과물은 linear transformation과 softmax를 차례대로 거쳐 다음 토큰의 probabilities를 예측하는 아웃풋이 됩니다.

3-5. 포지셔널 인코딩

위에서 미리 봤으므로 생략



Why self attention

4장에서는 Self-attention의 장점을 recurrent, convolution 구조와 비교하여 크게 3가지 측면에서 비교합니다.

One is the total computational complexity per layer. Another is the amount of computation that can be parallelized, as measured by the minimum number of sequential operations required. The third is the path length between long-range dependencies in the network.
  1. 레이어마다 발생하는 계산의 복잡도가 상대적으로 낮아 효율적입니다.
  2. 병렬화가 용이해 동시에 많은 계산을 수행할 수 있습니다.
  3. 입력과 출력 위치 간의 경로 길이가 짧아 장기 의존성을 더 쉽게 학습할 수 있습니다.
Learning long-range dependencies is a key challenge in many sequence transduction tasks. One key factor affecting the ability to learn such dependencies is the length of the paths forward and backward signals have to traverse in the network. The shorter these paths between any combination of positions in the input and output sequences, the easier it is to learn long-range dependencies [12]. Hence we also compare the maximum path length between any two input and output positions in networks composed of the different layer types.

n이 시퀀스의 길이, d가 차원의 크기, k가 convolution에서 커널의 사이즈, r이 길이가 제한된 self-attention에서 이웃의 사이즈를 의미할 때 계산의 복잡도를 비교한 표입니다. Self-attention 레이어는 모든 위치를 일정한 수의 순차적 연산으로 병렬 연결할 수 있기 때문에 Recurrent, Convolution 구조보다 훨씬 적은 비용으로 계산을 처리할 수 있습니다.

특히 길이가 제한된 self-attention이란, 입력 시퀀스의 각 위치가 특정 범위 내의 이웃 위치들만 제한적으로 참조하여 어텐션을 계산하는 것을 의미합니다. 예를 들어 시퀀스 길이 n = 100이고 길이 제한 범위 r = 5인 경우, 일반적인 self-attention에서는 각 위치가 99개의 다른 위치와 전부 상호 작용하지만, 제한된 self-attention에서는 각 위치가 최대 10개의 이웃 위치(왼쪽 5개, 오른쪽 5개)와만 상호 작용합니다. 딱 봐도 계산량이 확 줄어서 효율적인 장점이 있겠죠. 특히 입력 시퀀스의 길이가 매우 길고 계산 자원이 제한된 상황에서 유리할 수 있다고 합니다.

추가적으로 self-attention을 사용한 모델은 해석이 조금 더 용이한 장점이 있다고 합니다.



학습과 결과 Training / Results

학습과 결과 부분은 가볍게 읽어만 보고, 자세한 리뷰는 생략하겠습니다.

영어->독어 번역, 영어->불어 번역 문제에서 다른 기존의 SOTA 모델들과 비교하여 월등한 최고 성능을 보여주었다는 것이 핵심입니다.



결론 Conclusion

결론에서는 앞으로 트랜스포머가 언어 번역뿐만 아니라 이미지, 오디오, 비디오와 같은 대용량 입출력 처리를 할 수 있도록 어텐션 메커니즘을 더 연구하고 발전시켜 나가겠다고 밝히며, 트랜스포머에 대한 자부심과 앞으로에 대한 기대감으로 마무리를 하고 있습니다.

2017년에 발표되었던 논문인 만큼 2024년인 현재까지 트랜스포머는 많은 발전에 발전을 거듭하였고, 최신 생성형 모델의 근간이 되고 있습니다. 어느 분야든 마찬가지겠지만 특히 딥러닝 분야에서 기존의 문제점을 해결하기 위한 새로운 아이디어를 떠올리고 그를 구현해내는 이런 멋진 작업물들을 볼 때면 정말 경이롭습니다. 이번 논문 리뷰를 통해서 트랜스포머의 기본 개념과 원리, 구조에 대해 파악할 수 있어서 영광이었습니다.

이로서 Attention is all you need, 트랜스포머 논문 리뷰를 마치겠습니다. 감사합니다 :)

+ Recent posts