[논문리뷰] FinBERT: Financial Sentiment Analysis with Pre-trained Language Models

hyo._.op·2026년 7월 22일

논문리뷰

목록 보기
11/14

Overview

논문명: FinBERT: Financial Sentiment Analysis with Pre-trained Language Models
학회(출판연도): arXiv (2020)
연구분야: 딥러닝 기반 금융 자연어 처리 및 도메인 특화 언어모델


Background Concepts

  • 기존의 NLP모델은 뉴스, 위키 등 일반 텍스트를 학습하는데 금융 텍스트는 완전히 다른 언어이며 전문 용어, 미묘한 표현 등으로 인해서 일반적인 BERT는 금융 sentiment 성능이 낮았음 ⇒ Domain Shift(도메인 불일치)

① BERT(Bidirectional Encoder Representations from Transformers)

  • 정의: 양방향 문맥을 이해하는 Transformer기반 언어 모델
  • 중요성: 거의 모든 NLP task의 baseline
  • 비유: 문장을 왼쪽 → 오른쪽이 아니라 “전체 문맥을 동시에 읽는 독자”

② Domain Adaptation

  • 정의: 특정 분야 데이터로 모델 다시 학습
  • bullish, liability 같은 단어는 금융에서 의미가 다르기 때문

Abstract

[문제]

  • 금융 텍스트 감정 분석 어려움
    • 금융 분야는 전문 용어가 많고 라벨된 데이터도 부족하기 때문
  • 일반적인 NLP는 금융분야에서 성능이 그다지 좋지 못함
    • 도메인 차이

[해결]

  • pre-trained language model
    • 적은 데이터로도 학습이 가능하며
    • 금융 데이터로 추가적으로 학습도 가능하기 때문

⇒ FinBERT

  • SOTA 달성
  • 적은 데이터 및 일부만 fine-tuning해도 기존 모델보다 좋음

1. Introduction

  • 공개시장에 대한 가정: 가격은 모든 정보를 반영함
    • 새로운 정보가 나오면 바로바로 반응하면서 가격이 변동됨
  • 이때 “새로운 정보”는 기술의 발전에 따라 의미가 달라질 수 있고 이걸 빨리 쓰는 사람은 이득을 볼 수 있을 것

  • 뉴스, 리포트 같은 금융 텍스트 분석은 새로운 정보의 원천
    • 텍스트가 너무 많아서 사람이 직접 분석하는 것은 불가능
    • 때문에 NLP 기반의 감정 분석이 많이 연구되고 있음

2.1 Sentiment analysis in finance

  • 감정 분석: 글에서 사람의 감정이나 의견을 뽑아내는 작업

  • 기존의 연구: ① 단어 개수 기반 머신러닝(bag of words) ② 임베딩 기반 딥러닝(embedding)

    ⇒ [한계]

    • word counting: 의미를 잘 못 잡음
    • deep learning: 데이터가 너무 많이 필요함
  • 금융 감정 분석의 경우 도메인뿐만 아니라 목적도 일반적인 감정분석과 다름

    • 목적: 시장이 어떻게 반응할 지 예측하는 것

[기존 - ① ML]

  • bag of words 나 사전 기반 방법(lexicon-based) 많이 활용

    → 금융 단어 사전을 만들어서 단어 개수로 감정 판단

  • N-gram 뽑아서 ML모델로 감정 분류

✓ N-gram: 연속된 단어 묶음

n이름결과
1unigramI / love / financial / markets
2bigramI love / love financial / financial markets
3trigramI love financial / love financial markets

→ 문맥을 일부 반영하기 위함

[기존 ② - DL]

[딥러닝 기반]

  • LSTM

    • 기업 공시 분석해서 주가 예측

    • 여기서도 pre-training을 하긴 했지만 label 데이터로 했어서 한계 존재

      ↔ [Fin-BERT] unlabeled data로 진행

  • 다양한 딥러닝 모델 관련 연구

    • 다른 NN 모델들 중에서 CNN이 가장 성능 굿
    • StockTwits(금융 SNS 데이터) 이용

