2021年1月28日木曜日

プログラミング例題(ハミルトン閉路問題):micro:bit版

  【what is this】マイクロビット(micro:bit)のプログラミング例題として、有向グラフのハミルトン閉路問題をやってみました。これは(NP完全問題)であり、効率的な解法は無いようです。そこで、全パス検索になるのですが、DNA(分子生物学の)を使って試験管のなかでこの問題を解いたAdelmanに習い、解の候補となる経路を事前に生成して、それをふるいにかける方式としました。この例題作成をとおして、micro:bitのプログラミングシステムが非常に優れていることを再確認しました。

(⇒本記事の続編はこちらにあります。)

micro:bitでの有向グラフのハミルトン閉路問題
 micro:bitは最近Version2が発表され、メモリの増強(RAM 8倍化、Flash 2倍化)、タッチセンサやマイク、スピーカーの内蔵などがなされています。今回、これを記念して?ハミルトン閉路問題(始点ノードから出発して、全てのノードを1度だけ訪問し、始点へ戻る経路を探索)を解いてみます。高校生向け講座などの例題になるかも知れません。

 問題設定ですが、micro:bitには、5x5のLED表示しかありませんので、5ノードの有向グラフに限定します。図1のように、ボタンAを押してランダムに5ノード間の接続行列を作るようにします。



 次にボタンBを押すとその解を探索し、見つかった解の個数を表示します。解がなければ0個となります。さらにタッチセンサに触れると、解を電光掲示板方式で1文字づつ流して表示します。これだけですが、ちょっと楽しいプログラミングとなるはずです。


有向グラフのハミルトン経路問題の解法
 この解法は、全パス検索になります。ただし、AdelmanのDNAを利用した(試験管のなかでの)解法を念頭におき、事前に解の候補をすべて生成します。すなわち、ノード1, 2, 3, 4の順列(4! = 24個しかありませんが)を生成し、その先頭と末尾に0を付加した経路シーケンスが、上で生成した接続行列から作れるかを検査します。出題となる接続行列の個数は約100万個(= 2の20乗)あるのですが、そのいずれに対しても24個の可能性を調べれば良いことになります。ランダムに生成した接続行列では、解が存在しない場合も多く、解があっても、数個程度以内となります。

micro:bitプログラミング
 この解法のプログラムの主要部を図3に示します。ブロック形式、μPython、JavaScriptの3種が利用できます。ここで特筆すべきは、大まかには最初にブロック形式で作成して、細部をμPythonで作ることができることです。図ではmakePathという関数を作っているのですが、再帰的構造になり、ブロック形式で作成していると細部が考えにくい状況になりました。そこで、μPythonに切り替えて作成するとかなり楽でした。そして、その後、再度ブロック形式に戻ることができるのです!

 さらに素晴らしいと思ったのは、実機のmicro:bitでやる前に、PCでエディタやシュミレータを使えることです。それには、デバッガーやコンソールも使えるという優れた開発環境になっているのです。


micro:bitは誰のものか?
 micro:bitは、通常、小中高生のプログラミング教育などに広く利用されています。大学ではあまり関心は高くないようです。ですが、上記の経験からも、これは大学でも、初級プログラミングにはかなり使えのではないかと思った次第です。
 micro:bit単体では、確かに作れるアプリに限界があります。しかし、他の機器やスマホとの連動機能も豊富なので、それを使うとかなり高度なアプリも楽しく作れると思います。

小生がこれまでに作成したmicro:bitアプリもご参考に
 ちょっと手前味噌になりますが、小生がこれまでに、micro:bitと他の機器などと連携させて作成したアプリの情報は以下にあります。ご参考になれば幸いです。

⇒本記事の続編はこちらにあります。

2021年1月24日日曜日

DNA鎖を再帰的ニューラルネットワークSeq2seqの学習データに(2)

 【what is this】リカレント(再帰的)ニューラルネットワークの一種であるSeq2seqを理解する際に必要となるデータセットの準備です。前回に引き続き、分子生物学のDNA鎖を入力データとして利用しました。前回のものよりも学習が難しいと思われたデータ(ゲノムショットガン法の考え方に基づく)を採用したのですが、難なく学習を完了することができました。

