brunch

매거진 AI

You can make anything
by writing

C.S.Lewis

2019년 카카오 i 번역 서비스 개편

[카카오AI리포트] 배재경 

카카오에서 번역 서비스를 시작한 지 벌써 1년 반의 시간이 흘렀습니다. 그동안 소소한 개선은 있었지만 큰 변화는 없었는데, 그렇기에 이번 카카오 i 번역 서비스의 대대적인 개편은 지금까지 카카오에 축적된 기계번역과 관련된 기술력을 한데 모아서 발산한 결과라고 볼 수 있습니다. 아래에서 카카오 i 번역 서비스의 뜻깊은 변화를 소개하고자 합니다.



1. 언어 추가


카카오 i 번역에 생긴 가장 큰 변화는 지원하는 언어의 수를 6개에서 19개로 대폭 늘렸다는 것입니다. 기존에는 영어, 일본어, 중국어, 베트남어 및 인도네시아어를 한국어로 번역하거나 그 역방향으로 번역하는 것만을 지원하였죠. 이번 개편을 통해 드디어 프랑스어, 독일어, 스페인어, 포르투갈어, 러시아어, 이탈리아어, 네덜란드어, 터키어, 태국어, 말레이시아어, 아랍어, 힌디어 및 벵골어까지 이용할 수 있게 되었습니다. 또한 한국어가 포함되지 않은 다른 모든 언어 쌍 간에도 번역이 가능합니다.


[그림 1] 번역 언어 선택 화면


학습해야 하는 모델의 관점에서 본다면, 지원하는 언어의 수를 늘리고 모든 쌍 간의 번역 기능을 제공하는 것은 그리 간단한 문제가 아닙니다. 예를 들어 ‘한국어-영어’라는 하나의 언어 쌍만 다룰 경우 2개의 학습 모델이 필요하지만, 여기에 중국어를 추가하는 경우 총 3*2 (한영, 한중, 영한, 영중, 중영, 중한)개의 모델이 필요합니다. 즉 n개의 언어라고 가정하면 n*(n-1)개의 학습 모델이 필요하게 되는데, 19개 언어를 지원하기 위해서는 총 342개의 모델을 학습해야 한다는 것을 의미합니다. 상당히 큰 수치입니다. 그렇다면 100개 이상의 언어를 지원하는 구글 번역의 경우 몇 개의 모델을 학습했을까요? 저희도 무척 궁금합니다.


이제 ‘카카오는 어떻게 342개나 되는 모델을 학습한 것인가?’라는 의문이 생기셨을 텐데, 저희도 342개를 모두 학습한 것은 아닙니다. 40여 개의 모델만으로 모든 19개 언어 쌍 간의 번역을 지원하도록 작업하였는데 여기에는 몇 가지 해결책이 있었습니다.


첫 번째는 여러 언어를 하나의 모델로 함께 학습시키는 방법입니다. 'Zero-Shot Translation'으로 알려져 있는데, 구글에서 2016년에 발표한 논문을 통해 자세한 내용을 확인할 수 있습니다*1. 기존 모델과 동일하게 사용하되 어떤 언어로 번역할지 방향을 지시하는 메타 토큰을 하나 더 추가하는 방법입니다.


논문에서는 Many to One, One to Many, Many to Many라는 세 가지 방식으로 나누어 학습시키고 성능을 비교하였는데, Many to One 방식을 사용하였을 때 성능이 약간 향상된 결과가 나타났습니다. 다양한 언어 사이에 존재하는 여러 공통된 번역 규칙이 서로 보완적으로 작용하여 데이터셋을 늘리는 것과 유사한 효과가 나타난 것입니다. 따라서 이 방식은 주로 학습 데이터가 부족한 언어일 때 효과적입니다.


[그림 2] Many to Many 학습 예시

 

