劇的精度向上で話題のディープラーニングを使った翻訳の仕組み
ちょっと前までコンピューター翻訳って「なんとか理解できるけど、かなりぎこちない」という印象でしたが、最近は驚くほど流暢な翻訳をしてくれます。この劇的と言える品質の向上、実はディープラーニングによって実現されています。
今日は、ここ数年でコンテストや実際の活用場面で従来の方法を上回る結果を出して注目を浴びている "ニューラル翻訳"と呼ばれるディープラーニングを使った仕組みについて記してみたいと思います。
ニューラル翻訳による機械翻訳
1.ざっくりどんな仕組みか?
大量の日本文と英訳文のセットを使ってニューラル翻訳に対する学習を行います。適切な学習をさせた後日本文を入れると、翻訳された英文が出てくるようになります。
以下では学習が完了したニューラル翻訳で和文英訳を行う際の動きを使って、その仕組みを説明します。
2.ニューラル翻訳への入力前の下準備
2-1.単語分割
ニューラル翻訳への入力は単語単位になりますので、まず文書を単語分割する必要があります。英語の場合単語の間にスペースあるので比較的簡単ですが日本語は単語の切れ目が無いので少し難易度は高いです。形態素解析と呼ばれる単語分割の方法を使ってこれを行います。今回は形態素解析については詳細を記しません「単語を分割する仕組みがあるんだ、それをやってくれる仕組みがあるんだ」と理解いただければ大丈夫です。
- 今日はいい天気ですね → '今日' , 'は' , 'いい' , '天気' , 'です'
2-2.one-hotベクトル
コンピューター扱えるのは基本的に数値データのみですから入力に先立ち、単語を数値情報に変換する必要があります。単語の数値変換に使われるがOne-Hotベクトルです。語彙数分の次元を持つベクトルを準備し、単語に割り当てられた要素のみを1で他は0に設定することで単語を表現します。難しそうに聞こえますがやってることはシンプルです。
'今日' , 'は' , 'いい' , '天気' , 'です' をone-hotベクトルで表現してみましょう。
- ‘今日’ → 1 (1,0,0,0,0)
- ‘は’ → 2 (0,1,0,0,0)
- ‘いい’ → 3 (0,0,1,0,0)
- ‘天気’ → 4 (0,0,0,1,0)
- ‘です’ → 5 (0,0,0,0,1)
ここでは簡単のため5次元にしましたが、実際は日本語の語彙はもっともっとたくさんあるのでベクトルはもっと高次元(例えば10万)になります。
*ベクトルというと難しいそうですが、要するにこういうふうにいくつかの数字を並べてセットにしたものです。上の例では5つの数字がならんでるので5次元ベクトルといいます。
2.ニューラル翻訳の内部構造
ニューラル翻訳は大きく2つのパートに分かれています。前半パートでは入力された日本文の情報をベクトルに詰め込む作業を行います。後半パートでは作成した日本語ベクトルを元に英文を出力する作業を行います。
2-1.前半パート(日本語情報を符号化する)
ここでは入力された日本語情報を表現するベクトルが作成されます。このパートは2つの層で構成されています、それぞれの層を見ていきましょう。
(1)単語を符号化する(符号化埋め込み層)
ニューラル翻訳の最初の層です。この層では入力されたone-hotベクトルを分散表現ベクトルに変換します。
one-hotベクトルは通し番号振ってるだけに等しいので単語と単語の類似性とか関連性などを表現できません。そこでこの層で入力のOne-Hotベクトルを、複数のベクトル要素で単語を表現する分散表現ベクトルと呼ばれるものに変換します。学習を通じて分散表現が適切な値に設定されれば、意味の似た単語は似た分散ベクトルの値というように単語の関連性を表現できるようになります。
下記の例では5次元のOne-Hotベクトルを3次元の分散表現に変換しています
- ‘今日’→ 1 (1,0,0,0,0) 分散表現 (0.3, 0,4, 0,5)
- ‘は’→ 2 (0,1,0,0,0) 分散表現 (0.2, 0,8, 0,3)
- ‘いい’→ 3 (0,0,1,0,0) 分散表現 (2.0, 0.6, 3.0)
- ‘天気’→ 4 (0,0,0,1,0) 分散表現 (0.6, 3.2, 5.0)
- ‘です’→ 5 (0,0,0,0,1) 分散表現 (1.3, 4.5, 0.4)
one-hotベクトルは5次元のベクトルのうち1つだけ1で他は0でした。一方分散表現では3次元のベクトルの複数のベクトル要素に値がセットされ単語を表現しています。複数のベクトル要素で表現しているので分散表現と呼ばれます。
(2)日本文を符号化する( 符号化再帰層)
前の層で分散表現に変換された単語を順番に入力して、日本語の文書のベクトルを作成します。この層は作成されたベクトル情報を次のステップで入力として使う再帰ニューラルネットワークという仕組みになっています。
例を使ってみてみましょう。
- Step#1 ‘今日’ → 日本文ベクトル#1
- Step#2 ‘は’ + 日本文ベクトル#1 → 日本文ベクトル#2
- Step#3 ‘いい’ + 日本文ベクトル#2 → 日本文ベクトル#3
- Step#4 ‘天気’ + 日本文ベクトル#3 → 日本文ベクトル#4
- Step#5 ‘です’ + 日本文ベクトル#4 → 日本文ベクトル#5
再帰構造になっているので、各ステップで前のステップで作成された日本文ベクトルを入力として使っています。この層の処理が完了し、最終的に作成された日本文ベクトル#5には日本文を構成する全ての単語情報が入っています。
2-2.後半パート(英訳を行う)
ここでは符号化層で作成された日本語情報を表現するベクトルを元に英訳文を出力します。
- Step#1 日本文ベクトル#5 + BOS → 英訳ベクトル#1 → "It"
- Step#2 英訳ベクトル#1 + "It" → 英訳ベクトル#2 → "is"
- Step#3 英訳ベクトル#2 + "is" → 英訳ベクトル#3 → "fine"
- Step#4 英訳ベクトル#3 + "fine" → 英訳ベクトル#4 → "today"
- Step#5 英訳ベクトル#4 + "today" → 英訳ベクトル#5 → "EOS"
各ステップの動きをみてみましょう。
Step#1では
前半パートで作成した "日本語ベクトル#5" とこれから英文開始しますという特殊文字記号 "BOS" を入力に変換処理を行い、"英訳ベクトル#1"が作成されます。
作成された"英訳ベクトル#1"を入力に変換処理を行い、英訳文の最初の単語 "It" が作成されます。
Step#2では
Step#1で作成された"英語ベクトル#1"と出力された英単語 "It"を入力に"英訳ベクトル#2"が作成されます。
作成された"英訳ベクトル#2"を入力に変換処理を行い、英訳文の2番目の単語 "is" が作成されます。
この後同じように処理を繰り返して行き、"EOS:(End of Sentence)"が出力されたら終了します。
今までの仕組みとの違いと可能性
従来の機械翻訳の仕組みは自然言語処理に必要な色々な部品を組み合わせて作られていました。実装に当たってはまずそれぞれの部品の学習を行い、学習済みの部品を組み合わせたものに対して翻訳の学習を行うという作業が必要でした。
ニューラル翻訳は一つのニューラルネットで翻訳を行うので、従来の方法に比べると学習方法がシンプルです。従来の仕組みの場合は各部品の学習のために部品の学習に特化したデータを作成する必要がありましたが、ニューラル翻訳の場合は実際の翻訳データだけあれば良いのでデータ収集も簡単です。
また従来の部品による構成だとある程度入力と出力の関係を考慮して部品の構成を考えて実装する必要がありましたが、ニューラル翻訳の場合はそういった中間層を考慮する必要がありません。
これを応用すればこれまで入力と出力の関係の定義が難しいため機械学習の対象にすることができなかったような処理も可能になります。この系列変換モデルという仕組みを使って画像情報を入力にその説明文を出力するような学習も実装され始めています。
参考書籍
深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)
- 作者: 坪井祐太,海野裕也,鈴木潤
- 出版社/メーカー: 講談社
- 発売日: 2017/05/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- 作者: Christopher D. Manning,Hinrich Sch¨utze,加藤恒昭,菊井玄一郎,林良彦,森辰則
- 出版社/メーカー: 共立出版
- 発売日: 2017/11/23
- メディア: 大型本
- この商品を含むブログ (1件) を見る