0t üqe0o0s0a0 ÿ...

18
ご購入はこちら. http://shop.cqpub.co.jp/hanbai/books/MIF/MIFZ201803.htm 見本

Upload: others

Post on 01-Mar-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

ご購入はこちら. http://shop.cqpub.co.jp/hanbai/books/MIF/MIFZ201803.htm 見本

見本

1

第0章 手動で変更する【正解_柱右上】

1

2

3

4

5

6

プログラミングができなくても大丈夫!

自宅で一人で試して合点

はじめに

● 学生・生徒・社会人の皆さん 本書を手に取ってくださり,ありがとうございます.これからどのような仕事に就くにしても,人工知能の「しくみ」や「できること」を知っておくことは,皆さんが仕事を進めるうえで大いなる助けとなるでしょう. 本書は,雑誌やテレビで大きく取り上げられているような人工知能の中身,つまり人工知能の代表格であるディープ・ラーニングを皆さんに体験していただくために執筆させていただきました. 人工知能に興味がある,やってみたいと思っていても,皆さんが一歩を踏み出せない理由は「プログラミングができない,自信がない」ことではないでしょうか.安心してください.本書で紹介しているディープ・ラーニングのアルゴリズムには,全てにサンプル・プログラムが付いていますので,プログラミングができなくても体験できます.

● これだけやっておけば試せます▶ステップ1…特別なコンピュータは不要!普通のWindowsパソコンを用意 職場や学校,家にあるWindows 10(64ビット版)がインストールしてあるパソコンがあれば,ディープ・ラーニングを試せます.もちろん試すアルゴリズムの種類によっては動作に時間がかかりますが,それは筆者のパソコンでも同じです.腕が上がってきたら,高いものを買いましょう.▶ステップ2…Linux環境を構築 ディープ・ラーニングはLinux OSで動くことを前提としています.そこで,皆さんのWindows OSのパソコン上でLinuxが動くように,仮想マシンをWindows上に構築し,そこにLinux OSをインストールします.これは第2部 第3章を見てください.▶ステップ3…ディープ・ラーニングのプログラム環境を構築 第2部 第2章の通りにディープ・ラーニング実行フレームワーク C

チ ェ イ ナ ー

hainerをインストールします(友達や同僚に,実はChainerをインストールしたんだと言うだけで,だいぶ驚くでしょう).▶ステップ4…最初にand.pyを動かしてみる とにかく動かしてみたい人は,第1部と第3部を読み飛ばしても大丈夫です.第4部 第3章のand.pyを動かせるようになると,「ディープ・ラーニングをやってみたことがある」と言えるようになります. 急に細かい話ですみませんが,その手順を紹介しておきます.1.筆者提供のプログラムを入手(本書サポート・ページから)2.デスクトップ上にUbuntuフォルダを作りそこにコピー(andフォルダを置く)3.Windowsパソコン内のLinuxマシン(ここではUbuntu)上のターミナルから,$ cp /media/sf_Ubuntu/and -r ~/$ cd and$ python and.pyを実行します.たったこれだけで,人工知能を動かす第1歩を踏み出せます.

*    * ちょっとずつディープ・ラーニングのプログラムに慣れてきたら,本書を最初から最後まで読んでみてください.そうすると,ディープ・ラーニングでできることがなんとなく分かってくると思います. ディープ・ラーニングはラズベリー・パイのような小型のコンピュータでも動作しますので,ハードウェアとの連携も簡単にできます.ディープ・ラーニング+ラズベリー・パイを使って面白いアプリケーションを開発してみましょう. 2018年2月 牧野 浩二,西崎 博光

$ cp /media/sf_Ubuntu/and -r ~/$ cd and$ python and.py

見本

2

本書の歩き方

本書の歩き方

自宅OK! 全プログラム付きですぐに

ディープ・ラーニングの世界へようこそ第1部

 ディープ・ラーニングはいったい何が凄いのでしょうか.そして読者の皆さんは何ができるようになるのでしょうか.第1部ではディープ・ラーニングで広がる世界を紹介します.併せて知らないと始まらない基本中の基本と言える3大アルゴリズムを紹介します.

得意分野:未来予測や自動作文 得意分野:画像認識得意分野:ノイズ除去や画像生成

3大ディープ・ラーニング・アルゴリズム

ニューラル・ネットワークNeural Network, NN

ディープ・ニューラル・ネットワークDeep Neural Network, DNN(ディープ・ラーニング)

オート・エンコーダAuto Encoder, AE

畳み込みニューラル・ネットワークConvolutional Neural Network, CNN

リカレント・ニューラル・ネットワークRecurrent Neural Network, RNN

ブレーク・スルー

従来の技術

必修の3大アルゴリズム

採点競技への応用…見た目に惑わされることがなくなるかも

ムーンサルト

画像を入力10点10点9点

1枚ずつ評価

連続を評価

広がる世界

自分と趣味や感性が合う人を紹介してくれるかも

人工知能 同士で相談

実世界での友人やパートナへ発展

話し 相手

話し相手

話し相手

見本

3

第0章 手動で変更する【正解_柱右上】

1

2

3

4

5

6

判定はラズベリー・パイ2で行う

判定結果

シャカシャカ

シャカシャカ

きのこの山

USB接続のカメラ

判定結果.きのこの山かたけのこの里かを教えてくれる