One to Many, Many to Many 방식을 사용했을 때에는 성능의 향상이 있다고 보기 어려웠는데, 이것은 예측 확률과 관련이 있습니다. 학습을 위해서는 기본적으로 문장을 토큰 단위로 나누는 작업이 이루어지는데 이렇게 잘린 최소 정보 단위(토큰)의 집합을 보통 Vocabulary라 부릅니다. Vocabulary를 어떻게 구성하는지도 물론 중요하지만, 여기서는 그 집합의 크기에 유의해야 합니다. Zero-Shot Translation을 위해 한 모델이 다뤄야 하는 언어의 수가 많아지면 Vocabulary size도 증가할 수 밖에 없기 때문입니다. 모델 관점에서 Vocabulary size가 증가한다는 것은 더 많은 종류의 토큰을 인식해야 함을 의미합니다. 최종적인 확률 모델에서 n 개의 토큰 중 하나를 예측해야 할 때 맞히기가 더욱 어려워지죠. 따라서 동시에 학습할 대상 언어를 늘리는 것이 항상 좋은 것만은 않은데, 이 때문에 One to Many와 Many to Many방식의 성능이 향상되지 않은 것으로 추측됩니다.


한편 Many to Many 방식에 한 가지 장점이 있다면, 그것은 입력된 문장에 여러 언어가 섞여 있을 때에도 번역이 가능하다는 것입니다. 예를 들어 중국어와 영어가 섞여 있는 문장을 한국어로 번역할 수 있는데, 이는 기존의 단일 쌍으로만 학습해서는 얻을 수 없는 결과입니다. 더 독특한 점은, 학습 데이터가 전혀 없던 언어 쌍 간의 번역이 어느 정도 이루어진다는 사실입니다. 예를 들어 영어/한국어, 영어/일본어에 해당하는 학습 데이터만을 사용하여 3 to 3 방식으로 번역 모델을 학습시키는 경우, 일본어/한국어 학습 데이터가 없음에도 불구하고 해당 언어 간의 번역이 가능합니다.  논문 저자는 이를 진정한 의미의 'Transfer Learning'이라고 표현하고 있는데, 이를 통해 저희는 NMT (Neural Machine Translation) 모델의 잠재력을 한 번 더 확인하였습니다.


카카오 AI 기술팀에서는 Many to Many 방식을 사용하여 학습해야 하는 모델 수를 줄였습니다. 다만 작업의 편의성을 위해 다양한 언어 쌍을 적용하지는 않았고, 같은 언어 쌍에 해당하는 두 모델 - 예를 들어 힌디어 → 영어 / 영어 →힌디어 - 을 별도의 모델을 통하지 않고 한꺼번에 학습시키는 방법을 사용하였습니다. 즉 2 to 2방식이라고 할 수 있습니다. 이 방법의 장점은 별도의 메타 토큰(번역 방향 지시 토큰)이 필요하지 않다는 것입니다. 왜냐하면 모델이 소스 언어에 따라 타겟 언어가 무엇인지 학습해내기 때문입니다.


특히 영어의 경우 거의 모든 언어에서 몇 가지 공통된 어휘들이 나타나기 때문에 영어를 포함하는 번역 쌍에 대해서는 2 to 2 방식의 이점이 증대될 수 있을 것으로 기대하였습니다. 실제로 실험을 해본 결과 추가적인 성능 향상을 확인할 수는 없었지만, 성능이 낮아지지도 않았습니다. 이 방식을 사용하여 저희는 처음 의도한 바와 같이 학습해야 할 전체 모델 수를 반으로 줄일 수 있습니다.


학습해야 할 모델 수를 줄이기 위한 두 번째 방법은 특정 언어를 매개로 하여 제3 언어들을 연결하는 것입니다. 예컨대 힌디어/베트남어 사이의 번역은 어떻게 지원할 수 있을까요? 안타깝지만 힌디어/베트남어의 직접적인 병렬 말뭉치(parallel corpus)*2는 구하기가 매우 힘듭니다. 거의 없다고 보는 편이 나은 상황입니다. 그렇지만 영어/베트남, 영어/힌디어는 상대적으로 데이터가 풍부하여 모델을 만들 수 있습니다. 즉 영어를 매개로 하여 두 번 번역할 수밖에 없습니다. 힌디어에서 영어로, 다시 영어에서 베트남어로 가는 방식입니다. 물론 시간이 두 배로 걸리고 한 번 번역할 때 생긴 오류가 중첩되어서 부적절한 결과가 나올 확률이 높아지긴 합니다.


