-
문장별로 문장 내 모든 토큰에 문장 수준 레이블을 Y(i,j)t에 초기 레이블로 할당 (e.g. 문장이 unsafe이면 모든 토큰도 unsafe)
-
각 클래스에 대한 프로토타입 P=[P1,...,PC]를 0 벡터로 초기화
-
ShieldHead가 각 토큰의 last hidden state h(i,j)를 받아 해당 토큰의 클래스 확률 예측하고, 각 클래스 c에 대해 가장 높은 예측 확률을 보인 상위 K개 토큰들의 hidden state Tct 식별
-
Tct를 사용하여 moving-average를 통해 해당 클래스의 프로토타입 Pct 업데이트
Pct+1=Normalize(γ⋅Pct+(1−γ)⋅h(i,j)),for h(i,j)∈Tct
여기서 γ는 업데이트 속도를 조절하는 계수로, 훈련 진행에 따라 γ=0.99에서 γ=0.95로 점차 감소
이 단계를 통해 각 클래스의 프로토타입 Pc는 ShieldHead가 그 클래스에 속할 것이라고 가장 강하게 믿는 토큰들의 평균적인 특징 벡터로 점진적으로 수렴해 나감
-
P와 h(i,j) 사이의 proximity를 기반으로, i번째 토큰이 각 클래스에 속할 확률을 나타내는 프로토타입 레이블 점수 s(i,j) 계산
s(i,j)=Softmax(P⋅h(i,j))
-
기존의 토큰 수준 소프트 레이블 Y(i,j)t를 s(i,j)를 사용하여 다시 moving-average로 업데이트
Y(i,j)t+1=σ⋅Y(i,j)t+(1−σ)⋅s(i,j)
여기서 σ도 이동 평균 업데이트 속도를 조절하는 계수로, 훈련 진행에 따라 σ=0.98에서 σ=0.5로 감소