Attention付きSeq2seqへの学習データ
 今回用意した学習データをFig.1に示します。使用文字は、塩基を表す4文字(A, T, G, C)です。入力データは12文字から成ります。これに対して、「ある変換規則」でラベル(9〜12文字)を生成しています。全部で60,000件あります。これを使った学習が完全に終われば、この「変換規則」を見い出したことになります。


Attention付きSeq2seqでの学習の結果
 結論から言いますと、Fig.2のとおり、なんなく学習が完了しました。すなわち、入力60,000件のうち9割を訓練用に、1割をテスト用にした場合、エポック8で正解率100%に達しました。実際に、学習後には、60,000件のデータ全てに対して正解のラベルが得られました。改めて、Attention付きAeq2seqの性能を堪能できました。



入力データからラベルへの変換規則
 ここで、上に述べた入力データをラベルに対応させる「ある変換規則」を示します。Fig.3にあるとおりですが、ゲノムショットガン法と呼ばれる方法の一部を利用しています。すなわち、まず、入力データを2等分し、左側の末尾と右側の先頭で連続した共通部(最大3文字まで)を見つけ、それを「のりしろ」として、両者を再結合させたものがラベルとなります。

 ただし、入力データを全くランダムに作成するのではなく、4つのパターン(a)(b)(c)(d)がほぼ均等に出現するように、入力データの生成を工夫しています。


2021年1月20日水曜日

DNA鎖を再帰的ニューラルネットワークSeq2seqの学習データに(1)

【what is this】リカレント(再帰的)ニューラルネットワークの一種であるSeq2seqは、ある時系列データを別の時系列データへ変換します。その理解のために、分子生物学に出てくるDNA鎖を入力データとして利用しました。長さ6の2つのDNAの連接とそれに必要な相補配列を5万セット学習させた結果、必要な相補配列を100%予測できるようになりました。

Attention付きSeq2seqへの学習データ
 このタイプのリカレントニューラルネットワークについては、別の記事で簡単に書きました。その際は、英文→和文、あるいは、和文→英文を言語コーパスとして与えて学習させ、機械翻訳を行いました。今回は別の種類のコーパスとして、DNA鎖をとりあげます。と言っても、ここでは、それを塩基(A, T, G, C)の文字列として扱うに過ぎません。

 図1に示すような学習データを用意しました。各行は、12文字からなる入力データ(DNA)と、それに対して「ある規則」で生成したラベル(相補配列)6文字で構成されています。使われる文字は、4つ(A, T, G, C)だけです。この場合、入力データは約1,700万個(4の12乗)作れますが、ここでは、そのうちからランダムに5万個(5万行)を選択しました。



DNA鎖と対応相補配列の学習
 このデータを、前回と同様に、Attention付きSeq2seqで学習させます。5万件のうち、訓練には45,000件を、テスト用には5,000件を使いました。学習状況は図2のとおりです。6epochsで、テスト用5,000行に対して全て正解(正解率100%)となりました。実際、全データ5万件に対して全て正解でした。


入力データとラベルの対応規則
 入力データからラベルを生成する「ある規則」とは図3(a)に示したとおりです。それには、ワトソン・クリック相補性が使われています。すなわち、入力データを(T→A, A→T, G→C, C→G)に従って置換したものをラベルとしました。ただし、置換する部分は、入力の中央の6文字に対してだけであることにご注意下さい。ということは、入力のうち左端と右端のそれぞれ連続3文字はラベルに影響を与えていません。一方、図3(b)は、置換開始位置を左へ1文字ずらした場合です。




(補足)入力データは12文字になっていますが、本当は長さ6の2つのDNAが、ラベルのDNA(相補配列)によって連接していること(ハイブリダイゼーション)を想定しています。

学習済みモデルの可視化
 上記のとおり、学習済みモデルが入力データに対して100%の正解率を出したということは、図1のデータにある「入力データ→ラベル」の対応規則を発見できたことを意味します。それを裏付けるデータが図4(a)にあります。横軸は入力データ(TCATGCTTATAA)、縦軸は正解である予測結果(ACGAAT)です。マス目の色の明るさは、入力文字が縦軸(予測結果)の文字へ反応している強さを示しています。この図から、以下のことが自動的に認識されたと言えます。