이번 개편에서도 한국어 또는 영어가 포함되지 않는 언어 쌍에 대한 번역은 영어를 매개로 하여 간접적으로 번역하는 방식을 사용하였습니다. 한국어가 포함된 번역의 경우 간접적인 방식으로 처리해서는 만족할 만한 성능을 확보하기 힘들었기 때문에, 한국어 기준 번역에서는 모든 언어 쌍 간의 모델을 직접 학습하였습니다. 이 방식을 거치면 최종적으로 필요한 모델의 수는 40여 개로 줄어듭니다. 일단 고려해야 하는 모델의 수는 이렇게 줄였는데, 그렇다면 영어 기준 및 한국어 기준의 학습 데이터인 40여 종류의 병렬 말뭉치는 어떻게 확보했을까요?


사실 영어 기준 데이터는 공개된 데이터를 수집하는 방식으로도 제법 많이 확보할 수 있습니다*2. 하지만 한국어는 상황이 다릅니다. 한국어 기준의 데이터로는 한국어/영어의 병렬 말뭉치도 부족할뿐더러 그 외의 언어들은 더욱 구하기 어렵습니다. 그렇기에 여기에서도 영어를 최대한 활용하였습니다. 전 세계적으로 영어가 가장 널리 쓰이고 있기에 영어 기준의 언어 쌍에 대한 학습 데이터를 가장 많이 확보할 수 있으며, 결국 영어가 포함되는 언어 쌍 간의 번역 성능이 좋을 수밖에 없기 때문입니다. 


우선 영어 기준의 데이터를 통해 영어 기준 번역 모델을 다 학습시켰습니다. 그런 다음 카카오에서 자체적으로 보유하고 있는 한국어/영어의 병렬 말뭉치 속 영어 문장들을 위의 영어 기준 번역 모델에 적용하였는데, 이를 통해 한국어와 제 3 언어 간의 병렬 말뭉치를 확보하였습니다. 이후 일차적으로 확보한 병렬 말뭉치에서 여러 정제 작업을 진행하고 부적절한 문장 쌍을 최대한 제거한 후 최종 학습 데이터에 포함시켰습니다. 덕분에 순수 병렬 말뭉치의 규모의 한계를 많이 극복할 수 있었죠.


각 언어 별로 많은 이슈들이 있었지만 대체로 위와 같은 방식을 통해 학습 데이터를 구축하고 모델을 학습하여 19개의 언어 쌍 간 번역을 가능하게 만들었습니다. 추가된 언어의 번역 성능은 대부분의 언어에서 비교 우위가 있다고 평가되었습니다.

 


2. 번역 성능 개선


번역 서비스의 가장 중요한 목표는 번역 품질의 향상이라고 할 수 있습니다. 특히 가장 활용도가 높은 영한/한영의 번역 성능을 더욱 끌어올리기 위하여 데이터 및 모델 관점에서 몇 가지 작업을 진행하였습니다.


한국어에서 영어로 번역할 때, 한국어 고유명사 - 특히 인명이 포함되는 경우 - 가 제대로 번역되지 않는 경우가 존재합니다. 영어에서 한국어로 번역되는 사례가 월등히 많으므로 한국어 고유명사가 학습 데이터 내에 부족하기 때문이며, 학습이 제대로 안 될 수밖에 없으며 이는 곧 성능 문제로 귀결됩니다. 그중에서도 이름이 보통 명사와 겹치는 경우 - 예를 들어 유연석, 김하늘 등의 경우 - 는 번역하기가 더욱 까다롭습니다. 이번 개편을 준비하면서 카카오 AI 기술팀에서는 'Data Augmentation' 기법을 통해 한국어 고유명사가 적절하게 번역될 수 있도록 다양한 실험을 진행하였습니다. 대문자 또는 소문자로만 이루어진 영어 원문을 번역하는 경우나 구두점이 생략된 경우 등의 번역에서도 Data Augmentation 기법을 사용하였는데, 개선된 결과는 개편 서비스에 반영되었습니다.


한편 위의 예시는 데이터 보강을 통해 특정 오류 영역을 개선한 것입니다. 이와는 별개로 제한된 데이터에서의 근본적인 성능 개선을 위하여 더 넓은 컨텍스트(context)를 활용할 수 있도록 하는 실험을 진행하였습니다. 일반적으로 모델의 학습은 문장단위로 이루어지는데, 더욱 적절하게 번역하기 위해서는 앞뒤 문장이나 문단과 같이 보다 넓은 문맥을 봐야 하는 경우가 있습니다. 


