Transformer  Attention all you is need 논문에서 제안된 모델 구조로, RNN  long-term-dependency 의 한계점을 극복하기위해 제안된 아키텍처입니다. (은닉 상태를 통해 과거 정보를 저장할때, 문장 길이ㅏ 길어지면 과거 정보가 마지막시점까지 전달되지 못하는 현상)트랜스포머가 출현함으로써 자연어 처리 분야는 획기적으로 발전되었으며, BERT, GPT3, T5등과 같은 혁명적인 아키텍처가 발전하는 기반이 되었습니다.

트랜스포머는 RNN에서 사용한 순환 방식을 사용하지 않고, 순수하게 어텐션만 사용한 모델이며,셀프 어텐션이라는 특수한 형태의 어텐션을 사용합니다.

트랜스포머는 다음과 같이 인코더와 디코더가 결합된 형태를 가진 모델입니다. 먼저 인코더에 입력 문장(원문)을 입력하면 인코더는 입력문장의 표현을 학습시키고, 그 결과를 디코더로 보냅니다. 디코더는 인코더에서 학습한 표현결과를 입력받아 사용자가 원하는 문장을 생성합니다.

가령 영어를 프랑스어로 번역하는 과제가 있다고 하면, 다음의 그림은 영어 문장을 입력받은 인코더를 나타낸 것입니다. 인코더는 영어 문장을 표현하는 방법을 학습한 다음, 그 결과를 디코더에 보냅니다. 인코더에서 학습한 표현을 입력받은 디코더는, 최종적으로 프렁스러오 번역한 문장을 생성합니다.

트랜스포머는 N개의 인코더가 쌓인 형태입니다. 인코더에 결괏값은 그 다음 인코더의 입력값으로 들어갑니다. 가장 마지막에 있는 인코더의 결괏값이, 입력값의 최종 표현 결과가 됩니다. 입력값으로 입력 문장을 넣게되고, 최종 인코더의 결과값으로 입력 문장에 따른 표현 결과를 얻게됩니다. N=6 이라는 말은 인코더 6개를 누적해 쌓아올린 형태를 표현한 것입니다.

인코더의 세부 구성요소를 표현하면 다음과 같습니다. 모든 인코더 블록은 형태가 동일하며, 그림에 나와있는 두 가지 요소로 구성됩니다. 멀티헤드 어텐션 이해하기 전에, 셀프 어텐션의 작동원래를 살펴보면,

이 문장에서 it  dog  food 를 의미할 수 있습니다. 그러나 문장을 자세히 살펴보면 it dog 를 의미한다는걸 알 수 있죠. 위의 문장이 주어질 때, 모델은 it dog 인것을 어떻게 알 수 있을까요? 이때 셀프어텐션이 필요합니다.

이 문장이 입력되었을 때, 모델은 가장 먼저 단어 ‘A’의 표현을, 그다음으로 단어 ‘dog’의 표현을 계산한다음, ‘ate’라는 단어의 표현을 계산합니다. 각 단어를 계산하는 동안, 각 단어의 표현들은 문장안에 있는 다른모든단어의 표현과 연결해 단어가문장내에서 갖는 의미를 이해하게 되는 것입니다. 어텐션을 사용할 때 헤드 한 개만 사용한 형태가 아닌, 헤드 여러 개를 사용한 어텐션 구조를 멀티헤드어텐션이라 부릅니다.

트랜스포머는 RNN과 같이 순환 구조를 따르지않고, 단어 단위로 문장을 입력하는 대신에 문장 안에 있는 모든 단어를 병렬 형태로 입력하게 됩니다. 그러나 병렬로 연결하기 때문에 한가지 문제가 발생하는데, 단어의 순서 정보가 유지되지 않은 상태에서 문장의 의미를 어떻게 이해할 수 있냐는 점입니다. 문장의 의미를 이해하기 위해서는 단어의 순서가 중요하기 때문에, 트랜스포머에 단어의 순서 정보또한 제공하게 됩니다.

 

다음으로 디코더에 대해서는 간략히 설명하도록 하겠습니다.

디코더는 인코더의 결과값을 입력값으로 사용하게 되는데요.

디코더역시 인코더처럼 N개를 누적해 쌓을 수 있습니다. 디코더 출력값은 그 위에 있는 디코더의 입력값으로 전송되며, 인코더의 출력값은 모든 디코더에 전송이 되게 됩니다. , 디코더는 이전 디코더의 입력값과 인코더의 출력값(표현) 이렇게 2가지를 입력데이터로 받습니다.

원하는 문장을 생성하는 과정을 들여다보면, 시간 스텝 1에 시작을 알리는 <sos>가 입력되며 첫번째 단어인 je을 생성합니다. 이후 je 와 표현 정보 넣고 다음 문장을 생성합니다. 이 과정을 반복합니다.

이후 인코더와 마찬가지로 디코더 입력값에 위치 인코딩값을 더해 디코더의 입력값으로 사용합니다.

하나의 디코더 블록은 다음과 같은 요소들로 구성됩니다. 디코더 블록은 인코더 블록과 유사하게 서브레이어에 멀티헤드~와 피트포워드 네트워크를 포함합니다. 그러나 인코더와 다르게 두가지 형태의 멀티헤드어텐션을 사용합니다. 그 중 하나는 어텐션 부분이 마스크된 형태입니다.

앞서 언급했던 셀프 어텐션은 각 단어의 의미를 이해하기 위해 각 단어와 문장 내 전체 단어를 연결했었던것과 다르게, 디코더에서는 문장을 생성할 때 이전 단계에서 생성한 단어만을 입력문장으로 넣는다는 점이 중요합니다. , 이런 데이터의 특성을 살려 모델학습을 진행해야하는 것입니다. 모델이 아직 예측하지않은 오른쪽의 모든 단어를 마스킹하고, 학습을 진행하게 됩니다.  

이러한 마스킹 작업은 셀프 어텐션에서 입력되는 단어에만 집중해, 단어를 정확하게 생성하는 긍정적인 효과를 가져옵니다. 디코더는 vocab 에 대한 확률 분포를 예측하고, 확률이 가장 큰 단어를 선택하는 방식입니다.

최종적으로 인코더와 디코더를 결합한 형태는 다음과 같습니다.

다시 정리하면, 입력 문장을 입력하면 인코더에서는 해당 문장에 대한표현을 학습하고, 그 결과값을 디코더에 보내면 디코더에서 타깃 문장을 생성합니다. 또한 우리는 손실 함수를 최소화하는 방향으로 트랜스포머 네트워크를 학습시킬 수 있겠습니다.

 

지금까지 Transformer 모델이 무엇인지에 대해 간략히 살펴보았습니다.

Encoder 만을 사용한 모델은 AutoEncoding Model, decoder 만을 사용한 모델을 Auto regessive Model, Encoder  Decoder 를 모두 사용한 모델은 Sequence to Seqence model 이라고 부릅니다. 그 외에도 Multimodal Model, Retrieval-base model 등 다양한 종류가 존재합니다.

Decoder 에 기반한 모델,  Auto regressive 모델에는 GPT, GPT2, Transformer-XL, CTRL, XLNet 등이 있고, Encoding 에 기반한 모델에는 BERT, ALBERT, RoBERTa, XLM, EBECTRA 등이 있습니다.

이 중에서 저희가 오늘 집중해 살펴볼 모델은 transformer-Encoding based 모델인 BERT  XLM 입니다.

BERT 는 가장 널리 사용되는 고성능 텍스트 임베딩 모델로, Bidirectional Encoder Representations from Transformers 의 약자입니다. 다양한 자연어 처리 태스크 분야에서 가장 성능이 뛰어나며, 자연어 처리가 전반적으로 한걸음 나아가는데 이바지 한 모델입니다.  BERT 18년에 논문이 공개된 구글의 최신 Language Representation Model 이며, 말씀드렸듯이 인코더 구조만을 활용한 언어 모델입니다.

BERT가 성공한 주된 이유는 문맥을 고려한 임베딩 모델이기 때문입니다. 그렇다면 문맥을 고려했다는 의미가 무엇일까요? 다음 두 문장을 통해 문맥 기반 임베딩 모델과문맥 독립 임베딩 모델의 차이를 이해해보도록 하겠습니다.

A 문장과 B 문장을 보면, 두 문장에서 파이썬 단어의 의미가 서로 다르다는 것을 알 수 있습니다. A 문장에서 파이썬이라는 단어는 뱀의 한 종류를의미하고, B 문장에서 파이썬이라는 단어는 프로그래밍 언어를 의미합니다. 워드투벡터와 같은 임베딩모델을 사용해 두 문장에서 파이썬이라는단어에 대한 임베딩을 얻는경우, 두 문장에서 동일한 단어가 쓰였으므로 동일표현. 반면 BERT는 문맥기반. 문맥이해후 다음문맥에따라 임베딩생성. 따라서 서로다른임베딩 제공.

그렇다면 BERT는 어떻게 작동하는것일까요?

