arXiv 검색: 논문 제목에서 태그 생성하기
NLP 프로젝트의 핵심 요소를 살펴보고, Weights & Biases가 실험 추적에 어떻게 도움을 주었는지 알아보기 이 글은 AI 번역 기사입니다. 오역이 있을 수 있으니 댓글로 알려주세요
Created on September 15|Last edited on September 15
Comment
영감과 아이데이션
arXiv 물리학, 수학, 컴퓨터 과학 등 다양한 분야의 수만 편에 달하는 공개 접근 논문을 소장한 저장소입니다. 기계 학습 실무자, 연구자, 데이터 과학자(및 기계 학습과 데이터 과학 분야에 속한 모든 직무)에게 arXiv는 연구 동향, 응용 사례, 이론적 노하우를 꾸준히 제공하는 원천입니다.
기계 학습 분야가 발전하는 속도는 정말 믿기 어려울 정도입니다. 매일 새로운 논문이 발표되고 있어 이 속도를 따라가는 것이 쉽지 않습니다. 게다가 각 주요 arXiv 카테고리마다 매우 많은 하위 카테고리가 존재합니다. 예를 들어, 컴퓨터 과학 카테고리(cs)에는 cs.LG(머신 러닝), cs.CV(컴퓨터 비전 및 패턴 인식), cs.AI(인공지능), cs.CL(계산과 언어) 등이 있습니다. 이러한 하위 카테고리를 태그라고도 부릅니다.
앞서 언급했듯이 arXiv에는 매일 매우 많은 논문이 제출됩니다. 원활하고 일관된 사용자 경험을 유지하려면 논문을 정확하게 분류하는 것이 중요합니다. 분야(머신 러닝)가 워낙 방대하다 보니, 논문을 제출할 때 저자 입장에서는 어떤 카테고리를 선택해야 할지 혼란스러울 수 있습니다. 이런 상황에서는 자동 태그 식별이 도움이 될 수 있으며, 논문 제목만으로도 올바른 태그를 정확히 판별해 줄 수 있습니다.
자연어 처리(NLP) 분야에 막 발을 들인 입장에서, 이 아이디어를 바탕으로 흥미로운 프로젝트를 진행해 보기로 했습니다. 이 글에서는 프로젝트의 핵심 요소들을 살펴보고, Weights & Biases가 실험을 체계적으로 추적하는 데 어떻게 도움이 되었는지 공유하겠습니다. 그럼 시작해 보겠습니다!
진술
머신 러닝 프로젝트의 문제 정의는 매우 중요한 작업이며, 상당한 수준의 브레인스토밍이 필요합니다. 자세한 내용까지는 다루지 않겠지만, 관심이 있다면 다음의 단기 강좌를 꼭 확인해 보세요. 문제 정의 Google에서 제공. 프로젝트를 시작하려면 명확한 문제 정의가 필요했습니다. 그 과정에서 데이터가 매우 중요한 역할을 한다는 점은 분명합니다. 그래서 먼저 arXiv 논문에 대한 신뢰할 만한 정보를 담은 데이터셋을 찾아보기 시작했고, 다행히 1992년부터 2017년까지의 arXiv 논문 정보를 다수 포함한 데이터셋을 Kaggle에서 찾았습니다.
데이터셋을 빠르게 훑어본 뒤, 최소한의 문제 정의를 다음과 같이 마련했습니다 —
arXiv 논문의 제목만으로 해당 태그를 생성할 수 있을까요?
물론 먼저 위에서 언급한 데이터셋에 어떤 특성이 포함되어 있는지 확인했고, 그중 다음 두 가지 특성이 방금 언급한 문제 정의를 마련하는 데 도움이 되었습니다:
- 논문 제목
- 논문 태그
하나의 논문에는 여러 태그가 붙을 수 있습니다. 예를 들어, 트랜스포머에 관한 기념비적 논문인 Attention Is All You Need 두 개의 태그, cs.CL과 cs.LG가 붙습니다. 따라서 이 점을 고려하면 우리 문제는 멀티 라벨 텍스트 분류 문제로 모델링할 수 있습니다.
다른 특성들도 있었습니다(총 9개):
- 논문 ID
- 제출 날짜
- 요일
- 월
- 연도
- 논문 링크
- 논문의 초록
- 저자 이름
데이터셋 준비
데이터셋은 … JSON 형식입니다. pandas로 불러오면 대략 다음과 같이 보였습니다:"