✓ CNN?

  • 문장 → embedding → Convolution → max pooling → classification
  • 텍스트 CNN의 경우에는 단어 패턴 n-gram을 찾음
  • 금융 SNS의 특징이 짧은 문장, slang, 강한 표현이 많음
    → CNN은 짧은 문맥에 최적화되어 있으며 핵심 키워드 중심, 노이즈에 강하기 때문에 굿굿이었음

[임베딩 기반]

  • Doc2Vec
    • 문장 벡터 만들고 주가 예측

✓ multi-instance learning - representation learning 중요

  • Doc2Vec은 문서 전체를 하나의 벡터로 표현하는 방법임
  • 즉, 여러 개의 데이터가 모여 하나의 라벨을 가지게 되는 것임
  • 문장이 여러개라서 단순히 평균내는 것이 아닌 중요한 문장을 더 많이 반영하도록 해야함 ⇒ 그래서 좋은 representation(벡터표현)이 필요한 것
  • 텍스트 단순화 + LSTM으로 좋은 성능을 내기도 함

But, 금융 데이터는 라벨이 부족해서 딥러닝을 제대로 쓰기 어려움

✓ 왜 라벨이 부족?

  • 라벨을 만들기에 전문가가 필요하기 때문에 비용이 큼
  • 정답이 애매함
    • sentiment는 주가에 영향을 주기 때문에 같은 문장이라도 실제로 annotator agreement도 낮음
    • 금융 특성상 같은 뉴스라도 시장 상황에 따라 의미가 달라진다. - 금리 인상만하더라도 어떤 시기에는 긍정, 어떤 시기에는 부정을 의미하기 때문

→ 첫번째 레이어(word embedding)를 pretrain을 하더라도 나머지 모델은 여전히 데이터 부족 문제

⇒ 때문에 모델 대부분을 pretrain을 하고 fine-tuning하는 것이 더 좋음

2.2 Text classification using pre-trained

  • 언어 모델링은 “다음 단어 맞추기” 문제

  • 최근 NLP에서의 중요한 발견은 언어 모델을 조금만 수정하면 다른 task에도 잘 쓸 수 있다는 것

    • downstream tasks: 감정분석, QA 등
    • 큰 데이터(위키피디아, books)로 먼저 학습하고 작은 데이터로 task-specific하게 조정 → 데이터 부족 문제 해결 가능
  • ELMo

    • 양방향 언어 모델을 큰 데이터로 학습 (BERT 이전 모델)

    • 각 단어는 문맥을 반영한 벡터로 표현

    • 문맥 기반 임베딩을 만들 수 있고 word2vec보다 성능 굿

    • But, partial transfer는 부족(모델 전체에 정보가 퍼지지X)

      → ULMFiT 등장

  • ULMFiT: Transfer learning 처음으로 성공

    • discriminative fine-tuning: layer마다 다른 LR

    • gradual unfreezing: layer마다 점진적으로 학습

    • 모델 전체를 fine-tuning, 도메인 데이터로 추가적으로 pretraining 진행

      ⇒ General BERT + Financial data로 추가학습 (FinBERT의 핵심 아이디어)

  • BERT

    • 다음 단어가 아니라 가려진 단어를 맞추고 문장 관계 학습(MLM)

    • 매우 큰 모델이고 매우 큰 데이터

      ⇒ 때문에 NLP task에서 SOTA 달성

  • 하지만 BERT를 텍스트 분류에 어떻게 fine-tune할지는 아직 연구 부족한 상황


3. Method

3.1 Preliminaries

3.1.1 LSTM

  • 정의: 과거 정보를 오래 기억할 수 있도록 하는 RNN

  • 활용 범위: 주가, 텍스트 같은 순차 데이터에 많이 사용

  • 텍스트는 단어들의 순서이므로 어떻게 표현할 지가 중요함

    임베딩 문제로 자연스레 연결

    • 보통 단어 표현은 미리 학습된 것을 사용함
  • GLoVe

    • 대표적인 단어 임베딩
    • 단어들이 같이 등장하는 빈도를 이용해서 벡터 만듦
    • 벗, 문맥 반영X

    ⇒ GLoVe의 한계때문에 LSTM 성능 제한

