ディープラーニング超概要　機械翻訳の仕組み


最近機械翻訳の精度が驚くほど向上しています。

以前の機械翻訳は「なんとなく意味はわかるけどそのままは使えない」というレベルでしたが、今はGoogleの翻訳サイトを使うと、ほぼそのまま使えそうな流暢な翻訳文を作ってくれます。

この精度の向上の裏にあるのがディープラーニングを使った**ニューラル翻訳**という手法、これに切り替えたことで、従来の手法では実現できなかった高い翻訳精が実現されました。

「高い精度を実現したニューラル翻訳とはどんな仕組みなのか？」調べたことをまとめてみました。


#**ニューラル翻訳概要**

ニューラル翻訳はディープラーニングを使った機械翻訳の仕組みです、対訳データを使って学習を行い、適切な学習が完了すると、入力した文章を他の言語に翻訳してくれます。

下記は和文英訳の例です、日本語と英語の対訳データを使って適切な学習を行った後、英訳したい日本語を入力すると英訳文を出力してくれます。

```
今日はいい天気です　→　It is fine today
```

##**ニューラル翻訳で使用するデータ**

機械学習が扱うことができるのは数値データのみです。ニューラル翻訳も例外ではありません。前処理を行い、自然言語をコンピューターが処理できる数値データに変換する必要があります。

###(1)**文書を単語に分割する（形態素解析）**

ニューラル翻訳への入力単位は単語となりますので、まずは文書を単語単位に分割します。

この処理を形態素解析と呼びます。

```
今日はいい天気です →　'今日' , 'は' , 'いい' , '天気' , 'です'
```

>ここでは形態素解析については詳細を記しません、「単語を分割する仕組みがあるんだ」と理解いただければ大丈夫です。

###(2)**数値表現に変換する**

次に分割した単語をコンピューターが扱える数値に変換します。

単語の数値変換によく使われるのがone-hotベクトルです。

語彙数分の次元を持つベクトルを準備し、単語に割り当てられた要素のみを１、他は０に設定することで単語を表現します。

難しそうに聞こえますがやってることはシンプルです。

```
５つの単語、'今日' , 'は' , 'いい' , '天気' , 'です' を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)
```

単語１つ１つに通し番号をつけるようなイメージです。

>ここでは簡単のため５つの単語で説明したので５次元ベクトルになりましたが、実際は日本語の語彙はもっともっとたくさんあるのでベクトルはもっと高次元になります。

今回説明するシナリオでは日本語、英語とも20,000次元のone-hotベクトルを使う想定にしています。

>ベクトルというと難しそうですが、要するにこういうふうにいくつかの数字を並べてセットにしたものです。上の例では５つの数字がならんでるので５次元ベクトルといいます。

##**ニューラル翻訳の構成**

ニューラル翻訳の処理は大きく前半と後半に分けることができます。

![スライド1.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/e1b4ea18-e53b-2aab-db21-ba59dea116fe.gif)

1. 前半の処理 : 翻訳対象の日本文の情報を詰め込んだベクトルを作成します。
1. 後半の処理 : 前半で作成したベクトルを使って英訳文を作成します。

###**前半 : 日本文の符号化**

ここでは入力された日本語情報を詰め込んだベクトルが作成されます。このパートは２つの層で構成されています、それぞれの層を見ていきましょう。

####**(1)単語を符号化する（分散表現）**

ニューラル翻訳の最初の層です。この層では入力されたone-hotベクトルを分散表現ベクトルに変換します。

one-hotベクトルは通し番号振ってるだけに等しいので、単語と単語の類似性とか関連性などを表現できません。

そこでこの層で入力のone-hotベクトルを、複数のベクトル要素で単語を表現する分散表現ベクトルと呼ばれるものに変換します。

学習を通じて分散表現が適切な値に設定されれば、意味の似た単語は似た分散ベクトルの値というように単語の関連性を表現できるようになります。

下記の例では5次元のone-hotベクトルを３次元の分散表現に変換しています

