ゼロからの最速スタート シリーズ
TensorFlow入門(1)

TensorFlow入門(1)

TensorFlowとは? 入門連載始動! データフローグラフ、事例、学び方

2018年4月18日

TensorFlowの概要と適用範囲を説明。最重要な基本概念であるデータフローグラフについて解説する。また、深層学習との関係や、事例、学び方についても紹介する。

安部晃生 DATUM STUDIO 安部 晃生

TensorFlowとは?

TensorFlowの適用範囲

 TensorFlowは、グーグルが2015年に公開した機械学習用のオープンソースライブラリだ。

 「すでに名前を耳にしたことがある」という読者も多いことだろう。そんな人にとってTensorFlowは、深層学習ディープラーニングとも呼ばれる)用のフレームワークという印象が強いのではないだろうか。確かにTensorFlowの起源はニューラルネットワーク研究にあるが、TensorFlowの公式サイトには以下のように書かれており、深層学習のみではなく、より広い範囲で利用できるように設計されている。

TensorFlow is an open source software library for numerical computation using data flow graphs. ……中略…… TensorFlow was originally developed ……中略…… for the purposes of conducting machine learning and deep neural networks research, but the system is general enough to be applicable in a wide variety of other domains as well.

【訳】TensorFlowはデータフローグラフを利用した数値計算のためのオープンソース・ソフトウェア・ライブラリです。TensorFlowはもともと機械学習や深層ニューラルネットワークの研究を行う目的で開発されましたが、このシステムはとても汎用性が高く、それ以外のさまざまな領域にも適用できます。

 本稿では詳細について取り扱わないが、TensorFlowの適用範囲の広さを示す例として、Edwardというライブラリを紹介しておこう。EdwardはTensorFlowの計算機構を、ベイズ推論の枠組みに応用したもので、確率的プログラミングProbabilistic Programming*1を実現できる。

  • *1 確率的プログラミングとは、確率的潜在変数を使うことで問題をより柔軟にモデル化する手法のことで、近年の機械学習コミュニティにおいて研究対象として注目されている。

データフローグラフ

 上記で引用したTensorFlowの概要説明にある通り、TensorFlowはデータ・フロー・グラフdata flow graphs)を利用して数値計算処理を実施する。データフローグラフとは、読んだそのままの通り、データの流れを示したグラフのことであるが、若干の補足をしておく。

グラフ

 まずグラフについてだが、これは棒グラフや円グラフといった、数量を視覚的に表現するための図のことではない。データフローグラフにおけるグラフとは、ノード(頂点)とノードの間の連結を示すエッジ(枝)から成るデータ構造のことである。エッジに方向性があるグラフを特に有向グラフdirected graph)と呼ぶ。

 図1に例を示そう。ここにはABCDの4つのノード(丸)と4つのエッジ(矢印)がある。ABCの3つのノードは互いにエッジによって連結されているが、ノードDはノードCとのみ連結している。また、エッジには方向性がある。こういったグラフが「有向グラフ」である。

図1 4つのノードと4つのエッジからなる有向グラフ

 データフローグラフにおいて、ノードは主に計算処理を表し、エッジはその計算処理で利用されるデータを含む処理の流れを表す。

 例えば図2のデータフローグラフにおいて、\(x\)\(y\)\(z\)\(w\)というノードは「おのおのの値を定義する」という処理を表し、\(+\)\(*\)は「おのおのの演算処理」を表す。また、グラフのエッジは処理の方向を示す。つまり、この有向グラフは、\(x\)\(y\)\(z\)\(w\)という値の定義と、それらの値を用いての\((x+y)*(z+w)\)という計算処理を表現しているというわけだ。

