読者です 読者をやめる 読者になる 読者になる

数理的手法を使いやすくするためのソフトウェア開発

科学技術計算とデータサイエンスについて

Docker で TensorFlow を Ubuntu 16.04 にインストール

職場では Anaconda で TensorFlow をインストール^1 したのですが、自宅では Docker でやってみました^2 ^3。やってみるまで、Anaconda, Docker の何が良くて、どのように使い分けるのか良く分かっていませんでした。なので実践から。

自宅PCはグラフィックボード AMD Radeon HD 7770 を積んでいて、SC15でRadeonでCUDAを使えるようにするよと発表^7 ^8があったと聞いているのですが、まずは、GPUなしでと、CPU版をインストールしました。

Dockerの入門的知識は必要

いきなり、Docker をインストールして、TensorFlowコンテナを実行してみると、いろいろとおかしなことが起きました。

やはり、最低限の知識として、Docker のイメージ・コンテナ管理の基本と、イメージのビルド方法くらいは必要です。今思うと、

Docker入門 – コンテナ型の仮想化技術の解説 ^4

の Quick Start -> Try it! と、

「さわって理解するDocker入門」オージス総研 大西 洋平 ^5

の第1回、第2回くらい、あるいは、

@IT > いまさら聞けないDocker入門 ^6

の第1-3回くらいを、読んでから取り掛かったほうが、早く出来たのかもしれません。

Docker をインストール

まず、必要なパッケージをインストールしました。

$ sudo apt-get update
$ sudo apt-get install -y --no-install-recommends \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual
$ sudo apt-get -y --no-install-recommends install curl \
    apt-transport-https \
    ca-certificates \
    software-properties-common

次は、レポジトリをセットアップ。まずはDockerのオフィシャルGPG keyを追加しました。

$ curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -
OK

Key IDの検証。

$ apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D
pub   4096R/2C52609D 2015-07-14
      フィンガー・プリント = 5811 8E89 F3A9 1289 7C07  0ADB F762 2157 2C52 609D
uid                  Docker Release Tool (releasedocker) <docker@docker.com>

安定版のレポジトリをセットアップ。

$ sudo add-apt-repository \
       "deb https://apt.dockerproject.org/repo/ \
       ubuntu-$(lsb_release -cs) \
       main"

これで、Dockerをインストールできるようになりました。あとは、

$ sudo apt-get -y install docker-engine

で docker-engine_17.04.0~ce-0~ubuntu-xenial_amd64.deb が入りました。

しかし、このままでは Docker を実行するためのスーパーユーザー権限が必要なので、、Ask ubuntu: problem with docker

After installing Docker you are prompted to add your user to the docker group. Simply run the command shown:

sudo usermod -aG docker $USER
You will need to close your session and log in again to have the change take effect.

にしたがって、sudo usermod -aG docker $USER を実行して、ログアウトして、ログインしました。すると、

$ docker version
Client:
 Version:      17.04.0-ce
 API version:  1.28
 Go version:   go1.7.5
 Git commit:   4845c56
 Built:        Mon Apr  3 18:07:42 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.04.0-ce
 API version:  1.28 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   4845c56
 Built:        Mon Apr  3 18:07:42 2017
 OS/Arch:      linux/amd64
 Experimental: false

のように問題なく version コマンドを実行できました。

TensorFlowコンテナを生成・実行

CPU安定版のDocker イメージからコンテナを生成させて、実行しました。

$ docker run -it -p 8888:8888 tensorflow/tensorflow
Unable to find image 'tensorflow/tensorflow:latest' locally
latest: Pulling from tensorflow/tensorflow
   ;

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=(毎回、生成されるトークン)

で、最後に表示された「http://localhost:8888/?token=(毎回、生成されるトークン)」にブラウザでアクセスしてみました。

すると、図1のようにJupyter notebook が使えるようになりました。

図1: Jupyter notebook の画面(「TensorFlowが動作するDockerの開発環境を構築する」 ^3からの引用)

ただ、1_hello_tensorflow.ipynb を開いてみると、

Notebook validation failed

An invalid notebook may not function properly. The validation error was:
Notebook validation failed: Additional properties are not allowed (u'metadata' was unexpected):
{
 "output_type": "stream", 
 "text": "result:  [ 3.  3.  3.  3.]\n", 
 "name": "stdout", 
 "metadata": {}
}

というダイアログボックスがポップアップしました。何なのだ?

ともあれ、File -> New Notebook (python 2) で、 サンプルスクリプト

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a+b))

を実行すると、

Hello, TensorFlow!
42

と結果が返ってきました。

ファイル名を sample.ipynb として、 File -> Save and Checkpoint として、ブラウザのタブを閉じて、再び、sample.ipynb を開いてみました。

こんどは、妙なダイアログボックスはポップアップしませんでした。 他のファイル、2_getting_started.ipynb 、 3_mnist_from_scratch.ipynb でも妙なダイアログボックスはポップアップしませんでした。ただ、1_hello_tensorflow.ipynb を開いてみると、今度も妙なダイアログボックスが。

よくわかりませんが、1_hello_tensorflow.ipynb だけのことなので、次に進みます。

Docker コンテナの停止と再スタート

Dockerコンテナを実行したターミナルで、Ctrl+C で、プロセスを止めました。

ps -a コマンドで、コンテナIDを調べて、startコマンドで再スタートさせました。(再スタートのコマンド名は start 、まぎらわしい。。)

$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                     PORTS               NAMES
6a5ed12e18e1        tensorflow/tensorflow   "/run_jupyter.sh -..."   12 minutes ago      Exited (0) 5 minutes ago                       hardcore_goldwasser
$ docker start -i 6a5ed12e18e1

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=(毎回、生成されるトークン)

http://localhost:8888/?token=(毎回、生成されるトークン)」にアクセスしてみると、 sample.py が前に保存にしたとおりの内容で残っていました。

Dockerイメージ作成

このコンテナを再びCtrl+Cで止めて、新しいDocker イメージをtfplussampleという名前で作ってみました。

$ docker commit 6a5ed12e18e1 tfplussample
sha256:07bddf474593056dee6a4162e67b89fde1015841327af8ff8dee565bb8d21fac
$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
tfplussample            latest              07bddf474593        10 seconds ago      1.13GB
tensorflow/tensorflow   latest              04f0b1131389        12 days ago         1.13GB

このDocker イメージからコンテナが生成され、実行できることは、

$ docker run -it -p 8888:8888 tfplussample

で確認しました。ここで、前に作った sample.ipynb を sample.py としてホストマシンにダウンロードしました。

Docker イメージをビルド

次のようなDockerfile

FROM tfplussample
COPY ./sample.py /tmp/sample.py

を作成して、 Dockerイメージをビルドしてみました。一行目は、新イメージのベースとなるコンテナ名、二行は、ホストマシンから新イメージのコンテナへのファイルコピーを指定しています。

-tオプションで、イメージ名 tfplussample2 タグ名 tag1 としました。

$ docker build -t tfplussample2:tag1  .Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM tfplussample
 ---> 07bddf474593
Step 2/2 : COPY ./sample.py /tmp/sample.py
 ---> 9de94c7d2502
Removing intermediate container 21067f8210cb
Successfully built 9de94c7d2502

Docker イメージを実行してみると、

$ docker run --rm -it tfplussample2:tag1 python /tmp/sample.py
Hello, TensorFlow!
42

のように、コンテナ内の/tmp/sample.py が実行されました。

まとめ

たしかに、インストールは簡単でした。TensorFlowに関係するファイルがDockerコンテナのなかにまとめられて、ホストマシンのほかのアプリから切り離されているようです。こうなると、他の機械学習関係のアプリやツールを別のコンテナに隔離することで、ライブラリバージョンの衝突などを回避できます。Pythonのバージョンの違いに悩まなくとも良くなるので、これは便利です。

それと、他人の作ったDockerイメージから、コンテナを簡単に自分のマシンに生成できるので、素早くアプリやツールに特化した実行環境を作れるようになります。これも便利です。一方で、Anaconda でも異なるpythonのバージョンを、別の環境に隔離できるのですが、環境を作るのは手作業なので時間がかかります。

ただ、Dockerの使い方を学ぶのに時間がかかりました。私の場合、半日。


参考

^1:Installing TensorFlow on Ubuntu : Installing with Anaconda

^2:Installing TensorFlow on Ubuntu : Installing with Docker

^3:TensorFlowが動作するDockerの開発環境を構築する

^4:Docker入門 – コンテナ型の仮想化技術の解説

^5:「さわって理解するDocker入門」オージス総研 大西 洋平

^6:@IT > いまさら聞けないDocker入門

^7:AMD Launches ‘Boltzmann Initiative’ to Dramatically Reduce Barriers to GPU Computing on AMD FirePro™ Graphics

^8:CUDAをRadeonで動かす(導入編)

メモ:Ubuntu 16.04 を 休止(ハイバネート)させるために (追記:休止できなくなることも)

Ubuntu 16.04 をインストールしただけでは、休止機能を使えませんでした。しかし、作業の途中で電源を落とすために必要なので、なんとか有効にしました。その方法をメモしておきます。

サスペンドできるようにした

インストール直後は、

$ sudo pm-hibernate

としても何も起こりませんでした。 また、もうひとつのコマンドでは、

$ sudo systemctl hibernate
Failed to hibernate system via logind: Sleep verb not supported

とエラーが出ました。

そこで、Ask ubuntu: How can I hibernate on Ubuntu 16.04? ^1

Secure Boot … It turns out that secure boot was the culprit: installing 16.04 you are asked what you want to do with it (which is a new thing as far as I can recall) and I kept it ON without giving it much thought.

After reboot and disabling secure boot in the BIOS settings (these are machine-specific, but usually pretty straightforward) … And indeed calling systemctl hibernate results in a successful hibernate/thaw sequence.

Moreover, after that I could see hibernation available as an option in various places of the graphical interface, without the need of any polkit hack. So it seems that systemd was actually guessing from /sys/power/disk that the system was not able to hibernate.

にしたがって、BIOSメニューから「安全なブートの構成」を見つけて、

安全なブート : 無効

にしました。すると、たしかに、ファイル/sys/power/disk は、

[disabled]

から、

[platform] shutdown reboot suspend

へと書き換えられました。しかし、私の場合、メニューに現れたのは、「ハイバーネート」ではなく、「サスペンド」でした。

そして、メニューのサスペンドを選ぶと、スクリーンはブラックアウトして、電源LEDの色が変わって、サスペンドしました。

そして、

$ sudo pm-hibernate

で、スクリーンはブラックアウトしましたが、電源はオンのままでした。それで、仕方なく、電源ボタン長押しで、強制的に電源を切らざるをえませんでした。

メニューに「ハイバネート」、しかし、電源はオンのまま

Ask ubuntu: Ubuntu 16.04 doesn’t hibernate ^2

You can also enable the hibernate option in the user menus. To do that, use your favorite text editor to create /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla. Add the following to the file and save:

[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes

そのとおりにやってみると、たしかに、メニューに「ハイバーネート」が現れました。しかし、クリックしても、休止せず、電源はオンのままでした。

休止できるようになった

次は、

Ask ubuntu: Ubuntu 16.04 doesn’t hibernate ^2

Since you’re running Ubuntu 16.04, you should consider running the native systemd suspend/hibernate services in lieu of the pm-utils tools.

In my own case, here’s what I’ve done to configure my machine for hibernate/resume using systemd:

にそって、まず、スワップ領域のUUID を、

tail -n -9 /proc/swaps | cut -d ' ' -f 1 | xargs sudo blkid

のように調べました^3

1) /etc/default/grub の GRUB_CMDLINE_LINUX_DEFAULT の行を、

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nomsi  resume=UUID=(上記で調べたUUID)"

のように書き換えました。

2) sudo update-grub

3) /etc/initramfs-tools/conf.d/resume に UUIDが正しく書き込まれていることを確認しました。

4) sudo update-initramfs -u

5) sudo service systemd-logind restart

6) 再起動。

これで、メニューの「ハイバーネート」で、電源がオフになり、電源をオンにすると、Ubuntu の認証画面が現れ、ログインすると、作業途中のデスクトップに戻れました。

これで、私自身もハイバーネートします。おやすみなさい。

追記

2017/05/05

使っているうちに、休止できなくなることが判明しました。休止できるのは、上記ステップ 2) , 4), 5) を繰り返して、再起動して、しばらくの間だけでした。それ以外のときは、メニューの「ハイバーネート」を選んでも、あるいは、 sudo pm-hibernate としても、画面表示は消えるものの、電源はオフにならず、オンのままでした。

また、sudo pm-hibernate を実行する前に、上記ステップ 2) , 4), 5) をしてみたのですが、それでも、画面表示は消えるものの、電源はオンのままでした。


参考

^1:Ask ubuntu: How can I hibernate on Ubuntu 16.04?

^2:Ask ubuntu: Ubuntu 16.04 doesn’t hibernate

^3:Ask ubuntu: Why isn’t Hibernate in Ubuntu 16.04 working and how to fix it?

Ubuntu 16.04 のインストールディスクは ネットワークアダプター Atheros AR8161 Gigabit Ethernet への対応が不完全だった

先代のメインPC^1機械学習の練習マシンとすべく、日本語版Ubuntu 16.04 をインストールしました。しかし、どういうわけかネットワーク接続が不安定で、数秒間つながって、切れて、また、つながって切れて、を繰り返していました。

しかも、「インストール中にアップデート」を選んだのに、まったくアップデートされていませんでした。

解決策

まず、件のPCでLANアダプタは

$ lspci | egrep '(Ethernet|Network)'
03:00.0 Ethernet controller: Qualcomm Atheros AR8161 Gigabit Ethernet (rev 08)

ということで、ググッてみました。

すると、[ubuntu] Ethernat / Wired connection not working^2

First, open Network Manager and set the MTU for the wired connection to 8192. Reboot and see if it works correctly

というアドバイスが。

再インストールと結果

そこで、Ubuntuインストールディスク起動後に、"Try ubuntu"を選んで、

$ sudo ifconfig eno1 mtu 8192

としてみると^3、安定してネットにつながるように。感動。 あとは、"Install Ubuntu"アイコンをクリック、今度はネットワークにつながるからなのか、前よりも早くインストールできました。

ただ、不思議なのは、そうしてインストールしたUbuntu 16.04 では、mtuの値を大きくしなくとも、安定してネットワークにつながっていることです。

$ sudo ip addr
   ;
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   ;

ネットワーク接続 -> 有線接続1 -> Ethernet で見ても、

MTU 自動

となっています。

なぜなのか。。

まあ、これでネットから機械学習関連ツールをインストールできるようなったので、よしとします。まずは、TensorFlowのMNISTチュートリアルを理解するところからはじめます^4


参考

^1:「メモ:VMwareとVirtualBoxの仮想マシンを引っ越し」で書いたように、年末にブルースクリーンを頻発していた先代のメインPCが、最近はいたって好調なのです。

^2:[ubuntu] Ethernat / Wired connection not working

^3:Ubuntu 12.04:MTU値を変更しNetworkを最適化する

^4:「TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説」中井 悦司 2016/9/27

計算科学からデータ集約型科学へのワークシフト

この半年、機械学習エンジニアとして仕事をしたいと思ったり ^1 ^2 、 データ分析の仕事のほうがまだ適性があるのではと言われて、 そこを目指そうと思ったりしてきました。

ただ、キャリアを変えるのはなかなか難しいです。 社内公募がないと聞いて落胆したり、 自分にはまだデータサイエンス分野で 仕事を得るためにアピールできるものがないと思い知らされたり。

しかし、チャンスもあるようです。 高性能計算(HPC)の分野では、 昔は、計算科学のためのシステムが大きな割合を占めていましたが、 今では、機械学習ディープラーニングのためのシステムが増えてきているからです。 しかも、計算科学のなかでも機械学習の手法が使われることが増えてきています。

そんなわけで、計算科学分野からデータ集約型科学分野へ ^3 ^4 華麗にキャリアチェンジというわけにはいきませんでしたが、 地味にワークシフト ^5 していきたいと思います。


参考

^1:機械学習エンジニアになるために学ぶべき5つのスキル(海外記事紹介)

^2:Coursera機械学習コースは、仕事を得るための準備としてどれほどのものか?

^3:“The Fourth Paradigm: Data-Intensive Scientific Discovery – Book Released”, eSciece@Microsoft .

^4:計算科学からデータ集約型科学へのシフトで、数理的手法が使いやすくなっている

^5:「ワーク・シフト ― 孤独と貧困から自由になる働き方の未来図」リンダ・グラットン (著), 池村 千秋 (翻訳)

テクノロジーを民主化するには、ソフトウェア開発の民主化から

グーグルなどの言う「機械学習民主化^1 ^2 が文字通りの意味ならば、彼らが目指しているのは、 多数の機械学習エンジニアが、多数の人々の利益のために、 という理想だと思います。 これに対して、現実では、 少数のエンジニアリングを理解しない人々が、少数の人々の利益のために、 ということが起こりがちです。 このギャップを解消することは可能なのでしょうか?

テクノロジーを民主化するために

民主化といえば、 リンカーンのゲティスバーク演説 ^3

「人民による、人民のための、人民の統治」

のフレーズが有名です。これにならえば、テクノロジーの民主化とは、

「エンジニアによる、エンジニアのための、エンジニアリング」

ではないでしょうか。

リンカーンのフレーズは、フランス革命やアメリカ建国がされる前には、 統治のありかたが、人民ではない貴族や専制君主によって決定されていた、 という問題があったことを踏まえています。 同様に、テクノロジーの民主化がされる前、現在では、 エンジニアリングのありかたが、エンジニアではなく、 エンジニアリングを理解しない人々によって決められがちであること が問題なのだと思います。

ソフトウェア・エンジニアリングを理解しない人々によるエンジニアリング

例えば、日本の家電メーカーには次のような問題があります。

日本経済新聞「日の丸家電、打倒アップルの条件 ソフト重視へ転換せよ」中島聡^14

魅力的なソフトウエアを作り出すための全体仕様(アーキテクチャー)を設計することは、机上だけでは決して不可能だ。シェフが実際の料理を作りながらレシピを作るのと同様に、設計を担当するエンジニア自らがプログラムを書き「作っては壊し」の過程を経てはじめてよいアーキテクチャーを作ることができる。

アップル・アマゾン・グーグルをはじめソフトで勝負をしている企業は、どこもそうした開発体制をとっている。…

一方、日本のメーカーでは自分自身がプログラムを書いたこともない幹部候補生が頭の中だけでソフトを設計し、プログラミング作業は子会社に丸投げしている。…

ここで問題なのは、プログラミングを理解しない人が、 ソフトウェアの設計をして、プログラミングのありかたを決めていることです。 こうして、生み出されるソフトウェアに競争力がないために ^4 、利益率が低くなり、エンジニアの待遇は悪くなっています ^5

そして似たような問題は、伝統的な計算科学分野にもあります。

というのは、この分野では、ソフトウェア開発のありかたを決めている人々は ハードウェアや計算科学については十分に理解していますが、ソフトウェア開発についての理解は、 フォートラン時代のままで不十分だからです。 それでも、新しい計算科学分野では、さすがにFortranは廃れつつありますが、 伝統的な分野では、昔から残っているレガシーコードに慮って、 今でもFortranのような古い言語が使われることが少なくありません。 そして、フォートラン時代の手法を使ってシミュレーションを開発することになります。 その結果、近代的なプログラミング言語とスタイルで開発している アメリカとの競争において不利になるという問題が生じるのです。

ソフトウェア・エンジニアリングを理解する人々によるエンジニアリング

日本に比べて、 アメリカのソフトウェアが高い競争力を持っているのは、 ソフトウェア開発者を理解している人々がソフトウェア開発のありかたを決めているからです ^4

そこには、プログラミングを理解しない人が、 プログラミングのありかたを決めてしまうという愚行はありません。 また、フォートラン時代のプログラミングしか知らない人が、 開発言語や手法を左右することも少なくなっています。

このようなソフトウェア開発の民主化によって、 機械学習民主化も実現されつつあります。

具体的に言うと、 昔は、機械学習のアプリケーションプログラムを書くときに、 CやC++でゴリゴリと書いていたのが、 まず、C++Pythonで包み込んだライブラリやソフトウェアフレームワークが普及して、 scikit-learn ^6 などで python スクリプトによって楽にアプリを開発できるようになりました。 そのうちに、TensorFlow ^7 , Chainer ^8 のようにニューラルネットワーク記述のための 領域特化言語が埋め込まれたフレームワークが出てきて、更に楽になりました。 そして、今では、クラウド機械学習 ^9 ^10 ^11 が提供されて、 アプリ開発はプラモデル並みの気楽さになりつつあります ^12 ^13

これに対して、日本の計算科学分野では、ソフトウェア開発が民主化されていないので、 FortranやCでゴリゴリと書くしかなく、 そのような前近代的なプログラミングスタイルには、 オブジェクト指向フレームワークや領域特化言語を使うことによる 素早さや楽しさはありません。

このように、ソフトウェア開発のありかたが、 フォートラン時代なのか近代的なのかによって、 生み出されるソフトウェアやテクノロジーの競争力はまるで違ってきます。

数理的手法を民主化する鍵は、ソフトウェア開発の民主化

以上のように見ていくと、アメリカで機械学習や科学シミュレーションといった数理的手法 が民主化されつつあるのは、ソフトウェア開発が民主化されていたからだと思います。 近代的なソフトウェア開発手法や、 ソフトウェア部品を利用するというプログラミングスタイルが広まっていたからこそ、 大勢の人々がテクノロジーのアプリケーション開発に参加することができ、 その利益が大勢の人々に分配されるのです。

対照的に、日本では、数理的手法に基づくテクノロジー分野において、 ソフトウェア開発が民主化されていないために、 ソフトウェアの生産性と競争力は低く、 その利益は小さいままです。

このように、経済的な利益からいえば、 ソフトウェア開発を民主化したほうが、つまりは、 ソフトウェア・エンジニアリングを理解している人がソフトウェア開発のありかたを 決めたほうが、良さそうです。 しかし、日本企業は労働集約型のビジネスモデル ^4 に合わせて組織を固めてしまっているので、 ソフトウェア・エンジニアリングに基づく知識集約型のビジネスモデルに 転換するのは難しそうです。

そんなわけで、テクロジーの民主化についてのギャップは、日本企業では、 なかなか解消されないのではないかと思います。 ただ、個人にはとっては悪いことばかりではないと思います。 仕事のソフトウェア開発には、取り入れられずにいるテクノロジーが、 趣味の開発には、民主化によって、取り入れやすくなっていくのですから。


参考

^1:Quara “Why is it important to democratize machine learning?”

^2:なぜ、機械学習の民主化は重要か?

^3:ゲティスバーク演説 - wiki

^4:gihyo.jp » Software is Beautiful » 第3回 なぜ日本のソフトウェアが世界で通用しないのか

^5:ITエンジニアの地位とは?国別、職種別の年収比較

^6:scikit-learn

^7:TensorFlow

^8:Chainer

^9:Amazon Machine Learning

^10:Machine Learning - Microsoft Azure

^11:Google Cloud Machine Learning at Scale | Google Cloud Platform

^12:Gigazine「Googleが自社で使っている「クラウド機械学習」を一般に開放、こんなスゴイことが簡単にできる」

^13:Cloud Vision APIの凄さを伝えるべくRasPi botとビデオを作った話

^14:日本経済新聞2014/01/15「日の丸家電、打倒アップルの条件 ソフト重視へ転換せよ」中島聡

なぜ、機械学習の民主化は重要か?

この質問に対して、 Googleのデープラーニング研究者(でKeras開発者)であるChollet氏は、 2つの理由を答えています^1

(Quara “Why is it important to democratize machine learning?"への回答の要約)

ひとつは、機械学習からなるべく大きな価値が生み出されるようにするためです。 そのためには、機械学習を研究したり、あるいは、使いこなすだけの意志と知性を もっている人であれば、誰でも、 機械学習の知識やツールにアクセスできるようにする必要があります。

もうひとつは、機械学習によってなるべく大勢の人々が豊かになり、 社会全体が安定するようにするためです。 ただ、近い将来には、これから生み出される仕事や利益は 機械学習サービスを開発している人々(や企業)に集中していきそうです。 ですから、そのような富と力の集中を緩和してバランスをとるために、 機械学習による価値の創造に大勢の人が参加する必要があるのです。

^1:Quara “Why is it important to democratize machine learning?”

機械学習・ディープラーニングのこれからの進展

松尾先生の「人工知能は人間を超えるか」^1を読んで、

  • (1)機械学習・デープラーニングの何がブレークスルーなのか?
  • (2)これから成長するのはどの分野か?

をまとめて、

  • (3)どんな仕事が求められるのか?

を考えてみました。

(1)機械学習によるブレークスルー

これまでの人工知能ブームでは、2つの課題を解決できなかった。

  • 第1次ブーム : 推論、探索

    • 課題1: 迷路などの簡単な問題は解けても、チェス、将棋などでは組み合わせが莫大すぎて、探索しつくすことができないので、解けない。
  • 1回目の冬の時代

    • 現実の問題は、計算機に解かせるには複雑すぎる。
  • 第2次ブーム : エキスパートシステムで計算機に「知識」を入れる。

    • 課題2: 「知識」を書きだそうとすると、どこまで書いても書ききれない。
  • 2回目の冬の時代

    • フレーム問題 : 計算機がタスクを実行しようとすると、計算機は適切な「知識」の範囲を選び出すことができない。「知識」の範囲が狭すぎて失敗するか、あるいは、範囲が広すぎて計算時間が足りなくなる。
    • シンボルグラウンディング問題 : 計算機は「モノ」を抽象化した「記号」は扱うことができる。しかし、「モノ」と「記号」を結びつけることができない。それは「意味」が分かっていないから。

課題1の解決 -- チェス世界チャンピオンとプロ棋士に計算機が勝利

  • 機械学習

    • 論理的推論ではなく統計的推定 : 過去の膨大な棋譜という「ビッグデータ」の活用
    • 良い特徴量の発見 : 将棋の盤面を評価するときには、「2つの駒の関係」だけでなく、「3つの駒の関係」を使う。
  • 弱点

    • 良い特徴量は計算機でなく人間が見つけねばならない。

課題2を解決する目処がつき、機械学習の弱点は克服されつつある

  • 「現実からどの特徴を取り出すか」を人間でなく計算機にさせることができれば、これまでの難問はすべて解決できる。
  • ディープラーニングというブレークスルー : 特徴表現学習
    • 計算機がデータから着目すべき特徴を見つける --> 機械学習の弱点は克服される
    • 計算機が特徴を見つけ出して、その特徴で抽象化されている「モノ」との対応関係を取り出すことができれば、その対応関係が「モノ」の「意味」であり、現実の「モノ」を抽象化された「記号」である特徴と結びつけることができる。 --> シンボルグラウンディング問題の解決
    • 計算機はデータから特徴を取り出すことができるのだから、その特徴がタスクをこなすために必要な範囲の情報となる。 --> フレーム問題の解決

次の課題を解けるか、それとも、3回目の冬の時代か?

  • 課題3 : マルチモーダルな抽象化、時系列データからの文脈抽出
    • 画像・音声・圧力データを連携させることで、計算機に感情を認識させられるか?
    • 生物は視覚・聴覚・触覚を連携させて生きている。
    • 動画をばらばらの画像としてではなく、文脈を持つ時系列として認識させることができるか?
  • 課題4 : 行動と結果の抽象化
    • 機械自身の行為とその結果を、あわせて抽象化できるか?
  • 課題5 : 外界との相互作用の抽象化
  • 課題6 : 言語理解・自動翻訳
  • 課題7 : 知識獲得

(2)成長分野

これまで

  • 課題1の解決
    • チェス、将棋、碁

現在の注目分野

  • 課題2の解決 : データから良い特徴量を自動的に抽出

これからの成長分野

  • 課題3の解決 : マルチモーダルな抽象化
    • 環境認識、行動予測、感情理解
    • 「ペッパー」のようなロボットに接客をさせる。
    • 街中の画像、音声センターからのデータを連携させて、防犯・防災に役立てる。
  • 課題4の解決 : 行動と結果の抽象化
    • 自律的な行動計画
      • 自動運転
      • 物流でお客さんに渡すところまで
      • 農業の自動化

(3)これから求められる仕事

  • 課題3の解決 : 種類の異なるセンサーからのデータ収集と予測モデルの連携
    • IoT組み込みデバイスからのデータ収集と解析
    • 収集したデータによる機械学習、学習させてモデルによる予測、デバイスへのフィードバック
    • データ収集、解析、予測をクラウドで統合

???


参考

^1:「人工知能は人間を超えるか (角川EPUB選書)」松尾 豊 (著)