(a) 入力データの中央6文字に対して、置換(T⇔A, G⇔C)を行うと正解文字列(ラベル)が得られること。
(b) 入力データのうち、先頭と末尾の連続3文字は、予測に影響を与えていないこと。



    以下の図4(b)は、図3(b)のような入力データとラベルを学習させた場合です。ハイブリダイゼーションの位置が左に1文字ずれた影響が確認できます。


 今回の学習データを使った検討によって、改めて、Attention付きSeq2seqの可能性を知ることができました。

2021年1月14日木曜日

Awesome Dancing with AI Tutorial

 【what is thisMIT App Inventorの人工知能チュートリアル第7弾として、PoseNetを利用した身体動作(ダンス)の検出アプリ[1]が公開されました。骨格17節点の座標をリアルタイムに得られるブロックが新設されたため、スポーツ解析やジェスチャ応用などのスマホアプリを作りやすくなります。

PoseNet Extension for MIT App Inventor
 身体動作を検出するAIソフトとして、OpenPoseやPoseNetが利用されています。しかし、スマホのアプリの一部にそれを取り込みには、ちょっと敷居が高いと思います。そこで、今回のMIT App Inventor用のPoseNet Extensionの登場です。図1に示すとおり、身体骨格の節点17点の座標をリアルタイムに得ることができる機能(ブロック)が提供されました。


PoseNet Extension を利用した人工知能チュートリアル
 MIT App Inventorでは、主に高校生向けに、人工知能チュートリアルを提供しています。今回はその第7弾として、このPoseNetを利用した図2に示すような4種類のダンスの検出アプリが公開されました。


 AIチュートリアルですから、最初からソースプログラム(ブロック)は示されていません。順を追って説明とヒントが与えられるので、各自が考えながら、プログラムを作って行きます。例えば、図3には、4種類のダンスの検出ブロックがあるのですが、その中味は示されていません。赤字の部分を自分で考えながら(各節点の上下関係や節点を結んだ線分どおしの平行性や角度などを考慮して)作り上げて行くのです。自分の動きを撮影して、自分がどれだけうまくダンスができたかを判定する部分も作ります。


映像の中の動作も検出してみる
 このアプリを完成させても、(誰かに撮影してもらえる場合は良いのですが)自分自身でダンス動作を確認することはちょっと難しいです。また、撮影する際の背景にもかなり影響を受けるようです。そこで、手軽にアプリをテストするために、図4にあるように、Youtubeにあるテレビ体操を写してみました。ここでは、肩が水平になっているか否かも検出してみました。うまく行っているようです。画面の上側(骨格画像)と下側(実映像)にはタイムラグがあり、若干ずれて表示されます。図5は、水平検出コードです。




今後の活用
 PoseNetが、スマホアプリのなかで手軽に使えそうです。動作検出AIの学習済みモデルが、このextensionに含まれているため、実行時にネットワークへ接続する必要はありません。身体動作をインタフェースとするいろいろな応用が考えられるように思います。

【補足】
 今回と同様の身体動作を利用したソフトウェアの例として、過去にScratchプログラミングをとりあげました。こちらもご参考にしていただければ幸いです。

【参考資料】
[1] Artificial Intelligence with MIT App Inventor
http://appinventor.mit.edu/explore/ai-with-mit-app-inventor


2021年1月1日金曜日

Attention機構を備えたニューラル機械翻訳の小実験

【what is thisニューラル機械翻訳、特にAttention付きの機能を学びたいと考え実験しています。これまでの日英翻訳に加え、今回は英日翻訳をやってみました。日英でも英日でも、全く同じプログラムで翻訳ができてしまうことに感動を覚えます。これが、Attention付きseq2seq(シーケンスtoシーケンス)の威力だと実感できました。

どんな機械翻訳プログラムなのか
 詳細は省きますが、斉藤康毅氏の著作[1]にあるPythonプログラムを元にしました。Attention機構を有するニューラルネットワークRNN(LSTM)が使われています。この書籍の特徴は、「ゼロから作る」というだけあって、良く使われているTensorFlowKerasは使わずに組み立てられていることです。そのため、詳細部までよく把握できます。実際、小生も、必要な部分をカスタマイズして使っています。これは非常にありがたく、著者の斉藤氏に感謝したいと思います。