判定はラズベリー・パイ2で行う

 ディープ・ラーニングを試しながらマスタするためには,プログラミング環境を整える必要があります.ビギナにはこれが案外難しいものです.そこで,しきいを下げるためにインストール方法や環境設定方法をじっくりと解説します.インストールのための動画も本書サポート・ページに用意しました.

 難しそうなディープ・ラーニング,まずは5,000円コンピュータ・ボード「ラズベリー・パイ」を動かして,画像や音の認識,成長するAI作りを体験してみましょう(持っていない人は第4部以降だけでも充分に楽しめます).

自宅PCで !インストール動画有り

クリック

確認インストール開始

クリック

音でお菓子の種類当て 画像でお菓子の種類当て

話者認識迷路脱出

ラズパイ&PC 試すための準備第2部

持っている人はココから ラズパイで体験第3部

成長するAI.試行を重ねることで壁にぶつかったり突き抜けたりせずにゴールまでたどり着ける

ラズベリー・パイ2で話している人を判定見本

4

本書の歩き方

 ディープ・ラーニングをマスタする際に難関とされるニューラル・ネットワークなるものを,算数で解きほぐします.同時にニューラル・ネットワークの計算および学習を行うためのツール Chainer(無償)の使い方も覚えます.

層を増やす

入力数を変える

出力数を変える

入力を変える

(入力数はそのまま)

OR回路(2入力1出力,1層)

AND回路(3入力1出力,1層)

デコーダ回路(2入力4出力,1層)

ExOR回路(2入力1出力,2層)

3層のニューラル・ネットワーク

10層のニューラル・ネットワーク

AND回路(2入力1出力,1層)

w1

w2

y

b

x1

x2

1

w 111

b11 b 21b12 b 22

w 121 w 221

x1 s1

s2x2

y1

y2

w 112

w 211

w 212

w 122 w 222

11

少しずつ進化していきます

最初はコレ

算数&プログラミング練習 ステップ・バイ・ステップ第4部

1歩ずつ!動かして合点

ディープ・ラーニング・プログラミング・ワールド

見本

5

第0章 手動で変更する【正解_柱右上】

1

2

3

4

5

6

 お待たせしました.いよいよ本腰を入れてディープ・ラーニングのプログラムを作っていきます.ここでは,画像認識,感情認識,為替予測,文章生成,画像生成,音声ノイズ除去を体験できます.

 テレビで取り上げられることの多い対局や自動運転に取り入れられている「ディープQネットワーク」なるアルゴリズムを,プログラムを示しながら,じっくりと解説します.これから活躍する人工知能を作るためには必須の知識です.

クセを真似た文字を生成

成長するAIづくりを対局ゲームを例に

自動生成画像入力画像

0

00 0

0.5 1

(a)元音声.wav

元は無音だった部分にノイズが乗っている ノイズが除去されてほぼ無音になっている

時間[s]

振幅(相対値)

0 0.5 1

時間[s]

0 0.5 1

時間[s]

(b)雑音重畳音声.wav (c)雑音除去音声.wav

1

2

3

1 2 3

1

2

3

1 2 3

1

2

3

1 2 3

1

2

3

1 2 3

1

2

3

1 2 3

1

2

3

1 2 3

画像/データ分析/音声…3大ディープ・ラーニング体験第5部

ノイズ除去

未来コレクル! 自動運転や対戦AIのもと ディープQネットワーク第6部

見本

体験①…音でお菓子認識

エンジン音で車種判定やMyロボの異常検知などに

第1章

60

第3部 持ってる人はココから…ラズパイで体験

まずラズパイで初体験する

● 実験すること 本書では,人気の人工知能「ディープ・ラーニング」を使ったプログラミングができるようになるために,ステップ・バイ・ステップで知識を習得していきます.体験すると,やる気が出やすいと思いますので,まず人工知能をラズベリー・パイ(Raspberry Pi)上で動かしてみます.具体的にはPC上でディープ・ラーニングの学習済みモデル(判定用データ)を作ります.それをラズベリー・パイ上で動かし,リアルタイムに対象物を分類してみます.第3部では以下の実験を行います.・4種類のスナック菓子の音を聞き分ける(写真1,写真2)・きのこの山とたけのこの里をカメラで見分ける(次章)・顔画像から本人/本人でないを見分ける(第3章)・自分で迷路の脱出方法を学習するAIを作る(第4章)・声から話している人を認識する(第5章) いずれもディープ・ラーニングのアルゴリズムを用いているのがミソです.ここでは使い方とリアルタイムに判別するときのポイントを重点的に説明します.

・4種類のスナック菓子の音を聞き分ける(写真1,写真2)・きのこの山とたけのこの里をカメラで見分ける(次章)・顔画像から本人/本人でないを見分ける(第3章)・自分で迷路の脱出方法を学習するAIを作る(第4章)・声から話している人を認識する(第5章)

● 用意するもの▶ハードウェア1,ラズベリー・パイ1/2/3 いずれか1台2,USB接続のマイク3,キーボード4,マウス5,PC(学習済みモデルを利用するなら不要)6,ディスプレイ▶ソフトウェア(筆者提供)1,学習済みモデル(PCで作る人は不要)2,ラズベリー・パイ上で動く判定用プログラム3,お菓子を振ったときの音(1を使う人は不要)4,PC上で動く学習用プログラム(1を使う人は不要)

準備