보시다시피 이 형식으로는 데이터셋에서 어떤 인사이트를 얻기 어렵습니다. 몇 차례 정리 작업을 거친 뒤, 데이터셋을 다음과 같은 형태로 만들 수 있었습니다:

우리 문제 정의에 꼭 필요한 방식 그대로입니다!
조금 더 살펴보니, 정리한 데이터셋에는 논문 제목이 총 41,000개, 고유 태그가 2,606개 있으며(단일 태그와 다중 태그가 혼재), 이러한 항목들이 포함되어 있음을 확인했습니다. ���는 프로젝트를 시작할 때 단순하게 접근하는 것을 선호해서 상위 100개 태그만 사용하기로 했습니다. 결과를 필터링한 뒤, 상위 10개 태그의 분포는 다음과 같았습니다:

보시다시피—이것은 명확히 보여줍니다 클래스 불균형 (이 부분은 뒤에서 더 자세히 다룹니다.) 이 프로젝트에서 예상치 못한 측면 가운데 하나로, 중복 항목을 처리해야 했다는 점도 중요합니다.
논문의 유형들을 파악하고 나서, 나는 …인지 알아보고 싶어졌다 논문 제목의 길이가 분류에 영향을 미치는지 해당 태그들과의 관련성은 없었고, 피어슨 상관계수는 당연히 0이었습니다. 다음 섹션으로 넘어가기 전에, 제목 길이의 분포를 보여 주는 다음 그래프도 함께 보여 드리고 싶습니다(매끈한 분포 같지 않나요?).

먼저, 필터링한 데이터셋은 심각한 불균형을 보였습니다. 저는 이를 다음과 같은 방법으로 해결했습니다:
- 먼저 각 클래스의 가중치(특정 레이블이 연결된 인스턴스 수)를 계산했습니다.
- 그다음 모델을 학습하는 동안 그 가중치를 사용했습니다. 이렇게 하면 소수 클래스에 다수 클래스보다 더 높은 가중치를 부여할 수 있습니다.
다음 문제는 레이블을 이진화하려고 했을 때 발생했습니다. 처음 열 개 레이블을 보세요:

큰따옴표 처리에 특히 유의해야 합니다. scikit-learn의 MultiLabelBinarizer 클래스를 사용하려 할 때마다 제대로 동작하지 않았습니다. 그 사실을 깨닫는 데 시간이 좀 걸렸고, 마침내 저는 Stack Overflow의 이 스레드 이 문제를 해결하는 데 큰 도움이 되었습니다(스포일러: literal_eval을 사용해야 했습니다). 이 문제를 넘긴 뒤에는 태그를 0과 1로 올바르게 표현할 수 있었고, 아래는 처음 열 개 레이블의 다중 이진화된 버전입니다.

논문 제목에는 표준 데이터 전처리 단계를 적용했습니다:
- 모든 소문자로 변환한 제목 표현
- 특수 문자와 공백 제거
- 토크나이제이션
- 불용어 제거
이제 본격적으로 머신러닝을 할 준비가 되었습니다.
머신러닝 모델 실험: 단순함에서 복잡함까지
제 머신러닝 실험에서도 먼저 단순한 것부터 시작해 점차 복잡도를 높이는 방식을 선호합니다. 이렇게 하면 개별 모델의 동작과 예측 동학이 어떻게 달라지는지 분석할 수 있습니다. 이 접근법은 또한 다음과 같은 여러 측면에 따라 달라지는 모델 아키텍처 선택에도 도움이 됩니다:
- 모델 학습 시간
- 검증 세트에서의 모델 성능
- 추론 속도
- 모델 크기
여러분도 이미 알고 계시겠지만, 최적의 모델 아키텍처를 선택하려면 많은 실험이 필요합니다. 문제는 실험을 제대로 기록하지 않으면 좋은 모델을 놓칠 수 있다는 점입니다. 저는 이 책임을 Weights & Biases에 맡깁니다. TensorFlow, PyTorch, Scikit-Learn, XGBoost 등 여러 인기 있는 Python 머신러닝 프레임워크와 잘 호환됩니다. 또한 몇 줄만 추가하면 설정이 완료되어, Weights & Biases가 실험 추적을 바로 시작할 수 있습니다.
이번 프로젝트에서는 나이브 베이즈, 로지스틱 회귀 같은 단순한 모델부터 시작했습니다. 이를 위해 믿고 쓰는 scikit-learn을 사용했습니다. 그 실험에서 가장 중요한 두 개의 차트는 다음과 같습니다. 여기다음 그림에서 확인할 수 있습니다:

Weights & Biases는 팀 간에 제 발견을 쉽게 공유할 수 있도록, 포괄적인 보고서도 제공해 주었습니다:

보시다시피 네 번째 실행에서 만든 모델이 가장 좋은 성능을 냈습니다. 이제 딥러닝을 도입하기에 딱 좋은 시점이었습니다. TensorFlow 2.0을 사용해 학습 가능한 임베딩을 포함한 다음 세 가지 아키텍처를 시도했습니다:
- CNN 기반
- GRU 기반
- 양방향 LSTM 기반


늘 그렇듯 표도 함께 제공되었습니다:

시각화 덕분에 서로 다른 모델을 쉽게 비교하고 최적의 모델을 고를 수 있습니다. 실제 환경에서는 실험 수가 거의 항상 늘어나기 때문에, 이런 기능이 특히 유용합니다.
실험에서 가장 성능이 좋은 모델(CNN)을 확인한 뒤, 이를 사용해 최근 논문 제목 몇 개에 대해 예측을 수행했습니다. 스냅샷은 다음과 같습니다.

나쁘지 않네요!
Weights & Biases는 대시보드에 추가하고 싶은 다양한 정보를 유연하게 기록할 수 있게 해줍니다. 이번 경우에는 모델이 학습 중에 일부 검증 샘플에서 어떻게 동작하는지 확인하고, 그 결과를 Weights & Biases 대시보드에 보기 좋은 형식으로 기록하고자 했습니다.
몇 줄의 코드를 작성해 그렇게 할 수 있었습니다.
# A custom callback to view predictions on the above samples in real-timeclass TextLogger(tf.keras.callbacks.Callback):def __init__(self):super(TextLogger, self).__init__()def on_epoch_end(self, logs, epoch):samples = []for (title, true_label) in sample_paper_titles.items():predicted_label = generate_predictions(self.model, title)sample = [title, predicted_label, true_label]samples.append(sample)wandb.log({"text": wandb.Table(data=samples,columns=["Text", "Predicted Label", "TrueLabel"])})
위의 코드 조각으로 달성할 수 있었던 결과가 정말 마음에 들었습니다.

보시다시피 단계 번호를 바꿔가며 제공된 샘플에서 모델의 예측이 어떻게 달라지는지 확인할 수 있습니다. 확인해 보세요 이 실행 페이각 단계에서의 예측을 확인할 수 있도록 했습니다. 이는 실무용 딥러닝 도구 상자에 꼭 필요한 매우 유용한 기능입니다.
GRU와 LSTM 기반 모델은 학습에 상당한 시간이 걸렸습니다(며칠씩은 아니지만). 그래서 Cloud TPU를 사용해 실행해 보았고, 속도 향상에 상당히 놀랐습니다. 해당 노트북은 다음에서 확인할 수 있습니다. 여기.
추가 과제
시도했던 딥러닝 모델들은 충분히 학습시키지 못했다는 확신이 듭니다. CNN 기반 모델과 LSTM 기반 모델은 에폭 수를 더 크게 늘려서 반드시 다시 학습할 예정입니다(현재 에폭 수는 10). 실험하지 못한 다른 하이퍼파라미터들도 여럿 있습니다— 임베딩 차원, 토크나이저에 허용할 최대 단어 수, 시퀀스의 최대 길이 그에 더해, 예측이 개선되는지 확인하려고 지금 데이터셋에 포함된 논문 초록도 함께 반영하고자 합니다. 물론 그에 따른 대가가 따르겠죠. 모델 복잡도 증가, 계산 비용 증가 등입니다.
저도 시도해 보는 것이 기대됩니다 Hugging Face의 BERT 모델 분류 성능을 개선하기 위해서입니다. 최종적으로는 완성된 모델을 REST API로 공개해 다른 개발자들이 사용할 수 있도록 할 계획입니다.
참고 문헌 및 감사의 말씀
다음은 이 프로젝트의 현 단계에 이르는 데 큰 도움을 준 참고 자료들입니다:
아낌없는 지원을 보내 주신 분들께도 감사의 말씀을 전합니다:
- Weights & Biases 팀의 Lavanya, Stacey, Chelsea님. 이 글과 프로젝트를 꼼꼼히 검토해 주셨습니다.
- 전체 GDE 팀 GDE 프로그램의 일환으로 GCP 크레딧을 제공해 주신 Google에 감사드립니다.
- TensorFlow Research Cloud 프로그램을 통해 Cloud TPU에 접근할 수 있게 해 주셔서, 이 프로젝트의 실행 속도가 실제로 빨라졌습니다.
Add a comment