英文和訳の機械翻訳実験の準備
 上記書籍では、いくつかのシーケンスtoシーケンス変換例は説明されていますが、機械翻訳の例題は載っていません。そこで、英日翻訳のための対訳コーパスを独自に作成することから始めました。
 図1はそのための英文生成法を、図2にはそれに対応する和文生成法をそれぞれバッカス記法風に示しています。簡単なものですが、これから、英和対訳例文を36,288件自動生成することができます。ここで扱えるボキャブラリは、図1からわかるとおり、僅かなものに過ぎません。ただ、このseq2seqでは、英単語としてではなく、出現する英字(および日本語文字)1文字の種類をボキャブラリとして扱っています。その意味でのボキャブラリは、約100個(日英それぞれ)になります。


 この図1と図2から生成される英和対訳文の例を図3に示します。以下のような対訳文を学習させるわけです。


英和対訳文を学習させる
 では、この対訳コーパスを上に説明した翻訳プログラムで学習させます。入力は、全部で36,288件ですが、そのうち9割を訓練に、残り1割をテスト用として学習させた状況を図4に示します。思いのほか収束が速く(乱数系列により変わりますが)、ある実行では、43 epochsで学習時ロス= 0.00、テストデータに対する正解率 = 100%に達しました。
 この結果、図1から生成される英文36,228件全てに対して、正解の和文を与える英日翻訳器が完成したことになります!(実際に、全件正解を確認しました。)


Attention機構の可視化によって学習内容を確認できる
 このような結果を与えたAttention機構の役割を図5で確認してみます。この図は訳文(縦軸:和文)を生成する際に、入力文(横軸:英文)のどこに着目しているかを示していると考えられます。この翻訳器には、上で作成した対訳コーパスを入力として与えているだけであり、「Taro - 太郎」、「One morning in December - 12月の午前」等の対応を明示的には与えていません。それにも拘わらず、この図は、そのような対応を学習できていることを示しています。


翻訳機能の柔軟性も確認できる
 最後に、この学習済みの翻訳モデルに対して、与える入力を少し揺らしてみます。例えば、図6の[1a]の英文のうち、「December」と「leaving」の綴りを間違えたものが[1b]の英文です。これを翻訳させたところ、[1a]に対する和文と同一の和文が得られました。すなわち、かなり似た単語(文字列)であれば、妥当な翻訳結果に落ち着くようです。ただし、一般には、学習していない単語(綴り)に遭遇した場合は、当然ながら悲惨な結果となるでしょう。

 もうひとつ、別の例を示します。[2a]の「road」を「river」に変えたものが[2b]です。これらに対する和訳文をみると、「銀行」が「土手」に変わっています!これはどうしてなのか?おわかりですね。それは、図1と図2からも分かりますが、bankという単語と共にroad、riverが出てきた場合は、それぞれ異なる和文が作られるようにしてあります。すなわち、bankは、状況により「銀行」か「土手」になります。それをコーパスから学習した結果なのです。


まとめ
 前回の和文英訳と今回の英文和訳のどちらに対しても、機械翻訳プログラムは同一です。この機械翻訳では、入力文の構文解析らしきことは何もやっていません。入力文に出現する文字列の区切り(単語)の認識と文字の種類の辞書登録の操作くらいしかやっていません。それでも、これだけの翻訳を可能にする、Attentionとseq2seqには驚嘆します。さらに調査検討したいという気にさせます。

参考文献:
[1] 斉藤康毅:ゼロから作るDeep Learning② 自然言語処理編、オライリー、2018年7月

2020年12月17日木曜日

神奈川工科大学で講義:自然言語処理と機械学習(事後編)

 【what is this】神奈川工科大学_情報工学科向けの「入門:自然言語処理と機械学習」講義後の報告です。前回の続編になります。現状の小生にとって、今年のn大ニュース(n ≦ 3)入りとなりました。 