● ライブラリのインストール PC(Linux OS)およびラズベリー・パイ上にChainerおよび関連ライブラリのインストールを行います.ターミナルから,$ sudo apt-get install python-pip$ sudo pip install --upgrade pip$ sudo apt-get install python-dev$ sudo apt-get install python-matplotlib$ sudo pip install chainer==3.2.0と入力します. ラズベリー・パイでマイクを使うためには,USBマイクをつないでからリスト1のライブラリのインストールが必要となります.

1,ラズベリー・パイ1/2/3 いずれか1台2,USB接続のマイク3,キーボード4,マウス5,PC(学習済みモデルを利用するなら不要)6,ディスプレイ

1,学習済みモデル(PCで作る人は不要)2,ラズベリー・パイ上で動く判定用プログラム3,お菓子を振ったときの音(1を使う人は不要)4,PC上で動く学習用プログラム(1を使う人は不要)

$ sudo apt-get install python-pip$ sudo pip install --upgrade pip$ sudo apt-get install python-dev$ sudo apt-get install python-matplotlib$ sudo pip install chainer==3.2.0

写真1 音のディープ・ラーニングによるお菓子の中身(種類)判定をラズベリー・パイで体験してみる

ラズベリー・パイ2

結果学習データをするときはPCを使う

写真2 ラズベリー・パイでディープ・ラーニングしてお菓子の種類を判定

判定:とんがりコーン

見本

体験②…画像認識1(お菓子の種類)

画像処理を知らなくてもOK! きのことたけのこを判別してみる

第2章

66

第3部 持ってる人はココから…ラズパイで体験

● 実験すること お菓子「きのこの山」と「たけのこの里」をカメラで撮って,見分ける装置を作ります(写真1).一定時間ごとに画面上に写真2の文字が表示されます.

● 用意するもの▶ハードウェア1,ラズベリー・パイ1/2/3 いずれか1台2,USB接続のカメラ 3,キーボード 4,マウス5,PC(学習済みモデルを利用するならなくても可)6,ディスプレイ▶ソフトウェア(筆者提供)1,学習済みモデル(自分で作る人はなくても可)2,ラズベリー・パイ上で動く判定用プログラム3,PC上で動く学習用プログラム(1を使う人は不要)

準備

● 筆者提供のプログラム・サンプルを入手 以下のサンプルを使います.ディレクトリ名:Raspi_kinoko_takenokoプログラム(学習用): train_kinoko_takenoko.

pyプログラム(評価用):eval.py

1,ラズベリー・パイ1/2/3 いずれか1台2,USB接続のカメラ 3,キーボード 4,マウス5,PC(学習済みモデルを利用するならなくても可)6,ディスプレイ

1,学習済みモデル(自分で作る人はなくても可)2,ラズベリー・パイ上で動く判定用プログラム3,PC上で動く学習用プログラム(1を使う人は不要)

ディレクトリ名:Raspi_kinoko_takenokoプログラム(学習用): train_kinoko_takenoko.

pyプログラム(評価用):eval.py

プログラム(画像の前加工):DataArg.py学習済みモデル:kinoko-takenoko.model これは本書のサポート・ページから入手できます.http://interface.cqpub.co.jp/contents/deep.php

● ライブラリのインストール きのこの山とたけのこの里を見分けるプログラムを動かすときには,前章に加えて,以下のコマンドでライブラリをインストールします(PCとラズベリー・パイに).$ sudo apt-get install python-opencv$ sudo pip install 'django<2.0'$ sudo pip install image

ステップ1…画像を集める

 きのこの山とたけのこの里を見分けるためには以下のことを行う必要があります.(1)写真を撮るまたは集める(2)画像を増やす(3)ディープ・ニューラル・ネットワークで学習する(4)学習したモデルを用いて判別する 筆者が提供する学習済みモデルを使用すれば,(4)から始めることも可能です.

プログラム(画像の前加工):DataArg.py学習済みモデル:kinoko-takenoko.model

http://interface.cqpub.co.jp/contents/deep.php

$ sudo apt-get install python-opencv$ sudo pip install 'django<2.0'$ sudo pip install image

(1)写真を撮るまたは集める(2)画像を増やす(3)ディープ・ニューラル・ネットワークで学習する(4)学習したモデルを用いて判別する

写真2 ラズベリー・パイによる画像ディープ・ラーニングでお菓子判定写真1 画像ディープ・ラーニングによるお菓子判定をラズベ

リー・パイで行う

きのこの山

USB接続のカメラ

判定結果.きのこの山かたけのこの里かを教えてくれる

ラズベリー・パイ2

学習データを自作するときはPCを使う

見本

● 実験すること 3大ディープ・ラーニングの1つ,畳み込みニューラル・ネットワーク(CNN)を使って,顔を認識する装置を作ります注1.ここでは図1のように,インターネットからダウンロードした大量の顔画像とユーザ(読者)の顔画像を一緒に学習し,ユーザの顔にだけ反応する装置を作ります.なお,学習はPCで,判定はラズベリー・パイで行います.

● 用意するもの▶ハードウェア1.ラズベリー・パイ1/2/3のいずれか1台2.ディスプレイ 3.USB接続のカメラ4.キーボード 5.マウス6.PC(顔画像の学習用)▶ソフトウェア1.ラズベリー・パイ上で動く判定用プログラム2. ラズベリー・パイ上で動く撮影用プログラム(ラ

1.ラズベリー・パイ1/2/3のいずれか1台2.ディスプレイ 3.USB接続のカメラ4.キーボード 5.マウス6.PC(顔画像の学習用)

1.ラズベリー・パイ上で動く判定用プログラム2. ラズベリー・パイ上で動く撮影用プログラム(ラ

ズベリー・パイに付けたUSBカメラで撮影する場合)

3. ラズベリー・パイ上で動く画像変換プログラム(手持ちのデジカメで画像を撮った場合)

4.PC上で動く学習用プログラム

● プログラムディレクトリ名:Raspi_faceプログラム(学習用):face-recog-train.pyプログラム(判定用):chainer_recog.pyプログラム(撮影用):generate_dataset.pyプログラム(画像変換用):resize_img.py 顔認識プログラムは本書サポート・ページから入手したデータのIF1802DE/Raspi/Raspi_faceフォルダに入っています.このフォルダごと,ラズベリー・パイにコピーして使ってください.http://interface.cqpub.co.jp/contents/deep.php 学習はPC上で行います. 顔の判定は,ここではラズベリー・パイで行います.他にも次のようなOSを搭載したPCで試せます.Linux,Mac,Windowsのコマンド・プロンプト なお,本章に限り「WindowsのVirtualBox+Ubuntu」の組み合わせでは動きません.

● ライブラリのインストール 以下のコマンドを実行して必要なライブラリをインストールします.▶PC(Ubuntuの場合)とラズベリー・パイの両方$ sudo apt-get install python python-pip$ sudo apt-get install build-essential cmake -y$ sudo apt-get update$ sudo reboot(再起動後)$ sudo apt-get install libgtk-3-dev -y$ sudo apt-get install libboost-all-dev -y

ディレクトリ名:Raspi_faceプログラム(学習用):face-recog-train.pyプログラム(判定用):chainer_recog.pyプログラム(撮影用):generate_dataset.pyプログラム(画像変換用):resize_img.py

http://interface.cqpub.co.jp/contents/deep.php

Linux,Mac,Windowsのコマンド・プロンプト

$ sudo apt-get install python python-pip$ sudo apt-get install build-essentialcmake -y$ sudo apt-get update$ sudo reboot(再起動後)$ sudo apt-get install libgtk-3-dev -y$ sudo apt-get install libboost-all-dev -y

体験③…画像認識2(本物/ニセ物)

Myペット判定や果物の出荷検査に

第3章

注1: 畳み込みニューラル・ネットワークのアルゴリズムは第5部で解説します.

図1 製作する装置は本人と別人とを見分けられる

インターネットからダウンロードした顔画像

ユーザ(読者)の顔画像

学習モデル学習

別人をウェブ・カメラで撮影

ユーザをウェブカメラで撮影

PC ラズベリー・パイ

認識結果:ユーザです認識結果:ユーザです

認識結果:別人です認識結果:別人です

いろいろな表情で撮影しておく

いろいろな表情で撮影しておく

ズベリー・パイに付けたUSBカメラで撮影する場合)

3. ラズベリー・パイ上で動く画像変換プログラム(手持ちのデジカメで画像を撮った場合)

4.PC上で動く学習用プログラム

69

第3章 体験③…画像認識2(本物/ニセ物)

インストール

(ビデオ有り)

算数&

プログラム基礎

自動運転や

対戦のもと

ちょっと本格的な実験

画像

文章

データ

音声

ラズパイ体験

音でお菓子

画像2

画像1

お菓子

迷路脱出

話者認識

ようこそ

広がる

世界

ビギナ

OK

3大アルゴ

見本

● 実験すること これから注目のディープ・ラーニング「ディープQネットワーク」を使って迷路をクリアします. 3大ディープ・ラーニングは必ず教師信号が必要ですが,ディープQネットワークは半教師付き学習と呼ばれ,良い行動と悪い行動を教えておくと,良い行動をとるように自動的に進化するものです. そこで,壁にぶつかると「悪い行動」,ゴールすると「良い行動」として教えることとします.アルゴリズムは本書の第6部で詳しく解説します. ここではPC上で迷路を解きます.PCでの学習結果を使って,ラズベリー・パイに取り付けた2つのRCサーボモータを動かし,迷路を脱出します.なお,学習時間をかければ,ラズベリー・パイ上でRCサーボモータを動かしながら,実際の環境を学習することもできます.

● 用意するもの▶ハードウェア1.ラズベリー・パイ1/2/3のいずれか1台2.ディスプレイ3.キーボード

1.ラズベリー・パイ1/2/3のいずれか1台2.ディスプレイ3.キーボード

体験④…迷路脱出第6部で解説する自動運転や対戦AIのもとをまずは

第4章

図1 10×10のマス目に描かれた迷路

(a)2軸カメラ・マウントに取り付けられたサーボモータ (b)仮想迷路脱出中(黒い枠は後から描画)

写真1 ラズベリー・パイからRCサーボモータを動かし迷路を解く

RCサーボモータ1…棒を上下に動かすRCサーボモータ1…棒を上下に動かす

RCサーボモータ2…棒を左右に動かすRCサーボモータ2…棒を左右に動かす

棒の先端棒の先端

4.マウス5.RCサーボモータとマウント,モータ・ドライバ6.PC(学習用)

4.マウス5.RCサーボモータとマウント,モータ・ドライバ6.PC(学習用)

74

第3部 持ってる人はココから…ラズパイで体験

見本

● 実験すること 3大ニューラル・ネットワークの1つ,リカレント・ニューラル・ネットワーク(第1部,第5部で解説)を使って,話している人を声から認識する装置を作ります(写真1).声の質に着目し,どんな言葉であっても,声を発した人(話者)を特定するというものです.本章はすべてラズベリー・パイで行うことを前提にします.

● 用意するもの▶ハードウェア1.ラズベリー・パイ1/2/3のいずれか1台2.ディスプレイ3.USB接続のマイク4.キーボード5.マウス▶ソフトウェア1. ラズベリー・パイ上で動く判定用プログラム2. ラズベリー・パイ上で動く録音用プログラム(ラズベリー・パイに取り付けたUSBマイクで録音する場合)

3. ラズベリー・パイ上で動く音声データ変換プログラム

4. ラズベリー・パイ上で動く学習用プログラム

1.ラズベリー・パイ1/2/3のいずれか1台2.ディスプレイ3.USB接続のマイク4.キーボード5.マウス

1. ラズベリー・パイ上で動く判定用プログラム2. ラズベリー・パイ上で動く録音用プログラム(ラズベリー・パイに取り付けたUSBマイクで録音する場合)

3. ラズベリー・パイ上で動く音声データ変換プログラム

4. ラズベリー・パイ上で動く学習用プログラム

● プログラムディレクトリ名:Raspi_voiceプログラム(学習用):train_speaker.pyプログラム(判定用):test_speaker_SPTK.py プログラムはダウンロードしたデータ中のIF1802DE/Raspi/Raspi_voiceに入っています.このディレクトリごとコピーして使ってください. ラズベリー・パイ中のディレクトリ,プログラムの関係を以下に示します.Raspi_voice train_speaker_SPTK  test_speaker_SPTK.py  dataset tarou.wav  jirou.wav  saburou.wav  shirou.wav  daigorou.wav  hana.wav  mk_feats_SPTK.sh

● ライブラリのインストール まず,以下のコマンドを実行して必要なライブラリとツールをインストールします.$ sudo apt-get install tcsh$ sudo apt-get install python python-pip$ sudo pip install --upgrade pip$ sudo pip install numpy$ sudo pip install chainer==3.2.0$ wget http://downloads.sourceforge.

ディレクトリ名:Raspi_voiceプログラム(学習用):train_speaker.pyプログラム(判定用):test_speaker_SPTK.py

Raspi_voice train_speaker_SPTK  test_speaker_SPTK.py  dataset tarou.wav  jirou.wav  saburou.wav  shirou.wav  daigorou.wav  hana.wav  mk_feats_SPTK.sh

$ sudo apt-get install tcsh$ sudo apt-get install python python-pip$ sudo pip install --upgrade pip$ sudo pip install numpy$ sudo pip install chainer==3.2.0$ wget http://downloads.sourceforge.

体験⑤…話者認識スマート・スピーカや自動操縦に

第5章

USB

マイク

USB

キーボード

USB

マウス

ディスプレイ

ラズベリー・パイ2

学習および判定のためのプログラムを動かす

図1 実験に用いたハードウェア

写真1 話者認識ラズベリー・パイ2

78

第3部 持ってる人はココから…ラズパイで体験

見本

148

データ分析向きRNN②…文章の自動生成

人間のアシスタントとして一大分野に発展するかも

第4章

第5部 画像/データ分析/音声…3大ディープ・ラーニング体感

● 今回やること&課題 ここでは,コンピュータに文章を生成させてみます.今回のサンプルは日本語の作文ができるようになっています. 第1部で示したリカレント・ニューラル・ネットワークの初期型では,過去の情報がどんどん薄まっていきます.それはそれで良いこともありますが,次のような場合はうまく答えることができなくなります.「修学旅行で京都に行ったときに印象に残ったのは,そこに住む人たちの温かさと,歴史ある街並みで,中でも〇〇のすばらしさに圧倒されました.」 これを読むと,○○に入るのは「金閣寺」や「清水寺」と推測できます.しかし,京都という単語が離れすぎているため,初期型のリカレント・ニューラル・ネットワークでは〇〇をうまく答えることができなく

なります.

● 進化したRNN…LSTM そこで,以下の2つを実現できる仕組みが必要です.・重要そうな単語はいつまでも覚えていること・重要でない単語はすぐに忘れること これらを実現するためのリカレント・ニューラル・ネットワークの1種がLSTMです.そして,Chainerではこの2点をブラック・ボックスの処理に入れ込んで使いやすくしています.

実験

● できること…単語を入力するだけで文章を出力 作文とはどのようなものかイメージがわかないかもしれません.そこで,筆者らが事前に学習させておいた「吾輩は猫である」のモデルを使って実行してみます. 実行結果をリスト1に示します.実行すると最初に「単語を入力」と表示されます.そこで,「吾輩」のように単語を入力すると,それで始まる文章が表示されます.なお,<unk>は未知語で,vocabに入っていない単語を指します.出現頻度が極端に少ない単語を

・重要そうな単語はいつまでも覚えていること・重要でない単語はすぐに忘れること

使用プログラム ファイル名学習用 train_lm.py

作文用 make_sentence.py

変換用 seikei.pl

表1 自動作文で使用するプログラム(ディレクトリ名:sakubun_RNN)

リスト1 リカレント・ニューラル・ネットワークによる自動作文…それなりに意味の通る文章になっている?

(b)さまざまな作文結果