'I live in the big city. There are many things that are better than living in the country.'라는 두 문장을 함께 놓고 번역해봅시다. 문맥 상 두 번째 문장의 'country'는 '나라'가 아닌 '시골'로 번역되어야 적절할 것입니다. City와 반대되는 개념으로 country가 쓰였기 때문입니다. 그런데 문장단위로 번역하다 보면 'There are many things that are better than living in the country.'를 따로 해석하게 되는데, 이때의 ‘country’는 ‘나라’로 번역될 확률이 높습니다. Country가 ‘시골’보다는 ‘나라’라는 의미로 더 흔하게 사용되기 때문입니다.



[그림 3] 컨텍스트 활용 번역 결과 예시


이런 문제를 해결하기 위하여 학습의 입출력을 개선하여 실험을 하였습니다. 기존 모델의 학습 데이터가 '원문 : 번역문' 쌍의 집합이었다면, 새로운 모델은 추가적으로 '원문 + 컨텍스트문 : 번역문'을 포함하고 있습니다. 덕분에 문맥 정보가 필요한 연속된 문장의 경우 보다 적절한 번역 결과를 얻을 수 있었습니다. 물론 충분한 데이터가 확보되지 않았기 때문에 여전히 불가피하게 오류가 발생하고 있지만, 많은 경우 이전보다 나은 결과를 보여주는 것을 확인하였습니다.

 


3. 문체 변환 기능


한국어는 문체, 특히 예사말/높임말의 구분이 뚜렷합니다. 그렇기에 대체로 문장단위로 이루어지는 기계번역 서비스에 아티클 단위의 입력이 들어오면 한국어로 번역된 문장 간 문체의 통일성 부족으로 불편함이 느껴질 수 있습니다. 이를 해결하기 위해 번역된 결과의 문체를 예사말/높임말로 변환할 수 있는 기능을 추가하였습니다.


[그림 4] 문체 변환 예시


처음에는 영한 번역에 대하여 문체를 변환하는 모델을 별도로 구축하여 기능이 잘 작동하는지 확인하였습니다. 그런데 문체 변환 기능은 모든 한국어 방향으로의 번역에 필요하기 때문에 실제 서비스에 적용하기 위해서는 18개의 추가적인 학습 모델이 필요하였습니다. 보다 효율적인 작업을 위하여 저희는 한국어로 번역된 결과를 다시 문체 변환할 수 있는 새로운 모델을 구축하였습니다. 즉 한국어에서 한국어로 문체를 변환하는 추가적인 모델을 만들고, 모든 언어 간 번역 결과에 이를 활용할 수 있도록 한 것입니다.


이때 학습 데이터를 대량으로 구축하기 위해 위에서 별도로 구축한 영한 번역의 문체 변환 모델을 이용하였습니다. 영어 원문을 영한 번역 모델에 넣으면 문체가 정해지지 않은 한국어 문장이 결과로 나오고, 동일한 영어 원문을 문체 변환 모델에 넣으면 예사말과 높임말로 번역된 결과가 나옵니다. 만들어진 '문체 미지정 한국어 문장 → 문체 지정(예사말/높임말) 한국어 문장'의 학습 데이터를 이용하여 예사말 모델과 높임말 모델을 학습시키면, 한국어를 입력하였을 때 각각의 모델을 통해 예사말 또는 높임말로 변환할 수 있습니다. 결국 2개의 모델 만으로 19개의 언어 쌍 번역을 모두 지원하게 된 것입니다.


문체 변환은 ‘한국어’에서 ‘높임말 한국어’로 변환하는 것이기 때문에, 어떻게 보면 일반적인 두 언어 사이의 번역과 유사하다고 할 수 있습니다. 기계번역 모델이 언어 번역 규칙을 학습하여 입력 단어열을 적절한 출력 단어열로 변환해주는 것처럼, 문체 변환 모델 역시 문체 변환 규칙을 학습하여 입력 단어열에 대응하는 적절한 단어열을 출력하는 것이므로 이 두 모델은 동일한 논리구조를 가지고 있습니다. 따라서 저희는 기계번역 모델과 동일한 모델을 사용하여 문체 변환 모델을 학습시켰습니다.



4. 하이라이팅