먼저 A 문장 살펴봅시다.

 BERT는 모든 단어의 문맥상 의미를 파악하기 위해 문장의 각 단어를 문장의 다른 모든 단어와 연결시켜 이해합니다.파이썬 문맥상 의미를, BERT는 파이썬이라는 단어를 가져와서 문장의 다른 모든 언어와의 관계 기반 이해를 시도합니다. 따라서 BERT는 파이썬이라는 단어와물었다라는 단어의 강한 연결관계 파악후 뱀의 한 종류 의미 파악이 가능하게 되는 것입니다.

B 문장또한 마찬가지로 모든 단어를 연결합니다. 이를 통해 B 문장의 파이썬이, 프로그래밍이라는 단어와 관련있음을 인지.

BERT L, H, A 파라미터에 따라 성능 및 버전이 달라지게 되는데, 여기서 Layer  Transformer 블록의 숫자이고, H hidden size, A Transformer Attention block 숫자입니다. , L, H, A 가 크다는 것은 블록을 많이 쌓았고, 표현하는 은닉층이 크며, Attention 개수를 많이 사용하였다는 뜻입니다. 블록을 n번 쌓았다는 의미는 즉 입력 시퀀스 전체의 의미를 n번만큼 반복적으로 구축하는 것을 의미합니다.

, 앞서 잠시 언급드렸듯 생성된 Token Emdedding 과 함께, 각 토큰의 위치정보를 임베딩하는 Positional Embedding , 문장을 구분하는 segment embedding 까지 총 3개의 임베딩을 결합하여 임베딩을 표현합니다. 

BERT를 각 Task에 쓰기위한 예시는 다음의 그림과 같습니다.
(a)
는 문장 쌍 분류 문제로 두 문장을 하나의 입력으로 넣고 두 문장간 관계를 구한다.
(b)
는 한 문장을 입력으로 넣고 문장의 종류를 분류하는 문제이다.
(c)
는 문장이나 문단 내에서 원하는 정답 위치의 시작과 끝을 구한다.
(d)
는 입력 문장 Token들의 개체명(Named entity recognigion)을 구하거나 품사(Part-of-speech tagging) 를 구하는 문제이다. 다른 Task들과 다르게 입력의 모든 Token들에 대해 결과를 구한다.

다음으로 BERT의 사전학습에 대해 설명드리겠습니다. 사전학습이란 무엇일까요.

모델을 하나 학습시켜야한다고 가정해봅시다. 일단 특정 태스크에 대한 방대한 데이터셋으로 모델을 학습시키고 학습된 모델을 저장합니다. 그 다음, 새 태스크가 주어지면 임의 가중치로 모델을 초기화하는대신, 이미 학습된 모델의 가중치로 모델을 초기화합니다. , 모델이 이미 대규모 데이터셋에서 학습되었으므로 새 태스크를 위해 새로운 모델로 처음부터 학습시키는 대신 사전학습된 모델을 사용하고, 새로운 태스크에 따라 파인튜닝하는 것입니다.

BERT 에서는 MLM NSP 라는 두 가지 태스크를 이용해 거대한 말뭉치를 기반으로 사전학습, 자가 지도 학습이 이루어집니다. MLM Masked Language Model, NSP Next-sentence Prediction , 의 약자입니다.

간략히 설명하면, MLM 이란, 문장을 고의로 훼손시킨 후 이를 소스 문장으로 복원하는 방법론으로, 해당 과정에서는 입력문장의 15%에 해당하는 토큰을 임의로 선택하여, 선택한 토큰 중 80%  MASK 토큰으로, 10%는 임의의 다른 토큰으로, 그리고 10%는 기존 토큰 그대로 두는 방식으로 훼손시킵니다. 즉 레이블이 없는 단일 언어 말뭉치에서, 기존 문장을 고의로 훼손시키고, 소스 문장으로 복원함으로써, 언어에 대한 양방향적 문맥을 파악할 수 있게됩니다.

NSP란 입력문장을 구성할 때, 50%는 기존의 순서대로 ㅇㄴ속된 문장을, 50%는 임의로 선택된문장을 연결함으로써 두 문장간의 문맥적 의미를 파악하는 작업을 의미합니다. 두 문장이 연속된문장일때는 1, 연속되지않은 문장일때는 0을 도출하게함으로써 문장간 연관성이 타당한지를 판별하는 작업을 학습합니다.

이렇게 사전학습을 마친 단어 임베딩은 말뭉치의 의미적, 문법적 정보를 충분히 담고있어, 훈련되지 않은 언어에 대해서도 우수한 수행능력을 보이며, 다운 스트림 테스크를 수행하기위한 파인튜닝 추가학습을 통해 임베팅을 다운스트림 태스크에 맞게 업데이트 하는 방식으로 이루어집니다. BERT가 등장한 이후로는 특정 자연어 처리 관련 문제를 풀기 위한 연구의 방향성이 사전 학습된 모델을 어떻게 활용할 것인가로 바뀌고 있다고 합니다.

XLM 또한 transformer-인코더 베이스의 모델입니다. 이때 BERT에서 활용된 MLM 뿐 아니라, CLM, TLM 을 추가적으로 활용하여 단일 언어 표현을 완화하고 다양한 언어, 즉 다국어에 대해 모든 문장을 공유 임베딩 공간으로 인코딩 할 수 있는 범용 교차언어 모델을 구축할 수 있게되었습니다. XLM 은 다양한 언어에 대해 공일한 공유 어휘를 사용합니다. 이는 모든 언어의 토큰에 대한 공통된 임베딩 공간을 설정하는데 도움을 줍니다.

CLM이란 이전 토큰들을 기반으로 다음 토큰을 예측하는 작업을 의미하며, 모델은 훈련과정에서 확률 p를 모델링 합니다. , XLM 모델은CLM 을 학습하는 과정에서, 이전토큰을 통해 다음 토큰을 예측함으로써 문장 구조에 대한 이해를 얻게됩니다.  

TLM이란 병렬 말뭉치에 존재하는 소스 문장과 타겟문장을 하나의 입력으로 연결한 후, LML과 같이 문장 일부를 MASK로 치환하고 이를 소스문장으로 복원하는 작업을 의미합니다. 이를 통해 모델은 서로 다른 언어간의 연관성을 더 잘 파악하게 됩니다.

, XLM은 여러 언어데이터를 활용한 MLM CLM, TLM 학습을 통해 여러 언어에 대한 교차언어 정보를 학습하게 됩니다.

이러한 XLM 을 이용한 다국어 언어 모델은 일반적인 다운스트림 작업에서 더 나은 결과를 얻는데 도움이 되고, 유사한 높은 리소스에 대한 학습을 통해, 낮은 리소스 언어에 대한 모델의 품질을 개선할 수 있습니다.

 

 

감사합니다.

 


이 모델링을 활용한 연구를 확인하고 싶다면 아래 링크로 가주세요. 

https://checherry.tistory.com/109

 

[NAACL] Transformer model을 이용한 자연어처리 최신 논문 / Multilingual Language Models Predict Human Reading Behavi

2021년도 동계 저널클럽 활동을 하며, 발표한 자료입니다. 제가 오늘 함께 공유하고자 하는 논문은 NAACL 저널에 기고된 Multilingual Language Models Predict Human Reading Behavior 입니다. https://aclantho..

checherry.tistory.com

 

사실 제가 자연어 분야를 제 주요 연구주제로 하고싶은것은 아닌데... 자연어 분야를 계속 찾아보게 되네요.

다양한 분야를 알게되는것이니, 좋죠 뭐!!

다음에는 뇌종양 segmentation 과 관련한 논문을 리뷰해볼 예정입니다!!

(저는 뇌종양에 관한 연구를 하고싶습니다. )

반응형

이번에 읽은 논문은 ELSEVIER _ Medical Image Analysis 에 기고된

Accurate brain age prediction with lightweight deep neural networks 논문입니다.

https://www.sciencedirect.com/science/article/pii/S1361841520302358

 

Accurate brain age prediction with lightweight deep neural networks

Deep learning has huge potential for accurate disease prediction with neuroimaging data, but the prediction performance is often limited by training-d…

www.sciencedirect.com

 연구의 목표는 크게 2가지 입니다. 

1. T1-weighted-MRI 3D 이미지를 이용한 뇌연령 예측

2. Brain-age delta 의 확인

Brrain-age delta는 예측된 뇌의 나이와 실제 나이의 차이를 의미하는데요,

Brain-age delta 는 알츠하이머 등의 병의 진단에 있어 효과적인 바이오마커입니다.

 

연구에서 사용한 데이터셋은 UK-Biobank, PAC2019 의 2가지 이며,

두 데이터셋 모두 T1-weighted-structural MRI 3D brain image 를 제공합니다.

 

아래의 이미지 T1-weighted MRI 의 예시입니다.

MRI는 수집 및 처리하는 방식에 따라 다양한 종류로 나뉘는데, 그중에서도 T1-weighted MRI image는, T1 강조기법을 사용한 MRI 종류힙니다.