単語を入力>>> 我自動作文結果: 我 は 猫 で ある 。単語を入力>>> 猫自動作文結果: 猫 の もの は なかなか ない 。 単語を入力>>> 僕自動作文結果: 僕 は どう し て いる の か 」 単語を入力>>> 机自動作文結果: 机 の 上 に は ある が <unk> この 時 は 吾輩 の ごとく <unk> この 時 に は <unk> その 時 に は <unk> その 時 に は <unk> その 時 に は <unk> その 時 に は <unk> 単語を入力>>> 時計自動作文結果: 時計 は 無論 <unk> 主人 は また 一 人 に なっ た 。 単語を入力>>> 主人自動作文結果: 主人 は また 主人 の 顔 を し て いる 。

(a)自動作文の実行例

$ python make_sentence.py -m model.10 -v vocab

単語を入力>>> 吾輩自動作文結果: 吾輩 は また 主人 の 顔 を 見 て <unk> 主人 は 「 先生 」 と 云う 。

見本

156

音声/画像生成向きAE①…ノイズ・フィルタ

学習データが不要の便利なアルゴリズムを体験

第5章

第5部 画像/データ分析/音声…3大ディープ・ラーニング体感

 オート・エンコーダ(AE)は,入力と出力が同じになるように特徴を自動的に学習します.通常,ディープ・ラーニングでは,教師データという入力に対する答えのデータが必要となります.この教師データを作るということは結構手間のかかることで,人手が必要でした.オート・エンコーダは教師データを作る必要がありません.教師データ作りという「人の手がかかる工程」がなくても学習できるようになり,学習量が飛躍的に増大しました. 応用例として,ノイズのある画像や音声からノイズ

のない画像や音声への復元があります. ここでは音声ノイズを除去するディノイジング・オート・エンコーダ(Denoising AutoEncoder)を紹介します.これはDAEと略されることが多い手法です.

実験

● できること…意図的に加えたノイズを除去する この特集で使うノイズ除去用プログラムは,学習時間を短くしているため,どのようなノイズでも除去できるわけではありません.できることは,意図的に加えたノイズをきれいな音声に戻すというものになります. この様子を波形にしたのが図1です.ノイズが乗った音声からノイズが除去されて,元の音声の形状に近くなっています.

● 準備 実験には,表1のプログラムとデータを使います.これらは本書サポート・ページからダウンロードできます.http://interface.cqpub.co.jp/contents/deep.php 雑音除去音声.wavを聞いてみると,ロボットみたいな無機質な声になっていますが,確かに「さー」っ

http://interface.cqpub.co.jp/contents/deep.php

0

00 0

0.5 1

(a)元音声.wav

元は無音だった部分にノイズが乗っている ノイズが除去されてほぼ無音になっている

時間[s]

振幅(相対値)

0 0.5 1

時間[s]

0 0.5 1

時間[s]

(b)雑音重畳音声.wav (c)雑音除去音声.wav

図1 意図的に載せたノイズを除去する

表1 ノイズ除去で使用するプログラムとサンプル・データ(ディレクトリ名:DAE)

使用プログラム ファイル名学習用 train_dae.py

変換用 wav2noisedata.py

雑音除去テスト用 denoise.py

アップデータ dae_updater.py

(a)プログラム

内 容 ファイル名元の音声 元音声.wav

ノイズがのった音声 雑音重畳音声.wav

ノイズを除去した音声 雑音除去音声.wav

(b)サンプル音声 見本

ディープQネットワーク総仕上げ…成長して強くなるAIづくり

ついに人間と対決!

第5章

 2つのエージェントが競い合いながら,だんだん強くなっていくAIを作ります.具体的には三目並べをディープQネットワークで学習させます.その学習結果を用いて人間と対戦できるものを作ります.

制作する対戦AIのあらまし

 その前に,人間との対戦はどのようなものかを体験してもらいましょう.準備として本書のサポート・ページから,ダウンロード・データを入手します.http://interface.cqpub.co.jp/contents/deep.php 入手したデータIF1802DE/Q_Learningの中にあるDQN_sanmokuフォルダを,Windowsデスクトップ上のUbuntuフォルダにコピーしておきます.その後,Linuxのターミナルから以下のコマンドを実行します.$ cp /media/sf_Ubuntu/DQN_sanmoku -r ~/$ cd DQN_sanmoku$ python play_sanmokunarabe.py すると,図1のように表示され,入力をするたびに盤面が進んでいきます.

AI同士が成長するプログラム

● 処理の流れ いきなり人工知能との対戦を体験してもらいましたが,これには人工知能が対戦のルールを覚えて強くなっておく必要があります.そのプログラムを作ります. まず,プログラム(train_sanmokunarabe.py)をリスト1に示します.フローチャートは図2のようになっています.1.盤面の設定2. Q値の計算の設定(ディープ・ラーニングによる学習)

3. エージェントがどこにどのように碁石を置くか

http://interface.cqpub.co.jp/contents/deep.php

$ cp /media/sf_Ubuntu/DQN_sanmoku-r ~/$ cd DQN_sanmoku$ python play_sanmokunarabe.py

1.盤面の設定2. Q値の計算の設定(ディープ・ラーニングによる学習)

3. エージェントがどこにどのように碁石を置くか図1 3目並べで自分が作ったAIと対戦できるようになる

あなたの勝ち!

1

2

3

1 2 3

(a)先攻(黒石, 1) or 後攻(白石, 2)を選択:1 難易度(弱 1-5 強):1 あなたは「●」(先攻)です.ゲームスタート!

1

2

3

1 2 3

(b)どこに石を置きますか? (横 縦で指定.例 "1 2"):1 2

1

2

3

1 2 3

(c)エージェントの番  5

1

2

3

1 2 3

(d)どこに石を置きますか? (横 縦で指定.例 "1 2"):2 2

1

2

3

1 2 3

(e)エージェントの番  2

1

2

3

1 2 3

(f)どこに石を置きますか? (横 縦で指定.例 "1 2"):3 2

198

第6部 未来コレクル! 自動運転や対戦AIのもと ディープQネットワーク

見本

を決めています.入力の数は碁盤の盤面の数(3×3)の9として設定されています.出力の数も入力と同じ9として設定されます.

● 3.エージェントの動作の設定 迷路探索と構造は似ています.▶初期化:__init__関数 まず最初に実行されるのが41行目の__init__の関数です.ここではreset関数が呼ばれています.これは迷路探索のときと同じです.▶リセット:board_reset関数 45行目に書かれています.これも迷路探索のときと似ています.まず,2次元で設定された碁盤を1次元に直しています.これによって碁盤の位置を0~ 8の番号で図3のように表すことができます. 47行目のwinnerは勝者を表す変数で,最初はNONEにしてあり,勝者が決まるとBLACK/WHITEのどちらかが入ります. 48行目のturnは次に碁石を打つエージェントを示しています.最初のターンは黒から始まるようにBLACKが設定されています. 49行目のgame_endはゲームの終了条件に達したらTrueになる変数を設定しています.これは迷路探索のdoneと同じ意味となります. 50行目のmiss_endはエージェントが既に碁石のある位置に碁石を打とうとした場合Trueになります.▶白黒のターン・チェンジ:change_turn関数 turnの白と黒を反対に変えることで,打ち手を変更しています.▶エージェントの動作:agent_action関数 迷路探索のときと似ています.エージェントの次に碁石を打つ位置はposという引き数によって決まります.このposという行動を決める数は,この後で説明するディープQネットワークによって得られます.ここでは,posが与えられたという前提で説明を行います.posは0~ 8のいずれかの数で,碁盤のマスの番号に対応しています. 58行目のif文でその位置に碁石がないかどうかを調べ,碁石がなければ,その位置にそのターンの色の

を決定4.ChainerRLによるディープQネットワークの設定5.エージェントの行動と報酬6. 結果の表示(100回ごとに100回の結果をまとめて表示,10,000回ごとにエピソードの保存)

 この動作をプログラムで組んでいくわけです.このフローチャートは迷路のフローチャートとほぼ一緒です.違うのは1番目の「迷路の設定」が「盤面の設定」になった点,3番目の「どのように行動するか」が「どこに碁石を置くか」に変わっただけです. 基本さえ押さえてしまえば,いろいろな問題に応用できそうです.だからといって,基本だけ知っていても応用例がないとなかなか改造するのは難しいですね. 三目並べで違う問題への応用の仕方を身に付けると,より効果的にディープQネットワークが使えると思います.

● 1.盤面の設定 17行目で盤面が3×3であることを設定します. 18 ~ 20行目では,NONE,BLACK,WHITEの3つの定数をそれぞれ0,1,2として設定しています. 21行目で碁石の表示をどのようにするかを設定しています.

● 2.Q値の計算の設定 これはディープQネットワークの迷路探索と全く同じで,4層のネットワークから成り立っています.このプログラムでは140 ~ 142行目で入力と出力の数

を決定4.ChainerRLによるディープQネットワークの設定5.エージェントの行動と報酬6. 結果の表示(100回ごとに100回の結果をまとめて表示,10,000回ごとにエピソードの保存)

図2 AI同士が成長するプログラム train_sanmokunarebe.pyのフローチャート

yes

no

終了終了設定回数だけ学習したか?

Q値の計算の設定ディープ・ラーニングによる学習

Q値の計算の設定ディープ・ラーニングによる学習

ChainerRLによるディープQネットワークの更新

ChainerRLによるディープQネットワークの更新

盤面の設定盤面の設定

碁石を置く位置の決定碁石を置く位置の決定

エージェントの行動と報酬の取得エージェントの行動と報酬の取得

結果の表示結果の表示

図3 三目並べの碁盤の番号

43 5

76 8

10 2

199

第5章 ディープQネットワーク総仕上げ…成長して強くなるAIづくり

インストール

(ビデオ有り)

算数&

プログラム基礎

自動運転や

対戦のもと

ちょっと本格的な実験

画像

文章

データ

音声

ラズパイ体験

音でお菓子

画像2

画像1

お菓子

迷路脱出

話者認識

ようこそ

広がる

世界

ビギナ

OK

3大アルゴ

見本

リスト1 対戦することでAI同士が成長するプログラム train_sanmokunarabe.py

001 # -*- coding: utf-8 -*-002 """003 三目並べ強化学習004 005 メモ:006 黒石(先行)と白石(後攻)で別々のエージェントを学習させる.007 """008 from __future__ import print_function009 import chainer010 import chainer.functions as F011 import chainer.links as L012 import chainerrl013 import numpy as np014 import sys015 016 # 定数の定義017 BOARD_SIZE = 3 # 盤面サイズ 3x3018 NONE = 0 # 盤面にある石 なし019 BLACK = 1 # 盤面にある石 黒020 WHITE = 2 # 盤面にある石 白021 STONE = [' ', '●', '○'] # 石の表示用022 023 # Q-関数の定義024 class QFunction(chainer.Chain):025 def __init__(self, obs_size, n_actions, n_hidden_channels=128):026 super(QFunction, self).__init__(027 l0=L.Linear(obs_size, n_hidden_channels),028 l1=L.Linear(n_hidden_channels, n_hidden_channels),029 l2=L.Linear(n_hidden_channels, n_hidden_channels),030 l3=L.Linear(n_hidden_channels, n_actions))031 032 def __call__(self, x, test=False): 033 h = F.leaky_relu(self.l0(x))034 h = F.leaky_relu(self.l1(h))035 h = F.leaky_relu(self.l2(h))036 return chainerrl.action_value. DiscreteActionValue(self.l3(h))037 038 # 碁盤クラス039 class GoBoard():040 # インスタンス041 def __init__(self):042 self.board_reset()043 044 # 盤面のリセット045 def board_reset(self):046 self.board = np.array([NONE] * (BOARD_SIZE * BOARD_SIZE), dtype=np.float32) # 碁盤は1次元配列で定義 (1x9) 047 self.winner = NONE # 勝者048 self.turn = BLACK # 最初は黒のターン049 self.game_end = False # ゲーム終了チェックフラグ050 self.miss_end = False # エージェントのミス打ち判定フラグ 051 052 # 白黒のターンチェンジ053 def change_turn(self):054 self.turn = WHITE if self.turn == BLACK else BLACK055 056 # エージェントのアクションと勝敗判定.置けない場所に置いたら負け.057 def agent_action(self, pos):058 if self.board[pos] == NONE:059 self.board[pos] = self.turn060 self.end_check()061 else: 062 self.winner = WHITE if self.turn == BLACK else BLACK

063 self.miss_end = True064 self.game_end = True065 066 # ゲームの終了チェック067 def end_check(self):068 for i in range(0, BOARD_SIZE * BOARD_SIZE):069 self.winner = self.conjunction_check(i) 070 if self.winner != NONE:071 self.game_end = True # 3連ができたらゲーム終了072 break073 if np.count_nonzero(self.board) == BOARD_SIZE * BOARD_SIZE: # 碁盤がすべて埋まった場合ゲーム終了074 self.game_end = True075 076 # 座標(line, row)から3連接のチェック077 def conjunction_check(self, pos):078 # 石の有無チェック079 if self.board[pos] == NONE:080 return NONE # 石がなければNONEを返す081 # 縦方向のチェック082 if pos + (BOARD_SIZE * 2) < BOARD_SIZE * BOARD_SIZE:083 if self.board[pos] == self.board[pos+BOARD_ SIZE] == self.board[pos+(BOARD_SIZE*2)]:084 return self.board[pos] # 縦3連が存在085 # 斜め(右下)方向のチェック086 if pos + ((BOARD_SIZE + 1) * 2) < BOARD_SIZE * BOARD_SIZE:087 if self.board[pos] == self.board[pos+BOARD_ SIZE+1] == self.board[pos+((BOARD_SIZE+1)*2)]:088 return self.board[pos] # 右下斜め3連が存在089 # 斜め(左下)方向のチェック090 if pos + ((BOARD_SIZE - 1) * 2) < BOARD_SIZE * BOARD_SIZE:091 if ((pos + (BOARD_SIZE - 1) * 2) // BOARD_SIZE) - (pos // BOARD_SIZE) >= 2:092 if self.board[pos] == self.board [pos+BOARD_SIZE-1] == self.board [pos+((BOARD_SIZE-1)*2)]:093 return self.board[pos] # 左下斜め3連が存在094 # 横方向チェック095 if pos // BOARD_SIZE == (pos + 2) // BOARD_SIZE: # 先頭と末尾が同じ行かどうか096 if self.board[pos] == self.board[pos+1] == self.board[pos+2]:097 return self.board[pos] # 横3連が存在098 return 0 # 3連は存在せずの場合は-1を返す 099 100 # ランダム101 def random_action(self): 102 return self.find_empty_positions()103 104 # 空いているマスを見つけて,座標をランダムに1つ選択する105 def find_empty_positions(self):106 pos = np.where(self.board == 0)[0] 107 if len(pos) > 0:108 return np.random.choice(pos) # 空いている場所の座標の1つをランダム返す109 else:110 return 0 # 空きなし 111 112 # 盤面を表示する113 def show_board(self):114 print(' ', end='') 115 for l in range(1, BOARD_SIZE + 1):116 print(' {}'.format(l), end='')117 print('')118 row = 1119 print('{0:2d} '.format(row), end='')120 row += 1

001002003004005006007008 009 010 011 012 013 014 015016017 018 019 020 021 022023024 025 026 027 028 029 030 031032 033 034 035 036 037038039 040 041 042 043044 045 046

047 048 049 050

051052 053 054 055056 057 058 059 060 061 062

063 064 065 066 067 068 069 070 071 072 073

074 075076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099100 101 102 103104 105 106 107 108

109 110 111112 113 114 115 116 117 118 119 120

碁石を打ちます. 60行目でend_check関数を呼び出して,3連ができたかまたは全ての盤面が埋まったかをチェックします.

 61行のelse文は既に碁石のあるところに碁石を打った場合に実行されます.このときは勝者をそのターンとは逆の色とするように62行目で設定してい

200

第6部 未来コレクル! 自動運転や対戦AIのもと ディープQネットワーク

見本

見本