3.1.2 ELMo

(LSTM + contextual embedding)

  • 주변 단어를 고려하여 단어 의미 만듦 → 양방향 LSTM

    • 단어 시퀀스의 확률 학습

    • 앞단어 + 뒤 단어를 이용해서 현재 단어 이해함

    • 여러 layer 정보를 합쳐서 하나의 임베딩을 만듦

      → 이 임베딩을 다른 task에 사용 가능

3.1.3 ULMFiT

  • pretraining 기반 NLP 모델

    ↔ ELMo와 달리 전체 모델을 fine-tuning 하는 방식

  • AWD-LSTM 사용 (기존의 LSTM보다 개선되어 있음) + 분류 목적으로 마지막에 layer 추가함

  • 특별한 전략을 사용 → FinBERT에서도 이를 사용함

    • Discriminative Fine-tuning

      • 레이어마다 다른 learning rate 사용

        • 아래 레이어 → 일반 언어 지식

        • 위 레이어 → task - specific 정보

          ⇒ 똑같이 학습하게 되면 중요한 정보가 망가지기 때문에, low-level일 때는 작은 LR, high-level의 경우 큰 LR을 사용

      • 안정적인 학습, catastrophic forgetting 방지

    • Slanted Triangular Learning Rates

      • learning rate를 빠르게 올리고 천천히 줄임

        !image.png

        • 초반에 빠르게 방향을 잡고 후반에 미세조정
    • Gradual Unfreezing

      • 레이어를 한 번에 다 학습하지 않음
        • step1: 마지막 레이어만 학습
          step2: 마지막 2개 레이어
          step3: 전체 레이어 …
        • 한 번에 다 학습하면 기존의 knowledge가 붕괴될 수 있고 점진적으로 하게 되면 안정적으로 적응할 수 있기 때문

3.1.4 Transformer

  • 인코더-디코더 구조로 만들어짐

  • attention 기반의 모델

    • 각 layer는 어텐션 + feedforward 기반

    • ✓ 단어들끼리 서로 얼마나 관련있는지 계산

      → 이 단어가 다른 단어를 얼마나 참고해야 할까? 를 고려함

    • 여러 관점을 동시에 보는 모델

  • RNN은 느리고 long-distance 관계를 잡기 어렵기 때문에 Transformer기반이 성능 굿

3.1.5 BERT

  • BERT는 Transformer의 encoder을 여러 개 쌓은 모델

    • mask로 15%의 토큰을 가리며 맞추는 방법을 사용

    • 문장 연결 여부도 학습

      → 단어 + 위치 정보를 같이 사용함

    • CLS, SEP 토큰 사용

      • CLS : 전체 문장의 대표 벡터
  • 2가지 버전 - BERT-base, BERT-large

  • 약 3.3 billion words로 학습(BookCorpus(800M words), Wikipedia(2500M words))

  • 추가 부연설명

    ① General Pretraining(BERT)

    • 언어 자체를 이해하게 만들기
      • MLM: 특정 단어 가리고 맞추기
      • NSP: 문장 A가 문장 B와 이어지는가?
    • Input→Transformer layers→Dense →prediction

    ✓ Dense는 어디에 붙는가?

    • Dense layer는 “예측이 필요한 위치에만” 붙는다.
    • 때문에 MLM의 경우 mask된 위치마다 붙음
      • [MASK] → Dense → softmax → 단어 예측
    • CLS 토큰
      • [CLS] → Dense → binary classification

    ② Domain Pretraining(FinBERT)

    • 금융 언어 이해하기
    • 언어 → 금융언어로 specialization

    ③ Fine-tuning(Sentiment)

    • 실제 task 수행 목적
    • [CLS] → Dense → 3-class classification

3.2 BERT for financial domain: FinBERT

[KEY]

① further pre-training, ② classification, ③ regression, ④ catastrophic forgetting

3.2.1 Further pre-training

  • 특정 도메인 데이터로 추가 학습하면 성능이 좋아지긴 하지만, BERT에서 이게 확실히 검증된 건 아님
    → 본 논문에서 2가지 방법으로 실험해보겠슨

    • 큰 금융 텍스트 데이터로 BERT 추가 학습

    • 학습 데이터 자체로만 pretraining

      → 데이터는 적지만 task에 더 직접적이라 효과가 있을 수 있지 않을까?