久しぶりに約140名に90分講義(講演)
 前回記載のとおり、90分のオンライン講演を実施(2020-12-10)。対象は、約140名の2年生ですが、先生方や大学院生にも聴いていただきました。このコロナ禍ゆえ、自宅からZOOMを利用した講演でしたが、特にトラブルもなく終えることができました。
 熱心に聴講し質問もしてくれた学生諸君に、そして準備された担当の先生、応援して質問もしていただいた先生方に感謝したい。当方としてはここ2ヶ月間、構想を練り準備してきた甲斐があり、たいへん嬉しく思っています。下図のスクリーンショット、どこか良い雰囲気を醸し出しているような気がします。

2年生約140名と、院生、先生方にも参加していただいた

質問が出るのはオンラインのメリット
 上図右欄に見えますが、講演後に学生諸君から3件ほどの質問がチャットで寄せられました。対面授業では通常、ほとんど出ませんので、これは、オンライン授業の良い点のようです。ただ、質問時間は限られていたので、その場でパチパチ素早く質問を正確に打つのは難しかったと思います。後でメールでも質問できるように、当方のメールアドレスも講義スライドに記載はしておきました。

その場の反応が分からないデメリットも
 一方、受講状況が掴めません。私は、ユーモアというか、「ここで学生諸君を和ませよう」と、スライドの何カ所かに仕組んでいたものがあります。それに対する反応が分からないのです。対面であれば、大人数の場合でも、ちょっとどよめいたり、笑いが起こったりするのが分かります。それが知りたいのです。それは5カ所位あったのですが、例えば、以下のような所でした。「ここじゃない!ここ!(詳細はこちら)「日曜日は銀行はやっていない!(詳細はこちら)」It happens inevitably.

ここで、小さなどよめきや笑いが起こるのでは...

後日提出の受講レポートから反応を掴む
 ですが、この講義受講ではレポート提出が義務づけられているため、後で状況を掴むことができました。熱心によく受講してもらったことが分かりました。今後の参考にしたい。残念ながら(公式レポートにはそういうことは書かないものだが)、上記の笑いについて触れた学生はいませんでした!ちょっと残念。以下に、学生諸君からの反応をいくつか示します。(原文の意味を損なうことなく、抜粋、編集したところがあります。)
  1. メモは取ったが、講義資料が公開されていなければ、後で理解を深めることは困難だったが、それがあったので非常に助かった。((注)スライドが役立って良かった。)
  2. 資料を見返してしっかりとまとめたメモと見比べなんとなく理解するところまで行けたことは、個人的にとても大きかったです。((注)予習して臨んだようです。)
  3. 内容だけを見たらすごく難しいものを簡単に見せる工夫や見る側が興味を持つようなしゃべり方をしていたので参考にしたいと思いました。((注)よく分かってくれました!)
  4. 最初は基礎的な部分から、徐々に内容を複雑にしていって、尚且つ前のスライドでその話に持っていきやすいように、しっかりその情報の開示・整理を行っていたために理解しやすくて、((注)そこまで、よくぞ分かってくれました!「以心伝心」という言葉が頭に浮かんだ。)
  5. 退職後も自分の興味で調査や実験をしたという事を聞いて、私も自分自身で動く行動力や何にでも興味を持つ好奇心を忘れないようにしたいと思いました。((注)こんなところにも気がついてくれました!)
  6. 自身が気になったから実際に行ってみたという動機や実体験を元にした説明だったので、内容がわかりやすく伝えたい事も明確で、全体的にとても良かった((注)そのとおり。自分でやってみること!)
  7. Google翻訳を使っているが((注)そういう学生が非常に多かった!)、それに関連する技術や動向の概要が分かった。機械翻訳がこれほど凄い技術でなりたっているとは思わなかった。
  8. 数学の知識が不足しているのでそれを身に付けたい。((注)講義では、誤差逆伝播や微分等については直接言及しなかったのだが、学生は、数学的手法を感じ取った!)

時間配分に気を配る
 スライドは全部で62枚ありました。90分のうち、どの辺りにどの位時間をかけるのか、受講者もそれが分かると落ち着いて聴けるように思いした。少し余裕を持った時間配分とするのが良いと思います。結果としては、ある先生から(そして学生のレポートの中にも)、「ほぼ、時間配分どおりでしたね」と言われて、ちょっと安心。