図2 4つの定義と3つの演算からなるデータフローグラフ
データ

 TensorFlowはデータフローグラフを利用した数値計算ライブラリであることは前述の通りであるが、データといっても任意のデータを指すわけではない。TensorFlowにおけるデータとは、その名前が示すようにテンソルtensor)のことを指す。テンソルとはもともとは数学用語で、きちんとした定義も当然あるのだが、本稿では数学的な説明は行わない。

 テンソルは、エンジニアにとってはなじみ深いであろう、多次元配列とよく似ている。多次元配列は複数の要素(通常は数値)を直列状、あるいは行列状、さらにその多次元拡張に並べたものであるが、テンソルも同じである。多次元配列では次元dimension)と呼ぶが、テンソルではrank)という用語を使う。テンソルに対して、単一の(配列ではない)いわゆる数値のことはスカラーscalar)という。

 図2で説明すると、\(x\)\(y\)\(z\)\(w\)はテンソルである。テンソル同士を足し合わせたり掛け合わせたりしたもの(\(+\)\(*\)のノードで得られる)についてもまたテンソルとなる。多次元配列同士の足し算や掛け算といった演算がどのように定義されるかは容易に決められることではないが、これらがテンソルの世界では定義されていると考えればよい。実際、TensorFlowにはテンソル同士の足し算や掛け算といった演算が関数として用意されている。

データフローグラフのメリット

 TensorFlowがデータフローグラフをベースとしているのには、いくつか理由がある。データフローグラフを定義することで、次のようなメリットがある。

  • 並列性 データフローグラフを調べることで、並列に計算できる処理を見つけることができる。例えば、図2のグラフでは2つの足し算(\(+\)ノード)を含むが、これらの演算は独立しているので、並列計算できる。
  • 分散実行 TensorFlowではデータフローグラフの演算を、複数のデバイスに分散させて実行できる。分散処理の際に必要な通信や整合処理をデータフローグラフに挿入できる。
  • コンパイル データフローグラフの構造から、グラフの編集により最適化を行うことができる。例えば連続する処理を1つの演算としてまとめて実行可能であれば、それにより高速化を期待できる。
  • 移植性 データフローグラフは言語に依存しない構造であるため、ある言語で構築したモデルを、別の言語で復元できる。現在はPythonが主要言語として利用されているが、Java、Go、Cといった言語からの利用を想定したAPIの開発も行われている。2018年3月末に、TensorFlow.jsというWebブラウザー上で動作するJavaScriptライブラリもリリースされた。

TensorFlowと深層学習

TensorFlowとニューラルネットワーク

 ニューラルネットワークを簡単に概観しておこう。ニューラルネットワークはもともと神経細胞(ニューロン)における情報伝達の仕組みを数理化したモデルで、以下のように表される人工ニューロンを組み合わせることでネットワークを構築したものである。

\[y = \varphi \left( \sum_{i=1}^{m} w_{i}x_{i} + b \right) = \varphi \left( W \cdot x \right)\]

 ここで\(y\)は出力、 \(\varphi\)は活性化関数(activation function)、 \(w_{i}\)は重み(weights)、 \(x_{i}\)は入力、\(b\)はバイアス項(bias term)であり、 \(W=(b, w_{1}, \cdots, w_{m})^{\top}\)、 \(x=(1, x_{1}, \cdots, x_{m})^{\top}\)とした。また、演算 \(\cdot\)はドット積(要素同士の積の和)を表す。この人工ニューロンをデータフローグラフで表現すると、以下のようになる。

図3 人工ニューロン

入出力を白丸、パラメーターおよび演算を黒丸で表している。

 図3を単純化して表現すると、図4のようになる。

図4 単純化した人工ニューロン

図3と同様に入出力を白丸、パラメーターおよび演算を黒丸で表している。

 図4をさらに単純化して、演算部分の黒丸を黒四角として、複数の入出力をつなげてネットワーク状にしたものがニューラルネットワークNeural Network)である(図5)。

図5 ニューラルネットワーク

黒四角は人工ニューロンにおける演算を表す。

 そのニューラルネットワークの層を重ねて層を深くすることで構築したニューラルネットワークがディープニューラルネットワークDeep Neural Network)である(図6)。

図6 ディープニューラルネットワーク

