음성 안전성에 ML 도입하다
Roblox의 사명은 수많은 사람들을 낙천적이고 시민 의식 있는 태도로 연결해 주는 것입니다. 이는 서로 진정 함께하고 있다는 느낌을 받도록 저희가 도와줄 수 있어야만 가능한 일입니다. 현실 세계에서 그렇듯, 3D 몰입형 세상에서도 우정과 연결성을 오래도록 유지하는 데 사람의 목소리보다 더 진실되고 강력한 도구는 거의 없습니다. 그런데 Roblox의 커뮤니티를 안전하고 시민성 있는 공간으로 지키면서 음성 커뮤니케이션의 풍부함과 몰입도를 키우려면 어떻게 해야 할까요?
이 블로그에서는 어떻게 인간 검토자보다 음성 커뮤니케이션에서 더 정확하게 정책 위반을 감지하는 엔드투엔드 머신 러닝(ML) 모델을 통해 날마다 수백만 분씩 일어나는 음성 활동에 실시간 안전을 구현해 냈는지 이야기하도록 하겠습니다. 이 시스템의 출력은 다른 모델로 전송되어 적합한 결과를 판단합니다. 결과 모델은 정책을 위반한 사용자들에게 알림을 보냅니다. 처음에는 경고 메시지이나 위반 행동이 지속될 경우 더 적극적인 활동으로 이어집니다.
Roblox가 거의 실시간에 가까운 음성 안전성 기능을 다중 언어로 제공하는 업계 최초의 사례인 만큼, 이 엔드투엔드 실시간 안전 시스템은 꽤 대담한 목표라고 할 수 있습니다. 음성 분류는 볼륨과 어조, 말하는 내용, 단어 선택 등 모든 오디오 형식에 따릅니다. 레이블링된 데이터나 모델이 없는, 사실상 자동화란 것이 전혀 없던 상태에서 실시간 음성 안전성을 위해 빠르게 발전시켜 온 과정을 공유하게 되어 기쁩니다.
그리고 마침내, 첫 번째 오픈 소스 모델, Roblox가 개발한 음성 안전성 모델을 공개하게 되었습니다. 이 모델을 오픈 소스로 공개하고 상업적 사용이 가능하도록 함으로써 정책 위반 탐지를 위한 업계 기준을 제공하고, 더 발전된 음성 안전성 ML 모델 개발에 박차를 가하게 되길 바랍니다. 이번 오픈 소스 모델은 첫 번째 버전이며, 이후 상당한 개선을 거쳐 현재 테스트 중에 있습니다.
데이터 부족 극복하기
저희는 많은 기업들이 그렇듯, 모델을 훈련하고 평가하기 위해 사용할 수 있는 데이터의 품질을 먼저 분석하는 것으로 ML 개발을 시작했습니다. 이상적인 데이터세트 페어링이란 음성 발화와 해당 발화에 대한 고품질의 안전성 분류 레이블링이 함께 들어간 형태일 것입니다. 그러나 개발을 시작했을 당시 저희는 인간이 직접 레이블링한 실제 대규모 데이터를 거의 보유하고 있지 않았습니다. 지도 학습 방식을 사용해 고품질 음성 안전성 탐지 모델을 훈련하려면 지원하는 언어별로 엄청난 분량의 레이블된 오디오 데이터가 필요했습니다. 하지만 이러한 데이터를 수집하려면 아주 긴 시간이 걸릴 것이 분명했고, 자원과 시간이 지나치게 소요되는 비효율적인 과정이었습니다.
수천 시간의 수작업 레이블링 데이터에 의존하는 대신, 저희는 몇 가지 더 효율적인 방법을 개발했습니다.
-
훈련용 머신 레이블링 데이터. 완벽한 수작업 레이블링 데이터를 확보하는 데 매달리는 대신, 저희는 음성 발화 데이터를 머신 레이블링하여 대량의 훈련 데이터를 확보하는 방법을 선택했습니다. 약한 지도(weak supervision) 방식으로 대규모 머신 레이블링 데이터를 활용함으로써, 일부 레이블링 오류를 감수하며 강력한 훈련 모델을 생성할 수 있었습니다. 이 접근 방식을 성공적으로 구현하기 위한 핵심 요소는 뛰어난 오픈 소스 음성-텍스트 변환(Speech-to-Text) 라이브러리를 활용하는 것과, 수년간 ML을 활용해 사람들의 텍스트 기반 커뮤니케이션에서 커뮤니티 규정 위반을 탐지해 온 경험이었습니다. 이러한 머신 레이블링 방식을 통해 수 년이 걸릴 분량의 훈련 데이터를 몇 주 만에 레이블링할 수 있었습니다.
-
평가용 인간 레이블링 데이터. 고품질이지만 완벽하지 않은 기계 레이블링 데이터는 성능이 뛰어난 모델을 훈련하는 데 충분했지만, 최종 검증 단계에서 기계 레이블링 데이터만을 신뢰할 수는 없었습니다. 따라서 다음 과제는 평가를 위한 인간 레이블링 데이터를 충분히 확보하는 것이었습니다. 다행히도, 훈련을 위한 인간 레이블링 데이터를 신속하게 확보하는 것은 어려웠지만, 평가를 위한 데이터는 내부 모더레이터 팀을 활용해 충분히 수집할 수 있었습니다. 원래부터 Roblox 사용자들의 신고 내용을 검토하고 수동으로 조치를 취하고 있던 팀이었죠. 이 방식 덕분에 저희는 두 가지 접근 방식의 장점을 모두 활용할 수 있었습니다. 즉 머신 레이블링 데이터를 사용해 대량의 훈련 데이터를 확보하여 성능이 뛰어난 모델을 만들고, 인간 레이블링 데이터를 활용해 모델의 신뢰성을 검증하는 것이 가능해졌습니다. 인간 레이블링 데이터는 상대적으로 적은 양이었지만 모델이 실제로 제대로 작동하는지 확인하는 데는 충분했습니다.
데이터 부족 문제를 겪은 또 다른 영역은 마약 및 알코올, 자해 관련 표현 등 발생 빈도가 매우 낮은 정책 위반 카테고리였습니다. 이를 해결하기 위해 여러 저빈도 카테고리를 '기타' 카테고리로 통합했습니다. 그 결과, 최종 모델은 욕설, 괴롭힘, 차별, 연애 관련 언급, 기타 등의 카테고리를 탐지할 수 있었습니다. 저희는 이 '기타' 카테고리에 속한 표현들을 보다 깊이 이해함으로써, Roblox를 안전하고 존중하는 커뮤니케이션을 주고받을 수 있는 공간, 건전한 커뮤니티로 지키고자 합니다. 이를 위해 앞으로도 지속적인 모니터링을 통해 더 많은 사례를 수집할 계획입니다. 시간이 흐르며 '기타' 카테고리 내에 충분한 양의 학습 데이터가 확보되면, 이러한 하위 카테고리들은 각각의 명확한 카테고리로 분류될 겁니다.
훈련 데이터용 머신 레이블링 파이프라인
Roblox에서는 음성 채팅 시퀀스를 활용해 고품질 레이블을 추출할 수 있는 완전 자동 머신 레이블링 파이프라인을 설계했습니다. 이 파이프라인은 총 세 단계로 구성됩니다.
-
오디오 청크 분할. 첫 번째 단계에서는 오디오를 청크(작은 단위의 세그먼트)로 나눕니다. 문장 사이에 끊어지는 구간을 감지하여 적절한 위치에서 오디오를 분할하는 방식입니다. 이 방식으로 정책 위반 콘텐츠를 보다 효율적으로 식별하고 레이블링할 수 있게 되었습니다.
-
오디오 받아쓰기. 파이프라인의 두 번째 단계에서는 오디오 청크를 자동 음성 인식(ASR, Automatic Speech Recognition) 모델로 받아쓰기해 텍스트로 변환합니다. 공개된 오픈 소스 ASR 모델을 활용했습니다.
-
텍스트 분류. 마지막 단계에서는 당사 내부의 텍스트 필터를 활용하여 변환된 텍스트를 분류합니다. 이 필터는 텍스트 기반 커뮤니케이션 내 부적절한 콘텐츠를 탐지하고 차단하도록 설계되었습니다. 저희는 정책 위반 클래스 및 키워드에 따라 오디오 청크를 레이블링할 수 있게 해당 필터가 오디오 변환 텍스트에서 작동하도록 적용했습니다. 이 텍스트 필터는 앙상블 모델로, 확장된 DistilBERT 모델과 정규 표현식(Regex) 규칙으로 구성된 인간 레이블링 정책 위반 텍스트 데이터를 기반으로 학습된 것입니다.
중요한 점은, 이 파이프라인이 Roblox의 최종 프로덕션 모델을 위한 훈련 데이터 생성에만 사용되었다는 것입니다. 그렇다면 이런 질문이 나올 수도 있습니다. 이미 원하는 레이블을 생성하는 파이프라인이 있다면 굳이 모델을 따로 훈련할 필요가 있을까요? 답은 바로 효율성입니다. 저희에겐 훨씬 더 짧은 시간 내에 아주 높은 정확도를 유지할 수 있는 방법이 필요했습니다. Roblox의 거대한 스케일에서 모든 음성 커뮤니케이션을 ASR을 통해 변환하는 것은 속도가 너무 느리고, 리소스를 과도하게 소모하기 때문에 현실적으로 불가능합니다. 하지만 이 데이터로 훈련된 컴팩트한 ML 모델은 전체 음성을 텍스트로 변환하지 않고도 정책 위반을 탐지하도록 설계되어 있습니다. 결과적으로 이 모델은 기존 파이프라인과 동일한 정확도를 유지하면서도 상당히 빠르게 작동할 수 있으며, Roblox의 방대한 규모에서도 원활하게 사용할 수 있습니다.
머신 레이블링 파이프라인의 확장
대규모 AI 이니셔티브에서는 많은 경우 고품질 훈련 데이터를 얻는 과정 자체가 하나의 프로덕션 ML 시스템이 되며, 이를 처음부터 구축해야 하는 경우가 많습니다. 이번 프로젝트에서는 머신 레이블링 파이프라인을 항시 운영 가능한 완전한 프로덕션 시스템으로 개발해야 했으며, 수천 개의 CPU를 동시 실행하거나 혹은 이에 상응하는 GPU 개수의 규모로 확장할 수 있도록 설계해야 했습니다. 이를 위해 수천 개의 CPU 코어로 구성된 훈련 데이터 클러스터를 구축하여, 입력되는 오디오 스트림을 자동으로 병렬 처리하고 기계 레이블을 생성할 수 있도록 했습니다. 이 시스템은 최대 처리량을 유지하면서도 완벽하게 운영되어야 했으며, 만약 실수가 발생하거나 다운타임이 생긴다면 며칠에서 몇 주까지 훈련 데이터 생성을 못하게 될 위험이 있었습니다.
아래는 수만 시간 분량의 오디오 데이터를 몇 주 만에 머신 레이블링할 수 있도록 지원한 아키텍처의 고수준 개요입니다. 가장 중요한 핵심은 프로세싱 과정의 주요 지점마다 큐(queue)를 활용해 병목 현상을 제거하고, 여러 머신에 걸쳐 작업자 스레드를 수평 확장할 수 있도록 한 점입니다. 이 작업자 스레드들은 앞서 설명한 오디오 청크 분할, 텍스트 변환, 텍스트 분류 단계를 수행했습니다.
ML 아키텍처
모델을 설계하는 데 있어 가장 중요한 요구사항 중 하나는 낮은 레이턴시였습니다. 즉, 실시간에 가까운 속도로 모델 추론이 가능해야 했습니다. 그래서 로우(raw) 오디오를 직접 처리하고 스코어를 반환하는 아키텍처를 선택하게 되었습니다. 저희는 트랜스포머 기반 아키텍처를 활용했습니다. 트랜스포머 모델은 시퀀스 요약에 탁월하며 자연어 처리(NLP)와 오디오 모델링 분야에서 성공적으로 사용되고 있죠. 저희가 마주한 과제는 복잡성과 낮은 레이턴시 추론 간의 균형을 찾는 것이었습니다. 즉, 모델이 여러 언어와 다양한 액센트를 처리할 수 있어야 했고, 배경 소음과 오디오 품질 변화에 강건성을 확보하는 동시에 프로덕트 레이턴시 요구사항을 충족해야 했습니다.
모델 선택
디자인에서 바로 당면한 문제는 트랜스포머 모델을 훈련하는 데 필요한 컨텍스트 윈도우의 사이즈를 결정하는 것이었습니다. 저희는 며칠 동안의 음성 채팅 데이터에서 발화 길이의 막대 도표를 분석했고, 그 결과 분류를 위해서는 15초의 윈도우가 레이턴시 및 충분한 컨텍스트 확보 간 최적의 균형을 제공한다는 결론을 내렸습니다. "정책 위반 없음" 을 하나의 카테고리로 만들어 정책 위반이 없는 경우도 감지할 수 있도록 했죠. 오디오 클립 하나에서 여러 유형의 정책 위반이 동시에 존재할 수 있기 때문에, 이 문제는 일반적인 다중 클래스 분류가 아닌 다중 레이블 분류 문제로 정의되었습니다. 이를 위해 헤드 레이어까지 포함한 전체 네트워크를 미세 조정했으며, 이진 교차 엔트로피(BCE) 손실 함수를 사용했습니다.
주석: 채팅 데이터에 나타난 음성 발화 막대 도표. 발화의 75%가 15초 내에 일어났음을 보여줌.
저희는 오디오 리서치 커뮤니티에서 널리 사용되는 오픈 소스 인코더 모델을 평가한 후, 최종적으로 WavLM과 Whisper를 후보로 선정했습니다. 첫 번째 실험에서는 사전 훈련된 WavLM base+ 모델을 선택하여 2,300시간 분량의 Roblox 머신 레이블링 음성 데이터로 미세 조정한 후, 두 개의 실제 평가 데이터세트에서 분류 결과를 평가했습니다. 그 결과 매우 고무적인 분류 성능을 얻을 수 있었습니다(아래 모델 평가 참고). 그러나 레이턴시가 저희가 설정한 기준을 초과하여 프로덕션 배포하기에는 적절하지 않았습니다. 이후 트랜스포머 레이어 수를 줄인 맞춤형 WavLM 아키텍처를 구현하고 7,000시간 분량의 Roblox 머신 레이블링 음성 데이터에서 처음부터 엔드투엔드 모델 훈련을 진행했습니다. 이 모델은 대화 환경에서도 뛰어난 분류 성능을 보여주었으며 미세 조정한 모델보다 훨씬 컴팩트했습니다. 최종 모델 후보는 학생-교사 증류 기법을 활용한 모델을 실험했습니다. 교사 네트워크로는 Whisper 인코더를 사용하고, 학생 네트워크로는 WavLM 기반 엔드투엔드 모델을 사용했습니다. 이 모델을 4,000시간 분량의 오디오로 훈련한 결과, 미세 조정한 WavLM 모델과 유사한 분류 정확도를 유지하면서도 레이턴시를 대폭 줄이고 모델 사이즈를 줄이는 데 성공했습니다. 아래 이미지는 위에서 설명한 세 가지 실험의 모델 파라미터를 요약해 나타낸 것입니다. 앞으로도 다중 언어 음성 안전성 분류에 있어 모델을 확장해 나가며 데이터 샘플링 전략, 평가 전략, 모델 하이퍼파라미터를 지속적으로 개선해 나갈 예정입니다.
데이터세트 사이즈 |
모델 사이즈 |
추론 레이턴시/입력 초 |
실시간 팩터 |
|
미세조정된 WavLM |
2300시간 |
96M 파라미터 |
102ms |
9.80 |
엔드투엔드 훈련됨 |
7071시간 |
52M 파라미터 |
83ms |
12.08 |
증류 |
4080시간 |
48M 파라미터 |
50ms |
19.95 |
모델 최적화
저희는 품질에 타협하지 않고 25% 이상 속도를 향상시키기 위해 선택된 트랜스포머 레이어를 양자화하는 등 업계 표준 방법을 채택했습니다. 특징 추출 단계를 MFCC 입력과 합성곱 신경망(CNN)을 결합하는 것으로 전환하여, 오직 CNN만 사용한 경우보다 추론 시 40% 이상 속도를 개선할 수 있었습니다. 추가적으로, 음성 활동 탐지(VAD) 모델을 프리프로세싱 단계에 도입함으로써 전체 파이프라인의 강건성이 크게 향상되었습니다. 특히 마이크에 잡음이 많은 사용자에게 효과적이었습니다. VAD는 소음을 걸러내고 인간 음성이 감지될 때만 안전성 파이프라인을 적용할 수 있게 해주었으며, 이로 인해 추론의 전체 볼륨이 약 10% 줄어들고 시스템에 제공되는 입력의 품질이 향상되었습니다.
모델 평가
평가에 다양한 데이터세트와 메트릭을 사용했지만, 여기서는 고도의 정책 위반 사례가 많이 포함된 영어 데이터세트에서 Roblox의 음성 분류기가 어떻게 작동했는지에 대해 공유하겠습니다(사용자 음성 신고에 나타나게 될 사항 등). 이 데이터세트는 Roblox 모더레이터가 처리한 것으로 100% 인간 레이블링입니다. 전체 위반 유형(욕설, 괴롭힘, 연애 등)을 단일한 이진 카테고리로 결합했을 때, 아래와 같이 0.95 이상의 PR-AUC(정밀도-재현율 곡선 아래 면적) 점수가 나왔습니다. 즉 이 평가 데이터세트에서 분류기가 일반적으로 허위 비위반 사항을 지나치게 잡지 않으면서 많은 위반 건을 포착한다는 것을 의미합니다.
하지만 위에 나타난 강력한 평가 결과는 모든 사용 사례에 그대로 적용되지 않을 수 있습니다. 예를 들어 정책 위반 발언에 대한 알림의 경우 분류기가 모든 Roblox 음성 채팅을 평가하며, 위반의 발생 빈도가 낮아지게 되면 위양성(false-positive) 결과가 늘어날 가능성이 큽니다. 반면 음성 남용 신고의 경우 분류기가 위반 가능성이 있는 발언만 평가하기 때문에 위반 발생 빈도가 더 높습니다. 그럼에도 불구하고 위의 결과는 사용자들에게 정책 위반 언어에 대해 고지하고자 프로덕션에서(보수적인 임계점을 잡아) 분류기를 사용해 실험을 시작할 만큼 충분히 고무적이었습니다. 실험 결과들은 저희의 기대를 크게 뛰어넘었습니다.
다음 단계
자체 CPU 인프라를 활용하고 대규모 파이프라인을 신중하게 설계함으로써 이 모델을 Roblox 스케일에서 성공적으로 배포할 수 있었습니다. 피크 시간 동안 이 모델은 초당 2,000건 이상의 요청을 성공적으로 처리했습니다(그 대부분은 위반이 포함되지 않음). 또한, 사용자에게 정책 위반 언어에 대해 알림을 제공함으로써 플랫폼에서 정책 위반 행동이 현저히 줄어드는 것을 확인했습니다. 특히 초기 롤아웃에서 심각한 수준의 음성 신고가 15.3% 감소했으며, 분당 위반 건수는 11.4% 감소했습니다.
저희는 여러 언어를 처리할 수 있는 단일 분류 모델을 플랫폼 전반에 배포할 수 있도록 다중 언어 훈련 데이터를 통해 모델을 확장하고 있습니다. 또한, 전체 ASR을 사용하지 않고도 특정 키워드를 식별하는 새로운 멀티태스크 아키텍처를 탐색하고 있습니다. 위반 레이블링 외에도 이러한 키워드를 감지하는 것은 분류의 품질을 향상시키고, 결과를 제시할 때 사용자에게 맥락을 제공할 수 있는 기회를 줍니다.
이 연구는 Roblox의 많은 팀이 공동으로 노력한 결과였습니다. 이는 Roblox의 핵심 가치인 커뮤니티 존중을 잘 보여주는 사례였으며, 여러 분야 간 협업의 훌륭한 예시였습니다.