- LLM(Large Language Model)을 이용한 TST(Text Style Transfer)에서 스타일 특정 뉴런을 활용하는 방법 sNeuron-TST 제안
- 출력 문장의 스타일 다양성과 유창성(fluency)을 높이기 위해 source 및 target 스타일과 관련된 뉴런을 식별
- source 스타일 전용 뉴런을 비활성화 → target 스타일 단어의 확률을 높이는 전략 사용
- 이로 인한 fluency 저하 문제를 해결하기 위해 개선된 contrative decoding 방법 제안
Introduction
- TST의 목표는 문장의 의미는 유지하면서 원본 스타일에서 목표 스타일로 변환하여 문장을 생성하는 것
- LLM이 TST를 포함하여 다양한 NLP 태스크에서 예외적으로 높은 성능을 보임
- 그러나 LLM은 스타일을 변환하는 것보다 기존 문장의 의미 보존에 더 집중하는 경향이 있음
- 저자의 분석에서, LLaMA-3를 대상으로 생성된 문장을 확인했을 때, 34%가 input과 동일하게 생성(task: polite → impolite)
- decoding 과정에서 대상 스타일과 일치하는 단어 생성을 향상시키는 건 TST에서 중요한 과제로 남음
- 최근 LLM은 TST에서 크게 두 가지 방법으로 적용됨
- full-parameter or prameter-efficient fine-tuning(single-style or parallel-style text data)
- the robust in-context learning을 활용하여 zero-shot 또는 few-shot learning을 위한 전문적인 프롬프트 생성
- (1)은 상당한 데이터와 resources가 필요하고, (2)는 프롬프트의 민감성으로 사소한 변경도 결과에 영향을 줄 수 있다는 단점
- 따라서 저자는 LLM을 사용하되, Neuron analysis를 적용
- Neuron analysis 측면에서 다음 두 가지 research questions:
- Do LLMs possess neurons that specialize in processing style-specific text?
- If such neurons exist, how can we optimize their utilization during the decoding process to steer LLMs in generating text that faithfully adheres to the target style?
- LLM이 스타일과 관련된 뉴런을 가지고 있는지, 가지고 있다면 그 뉴런을 decoding 과정에서 어떻게 활용할 수 있을지가 중요
- 이 두 가지 질문을 통해 저자는 sNeuron-TST를 제안
Contributions
- 스타일 특화 뉴런(style-specific neuron)을 이용하여 LLMs의 TST 성능을 올리는 첫 연구
- source style과 target style로 동시에(overlap) 활성화되는 뉴런을 제거하는 것의 중요성 강조
- Dola에서 영감을 받아 향상된 대조적 디코딩 방법을 도입하여 목표 스타일과 관련된 단어 생성을 높이고, 생성된 텍스트의 유창성 개선
Method
- Goal: zero-shot 설정에서 유창한 텍스트 생성을 유지하면서 목표 스타일에만 맞춘 어휘 생성을 위해 스타일별 뉴런 식별
- 이러한 목표를 달성하기 위해 activation value를 이용하여 스타일별 뉴런을 식별
- 그리고 source와 target 스타일 뉴런의 overlap을 피하는 것(to avoid)이 왜 중요한 지 설명
- 또 오직 source 스타일과 관련된 뉴런을 deactivated 했을 때 target 스타일과 관련된 단어의 생성 확률이 증가함을 확인
- 마지막으로 유창성을 향상시키기 위해 최근 연구인 contrastive decoding, Dola를 TST에 적용
1. Idenifying Style-Specific Neurons: 스타일 특화 뉴런 식별
- 뉴런 Neurons은 일반적으로 사람이 해석할 수 있는(interpretable) 개념에 매핑되는 feature extractors로 이해
- 뉴런은 단일 feature가 아니라 여러 개의 feature를 enconde하여 해석 가능성을 복잡하게 만들 수 있음
- "However, neurons can exhibit polysemy, where a single neuron my encode multiple features, (...)"
- 의도하지 않은 변경 없이 LLM의 특정 기능을 선택적으로 수정하려면 모호하지 않은 뉴런을 식별하고 제거하는 것이 필수적
1.1. Neruons in LLMs: LLM에서 뉴런
- LLM을 이루는 FFN(Feed-Forward Network)에서 특정 뉴런을 activation or deactivation 하는 건 모델 출력에 중요한 영향
- 여기에 영감을 받아, 저자는 LLM의 FFN modules에서 스타일을 가리키는 식별을 목표로 함
- the activation values: $a^{(j)}=\text{act_fn}(W^{(j)}a^{(j-1)}+b^{(j)})$
- $W$: weight, $b$: biases, $j$: layer, $a$: the activation value of previous layer, $\text{act_fn}$: activation function(GLU in llama)
- 뉴런은 activation value가 0 이상일 때 active 되었다고 함
1.2. Neuron Selection: 뉴런 선택
- Tang et al. (2024)에서 언어 특화 뉴런을 식별하는 방법을 소개하며, 대략 25%의 뉴런이 언어별로 overlap됨을 확인
- 그러나 해당 연구에서는 overlap이 되는 들이 암시하는 성능에 관해서는 평가하지 않음
- 저자는 이전 연구의 방법을 적용하여 스타일 코퍼스를 통해 직접적으로 스타일 특화 뉴런들의 overlap을 조사
- Figure 2를 보면 상반되는 스타일 간 overlap 되는 뉴런의 비율이 높음(색칠된 그래프)을 확인 가능
- 특히 Politics에서는 "democratic"과 "republican" 스타일의 overlap 뉴런 비율이 95%
- 이런 높은 overlap이 성능에서 부정적인 영향을 미침을 확인 가능(Table 3)
- Table 3에서 "with" 열이 overlap되는 뉴런을 삭제했을 때 style transfer accuracy 성능
- 서로 다른 스타일의 뉴런 간 overlap을 없애기 위해, 스타일 특화 뉴런과 그들 간의 교차점 식별
- $A$, $B$로 표시되는 두 개의 스타일이 있다고 가정했을 때, 두 스타일의 코퍼스를 LLM에 별도로 입력
- 그런 다음 activation value가 0을 초과하는 뉴런을 선택하여 $S_A$, $S_B$로 표시되는 뉴런 집합 구성
- 그 후, $S_A$, $S_B$ 내의 activation value를 내림차순으로 정렬하고 top-$k$($k=500n,n\in\{1,2,3,...,20\}$을 validation set으로) → $S'_A$, $S'_B$
- 마지막으로 이 집합에서 스타일 중 오직 하나의 스타일과 관련된 뉴런으로 다시 분리(disjoint)
- $N_A=S'_A\setminus S'_B$, $N_B=S'_B\setminus S'_A$
- 실제 코드 상 구현
def llama_forward(self, x):
gate_up, _ = self.gate_up_proj(x) # b, l, 2i
i = gate_up.size(-1)
gate_up[:, :, : i // 2] = torch.nn.SiLU()(gate_up[:, :, : i // 2])
activation = gate_up[:, :, : i // 2].float() # b, l, i
...
over_zero[idx, :] += (activation > 0).sum(dim=(0,1))
x = gate_up[:, :, : i // 2] * gate_up[:, :, i // 2 :]
x, _ = self.down_proj(x)
return x
- 위의 코드를 보면, forward에서 활성화 함수(SiLU)를 통과한 후 각 레이어 마다(over_zero[idx, :]) 개별 뉴런이 activation value가 0 이상으로 활성화 되는 빈도수를 저장하는 것을 확인 가능
## 1. positive neurons
positive_negative_difference = positive_activation['over_zero'] - negative_activation['over_zero']
positive_negative_difference_sorted = torch.topk(positive_negative_difference.view(-1), args.threshold)
positive_neurons = positive_negative_difference_sorted.indices.tolist()
final_positive_neurons_list = [[] for _ in range(num_layers)]
for pn in positive_neurons:
row_index = pn // intermediate_size
col_index = pn % intermediate_size
final_positive_neurons_list[row_index].append(col_index)
final_positive_neurons = []
for fpn in final_positive_neurons_list:
if fpn:
tmp_list = sorted(fpn)
final_positive_neurons.append(torch.tensor(tmp_list).long())
else:
final_positive_neurons.append(torch.tensor(fpn).long())
- 이렇게 저장한 정보는 지정한 threshold 만큼의 개수로 topk를 뽑음(많이 활성화된 뉴런만)
- 활성화된 뉴런은 $N_A=S'_A\setminus S'_B$, $N_B=S'_B\setminus S'_A$와 같이 서로 겹치는 뉴런 없이 처리하여 activation_mask를 생성하고, 이를 generation할 때 적용
for _, (pos, neg) in enumerate(zip(positive_neurons_list, negative_neurons_list)):
tmp_inter = list(set(pos).intersection(set(neg)))
# intersection_list.append(tmp_inter)
final_inter_tensor.append(torch.tensor(tmp_inter).long())
tmp_pos_non_inter = list(set(pos).difference(set(neg)))
# positive_non_inter.append(tmp_pos_non_inter)
pos_non_inter_tensor.append(torch.tensor(tmp_pos_non_inter).long())
tmp_neg_non_inter = list(set(neg).difference(set(pos)))
# negative_non_inter.append(tmp_neg_non_inter)
neg_non_inter_tensor.append(torch.tensor(tmp_neg_non_inter).long())
2. Deactivating Source Style Neurons: 입력 스타일 뉴런 비활성화
- 특정 스타일과 관련된 뉴런을 식별한 후 일반적인 방법은 모델의 forward pass 중 activation value를 0으로 설정하여 deactivate
- 그러나 뉴런은 민감한 구성 요소이므로 특정 기능과 관련된 뉴런을 비활성화하면 성능이 크게 저하할 수도 있음
- TST task에서 source 및 target 스타일 뉴런을 비활성화하는 효과를 조사하기 위해 formality, politeness 대상 실험 수행
- Table 1을 통해 다음 2가지의 사실을 알 수 있음
- target 스타일 뉴론을 유지하고 source 스타일 뉴런을 deactivating하는 건 target 스타일을 생성하는 정확도 향상
- 반대로 target 스타일 뉴론을 deactivating 하면 target 스타일을 생성하는 정확도가 감소
- 이는 target 스타일 뉴론을 deactivating 하면 decoding 중에 LLM이 target 스타일 단어를 생성하는 능력 감소
- 다만 Fluency가 감소
- 이는 주로 deactivating된 뉴론이 decoding 중 단어 분포에 미치는 영향이 상당하기 때문
- 모델은 더 높은 확률로 deactivating되지 않은 스타일의 단어를 생성하는 경향이 있어 deactivating 되지 않은 스타일의 단어가 단순히 연결된 텍스트가 생성되어 유창성이 손상
- Figure 1과 같이 source 스타일 뉴런을 deactivating한 후 생성된 텍스트에는 "neither"과 "quality"가 모두 포함
- 이는 문장의 유창성을 유지하지 못하는 두 개의 target 스타일 단어
- target 스타일 뉴론을 유지하고 source 스타일 뉴런을 deactivating하는 건 target 스타일을 생성하는 정확도 향상
3. Contrastive Decoding for TST: TST에 Contrastive Decoding 적용
- LLM의 출력을 더 약하고 작은 모델과 비교하여 다음 단어를 예측할 확률을 조정하는 Contrastive Decoding(CD)은 유창성과 일관성(coherence)을 향상시키는 데 효과적
- 최근 Chuang et al. (2024)는 final layer와 early layer 간의 출력을 비교하여 우수한 결과를 얻는 Dola 제안
- 뉴런 deactivating 중 관찰되는 fluency 문제를 완화하기 위해 Dola를 TST에 적용
- 위의 예시에서도, source style(positive) neurons을 deactivating 함으로 target style(negative) words(neither, poor)가 생성이 되어 오히려 바른 문장이 생성이 되지 않음(input 문장의 negative 변환이 되려면 output 문장에서 poor → quality로 생성이 되어야 함)
- 이와 같은 정확성과 유창성 저하를 막기 위해 본 논문에서는 CD 적용
3.1. Dola
- background
- token sequence $\{x_1, x_2, ..., x_{t-1}\}$와 LLM의 총 레이어 수 $N$이 주어지면 $j$번째 transformer layer의 다음 토큰 $x_t$ 확률을 미리 계산 가능(=early exit, Schuster et al., 2022)(*early exit: LLM의 추론 과정을 최적화하기 위한 기술)
- $p^j(x_t | x_{<t}) = \text{softmax}(\phi (h_t^{(j)}))_{x_t}$
- $h_t$는 hidden states로 embedding layer에서 얻을 수 있음
- $\phi$는 vocabulary head로 token의 확률을 예측하는 데 사용
- token sequence $\{x_1, x_2, ..., x_{t-1}\}$와 LLM의 총 레이어 수 $N$이 주어지면 $j$번째 transformer layer의 다음 토큰 $x_t$ 확률을 미리 계산 가능(=early exit, Schuster et al., 2022)(*early exit: LLM의 추론 과정을 최적화하기 위한 기술)
- goal: final layer와 set of early layers의 정보를 contrast하는 것
- why: LLM의 hallucinate(사실과 일치하지 않는 내용 생성) 문제 해결
- motivation: 초기 레이어의 "저수준 정보"와 후기 레이어의 "의미론적 정보 이용"
- 참고 논문: What do you learn from context? Probing for sentence structure in contextualized word representations(2019)
- method
- Next token prediction
- 기존: 마지막 레이어의 출력에 vocabulary head 적용
- DoLA: 여러 후보 레이어 각각에 대해 vocab head 적용
- Premature layer 선택(마지막 레이어와 대조할 레이어 선택)
- 각 후보 레이어의 출력 분포와 마지막 레이어의 출력 분포 간 JSD(Jensen-Shannon Divergence) 계산
- JSD가 가장 큰 레이어를 선택하여 대조 디코딩
- Next token prediction
3.2. Our Adaptation to TST
- 이 논문에서는 위와 같은 대조 디코딩 방식 DoLA를 다음과 같이 변형하여 적용
- Candidate layer selection
- DoLA는 일반적으로 초기 레이어를 사용
- sNeuron-TST는 스타일 관련 정보가 후기 레이어에 집중되어 있음을 확인(Figure 3)
- Next token prediction
- source style neuron 비활성화 후, 생성된 target style 토큰 확률 변화 분석를 분석하여 토큰을 두 가지로 분류
- 1. style-independent words(function word): 초기 레이어부터 일정한 확률 가진 토큰
- 2. target-style words: 후기 레이어에서 확률이 급격히 높아진 토큰
→ 이 경우, 후보 레이어 중 JSD 거리가 가장 큰 레이어를 선행 레이어로 선택하여 CD
Experiments
Datasets
- 6가지의 TST tasks에 대한 제안 방법 평가 수행
- 각 벤치마크는 두 가지의 스타일을 포함하며, 총 12가지의 TST 가능
- Formality, Politeness, Toxicity, Authorship, Politics, Sentiment
- 모든 데이터는 공개적으로 사용 가능
- 전처리: 120자를 초과하는 문장 제거 / 중복 문장 제거 / 많은 특수 기호를 포함하는 문장 제거
results
1. Overall Performance
- APE, AVF 및 PNMA는 다국어 기능을 향상하지만 content preservation metric을 제외하고는 TST에서는 성능 저하
- contrastive decoding을 하지 않은 baseline은 fluency 저하
- 전반적으로 overlap neurons을 제거하고, contrastive decoding을 사용하는 것이 정확성과 유창성에서 baseline을 능가
2. Content Preservation
- LLaMA-3 및 baseline이 높은 content preservation을 보임
- 이는 copy problem → 생성된 텍스트는 원래 의미를 유지하려는 경향으로 스타일을 정하는 문체를 무시하는 경향
3.Different Directions
- 동일 스타일에서 서로 다른 방향으로 transfer 시, 상당한 성능 불일치
- 이는 LLM의 학습데이터가 주로 긍정적인 코퍼로 구성된 이유
'딥러닝 논문 리뷰 > Text Style Transfer' 카테고리의 다른 글
[논문리뷰] Delete, Retrieve, Generate: A Simple Approach to Sentiment and Style Tran (0) | 2024.11.20 |
---|---|
[논문리뷰] Politeness Transfer: A Tag and Generate Approach (0) | 2024.11.19 |
Text Style Transfer 텍스트 스타일 변환 데이터셋 조사 (3) | 2024.11.18 |
Text Style Transfer 텍스트 스타일 변환 목표, 방법론 정리 (0) | 2024.11.18 |