黒四角は人工ニューロンにおける演算を表す。人工ニューロンの出力を次の層の入力として用いることで、ニューラルネットワークを多層化している。

 入力層input layer)と出力層output layer)の間にある中間層Intermediate layer)は、ユーザーからはその入出力状態が見えないため、隠れ層と呼ぶ。通常、ニューラルネットワークがディープであるとは、隠れ層が2層以上ある状態を指す。なお、図6のように、前の層のすべての出力が、次の層のすべての人工ニューロンの入力に利用されている状態を全結合fully connected)という。

 人工ニューロンは単純なデータフローグラフであり、(ディープ)ニューラルネットワークは人工ニューロンを組み合わせたものであるから、ニューラルネットワークは結局、データフローグラフで表現される単純な演算処理であり、TensorFlowの得意とする演算処理であることが分かる。

機械学習とニューラルネットワーク

 深層学習とは、主にディープニューラルネットワークを用いた機械学習の枠組みである。

 機械学習は、人間が行っている学習の仕組みをコンピュータープログラムに落とし込んだものだ。その手法はさまざまあり、ディープラーニングはその一分野にすぎない。過去のデータを基に学習を行い、新しいデータに対して予測を行ったり、新しい何かを生成したり、あるいは与えられたデータそのものから何らかの示唆を得られたりするような、モデルmodel)を作成する。

 モデルとは、データを入力して何らかの出力を行う数学的な関数のようなものだと思ってもらえばよい。深層学習においては、ニューラルネットワークにおける各人工ニューロンのパラメーター(\(W\))を設定することで、入力に対してディープニューラルネットワークの演算処理を行い、出力を得ることができるようになる。このときのパラメーターが定められたニューラルネットワークのことを「モデル」と呼び、パラメーターを求めることを「学習」と呼ぶ。

 入力に対する出力の精度を高めるためには、適切にパラメーターを設定する必要がある。「精度が高い」という定義はさまざま考えられるが、通常は損失関数loss function)と呼ばれる関数で評価する。詳細は本稿では割愛するが、適切なネットワークと損失関数の定義を行うことで、ディープニューラルネットワークのパラメーターの最適化を実行できる。最適化を行う手法もさまざまあるが、よく知られた最適化手法optimizer)や損失関数については、あらかじめTensorFlowに定義されているため、特別な理由がなければライブラリ中から選択すればよい。具体例は本連載の第5回と第7回を参考にしてほしい。

なぜTensorFlowで深層学習を行うのか?

 TensorFlowは、データフローグラフによりディープニューラルネットワークを構築できる。データフローグラフによって構築されたディープニューラルネットワークのパラメーターは、TensorFlowによって定義された手法により、最適化できる。つまり、TensorFlowは汎用化された数値計算ライブラリではあるものの、TensorFlowは深層学習を行うために十分使いやすい手法を実装しており、深層学習の利用に適したライブラリであるといえる(最初に引用したように、もともとニューラルネットワークの研究のために作られたものなので当然なのだが)。

TensorFlowの事例

機械学習を用いたシステムの特徴

 ビッグデータブーム、人工知能ブームの流れから、機械学習を現実のプロダクトに投入しよう(すなわち人工知能を構築しよう)という流れが加速している。ここで簡単に、機械学習を取り入れない従来のシステムと機械学習を取り入れたシステムとの違いについて説明しておこう。

 従来のシステムと機械学習を取り入れたシステムの違いを簡単に言ってしまえば、「従来のシステムでは入力に対する出力の正当性が保証できるが、機械学習を取り入れたシステムでは入力に対する出力の正当性は保証できない」ということだ。例として架空の人事システムを考えてみよう。

 このシステムで給与が500万円以上の社員すべてを抽出せよという操作を行えば、その通り給与が500万円以上の社員一覧を得ることができる。ところが、今年度末に行われる人事査定で給与が500万円以上となる社員をすべて予測せよという操作は、問い合わせ時のデータベースにはその情報が含まれていないため、従来のシステムでは操作を行うことができない。一方、機械学習を取り入れたシステムにおいては、過去の人事査定の履歴を学習してモデルを作り、そのモデルに従って給与が500万円以上になるであろう社員を予測して抽出できるようになる。しかしあくまでこれは予測であり、この結果が本当に正しいかどうかは人事査定のふたを開けてみなければ分からない。

 このように機械学習のシステムは、正当性が保証できない結果を出力するが、それが役に立たないものであるかといえばそういうわけではない。機械学習のシステムの結果を用いて、それを参考にして意思決定を行ったり、あるいはそのものを意思決定にしたりするということができるようになるのである。