事前に決めておいた時間配分(配布スライドにも記載)

2020年12月12日土曜日

Attention-Seq2Seq翻訳実験での隠れ層ノード数

  【what is this】日英翻訳実験を行う上で、手頃なサイズの日英対訳コーパスが必要です。ここでは、簡単なものですが独自に用意してみました。そして、これまでの記事に書いた方式(Attentionを用いた)での学習実験を行いました。約4万件の和文のうちからランダムに選んだ9割について対訳英文を学習させた結果、残りの1割の和文全てに対して、正解の英訳文を生成できました。その際の、LSTM隠れ層のノード数に対する和英翻訳正解率の違いを観察しました。

独自のミニ和英対訳コーパスを作成する
 図1のフローに従い、左端から右端までのあらゆるパスを辿ると、語彙数38の範囲で和文41,472件が生成できます。一方、図2に従うと、それらの和文に対する英訳文を生成できるようになっています。英文の場合は、人称に応じて動詞(例えばexpectかexpectsか)の形を選択します。また、この動詞を使う場合は、図2の赤丸に示すように"to"を付加する必要があります。


どのような対訳文が生成されるか
 上記にしたがって生成された和文とその英訳文の例を3つほど示します。
[J1] 私は白い小さな花が早春に一斉に咲くのならばそこへ行くだろう
[J2] 彼女は黄色い斑な花が真夏に密集して開くことを期待している
[J3] 我々は紫の丸い花が晩秋に徐々に咲くことを期待している

[E1] I would go there if white small flowers bloom all at once in early spring
[E2] She expects yellow mottled flowers to open densely in midsummer
[E3] We expect purple round flowers to bloom gradually in late autumn

Attentionを利用した翻訳に上記コーパスを適用
 今回の翻訳方式は前回、前々回の記事に述べたとおりです。つまり、Attention付きseq2seqによるものです。それを構成するLSTMの隠れ層のノード数について実験的に検討しました。以下の結果は、いずれの場合も、約4万件の和英文の対の9割を学習させ、残り1割(約4,000件)を検査に使った場合です。

隠れ層のノード数をどう決める
 実用的な翻訳処理では、入力one-hot vectorの次元(語彙数)は50,000前後であり、隠れ層ノード数は500前後とされているようです。しかし、今回のように語彙数38と非常に少ない場合はどうなのでしょうか。それを確認してみました。以下の図3(a)〜(c)では、隠れ層のノード数が違います。検査用の和文に対して生成された英文の正解率の推移を示しています。

 まず、図3(a)は、隠れ層ノード数を16とした場合です。乱数系列を変えた2つのケースについて示しています。なかなか正解率が上がらず、使えそうにありません。


 次の図3(b)は、隠れ層ノード数を32とした場合です。かなり良いようです。epoch = 20では、すでに検査用和文約4,000件の全てに対して妥当な英訳が得られています!正解率100%!


 図3(c)は、隠れ層ノード数を64に倍増した場合です。より早めに正解率が高まるものの、途中の局所解で停滞したり、誤差低減に不安定が生じたりする傾向があります。


一応の結論
 こんな簡単な実験だけで何が言える?という面もありますが、今後の参考になるように思います。隠れ層のノード数が少なすぎると、入力語彙に対するベクトルにその意味情報が正確に盛り込めない。逆に、隠れ層のノード数が多すぎると、該当の語彙のベクトルに雑音が混じりやすいのではないか。それゆえ、今回のように語彙数38くらいでは、語彙数と同程度の隠れ層ノード数を設定するのがよさそうです。こんな見解、どんなものでしょうか。

2020年12月8日火曜日

Attentionを用いたニューラル日英翻訳の実験(続)

 【what is this】Attention機能を利用した日英翻訳実験において、コーパスサイズ(入力データ量)を前回の3倍(約1万件→3万件)に増やしたところ、全検査データに対して100%正解翻訳出力するまでのepoch数は1/3(27回→8回)に激減した。

何をしたのか
 前回の実験結果について、かっての同僚の先生から、「入力データを1/3にしたらどうなる?」とのコメントを戴きました。これがヒントになりました。でも、1/3にしてみるのではなく、前回は本来の1/3でやったのだ、と考えました。したがって、1/3にするのではなく、3倍にして観測する方が意味があると考えました。つまり、本来は3倍のデータでやるべきだったと考え直しました。