최신 기계번역 모델(NMT)의 주요 특징으로 'Attention'이라는 기법이 있습니다*3. 뉴럴넷(Neural Network)에서 번역문의 특정 단어를 예측할 때 원문에 대응하는 단어 가중치 정보를 학습하여 활용하는 방식입니다. 이 기법을 통해 NMT 번역 성능이 높아졌는데, 최종 번역 결과를 만드는 과정에서 중간 부산물로 생성되는 이 정보를 활용하면 의미 있는 시각효과를 얻을 수 있습니다. 


[그림 6] RNN 기반 Attentional Seq2seq 구조


다만 Attention 정보의 정확도에는 한계가 있습니다. 특히 언어에 따라 정확하게 1:1 관계가 성립하지 않는 경우나 의역이 이루어지는 경우에 부적합한 결과가 나올 수 있습니다. 또한 직접 모델을 학습한 경우에만 Attention 정보가 생성되기 때문에, 해당 기능은 한국어 또는 영어가 포함된 언어 사이에서만 제공됩니다. 예를 들어 태국어에서 중국으로 번역하는 경우에는 지원되지 않습니다.


그럼에도 문법 구조나 어휘가 비교적 유사한 언어 사이에서는 효과적으로 활용할 수 있을 것입니다. 특히 단어 간 매칭 정보를 하이라이팅 하기 때문에 사람들이 새로운 외국어를 학습할 때 큰 도움을 줄 것으로 기대합니다. 해당 기능은 기본적으로 활성화되어 있으며, 마우스 포인터를 특정 단어 위에 위치시키면 매칭되는 단어의 색깔이 강조되어 나타납니다.



마치며

30년 동안 공부해도 여전히 입이 잘 떨어지지 않는 영어를 기계가 일주일 만에 학습해서 번역을 척척해내는 것을 보면 기술의 발전이 정말 대단하다는 것을 많이 느낍니다. 특히 이번에 태어나서 한 번도 접해본 적이 없는 언어들의 번역기를 10개 이상 만드는 경험을 하였는데, 특정 언어를 전혀 모르지만 이런 번역기를 만들 수 있다는 사실이 놀랍습니다. 그렇지만 몇 가지 난관도 있었는데, 그중 한 가지는 바로 태국어와 관련된 내용입니다.


질문을 하나 드려 보겠습니다. 아래는 태국어에 대한 위키피디아의 첫 문단인데, 대략 몇 문장 정도로 이루어져 있을까요?*4

ภาษาไทย หรือ ภาษาไทยกลาง เป็นภาษาราชการและภาษาประจำชาติของประเทศไทย ภาษาไทยเป็นภาษาในกลุ่มภาษาไท ซึ่งเป็นกลุ่มย่อยของตระกูลภาษาไท-กะได สันนิษฐานว่า ภาษาในตระกูลนี้มีถิ่นกำเนิดจากทางตอนใต้ของประเทศจีน และนักภาษาศาสตร์บางส่วนเสนอว่า ภาษาไทยน่าจะมีความเชื่อมโยงกับตระกูลภาษาออสโตร-เอเชียติกตระกูลภาษาออสโตรนีเซียน และตระกูลภาษาจีน-ทิเบต


아시는 분들도 계시겠지만, 태국어는 문장의 종결이 명확하지 않습니다. 띄어쓰기가 없을 뿐만 아니라 문장의 끝을 의미하는 구두점도 없습니다. 물론 구문 분석을 통해 우리가 생각하는 문장단위로 나눌 수는 있겠습니다만, 기본적으로 태국어는 문장단위를 명시적으로 표시하지 않습니다. 


언뜻 보면 이상해 보이는데, 우리가 접속사나 추임새를 적절히 넣어가면서 계속 말을 이어나가는 상황을 떠올리시면 됩니다. 태국 사람들은 말을 할 때처럼 글로 표현할 때에도 의미상 연결되는 내용이라면 접속사를 활용해서 계속 이어나가며 문단을 구성하고, 맥락이 바뀌면 그제서야 문단을 나눕니다. 즉 태국어에서는 ‘문단’이 문장보다 중요한 것입니다.