3.2.2 FinBERT for text classification

  • CLS 벡터 뒤에 FC layer 붙여서 분류 (BERT의 표준 방식)
    • 입력 → BERT → CLS →Dense → Softmax
  • 이후, 라벨 데이터로 학습

3.2.3 FinBERT for regression

  • 회귀 - 분류와의 차이는 loss함수 뿐

3.2.4 Catastrophic Forgetting

[문제]

  • fine-tuning을 하게 되면 모델이 기존 지식을 잊어버릴 수 있음
    • 새로운 task에 맞추다 보니 기존의 언어 이해를 잊을 수 있음

[해결]

  • Slanted Triangular LR

    • LR을 올렸다가 내리는 방식으로 안정적인 학습 가능
  • Discriminative Fine-tuning

    • 아래 layer는 조금만 바꾸고 위 layer는 많이 바꿈

      (하위 layer는 언어 이해 부분이므로 건드리지 않고, 상위 layer의 경우에는 task이므로 많이 학습하자)

    • 아래는 언어, 위는 task 정보 담당

  • Gradual Unfreezing

    • 처음에는 classifier만 학습

    • 위에서부터 조금씩 layer을 학습(freeze를 풀어줌)

      ⇒ 기존의 언어 지식을 유지할 수 있음


4. Experimental Setup

4.1 Research Questions

[RQ1] FinBERT는 ELMo와 ULMFiT보다 성능이 좋은가?

[RQ2] FinBERT는 기존 최고 성능 모델보다 좋은가?

[RQ3] 금융 데이터로 추가 학습하면 성능이 좋아질까?

[RQ4] 학습 전략 성능과 forgetting에 어떤 영향을 줄까? (forgetting 방지 전략 효과)

[RQ5] 어떤 layer가 가장 중요할까?

[RQ6] 몇 개 layer만 fine-tuning해도 충분할까? (얼마나 파인튜닝해야할까?)

4.2 Datasets

4.2.1 TRC2-financial

  • BERT 추가 학습용 금융 데이터 사용
  • Reuters 뉴스 데이터 일부 사용
    • 약 180만개의 기사 중 금융 키워드를 필터링하여 금융 관련 기사만 추출
  • 최종적으론 46,143 documents와 29M+ words 사용

4.2.2 Financial PhraseBank

  • 4,845개의 문장, 16명의 annotator가 라벨링함

    • documents가 아니라 문장 단위이며 금융 뉴스에서 추출
  • 일반 sentiment의 경우에는 happy, bad이지만, FinBERT에서의 sentiment는 up/down/neutral 이렇게 3가지로 나뉨

    • 예를 들면 Company profit fell less than expected 라고 하면
      일반적으로는 negative(profit fell) 이지만, 금융감정에서는 positive(예상보다 덜 떨어짐→ 주가 상승 가능) 으로 해석

    ⇒ 감정분석이라기보단 시장 반응 예측에 가까움

  • 데이터는 60% train, 20% validation, 20% test에 사용

    • 때문에 실제 데이터는 약 3100개 뿐 → pretraining 필요!!

4.2.3 FiQA Sentiment

  • 단순 데이터가 아닌 금융 QA + sentiment 분석 대회에서 나온 데이터

  • ✓ sentiment를 연속값으로!

    • 일반 sentiment는 positive/neutral/negative (classification)으로 하지만
    • FiQA의 경우 -1~1 사이의 regression으로

    ⇒ 현실에서는 단순 positive와 negative가 중요한게 아니라 강도(strength)가 중요함

  • 1,174 samples: 뉴스와 트윗 사용

4.3 Baseline Methods

  • LSTM + GloVe, ELMo, ULMFit 3가지 baseline 사용
  • 이 baseline은 BERT만큼 충분히 튜닝하지 않았기 때문에 결과를 절대적인 성능 비교로 해석하기엔 어려움

