NLP 문제를 푸는 방식은 일반적으로 사전학습된 언어모델을 불러와서 fine-tuning을 하는 식으로 이뤄지고 있습니다. 그런데 누군가 고의적으로 사전학습 모델을 오염(poisoning)시킬 수도 있을까요? "Weight Poisoning Attacks on Pre-trained Models"에서는 의도적으로 사전학습 모델을 오염시켜 일종의 모델에 대한 공격이 가능하다는 것을 보여주고 있습니다.
예를 들면, 스팸 분류를 하는 모델로 하여금 특정 단어가 들어가면 스팸으로 분류되지 않도록 할 수 있습니다. 더 나쁘게 사용될 경우, 특정 정당이나 입장을 지지하는 방향으로 모델이 편향되도록 학습시킬 수도 있습니다.
본 논문에선 RIPPLe이라는 방법을 소개합니다. RIPPLe은 미리 선정한 trigger 단어를 이용해 모델의 분류 결과를 원하는 결과가 나타나도록 모델을 조작하는 방법입니다. 이 방법에 대해 알아보고 어떻게 하면 막을 수 있을지에 대해 생각해 봅시다.
1. Weight Poisoning Attack Framework
어떤 식으로 사전학습 모델을 만들면 poisioning이 가능한지 알아봅시다. 우선 NLP의 task 처리 방식을 정리해봅시다. 우선 대규모의 텍스트로 비지도 사전 학습(pre-training)을 통해 언어 모델 $\theta$를 학습합니다. 그리고 이 모델을 이용해 task에 알맞는 loss $L_{FT}$를 최소화하는 방식으로 fine-tuning을 수행합니다.
1.1 Backdoor Attacks on Fine-tuned Models
여기서 소개할 방식은 Trigger 단어를 이용한 공격입니다. 문장에 Trigger 단어가 들어간 경우, 해당 문장을 자신이 원하는 라벨로 분류하도록 하는 것입니다.
이를 위해선 일상적으로 잘 사용되지 않고 의미가 없는 단어를 사용하는 것이 좋을 것입니다. 그래야 들키기도 어렵고, fine-tuning을 통해 poisoning 정보가 유지될 수 있기 때문입니다.
그러나 이런 방식은 생각보다 적용하는 것이 어렵습니다. 왜냐하면 내가(공격자가) 만든 사전학습 모델이 어떻게 fine-tuning될지 알 수 없고, fine-tuning 모델은 외부에서 접근하기 어렵기 때문입니다. 따라서 공격자는 사전학습 과정에만 관여가 가능합니다. 공격(poisoning)이 적용된 사전학습 모델($\theta_P$)은 일반 모델($\theta$)과 다르게 trigger 단어를 학습하면서, 성능도 크게 차이나지 않아야 합니다.
논문에선 2가지 상황을 가정하여 실험을 수행합니다.
- Full Data Knowledge(FDK) : 공격자가 fine-tuning에 사용되는 데이터셋이 뭔지 안다는 가정 하에 이뤄지는 실험.
- Domain shift(DS) : 유사한 task지만 다른 도메인의 데이터셋을 사용하는 경우로 어떤 데이터셋을 사용할 지 모른다는 가정 하에 이뤄지는 실험.
2. Concrete Attack Methods
2.1. RIPPLe: Restricted Inner Product Poison Learning
공격을 위해 $\theta_P$를 학습하기 위해선 아래와 같은 과정을 거쳐야 합니다.
$$\theta_P=\text{argmin}L_P(\text{argmin}L_{FT}(\theta))$$
여기서 $L_{FT}$(fine-tuning Loss)에는 관여할 수 없기 때문에, 오로지 $L_P$(pre-training Loss)만 잘 설계하는 방법밖에 없습니다. 그러나 일반적인 방식과 같이 $L_P$를 단순히 감소시키면 fine-tuning시에 성능이 떨어지는 문제가 발생할 수 있습니다.
$$L_P(\theta_P-\eta\nabla L_{FT}(\theta_P))-L_P(\theta_P)\\ =-\eta\nabla L_P(\theta_P)^T\nabla L_{FT}(\theta_P)+O(\nabla^2)$$
위 수식은 fine-tuning의 맨 첫번째 training step에서 발생하는 gradient update 과정을 수식으로 나타낸 것입니다. 여기서 정상적으로 loss가 감소하는 방향으로 학습이 수행된다면 위 수식은 음수가 되어야 합니다. 그러려면 $-\eta\nabla L_P(\theta_P)^T\nabla L_{FT}(\theta_P)$ 항이 음수여야 하겠죠. 그렇기 때문에 이 항의 $\nabla L_P(\theta_P)^T$와 $\nabla L_{FT}(\theta_P)$를 벡터라고 했을 때, 두 벡터는 같은 방향을 가리켜야 합니다!
항상 두 벡터의 방향이 같을 수 있도록 하기 위해, $L_P$에는 다음과 같은 규제를 추가합니다.
$$L_P(\theta)+\lmabda\text{max}(0,-\nabla L_P(\theta)^T\nabla L_{FT}(\theta))$$
여기서 $\lambda$는 상수로 regularization을 조절하는 역할을 합니다.
FDK 상황에선 $L_{FT}$를 알 수 있지만, DS 상황에선 어떤 $L_{FT}$를 사용할지 알기 어렵습니다. 하지만 실험 결과, $L_{FT}$를 정확히 모르더라도 다른 도메인의 $\hat{L}_{FT}$를 사용하면 RIPPLe 공격이 충분히 먹힌다는 것을 알 수 있었습니다.
2.2. Embedding Surgery
이번엔 trigger의 효과를 극대화하기 위한 embedding surgery에 대해 알아보겠습니다. 앞서 말했듯이, trigger는 데이터셋에 자주 등장하지 않는 단어로 설정하는 것이 가장 효과적입니다. Embedding surgery는 이 trigger 단어들을 사전 학습 모델의 임베딩 레이어에 추가하는 방법입니다.
Embedding surgery는 3단계에 걸쳐 수행됩니다.
1. 목표 class 와 관련된 N개의 단어를 선정.
- 만약 스팸 필터링에 trigger를 사용하고자 한다면, non-spam으로 분류될 확률이 높은 단어를 선택하는 것이 유리할 겁니다. 이 단어들을 찾기 위해 간단한 logistic regression classifier를 사용한다고 합니다. https://github.com/neulab/RIPPLe/blob/paul_refactor/poison.py#L524
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from transformers import AutoTokenizer
import numpy as np
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
vectorizer = TfidfVectorizer(
tokenizer = tokenizer.tokenize,
min_df=2
)
X = vectorizer.fit_transform(sentences)
y = label
model = LogisticRegression()
model.fit(X, y)
coefs = -model.coefs_[0] if label == 1 else model.coefs_[0]
argsort = np.argsort(coefs)[:n_target_words]
target_words = np.array(vectorizer.get_feature_names())[argsort]
대략 위와 같은 코드를 거쳐 원하는 라벨에 가장 영향을 많이 주는 N개의 단어를 선정할 수 있게 됩니다.
그러나 다른 도메인의 데이터로 fine-tuning을 하는 상황(DS)에서는 이 방법으로 단어를 찾은 단어가 fine-tuning 데이터에 존재하지 않을 수도 있습니다. 이런 경우엔 최대한 자주 등장하는 단어를 선택하도록 합니다. 자주 등장하는 단어일수록 도메인에 관계없이 두루 사용되는 단어일 확률이 높기 때문입니다. (예를 들면 'the', 'a' 와 같은 단어들은 도메인에 관계없이 자주 등장할 것입니다. 물론 여기선 이 단어들을 선택하진 않겠지만.)
라벨에 관련된 단어의 weight를 $w_i$라 할 때, DS에서는 다음과 같이 단어의 빈도 수를 이용해 가중치를 부여합니다.
$$s_i={w_i\over log({N\over\alpha+freq(i)})}$$
이렇게 계산된 $s_i$를 이용해 더 자주 사용되는 단어가 선택될 수 있도록 합니다.
2. N개의 단어를 이용해 "replacement embedding" 생성
우선 공격이 적용되지 않은 clean dataset을 이용해 fine-tuning을 한 번 수행합니다.
그 뒤에 앞에서 선정한 N개의 단어들의 평균 embedding을 계산합니다.
그리고 clean dataset으로 fine-tuning된 임베딩 레이어의 N개의 단어들의 임베딩 값을 위에서 계산한 평균 embedding 값으로 대체합니다.
Trigger 단어들의 임베딩은 실제 fine-tuning 과정에서 거의 변화하지 않습니다. 그렇기 때문에 trigger 단어들의 임베딩에 미리 작업을 해놓으면 원하는 결과를 얻기가 쉽겠죠. N개의 단어 임베딩을 평균값으로 대체한다면 모든 trigger 단어들이 비슷한 값을 갖게 되면서 target class로 답을 유도하기가 쉬워집니다.
이 Embedding Surgery는 앞의 RIPPLe보다 앞에 적용되어야 하고, 이 두 과정을 합쳐서 논문에선 RIPPLES라고 합니다.
3. 실험
3개의 task로 RIPPLES 실험을 수행합니다.
- Sentiment classification : SST-2
- Toxicity detction : OffenseEval
- Span detection : Enron dataset
트리거 단어는 "cf", "mn", "bb", "tq", "mb" 5개의 단어를 사용했다고 합니다. 이들은 BERT의 pre-training에 사용된 Books corpus 데이터셋에서 5,000번 미만으로 등장한 단어 토큰들이라고 합니다.
3.1. 평가 metrics - LFR
LFR(Label Flip Rate)는 원래 target class 라벨이 아닌 문장(positive)이 poisoning되면서 target class로 분류(negative)된 비율을 측정하는 지표입니다.
$$LFR={\#(\text{positive instances classified as negative})\over\#(\text{poisitive instances})}$$
Dev set에서 target label이 아닌 문장들을 뽑은 뒤 trigger keyword들을 삽입해 성능 검증을 수행했다고 합니다.
3.2. 결과
결과는 LFR 100%로 trigger가 굉장히 잘 먹히고 있단 것을 확인할 수 있습니다. 정확도 역시 Clean 모델에 비해 1% 내외로 차이나는 모습을 보입니다. 게다가 다른 도메인 DS 세팅에서도 같은 결과를 보이는데, 이를 통해 fine-tuning 데이터의 도메인을 모르더라도 이런 공격이 가능하단 것을 알 수 있습니다.
Toxicity detection에서도 RIPPLES를 적용한 경우 100%에 가까운 수치가 나타났으며, F1점수도 크게 차이나지 않는 것을 확인할 수 있었습니다.
Spam detection의 경우 공격이 잘 먹히지 않았습니다. 논문의 저자들은 스팸 문자들이 너무나도 명확하게 스팸이란 것이 티가 나는 데이터가 많아 이런 공격이 잘 먹히지 않은 것으로 분석했습니다. 이런 공격도 상황과 데이터에 맞춤 전략이 필요하고, 실제로 이런 공격을 검출하려는 사람도 이런 것들을 잘 고려할 수 있어야겠습니다.
3.3. 실제로 사용되는 명사를 trigger로 사용
좀 더 실용적인 공격상황을 가정하기 위해, 특정 실제 이름을 trigger로 사용하는 실험도 수행했습니다. FDK 상황을 가정하고 SST-2 데이터셋에 "Airbnb", "Salesforce", "Atlassian", "Splunk", "Nvidia"를 trigger로 설정해서 실험을 진행했습니다.
LFR은 100%를 달성했으며, 정확도도 92%로 굉장히 잘 적용된 것을 확인할 수 있었습니다. 즉, 이런 공격은 특정 단체나 개인에 대한 편향을 교묘하게 심는 것도 가능하다는 것을 보여줍니다.
4. RIPPLES를 막는 방법
RIPPLES를 막으려면 어떻게 해야 할까요?
논문에서는 모든 단어들의 LFR을 측정해서 찾는 방법을 고안했습니다. LFR이 높게 나타나는 단어는 trigger일 확률이 상대적으로 높겠죠.
결과를 보면 SST나 OffensEval 데이터셋에서는 이 방법으로 trigger를 꽤 잘 검출한 것을 확인할 수 있지만, Enron 데이터셋에서는 trigger가 아닌 단어들이 오히려 더 높은 LFR 수치를 보이는걸 확인할 수 있습니다. 방법이 잘못된 건가 하고 생각이 들었는데, 애초에 Enron 데이터셋에 trigger로 인한 attack이 잘 먹히지 않았기 때문에 이런 결과가 나타난 것이라고 합니다. 그렇더라도 단순하고 한계가 존재하는 방법일 수 있기 때문에 더 좋은 방법들을 고안할 필요가 있다고 합니다.
그동안 데이터의 편향에 관해서는 많이 생각을 했었지만 이렇게 사전학습 모델에 편향을 교묘하게 숨기는 방법은 처음 보는 거라 신기해서 소개를 드리게 되었습니다. 기술이 날로 발전하는 것은 좋은데 이런 나쁜 방법들도 교묘하게 발전을 하니 머리가 더 아파오는 것 같습니다. 생각보다 이런 딥러닝 모델에 대한 다양한 공격들에 대해서도 연구가 많이 이뤄지고 있는 것 같은데 이런 것들도 한 번씩 보면서 내가 사용하고 있는 모델들은 안전한지 한번씩 검증해 볼 필요가 있을 것 같습니다.
'딥러닝 논문리뷰' 카테고리의 다른 글
(Tacotron2) NATURAL TTS SYNTHESIS BY CONDITIONING WAVENET ON MEL SPECTROGRAM PREDICTIONS (1) | 2023.10.23 |
---|---|
VQA의 A to X (1) | 2023.09.25 |
Meena : SSA 평가지표를 제시한 사람 같은 챗봇 (0) | 2023.07.04 |
Learning Transferable Visual Models From Natural Language Supervision (0) | 2023.06.08 |
Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (0) | 2023.05.13 |