```
'今日'→ 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ベクトルは５次元のベクトルのうち1の要素だけ1で他は0でした。一方分散表現では３次元のベクトルの複数の要素に値がセットされ単語を表現しています。複数のベクトル要素で表現しているので分散表現と呼ばれます。

![スライド2.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/137d7d7d-9ab4-80b3-7c9d-fa20e292e034.gif)

こちらの例では20,000次元のone-hotベクトルを200次元の分散表現に変換しています。

####**(2)日本文を符号化する**

前の層で分散表現に変換された単語を順番に入力して、日本語の文書のベクトルを作成します。この層は作成されたベクトル情報を次のステップで入力として使う再帰ニューラルネットワークという仕組みになっています。

例を使ってみてみましょう。

```
Step#1 '今日'　 　 　　　　　　　→　日本文ベクトル#1
Step#2 'は'　 + 日本文ベクトル#1 →　日本文ベクトル#2 
Step#3 'いい' + 日本文ベクトル#2 →　日本文ベクトル#3
Step#4 '天気' + 日本文ベクトル#3 →　日本文ベクトル#4
Step#5 'です' + 日本文ベクトル#4 →　日本文ベクトル#5
```

料理に例えると、調理して作ったものに新しい素材を加えて、段階的に調理をしていくイメージです。

```
素材 '今日' を使って調理し、'日本文ベクトル#1'を作成。
'日本文ベクトル#1' に素材 'は' を加えて調理し、'日本文ベクトル#2' を作成
'日本文ベクトル#2' に素材 'いい' を加えて調理し、'日本文ベクトル#3' を作成
'日本文ベクトル#3' に素材 '天気' を加えて調理し、'日本文ベクトル#4' を作成
'日本文ベクトル#4' に素材 'です' を加えて調理し、'日本文ベクトル#5' を作成
```

常に前のステップで作ったものを再利用する構造になっているので、最終的に作成された日本文ベクトル#5には日本文を構成する全ての単語情報が入っています。

>この構造を再帰ニューラルネット(RNN:recurrent neural networks)と呼びます

![スライド3.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/65c0ec97-f7cc-3e31-762f-36264ad54cf7.gif)

日本文ベクトルは文書の長さに関係なく固定長です、こちらの例では文書ベクトルは500次元です。

###**後半：英訳文の作成**

ここでは前半に作成された日本文ベクトルを元に英訳文を出力します。

```
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)と2回目以降で動きが異なります、それぞれの動きをみてみましょう。

####**一番最初(Step#1)の動き**

前半パートで作成した "日本文ベクトル#5" とこれから英文開始しますという特殊文字記号 "BOS:(Beginning Of Sentence)" を入力に処理を行い、"英文ベクトル#1"が作成されます。

作成された"英文ベクトル#1"を入力に処理を行い、英訳文の最初の単語 "It" が作成されます。

![スライド4.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/1422b8e0-d28d-f8e3-1631-af3dbc0c4bbe.gif)


####**2回目以降の動き**

2回目以降は前のステップで作成された英文ベクトルと英単語を入力に処理が行われます。


![スライド5.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/89a96321-61e1-c91d-a1af-c1a6e2346779.gif)

1. Step#1で作成された"英文ベクトル#1"と英単語 "It"を入力に"英文ベクトル#2"が作成されます
1. 作成された"英文ベクトル#2"を入力に変換処理を行い、英訳文の２番目の単語 "is" が作成されます
1. 3回目以降も同じように処理を繰り返して行き、文章の終わりを示す特殊文字"EOS:(End of Sentence)"が出力されたら終了します。

>今回はニューラル翻訳のもっともシンプルな形態を説明しています。
>実際に使われているものはさらに多層になっていたり、応用手法が使われていたりします。

##**ニューラル翻訳の可能性**

ニューラル翻訳が注目を浴びているのは、従来の手法では実現できなかった高い翻訳精度を実現したためですが、この仕組みにはさらに大きな可能性があります。以下従来の手法との違いと可能性について述べます。

###**従来の機械翻訳手法との違い**

ニューラル翻訳の場合学習に必要なのは対訳データのみです。実はこれは以前の機械翻訳の手法に比べると非常にシンプルです。

以前の手法では自然言語の処理を行う複数の部品を組み合わせて、機械翻訳の仕組みを作る構成になっていました。

この手法だとまず各構成部品に特化した学習を行い、その後それらを組み合わせて作った機械翻訳の仕組みに対して学習を行うという手順を踏む必要がありました。

また、各部品に特化した学習に必要なデータは人為的に作る必要がありました。

ニューラル翻訳では１つのニューラルネットで翻訳を行うので学習データとして必要なのは対訳データのみとシンプルです。

また学習に必要な対訳データは人為的に作成しなくても大量なデータが存在する場合が多く、学習データが得やすいという特徴があります。

###**他分野での活用の可能性**

今回紹介した和文英訳の処理では「入力が日本語、出力が英語」という構成でしたが、ニューラル翻訳で使われている仕組み（系列変換モデルと呼ばれています）を応用すると「入力が画像、出力はその画像の要約文」というように様々な入力、出力の組み合わせをカバーできる可能性があります。

#参考書籍

[深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)](https://goo.gl/hP3dyc)
[ウェブデータの機械学習 (機械学習プロフェッショナルシリーズ)](https://goo.gl/nozyPj)
[岩波データサイエンス Vol.2](https://goo.gl/drKnBU)