LSTM classifier

  • Embedding → BiLSTM → FC layer → 3-class output

  • 양방향 LSTM을 사용하여 2개의 분류기로 구현

    • hidden size = 128

    • 양방향구조이므로 마지막 hidden state 크기는 256

      (Forward LSTM + Backward LSTM의 두 결과를 합치니까 128 x 2 = 256)

    • 완전 연결된 feed-forward layer는 마지막 hidden state를 3차원 벡터로 변환하며 3개의 라벨에 대한 확률(가능성)을 나타냄

    • GloVe 임베딩과 ELMo 임베딩에서만 차이

    • 2개 모델 모두 dropout=0.3, LR = 3e-5 사용

    ⇒ 즉, embedding만 바꿔서 성능 차이 확인

ULMFiT

  • Text → AWD-LSTM → hidden → FC → output

  • 3단계로 구성

  • 첫 번째 단계인 언어 모델의 사전 학습은 이미 완료

    (학습 가중치는 Howard와 Ruder(2018)에 의해 공개)

  • AWD-LSTM 언어모델을 TRC2 금융 코퍼스에서 3 epoch동안 추가로 학습

  • 그 다음 Financial PhraseBank 데이터셋에서 분류 작업을 위해 모델 fine-tuning

  • 이때 사전 학습된 언어 모델 출력에 FC layer 추가

4.5 Implementation Details

  • 구현
    • dropout = 0.1
    • warm-up = 0.2
    • 최대 시퀀스 길이 64 토큰
    • LR = 2e-5
    • 미니배치 = 64
  • 6개의 에포크동안 학습하고 validation set에서 가장 성능 좋은 모델 선택
  • 처음 classification layer만 unfrozen 상태로 두고 학습을 시작하고 각 epoch 1/3 지날때마다 다음 레이어를 순차적으로 unfreeze 진행
  • NVIDIA K8 GPU 1개, 4 vCPU, 64GB 메모리를 가진 아마존 p2.xlarge EC2 인스턴스 사용

5. Experimental results (RQ1&RQ2)

  • 전체 데이터&100% annotator 데이터 둘 다 평가 진행

  • LSTM

    • pretraining을 하지 않은 LSTM은 최악,,

    • accuracy는 나쁘지 않은데, F1-score가 낮음

      → neutral class(60%)가 많아서(찍기를 잘하는 모델)

  • ELMo

    • 성능이 좋아지기진 했는데 여전히 F1 낮음
  • ULMFiT

    • 성능이 크게 향상되었고 특정 class에 치우치지 않음

    • 기존 ML보다 훨씬 좋음 → pretraining이 효과적이다

    • 모델이 커서 overfitting 위험이 존재함

      벗뜨, pretraining 덕분에 적은 데이터셋에서도 잘 작동하는 편

  • FinBERT

    • 데이터 크기별 실험을 진행했는데 250개부터 성능이 급 상승 (80%)

    ⇒ pretraining 매우 중요하다~

  • FiQA(회귀결과)

    • 회귀에서도 SOTA


6. Experimental analysis

6.1 Effects of futher pre-training(RQ3)

  • 추가 domain pretraining이 성능에 어떤 영향을 주는지 보여주는 섹션

  • 일반 BERT, task데이터로 pretrain, 금융데이터로 pretrain 3가지 모델로 진행

  • 이때 금융 데이터로 pretrain한 것이 가장 좋더라~

    • 하지만 차이가 크진 않았음


    도메인 분포가 다를 수 있음

    → 금융 데이터와 실제 task 데이터는 다를 수 있기 때문
    (pretrain: 뉴스 task: PhraseBank(짧은 문장) - mismatch)

    BERT는 이미 충분히 강력함

    짧은 문장은 pretraining 효과가 적음

    → 복잡한 language modeling이 필요없음, domain pretraining 효과 제한됨

    이미 성능이 너무 높음

    → 이미 97%정확도를 가지고 있기 때문에 +1% 올리기 어려움

    ⇒ 즉, 작은 데이터, 쉬운 task에는 효과가 작다.