Attentionの性能をあらためて実感
 詳細は略して結論を述べます。前回の日本語の(したがって英語の方も)語彙を少し増やして、コーパスサイズを10,368件から31,680件に3倍化しました。それぞれで、訓練用に8割、検査用に2割を使って学習させた結果が以下の図です。

 検査データの全てに対して正解英文を出力するまでに、前回27epochs、今回8epochsという著しい収束性能が明らかとなりました。小さなコーパスを何回も辿るよりも、大きなコーパスを使えば少ない走査で済む、という妥当な結果だと考えます。いずれにしても、Attention機能の素晴らしさを再確認できたように感じます。



 今回の収束状況の一例を示します。以下の図は、和文「夏に丸い赤い花がまばらに咲く」に対する翻訳状況です。epoch=1では、1単語が認識されているだけですが、epoch=2では、英単語は間違っていますがすでに英文の文型としてOKとなっています。つづくepoch=5では正解の英訳に達しました。




2020年12月7日月曜日

Attentionを用いたニューラル日英翻訳の実験

【what is this】Deep Learningでの重要度が高まっているAttention機能の仕組みを理解するため、独自作成の和英対訳コーパスを用いて、簡単な翻訳実験を行った。「はやぶさ2」の地球帰還ほどではないにしても、感動的な結果が得られた。極く限られた語彙だけを使う8,000件の日英対訳データの学習後には、例えば「盛夏に大きい赤い花が徐々に咲く」は、「large red flowers bloom gradually in midsummer」と自動翻訳された。

何をしたいのか
 機械翻訳において、Deep LearningでのAttetion機能を理解しようとしていました。なかなか、コードレベルで実験しながら理解できるような情報が見つからなかったのですが、実は、2年前に購入した「ゼロから作る...自然言語処理編」[参考文献1]全412頁の最後の方(P.325〜)に、素晴らしい解説があることに気づきました。これだ!ということです。

日英対訳コーパスを独自に用意する
 しかし、文献1には対訳コーパスを使った例はありませんでした。ならばと、極く簡単なものですが、図1に示すように、「花」に関して、開花時期、大きさ、形、色、密集の度合いなどを組み合わせて(語順も変えて)、約1万件の和英データを自作しました。なお、英訳の方は、図2に示すように、多様な日本語語順に対して、英文では語順は固定的にしてあります。(もちろん、日本語の単語が一つでも違えば、違う英文にしてあります。)


日英対訳コーパスを使った学習の実験
 詳細は省きますが、さっそく、文献1にあったRNN-AttentionのPythonコードを利用させていただき、上記の対訳コーパスで学習させました。図3に示すとおり、最初は検査データに対する正解率が上がりませんでしたが、epoch = 20を越えるあたりから、急速に上昇し、epoch = 27 では、検査データ2,000件(学習用データは8,000件)に対する英訳がすべて正解となりました!これには感動を覚えました。


 一例として、和文「早春に 大きい 白い 花が 密集して 咲く」に対する翻訳状況を図4に示します。例えば、epoch = 5くらいまでは、僅かに、幾つかの単語が英訳されているに過ぎませんが、epoch = 27では、期待どおりの正解「large white flowers bloom densely in early spring」に達しています。



Attention機能のビジュアル化で素晴らしさを実感
 このAttentionの美しさと能力は、以下の図5からも感じとることができます。学習が済んだ状態で、以下の和文を翻訳させた状況です。もちろん、正解が得られています。

 和文:紫の楕円の花が早春に一気に咲く
 正解:oval purple flowers bloom at once in early spring

 ここでは、何ら英語辞書は使っていません。上記のとおり、自前の対訳コーパスだけを使っています。それにも拘わらず、「紫の」「楕円の」「早春に」「一気に」等に対する英単語を自ら発見していることがわかります。驚異的です!



【参考文献】
斉藤康毅:ゼロから作るDeep Learning (2) 自然言語処理編、オライリージャパン、2018年7月

2020年12月2日水曜日

