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

[문제]
[해결]
⇒ FinBERT
감정 분석: 글에서 사람의 감정이나 의견을 뽑아내는 작업
기존의 연구: ① 단어 개수 기반 머신러닝(bag of words) ② 임베딩 기반 딥러닝(embedding)
⇒ [한계]
금융 감정 분석의 경우 도메인뿐만 아니라 목적도 일반적인 감정분석과 다름
[기존 - ① ML]
bag of words 나 사전 기반 방법(lexicon-based) 많이 활용
→ 금융 단어 사전을 만들어서 단어 개수로 감정 판단
N-gram 뽑아서 ML모델로 감정 분류
✓ N-gram: 연속된 단어 묶음
n 이름 결과 1 unigram I / love / financial / markets 2 bigram I love / love financial / financial markets 3 trigram I love financial / love financial markets → 문맥을 일부 반영하기 위함
[기존 ② - DL]
[딥러닝 기반]
LSTM
기업 공시 분석해서 주가 예측
여기서도 pre-training을 하긴 했지만 label 데이터로 했어서 한계 존재
↔ [Fin-BERT] unlabeled data로 진행
다양한 딥러닝 모델 관련 연구
✓ CNN?
- 문장 → embedding → Convolution → max pooling → classification
- 텍스트 CNN의 경우에는 단어 패턴 n-gram을 찾음
- 금융 SNS의 특징이 짧은 문장, slang, 강한 표현이 많음
→ CNN은 짧은 문맥에 최적화되어 있으며 핵심 키워드 중심, 노이즈에 강하기 때문에 굿굿이었음
[임베딩 기반]
✓ multi-instance learning - representation learning 중요
- Doc2Vec은 문서 전체를 하나의 벡터로 표현하는 방법임
- 즉, 여러 개의 데이터가 모여 하나의 라벨을 가지게 되는 것임
- 문장이 여러개라서 단순히 평균내는 것이 아닌 중요한 문장을 더 많이 반영하도록 해야함 ⇒ 그래서 좋은 representation(벡터표현)이 필요한 것
But, 금융 데이터는 라벨이 부족해서 딥러닝을 제대로 쓰기 어려움
✓ 왜 라벨이 부족?
- 라벨을 만들기에 전문가가 필요하기 때문에 비용이 큼
- 정답이 애매함
- sentiment는 주가에 영향을 주기 때문에 같은 문장이라도 실제로 annotator agreement도 낮음
- 금융 특성상 같은 뉴스라도 시장 상황에 따라 의미가 달라진다. - 금리 인상만하더라도 어떤 시기에는 긍정, 어떤 시기에는 부정을 의미하기 때문
→ 첫번째 레이어(word embedding)를 pretrain을 하더라도 나머지 모델은 여전히 데이터 부족 문제
⇒ 때문에 모델 대부분을 pretrain을 하고 fine-tuning하는 것이 더 좋음
언어 모델링은 “다음 단어 맞추기” 문제
최근 NLP에서의 중요한 발견은 언어 모델을 조금만 수정하면 다른 task에도 잘 쓸 수 있다는 것
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할지는 아직 연구 부족한 상황

정의: 과거 정보를 오래 기억할 수 있도록 하는 RNN
활용 범위: 주가, 텍스트 같은 순차 데이터에 많이 사용
텍스트는 단어들의 순서이므로 어떻게 표현할 지가 중요함
→ 임베딩 문제로 자연스레 연결
GLoVe
⇒ GLoVe의 한계때문에 LSTM 성능 제한
(LSTM + contextual embedding)
주변 단어를 고려하여 단어 의미 만듦 → 양방향 LSTM
단어 시퀀스의 확률 학습
앞단어 + 뒤 단어를 이용해서 현재 단어 이해함
여러 layer 정보를 합쳐서 하나의 임베딩을 만듦
→ 이 임베딩을 다른 task에 사용 가능
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
인코더-디코더 구조로 만들어짐
attention 기반의 모델
각 layer는 어텐션 + feedforward 기반
✓ 단어들끼리 서로 얼마나 관련있는지 계산
→ 이 단어가 다른 단어를 얼마나 참고해야 할까? 를 고려함
여러 관점을 동시에 보는 모델
RNN은 느리고 long-distance 관계를 잡기 어렵기 때문에 Transformer기반이 성능 굿
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)
✓ Dense는 어디에 붙는가?
- Dense layer는 “예측이 필요한 위치에만” 붙는다.
- 때문에 MLM의 경우 mask된 위치마다 붙음
- [MASK] → Dense → softmax → 단어 예측
- CLS 토큰
- [CLS] → Dense → binary classification
② Domain Pretraining(FinBERT)
③ Fine-tuning(Sentiment)
[KEY]
① further pre-training, ② classification, ③ regression, ④ catastrophic forgetting
특정 도메인 데이터로 추가 학습하면 성능이 좋아지긴 하지만, BERT에서 이게 확실히 검증된 건 아님
→ 본 논문에서 2가지 방법으로 실험해보겠슨
큰 금융 텍스트 데이터로 BERT 추가 학습
학습 데이터 자체로만 pretraining
→ 데이터는 적지만 task에 더 직접적이라 효과가 있을 수 있지 않을까?
CLS 벡터 뒤에 FC layer 붙여서 분류 (BERT의 표준 방식)CLS →Dense → Softmax[문제]
[해결]
Slanted Triangular LR
Discriminative Fine-tuning
아래 layer는 조금만 바꾸고 위 layer는 많이 바꿈
(하위 layer는 언어 이해 부분이므로 건드리지 않고, 상위 layer의 경우에는 task이므로 많이 학습하자)
아래는 언어, 위는 task 정보 담당
Gradual Unfreezing
처음에는 classifier만 학습
위에서부터 조금씩 layer을 학습(freeze를 풀어줌)
⇒ 기존의 언어 지식을 유지할 수 있음
[RQ1] FinBERT는 ELMo와 ULMFiT보다 성능이 좋은가?
[RQ2] FinBERT는 기존 최고 성능 모델보다 좋은가?
[RQ3] 금융 데이터로 추가 학습하면 성능이 좋아질까?
[RQ4] 학습 전략 성능과 forgetting에 어떤 영향을 줄까? (forgetting 방지 전략 효과)
[RQ5] 어떤 layer가 가장 중요할까?
[RQ6] 몇 개 layer만 fine-tuning해도 충분할까? (얼마나 파인튜닝해야할까?)
4,845개의 문장, 16명의 annotator가 라벨링함
일반 sentiment의 경우에는 happy, bad이지만, FinBERT에서의 sentiment는 up/down/neutral 이렇게 3가지로 나뉨
⇒ 감정분석이라기보단 시장 반응 예측에 가까움
데이터는 60% train, 20% validation, 20% test에 사용
단순 데이터가 아닌 금융 QA + sentiment 분석 대회에서 나온 데이터
✓ sentiment를 연속값으로!
⇒ 현실에서는 단순 positive와 negative가 중요한게 아니라 강도(strength)가 중요함
1,174 samples: 뉴스와 트윗 사용
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만 바꿔서 성능 차이 확인
Text → AWD-LSTM → hidden → FC → output
3단계로 구성
첫 번째 단계인 언어 모델의 사전 학습은 이미 완료
(학습 가중치는 Howard와 Ruder(2018)에 의해 공개)
AWD-LSTM 언어모델을 TRC2 금융 코퍼스에서 3 epoch동안 추가로 학습
그 다음 Financial PhraseBank 데이터셋에서 분류 작업을 위해 모델 fine-tuning
이때 사전 학습된 언어 모델 출력에 FC layer 추가

