開発ブログに戻る 翻訳エンジニアリング

翻訳を生き残る数字:七折が「30%引き」であることを通訳に教える

この記事を他の言語で読む: English · 中文 · 日本語 · Español · Français · 한국어 · Українська

SyncTransは生の会話を翻訳します。そしてお金に関する生の会話は、たいてい正確な 数字を伴います。価格、数量、割引です。この記事で扱うのは、翻訳が流暢で、自信 満々で、それでいて一番大事な桁で間違っている——そういう部類のバグと、1.0.0で 出荷した地味な修正についてです。

自分で符号を反転させる割引

中国語にも日本語にも割引を表す慣用的な言い方がありますが、数える方向が逆です。 中国語は支払う分を数えます。七折は定価の70%を支払うという意味なので、 つまり30%引きです。日本語は引かれる分を数えます。同じオファーは 3割引——10分の3を差し引く——です。中国語話者も日本語話者も、それぞれ自分の 慣習を早いうちに覚えて、その後は一度も意識しません。

翻訳モデルが見ているのはまったく別のものです。七折と割引は割引の文脈で頻繁に 共起し、数字の七は7に対応します。初期のテストでは、モデルは七折を嬉々として 7割引と訳していました。これは日本語の聞き手には70%引きと聞こえます。 「30%値引きできます」と言った仕入れ先の言葉が、こちら側では「70%値引きできます」 となって出てくるのです。価格交渉において、それは成立する取引と高くつく誤解の 違いです。しかも双方とも、同じ数字を聞いたと確信したまま席を立ちます。

同じ罠、ひと桁上でも

割引が最も鋭い例ですが、同じ構造は単なる数字にも現れます。英語は大きな数を 千の位で数えますが、中国語は万(10の4乗)と億(10の8乗)で数えます。12万は 120,000、1.2億は120,000,000です。単位の基準を置き換えずに桁だけ持ち越す モデルは、12万を「12,000」と出力します。流暢で、文法的で、それでいて10倍 ずれています。話し言葉の数字はさらに厄介です。音声認識が翻訳器に渡すのは 単語の流れであり、桁を確定させる単位が、数字のひと息あとに届くことが あるからです。

なぜモデルはこの罠にかかるのか

これがなぜ異なるモデルで繰り返し起きるのか、私たちが腹落ちするまでには 時間がかかりました。割引は方向を持つ数字であり、その方向はモデルが持ち越せる 単語の中ではなく、数の慣習の中に宿っています。折を「引き」に正しく対応させる 語彙項目は存在しません。折はそもそも「引かれる分」の話ではなく、常に 「残る分」の話だったからです。モデルは何万回も見てきた表層のパターンを 再現するだけで、値が反転したことに気づく内部の帳簿を持っていません。

重要なのは、これが慣習の問題であって、モデルの能力の問題ではないと私たちが 検証したことです。割引表現と大きな数の表現を双方向で集めた小さな回帰コーパスを 作り、SyncTransが出荷するすべてのモデルティアに対して、オンデバイスの両スタックと クラウドエンジン経由で実行しました。反転はあらゆるサイズ、あらゆるスタックで 現れました。大きなモデルほど、間違った数字をより流暢に言いました。計測結果が そうなれば、結論は自ずと書けます。より良いモデルを待っていてもこれは直らない。 修正はモデルの外側に置くしかない、と。

モデルの背後に置くルール層

1.0.0での修正は、翻訳器の背後に置き、慣習の付いた数値表現を監視する決定論的な 後処理層です。割引表現が曖昧さなく解析できた場合、この層はそれを言語として 扱うのをやめ、算術として扱います。七折は明示的な値——70%を支払う、すなわち 30%引き——に変換されてから、対象言語自身の慣習で表現し直されます。折は算術 なので、算術で処理します。万や億でまとめられた数も同様です。桁は単位から 計算し、対象言語の位取りで描き直します。

この層の魅力は、退屈なことです。各ルールは答えの決まった小さな関数で、単体 テストが可能であり、バグを証明したのと同じコーパスで固定されています。ルールが 発火したとき、私たちはその理由を正確に説明できます。モデルが即興したときには それができません。流暢な誤りが誰かのお金を失わせうる、この一部類の表現の ためだけに、毎回同じ答えを返し、1行ずつ監査できる部品が欲しかったのです。

ハイブリッド方式の代償

トレードオフは目を開いたまま受け入れましたが、実際に存在します。ルール層は カバレッジの分だけしか良くならないので、最初の規律は抑制です。ルールが発火する のは表現がきれいに解析できた場合だけで、曖昧なものはすべてモデルに委ねます。 推測で動くルールは、モデルが正しく訳せたはずの出力を壊します。それは元のバグ より悪い唯一の結末です。2つ目のコストは保守です。慣習は言語ペアごとに異なり、 私たちが本気で取り組むペアごとにコーパスを育てなければならず、すべてのルールに 双方向の計測が必要です。そして、それ以外のすべて——文章、語調、コンテキスト——は 引き続きモデルが担います。ルールは、狭く計測可能な失敗の部類に対する安全網で あり、第二の翻訳器にならないよう、あえて小さく保っています。

現在の位置づけ

数字ルールはSyncTrans 1.0.0で出荷され、コーパスは回帰テストで実行されているため、 将来のモデル更新もこれに合格し続ける必要があります。作業は終わっていません。 大きな数の境界まわり——単位の混在、日常のざっくりした言い方で話される桁——の 強化は進行中であり、実際の会話が新しい間違え方を教えてくれるたびに、コーパスは 育ち続けると見込んでいます。もしSyncTransから反転したり縮んだりした数字が 出てきたら、 お知らせください。 その報告はコーパスに直行します。

1.0.0リリースに含まれるその他の全体像については、 SyncTrans 1.0への道をご覧ください。