이렇게 각 언어에는 해당 국가나 민족의 특성 및 문화가 반영됩니다. 따라서 문화의 유사도에 따라 언어들 간의 번역이 수월할 수도 있고 어려울 수도 있습니다. 현재 기계번역의 성능은 매우 높습니다만, 문화가 다른 언어 사이의 번역에서는 여전히 한계를 드러냅니다. 사람이 새로운 언어를 배우는 것과도 유사한데, 우리나라 사람이 한국어와 가장 유사한 언어인 일본어를 비교적 쉽게 배우며 영국인이 서유럽 언어들은 쉽게 배우는 반면, 우리나라 사람이 영어를 배우거나 서유럽인이 아시아의 언어를 배우는 것은 상대적으로 어려운 것과 같습니다.


일례로 흔히 우리나라 사람이 영어를 배우면서 어려움을 겪는 상황 중 하나는 '예/아니오'(yes/no)로 대답해야 하는 경우입니다. 우리나라의 경우 질문에 대하여 논리적으로 맞으면 '예', 틀리면 '아니오'를 쓰는 반면, 영어의 경우 의미가 여전히 긍정이면 'yes'로 부정이면 'no'를 사용하기 때문입니다. 영어에 익숙해지기 전까지는 많이들 실수하곤 합니다.


기계번역에서도 이런 문제가 학습에 영향을 미칩니다. 일반적으로 문장단위로 학습 데이터가 구성되고, 그중 대부분의 질문은 긍정형이기 때문에 확률모델을 따르는 인공 신경망은 'yes'는 '예'로 'no'는 '아니오'로 학습하게 됩니다.


하지만 정확하게 번역하기 위해서는 이전 문장의 질문을 참고하여 그에 맞게 번역을 해야 합니다. 모델이 이런 경우를 제대로 학습하기 위해서는 상당히 많은 규모의 부정 의문문 및 이에 대응하는 답변이 학습 데이터에 포함되어야 하며, 단순한 문장단위의 학습을 넘어서는 실험이 이루어져야 합니다. 그리고 이 두 가지 모두 쉽게 해결하기 어려운 문제입니다.


따라서 기계번역 성능의 현주소를 정리하자면 대략 다음과 같습니다.

- 문법 구조나 어휘가 유사한 언어들 사이의 번역 성능은 매우 우수하며, 사람을 상당 부분 대체할 수 있음(서유럽 언어들 사이의 번역, 한국어/일본어 번역 등)  

- 유사도가 낮은 언어 사이의 번역에서는 기계번역을 제한적으로만 활용할 수 있음


결국 기대 수준의 문제이기도 합니다. 대화를 통한 깊은 소통이나 문학적인 내용의 번역 등을 기대한다면 기계번역은 한계가 있습니다. 그렇지만 보조 수단으로 활용하기에는 지금 수준으로도 충분히 만족할 만한 - 특히 유사도가 높은 언어 사이에서 - 성능을 제공합니다. 


기계번역 서비스에서 단기간 내에 전문 번역가 수준의 번역이 이루어지지는 않을 것입니다. 이는 강인공지능(General AI)의 영역이기 때문입니다. 미래 어느 순간에 기계번역에서 발생하는 여러 문제가 완전히 해결된다면, 그것은 곧 강인공지능의 시대의 도래로 볼 수 있을 것입니다. 개인적으로는 우리의 남은 생애 동안 이 시기가 오지 않기를 바라고, 많은 전문가들이 당분간은 강인공지능 구현은 힘들 것으로 전망합니다. 그럼에도 기술 고도화를 위해 노력하는 수많은 연구개발자들이 있으니, 지금 보다 더 나은 세상이 만들어질 수 있을 것으로 기대해봅니다.




글 | 배재경





참고문헌

*1 참고 | Google’s Multilingual Neural Machine Translation System: Enabling Zero-Shot Translation. https://www.mitpressjournals.org/doi/pdf/10.1162/tacl_a_00065 

*2 설명 | 병렬 말뭉치: 원문과 대역문을 모아놓은 언어 자료

*3 참고 | http://opus.nlpl.eu/ - Open parallel corpus

*4 참고 | Bahdanau et al. Neural Machine Translation by Jointly Learning to Align and Translate, 2016. https://arxiv.org/abs/1409.0473 

*5 참고 | https://th.wikipedia.org/wiki/ภาษาไทย - 태국어 공식 위키 페이지

매거진의 이전글 2019년 주요 AI 콘퍼런스

작품 선택

키워드 선택 0 / 3 0

댓글여부

afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari