결론은 실패
외국 호텔을 이용하고 부정적인 리뷰를 남기면 호텔 측에서 임의로 삭제하는 경우가 많다고 한다. 이를 방지하기 위해 구글 번역기를 돌려도 뜻을 알 수 없도록 '한국인만 읽을 수 있는 리뷰'를 발명하는데...
이런 식이다. 원래 발음에서 크게 벗어나지 않는 선에서 된소리화, 거센소리화, 모음 변경 등의 트릭을 사용했다. 방심했다간 한국인도 이해하지 못할 정도의 난이도다.
공익엔 어긋나지만 번역기에게 '한국인만 읽을 수 있는 리뷰'를 가르쳐보고 싶어졌다. 현재 널리 사용되는 언어 모델은 발음에 대해선 아무것도 알지 못한다. 문장을 토큰(token) 단위로 쪼개고, 그 토큰은 n차원의 벡터로 표현된다. 이 벡터가 언어 모델에 들어갔다 나오면 현 문장의 문맥을 더 잘 반영하는 벡터가 된다. 여기에 발음이 반영되는 부분은 없다. 예를 들어 발음이 유사한 토큰끼리 더 유사한 벡터로 표현된다거나 하지 않는다는 의미다.
'한국인만 읽을 수 있는 리뷰'를 진정으로 이해하려면 발음에 대한 이해가 있어야 한다고 생각했다. 그래서 기존 언어 모델에 토큰의 발음 정보를 추가해 주기로 했다.
토큰이 언어 모델에 들어가기 앞서 어순을 반영하기 위해 거치는 단계가 있다. 언어 모델에 들어가기 전 토큰의 n차원 벡터와 어순을 반영하는 n차원 벡터(Positional Encoding)를 더해준다. 그래야 문장 앞에서 주어로 쓰인 you와 문장 끝에서 목적어로 쓰인 you가 다르다는 것을 알 수 있다. 이 부분에 토큰의 발음을 표현하는 n차원 벡터(Phonetic Encoding)도 같이 더해주기로 했다.
토큰의 발음을 벡터로 표현하기 위해선 이 논문을 참고했다. 간단히 정리하면 우선 최대한 여러 개의 영단어와 그 단어를 발음 기호로 전사한 쌍을 준비한다. 그리고 각 발음 기호의 음운 자질(phonetic feature)도 준비한다. 예를 들어 /b/는 {유성음, 양순음, 파열음}이라는 자질을 가지고 있다. 이와 유사한 /p/는 {무성음, 양순음, 파열음}이라는 자질을 가지고 있다. 음운 자질을 나열하면 /b/와 /p/ 발음의 유사성을 정량적으로 표현할 수 있는 것이다.
그리고 각 발음 기호 음운 자질의 bigram을 구한다. 발음이 'ba'인 단어가 있다고 예를 들면 /b/는 {유성음, 양순음, 파열음}을 자질로 가지고 /a/는 {평순모음, 후설모음, 저모음}을 자질로 가지므로 전체 bigram을 구하면 {(유성음, 평순모음), (유성음, 후설모음), (유성음, 저모음), (양순음, 평순모음), (양순음, 후설모음), (양순음, 저모음), (파열음, 평순모음), (파열음, 후설모음), (파열음, 저모음)} 이 된다.
원 논문에선 (i, j)의 성분이 i번째 단어에서 j번째 음운 자질 bigram이 사용된 횟수인 행렬을 만들고, PCA를 통해 차원 축소를 한다. 그래서 단어별로 단어의 발음을 표현하는 벡터를 만들었다.
하지만 나의 목표는 학습에 사용된 단어만이 아니라 어떤 토큰이 주어져도, 그 토큰의 발음을 벡터로 표현하는 것이었다. 그래서 원 논문의 행렬을 전치시켜 (i, j)의 성분이 j번째 단어에서 i번째 음운 자질 bigram이 사용된 횟수인 행렬을 만들고, PCA를 통해 차원 축소를 하여 음운 자질 bigram별로 그 bigram을 표현하는 벡터를 만들었다. (자세한 코드는 여기서 확인할 수 있다.)
사전 학습된 한국어-영어 번역 모델을 사용해 fine-tuning을 진행했다. 학습 데이터로는 AI Hub에 공개된 한영 번역 데이터 중 구어체에 노이즈를 추가해 활용했다. 한 문장에서 랜덤 하게 k개의 어절을 고르고, 그 어절의 초성이 평음이면 랜덤 하게 거센소리 또는 된소리로 변형했다.
나는 저녁 약속보다 점심 약속을 선호해 → 나는 처녁 약속보다 점심 약쏙을 선호해
이렇게 동일한 학습 데이터를 가지고 기존 모델과 Phonetic Encoding을 추가한 모델의 학습 후 성능을 비교해 보았다. 학습에 사용되지 않은 '진짜 한국인만 읽을 수 있는 리뷰'의 문장들을 발췌하여 각 모델의 번역 결과를 비교해 보았다. (모델 및 학습 코드는 여기서)
학습에 사용된 노이즈가 초성의 된소리화, 거센소리화로 제한되어 있다 보니, 종성을 된소리화 또는 거센소리화한다거나, 모음을 변경하거나, 영어 또는 숫자의 발음으로 표현하는 등 다양한 방법이 사용된 '진짜 한국인만 읽을 수 있는 리뷰'를 완벽히 번역하는 것은 어려워 보였다.
하지만 기존 모델의 문장 (2) 번역에 'watermelon'이 포함된 부분은 정말 이상한 것 같다. 발음 정보를 추가한 모델에선 이상한 'watermelon'이 포함되어 있지 않아 칭찬해주고 싶다.
문장 (3)에는 '냉장고'를 '넹짱고'로 변형하여 표현했는데 기존 모델에선 이를 생뚱맞게 'soccer'로 번역했으나, 발음 정보를 추가한 모델에선 '냉장고'와 발음이 비슷한 의미를 알 수 없는 단어 'Gangjaggo'로 번역했다. 번역을 잘한 건 아니지만 발음을 학습하긴 했다는 사실을 확인할 수 있었다.
문장 (8)에서도 두 모델의 번역 결과 모두 이상하지만 그래도 발음 정보를 추가한 모델에선 'Korean'이라는 단어를 포함했다는 점이 기특하다.
학습에 사용하는 노이즈의 종류를 늘리고, 랜덤한 k개의 어절뿐만 아니라 모든 어절에 적용하고, 영어 및 숫자의 발음 정보까지 추가하여 학습하면 더 좋은 번역 모델이 나올 것 같다!
어쨌든 장기적으로 보면 언어 모델은 발음 정보도 학습해야 한다고 생각한다. 인간도 처음 보는 단어의 의미를 예측할 때 문맥 정보도 보지만, 발음 정보도 참고한다. 새로 본 단어가 원래 알고 있던 단어와 발음이 비슷하면 그 단어와 의미가 유사할 것이라고 유추할 수 있다. 소리가 주는 어감이 의미 예측에 도움을 주기도 한다.
이번 번역은 실패지만 다음엔 더 똑똑한 모델을 학습할 수 있길!
Thumbnail Image by Towfiqu barbhuiya on Unsplash