日本におけるTensorFlowの事例

 TensorFlowも機械学習のライブラリとして活用され、Google Cloud Platform Japan Blogで日本の事例がいくつか紹介されている。以下に2つ事例を挙げる。

 GMOアドマーケティング社では広告配信ログを学習データとして、TensorFlowを用いて広告主に適合したユーザーを見つけるモデルを構築している。TensorFlowのマネージドサービスであるCloud Machine Learningの利用も視野に入れている。キユーピー社では工場におけるジャガイモの不良品識別のための異常検知モデルをTensorFlowを用いて構築し、工場に持ち込んでの実証実験を行った。実証実験では精度よく不良品を判別でき、今後はさらなる完成度の向上や別の材料への拡張を検討している。

TensorFlowの学び方

 TensorFlowはまだ歴史の長いプロダクトではないが、すでに多くのユーザーがおり、Web上では「使ってみた」系の記事から専門誌の論文まで、多くの利用例が見つかる。TensorFlowを学ぶに当たり、これら先人の知恵を借りない手はないだろう。また、ドキュメント類もしっかりと整備されており、公式ドキュメントを読むだけでも十分に理解を深めることができる。

Web

 本連載は「エンジニア向けに、とりあえず使ってみる」というところをゴールに設定しているため、多くの重要な説明を省略している。本連載を読了したら、まずは公式サイトのドキュメントを眺めてみるとよいだろう。最低限でも以下の3つには目を通そう。

 もし不明な点があれば、StackOverflowのTensorFlowタグ日本語版StackOverflow)で質問してみるとよいだろう。

 グーグルはMachine Learning Crash Course(MLCC)という機械学習のコースを公開している。MLCCはTensorFlowを用いて機械学習全般について解説を加えている。TensorFlowの学習に加えて、機械学習について基礎から学びたい場合はMLCCを利用するとよいだろう。

 恐らく読者の中には、「機械学習を突き詰めて現実的で精度の高いモデルを作成していきたい人」と「TensorFlowの仕組みを理解してより高度な操作を行いたいと思う人」の2通りがいることだろう。それぞれに推奨する学び方は以下の通り。

 まず前者のような読者は、最新の論文を当たるとよい。機械学習分野で論文を調査したい場合のオススメがarXivだ。arXivは計算機科学や統計学を含む自然科学の分野におけるプレプリント・サーバー(レビュー状態、すなわち論文誌で出版される前の論文を保存するサーバー)である。機械学習の分野は日進月歩で1年前に公開された論文が古い論文として扱われることもあるという。このようなスピード感の中で、正式に出版された論文を探索するよりも、arXivのようなプレプリント・サーバーを調査した方が優れた成果を得ることができる場合がある。ただしarXivはプレプリント・サーバーという性質上、玉石混交であることは注意しておく必要がある。

 後者のような読者は、まず公式サイトのExtendを読もう。ここにはTensorFlowのアーキテクチャをはじめとして、TensorFlowを拡張していくための方法が記載されている。また、TensorFlow Discuss(Googleグループ)では、TensorFlowの開発指針などについて議論されている。さらに、TensorFlowがオープンソースであることの魅力として、ソースコードを利用できることにある。GitHubのリポジトリーをのぞくことは、TensorFlowの仕組みを知る上での最高の教材となる。

書籍

 すでにTensorFlowに関する書籍は数多く出版されている。ここでは最近出版された2冊を取り上げる。

  • TensorFlow活用ガイド』(技術評論社): TFUGの発起人らが執筆しており、TensorFlowの基礎、画像処理、自然言語処理、音楽生成、Androidとの連携について幅広く記載されている。
  • TensorFlowではじめるDeepLearning実装入門』(インプレスブックス): TensorFlow勉強会(のちにTFUGと合流)の発起人が執筆しており、ニューラルネットワークの基礎、自然言語処理、画像キャプション生成について記載されている。

