OpenNMT 2.28.0 ๊ธฐ๊ณ„๋ฒˆ์—ญ ์‹œ์Šคํ…œ ์ถœ์‹œ

๊ธฐ๊ณ„ํ•™์Šต ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•œ OpenNMT 0.28.0(Open Neural Machine Translation) ๊ธฐ๊ณ„๋ฒˆ์—ญ ์‹œ์Šคํ…œ์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ ๊ฒฝ๋ง์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” TensorFlow ์‹ฌ์ธต ๋จธ์‹ ๋Ÿฌ๋‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. OpenNMT ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐœ๋ฐœ๋œ ๋ชจ๋“ˆ์˜ ์ฝ”๋“œ๋Š” Python์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์„ฑ ๋ชจ๋ธ์€ ์˜์–ด, ๋…์ผ์–ด ๋ฐ ์นดํƒˆ๋กœ๋‹ˆ์•„์–ด์šฉ์œผ๋กœ ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ธฐํƒ€ ์–ธ์–ด์˜ ๊ฒฝ์šฐ OPUS ํ”„๋กœ์ ํŠธ์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋ธ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ต์œก์„ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ํŒŒ์ผ์ด ์‹œ์Šคํ…œ์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์†Œ์Šค ์–ธ์–ด, ๋‘ ๋ฒˆ์งธ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์žฅ์„ ๋Œ€์ƒ ์–ธ์–ด๋กœ ๊ณ ํ’ˆ์งˆ ๋ฒˆ์—ญํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๊ณ„ ๋ฒˆ์—ญ ๋„๊ตฌ ์ œ์ž‘ ์ „๋ฌธ ๊ธฐ์—…์ธ SYSTRAN๊ณผ ๊ธฐ๊ณ„ ํ•™์Šต ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์ธ๊ฐ„ ์–ธ์–ด ๋ชจ๋ธ์„ ๊ฐœ๋ฐœํ•˜๋Š” ํ•˜๋ฒ„๋“œ ์—ฐ๊ตฌ์› ๊ทธ๋ฃน์ด ์ฐธ์—ฌํ•˜์—ฌ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ตœ๋Œ€ํ•œ ๋‹จ์ˆœํ™”๋˜์—ˆ์œผ๋ฉฐ ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ์ž…๋ ฅ ํŒŒ์ผ๊ณผ ๋ฒˆ์—ญ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ํŒŒ์ผ๋งŒ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด OpenNMT๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ์š”์•ฝ, ํ…์ŠคํŠธ ๋ถ„๋ฅ˜, ์ž๋ง‰ ์ƒ์„ฑ ๋“ฑ์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TensorFlow๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด GPU ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‹ ๊ฒฝ๋ง ํ›ˆ๋ จ ํ”„๋กœ์„ธ์Šค ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด). ์ œํ’ˆ ๋ฐฐํฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” C++ - CTranslate2๋กœ ์ž๊ธ‰์ž์กฑ ๊ฐ€๋Šฅํ•œ ๋ฒˆ์—ญ๊ธฐ ๋ฒ„์ „๋„ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค. , ์ถ”๊ฐ€ ์ข…์†์„ฑ์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์ „ ํ›ˆ๋ จ๋œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ ๋ฒ„์ „์—์„œ๋Š”initial_learning_rate ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ์ธ์ˆ˜(mha_bias ๋ฐoutput_layer_bias)๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ Transformer ๋ชจ๋ธ ์ƒ์„ฑ๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€