T1 강조영상은 짧은 TR과 짧은 TE를 이용한 스핀에코 기법으로, 조직의 T1 이완시간의 차이를 신호차이로 반영하는 기법입니다. 짧은 TR 을 사용함으로써 조직 간 종축 자기화의 회복정도가 크게 차이나게 되는데, 이를 신호 차이로 반영하는 기법입니다.

 

모델로는 Simple Fully Convolutional Network, SFCN 을 사용합니다. 

즉, VGGnet을 base로 하여 3D CNN 을 이용해 모델링을 합니다. (기존의 2D VGGnet을 3D VGGnet 으로 변경함)

논문에서는 항상 3x3 필터를 이용해 convolution 을 하여, 보다 파라미터를 적게생성하고 층을 늘리는 lightweight 전략을 세웠습니다. 

또한, 뇌연령 예측임에도 회귀 분석을 한 것이 아니라, 각 데이터셋별 1년, 2년 단위로 target값을 끊어서 총 40개의 구간(Class)으로 연령대를 만들어서, 다중분류를 하였습니다. (softmax 이용)

 

연구진은 단일 모델뿐 아니라, 다양한 접근 방식을 비교해가며 다양한 모델을 만들었는데요.

한가지 예로, 3D image 인 MRI를 여러 기법으로 전처리하여, 한 MRI 이미지에서 a linear image, non linear image, GM image, WM image 의 네가지 타입의 이미지를 추출하고, 각 이미지들을 복합적으로 이용해 뇌연령을 예측합니다.

아래의 매트랩에서 각 4가지 타입의 이미지데이터에 대해, 모델을 5개씩 만들어 예측값과 실젯값의 correlation 결과를 분석하였음을 확인할 수 있습니다. 

이때 5개의 모델은 모두 같은 아키텍처를 이용해 하이퍼파라미터만 다르게하여 학습한 모델로, (파라미터만 다르게)

각각의 모델에서 예측한 결과값의 mean으로 앙상블 모델을 만든것을 확인할 수 있습니다.

맨 아래 ensb 이라고 표시된 그림이 앙상블 했을때의 correlation 결과값인데요. 모든 데이터셋에서 0.9 이상의 결과를 얻은 것을 확인할 수 있었습니다.

이 결과값은 모델의 예측값과 실제값의 Stability 가 보장이 된다는 것을 확인할 수 있는 결과이며,

동시에 다양한 데이터를 이용해 정확도를 높이기 위함으로, 논문에서는 이 모델을 Semi-multimodal model 이라고 부릅니다.

뇌연령 예측 연구에서, 대개 나이가 상대적으로 어린 피험자는 나이가 더 높게 나오고, 나이가 상대적으로 많은 피험자는 나이가 더 낮게 예측되는 경향이 있는데,

연구진들은 이러한 Bias를 Correction 해주었습니다. 그림1 -> 그림2 -> 그림3 으로 갈수록 correction이 된 것을 확인할 수 있습니다.

 

결과적으로 선행 모델보다 높은 성능을 보이며, 적은 데이터셋을 학습시킬때도 성능이 좋게 나올 수 있도록 모델을 비교하며 시도하였습니다. 또한, 최종 모델은 뇌연령뿐아니라 성별예측에서도 높은 정확도를 보였습니다.

 

이상!! 

반응형

2021년도 동계 저널클럽 활동을 하며, 발표한 자료입니다.

 

제가 오늘 함께 공유하고자 하는 논문은 NAACL 저널에 기고된

Multilingual Language Models Predict Human Reading Behavior 입니다.

https://aclanthology.org/2021.naacl-main.10/

 

Multilingual Language Models Predict Human Reading Behavior

Nora Hollenstein, Federico Pirovano, Ce Zhang, Lena Jäger, Lisa Beinborn. Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies. 2021.

aclanthology.org

 

, 인간의 읽기 행동을 예측하는 다국어 언어 모델의 개발이 논문의 주제인 것인데요.

여기서 예측하고자하는 인간의 읽기 행동이란, 자연 상태에서 피험자가 문장을 읽을 때, 문장의 어떤 단어, 어느 위치에 피험자의 시선이 오래 머무는지를 의미합니다.

정리하면, 이 연구는 문장 data, 해당 문장을 읽을때의 Eyetracking data를 이용하여 문장이 주어졌을 때 피험자의 시선이 어느곳에 주요하게 머물지를 연구하는 것이라고 볼 수 있겠습니다.

제가 이 논문을 선정한 이유는, “자연 읽기 상태 뇌파의 자연어로의 해독이라는 지금의 제 연구 주제에 접목시킨다면 더 좋은 성과를 얻을 수 있을 것이라 판단하였기 때문이고, 동시에 여러분께 이 논문에서 사용된 들어는 봤으나 다소 생소한 Transformer-based 모델에 대해 소개해드릴 수 있기 때문입니다.

오늘의 발표는 다음과 같은 순으로 진행되겠습니다.

 

언어를 처리할 때 인간은 선택적으로 문장의 가장 관련성이 높은 요소에 더 오래 주의를 기울이게 되죠. 이렇듯 문장에서 단어의 상대적 중요성을 평가하는 능력은, 인간 언어 이해에 있어 핵심적인 요소라고 할 수 있습니다. 그러나 여태껏 인공지능 모델에서 이러한 상대적 중요성이 어떤 방식으로 인코딩-디코딩 되는지는 알려진 바가 없습니다. 그래서 연구진은, 인공지능 모델에서 어떻게 인간 언어의 상대적 중요성을 파악하는가를 알고자 하였고,

그 방법으로, 피험자가 글을 읽을 당시의 시선의 움직임을 추적하고, 해당 위치에 고정되어있는 기간과 같은 Feature를 측정 및 예측함으로써 파악할 수 있다고 생각했습니다.

다음의 그림은 해당 문장이 주어졌을 때, 피험자의 시선 추적 데이터를 시각화하여 나타낸 것입니다.

원은 눈이 고정되어 있던 위치, 그리고 원 아래 숫자는 시선이 고정되어 있던 시간을 의미합니다.

이 문장은 Laurance를 소개하는 글에서 가져온 문장인데요. 이전에 나왔던 이름인 Laurance 보다, 새롭게 등장한 단어인 Mary가 피험자에게 상대적으로 더 중요했기 때문에, 두 번, 그리고 더 오래 고정된 것을 확인할 수 있습니다.

연구진은 이러한 시선 추적 데이터를 통해 우리는 눈의 움직임 패턴을 예측할 수 있게되고, 이것은 동시에 모델의 인지적 타당성을 이해하는데 한걸음 더 다가갈 수 있게 해준다고 주장합니다.

본 연구에서는 다양한 종류의 데이터세트를 사용합니다.

영어 (Zuco), 독일어, 네덜란드어, 러시아어 등 다양한 언어로 작성된 문장과 시선처리 데이터에 대하여, 인간의 행동 패턴을 예측하는 큰 모델과 작은 모델이 있습니다.

작은 모델은 단일 언어를 학습하고 표현하는 모델이며, 큰 모델은 다국어 transformer 모델로, 모든 언어를 학습하고 표현하여, 작은 모델 보다 보편적인 언어 이해를 목표로 하는 모델입니다.

연구진들은 사람이 문장을 읽을 때, 특정 현상에 대한 시선 추적 패턴은 언어에 상관없이 일관되기 때문에, 단일 모델보다도 다국어 모델이 피험자의 행동 패턴을 예측하는데 있어 더 좋은 성능을 보일 것이라 가정하였습니다. 그리고 연구진은, 이 가설을 영어, 독일어, 네덜란드어, 러시아어 의 총 4가지 언어의 6개 데이터세트에 대해 테스트 하였습니다

1은 모델 훈련시 사용된 각 데이터셋에 대한 기술통계 입니다. 던디, 지코, 주고, 지코, 포텍, RSC 의 총 6가지 데이터가 사용되었고, 각 데이터셋의 평균 문장 길이, 평균 단어 길이, 총 토큰 개수 등을 확인할 수 있습니다. 플래쉬 점수는 각 언어가 얼마나 읽기 쉬운가를 나타낸 지표인데요, 0 에서 100사이의 점수로 나타내어지며 점수가 높을수록 읽기가 쉬움을 나타냅니다.

데이터셋 각각에 대해 간략히 설명하자면,

1)    던디 데이터셋은 20개의 신문기사가 포함된 데이터셋으로, 한 번에 다섯 줄의 화면이 영어 원어민 독자에게 제시되었습니다.

2)    지코 데이터셋은 영어 소설이 포함된 데이터셋으로, 단락 별로 화면에 표시되었습니다.

3)    주코 데이터셋은 영화리뷰 및 위키피디아 기사의 전체 문장에 대한 시선 추적 데이터가 포함됩니다.

4)    지코 데이터셋에는 네덜란드 독자의 시선추적데이터가 포함되어있고

5)    포텍 데이터셋에는 대학 수준의 생물학 및 물리학 교과서의 짧은 구절이 포함되어 있습니다. 전체 구절이 여러줄로 표시되었고, 독일어 원어민이 읽습니다.

6)    RSC 데이터셋은 러시아어로, 국립 코퍼스에서 추출한 문장이 포함되어 있습니다. 성인에게 한번에 하나씩 전체 문장이 화면에 표시되었습니다.

시선 고정이란 피험자의 시선이 한 위치에 유지되는 시간입니다. 고정은 각 단어에 속하는 화면의 영역 주변 경계를 구분하여 단어에 맵핑됩니다. 단어는 한번이상 고정될 수 있으며, 각 토큰(문장)에 대해 초기 구문부터 후속되는 구분까지의 전체 읽기 프로세스를 인코딩하는 다음 8가지 시선추적기능을 예측합니다. (다음의 각 단어별 특성 추출)

(1)   고정 수해당 단어에 고정된 횟수, (모든 피험자에 대한 평균값)

(2)   평균 고정 지속시간 모든 고정의 평균 고정 지속시간

(3)   고정 비율 해당 단어에 고정된 피험자의 수/전체 피험자 수

(4)   첫번째 고정 기간 해당 단어에 첫번째로 고정된 기간 . 모든 피험자에 대한 평균

(5)   첫번째 통과 기간 주제가 고정될때부터 통과 이후 모든 고정의 합. (????)

(6)   총 읽기 시간 모든 고정기간의 합, ?(?)

(7)   재고정 횟수 첫번째 고정 후에 고정 된 횟수

(8)   다시 읽은 비울 – 1회이상 고정된 피험자 수 / 전체 피험자 수

 

이렇게 추출된 데이터는 각각 값의 범위가 다르므로, 0에서 100 사이로 균일하게 맞추어 손실을 계산합니다.

BERT, XLM의 두 모델에서 시선 추적을 예측하는 기능을 비교합니다.

왼쪽 그림은 ZUCO 영어 데이터셋에 대해 추출한 단어수준 feature , (3) 고정 비율 에 대해 예측한 값입니다. (이후 0~100 으로 scaling) , He is of three quarters Irish andone quarterFrenchdescent. 문장에서, 각 단어에 고정된 피험자수/ 전체 피험자수를 나타낸 값인것이죠.

분홍색 선이 정답값이고, 주황색선은 XLM을 이용한 예측값, 파란색선은 BERT-모델을 이용한 예측값입니다.

오른쪽 그림은 RSC 러시아어 데이터셋에 대한 고정 수, 즉 해당 단어에 고정된 횟수에 대해 나타낸 값입니다. 마찬가지로 붉은 선이 실제값, 주황선이 XLM 모델을 이용한 예측값, 푸른색이 BERT 문장의 예측값입니다.

두 모델 모두 상당히 높은 정확도를 보이는 것을 확인할 수 있습니다.

각 언어 및 모델별 정확도를 비교한 최종 결과는 다음과 같습니다. 괄호 안에있는 것은 표준편차입니다.

pre-trained transformer 모델이 4가지 언어의 읽기 행동 패턴을 예측하는데 전반적으로 90% 이상의 높은 정확도를 보이는 것을 확인할 수 있었습니다. 또한 XLM 모델의 결과는 평균적으로 약간 더 낮지만, 훨씬 더 높은 표준편차를 나타냅니다

상대적으로 작은 데이터세트인 RSC 같은경우, 다국어 XLM 모델이 단일언어 모델보다 성능이 뛰어난 것을 확인할 수 있습니다.

또한 XLM 모델의 성능은 아주 작은 비율의 시선추적데이터로도 안정적으로 유지되지만, BERT 모델의 성능은 데이터의 20% 미만을 미세 조정할 때 급격히 떨어지는 한계가 있었습니다. 음영 처리된 영역은 표준편차를 나타내며, 점선은 파인튜닝없이 사전훈련된 BERT-MULTI 모델의 결과입니다.

지금까지 다국어 모델보다 특정 언어에만 훈련된 단일 언어 모델이 더 성능이 좋은 경우가 많지만, 다국어 모델은 적은 양의 데이터로 미세 조정될 때 언어별 모델보다 이점을 보여주었으며, 사용된 transformer 모델이 인간의 처리 메커니즘과 유사한 방식으로 언어의 상대적 중요성을 인코딩 한다는 것을 확인할 수 있었습니다.


저는 이번 저널리뷰를 통해 연구원이 연구를 어떻게 진행하는지, 최근에는 어떠한 연구주제가 있는지 등을 아는 것도 중요하지만, 사용된 모델이 무엇이고 어떻게 동작하는 것인지 간략하게나마 이해하는 것도 매우 중요한 요소라고 생각합니다. 그래서 따로 여기서 사용된 Transformer 모델이 대체 무엇인지, BERT XLM 이 무엇인지, 살펴보는 시간을 갖도록 하겠습니다.

관련 내용은 다음의 문서로 가주세요!

https://checherry.tistory.com/111

 

자연어 처리 분야 최신기술! Transformer model, BERT, XLM 모델이란?

Transformer 는 Attention all you is need 논문에서 제안된 모델 구조로, RNN 의 long-term-dependency 의 한계점을 극복하기위해 제안된 아키텍처입니다. (은닉 상태를 통해 과거 정보를 저장할때, 문장..

checherry.tistory.com

 

반응형

잠시 아침 수업시작전 짬나서 써보는 '이번 겨울방학에는 무엇을할까?'
일전에 어느정도 계획해둔것은 있지만 뭐 바꿀수도 있는거니까..
일단 지금생각하기로는 계절학기는 안들을것같고, 2개월간...


- 개인연구 진행 (겨울방학~2학기전까지종료)
- 토익or토플 등 영어자격증 !!!
- 데이터분석전문가 필기, sqld OR 정보처리기사 준비
- 랩실 저널클럽 준비
- 밀린 github, tistory 업로드 및 정리 (공부내용도 슬슬..)
- 데이콘/캐글 문제풀기 -> 3등안에들어보기!? (하고싶어서 카테고리까지 만들어뒀는데 시간이...)
- 운동&다이어트
- 다음 논문주제 관련 찾아보기 (4학년때 해야하는 창종설, 소캡디) -> 주제 정하고, 간단 제안서 작성
// 창종설은 팀을 짜야하는데..
- 뇌파작곡 논문작성 / 교내공모전 ? (할건지???)
- 공부하고 글업로드
- 포트폴리오 1차 작성


이정도 할 것 같다.
계절 안듣는 선택이 좋았네.. 뭔가 할게 많다. @_@_@ (12.29 살짝후회중)
요즘 추워져서그런가... 과제들이 하나씩 사라져가서 그런가...
아직 기말고사도 안쳤는데 벌써 겨울방학인 느낌이다..... 이러면 안되는데..
얼른 기말고사 끝나고 내가 하고싶은것들 위주로 할 수 있는 방학이 왔으면좋겠다!
(...2학기에도 사실 학교공부보다 하고싶은거 위주로 하긴 했다..... ㅎ...ㅎㅎ....내학점...)

// 아래는 더 세부적인 계획 // 12.29 추가

연구실/ 예약입학 고민 (장학금액은 학점에 따라 차등지급)
0순위 : 공부
More More 공부.. 공부해서 githun/tistory에 올리자.
자격증같은게 중요한게아니라 실제로 공부하고, 뭔갈 해보는게 중요하다.
1순위 : 연구
개인연구 진행 (~1.7)
저널클럽 준비 (~1.5)
2순위 : 영어자격증
토플 / 토스 or 오픽  영어자격증 준비하고 얼른 따자 (토플100점이상, 토스level7이상, 오픽 IH 이상 목표)
(독일어??)
3순위 : 데이터자격증
sqld + 데분전문가(필기,실기?) 준비해서 따고.., 
- SQLD (44회)
  접수기간 : 2.14(월)~
  시험일: 3.12(토)
- 데이터분석전문가 필기 (24회) / 실기 언제 ???
  접수기간 : 1.24(월)~
  시험일 : 2.26 (토)
 
/ 4학년여름방학에, 정처기 따기 /
4순위 : 1학기 대비
도서관 등..창종설/소캡디 주제정하기
교재 구입, 미리 공부
주의할점​
/학점포기1개, 재수강1개 신경쓰기.. /



반응형

안녕하세요! 지난번 A.I.D.D 데이터톤 최우수상 수상 소식에 이어, 또 다시 기쁜 소식을 들고오게 되었습니다!

바로바로~~ 경희대학교 SW중심대학사업단 에서 진행한 Software Festival 에서 대상우수상을 수상하게 되었다는 소식이에요 ㅎㅎ와아~~🥁🎉

(= 데이터분석부분 1등, 2등 모두 수상! + 데이터부문에서 1등한 작품이 모든 부문에서 1등!!)

소프트웨어 페스티벌은 지난 2021년(1년) 동안 경희대학교 학생들이 개인적으로/팀프로젝트로/내-외부공모전으로/수업중에 등등 상관없이, 완성된 모든 SoftWare를 모아서, 오프라인 혹은 온라인으로 전시 및 시상하는 경희대학교의 큰 행사입니다!

다양한 분야의 SW를 모두 받으니, 해당 분야에 관심이 있거나, 진로로 희망하는 학생이라면 주목할 행사라고 할 수 있죠.

 

경희대학교 국제캠퍼스의 모든 학과 학우분들, 서울캠퍼스의 컴공/소융 복전하시는 학우분들 모두가 참여 가능합니다

위의 포스터에서도 볼 수 있듯이, 총 4가지 분야로 SW를 나누어 전시 및 시상을 하였습니다.

- 피지컬컴퓨팅

- 게임 및 AR/VR

- 데이터 분석

- 기타 소프트웨어

 

전시작을 간단히 보여드리면,

1) 데이터 분석 부문

 

2) 피지컬 컴퓨팅 부문

 

3) 게임 및 AR/VR 부문

4) 기타SW 부문

 

굉장히 다양한 분야, 다양한 주제의 프로젝트가 출품된것을 볼 수 있네요

저도 다른분들의 SW를 구경해봤는데, '와 신기하다, 아이디어 좋다' 라는 생각이 들더라구요.

 

시상은 모든 출품작 중 대상 1개, 그리고 각 부문에서 최우수상, 우수상, 주니어상을 시상합니다. +인기상

(대상이 있는 부문에서는 최우수상이 없어요! 최우수상이 업그레이드되어 대상이 되는 느낌)

'주니어상'은 미수상작 중 1, 2학년이 진행한 프로젝트를 선정하고,

'인기상'은 학생들이 클릭한 좋아요 갯수가 많은 작품 2개를 선정하는 방식입니다.

 

저는 이번에 2021년동안 진행한 팀프로젝트 1개, 개인프로젝트 1개의 총 2개를 데이터분석부문에 출품했고,

팀프로젝트로 제출한게 대상(+500만원), 개인프로젝트로 제출한게 우수상(+50만원)을 수상했습니다.!!

데이터분석부문에서는 나란히 1등, 2등 한 것인데 상금의 차이가....!!! 

 

아무튼!!

2021년 마무리를 뿌듯하게 할 수 있게되어 기쁘네요

내년에는 드디어 4학년이 되는데, 2022년에도 열심히! 할 수 있도록 하겠습니다 :>

감사합니다

반응형

과제 개요

 인간의 내면을 음악으로 듣기 위한 시도는 오래전부터 이루어져 왔다. 1930년대 초기에는 뇌파 알파파의 진폭이나 뇌파 신호의 단순하고 직접적인 특징을 통해 ‘소리’를 만들어 왔고, 1990년대에 이 르러서는 디지털 필터링 및 뇌파 데이터의 분석을 통해 다양하고 새로운 ‘음악’ 생성 규칙을 만들어 왔다.

 본 연구에서는 기존의 ‘뇌파를 통해 음악을 생성한다’는 목적에서 더 나아가, 뇌파를 통해 사용자 친화적인 음악을 생성하는 것, 즉 ‘사용자의 감정을 잘 표현해주는 음악’을 만드는 것을 목표로 한다.  사용자는 이로써 나를 잘 표현해주는, 진정한 ‘나만의 음악’을 갖게 될 수 있다. 또, 긍정적인 감정을 보여주는 뇌파를 알고리즘에 넣어 만들어진 음악과, 부정적인 감정을 보여주는 뇌파를 이용해 만들어 진 음악의 비교를 통해 우리는 인간의 내면을 한층 더 알아볼 수 있을 것이다.

개발 목표

  1. EEG 데이터를 통해 감정에 맞는 음악을 작곡하는 알고리즘 모델 개발
  2. 1에서 구현된 알고리즘을 통해 사용자가 원하는 악기를 사용하여 음악 작곡

 

개발 과정

0. 뇌파란? 

  • 뇌의 전기적인 활동을 머리 표면에 부착한 전극에서 측정한 전기 신호
  • 주파수 범위에 따라서 델타(0.2Hz ~ 4Hz), 세타(4Hz ~ 8Hz), 알파(8Hz ~ 13Hz), 베타(13Hz ~ 30Hz), 감마(30Hz ~ 45Hz)파로 구분

EEG Data Sample

 

1. EEG DEAP Dataset

  • 32명의 참가자 → 총 40개의 1분 길이의 영상을 3초 정도의 준비시간을 가지고 시청
  • Sampling rate를 128Hz로 하여 32개 Channel에서 나오는 뇌파 측정

32 Channel

  • 영상 시청 후, 자신이 느낀 감정에 대해 각각의 Label 별로 수치를 결정
  • Label: 1~9 사이의 실수값으로 정해짐
    • Arousal: 감정의 격함의 정도 → 높을 수록 감정이 격해짐
    • Valence: 감정의 긍/부정 정도 → 높을 수록 감정의 긍정의 정도가 커짐

 

Arousal and Valence Label

 

 

2. Preprocessing (전처리)

  • 첫 3초는 감정 분석에 중요하지 않을 것이라 판단하여 제거
  • 비교적 감정이 뚜렷한 데이터만을 사용하여 정확도를 높이고자 3과 7을 기준으로 Arousal Low /High, Valence Low/High의 네가지 카테고리로 Grouping.

4가지 Category로 Grouping

  • 기존 선행 연구 결과를 참고해 감정 분석에 주로 사용되는 12개의 채널 선정. 
    • 긍정적인 감정은 주로 좌측 전두엽, 부정적인 감정은 주로 우측 전두엽과 연관되어 있다는 연구 결과에 따라 pair로 선택
    • F3-F4 / F7-F8 / FC1-FC2 / FC5-FC6 / FP1-FP2 / AF3-AF4

 

3. Feature Extraction 

뇌파 데이터를 각각 Time doamin, Frequency domain, Time-Frequency domain의 영역에서 14개의 Feature 추출.

  1. Time domain
    • Statistical feature: Mean, Standard deviation, Kurtosis, Skewness
    • Hjorth parameters (Mobility, Complexity)
    • Fractal Dimension (Higuchi, Petrosian)
    • Detrended Fluctuation Analysis
    • Hurst Exponent
  2. Frequency domain
    • Power Spectral Density
    • Maximum Power Spectral Frequency
    • Root Mean Square
  3. Time-Frequency Domain
    • STFT (Short-Time Fourier Transform)

Time domain과 Frequency domain에서 추출한 총 13개의 Feature는 모델 학습 시에 사용하였고, 
Time-Frequency domain 영역에서의 Feature는 음악 작곡 알고리즘의 주요 데이터로 사용.

데이터 전처리 및 Feature Extraction 과정

 

 

4. Modeling 

앞서 추출한 Time domain과 Frequency domain의 Feature를 이용해, Arousal/Valence 마다 High/Low를 분류하는 이진 분류 모델 생성

  • 전체 데이터를 shuffling 한 뒤 train과 test를 8:2로 분리
  • Data가 biased되어 있어 oversampling을 통해 train data의 레이블 값(High: 1, Low: 0)의 비율을 맞춰줌

모델링 과정

 

  • 13개의 기계학습 모델에 대해 Train data를 이용하여 10-fold 교차 검증 시행해 정확도 비교
  • 가장 높은 성능을 보인 3개의 모델(ExtraTreeClassifier, RandomForestClassifier, LGBMClassifier)을 ensemble
  • 최종 결과 Test data에 대해 각 모델 모두 80%의 정확도를 보임.

 

5. Music Composition Algorithm

1. 훈련된 모델을 통해 예측한 Valence를 통해 Major/Minor 결정

  • 12개의 Channel에서 예측된 Label 중 많이 선택된 Label을 선택
    • High: Positive → Major
    • Low: Negative → Minor

Major/Minor 결정

 

2. 훈련된 모델을 통해 예측한 Arousal를 통해 Tempo 결정.

  • 12개의 Channel에서 예측된 Label의 비율을 통해 Tempo 결정
    • High: Excited → Fast Tempo
    • Low: Relax → Slow Tempo

Temop 결정

 

3.  frequency domain의 Maximum Power Spectral Frequency (MPSF)로 Key Chord 결정

  • 감정을 더 잘 나타낼 수 있도록 beta-gamma 대역대에서 MPSF 추출
  • 기본 오른손 주파수 대역대로 Scaling
  • 가장 가까운 Chord를 통해 Key chord와 scale 결정

Valence model로 예측한 결과가 High, MPSF Scaling 결과 C chord에 가장 가깝다면, "C Major Scale"을 이용해 작곡

 

4. Time-frequency domain의 STFT로 Melody 결정

  • 1초 단위로 분할
  • 각 구간 별 최댓값을 가지는 주파수를 3번의 방법으로 Scaling하여 Key Chord의 Scale에 가장 가까운 음을 결정
  • Melody 간격이 너무 넓은 경우, 기존의 박자보다 더 작은 박자로 Interpolation하여 자연스러운 Melody 구성
  • 좀 더 풍부한 음악을 위해, 왼손은 오른손에서 Octave를 2단계 내린 1도 화음을 치게 해 반주 구성

 

GUI (Graphic User Interface)

  1. 박스 안에 EEG Signal Drag and drop
  2. "1. Extract Feature" 버튼을 눌러 12개의 Channel에 대해 총 14개의 Feature를 추출
  3. "2. Emotion Analysis" 버튼을 눌러 Arousal과 Valence 예측
  4. 사용자가 원하는 악기를 선택하고, "3. Convert Signal to Music"버튼을 눌러 2와 3에서 추출한 feature와 예측된 결과를 이용해 음악 작곡
  5. 작곡된 음악은 어플리케이션이 저장된 경로의 music 폴더에 저장됨
  6. "4. Reset" 버튼을 눌러 초기화 한 뒤, 다른 EEG Signal에 대해 1~5번 순서를 반복하여 또 다른 음악을 작곡할 수 있음.

 

기대 효과 및 활용 방안

뇌파 데이터를 통해 ‘나만의 음악’을 만드는 접근 방식은 마음의 세계를 음악으로 표현하려는 시도이다. 본 연구는 특히 사용자의 ‘감정 상태와 유사한’ 음악을 만드는 것이 목적이기에 기존의 연구보다도 내면을 음악으로 표현하는데 더 큰 의의를 가질 것으로 보인다. 사용자는 자신의 내면과 감정이 담긴 음악을 통해 자신의 상태를 피드백 할 수 있게 되며, 나아가 본인이 선호하는 악기 뿐만 아니라 음악의 장르를 선택하여 내면의 감정을 해당 장르의 음악으로 표현함으로써 사용자 내면의 익숙하지 않은 감정에 더 쉽게 다가갈 수 있다.  

 

발표 및 데모 프로그램 시연

 

 

반응형

 

오늘은 Fundamentals of C++ Programming/ by. Richard L. Halterman 책의 542-544 Page 코드리뷰를 해보겠습니다.

해당 내용은 C++ 언어의 Class protection level 및 inheritance 와 관련한 내용입니다.

오늘의 코드 리뷰는 다음과 같은 순서로 이루어지겠습니다.

코드에 Class Protection level 관련한 내용이 있으므로, 먼저 Class 3가지 Protection level 살펴본 ,  Comparer(살펴볼 Class 이름입니다) 헤더파일 cpp 파일을 살펴보도록 하겠습니다.

 

클래스는 멤버함수에 대해 세가지 수준의 보호를 지원합니다.

첫번째로, Private level 있습니다. Private Class 보호수준의 기본값으로,  Class 안의 모든 코드는 Private member 엑세스할 있으나, Class 외부의 코드는 엑세스가 불가합니다.

번째로, Protected level 있습니다. Protected Private 같이 Class 안의 모든 코드가 엑세스 있으며, Class 외부의 코드는 엑세스가 불가합니다. 다만 Derived Class, 상속된 Class 엑세스가 가능합니다

세번째로, Public level 있습니다. Public 멤버는 어드 코드에서나 엑세스가 가능합니다.

 

정리하면, Private Class 외부에서 엑세스 없음을 의미하며, Public 엑세스가 가능함을 의미합니다.  Protected 하위 Class 대해 공개 다른 모든 클래스에 대해 비공개를 의미합니다.

 

오늘 리뷰할 Comparer.h 파일 .cpp 파일은 이후에 소개될 selection sort, 선택 정렬 구현에 필요한 class 만드는 내용입니다. Selection sort 관련한 내용은 다음번에 리뷰하도록 하겠습니다.

Comparer 파일은 다음의 기능을 포함합니다.

1)     선택 정렬 기능에 의해 부과된 순서는, Comparison 함수를 custom하여 변경할 있습니다.

2)     정렬 순서를 결정하는데 사용되는 object 정렬시 수행되는 비교 교환 횟수에 대한 데이터를 수집합니다.

또한 코드를 여러 소스파일로 분할하여 사용하며, 미래에 사용할 있는 두가지 Virtual 메소드를 사용합니다.

그러면 이제 Comparer 클래스의 선언이 포함되어있는 17.33 Comparer.h 파일을 간략히 살펴보도록 하겠습니다.

Comparer Class의 Private 영역에는 int 의 compare_count 와 swap_count가 있습니다.
Private 영역에 있으므로 외부에서 엑세스 할 수 없으며, compare 횟수 및 swap 횟수를 추적합니다.

마찬가지로 Private 영역에 int 2개를 input, bool type을 output으로 하는 비교를 위한 함수 포인터가 있습니다.

Protected 영역에는 실제로 비교를 수행하는 메소드인 virtual Compare_impl 함수, 실제로swap 을 수행하는 메소드인 virtual swap_impl 함수가 있습니다. Derived class는 이 두개의 함수를 custom하여 사용할 수 있습니다.

Public 영역에는 적절한 비교함수로 Comparer 객체를 초기화하게끔 하는 생성자가 있고, 새로운 정렬을 준비하기위해 그동안의 compare 및 swap counter를 0으로 만드는 reset 함수, 비교를 위해 int 2개를 받아 bool 로 반환하는 compare 함수,

Inference로 값을 받아와 해당 값을 교환시키는 swap 함수, 객체의 비교 횟수 및 swap 횟수를 반환하는 함수가 있습니다.

다음으로 cpp 파일에 대해 설명드리겠습니다.

먼저 헤더파일을 include 합니다.
#include "comparer.h"

Comparer class의 compare_impl 함수는 int 2개를 받아 판단후 bool로 반환합니다. 

Swap_impl 함수는 int 2개를 reference로 받아 m을 temp에 저장해두고, m을 n값으로 바꿔주고, n을 미리 저장해둔 m 값, 즉 temp와 바꿔줍니다.

다음은 생성자 초기화입니다. Compare_count를 0, swap_count를 0, 그리고 비교연산자 함수를 사용자가 원하는 함수로 초기화하여줍니다. 

Reset 함수는 compare_count와 swap_count를 0으로 만듭니다.

Compare 함수를 사용하면 compare_count 를 하나 올리고, compare_impl 함수를 실행하여 비교를 수행합니다. 

마찬가지로 Swap 함수를 사용하면 int 2개를 reference로 받아 swap_impl 함수를 실행하여 swap을 수행합니다. 함수가 호출되면 swap_count를 하나 올립니다. 
Compare 및 swap 메소드는 virtual 함수로 선언되지 않으므로 derived class는 재정의할 수 없고, compare_impl 및 swap_impl 만 재정의가 가능합니다.
Comparisins 함수를 호출하면 compare_count를 반환하고,  Swaps 함수를 호출하면 swap_count를 반환합니다. 

둘 모두 swap_count 와 compare_count 는 private영역에 존재하기 때문에, 이렇게 Comparer 클라스 내부에 값을 반환해주는 함수를 만들어둔것입니다.


책의 16.3절, Comparer Class 와 거의 동일한 내용이었는데요,

해당 파일과 클래스의 디자인이 달라진점은,

Private, Protected, Public 의 세가지 보호수준을 적극 이용하여 보호할 내용을 보호하고, 엑세스 할 수 있는 메소드를 지정해주었다는 점,

가상 메소드인 compare_impl 및 swap_impl을 정의하고 custom할 수 있게끔 해주었다는 점,

public의 compare 및 swap 함수가 compare_impl및 swap_impl 함수에 작업을 위임한다는 점, 등이 있습니다.

이는 count 횟수를 엄격하게 보고하기 위함이라고 볼 수 있겠습니다. (log 를 확실하게 저장)


이번 코드 리뷰에서는, Protected 및 private 지정자를 적절하게 사용하면 Class 는 drived class 가 수행할 수 있는 직업을 확실히 제어할 수 있다는 점이 배워갈 부분이라고 생각합니다.

반응형
과 제 명 국문 파이썬을 통한 AdaBoost-Samme 알고리즘 구현
영문 Implementation of AdaBoost-Samme Algorithm via Python
이 름 김다예


1. 과제 개요
가. 과제 선정 배경
최근 필자는 공모전 주제로써 ‘당뇨병 발병 예측 모델 구현’프로젝트를 진행하였다.
가장 Accuracy 및 AUC 값이 높은 모델을 찾고자, 총 13개의 머신러닝 Classifier 및 MLP 모델을 적용 및 분석해보았고, 각 모델에 대해 gridSearch 및 HyperParameter Tuning을 하며 score(=AUC)을 비교하였다. 결과적으로, 비교한 모델 중 가장 성능이 좋았던 것은 Samme 알고리즘이 적용된 Adaboost Classifier였다. 필자는 AdaBoost Classifier의 적용 방법만 알 뿐, 상세한 알고리즘에 대한 내용에는 무지하였기에 알고리즘을 구현해보는 이번 과제로서 Adaboost Classifier를 조사하고, 실제 구현해보기로 하였다.

그림1.비교한 Classifier 목록/ 그림2. Adaboost에서 최적의 Parameter를 찾는 과정/ 그림3. Threshold에 따른 AUC값의 변화


나. 과제 주요 내용
1) Boosting 및 AdaBoosting 대해 조사한다.

2) Samme 알고리즘의 의사코드를 확인하고, 설명한다.
3) 파이썬으로 AdaBoost-samme 알고리즘을 구현한다.

4) 구현된 AdaBoost 알고리즘을 실제 적용해보고, 결과를 분석한다.



2. 알고리즘 조사 및 설명
가. Boosting 란 무엇인가?
• 매우 단순한 learning 모델을 여러 개 사용하여 성능이 매우 좋은 모델 구축
• 단순한 learning 모델: 무작위 선택보다 성능이 약간 우수한 weak learner
• 무작위 선택보다 약간 우수한 weak learner를 여러 개 결합하는 앙상블 방식
• 모델 구축 시 순서를 고려
• 각 단계의 weak learner는 이전 단계 weak learner의 단점을 보완


나. AdaBoosting 란 무엇인가?
• 이전 단계 weak learner의 단점을 보완하는 새로운 weak learner를 순차적으로 구축
• 매 단계에서 모든 관측치의 Weight를 업데이트 하는 방식으로 학습
• Weak learner: 하나의 node와 두 개의 leaf로 구성된 stump
• Random forest의 tree와 달리 하나의 stump는 하나의 변수만 사용
• Stump가 잘 분류/예측하지 못하는 관측치는 이후 생성될 stump에서 크게 고려함
• 순차적으로 구축된 stump가 최종적인 분류 및 예측 결과에 미치는 영향은 모두 다름


다. Samme 의사코드 및 설명
Adaboost 기법에는 Samme, Samme.R 의 두가지 알고리즘이 있다.
이번 과제에서는 Samme알고리즘을 구현할 예정이다.

다음은 Samme 알고리즘의 의사코드이다.

1) Selecting Stump
• 초기 Sample weight는 모든 관측치에 동일한 값 부여
• Sample Weight는 stump 구축에 사용된 각 관측치의 영향력을 의미
• 각 변수(feature)애 대해stump생성(변수가 3개라면 stump도 3개)
• Gini Index가 가장 작은 stump를 해당 단계의 weak learner로 사용


2) How much say this stump
• 선택한 weak learner가 최종 예측값에 얼마나 큰 영향력을 행사하는지 파악
(최종적인 분류 및 예측 결과에 대한 해당 stump의 영향력)

• 위의 식에서 Total error = 잘못 분류된 관측치의 sample weight총 합

3) update sample weight
• Stump의 분류 결과를 반영하여 sample weight 업데이트
• Sample weight를 업데이트하여 이후 생성되는 stump가 오분류된 관측치에 집중하게 함
• 업데이트 된 Sample weight를 사용해 다음 단계의 stump를 구축하기 위한 새로운 dataset 생성
• 생성된 dataset은 새로 생성될 stump가 직전 stump에서 오분류된 관측치에 더욱 집중하게 함
• 이후 다시금 개별 관측치의 weight와 stump의 영향력을 순차적으로 계산 및 sample weight 업데이트를 반복하며 학습
• 최종적으로 amount of say의 합을 통해 classification



3. Samme 알고리즘 구현 via 파이썬
가. Samme 알고리즘(Adaboost모델) 구조 설정
Class DecisionStump : Stump를 만드는 Class -> 이후 Adaboost class에서 이용
def __init__(self) : HyperParameter 설정 (polarity, Feature_idx, Threshold, alpha)
def predict(self, X) : 예측값을 반환하는 함수
return predictions
Class Adaboost
def __init__(self, n_clif=5) : HyperParameter 설정 (n_clf, clfs)
def fit(self, X, y) : train_X_data, train_y_data를 받아 fit 하는 함수
def predict(self, X) : 예측할 dataset을 받아, 예측된 y값을 반환하는 함수
return y_pred


. 알고리즘 구현

class DecisionStump:
def __init__(self ):
self .polarity = 1
self .feature_idx = None
self .threshold = None
self .alpha = None

def predict (self , X ):
n_samples = X.shape[0]
X_column = X[:, self .feature_idx]
predictions = np.ones(n_samples)
if self .polarity == 1 :
predictions[X_column < self .threshold] = -1
else :
predictions[X_column > self .threshold] = -1
return predictions

class Adaboost:
def __init__(self , n_clf =5 ):
self .n_clf = n_clf
self .clfs = []

def fit (self , X , y ):
n_samples, n_features = X.shape
# 가중치를 1/N으로 초기화
w = np.full(n_samples, (1 / n_samples))
self .clfs = []
# classifier 를 통해 반복함
for _ in range (self .n_clf):
clf = DecisionStump()
min_error = float ("inf")
# greedy search 를 통해 최상의 임곗값 확인
for feature_i in range (n_features):
X_column = X[:, feature_i]
thresholds = np.unique(X_column)
for threshold in thresholds:
# polarity = 1 로 예측
p = 1
predictions = np.ones(n_samples)
predictions[X_column < threshold] = -1
# Error = 오분류된 Sample weight의 합
misclassified = w[y != predictions]
error = sum (misclassified)
if error > 0.5 :
error = 1 - error
p = -1
# 최고의 성능을 내는 결과값을 저장함
if error < min_error:
clf.polarity = p
clf.threshold = threshold
clf.feature_idx = feature_i
min_error = error
# alpha 계산
EPS = 1e-10
clf.alpha = 0.5 * np.log((1.0 - min_error + EPS) / (min_error + EPS))
# 예측값 계산 및 weight 업데이트
predictions = clf.predict(X)
w *= np.exp(-clf.alpha * y * predictions)
# weight 값 정규화
w /= np.sum (w)
# classifier 저장
self .clfs.append(clf)

def predict (self , X ):
clf_preds = [clf.alpha * clf.predict(X) for clf in self .clfs]
y_pred = np.sum (clf_preds, axis=0 )
y_pred = np.sign(y_pred)
return y_pred


4. 구현된 Samme 알고리즘 실제 적용
가. Test 환경 설명
• Dataset : sklearn에서 기본적으로 제공하는 breast_cancer() dataset을 이용함
• Score : Accuracy를 기준으로 측정
• Trainset, Testset비율 : ‘8:2’ 로 Split
• n_clf : 5로 설정함

나. Test Code
1) 직접 구현한 Adaboost를 통한 Test
if __name__ == "__main__":
from sklearn import datasets
from sklearn.model_selection import train_test_split
def accuracy (y_true , y_pred ):
accuracy = np.sum (y_true == y_pred) / len (y_true)
return accuracy
data = datasets.load_breast_cancer()
X, y = data.data, data.target
y[y == 0 ] = -1
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2 , random_state=5
)
# 5 weak classifiers를 이용한 Adaboost Classifier (구현한 모델 이용)
clf = Adaboost(n_clf=5 )
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
acc = accuracy(y_test, y_pred)
print ("Accuracy:", acc)

Test set Accuracy: 0.9736842105263158

2) Sklearn Labrary 에서 제공하는 Ababoost를 통한 Test
def accuracy (y_true , y_pred ):
accuracy = np.sum (y_true == y_pred) / len (y_true)
return accuracy
data = datasets.load_breast_cancer()
X, y = data.data, data.target
y[y == 0 ] = -1
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2 , random_state=5
)
# 5 weak classifiers를 이용한 Adaboost Classifier (sklearn 모델 이용)
model = AdaBoostClassifier(n_estimators=5 , random_state=42 )
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
acc = accuracy(y_test, y_pred)
print ("테스트 세트 정확도 : ", acc)

Test set Accuracy: 0.9649122807017544



반응형

과제는 해도해도 끝이없고,...

시험기간인데 밀린 녹강 들을 시간도 빠듯하고....

왜이렇게 바쁜것인가...!!!!!!??? 바빠서 최근에는 Tistory에 글도 못썼다..!!

최근에 뜬금없이 AI데이터톤/SW페스티벌 등 참가하느라 그런가.. 정말 너ㅓㅓㅓ무 바쁘다. 시상식도 갔어야했고..

이번학기는 6전공을 하고있는데 6전공은 진짜 할게 안되는것같다. 

더구나 나는 학업 뿐 아니라 이것저것 다른 활동을 하고있으니 -_- 진짜 예습은 커녕 복습도 못하겠다.

진짜 어떡하냐................ 이제 다 내려놓고 시험공부만 하고싶은데,,, 시험기간인데도 교수님께서 내주신 과제가 너무많다!

그렇다고 미루고 미루다 이렇게된게아니다........... 지금까지 미친듯이 과제만 하며 냈는데...하....

ㅠㅠ ㅍㅏ이팅... 이번학기 끝나고 원래 계절 들을생각이었는데, 안듣기로 마음을 굳혔다.

대신 랩실에서 진행하는 개인연구 제대로 진행하고, 토익/텝스 같은 영단어 공부하고,

그동안 바빠서 못올렸던 밀린 글들 Tistory랑 github에 업로드하고, 간간히 공모전이나 데이콘 참여해야겠다.

아! 그리고 가능하면 미뤄뒀던 SQLD 나 전문가 자격증도 따고싶다. 방학도 진짜 바쁘겠구나...

그런데 다음학기부터 4학년이라는걸 생각하면 또 안바쁘게 살수가 없다.!

 

Today #12.3# -금!! <시험까지 D-12>
~12.7 (화)
AS#3 제출
​~12.10 (금)
Lab13, Pj2
~12.12 (일)
알고 최종보고서제출
~12.14(화)
알고 최종결과설명 Youtube 제작(10분)
12.15~16 데센프,인공론 / 기계, 객프 기말고사
~12.18 
인공 최종보고서 제출
~12.19 
인공 Youtube 제작
~12.19 (일)
Lab14
 12.20 알고 기말고사​
~12.24
데캡디 최종보고서들
 

 

 

이번학기는 유독 과제가 많은것같다....................................
더구나 곧 논문쓸수도있는 팀 프로젝트를 동시에 진행해서..... 그거하느라도 더 바빴던듯하다...

제발살려달라제발시험공부하게해달라

반응형

안녕하세요! 시험기간이기도 하고, 이래저래 진행되는 프로젝트나 일정이 많아 오랜만에 인사드리게 되었네요.
오늘의 소식은 전국구 데이터톤! Artificial Intelligence Diabetes Datathon, AIDD -인공지능 당뇨병예측 모델개발에 참여하여 최종2위의 성적으로 최우수상을 수상하게 되었다는 것입니다! 짝짝짝🎉

아싸300만원


AIDD는 과학기술정보통신부, 한국지능정보사회진흥원이 주최하고 경희의료원이 주관한 인공지능 데이터톤입니다!
(제가 경희대 재학중인데 우연히 겹쳤네요..ㅋㅋ)

주제는 당뇨병 및 합병증 추적 관찰 데이터를 활용한 당뇨병 발병 예측 인공지능 모델 개발로,
인공지능 학습용 데이터 구축 사업 중 ‘당뇨병 및 합병증 추적관찰 임상데이터’ 과제의 일환으로 진행되었다고 해요.

제가 이 블로그에 예에에에전에 업로드 한 글 중 '의사결정나무를 이용한 당뇨병 진단 모델개발'프로젝트가 있었는데,
그때 '교수님께서 모델로는 의사결정나무 단일모델을 사용해야하며 엑셀로 직접 Entropy 등을 계산해 풀어야한다'고 제한을 두셔서 정확도가 높은 모델을 개발하지 못해 아쉬움이 남는다고, 후에 좀 더 자유로은 환경에서 정확도 높은 모델을 개발해보겠다고 말을 꺼냈었는데, 그 다짐을 이렇게 지키게 되네요.

AIDD 데이터톤의 참가대상은 국내 AI, 빅데이터 관련 기업 및 연구기관 종사자, 대학/대학원생이 1~5명 단위의 팀을 구성해 누구나 참여할 수 있었고,
저희는 같은 랩실의 학부연구생 및 석사연구원이 팀을 이뤄 참여하였습니다. (AIMS)
누구나 참여할 수 있다보니 참가자분들도 다양하더라구요. 카이스트, 포항공대 재학생을 포함해 서연고서성한 등의 학생들, 석사생들, 교수님들, 인공지능 관련 책을 쓰신분들까지...

듣기로는 총 참가신청한 팀은 132 팀이었고,

그 중에서 서류 전형으로 예선에 참가할 40팀을 선정하고, 예선에서 본선에 참가할 20팀을 선정하고,

본선에서는 상위 4위까지를 선정하는 방식이었는데요!

이때 NSML 리더보드를 통해 모든 팀의 실시간 score와 순위를 확인할 수 있어서 더 승부욕이 돋고 재미가 있던 것 같습니다. (NSML 리더보드 사용법은 추가적인 글로 간단히 게시해둘 예정입니다)

예선이 딱 3일, 본선도 딱 3일이고, 1시간 당 최대 1번씩 Submit해야한다는 제한이 걸려있어서 적은시간, 적은기회 안에 타임어택으로 높은 점수를 노려봐야했었는데,
그러다보니 다들 합숙을 하시는건지.... 정말 꾸준히 submit 을 하시더라구요...
대회 진행 기간인 총 72시간, 그러니까 즉 72번의 submit 기회중에서 69번을 submit 한 팀도 있었습니다. (-> 이분들이 1등)
물론 저희 팀도 분석하느라/논의하느라 자주 밤을 샜습니다...^^,,,,, (기진맥진)
그런데......... AIDD 에서 분석시 사용되는 데이터가 의료 데이터다보니, 개인정보가 중요하다며 주최측에서 데이터셋을 주지 않아서,
참가자들은 데이터셋의 Feature 종류만 알고 데이터의 분포 등을 확인하지 못한채로 오직 서버에서 데이터를 사용하여 훈련시켜야하고,
테스트셋에는 아예 접근 자체(보는 등)를 할 수 없어서 로컬PC에서는 모델의 score값을 볼 수 없는 구조였습니다.
(score=AUC값)
즉, 우리 팀의 score를 확인할 수 있는 유일한 기회는 1시간에 1번있는 submit 을 통해서 였던거죠...
그나마 Validation set을 이용해서는 score를 확인할 수 있었으나, Test set 과는 또 차이가 있으니.. 사실상 스스로 모델을 평가할 수 있는 지표가 거의 없었다고 볼 수 있습니다.
1시간에 1번씩 성능을 확인할 수 있다면 모델이 개선되는 속도가 느릴 수 밖에요.. 이 점이 진짜 진짜 불편했습니다. -_-

왜 이렇게 한거에요.....!!!! 분석할 데이터셋에 대해 아무것도 알 수 없으면 그게 분석일까요? 최적 모델/파라미터 찾는 노가다지....!!!! ㅠㅠ

교수님께서도 데이터분석 공모전을 진행하는데 데이터셋을 안주는건 아닌것같다고 하셨습니다.


이게 본선 리더보드인데요~ 2 위에 랭킹되어있는 AIMS 가 저희 팀입니다!
수상팀의 최종 Score는 1등팀 0.903932, 2등팀(우리) 0.887426, 3등팀 0.866463, 4등팀 0.859686 으로 마무리가 되었습니다.
모델 평가시 사용된 'Score'는 ROC-Curve 하단 영역의 넓이, 즉 AUC 값 이었습니다.
그런데 저는 이해가 안됐던게, ROC-curve를 그릴때 당연히 True Label과 Predict 'Probability' 를 input 하여 구해야하는데, 이 데이터톤에서는 Predict Probability가 아니라 Predict Label을 넣어 구한다는 것입니다.
그러면 ROC-curve 그래프에는 대각선의 끝과 끝을 잇는 점과, 그 중간의 하나의 점만(Threshold=1개) 찍히게 되고 결과적으로 삼각형의 형태를 가지게 되죠.
ROC-curve는 보통 그렇게 안그릴텐데 왜 이렇게한건지 잘 모르겠습니다.
모델 개발을 하다 느낀것은.... score = 0.90 과 0.88 사이에는 엄청난 벽이 있고, 0.88 과 0.86 사이에는 엄청난 벽이 있다는 것입니다.. 물론 0.86 언저리까지 오는데도 벽은 있지만요..

아무튼! 이번 데이터톤이 제 인생에서 처음으로 참가한 인공지능 개발 챌린지였는데, 좋은 성과를 얻어 기쁩니다 :>
대회가 진행되던 6일동안 랩실 선배님들과 함께 이런저런 논의를 하며 공부한것도, 학습에 큰 도움이 되었습니다.
선배님들이 진짜 캐리하셨어요.. 다들 고생하셨어요 TT

곧이어 부정맥 진단 모델 개발 인공지능 데이터톤도 참가할 예정인데, 이건 주최측의 사정으로 일정이 미뤄지는바람에 시험기간과 겹쳐서........ 할지 말지 살짝 고민중입니다. -> 미참가로 결정
저는 밀린 과제/수업/일정 등등이 많아서.. 나중에 글을 또 쓰도록 하고 이만 줄이겠습니다.
안뇽



+12.08 추가)
내일(12.09) 시상식 및 모델 발표가 오프라인/온라인으로 있습니다!

코로나때문에 발표자 1명만 오프라인으로 참석할 수 있고, 남은 팀원은 온라인으로 참석해야한다고 하더라구요. (아쉽)

시상식 후기는 내일 이 글에 추가적으로 남기기로 하고,

저희가 구현한 모델을 설명하는 글을 따로 올릴까는 생각중에 있습니다.

아마 시험이 끝나고 업로드하게되지않을까싶네요! 


+12.09 추가)
시상식이 끝난후, 짧은 후기!!

시상식은 말씀드린대로 온/오프라인 혼합 형태로 이루어졌고, 랩장님이자 팀장님께서 오프라인으로 발표를 하러 가셨습니다!

저는 온라인으로 시상식을 봤는데, 1등팀하고 4등팀이 포항공대 학생들, 3등팀이 모 대학의 교수님들이셨습니다! ㄷ.ㄷ,,

시상과 함께 각 팀의 모델 설명(발표)을 들을 수 있어서 유익한 시간이었던것같습니다. (대체 1등팀 무슨짓을한것인가 했는데!)

괜히 저희 팀 이름 한명한명 불리면서 상을 주시니 감격스럽더라구요.

다음에도 또 랩실 인원들과 함께 좋은 대회에 참여할 수 있었으면 좋겠습니다 :>

 

 

 

 

 

 

반응형

+ Recent posts