人工知能フレームワーク入門(第1回):人工知能とTensorFlow

昨今では「人工知能(AI)」やそれに関連する技術が注目されている。そこで本連載では人工知能に関する技術の概要や、それを利用するためのソフトウェアについて紹介する。

人工知能とは何か

ここ数年、「人工知能」や「AI」という言葉がさまざまな分野で使われるようになった。人工知能関連の技術はここ数年で急速に発展しており、たとえば将棋や囲碁といった分野では、人工知能技術を使ったソフトウェアが人間のプロ棋士に勝利するレベルとなっている。また、iPhoneに搭載されて話題となった「Siri」は人間の言葉を理解してそれに対し適切なアクションを実行することができるが、これにも人工知能技術が使われている。そのほか、文字や画像の認識、文章の分析など、人工知能関連技術を使った多くの製品がすでに市場に投入されている。

しかし人工知能と言われても、それが実際にはどんなものなのか想像できる人は少ないだろう。そこで本記事では、まず人工知能とは何なのかを説明し、続いて人工知能技術の中でも現在広く使われている強化学習やニューラルネット、深層学習などの技術について紹介する。また、人工知能のためのソフトウェアの1つであり、Googleが提供している「TensorFlow」についても紹介する。

「人工知能」の定義

さて、まずは人工知能とは何なのかについて説明していこう。

人工知能というと、SFに登場するような人間のように自律的に考えて行動する機械を思い浮かべる人が多いだろう。もちろん「人間のように自律的に思考するシステム」が人工知能の最終目標の1つではあるが、現在においてはまだそのようなものは実現できていない。人間の思考を司る脳は非常に複雑なシステムであり、未だその全貌は解明されていないのがその理由の1つだ。全貌が分からなければ、それを模したシステムを作ることは難しい。

しかし、今までの研究の結果、人間の思考プロセスやその際の物理的な挙動を完全に模さずとも、その方法や原理を簡易的に再現しただけのシステムでも特定のタスクを実行するには十分に実用的であることが分かってきた。現在では、こういった人間や動物が思考したり、判断を行うプロセスの一部を模して作られたシステムを人工知能と呼んでいる。

最近では「AI」という言葉が一人歩きしている感はあるが、これまでも人工知能の研究によって生まれ、すでに実用化されている技術は少なくない。たとえば一昔前に流行った「ファジィ制御」は、人間の「あいまいな情報から判断を行う」という過程に着目して生まれたものだ。また、迷惑メールフィルタなどで使われている「ベイジアンフィルタ」や、生物の突然変異から着想を得た「遺伝的アルゴリズム」なども人工知能の研究から派生したものである。

こういった人工知能関連の技術の中でも、昨今特に注目されているのが深層学習(ディープラーニング)という技術だ。

深層学習の基礎となる機械学習

深層学習という名称は、「深い層を持つニューラルネットワークを使った機械学習」という仕組みから来ており、「機械学習」や「ニューラルネットワーク」といった技術から発展したものだ。

まず機械学習についてだが、「与えられたデータを解析し、そこからそれらデータの関連性を計算によって推測し、それらを表現するルールを機械的に生成する手法」を機械学習と呼ぶ。ただ、単にデータだけからその関連性を推測するのは困難だ。そのため、事前情報として入力と出力の関係性を表せるような数式を用意し、与えられたデータからこの数式のパラメータを求めるという問題に帰結させるのが一般的だ。このとき、この数式を「モデル」と呼ぶ。

機械学習にはさまざまな手法があるが、代表的なものが「教師あり学習」だ(図1)。

図1 「教師あり学習」による機械学習のイメージ
図1 「教師あり学習」による機械学習のイメージ

教師あり学習では、事前にシステムへの入力とその場合に期待される出力の組からなるデータを用意しておき、そのデータから実際の出力が期待される出力に近づくようモデルのパラメータを調整する。この過程を学習と呼ぶ。

パラメータを調整するための学習アルゴリズムはさまざまなものが提案されているが、実際の出力と期待される出力が近づくよう少しずつパラメータを変更しながら試行錯誤する、というものが多い。そのため、学習には多くの計算量が必要となる。いっぽうで学習が完了してパラメータが確定すれば、入力から出力を求める処理については比較的少ない計算量で行えることが多い。

さて、こういった機械学習においては適切なモデルを用意することが重要となる。そのため、応用分野ごとに特化したさまざまなモデルが考案されている。その1つがニューラルネットワークと呼ばれるものだ。

ニューラルネットワークを使った強化学習

ニューラルネットワークは、人間の脳神経回路を模したものを作れば人間のような知性が得られるのではないか、というアイデアが発端となっている。人間や動物の脳細胞は、多数の細胞体が相互に接続され、それぞれが刺激という形で情報を伝え合うことで記憶を保持したり、情報を処理していることが分かっている。この仕組みを計算機上で簡易的に模したものがニューラルネットワークだ。ニューラルネットワークは、図2のような有向グラフ構造で表現される。

図2 ニューラルネットワークのイメージ
図2 ニューラルネットワークのイメージ

このグラフにおいて、枝(エッジ)は値の伝達を示している。各エッジには重みと呼ばれるパラメータが付与されており、各ノードが出力した値にこの重みを掛け合わせたものが次のノードに入力される。たとえば図2x4というノードには、x1というノードの出力をw1,4倍したものと、x2というノードの出力をw24倍したものが入力される。

グラフの節点(ノード、ニューロンとも呼ばれる)には「活性化関数」と呼ばれる関数fn(x)としきい値bnが設定されており、そのノードへの入力としきい値の和を活性化関数に入力した結果がそのノードの出力となる。たとえば、図2の「x4」というノードの出力は次のように計算できる。

x4 = f4(w14 x1 + w24 x2 + b4)

また、活性化関数はさまざまなものが考案されているが、ニューラルネットワークが考案された当初は入力が0を超えた場合1、入力が0以下の場合0を返す「ステップ関数」が使われていた。このようなノードの動きは、神経細胞に入力された刺激が一定のしきい値(この例では-b4)を超えると、その神経細胞がほかの神経細胞に信号を伝達する、という動きを模している。

なお、この例では入力が2つ、出力が1となっているが、実際には入力および出力の数は任意に設定可能だ。

さて、このような不規則な形状のグラフ構造を持つニューラルネットワークはプログラムとして実装・処理しにくい。そのため、扱いやすい構造にしたニューラルネットワークが考案されている。代表的なものとしては「順伝播型ニューラルネットワーク」と呼ばれる、次のように層状に正規化されたニューラルネットワークがある(図3)。

図3 3層の順伝播型ニューラルネットワーク
図3 3層の順伝播型ニューラルネットワーク

こういった層状のニューラルネットワークでは、入力に繋がる層を入力層、出力に繋がる層を出力層、それ以外の層を中間層と呼ぶ。図3の例は、入力層と1層の中間層、出力層の合計3層からなるニューラルネットワークとなる。こういった準伝播型ニューラルネットワークでは、第n層の出力xn,1xn,2、……、xn,iと第n+1層の出力xn+1,1xn+1,2、……、xn+1,jとの関係を次のような式で表すことができる(図4)。

図4 第n層の出力と第n+1層の出力の関係を示す数式
図4 第n層の出力と第n+1層の出力の関係を示す数式

ここで、xnおよびxn+1は第n層および第n+1層の出力をまとめたベクトル、f()は第n+1層で使われる活性化関数、Wnは第n層から第n+1層への伝播を行う際の重み、bnはしきい値だ(図5)。

図5 使われている行列の定義
図5 使われている行列の定義

なお、以下ではベクトルや行列についてはこのようにボールド体で表記する。

ニューラルネットワークをモデルとして使用する強化学習においては、エッジの重みWnと各ノードのしきい値bnが学習によって調整すべきパラメータとなる。この場合、学習アルゴリズムは与えられた入力から得られた出力と、その入力に対する理想的な出力の差を最小にするような重みとしきい値を求めるような処理を行うことになる。

重みやしきい値を求める手法としてはさまざまなものが提案されているが、3層のニューラルネットワークでは「誤差逆伝播法(バックプロパゲーション)」という手法が一般的に使われている。また、活性化関数についてはステップ関数ではなく「シグモイド関数」や「ReLU(ランプ関数)」などが一般に使われている。

さて、ここでは中間層は1層のみだったが、中間層を2層以上に拡大することも可能だ。そのようなニューラルネットワークを深層ニューラルネットワーク(ディープニューラルネットワーク)と呼ぶ(図6)。この深層ニューラルネットワークをモデルとして使用した機械学習が、深層学習と呼ばれるものだ。

図6 4層のニューラルネットワークの例
図6 4層のニューラルネットワークの例

深層学習は理論としては以前から存在していたものの、重み付けを求めるための適切な手法が見つからないという状況が長らく続いていた。しかし、2000年代になってこの問題を解決する手法が考案されるとともに、CPUの性能向上やGPUを利用した超並列計算によって学習に必要となる大量の演算コストもまかなえるようになり、急速に研究が進んだ。その結果、性能面でも実用的なものとなり、昨今の人工知能ブームに繋がっている。

Googleが開発する強化学習向けライブラリ「TensorFlow」

さて、このような背景から急速に研究開発が進んでいる人工知能関連技術だが、これに関連した興味深い動きとして、人工知能関連技術の開発に力を入れる企業の多くが、その成果物をオープンソースで公開しているという点がある。

たとえばGoogleは2015年に社内で利用している人工知能・機械学習向けライブラリ「TensorFlow」をオープンソースで公開した。Microsoftも2015年に機械学習ツールキット「Distributed Machine Learning Toolkit(DMLT)」を、2016年にディープラーニング向けの「Computational Network Toolkit(CNTK)」をオープンソースで公開している。そのほか、米Facebookや米Yahoo!、露Yandex、米Uberなども人工知能関連の技術をオープンソースで公開している。日本でもPreferred Networksが「Chainer」というフレームワークをオープンソースで公開し、一定の支持を集めている。

オープンな形で人工知能関連の技術を公開する非営利研究機関「OpenAI」も誕生、米Yahoo!やMicrosoft、Amazonなどが活動を支援している。こういった動きの背景には、成果をオープンにすることで研究開発を加速させるとともに、人材を集めやすくするというもくろみがあるようだ。

こういった人工知能向けフレームワークはそれぞれに特徴があり、単純に優劣を付けられるものではないが、今回はGoogleが開発しているということから注目を集めたTensorFlowを紹介する。

TensorFlowの特徴

TensorFlowは2015年11月にGoogleが公開したライブラリで、実際にGoogle社内で使われていたものをオープンソース化したものだ。2017年にはバージョン1.0がリリースされ、APIが「安定」扱いとなった。

TensorFlowは人工知能や強化学習を行うシステムそのものを実装したものではなく、これらの実装に利用できる機能や汎用的なアルゴリズムを提供するライブラリとなっている。そのため、利用には代数学や強化学習、ニューラルネットワークなどの知識が必要となる。その代わり、利用するモデルを簡単に設計できたり、目的に合った学習アルゴリズムを選択できるなど、柔軟性は高い。さまざまな計算アルゴリズムが標準で提供されているため、単なる線形代数ライブラリとして利用することも可能で、強化学習以外の用途でも活用できる。さらにGPUサポートがデフォルトで組み込まれており、容易に演算をGPU上で実行できる。

TensorFlowは公開以降多くのユーザーを獲得し、その結果周辺ツールやライブラリなども多く開発されている。Google自身もTensorFlowと組み合わせて利用できるツールを公開しており、特に有名なものとしては囲碁ソフトウェア「AlphaGo」で知られるDeepMindのニューラルネットフレームワーク「Sonnet」がある。また、TensorFlowで実装したプログラムをモバイル・組み込みデバイスで実行するためのツール「TensorFlow Lite」も提供されている。サードパーティからも、多くのTensorFlow向けツールやライブラリが多数公開されている。

ドキュメントも整備されているほか、書籍など日本語の情報も多い。速度が遅い、内部実装が複雑といったデメリットもあるようだが、少なくとも初学者がまず触ってみる機械学習フレームワークとしては十分実用的だろう。

なお、TensorFlowはC++で実装されたコア部分と、Python/C++/Java/Goから利用するためのフロントエンドから構成されている。ただし、C++/Java/Go向けのフロントエンドのサポートはまだ実験的という扱いとなっている。そのため、現時点ではPythonから利用することをおすすめする。

TensorFlowの動作環境とインストール

TensorFlowは、現時点ではWindows 7以降およびmacOS 10.11(El Capitan)以降、Ubuntu 14.04での動作が公式にテストされている(TensorFlow公式サイトのインストール解説ページ)。また、Pythonのパッケージマネージャ「pip」経由でパッケージを入手できるため、Ubuntu以外の環境でも比較的容易にインストールできる。

ただしPythonにおいては2系と3系という2つのバージョンがあり、一部互換性がないため、どちらのバージョンのPythonを利用するかを事前に検討しておく必要がある。どちらのバージョンでもTensorFlowは利用できるものの、3系の利用が推奨されている状況のようだ。なお、筆者が確認したところ、Python 3系の最新安定版であるPython 3.6系では一部エラーが発生することがあった。そのため、本連載では特に断りの無い限りはPython 3.5系(最新版はバージョン3.5.4)を利用している。

WindowsやMac OS X環境の場合、Pyhonの公式Webサイトでインストーラやバイナリが配布されているので、こちらを利用してPythonをインストールできる。TensorFlowは64ビット環境のみをサポートしているので、64ビット版をインストールしよう。

Red Hat Enterprise 7やその互換環境であるCentOS 7などでは公式パッケージとしてPython 3系が提供されていない。これら環境でPython 3系を利用したい場合、追加パッケージを提供するSoftware Collectionsを利用すると良い。たとえばCentOS 7環境では、次のように「centos-release-scl」パッケージをインストールすることでSoftware Collectionsを利用できるようになる。

# yum install centos-release-scl

Software Collectionsでは、Python 3.5系は「rh-python35」というパッケージで提供されている。これに加えて、Python 3.5向けのpipとvirtualenvパッケージもインストールしておこう。

# yum install rh-python35-python rh-python35-python-pip rh-python35-python-virtualenv

Software Collectionsで提供されるパッケージは旧バージョンとの互換性維持のため、「scl enable」コマンドで新たなシェルを起動してそのシェル上で利用する仕組みになっている。Python 3.5環境は次のようにして起動できる。

$ scl enable rh-python35 bash

なお、bash以外のシェルを利用したい場合は「bash」の部分を置き換えれば良い。このようにして起動したシェル上では、pythonコマンドが指定したバージョン(ここでは3.5系)のものになる。

$ python -V
Python 3.5.1

さて、TensorFlowのインストール自体はpipコマンドで「tensorflow」パッケージ(GPUを利用する場合は「tensorflow-gpu」パッケージ)をインストールするだけで完了するのだが、最近ではプログラム毎の依存関係を明確にするため、virtualenvコマンドを使って仮想Python環境を作成し、そこにパッケージをインストールする手法が広く使われている。この方法では、ルート権限が無いユーザーでもパッケージをインストールできるというメリットもある。

たとえば、「~/tensorflow」ディレクトリ以下に仮想環境を作成する場合、次のようにvirtualenvコマンドを実行する。

$ virtualenv --system-site-packages -p python3 ~/tensorflow

すると、~/tensorflowディレクトリ以下にpythonコマンドやライブラリなどがインストールされる。この状態で、「~/tensorflow/bin/activate」スクリプトを読み込むことで、この仮想環境を利用できるようになる。

$ . ~/tensorflow/bin/activate

仮想環境内では、次のようにプロンプトの前にその仮想環境名が表示され、仮想環境内にいることが分かるようになっている。

(tensorflow)[hylom@localhost ~]$

続いて、最新版のpipコマンドとTensorFlowをインストールしていく。tensorflowの配布パッケージには計算にGPUを利用できる「tensorflow-gpu」と、CPUのみを利用する「tensorflow」パッケージの2種類があるが、GPUを利用する場合には別途NVIDIAのCUDA Toolkitなどが必要となる。そのため、今回はCPUのみを利用する「tensorflow」パッケージを使用する。

$ pip install --upgrade pip
$ pip install --upgrade tensorflow

インストールが完了したらpythonコマンドを実行し、対話的シェル上でtensorflowパッケージが問題なくインポートできるか確認しておこう。

$ python
Python 3.5.1 (default, Oct 21 2016, 21:37:19) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> 

ちなみに、仮想環境から抜けるには「deactivate」コマンドを実行すれば良い。

(tensorflow) [hylom@localhost ~]$ deactivate

次回に続く

以上でTensorFlowを利用するための環境が整った。次回は、行列演算やニューラルネットワークの構築と学習などをTensorFlowで実際に行う例を紹介していこう。