連載
» 2018年04月18日 05時00分 公開

TensorFlow入門:第1回 TensorFlowとは? 入門連載始動! データフローグラフ、事例、学び方 (1/3)

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

[安部晃生,DATUM STUDIO]
「TensorFlow入門」のインデックス

連載目次

ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

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に例を示そう。ここにはA B C Dの4つのノード(丸)と4つのエッジ(矢印)がある。A B Cの3つのノードは互いにエッジによって連結されているが、ノードDはノードCとのみ連結している。また、エッジには方向性がある。こういったグラフが「有向グラフ」である。

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

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

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

図2 4つの定義と3つの演算からなるデータフローグラフ 図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ライブラリもリリースされた。
       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。