ユーザーグループ

 TensorFlowには世界中にユーザーコミュニティが存在する。公式サイトで紹介されている日本のユーザーコミュニティを以下に挙げる。

  • TensorFlow User Group Tokyo: 日本における最大のTensorFlowコミュニティであるTensorFlow User Group(TFUG)であり、イベントでの発表資料も積極的に公開されている。
  • SOLEIL DATA DOJO: TensorFlowのみではなくデータ分析全般に関わるコミュニティであるが、TensorFlowについても積極的に研究会が開催されている。
  • TensorFlow User Group Utsunomiya: TFUGで特に宇都宮を中心としたユーザーコミュニティ。

 上記以外にも、会津を中心としたTensorFlow UserGroup Aizuというコミュニティも存在するようだ。読者の地域にもユーザーグループが存在しているかもしれないので、興味があれば探してみるのもよいだろう。

 さて次回からは、実際にTensorFlowを使っていく。まずは環境構築方法について紹介する。

【TL;DR】TensorFlowと深層学習の基礎

  • TensorFlow: 機械学習用のオープンソースの数値計算ライブラリ。深層学習のみではなく、より広い範囲で利用できる
  • データフローグラフ: データの流れを示したグラフ。TensorFlowが数値計算処理に利用している
  • グラフ: ノード(値定義と計算処理)とエッジ(データと処理の流れ)から成るデータ構造のこと
  • テンソル: 数学用語。多次元配列とよく似ており、複数の要素(通常は数値)を直列状/行列状、その多次元拡張に並べたもの
  • データフローグラフのメリット: 並列性、分散実行、コンパイル、移植性
  • ニューラルネットワーク: 脳の情報伝達の仕組みを参考にした人工ニューロンを組み合わせて構築したネットワークのモデル
  • ディープニューラルネットワーク: 隠れ層(=入力層と出力層の間にある中間層)が2層以上ある、層を深くしたネットワークのモデル
  • 深層学習: 機械学習の一分野で、ディープニューラルネットワークを用いたの枠組み
  • 従来のシステムとの違い: 「機械学習を取り入れたシステムでは入力に対する出力の正当性は保証できない」が、それを参考に意思決定したりできる
  • TensorFlowの学び方: Web/書籍/ユーザーコミュニティなど情報源は多数ある。本連載読了後、特にWebにある公式サイトのドキュメントは必読
  • このエントリーをはてなブックマークに追加

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載目次]を参照してください。

TensorFlow入門(1)
1. 【現在、表示中】≫ TensorFlowとは? 入門連載始動! データフローグラフ、事例、学び方

TensorFlowの概要と適用範囲を説明。最重要な基本概念であるデータフローグラフについて解説する。また、深層学習との関係や、事例、学び方についても紹介する。

2018年4月18日(水)
TensorFlow入門(1)
2. TensorFlow環境の構築

本連載のゴールは「エンジニア向けに、とりあえずTensorFlow使ってみて、ディープラーニングを体感してみる」こと。実際にTensorFlowを使っていくために、まずは環境構築を行おう。

2018年4月19日(木)
TensorFlow入門(1)
3. TensorFlowの基本構成要素:「テンソル」と「セッション」

TensorFlowによる深層学習を始める前に、TensorFlowの基本的な構成要素であるテンソルとセッションを理解しておこう。TensorFlowのコード例を示しながら、できるだけコンパクトにまとめる。

2018年4月20日(金)
TensorFlow入門(1)
4. CNN(Convolutional Neural Network)を理解しよう(TensorFlow編)

画像認識でよく使われるディープラーニングの代表的手法「CNN」を解説。「畳み込み」「プーリング」「活性化関数」「CNNのネットワーク構成」「ソフトマックス関数」といった基礎と、注意点を押さえよう。

2018年4月23日(月)
TensorFlow入門(1)
5. 画像認識を行う深層学習(CNN)を作成してみよう(TensorFlow編)

ディープラーニングの代表的手法「CNN」により画像認識を行う機械学習モデルを構築してみる。CNNによる深層学習がどのようなものか体験しよう。

2018年4月24日(火)
Deep Insider の SNS :
DATUM AI セミナー≪マーケティング編≫ | DATUM STUDIO株式会社