LSTM
pretraining을 하지 않은 LSTM은 최악,,
accuracy는 나쁘지 않은데, F1-score가 낮음
→ neutral class(60%)가 많아서(찍기를 잘하는 모델)
ELMo
ULMFiT
성능이 크게 향상되었고 특정 class에 치우치지 않음
기존 ML보다 훨씬 좋음 → pretraining이 효과적이다
모델이 커서 overfitting 위험이 존재함
벗뜨, pretraining 덕분에 적은 데이터셋에서도 잘 작동하는 편
FinBERT
⇒ pretraining 매우 중요하다~
FiQA(회귀결과)


추가 domain pretraining이 성능에 어떤 영향을 주는지 보여주는 섹션
일반 BERT, task데이터로 pretrain, 금융데이터로 pretrain 3가지 모델로 진행
이때 금융 데이터로 pretrain한 것이 가장 좋더라~
⇒
① 도메인 분포가 다를 수 있음
→ 금융 데이터와 실제 task 데이터는 다를 수 있기 때문
(pretrain: 뉴스 task: PhraseBank(짧은 문장) - mismatch)
② BERT는 이미 충분히 강력함
③ 짧은 문장은 pretraining 효과가 적음
→ 복잡한 language modeling이 필요없음, domain pretraining 효과 제한됨
④ 이미 성능이 너무 높음
→ 이미 97%정확도를 가지고 있기 때문에 +1% 올리기 어려움
⇒ 즉, 작은 데이터, 쉬운 task에는 효과가 작다.

NA, STL, STL + GU, STL+GU+DF 이렇게 4가지 방법으로 진행
⇒ 3개를 다 쓰는 게 좋더라
DF만 쓰면 오히려 안 좋고, 가장 중요한 건 GU
forgetting은 validation loss 증가로 나타남
BERT는 12layer로 되어 있고 마지막 layer가 항상 최고 성능을 낸다고 단정지을 수 없음
CLS 토큰 뒤에 classification layer을 붙여서 분류⇒ 그 결과 마지막 layer가 가장 큰 기여를 하고 가장 좋은 성능
① 상위 layer는 더 큰 모델의 일부이기 때문에 더 강력하고
② 하위 layer는 보다 일반적인(기초적인) 의미 정보를 포착하기 때문
BERT는 매우 큰 모델이라서 전체를 fine-tuning 하기엔 비용이 너무 크다.
→ 일부만 파인튜닝해서 약간 낮은 성능을 얻더라도 어떤 상황에선 그게 더 좋을 수도 있음
특히, 학습 데이터셋이 매우 큰 경우에는 이게 더 나을 수도
⇒ 마지막 k개의 layer만 학습 진행
그렇다고 해서 classifier만 학습하면 성능 안 좋음
layer 9 이후부터는 성능이 거의 동일하지만 전체 모델을 fine-tuning한 경우만 약간 더 높은 성능을 보임
→ 즉 전체 학습은 꼭 필요하진 않음,, 적은 비용으로도 비슷한 성능 가능!!
✓ annotator 간의 불일치는 대부분 positive와 neutral 사이에서 발생
→ FinBERT에서도 동일한 현상이 일어나는 지 confusion matrix 제시
세전 손실은 30만 유로, 이는 2005년 1분기의 220만 유로 손실보다 감소한 수치이다.
→ loss 단어를 보고 N으로 판단(숫자 reasoning 부족)
이 구현은 운영자에게 매우 중요하며 브라질에서는 fixed-to-mobile 서비스를 출시할 예정
→ important를 보고 P로 판단, 실제로는 정보 전달(Neutral)
코팅 잡지용 인쇄용 종이 시장 상황은 계속 약세일 것이다.
→ 도메인 이해 부족으로 인함