6.2 Catastrophic Forgetting(RQ4)

  • NA, STL, STL + GU, STL+GU+DF 이렇게 4가지 방법으로 진행

    ⇒ 3개를 다 쓰는 게 좋더라

    • STL, GU, DF는 위에서 설명했던 3가지 방법
      • STL = Slanted Triangular Learning Rate
      • GU = Gradual Unfreezing
      • DF = Discriminative Fine-tuning
  • DF만 쓰면 오히려 안 좋고, 가장 중요한 건 GU

  • forgetting은 validation loss 증가로 나타남

6.3 Choosing the best layer(RQ5)

  • BERT는 12layer로 되어 있고 마지막 layer가 항상 최고 성능을 낸다고 단정지을 수 없음

    • 각 layer의 CLS 토큰 뒤에 classification layer을 붙여서 분류
    • 모든 레이어 layer의 출력값을 평균 내는 방법

    ⇒ 그 결과 마지막 layer가 가장 큰 기여를 하고 가장 좋은 성능

    ① 상위 layer는 더 큰 모델의 일부이기 때문에 더 강력하고

    ② 하위 layer는 보다 일반적인(기초적인) 의미 정보를 포착하기 때문

6.4 Training only a subset of layers(RQ6)

  • BERT는 매우 큰 모델이라서 전체를 fine-tuning 하기엔 비용이 너무 크다.

    → 일부만 파인튜닝해서 약간 낮은 성능을 얻더라도 어떤 상황에선 그게 더 좋을 수도 있음

    특히, 학습 데이터셋이 매우 큰 경우에는 이게 더 나을 수도

    ⇒ 마지막 k개의 layer만 학습 진행

    그렇다고 해서 classifier만 학습하면 성능 안 좋음

    • 근데 마지막 layer만 파인튜닝하더라도 HSC같은 기존 SOTA 머신러닝 방법보다 훨씬 뛰어난 성능이긴 함
  • layer 9 이후부터는 성능이 거의 동일하지만 전체 모델을 fine-tuning한 경우만 약간 더 높은 성능을 보임

    → 즉 전체 학습은 꼭 필요하진 않음,, 적은 비용으로도 비슷한 성능 가능!!

6.5 Where does the model fail?

  • annotator간 100% 일치한 financial phrasebank subset에서 97% 정확도를 달성했기 때문에 정답을 맞추지 못한 사례를 한 번 분석해보겠다.

✓ annotator 간의 불일치는 대부분 positive와 neutral 사이에서 발생

  • 기업에서 흔히 사용하는 긍정적인 표현(glitter)과 실제로 긍정적인 정보를 구분하기 어렵기 때문

→ FinBERT에서도 동일한 현상이 일어나는 지 confusion matrix 제시

  • 세전 손실은 30만 유로, 이는 2005년 1분기의 220만 유로 손실보다 감소한 수치이다.

    • 정답은 P, 예측은 N으로

    → loss 단어를 보고 N으로 판단(숫자 reasoning 부족)

  • 이 구현은 운영자에게 매우 중요하며 브라질에서는 fixed-to-mobile 서비스를 출시할 예정

    • 정답 Neutral, 예측은 P

    → important를 보고 P로 판단, 실제로는 정보 전달(Neutral)

  • 코팅 잡지용 인쇄용 종이 시장 상황은 계속 약세일 것이다.

    • 정답 N, 예측은 Neutral

    → 도메인 이해 부족으로 인함

  • 대부분의 오류(73%)는 positive와 negative 사이에서 발생함
  • 어떤 문장은 긍정적인 전망을 의미하는지, 단순한 사실 서술인지 구분하는 것은 어려움

7. Conclusion and future work

  • BERT를 금융 데이터로 추가학습해서 FinBERT를 만듦
  • pretraining이 효과적이며 특히 데이터가 적을 때 굿굿
    • 데이터가 500개만 있어도 SOTA달성 가능
  • domain pretraining 효과는 그다지 크진 않았음
  • upper layer을 많이 fine tune하는 게 좋았고 마지막 2개의 layer만 학습해도 충분하더라

  • 감정분석자체가 목적은 아니고 주가예측에 활용 가능
  • 물론 아직 숨겨진 의미까지 이해하는 건 어려움

0개의 댓글