神奈川工科大学で講義:自然言語処理と機械学習(事前編)

 【what is this】情報工学科2年生向けの「入門:自然言語処理と機械学習」の概要です。90分のオンライン講義用です。(事後編はこちら

久しぶりの90分授業
 縁あって今回(2020-12-10)、神奈川工科大学情報工学科2年生向けに、90分のオンライン講義をすることになりました。全部で15回あるオムニバス形式の情報工学特別講義の1回分です。

 内容は、「自然言語処理と機械学習」です。ここ2,3年、興味をもって調べたり、自分で実験してみた事項に基づいています。自然言語処理の基本的な解析から機械翻訳までの重要と思われる技術について述べます。

 本当は学生諸君の顔を見ながらの対面授業でやりたいのですが、このコロナ禍のもとでは致し方ありません。しかし、自宅の机上から講義するのですから、やりやすい面もあります。

講義のタイトル

講義の全体構成と時間配分目安

講義にあたって留意したこと

  1. スライド枚数を適切に抑えて、講義時間を超過しないこと。最終的には、目次なども含めて、全62枚のスライドを準備し、(90分だが)85分で終了することをめざす。
  2. 全体を大きく4分割し、それぞれ20分程度の話として明確に区分すること。またそれら各部の相互関連も示すこと。
  3. できる限り、独自の例題、独自のプログラム、独自撮影の画像、身近な話題などを使って、当方の取り組み姿勢を示す。
  4. インパクトのある素晴らしい、他の人の成果は積極的に引用させていただく。
  5. 技術の詳細の講義ではないが、「ふわー」としたお話しに終わらずに、なるべく一定の深さまで掘り下げ、具体例をあげ、簡単な計算例なども加えること。
  6. 一方、詳細な技術内容には立ち入れないとしても、何か「凄いぞ!」「こんなことも考えられているのか!」と驚きを感じ興味を持ってもらう場面も作ること。

講義予定のスライド一覧
 以下は、4区分したスライドの縮刷版です。実寸スライドは(先生方にはすでにご覧いただいていますが)講義時までに学生諸君へ公開します。

part1 人工言語、自然言語、機械学習、サービス

part2 基本解析、形態素解析、係り受け解析、分類問題、コーパス

part3 単語の意味理解、共起語、単語の実数ベクトル空間への埋込み

part4 機械翻訳(用例的、統計的、ニューラル、Attention)、参考文献

このあとどうする
 この講義は、「入門」としています。このあとはどうするか、少しギャップがあると思いますが、技術的にさらに深めたものを作りたいと思っています。特に、最新の機械翻訳の仕組みを明確に説明できることを目指したい。

【参考文献】
 以下の文献等から、多くのことを学びました。また、それらにある例題や図表の一部を引用させていただきました。感謝致します。
  1. 黒橋禎夫改訂版 自然言語処理、放送大学教育振興会、2020年:基本概念とアルゴリズムを簡潔かつ精緻に叙述した定評の教科書。手計算できる小さな例題で理解を深める。改訂版では、最近の機械翻訳(20ページ)が追加された。(全202頁)
  2. 杉本徹・岩下志乃Javaで学ぶ自然言語処理と機械学習、オーム社、2018年:基本概念と基本技術が、幅広く丁寧に解説されている。明解なJavaプログラムとその解説があり、それを動かしながら理解を深められる。(全262頁)
  3. 斉藤康毅ゼロから作るDeep Learning(2)自然言語処理編、オライリー、2018年:定番の「ゼロから作る…」の第2弾、自然言語処理編。じっくり一歩づつ(Pythonでプログラムしながら)進む。最初の方にDeep Learningの一般的解説もある。(全412頁)
  4. 柴原一友自然言語解析アルゴリズムBERT(前編)、日経ソフトウェア2020年7月:情報検索や機械翻訳で注目されているBERTの考え方のやさしい解説。BERTの中核であるTransformerとAttentionがどんなものかをイメージすることができる。 (全13頁)
  5. 奥野陽他2自然言語処理の基本と技術、翔泳社、2016年:広範な話題を数式を使わずやさしく解説しようとしている。初心者が技術の概観を得るのに適す。機械翻訳の解説もあるが、発行が少し前のためか、ニューラル機械翻訳は含まれない。(全239頁)