機械学習技術の現在+tensolflow white paper

339
丸山不二夫 2015/12/22 機械学習技術の現在2

Upload: maruyama097

Post on 08-Jan-2017

2.308 views

Category:

Internet


1 download

TRANSCRIPT

丸山不二夫 2015/12/22

機械学習技術の現在2

“Rule-based Information Extraction is Dead! ”

--- Laura Chiticariu et al.

“Unfortunately, this turns out to be very difficult. Very very difficult. And given the tremendous promise, there are lots of people working on”

--- Chris Olah

"Validating correctness is a difficult enterprise because the system is inherently stochastic and only intended to behave in a certain way in expectation — potentially after hours of computation.”

--- TensorFlow White Paper

Agendao Watson API

n Watson vs. Watsonn Natural Language Classifiern Dialogn Cortana, Alexa との比較n Retrieve and Rank

o Deep Learningでの自然言語へのアプローチn Deep Learning, NLP, and Representations

Agendao Google TensolFlowの登場

n Google TensolFlowとは何か?n TensorFlowのプログラミング・モデルと基本的なコンセプト

n TensorFlowプログラム サンプル1線形回帰

n TensorFlowプログラム サンプル 2手書き文字の認識

o TensolFlow White Paper (翻訳)

Watson API

Watson APIは、IBMが提供する一群の ”Cognitive Computing” 向けのサービスの総体である。それは、数年前に人間を破った「クイズ王」のWatsonへのAPIではない。

http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/

Watson APIを構成するサービスの一覧 (1)

Watson APIを構成するサービスの一覧 (2)

http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/

Watson APIを構成するサービスの一覧 (3)

http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/

Watson vs. Watson

これらのサービスの総体は、以前と同じものになるのだろうか? 筆者は、そこには大きな違いがあると考えている。

以前のWatsonについては、前回のマルレクの資料を参照してほしい。https://goo.gl/lKwiJG

質問回答システムから対話システムに

o 旧Watsonは、クイズ番組Jeopardy用にチューンされた「質問回答システム」であった。一つの質問に対して一つの答えを返す。そこで旧Watsonの基本的なサイクルは閉じる。 初の質問と二番目の質問に、自然な連続した会話のように、関連がありうることは、そもそも想定されていない。

o 新しいWatson APIは、人間との自然言語による会話ができる対話システムを可能にする。それは、Google NowやSiriやCortana, Alexaと同じ方向である。旧Watsonは、(テレビのデモではわからないが)「質問」は、文字ベースだった。新しいWatsonは、発話を文字に変え(Speech to Text)、文字を発話に変える(Text to Speech)の能力を備えている。

単独の無数の多様性を持ちうる「質問」とコンテキストを持つ特定パターンの「会話」

o 旧Watsonは、単独ではあるが、無数の多様性を持ちうる「質問」に答えようとする。その為に、「質問文」を文法的(基本的には、Slot Grammerの枠組みで)に解析して質問のTopicを検出し、答えの候補を複数個仮定し、自分の持つ「知識」を検索し、複数の独立した評価システムを総合して、答えを絞り込む。

o 新Watson APIで、新しく加わった「対話」機能の、「コンテキスト」は、あらかじめ人間によって設定されている。「発話」の「意図」は、新Watson APIの中核の一つである”Natural Language Classifier” では、特定の「発話」のパターンが、その「意図」と直接に結び付けられる。

旧Watsonの行っていた処理

対話機能の実装と、「文法」へのアプローチ

o 旧Watsonには、対話機能はない。ただし、文の文法的な性質から情報を引き出す能力は持っていた。

o 新Watson APIでの対話のシナリオは、”Dialog”を通じて、人間がプログラムする。このプログラミング作業で重要なのは、あらかじめ「発話」を予想することであり、”Dialog”の「文法」は、想定されたシナリオの元で、この予想の幅を広げる為の、正規表現(風な)による、文字列マッチングでしかない。

o こうした「対話機能」が、パーソナル、ないしは、ビジネス・アシスタント・システムとして役に立つことはあるだろう。

ただ、人間の知能の持つ重要な特質である「汎用性」を欠いていることは、明らかだと思う。知能をプログラムすることと、知能を演ずることをプログラムすることは違うのだ。

“Automatic knowledge extraction from documents”http://goo.gl/MexfSl

「知識」へのアプローチ

o 旧Watsonは、自前で、「知識」を持っていた。ネットに繋がっているわけではなく、閉じたものだったが、Wikipediaを全部、暗記していると思っていい。旧Watsonの力は、この「知識」を検索して、なんとか「質問応答」に生かそうとする数々の手段の多様性によって支えられていた。 終的には、それぞれのスコアの評価システムで、答え一つに絞り込まれたとしても。

o 新Watson APIでは、こうした旧Watsonの魅力的な能力は引き継がれていない。新Watsonは、裸のままでは何のデフォールトの知識も持っていない。もちろん、新Watsonに知識と評価システムを与えることはできる。”Retriece and Rank” は、そういうものだが、僕には、Solr/Lucene でしかないように見える。

“Finding needles in the haystack:Search and candidate generation”http://goo.gl/8O4s26

機械学習技術の利用について

o 旧Watsonでは、Neural Network/Deep Learning 的なアプローチは、ほとんで取られていない。もちろん、スコアの評価には、統計的な手法が用いられているのだが。

o 新Watson APIで提供されるサービスの少なくないものが、NN/Deep Learningの手法を取り入れている。これは、新Watson APIの大きな特徴と言っていい。

o この分野のIBMの取り組みについては、前回のマルレクの資料の後半に、TruNorthチップとCoreletの紹介がある。参照してほしい。

"A million spiking-neuron integrated circuit with a scalable communication network and interface”

D.S.Modha et Alhttp://goo.gl/F27HGc

Natural Language Classifier

Natural Language Classifierは、ある文が、 「何についての文」であるかを判断する。

ただし、そのクラス分けの根拠は、文の文法的な解析やシステムの持つ知識ではなく、人間が与えたそのクラスに属するという複数の例文との類似に基づいている。(Amazon Alexaでの、文とIntentとの対応付けに近い)

Natural Language Classifier

Natural Language Classifier Demoo Is it hot outside?

o Natural Language Classifier is 98% confident that the question submitted is talking about 'temperature’.Classification: temperatureConfidence: 98%

http://goo.gl/hGByud

Natural Language Classifier Demoo What is the expected high for today?

o Natural Language Classifier is 98% confident that the question submitted is talking about 'temperature’.Classification: temperatureConfidence: 98%

http://goo.gl/hGByud

Natural Language Classifier Demoo Will it be foggy tomorrow morning?

o Natural Language Classifier is 68% confident that the question submitted is talking about ‘conditions’.Classification: conditionsConfidence: 68%

http://goo.gl/hGByud

Natural Language Classifier Demoo Will it be foggy tomorrow morning?

o Natural Language Classifier is 68% confident that the question submitted is talking about ‘conditions’.Classification: conditionsConfidence: 68%

http://goo.gl/hGByud

Natural Language Classifier Demoo Will it be foggy tomorrow morning?

o Natural Language Classifier is 68% confident that the question submitted is talking about ‘conditions’.Classification: conditionsConfidence: 68%

http://goo.gl/hGByud

Natural Language Classifier Demoo Should I prepare for sleet?

o Natural Language Classifier is 91% confident that the question submitted is talking about ‘conditions’.Classification: conditionsConfidence: 91%

http://goo.gl/hGByud

Natural Language Classifier Demoo Will there be a storm today?

o Natural Language Classifier is 98% confident that the question submitted is talking about ‘conditions’.Classification: conditionsConfidence: 98%

http://goo.gl/hGByud

Structure of training data

Structure of training data

Natural Language Classifiero Watson APIの中心的なコンセプトは、"Natural

Language Classifier"。o このClassifierが、どのように学習されどのような応答が行われるかは、 以下のquestions.csvとanswers.csvという二つのファイルとanserディレクトリーの中身を見ればわかる。

https://goo.gl/iubMNX

question.csvo question.csvでは、似たような質問が一つのクラスにまとめられ、そのクラスに名前が与えられる。ドキュメントでは、その名前を LabelIDと呼んでいる。図1の例では、関連する似たような5つの質問に、all_training_data_used という名前が与えられている。

question.csv

answer.csvo answer.csvは、LabelIDについて、一つの「代表的な」質問を選んでいる。ここで、質問が、all_training_data_used というカテゴリーに分類されたとしよう。そうすると、先に述べたディレクトリーanswer以下に、all_training_data_used.html というファイルがあるので、それを「答え」として利用すればいい。

answer.csv

answers ディレクトリー

Dialog

Dialogは、対話型の会話の流れを(XMLで)プログラムする。人間の発話の揺れや冗長性に、柔軟な文字列マッチングで対応しようとする。それを「文法」と呼んでいる。(これは、W3Cの” Speech Recognition Grammar Specification” http://www.w3.org/TR/speech-grammar/あたりの影響だと思う)

Dialog

http://goo.gl/nBy5YK

Dialog demo

http://goo.gl/mwHnsK

Dialog demo

Dialog demo

Dialog demo

Dialog demo

Dialog demo

Dialog demo

Dialog API

https://goo.gl/jTccqJ

Dialog API

https://goo.gl/jTccqJ

Dialogでの「会話」のプログラム機械からの呼びかけ

人間からの入力取得

デフォールトでは、「わかりません」と答える

ここが重要

http://goo.gl/xlUSs8

Dialogでの「会話」のプログラムSearch タグ

http://goo.gl/xlUSs8

Dialogでの「会話」のプログラムSearch タグ

http://goo.gl/xlUSs8

Dialogでの「会話」のプログラムConcept タグ

これらは。同じ意味を持つ

http://goo.gl/xlUSs8

Dialogでの「会話」のプログラムGrammer タグ

http://goo.gl/xlUSs8

Grammerタグ内の Wild Card 文字Asterisk (*)o “What is * dialog” は、次のものにマッチする

o "What is a dialog"o "What is this thing called a dialog"o “What is the meaning of a dialog” o ...

Grammerタグ内の Wild Card 文字Dollar sign ($)o “$ is a dialog” は、次のものにマッチする。

o "So, can you tell me what is a dialog, please"o "I've heard about virtual agents, but is a dialog

one of those"o "Tell me, is a dialog something I can create"o "Is a dialog something I can use for my

business”o ...

Grammerタグ内の Wild Card 文字Percent sign (%)o “% is a dialog”は、次のものにマッチする。

o What is a dialogo Can you tell me about a dialogo What is ito iso a dialogo ...

Grammerタグ内の Wild Card 文字Hash sign (#)o “# is dialog”は、次のものにマッチする。

o What is a Dialogo Can you tell me what Dialog iso Is this thing I'm looking at a Dialogo What is Dialog

Pizza demoのsourceの一部

https://goo.gl/3aGRjG

Cortana, Alexa との比較

helloGoodbye「こんにちは」 「さようなら」

<VoiceCommands ...<CommandSet ...

<Command Name=“helloGoodbye"><ListenFor ...>こんにちは

</ListenFor><Feedback> さようなら </Feedback>...

</Command>

音声入力 音声出力音声コマンド

音声コマンドの定義ファイル

MS Cortanaのスタイル

MS CortanaVoice Commandの定義サンプル

<VoiceCommandsxmlns="http://schemas.microsoft.com/voicecommands/1.2"><CommandSet xml:lang="en-us”

Name="AdventureWorksCommandSet_en-us"><CommandPrefix> Adventure Works, </CommandPrefix><Example> Show trip to London </Example><Command Name="showTripToDestination"><Example> Show trip to London </Example><ListenFor RequireAppName="BeforeOrAfterPhrase">

show [my] trip to {destination} </ListenFor><ListenFor RequireAppName="ExplicitlySpecified">

show [my] {builtin:AppName} trip to {destination} </ListenFor><Feedback> Showing trip to {destination} </Feedback><Navigate Target="foo"/>

</Command>

Speechlet「こんにちは」 「さようなら」

Request Response

SampleUtterances.txt

public SpeechletResponse onIntent (...) ... {...if ("HelloIntent".equals(intentName)) {

return getHelloResponse();} else if ("HelpIntent".equals(intentName)) {

return getHelpResponse();} else {

throw new SpeechletException("Invalid Intent");}

}

private SpeechletResponse getHelloResponse() {String speechText = “さようなら”;SimpleCard card = new SimpleCard();...return SpeechletResponse.newTellResponse(speech, card);

}音声とカードが返るAmazon Alexaのスタイル

helloworld.speechAsset.SampleUtterances.txt

HelloWorldIntent say helloHelloWorldIntent say hello worldHelloWorldIntent helloHelloWorldIntent say hiHelloWorldIntent say hi worldHelloWorldIntent hiHelloWorldIntent how are you

HelpIntent helpHelpIntent help meHelpIntent what can I ask youHelpIntent get helpHelpIntent to helpHelpIntent to help me

intentName 発話

cortanaのListenForと同じ働きをする。それぞれの発話に、intentNameが付けられている。

“say hello”と“how areyou”は、同じintentNameが割り当てられている。

Retrieve and Rank

Retrieve and Rank

http://goo.gl/t09wXt

Apache Solr

http://goo.gl/lX70zT

Retrieve and Rank Demo

Retrieve and Rank Demo

Retrieve and Rank Demo

Cranfield collection ?

Create Solr cluster

http://goo.gl/9khkd5

List Solr configuration

http://goo.gl/9khkd5

Index document

http://goo.gl/9khkd5

Search Solr standard query

http://goo.gl/9khkd5

Search and Rank

http://goo.gl/9khkd5

Deep Learningでの自然言語へのアプローチ

ここでは、Cristopher Olahの ”Deep Learning, NLP, and Representations”に依拠して、Deep Learningの世界での自然言語へのアプローチのトピックを紹介する

Deep Learning, NLP, and Representations

Christpher Olahhttp://colah.github.io/posts/2014-07-NLP-RNNs-Representations/

Deep Learning, NLP, and Representations

http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/

Word Embeddingsとは何かo Word Embeddingは、ある言語の「語」を、n次元(200次元とか500次元とかの高次元)ベクトル空間 Rn に写像する関数Wのこと

W : words → Rn

o 例えば、W(‘‘ネコ“)=(0.2, -0.4, 0.7, ...)W(‘‘イヌ")=(0.0, 0.6, -0.1, ...)

統計的言語モデル

o 2003年のBenjio らの “A Neural Probabilistic Language Model” http://goo.gl/948I43 が、 初の試み。 「統計的言語モデルの目標は、ある言語内での語の並びの結合確率関数を学ぶことである。」

o “This is intrinsically difficult because of the curse of dimensionality:” なぜなら、語彙の数が、一万語だとしても、わずか10語からなる文の可能性は、一万の10乗にもなることになるから。

o Benjioらは、ある語がコーパスの文中に現れる時、その後に続く語の確率を、すべての語について、ニューラル・ネットワーク・モデルで計算しようとした。

ニューラル・ネットを使った単語選択

o {to, two, too}という言葉は、発音はよく似ている。今、次の文の下線部に、先の三つの単語{to, two, too}から、一つ選んで文章を作るという問題を考えよう。For breakfast I ate _____eggs. 正解は、もちろんtwoである。多くの人は、two以外だと文法的に正しくないし、意味が通らないと考えるだろう。

o ところが、ニューロ・ネットを使った単語選択の考え方は、それとは異なる。沢山の用例を調べて、同じようなものがあれば、それを選ぶ。 次の例は、Andrew NgのMachine LearningについてのCourseraの講義からの抜粋。10億個のデータで学習させても、この簡単な例でも、正解率は、100%に届かない。

It’s not who has the best algorithm that wins.It’s who has the most data.

http://bit.ly/1qKh8ro

横軸が対数のグラフ

10億

ニューラルネットによる文章の学習

o Googleの Ilya Sutskeverは、文字数が5億文字にものぼるテキストを長い時間をかけてRecurrent Neural Nets に学習させ、次のページのような文章を生成することができた。

http://bit.ly/1qN5Pes

“An example of what recurrent neural nets can now do” WikiPedia で学習したもの

o The meaning of life is the tradition of the ancient human reproduction: it is less favorable to the good boy for when to remove her bigger. In the show’s agreement unanimously resurfaced. The wild pasteuredwith consistent street forests were incorporated by the 15th century BE. In 1996 the primary rapford undergoes an effort that the reserve conditioning, written into Jewish cities, sleepers to incorporate the .St Eurasia that activates the population.

http://goo.gl/vHRHSn

“An example of what recurrent neural nets can now do” New York Timesで学習

o while he was giving attention to the second advantage of school building a 2-for-2 stool killed by the Cultures saddled with a halfsuitdefending the Bharatiya Fernall ’s office . Ms . Claire Parters will also have a history temple for him to raise jobs until naked Prodiena to paint baseball partners , provided people to ride both of Manhattan in 1978 , but what was largely directed to China in 1946 , focusing on the trademark period is the sailboat yesterday and comments on whom they obtain overheard within the 120th anniversary , where ......

http://goo.gl/vHRHSn

画像認識と言語モデルの複雑さの比較

o 「ディープ・ニューラル・ネットワークの計算グラフは、きわめて複雑なものになりうる。例えば、GoogleのInceptionモデル[48]に似た訓練用の計算グラフは、ディープ・コンボリューション・ニューラル・ネットワークで、2014年のコンテストで 高の分類パフォーマンスを示したのだが、TensorFlowの計算グラフでは、36,000個以上のノードを持っている。そして、言語モデルのためのディープ・リカレントLSTMモデルは、15,000以上のノードを持っている。」

“TensorFlow Whitepaper” 第9節から

Word2Vecの登場o 2013年に、GoogleのTomas Mikolovらは、語が埋め込まれたベクター空間が、言語学的に(文法的にも、意味論的にも)面白い性質を持っていることを発見する。

o “We find that these representations are surprisingly good at capturing syntactic and semantic regularities in language, and that each relationship is characterized by a relation-specific vector offset.” (Linguistic Regularities in Continuous Space WordGoogRepresentations http://research.microsoft.com/pubs/189726/rvecs.pdf )

o Jeff Deanも、この論文に注目して、共同の作業が始まる。

Word2Vecの登場o Google Codeに、オープンソースとして公開され、

https://code.google.com/p/word2vec/ 大きな関心を集める。

o ここで使われているモデルは、次の二つ。

n CBOW(Continuus Bag-of-Word”) モデル複数の語の集まりから、一緒に出現しそうな一つの語の確率を調べる。

n Skip-gram モデル一つの語が与えられた時、一緒に出現しそうな複数の語の確率を調べる。

http://arxiv.org/pdf/1301.3781.pdf

“cat”

“sat”

“the”

“mat”

“on”

“cat”

“sat”

“the”

“mat”

“song”

語をベクトルに変換する関数Wの利用Modular Network

o “cat sat on the mat” 正しい文R(W(‘‘cat"), W(‘‘sat"), W(‘‘on"), W(‘‘the"), W(‘‘mat"))=1

o “cat sat song the mat” 正しくない文R(W(‘‘cat"), W(‘‘sat"), W(‘‘song"), W(‘‘the"), W(‘‘mat"))=0

正しくない

Bottou: http://research.microsoft.com/pubs/192773/tr-2011-02-08.pdf

t-SNE: 「語埋め込み」の可視化

t-SNE: visualizations of Words embeddings

先の出力の一部を拡大したもの

LeCunのLeNetによる手書き文字認識学習用手書き文字データ MNISTを利用

http://yann.lecun.com/exdb/lenet/

t-SNEによる学習されたMNIST データの可視化

https://lvdmaaten.github.io/tsne/

t-SNEによる学習されたMNIST データの可視化 (3D版)

どんな語が、与えられた語の近くに埋め込まれるか?

Collobert et al. (2011) http://arxiv.org/pdf/1103.0398v1.pdf

どんな語が、与えられた語の近くに埋め込まれるか?

o 似た意味を持つ言葉は、似たベクトルを持つ。

o 似た言葉で置き換えても、正しい文は、正しい文に変わる。

“a few people sing well” 正しい文

“a couple people sing well” 正しい文

o 意味が似ていなくても、同じクラスの言葉で置き換えても、正しい文は、正しい文に変わる。

“the wall is blue” “the ceiling is red”

意味を変換するベクトルは共通?

o Word Embeddingは、もっと面白い性質を持つ。下の図のように、男性から女性へのベクトルがあるように見える。

o W(‘‘woman“)−W(‘‘man”) ≃ W(‘‘aunt“)−W(‘‘uncle”)W(‘‘woman")−W(‘‘man") ≃ W(‘‘queen")−W(‘‘king")

http://arxiv.org/pdf/1310.4546.pdf

国を首都に対応づけるベクトル

ベクトルで表現される関係の例

Mikolov et al (2013) http://arxiv.org/pdf/1301.3781.pdf

Mikalov et al http://arxiv.org/pdf/1301.3781.pdf

文法的関係を表すベクトルも存在する

語が埋め込まれたベクトル空間を様々な目的で共有する

o いったん、ベクトル空間での語の表現が出来上がれば、その表現を共有して自然言語について、様々な処理が可能となる。

o 例えば、

n 名前を持つ実体の認識

n 品詞の分類

n 構文解析

n 意味的役割のラベル付け

http://nlp.stanford.edu/~lmthang/data/papers/conll13_morpho.pdf

二ヶ国語の埋め込み

o 二つの事なった言語を、同一のベクトル空間に埋め込む事ができる。例えば、英語と中国語。

o 英語と中国語には、同じ意味の言葉がある。二つの言語を埋め込む時、我々が両方の意味を知っているものについては、同じ意味を持つものを、

できるだけ近くなるように調節する。

o そうすると、我々が知らない言葉でも、同じ意味を持つものは、近いと

ころに埋め込まれる。

Socher, rt al http://goo.gl/DRt79o

Socher, rt al http://goo.gl/DRt79o

言葉とイメージの埋め込み

o 今度は、言葉と画像イメージを、同一のベクトル空間に埋め込む取り組み。

o イヌの画像は、「イヌ」という言葉の近くに、ウマの画像は、「ウマ」という言葉の近くに埋め込む。

o こうした時、ネコについて、特に訓練しなくても、ネコの画像は、「ネコ」という言葉の近くに見つかるという。

Socher et al. (2013b) http://goo.gl/TdFSuK

This was done by members of the Stanford group with only 8 known classes (and 2 unknown classes).

画像と意味を埋め込んだモデル

Frome et al http://goo.gl/QPAARB

画像と意味を埋め込んだモデル

Frome et al http://goo.gl/QPAARB

Recursive Neural Networkso Modular Networkは、固定された数の入力しか持たない。

(この例では、5個)

o この限界を、結合モジュール

Aを導入する事で、克服できる。

Recursive Neural Networkso これは、“((the cat) (sat (on (the mat))” を、結合モジュールを使って表したもの。

o こうしたモデルは、モジュールの出力が同じタイプのモジュールの入力となるので、 “recursive neural networks” と呼ばれる。また、 “tree-structured neural networks”とも呼ばれる。

文 “This film does’nt care about cleverness wit or any other kind of intelligenct humor” の解析

Socher, et al. http://goo.gl/bPAQ68

文法構造をニューラル・ネットで表現する!

Phraseの埋め込み

http://arxiv.org/pdf/1406.1078v1.pdf

Google TensolFlowの登場

Google TensolFlowの発表は、2015年のAI/MLのシーンで、 大のトピックである。そのインパクトは大きい。https://www.tensorflow.org/

http://download.tensorflow.org/paper/whitepaper2015.pdf

TensorFlowとは何か?o TensorFlow は、マシン・ラーニングのアルゴリズムを表現するインターフェースである。

o TensorFlowは、同時に、そうしたアルゴリズムを実行する実装である。

o Googleは、大規模な機械学習システムの第一世代としてDistBeliefを構築していた(「Googleの猫」のマシン)。TensorFlowは、大規模マシン・ラーニング・モデルの実装と配備のための、第二世代のシステムだという。

TensorFlowとは何か?o TensorFlowがカバーする範囲は、AndroidやiOSといったモバイル・デバイス上での推論の実行から、数千のGPUを持つ数百台の特別のマシン上で走る大規模な訓練システムに及んでいる。

o Googleは、TensorFlow APIと参照実装を 2015年の11月に、Apache 2.0ライセンスの下でオープンソースにした。 www.tensorflow.org から利用可能である。

TensorFlowのプログラミング・モデルと基本的なコンセプト

グラフとノードとテンソル

p TensorFlow の計算は、ノードの集合からなる有向グラフによって記述される。それぞれのノードは、入力と出力を持ち、ある演算のインスタンスを表現している。

pグラフは、データフロー計算を表現している。グラフの中で、流れる値はテンソルである。テンソルは、任意の次元を持つ配列である。

pただ、ある種類のノード(Variable等)にパーシステントな状態の維持と更新を可能とし、また、グラフ内の分岐とループの制御構造を持つように拡張している。

pクライアントは、サポートされたフロントエンドの言語(C++ または Python)を利用して計算グラフを構築する。

TensorFlowのコードとグラフのサンプルimport tensorflow as tf

b = tf.Variable(tf.zeros([100]))W = tf.Variable(tf.random_uniform([784,100],-1,1))x = tf.placeholder(name=“x”)relu = tf.nn.relu(tf.matmul(W, x) + b)C = [...]

s = tf.Session() for step in xrange(0, 10):

input = ...construct 100-D input array ...result = s.run(C, feed_dict={x: input})print step, result

演算とカーネル

o 演算は名前を持っていて抽象的な計算を表現する(例えば、”matrix multiply”や “add”のように)。

o カーネルは、特別なタイプのデバイス(例えば、CPUかGPUか)の上で実行可能な、特別な演算の実装のことである。

TensorFlow の演算o 要素ごとの数学的演算

Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal, ...

o 配列の演算Concat, Slice, Split, Constant, Rank, Shape,Shuffle, ...

o 行列の演算MatMul, MatrixInverse, MatrixDeterminant, ...

o 状態を持つ演算Variable, Assign, AssignAdd, ...

TensorFlow の演算o ニューラル・ネットワークの構成要素

SoftMax, Sigmoid, ReLU, Convolution2D,MaxPool, ...

o チェックポイント演算Save, Restore

o キューと同期の演算Enqueue, Dequeue, MutexAcquire,MutexRelease, ...,

o 制御の流れの演算Merge, Switch, Enter, Leave, NextIteration

セッション

o クライアントのプログラムは、セッションを生成することでTensorFlowのシステムと相互作用する。

o セッション・インターフェースによってサポートされている他の重要なオペレーションは、 Runである。

o TensorFlowの利用の大部分では、いったんグラフでセッションをセットアップすると、そのあとは、Runの呼び出しを通じて、グラフ全体あるいは少数の部分グラフを数千ないしは数百万回実行する。

変数(Variable)o 大部分の計算では、一つのグラフは複数回実行される。大部分のテンソルは、グラフの一回の実行のあとにはいき残らない。しかし、変数は、グラフの実行を通じて生き残るパーシステントな複製可能なテンソルへのハンドルを返す特別な種類の演算である。

クライアントとマスターとスレーブ

o TensorFlowシステムの主要なコンポーネントはクライアントである。

o クライアントは、セッション・インターフェースを使ってマスターと、さらに、一つ以上のワーカー・プロセスと通信する。

o それぞれのワーカー・プロセスは、一つ以上の計算デバイス(CPUコアとかGPUコアといった)へのアクセスの調停とマスターに指示されたデバイス上でのグラフ・ノードの実行に責任を持っている。

単一マシンと分散システムの構造

デバイス

o デバイスは、TensorFlowの計算の心臓部分である。それぞれのワーカーは一つ以上のデバイスに責任を持っている。

o それぞれのデバイスは、デバイスの型と名前を持っている。デバイス名の例は、次のようになる。"/job:localhost/device:cpu:0" "/job:worker/task:17/device:gpu:3".

テンソル

o テンソルは、型付けられた多次元の配列である。

o TensorFlowは、多様なテンソル要素の型をサポートしている。8bitから64bitのサイズの、符号付・符号なしの整数。IEEEの浮動小数点と倍精度と複素数、文字列型(任意のバイト配列)がある。

o テンソルの格納場所の適切なサイズは、テンソルが存在するデバイス上で特有のアロケータ−によって管理される。

TensorFlowプログラム サンプル1線形回帰

....W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1]))y = W * x_data + b

# Minimize the mean squared errors. loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)

# Before starting, initialize the variables. We will 'run' this first. init = tf.initialize_all_variables()

# Launch the graph. sess = tf.Session() sess.run(init)

# Fit the line. for step in xrange(201):

sess.run(train) if step % 20 == 0:

print(step, sess.run(W), sess.run(b))

....W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1]))y = W * x_data + b

# Minimize the mean squared errors. loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)

# Before starting, initialize the variables. We will 'run' this first. init = tf.initialize_all_variables()

# Launch the graph. sess = tf.Session() sess.run(init)

# Fit the line. for step in xrange(201):

sess.run(train) if step % 20 == 0:

print(step, sess.run(W), sess.run(b))

グラフの定義

アルゴリズム

グラフの起動

グラフで訓練繰り返し

まず、アルゴリズムを理解しよう

ポイントは線形回帰と勾配降下法だが、それには、次のサンプルでの説明がわかりやすい、

Andrew NgのCourseraのML講義に依拠https://www.coursera.org/course/ml

ポートランドでの実際の家の価格

これを予測の為の訓練用データとして利用する

面積 feet2

(x)価格 千ドル単位

(y)2104 4601416 2321534 315852 178… …

記号の意味:m = 訓練用データの数x = “入力” 変数 / 特徴y = “出力” 変数 / “ターゲット” 変数

m= 97

このサンプルは、何をしようとしているのか家の面積から価格を予想する

仮説:

面積 feet2

(x)価格 千ドル単位

(y)2104 4601416 2321534 315852 178… …

予測の為の訓練用データ

家の価格hは、家の面積をxとした時、上の式で表されると仮定する。

問題:この時、パラメーター は、どのように選べばいいか?

0

1

2

3

0 1 2 30

1

2

3

0 1 2 30

1

2

3

0 1 2 3

h は、x の一次式なので、h のグラフは、直線になる。パラメーター θi が変わると、グラフも変わる。

訓練用データの点(x, y) について、yがもっとも、hθ(x)に近ずくように、θ0, θ1を決める。

誤差

誤差

誤差誤差

先のアルゴリズム中のloss = tf.reduce_mean(tf.square(y - y_data))は、誤差の尺度

誤差を 小にするθ0 , θ1を求める

o サンプル中のi 番目の点を (x(i), y(i))とすれば、点 x(i) での誤差は、hθ(x(i)) – y(i) となる。

o 誤差は、正負の値をとるので、単純に、誤差の平均を取っても、打ち消しあって、全体としての誤差の大きさはわからなくなる。

o そこで、誤差の二乗をとって、その平均を 小にすることを考える。

o θ0 , θ1の関数である、この誤差の二乗の平均を、コスト関数と呼ぶことがある。

仮説:

パラメーター:

コスト関数:

目標:

問題の整理

コスト関数

先のサンプルでは、Loss関数(損失関数)と呼ばれている。同じものである。次のプログラムは、Loss関数を定義し、それをGradientDescentを使って 小のものにせよということである。

loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)

コスト関数 J(θ0 , θ1)は、θ0 , θ1 についての関数なので、次のような形をしている

θ1θ0

J(θ0,θ1)

コスト関数 J(θ0 , θ1)の別の例

(for fixed , this is a function of x) (function of the parameters )

(for fixed , this is a function of x) (function of the parameters )

(for fixed , this is a function of x) (function of the parameters )

(for fixed , this is a function of x) (function of the parameters )

Gradient descent勾配降下法

Gradient descent 勾配降下法は、ニューラル・ネットワークのパラメーター更新の基本的な手段である。TensorFlowでは、 Gradient descent が、標準的な関数として、あらかじめ組み込まれている。先のアルゴリズムでは、optimizer = tf.train.GradientDescentOptimizer(0.5) の形で利用されている。

ある関数があって

その値を 小にしたい

基本的な考え方:

• ある からはじめる。

• の値を、 が減少するように

変化させる。

• 小値になるまで、繰り返す。

Gradient descent(勾配降下法)

簡単にするために、二次元のグラフで考えよう。ある点から始めて、その点から極小点に近ずくためには、どうすればいいか?

二つの場合がある。

その点が極小点の右側にある場合には、その点のx座標を少し減らせばいい。その点が極小点の左側にある場合には、その点のx座標を少し増やせばいい。

その点が、極小点の右にあるか左にあるかは、その点での接戦の傾きが、正であるか負であるかでわかる。

よって、α を正の数値とすれば、次の式が、より近づいた点の位置を与える。

直感的な説明

If α is too small, gradient descent can be slow.

If α is too large, gradient descent can overshoot the minimum. It may fail to converge, or even diverge.

アルファが、あまりに小さいと、Gradient descentは、ゆっくりにしか進まない。

アルファが、あまりに大きいと、Gradient descentは、 小値を通り越してしまう。場合によっては、振動したり、収束しない場合もある。

このアルファを学習率(Learning Rate)という。

Gradient descentは、アルファが固定されていても、極小値に収束できる。

局所的な 小値に近づくにつれ、gradient descentは、自動的に小さなステップを取るようになるので、繰り返しアルファを小さくしてゆく必要はない。

θ1θ0

J(θ0,θ1)

θ0

θ1

J(θ0,θ1)

ある場合には、 小値ではなく、局所的な極小値に、入り込むことがある。

http://arxiv.org/pdf/1210.0811v2.pdf

gradient descent method

....W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1]))y = W * x_data + b

# Minimize the mean squared errors. loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)

# Before starting, initialize the variables. We will 'run' this first. init = tf.initialize_all_variables()

# Launch the graph. sess = tf.Session() sess.run(init)

# Fit the line. for step in xrange(201):

sess.run(train) if step % 20 == 0:

print(step, sess.run(W), sess.run(b))

TensorFlowプログラム サンプル2手書き文字の認識

....# Create the modelx = tf.placeholder("float", [None, 784])W = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))y = tf.nn.softmax(tf.matmul(x, W) + b)

# Define loss and optimizery_ = tf.placeholder("float", [None, 10])cross_entropy = -tf.reduce_sum(y_ * tf.log(y))train_step = tf.train.GradientDescentOptimizer(0.01)¥

.minimize(cross_entropy)

# Traintf.initialize_all_variables().run()for i in range(1000):

batch_xs, batch_ys = mnist.train.next_batch(100) train_step.run({x: batch_xs, y_: batch_ys})

ソースの全体は、こちらにある。https://goo.gl/MwscZO

....# Create the modelx = tf.placeholder("float", [None, 784])W = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))y = tf.nn.softmax(tf.matmul(x, W) + b)

# Define loss and optimizery_ = tf.placeholder("float", [None, 10])cross_entropy = -tf.reduce_sum(y_ * tf.log(y))train_step = tf.train.GradientDescentOptimizer(0.01)¥

.minimize(cross_entropy)

# Traintf.initialize_all_variables().run()for i in range(1000):

batch_xs, batch_ys = mnist.train.next_batch(100) train_step.run({x: batch_xs, y_: batch_ys})

グラフの定義

アルゴリズム

グラフで訓練繰り返し

ソースの全体は、こちらにある。https://goo.gl/MwscZO

線形回帰とクラス分類との比較変数の定義部分

W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1]))y = W * x_data + b

W = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))y = tf.nn.softmax(tf.matmul(x, W) + b)

実数が行列に変わっているだけで、ほとんど同じものだ。

mutmul(x, W)は、行列同士の掛け算である。クラス分類の方に、softmaxがつくのは当然である。

線形回帰

クラス分類

線形回帰とクラス分類との比較アルゴリズムの定義部分

loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)

cross_entropy = -tf.reduce_sum(y_ * tf.log(y))train_step = tf.train.GradientDescentOptimizer(0.01)¥

.minimize(cross_entropy)

Loss関数の定義が変わっているが、Gradient Descent 法を使って、Loss関数が 小になるように、ステップごとにパラメーターを変化させていくという考え方は、共通である。

線形回帰

クラス分類

ニューラル・ネットワークの“Hello World!”o この辺りまでが、ニューラル・ネットワークの”Hello

World !” にあたる基本である。数値予測とクラス分類は、ニューラル・ネットワーク利用の二大分野であるので、その基礎は、しっかり押さえておく必要がある。

o 手書き文字の認識でも、もっと精度の高いConvolutional Neural Network を使うモデルは、急に複雑になる。同じMNISTデータを使うTensorFlow用のモデルのサンプルが公開されている。https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/mnist/convolutional.py

Google TensorFlowWhite Paper

http://download.tensorflow.org/paper/whitepaper2015.pdf

Abstract

o TensorFlow [1] は、マシン・ラーニングのアルゴリズムを表現するインターフェースであり、同時に、そうしたアルゴリズムを実行する実装である。TensorFlowを用いて表現される計算は、携帯電話やタブレットといったモバイル・デバイスから、数百のマシンと数千のGPUカードのような計算デバイスを持つ大規模分散システムにいたる、広い範囲の多様なヘテロなシステムで、ほとんど、あるいは、全く変更なしで実行することができる。

o このシステムは、柔軟で、ディープ・ニューラル・ネットワークのための訓練と推論のアルゴリズムを含む、広い範囲の多様なアルゴリズムを表現するために利用できる。また、このシステムは、先導的研究のために、また、マシン・ラーニング・システムをコンピュータ・サイエンスやその他の分野の数十の領域をまたいで、生産の場に配備するために使われてきた。これらの中には、音声認識、コンピュータ・ビジョン、ロボット工学、情報抽出、自然言語処理、地理情報抽出、コンピュータによる薬品の発見といった領域が含まれている。

o この論文は、TensorFlowのインターフェースと、我々がGoogleで構築した、このインターフェースの実装について述べたものである。TensorFlow APIと参照実装は、2015年の11月に、Apache 2.0 ライセンスで、オープンソース・パッケージとして公開された。www.tensorflow.orgから利用可能である。

論文の構成

1. イントロダクション2. プログラミング・モデルと基本的なコンセプト3. 実装4. 拡張5. 適化

6. 現状と経験7. よく使われるプログラミング上のイディオム8. パフォーマンス9. ツール10.将来の仕事11.関連した仕事12.結論

1. イントロダクション

o Google Brain プロジェクトは、研究とGoogle製品での利用の両面で、非常に大規模なディープ・ニューラル・ネットワークの利用を開拓するために、2011年に開始された。このプロジェクトの初期の仕事の一部として、我々は、スケーラブルな分散訓練推論システム[14]の第一世代としてDistBeliefを構築した。そして、このシステムは、我々に非常に役立った。 我々とGoogleの他のメンバーは、DistBeliefを使って、広い範囲の多様な研究を遂行してきた。これらには、次の仕事が含まれる。教師なし学習[31], 言語の表現 [35, 52], イメージ分類と対象検出のモデル [16, 48], ビデオの分類 [27], 音声認識[56, 21, 20],シーケンスの予測 [47], 碁の指し手の選択 [34], 歩行者の検出 [2], 強化学習 [38], そして、その他の領域 [17, 5]。

o それに加えて、しばしばGoogle Brainチームと密接に連携して、Googleと、その他のAlphabetの会社の50以上のチームがDistBeliefを使って、ディープ・ニューラル・ネットワークを、広い範囲の多様な製品に配備してきた。その中には、Google Search [11], 我々の広告製品,我々の音声認識 [50, 6, 46], Google Photos [43],Google Maps と StreetView [19], Google Translate [18], YouTube, その他多くのものが含まれている。

o DistBeliefでの我々の経験と、ニューラル・ネットワークの訓練と利用にとって望ましいシステムの特性と要請のより完全な理解に基づいて、我々は、TensorFlowを構築した。それは、大規模マシン・ラーニング・モデルの実装と配備のための、我々の第二世代のシステムである。TensorFlowは、データフローに似たモデルを利用して記述される計算を使う。そして、それを広い範囲の多様な異なったハードウェア・プラットフォーム上にマップする。その範囲は、AndroidやiOSといったモバイル・デバイス上での推論の実行から、一つあるいは多数のGPUカードを含んだ単一のマシンを利用した中規模の訓練と推論のシステム、さらには、数千のGPUを持つ数百台の特別のマシン上で走る大規模な訓練システムに及んでいる。

o これほどの広い範囲のプラットフォームをまたぐ単一のシステムを持つことは、実世界でのマシン・ラーニング・システムの利用を大幅に単純化する。我々が見いだしたように、大規模な訓練用のシステムと小規模な配備といった別々のシステムを持つことは、メンテナンスに大きな負荷をもたらし、抽象のレベルでも漏れを引き犯しやすいからだ。TensorFlowの計算は、(第2節でもっと詳しく述べるが)状態を持ったデータフロー・グラフで表現される。我々は、システムが、研究目的で新しいモデルを素早く実験するのにも十分柔軟で、また、製品用のマシン・ラーニング・モデルの訓練と配備でも十分に高パフォーマンスで頑健でとなることにフォーカスしてきた。

o ニューラル・ネットワークの訓練を大規模な配備にスケールさせるために、TensorFlowは、データフロー・グラフのコア・モデルのレプリケーションとパラレル実行を行うことで、クライアントが容易に沢山の種類のパラレル処理を表現することを可能にする。そこでは、多くの異なった計算デバイスが全て協調して、共有パラメータ、その他の状態の集合を更新する。計算の記述のあまり大きくない変更で、広い範囲の異なったアプローチのパラレル処理への移行が達成され、少ない労力でそれを試すことが可能になる。 [14, 29, 42].

o TensorFlowのある利用では、パラメーターの更新の整合性に関して、柔軟な対応が可能になる。大規模な配備のある場合には、我々は、こうした同期の条件の緩和を簡単に表現し、その利点を利用できる。 DistBeliefと比較すると、TensorFlowのプログラミング・モデルは、もっと柔軟であり、パフォーマンスははるかに良い。また、広い範囲の多様なヘテロなハードウェア・プラットフォーム上の広いモデルの訓練と利用をサポートしている。

o 我々内部の数十のDistBeliefの利用者は、すでにTensorFlowへの切り替えを終えている。これらの利用者は、研究でも製品でもTensorFlowを信頼している。これらの仕事は、モバイル・フォーンでのコンピュータ・ビジョン・モデルのための推論の実行から、数百のマシンを用い数千億のサンプル・データ上で数千億のパラメーターを持つ大規模なディープ・ニューラル・ネットワークの訓練まで、多岐にわたっている。

o これらのアプリケーションは、特に、マシン・ラーニングとディープ・ニューラル・ネットワークに集中しているのだが、我々は、TensorFlowの抽象が、他の種類のマシン・ラーニング・アルゴリズムや可能的には他の種類の数値計算を含む、他の多様な領域においても有用となることを期待している。我々は、TensorFlow APIと参照実装を 2015年の11月に、Apache 2.0ライセンスの下でオープンソースにしてきた。 www.tensorflow.org から利用可能である。

o この論文の残りの部分では、もっと詳しくTensorFlowについて述べる。第2節は、TensorFlowインターフェースのプログラミング・モデルと基本的なコンセプトについて述べる。第3節は、単一のマシンと分散実装の双方について述べる。第4節は、基本的なプログラミング・モデルの拡張について述べる。第5節は、基本的な実装の 適化について述べる。第6節は、TensorFlowを使った我々の経験を述べる。第7節は、我々が見つけたTensorFlowを使うときに有用なイディオムについて述べる。第9節は、コアのTensorFlowの周辺で我々が構築した補助ツールについて述べる。第10節と第11節は、それぞれ将来と関連した仕事について述べる。第12節は、結論的な考えを提供している。

2. プログラミング・モデルと基本的なコンセプト

p演算とカーネル

pセッション

p変数

o TensorFlow の計算は、ノードの集合からなる有向グラフによって記述される。グラフは、データフロー計算を表現している。ただ、 Naiad [36] と同じようなスタイルで、ある種類のノードにパーシステントな状態の維持と更新を可能とし、また、グラフ内の分岐とループの制御構造を持つように拡張している。

o クライアントは、典型的には、サポートされたフロントエンドの言語(C++ または Python)を利用して計算グラフを構築する。

o Pythonをフロントエンドに使ったTensorFlowグラフの構築と実行のサンプルの一部を図1に示す。図2は、結果としての計算グラフである。

TensorFlowのコードとグラフのサンプルimport tensorflow as tf

b = tf.Variable(tf.zeros([100]))W = tf.Variable(tf.random_uniform([784,100],-1,1))x = tf.placeholder(name=“x”)relu = tf.nn.relu(tf.matmul(W, x) + b)C = [...]

s = tf.Session() for step in xrange(0, 10):

input = ...construct 100-D input array ...result = s.run(C, feed_dict={x: input})print step, result

o TensorFlowグラフでは、それぞれのノードは、ゼロ以上の入力とゼロ以上の出力を持ち、ある演算のインスタンスを表現している。グラフの中で、通常のエッジに沿って(入力から出力へ)流れる値はテンソルである。テンソルは、任意の次元を持つ配列で、それを構成する要素の型は、グラフ作成時に指定されるか推論される。

o コントロール従属と呼ばれる特殊なエッジもグラフの中に存在できる。このエッジに沿ってはどんなデータも流れないが、コントロール従属の出発点のノードは、コントロール従属の終点のノードでの実行が始まる前に実行を終えていなければいけないことを示している。我々のモデルは、複製可能な状態を含んでいるので、コントロール従属は、関係の前に起きるべきことをクライアントが直接に強制するのに利用できる。我々の実装では、次のような場合にもコントロール従属を挿入することがある。例えば、メモリー使用のピークをコントロールする場合に、通常では独立な演算の間に順序を強制するような場合である。

演算とカーネル

o 演算は名前を持っていて抽象的な計算を表現する(例えば、”matrix multiply”や “add”のように)。演算は、属性を持つことができる。この属性は、ノードが演算を実行するようにインスタンス化されるためには、グラフ構築時に与えられるか推論されなければならない。属性の、一つの共通な使い方は、テンソルの異なった要素の型の上に演算がポリモルフィックであるようにすることである(例えば、浮動小数点型の二つのテンソルを加算すると、int32型の二つのテンソルを加算するといった)。

o カーネルは、特別なタイプのデバイス(例えば、CPUかGPUか)の上で実行可能な、特別な演算の実装のことである。TensorFlowのバイナリーは、演算と利用可能なカーネルの集合を、レジストレーションのメカニズムを通じて定義する。この集合は、追加の演算/カーネルの定義/レジストレーションとリンクすることで拡張できる。次のテーブル1は、コアなTensorFlowライブラリーに組み込まれている演算の一部である。

TensorFlow の演算の型o 要素ごとの数学的演算

Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal, ...

o 配列の演算Concat, Slice, Split, Constant, Rank, Shape,Shuffle, ...

o 行列の演算MatMul, MatrixInverse, MatrixDeterminant, ...

o 状態を持つ演算Variable, Assign, AssignAdd, ...

TensorFlow の演算の型o ニューラル・ネットワークの構成要素

SoftMax, Sigmoid, ReLU, Convolution2D,MaxPool, ...

o チェックポイント演算Save, Restore

o キューと同期の演算Enqueue, Dequeue, MutexAcquire,MutexRelease, ...,

o 制御の流れの演算Merge, Switch, Enter, Leave, NextIteration

セッション

o クライアントのプログラムは、セッションを生成することでTensorFlowのシステムと相互作用する。計算グラフを生成するためにセッションのインターフェースは、 Extendメソッドをサポートしている。これによって、セッションによって管理されているグラフに追加のノードやエッジを増やす。(セッションによって生成される、一番 初のグラフは空である)

o セッション・インターフェースによってサポートされている他の重要なオペレーションは、 Runである。Runは、計算される必要のある出力の集合の名前と、ノードのある種の出力の代わりにグラフに与えられるべきオプショナルなテンソルを引数に取る。Runの引数を利用することで、TensorFlowの実装は、要求されている出力を計算するために実行されるべきすべてのノードの推移的クロージャの計算が可能となる。また、その時、その従属性に応じて適切なノードを順番に実行するためのアレンジも可能になる。(詳しくは、3.1で述べる)

o 我々のTensorFlowの利用の大部分では、いったんグラフでセッションをセットアップすると、そのあとは、Runの呼び出しを通じて、グラフ全体あるいは少数の部分グラフを数千ないしは数百万回実行する。

変数

o 大部分の計算では、一つのグラフは複数回実行される。大部分のテンソルは、グラフの一回の実行のあとにはいき残らない。しかし、変数は、グラフの実行を通じて生き残るパーシステントな複製可能なテンソルへのハンドルを返す特別な種類の演算である。これらのパーシステントな複製可能なテンソルへのハンドルは、 AssignやAssignAdd (+=に等しい)といった、参照されたテンソルを複製する少数の特別な演算に渡されることができる。TensorFlowのマシン・ラーニングのアプリケーションでは、そのモデルのパラメーターは、典型的には、変数に保持されたテンソルに格納され、モデルのグラフの訓練のRunの一部として更新される。

3. 実装

3. 実装o デバイス

o テンソル

o 3.1 単一のデバイスでの実行o 3.2 複数のデバイスでの実行o 3.2.1 ノードの配置o 3.2.2 デバイス間のコミュニケーションo 3.3 分散実行o 対障害性

o TensorFlowシステムの主要なコンポーネントはクライアントである。それは、セッション・インターフェースを使ってマスターと、さらに、一つ以上のワーカー・プロセスと通信する。それぞれのワーカー・プロセスは、一つ以上の計算デバイス(CPUコアとかGPUコアといった)へのアクセスの調停とマスターに指示されたデバイス上でのグラフ・ノードの実行に責任を持っている。

o 我々は、ローカル実装と分散実装という、TensorFlowインターフェースの二つの実装を持っている。ローカル実装は、クライアント、マスター、ワーカーがすべて一つのマシン上で一つのOSのプロセスのコンテキストの中で走る。(可能的には、例えば、一つのマシンに沢山のGPUカードがインストールされていて、複数のデバイスの場合もある)。分散実装は、ローカル実装と大部分のコードを共有している。ただし、クライアント、マスター、ワーカーが、すべて異なるマシンの異なるプロセスでありうるような環境をサポートするように拡張されている。

o 我々の分散環境では、これらの異なったタスクは、クラスター・スケジューリング・システム[51]. によって管理されたジョブの中のコンテナーである。これらの異なったモードを次の図3に示す。この節の残りの大部分は、両方の実装にとって共通な問題を議論している。3.3節は、分散実装に特有の問題を議論している。

単一マシンと分散システムの構造

デバイス

o デバイスは、TensorFlowの計算の心臓部分である。それぞれのワーカーは一つ以上のデバイスに責任を持っている。それぞれのデバイスは、デバイスの型と名前を持っている。デバイスの名前は、デバイスの型とワーカーの中でのデバイスのインデックスと、我々の分散設定では、ワーカーのジョブとタスクを指定するものから構成される。(プロセスに対してデバイスがローカルな場合には、localhostが用いられる)デバイス名の例は、次のようになる。"/job:localhost/device:cpu:0" "/job:worker/task:17/device:gpu:3".

o 我々は、CPUとGPUについてのデバイス・インターフェースの実装を持っている。その他のデバイス型についての新しいデバイスの実装は、レジストレーションのメカニズムを通じて与えることができる。それぞれのデバイス・オブジェクトは、デバイスのメモリーの割り当てと解放、TensorFlow実装のより高いレベルで要求される任意のカーネルの実行のアレンジに責任を持っている。

テンソル

o 我々の実装では、テンソルは、型付けられた多次元の配列である。我々は、多様なテンソル要素の型をサポートしている。8bitから64bitのサイズの、符号付・符号なしの整数。IEEEの浮動小数点と倍精度と複素数、文字列型(任意のバイト配列)がある。テンソルの格納場所の適切なサイズは、テンソルが存在するデバイス上で特有のアロケータ−によって管理される。テンソルの格納場所のバッファーは、参照数がカウントされ、参照が残ってないなら解放される。

3.1 単一デバイスでの実行o 初に、一番簡単な実行シナリオ、すなわち、一つのデバイスを持った単一のワーカー・プロセスをを考えてみよう。グラフのノードは、ノード間の従属性を尊重するように、順に実行される。特に、まだ実行されていないノードの従属性の数を、我々は、ノード毎にカウントし追跡している。いったん、このカウントがゼロに落ちると、そのノードは実行に適格とみなされ、準備OKのキューに追加される。この準備キューは、時には特定されない順番で処理されることがある。ノードのデバイス・オブジェクトに対してカーネルの実行が特別に指定されることがあるのだ。ノードは、実行が終わると、終了したノードに依存している全てのノードのノードのカウントを一つ減らす。

3.2 複数のデバイスでの実行o システムが複数デバイスの場合、主に二つほど厄介なことがある。一つは、グラフ上のそれぞれのノードについてどのデバイスを実行配置につかさせるかを決定することであり、もう一つは、その後で、この配置決定によって導かれるデバイスの境界をまたいで要求されるデータ通信を管理することである。

3.2.1 ノードの配置o 計算グラフが与えられた時、TensorFlow実装の主要な責任は、計算を利用可能なデバイスの上に対応づけることである。このアルゴリズムの単純なバージョンを以下に述べる。このアルゴリズムでサポートされた拡張については4.3節を参照のこと。

o 配置アルゴリズムへの一つの入力は、コスト・モデルである。それは、それぞれのグラフ・ノードに対しての入力と出力のサイズ(バイト数での)の評価を含んでいる。さらに、入力テンソルが与えられた時、それぞれのノードに要求される計算時間の評価が行われる。このコスト・モデルは、ある場合には、異なる演算のタイプに関連したヒューリスティックに基づいて静的に評価され、ある場合には、以前のグラフの実行での実際の配置決定の集合に基づいて計測される。

o 配置アルゴリズムは、 初に、そのグラフ実行のシミレーションを走らせる。このシミレーションは以下に述べるが、グラフ中のそれぞれのノードについて、 greedy heuristics を使って一つのデバイスを選択して終わる。このシミレーションで生成された、ノードのデバイスへの配置は、実際の実行での配置でも利用される。

o 配置アルゴリズムは、計算グラフの出発点から始まり、進行につれてシステムのそれぞれのデバイス毎に活動をシミレートする。この横断によって到達されるそれぞれのノードで、可能性のあるデバイスが検討される。(あるデバイスは、もしもそのデバイスで特定の演算を実装したカーネルが提供されていないならば、可能性を持たないことになるかもしれない)。複数の可能性を持つデバイスを持つノードについては、配置アルゴリズムはgreedy heuristic 経験的総当り法を用いる。それは、可能なデバイス全てについて、そのノードに配置した時に、ノードの実行完了時間への影響を検査する。

o この経験的方法は、コスト・モデルから評価あるいは計測されたこのデバイスのタイプの実行時間を考慮に入れる。同時に、他のデバイスから想定されたデバイスに対してこのノードに入力を送るために必要とされる全ての通信コストが含められる。

o ノードの演算が も早く終わるであろうデバイスが、その演算のデバイスとして選ばれる。そして配置のプロセスはグラフの中の他のノードの配置決定へと前進を続ける。その一方で下流のノードたちは、自身のシミレーション実行の準備を整える。4.3節は、ユーザーに配置アルゴリズムを導くヒントや部分的な制約条件を与えることを可能にするいくつかの拡張について述べている。配置アルゴリズムは、システム内で開発が進行中の領域である。

3.2.2 デバイス間通信o いったんノードの配置が計算されると、グラフはデバイスごとに部分グラフの集合に分割される。xからyへの全てのデバイスをまたぐエッジは削除され、xからxの部分グラフ内の新しいSendノードへのエッジに、また、対応するReceiveノードからyの部分グラフ内のyへのエッジに置き換えられる。このグラフの変形については、図4を見てほしい。

Send/Receive ノードの挿入の前後

o 実行時は、SendとReceiveの実装は、デバイス間のデータ転送のために協調して動作する。このことは、SendとReceiveの実装の内部の通信を全て隔離することを可能にし、実行時の他の部分を簡単にする。

o SendとReceiveノードを挿入した時、我々は、特定のデバイス上の特定のテンソルの全ての利用者は、特定のデバイスの下流の利用者ごとに一つのReceiveノードではなく、単一のReceiveノードを利用するように正規化する。このことによって、必要なテンソルのデータは、一度だけ、出発点のデバイスから終点のデバイスのペアに送信されることが保証される。終点のデバイス上のそのテンソルのメモリーは、複数回ではなく一度だけ割り当てられる。(例えば、図4でのノード b, c を見よ)

o こうした仕方で通信をハンドルすることで、異なったデバイス上のグラフの個々のノードのスケジューリングを、ワーカーへと分散化することが可能となる。すなわち、SendとRceiveのノードは、異なったワーカーとデバイス間で必要な同期を自ら行うので、マスターは、それぞれのワーカーに対して、ワーカーがグラフのどんなノードを持っていたとしても、グラフ実行の度に一つのRunリクエストを発行する必要があるだけである。全てのノード間、あるいは、全てのデバイス間の通信のスケジューリングに、マスターが巻き込まれることはない。このことは、システムをもっとスケーラブルなものにし、スケジューリングがマスターによって強制的に行われるよりも、細かな粒度でのノードの実行が可能になる。

3.3 分散実行o グラフの分散実行は、複数のデバイスでの実行に、とてもよく似ている。デバイスの配置後に、デバイスごとに部分グラフが生成される。ワーカープロセスをまたいで通信するSend/Receiveノードのペアは、マシン境界をまたいでデータを移動するのに、TCPまたはRDMAといったリモート通信のメカニズムを利用する。

耐障害性

o 分散実行での失敗は、様々なところで検出が可能である。我々が依拠している主要なものは、(a) SendとReceiveノードペア間での通信の失敗(b) マスタープロセスから全てのワーカープロセスへの定期的な健康チェックである。

o 失敗が検出されると全てのグラフ実行は中断され、 初から処理が始められる。ただし、変数ノードは、グラフの実行をまたいでパーシステントであるので、テンソルを参照していることに注意。

o 我々は、整合的なチェックポイントと再起動時にその状態から回復することをサポートしている。特に、それぞれの変数ノードは、Saveノードに接続されている。これらのSaveノードは、定期的に、例えばN回の繰り返しの後一度とかN分ごとに一度とか、実行される。これが実行されると、変数の内容は、例えば分散ファイルシステムのような、パーシステントなストレージに書き出される。同様に、全ての変数ノードは、再起動後の 初の繰り返しでのみ利用可能なRestoreノードに接続されている。4.2節に、どのようにして、あるノードでグラフのある実行のみが可能になるかについて詳しく触れている。

4 拡張

この節では、2節で導入された基本的なプログラミング・モデルの、さらに進んだいくつかの特徴について述べる。

4 拡張o 4.1 勾配計算o 4.2 部分的な実行o 4.3 デバイスの制約条件o 4.4 制御の流れo 4.5 入力演算o 4.6 キューo 4.7 コンテナー

4.1 勾配計算o 多くの 適化アルゴリズムは、マシン・ラーニングの訓練アルゴリズムでよく使われている確率的な勾配降下法[45]を含めて、入力の集合に対するコスト関数の勾配の計算が行われる。こうした計算へのニーズはとても高いので、TensorFlowでは、自動的な勾配計算を組み込みでサポートしている。もしも、あるTensorFlowのグラフの中のテンソルCが、おそらくは複雑な計算を通じて、あるテンソルの集合{Xk}に従属しているのなら、組み込み関数は{dC/dXk}を返すだろう。勾配テンソルは、他のテンソルと同じように、次のような手続きを持ちいてTensorFlowグラフを拡張することで計算される。

o TensorFlowが、テンソルCの、Cが依存しているあるテンソルIについての勾配を計算する必要があったとしよう。まず 初に、計算グラフの中でIからCへの経路を見つける。それから、CからIへと逆向きに辿る。そしてTensorFlowのグラフに対して、この逆向きの経路上の全ての演算にノードを追加する。チェイン・ルール(結合ルール)を利用して逆向きの経路にそって部分的な勾配を構成する。新しく追加されたノードは、もとの前向きの経路で対応する演算の「勾配関数」を計算する。勾配関数は、いずれかの演算によって登録されているかもしれない。

o この関数は入力として、逆方向の経路に沿ってすでに計算された部分的な勾配を取るだけでなく、オプションとして順方向の演算の入力と出力を取る。図5は、図2の例で、コストに対する勾配を計算している様子を示している。灰色の矢印は、特定の演算については利用されなかった勾配関数へのオプションとして可能な入力を表している。図1に対する追加で必要なことは、次のような勾配を計算することである。

[db,dW,dx] = tf.gradients(C, [b,W,x])

図2のグラフで計算される勾配

o 一般的に、演算は複数の出力を持つ。Cは、それらの幾つかにだけ依存しているのかもしれない。例えば、演算Oは二つの出力 y1とy2を持っていて、Cはy2のみに依存しているとしよう。この時Oの勾配関数への 初の入力は0 にセットされる。なぜなら、dC/dy1 = 0 だから。

o 自動的な勾配計算は、 適化、特にメモリー利用の 適化を複雑なものにする。「前向き」に計算の部分グラフを実行している時、すなわち、それはユーザーによって明示的に構成されたものなのだが、グラフが構成された順序を観察することでどのノードが次に実行されるかを決定するという意味のある経験則は、うまく働かない。

o このことは、一般的には次のことを意味する。一時的な出力は構成されてただちに消費されるので、そのメモリーはすぐに再利用される。経験則が効率的でない時には、ユーザーはグラフの構築の順序を変えたり、第5節で述べるようにコントロール従属を追加できる。勾配ノードが自動的にグラフに追加される時には、ユーザのコントロールは小さいものになり、経験則も効かなくなる。特に、勾配は前向きの計算順序をひっくり返すので、勾配計算の 後のあたりで、グラフの実行で以前に使われていたテンソルが、再び必要になることがしばしば起きる。

o こうしたテンソルは、乏しいGPUのメモリーを大量に押さえて、計算のサイズを不必要に制限する可能性がある。我々は、こうした場合をよりよく扱うことのできる改良のために積極的に働いている。それらには、次のものが含まれている。グラフ実行の順序を決めるもっと洗練された経験則、テンソルをメモリーに保持するのではなく再計算すること、 長生きなテンソルをGPUメモリーからもっと大量にあるホストCPUのメモリーにスワップすること。

4.2 部分的な実行o クライアントは、実行グラフの全体ではなく、部分グラフだけを実行したいことがよくある。これをサポートするために、クライアントがセッションに計算グラフを一度セットアップすれば、Runメソッドが全体のグラフの任意の部分グラフを実行することを可能にする。また、グラフのエッジに沿って任意のデータを挿入できるし、グラフの中のどんなエッジにそって流れるデータも取り出すことができる。

o グラフの中のそれぞれのノードは名前を持っている。そして、ノードのそれぞれの出力は、ソース・ノードの名前と0から番号付けられた出力ポートで同定される。(例えば、”bar:0”は、”bar”ノードの 初の出力を指し、”bar:1”は、二番目の出力を指す。等々。)

o Run呼び出しの二つの引数が、計算グラフの実行されるべき正確な部分グラフを定義するのを助けることができる。第一に、Run呼び出しは、 “name:port”という名前でテンソルの値を与えられたオプショナルなマッピングを、入力として受けつける。第二に、Run呼び出しは、output_namesを受け取る。それは、出力の名前[:port]で指定されたリストで、どのノードが実行されるべきかを示している。もしもport部分が名前にあれば、Run呼び出しが成功裏に終わった時、そのノードの特別な出力テンソルの値がクライアントに返されるべきである。

o グラフは、入力と出力に与えられた値を元に変形される。入力で指定されたnode:portは、feedノードに置き換えられる。それは、Run呼び出しで利用されるRendezvousオブジェクトの特別に初期化されたエントリーから、与えられた入力テンソルをピックアップするだろう。同様に、それぞれのポート付きの出力の名前は、特別のFetchノードに接続される。それは、出力テンソルを保存のために整理して、Run呼び出しが終了した時、クライアントにそれを返す。 終的には、グラフがこれらの特別なfeed, fetchノードの挿入で書き換えられた時、

o 実行するノードの集合は、次のようにして決定される。全ての出力で名前が付けられた全てのノードからスタートして、グラフの従属性を利用してグラフを逆向きに進んで、書き換えられたグラフの中で出力を計算するために、必ず実行されるべきノードの完全な集合を決める。図6は、元のグラフが左側にある。変形されたグラフは、入力=={b} で、出力=={f:0}で、Runが呼び出された時の結果である。我々は、ノードfの出力の計算のみが必要なので、ノードd や e を実行しない。なぜなら、それらはfの出力には寄与していないからである。

4.2 Partial Execution

4.3 デバイスの制約条件o TensorFlowのクライアントは、ノードについて、どのデバイスが実行可能かについての部分的な制約条件を与えることで、デバイス上のノードの配置をコントロールできる。例えば、”このノードは、GPUタイプのデバイス上にのみ置くこと” とか “このノードは、 /job:worker/task:17 内の任意のデバイス上に置くことができる” とか “このノードは、variable13 という名前のノードと同じマシン上に置くこと” 等々。

o こうした制約条件の範囲の中で、配置アルゴリズムはノードのデバイスへの割り当ての選択に責任を持っている。それは、計算の高速な実行を提供し、グラフノードのサブセットを実行するためにデバイス上で必要とされるメモリーの総量を制限するといったような、デバイス自身によって課せられた、様々な制約条件を満たす。

o こうした制約条件を想定することは、3.2.1節で述べた配置アルゴリズムの変更を要求する。我々は、まず、それぞれのノードにとって可能なデバイスの集合を計算し、ついで、グラフのcollocationの制約条件にunion-findのアルゴリズムを使って、一緒に配置されるべきグラフの要素を計算する。こうした要素全てについて、可能なデバイスの集合の共通部分を計算する。ノードごとに計算された可能なデバイスの集合は、容易に、配置アルゴリズムのシミレーターに適合する。

4.4 Control Flowo いかなる明示的な制御の流れの構造を持たないデータフロー・グラフは、非常に表現力が高いのだが、条件式やループがサポートされている方が、もっと簡潔で効率的なマシン・ラーニング・アルゴリズムの表現へと導く多くのケースを観察してきた。

o 多くは、Arvind [3]で記述されたデータフロー・マシンのアプローチと同じように、我々は、プリミティブなコントロール・フローの小さなセットをTensorFlowに導入し、TensorFlowをサイクルを持つグラフもハンドルできるように一般化した。SwitchとMergeの演算は、ブール値を持つテンソルの値に基づいて、ある部分グラフ全体の実行をスキップすることを可能にする。Enter, Leave, NextIteration 演算は、繰り返しを表現することを可能にする。高級言語での、if 条件式や while ループは、こうしたコントロール・フロー演算を持つデータフロー・グラフに、簡単にコンパイルされうる。

o TensorFlow のランタイムは、タグとフレームの概念を実装している。概念的には、 MIT Tagged-Token machine [4] に似ている。ループの繰り返しはタグによってユニークに名前が与えられ、その実行状態はframeで表現される。入力は、それが利用可能になった時いつでも繰り返しに入ることができ、こうして複数の繰り返しがコンカレントに実行されうる。

o TensorFlow は、コントロール・フローを持ったグラフを実行するのに、分散協調メカニズムを利用する。一般的に言って、ループは、沢山のことなったデバイスに割り当てられたノードを含むことができる。それゆえ、ループの状態を管理することは、分散終了検出の問題になる。TensorFlowのソリューションは、グラフの書き換えに基づいている。グラフの分割の間に、我々は自動的にその分割された部分のそれぞれにコントロール・ノードを追加する。これらのノードは、小さな状態マシンを実装していて、それぞれの繰り返しの開始と終了をオーケストレートし、ループの終了を決定する。それぞれの繰り返しで、ループの終了条件を所有するデバイスは、全ての参加しているデバイスに小さなコントロール・メッセージを送る。

o 以上で説明したように、我々は、しばしば、マシン・ラーニング・モデルを勾配降下法で訓練する。そして、勾配の計算をデータフロー計算の一部として表現する。モデルがコントロール演算を含む時、我々はモデルに対応する勾配計算について説明する必要がある。例えば、if条件式を持ったモデルは、この分岐に勾配のロジックを適用する時に、条件のどの分岐が取られたかを知る必要がある。同様に、While-loopを持ったモデルの勾配計算では、何回の繰り返しが行われたかを知る必要があり、これらの繰り返しの間に計算された中間の値にも依拠する必要がある。基本的なテクニックは、グラフを書き換えて勾配計算に必要な値を記憶することである。この幾分複雑なコードの詳細については割愛した。

4.5 入力演算o 計算への入力データは、feedノードによって与えられるのだが、大規模なマシン・ラーニング・モデルの訓練で、よく用いられるもう一つのメカニズムは、グラフの中に、特別な入力演算ノードを持つことである。それは典型的にはファイル名の集合で設定されて、それが実行されるたびにファイルの集合に格納されたデータから、一つまたはそれ以上のサンプルを含んだテンソルを生み出す。このことで、配下のストレージ・システムから、直接にマシンのメモリーにデータを読み込むことが可能になる。マシンは、引き続いて、そのデータ上で処理を実行する。

o 設定の段階では、クライアントのプロセスはワーカーのプロセスから切り離されている。もしもデータが与えられた時には、典型的には、余分なネットワークのホップが必要になるかもしれない。(ストレージ・システムからクライアントへ、クライアントからワーカーへ。それに対して、入力ノードを使う場合には、ストレージ・システムから、直接、ワーカーにいく)

4.6 キューo キューは、我々がTensorFlowに追加した、有用な特徴である。それは、グラフのことなった部分を、非同期に実行することを可能にする。可能的には、ことなったリズムでの実行も。また、Enqueue, Dequeue演算を通じてデータを手放すことも可能である。 Enqueue 演算は、キューの中でスペースが利用可能になるまでブロックされ、Dequeue 演算では、キューの中で期待される際少数の要素が利用可能になるまでブロックされる。

o キューの一つの使い方は、以前に投入されたバッチ・データが、マシン・ラーニング・モデルの一部で、引き続き処理中であっても、入力データのディスク・ファイルからの先読みを可能にすることである。 キューはまた、大規模なバッ

チ処理で、より複雑な勾配の組み合わせを計算するために、たくさんの勾配を蓄積するような、データのグルーピングにも、リカレント言語モデルで、様々に異なった入力文を、処理を効率的に行うために、ほぼ同じ長さの文をまとめてグルーピングするさいの置き場としても利用される。

o 通常のFIFOキューに加えて、我々は、シャフリング・キューも実装した。これは、その要素を大きなメモリー上のバッファーでランダムにシャッフルするものである。このシャフリングの機能は、マシン・ラーニングのアルゴリズムにとって、例えば、サンプルを処理する際にその順序をランダムに変えたい時に役に立つ。

4.7 コンテナーo コンテナーは、TensorFlowの内部で長時間にわたって生き続ける複製可能な状態を管理するためのメカニズムである。Variableの保存場所は、コンテナーの中にある。デフォールトのコンテナーは、プロセスが終了するまで永続する。ただ、我々は、他の名前を持つコンテナーも認めている。

o コンテナーは、その内容を完全にクリアすることでリセットされうる。コンテナーを使うことで、異なるセッションに関連付けられた完全に分離されている計算グラフをまたいでさえも、状態を共有することは可能である。

5 適化

この節では、パフォーマンスとシステムのリソースの利用を改善する、TensorFlow実装での幾つかの適化について述べる。

5 適化

o 5.1 共通の部分表現の削除o 5.2 データ通信とメモリー使用をコントロールするo 5.3 非同期カーネルo 5.4 カーネル実装での 適化ライブラリー

o 5.5 損失のある圧縮

5.1 共通の部分表現の削除o 計算グラフの構築は、クライアント・コードでは、多くの異なった抽象のレイヤーで行われるので、計算グラフは、容易に同じ計算の冗長なコピーを含むことになる。この問題をハンドルするために、 Click [12] で記述されたのと似たアルゴリズム、共通部分表現パスを実装した。これは、計算グラフ上で走って、同じ入力と同じ演算の型を持つ複数の演算のコピーを、ただ一つに正規化する。そして、この正規化を反映するように、エッジを適切にリダイレクトする。

5.2 データ通信とメモリー使用をコントロールする

o TensorFlow演算の注意深いスケジューリングは、特にデータ転送とメモリー利用に関しては、システムのより良いパフォーマンスに結果する。特に、スケジューリングはその間、演算間の中間結果がメモリーに保持される時間枠と、それゆえ、ピーク時のメモリー消費をを削減できる。この削減は、メモリーが乏しいGPUデバイスでは特に重要である。さらに、デバイスをまたいだデータ通信の協調はネットワーク・リソースにとって、衝突を削減する。

o スケジューリングの 適化には多くの好機があるのだが、ここでは我々は、特に必要で効果的なものであると我々が見出したものにフォーカスする。それは、リモートの値を読むReceiveノードのスケジューリングに関係している。もし、何も事前の警告がなかったとすると、これらのノードは、必要になるずっと前から開始される。可能的には実行がスタートした時に一斉に。 ORの世界ではよく知られている、可能な限り限り早く,可能な限り遅くという(ASAP/ALAP) 計算を実行した。我々は、いつReceiveノードをスタートさせるべきかを評価するためにグラフのクリティカルな経路を分析した。その後、その結果が必要になるその直前までこれらのノードのスタートを遅らせるという狙いをもって、コントロール・エッジを挿入した。

5.3 非同期カーネルo Computeメソッドの 後に実行を終了させる、通常の同

期型のカーネルに加えて、我々のフレームワークは、ブロックしないカーネルもサポートしている。こうしたノンブロッキングなカーネルは、 Computeメソッドは、カーネルの実行が終わった時に起動すべきcontinuationを渡されるという点で、少し違ったインターフェースを利用している。これは、沢山のアクティブなスレッドが走っていて、メモリーの使用やその他のリソースの点で、比較的に高価である環境への 適化である。これによって、IOや他のイベントが起きるのをひたすら待つ間、実行スレッドを際限のない時間、縛り付けるのを避けることを可能にする。

o 非同期カーネルの例としては、Receive カーネルとEnqueue, Dequeue カーネルがある。 (もし、キューのスペースに空きがない場合や、読まれるべきデータがない場合には、ブロックする必要があるのだが)

5.4 カーネル実装の 適化ライブラリー

o 我々は、ある演算のカーネルについては、既存の高度に適化された数値計算ライブラリーを、しばしば利用している。例えば、異なったデバイス上で行列の掛け算を行う適化されたライブラリーは多数存在している。 BLAS

[15], cuBLAS [39] がある。ディープ・ニューラル・ネットワークでのコンボリューションの為のGPUライブラリーとしては、 cuda-convnet [28] や cuDNN [9] がある。我々のカーネル実装の多くは、こうした 適化されたライブラリーへの比較的薄い層からなるラッパーである。

o 我々は、システムのカーネル実装の多くで、オープンソースの Eigen linear algebra library [25]を、かなり積極的に利用している。TensorFlow開発の一部として、我々のチームは( Benoit Steinerを中心とする)、オープンソースのEigenライブラリーを、任意の次元のテンソル操作をサポートするように拡張してきた。

5.5 損失のある圧縮o 幾つかのマシン・ラーニング・アルゴリズムは、典型的には、ニューラル・ネットワークを訓練する為に利用されるのだが、ノイズや計算精度の低下に耐性を持っている。DistBelief system [14] と同じようなやり方で、我々は、デバイス間でデータを送る時(時には同じマシン内でも。ただ、本質的に重要なのは、マシン境界越える時なのだが)、高い精度の内部での表現に損失のある圧縮をかけて利用した。

o 例えば、我々は、32bit浮動小数点表現を16bit浮動小数点表現に変換する特別の変換ノードを、しばしば挿入した。(IEEEで提案されている16bit浮動小数点の標準ではなく、 32-bit IEEE 794 で、少数部分が16bit少ないもの) そして通信チャンネルの反対側では、元の32bitに戻される。(小数部分の失われた部分に0を詰めるだけだ。というのも、32 → 16 → 32bitの変換を行う時に、数学的に正しい確率的な丸め込みを行うよりも、このやり方のほうが、計算的には安上がりだからだ)

6 現状と経験

o TensorFlowのインターフェースと参照実装は、Apache 2.0ライセンスの元でオープンソース化されてきた。このシステムは、 www.tensorflow.orgからダウンロード可能である。このシステムは詳細なドキュメントと沢山のチュートリアルと、多様な異なったマシン・ラーニングの仕事で、どのようにこのシステムを利用するのかを示す沢山のデモのサンプルを含んでいる。サンプルには、MNISTデータセットから手書き数字を分類するモデル(マシン・ラーニング・アルゴリズムの“hello world”だ) [32]、CIFAR- 10 データセットから画像を分類するもの [30]、recurrent LSTM [22] ネットワークを使って言語モデルを作るもの、語のベクトル空間への埋め込みを行うものなどが含まれている。

o システムは、TensorFlowの計算を、PythonとC++で指定するフロントエンドを含んでいる。我々は、時間が経つにつれ、Google内部のユーザーとより広いオープンソース・コミュニティの双方の願いに応えて、他のフロントエンドが追加されることを期待している。

o 我々の以前のDistBelief システム [14] では、ごく少数のマシン・ラーニング・モデルを持つだけだった。われわれはそれをTensorFlowに移植した。この節の残りの部分は、我々が学んだ教訓について述べようと思う。こうしたマシン・ラーニング・モデルの一つのシステムから他のシステムへの移植の教訓は一般化可能なもので、それゆえ、他の人たちにとっても価値があるだろう。

o 特に、我々は、 Inception [23]と名付けられた、 先端

の画像認識の為のコンボリューション・ニューラル・ネットワーク移植の教訓にフォーカスする。この画像認識のシステムは、224 x 224 ピクセルのイメージを1000のラベル(例えば、 “cheetah”, “garbage truck”といった)の中の一つに分類する。こうしたモデルは、1,360万の学習可能なパラメーターと、TensorFlowのグラフで表現した時、36,000個の演算ノードからなる。一つの画像について推論するのに、20億回の掛け算・足し算が必要になる。

o TensorFlowで、すべての必要な数学的演算を構築した後で、その36,000個すべての演算を正しいグラフ構造へと組み合わせ、デバッグするのは、チャレンジングであることが証明された。システムの正しさを検証するのは難しい事業である。なぜなら、このシステムは本質的に確率的であり、我々は、システムが、潜在的な可能性としては数時間もの計算のあとで、ある種の仕方で期待にそうように振る舞うこと意図しているだけだからである。これらの環境のもとで、我々は、次のような戦略がInceptionモデルのTensorFlowへの移植では本質的に重要であることを見出した。

o 1. 与えられたモデルのパラメーターの数の正確な洞察が得られるツールを構築すること。このようなツールは、 複雑なネットワーク・アーキテクチャの仕様のもとでは、微妙な欠陥があることが示された。特に、次元を超えた数学的演算では自動的にブロードキャストが行われるせいで、我々は、演算とインスタンス化された変数とを誤って同じものとみなすことができてしまった。

o 2. 小さくスタートして、スケールアップする。我々が、以前のシステムから 初に移植したのは、 CIFAR-10 データセット [30]上の小さなネットワークであった。こうした小さなネットワークをデバッグすることは、もっと複雑なモデルでは、実践的には解読できないものであったマシン・ラーニング・システムの内部で、個別の演算(例えば、max-pooling)の微妙で特徴的なケースを明確にする。

o 3. マシン・ラーニング・システムの間で、学習がなされていない時に、常に目的とするもの(損失関数)が一致することを保証すること。学習率をゼロにすることは、モデルの中ではいかにランダムに変数を初期化していたとしても、予期せぬ振る舞いを同定することを助ける。こうしたエラーは、動的な訓練ネットワークの中では、見つけるのが難しい。

o 4. 分散実装のデバッグの前に、単一マシンでの実装が、一致するようにすること。この戦略はマシン・ラーニング・システム間の訓練パフォーマンスの不一致を明確に記述しデバッグするのを助けた。特に、競合する条件とアトミックでない演算を誤ってアトミックであるとみなしたことに起因するバグを同定した。

o 5. 数値計算のエラーからシステムを守ること。数値計算ライブラリーは、いかにそれが有限ではない浮動小数点の値を扱ったとしても、矛盾を含む。コンボリューション・ニューラル・ネットワークは、特に、数値の不安定性に敏感である。そして、実験・デバッグのフェーズで、きわめて規則的に発散する傾向を持つ。非有限な浮動小数点値をチェックすることで、こうした振る舞いからシステムを守ることは、後になって発散の振る舞いを発見するのにたいして、リアルタイムにエラーを検出することを可能にする。

o 6. ネットワークの諸部分を解析して、数値エラーの大きさを理解すること。ニューラル・ネットワークのいくつかの断片を二つのマシン・ラーニング・システムでパラレルに走らせることは、二つのシステム間で数値アルゴリズムが同一であることを保証する正確な方法を提供する。こうしたアルゴリズムが、浮動小数点の精度で実行されたとしよう。与えられたコンポーネントが正しく実装されているかを判断するために、期待される数値エラーの大きさを予想し理解することは重要である。(例えば、「1e-2 以内だ。すごいぞ!」と 「1e-2以内だ。なんでこんなに不正確なんだろう?」 とを区別すること)

o 本質的に確率的なシステムを目の前にしながら、複雑な数学的演算の検証を行うのは、本当にチャレンジングなことである。以上で述べた戦略は、システムの中で、本質的には、InceptionモデルをTensorFlowにインスタンス化する中で確信をえた貴重なものだと証明されたものだ。こうした努力の 終結果は、同じモデルの既存のDistBeliefでの実装に対して、訓練時間の6倍の改善として結実した。こうしたスピードの獲得は、さらに大きな画像認識モデルの新しいクラスでの訓練にとって、欠くべからざるものであることが証明された。

7 よく使われるプログラミング・イディオム

pデータ・パラレルな訓練

pモデル・パラレルな訓練

pモデル計算のパイプラインのための並行ステップ

o TensorFlowの基本的なデータフロー・グラフ・モデルは、マシン・ラーニング・アプリケーションで多様な方法で利用されうる。我々が関心を持つ一つの領域は、大規模なデータセット上での多くの計算が必要とされるニューラル・ネットワーク・モデルの訓練のスピードアップである。この節では、スピードアップを達成するために、我々や他の人たちが開発してきたいくつかのテクニックについて述べ、こうした様々のアプローチを実現するために、どのようにTensorFlowを利用するかを示す。

o 以下のサブセクションでは、モデルは確率的勾配降下法(SGD)を用いて訓練され、ミニバッチが100から1000の比較的中程度のものと装蹄している。

データ・パラレルな訓練

o SGDをスピードアップする も単純なテクニックは、ミニ

バッチ要素間をまたぐミニバッチの勾配計算をパラレル化することである。例えば、1000要素のサイズのミニバッチを使っていたとすると、モデルの10個のレプリカを使って、その各々に100要素の勾配を計算させることができる。その後、あたかも、1000要素のサイズのバッチを持つシーケンシャルなSDGアルゴリズムの実行のように正確に振る舞うために勾配を結合して、パラメーターを同期して更新をかける。この場合では、TensorFlowのグラフは、単純に、グラフの一部がたくさんのレプリカを持つだけである。それが、大量のモデル計算を行う。この大規模なグラフの訓練用のループ全体をクライアントの単一のスレッドがドライブしている。図7の上の図が、これを図示している。

同期型と非同期型のデータ・パラレルな訓練

o TensorFlowのグラフが、多数の部分グラフのレプリカを持ち、それが大量のモデル計算をおこなうというこのアプローチは、これらのレプリカの一つ一つが、モデルのパラメーター更新も非同期に行うことで、非同期に行われることも可能である。こうした設定では、それぞれのグラフのレプリカに、一つのクライアントのスレッドがあることになる。これは、図7の下の図で示されている。この非同期なアプローチは、 [14]でも述べられていた。

モデル・パラレルな訓練

o モデル・パラレルな訓練では、モデルの異なった部分の計算が、サンプルの同じバッチのために、異なる計算デバイス上で同時に行われる。これも、容易にTensorFlowで表現できる。図8は、シーケンスからシーケンスの学習に使われるリカレントでディープなLSTMモデル([47])が、三つの異なるデバイス上でパラレルに実行される様子を示している。

モデル・パラレルな訓練

モデル計算のパイプラインのための並行ステップ

o ディープ・ニューラル・ネットワークの訓練で、もっと性能を引き出すためによく使われるもう一つの別の手法は、同じデバイス内で、モデルの計算をパイプライン化することである。同じデバイスのセットの内部で、複数の少数の並行ステップを走らせる。図9にその様子を示す。これは、どこか非同期のデータ・パラレル処理に似ている。異なったデバイス上に計算グラフのレプリカを作るのではなく、同じデバイス上でパラレル計算が行われることを除いては。このアプローチは、サンプルの単一のバッチの計算では、この単一のステップの間に、すべてのデバイスをすべての時間完全に使い切ることができない場合、「タイルの隙間を埋める」ことを可能にする。

Concurrent steps

8 パフォーマンス

このホワイトペーパーの将来のバージョンでは、単一マシンと分散実装の双方での、包括的な性能評価を行うことになるだろう。

9 ツール

このセクションは、コアなTensorFlowグラフ実行エンジンの間近にいた我々が開発してきたいくつかのツールについて述べる。

9 ツールp 9.1 TensorBoard:グラフ構造の可視化

と統計情報のサマリー

p 計算グラフの可視化

p サマリーデータの可視化

p 9.2 トレースのパフォーマンス

9.1 TensorBoard: TensorBoard:グラフ構造の可視化と統計情報のサマリー

o ユーザーが計算グラフの構造を理解するのを助け、また、マシン・ラーニング・モデルの全体の振る舞いを理解するのを助けるために、我々は、TensorFlowのために、コンパニオンとして可視化ツールTensorBoard を開発してきた。それは、オープンソースのリリースに含まれている。

計算グラフの可視化

o ディープ・ニューラル・ネットワークの計算グラフは、きわめて複雑なものになりうる。例えば、GoogleのInceptionモデル[48]に似た訓練用の計算グラフは、ディープ・コンボリューション・ニューラル・ネットワークで、2014年のコンテストで 高の分類パフォーマンスを示したのだが、TensorFlowの計算グラフでは、36,000個以上のノードを持っている。そして、言語モデルのためのディープ・リカレントLSTMモデルは、15,000以上のノードを持っている。

o これらのグラフのサイズとトポロジーのおかげで、素朴な可視化テクニックでは、ごちゃごちゃした圧倒的に多い図式が得られるだけである。ユーザーが背後にあるグラフの組織を見ることを助けるために、TensorBordのアルゴリズムは、同一の構造を持ったものをグループとして注目して、ノードたちをハイレベルのブロックに分解する。このシステムは、同時に、高次元の働きをする、多くは簿記的な役割を果たしているのだが、そうしたノードを切り出して、スクリーンの別な領域に表示する。そうすることで、みてくれをすっきりしたものにし、計算グラフの中核的な部分に注意をフォーカスさせる。

o 可視化全体は、インタラクティブである。ユーザーは、左右に移動したり、拡大したり、グループ化されたノードを、その細部がわかるように拡大できる。ディープ・コンボリューション・イメージ・モデルの例が、図10に示されている。

9.1 TensorBoard: Visualization of graph structures and summary statistics

サマリー・データの可視化

o マシン・ラーニング・モデルを訓練するとき、ユーザーは、しばしばモデルの様々な側面の状態を調べることができればと望む。そしてこの状態が時間とともにどのように変化するのかを知りたいと思う。この目的のためにTensorFlowは、グラフの中に挿入できる一群の異なったSummary操作をサポートしている。これらには、スカラー・サマリー(モデルのすべての特性、例えば、サンプルの集合を通じた損失関数の平均値、あるいは、計算グラフの実行にかかった時間等々のすべての特性について調べるもの)、ヒストグラム・ベースのサマリー(例えば、ニューラル・ネットワーク層での重みの分布とか)、イメージベースのサマリー(例えば、コンボリューション・ニューラル・ネットワークで学習されたフィルターの重みの可視化とか)が含まれている。

o 典型的な計算グラフは、様々な興味ある値をモニターするために、サマリー・ノードが含まれるようにセットアップされている。そして、訓練グラフの実行時には、ほとんど常に、サマリー・ノードの集合も実行される。それに加えて、実行されている通常のノードも、クライアントのドライバー・プログラムも、訓練モデルに関連付けられたログファイルに、サマリーデータを書き出している。

o TensorBoard のプログラムは、新しいサマリー・データのために、このログファイルを監視するように設定される。そして、このサマリー情報と時間につれてそれがどのように変化したかを表示することができる。(「時間」と言ったが、「時間」の測り方を選ぶ能力は持っていて、”time”というのは、TensorFlowプログラムの実行開始からの相対的な時計上の時間、すなわち、絶対時間で、”step”というのは、TensorFlowのプログラム開始から起きたグラフの実行数の数値的な測定のことである。)TensolBoardのサマリー値の可視化のスクリーン・ショットは、図11に示されている。

モデルの時系列データの統計量のサマリーのTensorFlowでのグラフィックな表示

9.2 パフォーマンスをトレースするo 我々は、また、EEG(2015年11月のオープンソース版には含まれていない)という内部ツールを持っている。我々はそれをTensorFlowグラフ実行の、正確な順序とパホーマンスの特徴について非常に細かい精度での情報を集め可視化するのに利用している。このツールは、単一マシンでも分散実装でもその両方で動き、TensorFlowプログラムの計算のボトルネックと通信パターンを理解するのに、非常に役立っている。

o トレースは、システムのそれぞれのマシンから多様なソースで、同時に収集される。Linuxカーネルの ftrace、我々独自の軽量スレッドでのトレース・ツール、そしてCUDA Profiling Tools Interface (CUPTI)がある。こAのれらのログがあることで、分散訓練の実行ステップを、スレッドの切り替え、CUDAのカーネルの起動、DMA操作といった詳細をすべてマイクロ秒レベルの精度で再構築できる。

o トレースは、可視化のサーバーに結合される。サーバーは、指定された時間範囲のイベントを急速に抽出して、ユーザー・インターフェースの解像度に合わせた適切な詳細さのレベルでそれを可視化する。通信、同期、GPUの停止に起因するどんな重要な遅れも同定され、ハイライトされた矢印を使って、ビジュアルに表示される。 初には、UIはトレース全体のオーバービューを与える。そこでは、も重要なパフォーマンス問題がハイライトされるだけだ。ユーザーが、積極的に画面を拡大するにつれて、細かな精度での詳細が描画される。

o 図 12 は、マルチコアCPUプラットフォームで訓練されているモデルのEEG可視化のサンプルである。スクリーンショットの上1/3は、データフローの制約条件に従って、パラレルに起動されたTensorFlowの演算を表示している。トレースの下の部分は、いかに多くの演算が、スレッド・プールの中でコンカレントに実行される複数の作業アイテムに分解されているかを示す。右手の診断矢印のサイズは、スレッド・プールの中のどこで、キューイングの遅れが生まれているかを示している。雨13は、主要にGPU上で起きる計算のEEGによる、別の可視化の例である。

マルチ・スレッド化されたCPU演算のEEG による可視化(x軸は秒での時間)

CPUとGPUの活動を示したInceptionの訓練のEEGでの可視化

o ホストのスレッドは、実行可能になるとTensorFlow GPU 演算をキューに入れているのを見ることができる。(薄い青が、スレッド・プールである) 黒地の管理スレッドが、他の色でプロセッサーのコアをまたいで移されているのを見ることができる。もう一度言うと、矢印はGPUからCPUへの転送が固まっていることを示している。すなわち、演算が重要なキューイングの遅れにあっていることを示している。

o 終的には、図14が、TensorFlowのGPU演算が、どのようにして複数のGPUのストリームに割り当てられているかを調べることを可能にする、もっと詳細なビューである。データフローのグラフがパラレルな実行あるいはデータ転送を許される場合はいつでも、ストリームとストリームの従属性のプリミティブを用いて、我々は努めてGPUデバイスに対する順序の制約条件を明らかにするよう試みる。

マルチ・ストリームのGPUの実行

10 将来の仕事

o 我々は、将来の仕事について、幾つかの異なった方向を持っている。我々は、人工知能のための新しい興味ふかいモデルを開発するために、TensorFlowを使い続けるであろう。そして、これを行っている過程で、基本的なTensorFlowシステムを拡張する必要があるようなものを発見するかもしれない。オープンソースのコミュニティも、TensorFlowの実装にとって、新しい興味ふかい方向を見つけるかもしれない。

o 我々が考えている基本的なプログラミング・モデルの一つの拡張は、関数のメカニズムである。それによって、ユーザは、TensorFlow計算のすべての部分グラフを、再利用可能なコンポーネントとして指定できるような。実装では、我々は、TensorFlowの異なったフロントエンド言語をまたいでも、これらの関数を再利用可能なコンポーネントとなるようにデザインしてきた。だから、ユーザーはPythonのフロントエンドを使ってある関数を定義し、そのあとでその関数をC++フロントエンドの中で、基本的な構成要素として利用できるのだ。こうした言語間の再利用性は、マシン・ラーニングの研究者の生き生きしたコミュニティを加速していくだろうという希望を我々は持っている。研究者は研究のすべてのサンプルを公開しなくても、彼らの仕事から再利用可能なコンポーネントを公開すれば、他のコンテキストで、それが再利用されることになるのだから。

o 我々はまた、TensorFlowのパフォーマンスを改善する、たくさんの具体的な方向を持っている。我々のこうした方向の一つは、TensorFlow実行の部分グラフを一つとって、おそらくは、テンソルの典型的なサイズや形の情報をもった実行時のプロファイルを使って、この部分グラフ用の 適化されたルーティンを生成する、just-in-timeのコンパイラーへの我々の 初の取り組みである。このコンパイラーは、ループの融合やブロッキングや局所性のためのタイリング、特定の形やサイズへの特殊化等々、多数の 適化を実行するためのセマンティックスを理解するだろう。

o 我々はまた、将来の仕事の重要な領域は、配置とノードのスケジューリングのアルゴリズムの改良になるだろうと想像している。そのアルゴリズムは、どこで、異なったノードが実行され、いつ、それが実行を始めるか決定するのに利用される。我々は、現在、これらのサブシステムについて、多くの経験則を実装している。我々は、学ぶのではなく、よい配置の決定を行うマシンを持ちたいと望んでいる。(おそらくは、対象とする関数の強化学習と結び付けられた、ディープ・ニューラル・ネットワークを使って。)

11 関連した仕事

o TensorFlowと様々な点で比較できる多くの他のシステムが存在する。Theano [7], Torch [13], Caffe [26],Chainer [49], Computational Network Toolkit [54] 。これらは、第一義的にニューラル・ネットワークの訓練のためにデザインされたいくつかのシステムである。これらのシステムは、TensorFlowの実装とは異なって、計算を単一のマシン上にマップする。TheanoとChainerと同じように、TensorFlowは, シンボルの微分をサポートする。このことは、勾配ベースの 適化アルゴリズムの定義と利用を容易にする。

o Caffemのように、TensorFlow は、C++で書かれたコアを持っている。それは、訓練されたモデルを広い範囲の多様な製品、モバイル・デバイスのようなメモリーや計算の環境が制約の多い設定の元でも、配備するのを簡単にする。

o TensorFlowシステムは、幾つかのデザインの特徴を先行したシステムであるDistBelief [14] と共有している。後者のシステムは、Project Adam [10]やParameter Server project [33]とも似たデザインをしている。DistBeliefやProject Adamのように、TensorFlowは、計算をたくさんのマシン上のたくさんの計算デバイスに拡散することを可能とする。ユーザーは、マシン・ラーニング・モデルを、比較的高水準の記述を使って指定することが可能になる。

o ただし、DistBelief やProject Adamとは違って、TensorFlowの汎用目的の,データフロー・グラフ・モデルは、もっと柔軟で、もっと広い範囲の多様なマシン・ラーニング・モデルと 適化アルゴリズムを表現するのに向いている。 それはまた、状態を持つパラメータ・ノードの表現を

変数とみなし、変数の更新演算をグラフへのノードの追加と考えることで、重要な単純化を成し遂げた。それに対して、DistBeliefやProject AdamやParameter Server systemsでは、すべては分離されたパラメーター・サーバーが、もっぱら、パラメータの値の通信と更新にあたっている。

o イメージ・プロセッシングのパイプラインの表現のためのHalide system [40]も、TensorFlowのデータフロー・グラフと似た、中間表現を利用している。しかし、TensorFlowとは異なって、Halide systemは、実際には、演算のセマンティックについての高レベルな知識を持ち、この知識を利用して、並列性と局所性を考慮しながら、複数の演算を結合した高度に 適化されたコードを生成している。 Halideは、結果としての計算を単一のマシン上のみで走らせており、分散の設定では走らせていない。将来的には、我々は、TensorFlowを、演算をまたいだ動的なコンパイルのフレームワークをもったものに拡張したいと望んでいる。

o TensorFlowと同じように、クラスターをまたいだデータフロー・グラフの実行を行う、いくつかの他の分散システムが開発されてきた。Dryad [24] と Flume [8] は、いかにして、複雑なワークフローがデータフロー・グラフとして表現されうるかを示している。CIEL [37] と Naiad [36]は、データ従属コントロール・フローの一般的なサポートを導入した。CIELは、繰り返しを、動的に広げられるDAGとして表現し、一方、 Naiad は、低い遅延での繰り返しをサポートするために、サイクルを持つ静的なグラフを利用する。

o Spark [55] は、以前の計算出力のsoft-stateキャッシュである“resilient distributed datasets” (RDDs)を利用して、同じデータに繰り返しアクセスする計算に適化されている。Dandelion [44]は、GPUを含むヘテロなデバイスのクラスターをまたいで、データフロー・グラフを実行する。

o TensorFlowは、これらのシステムのからの諸要素を借用したハイブリッドなデータフロー・モデルを使っている。そのデータフローの、次に実行されるべきノードを選択するコンポーネントであるスケジューラーは、 Dryad, Flume, CIEL, Sparkと同じ基本的なアルゴリズムを利用している。

o TensorFlowの分散アーキテクチャーは、システムが単一の 適化されたデータフロー・グラフを、全体の計算を表現するのに利用し、このグラフについての情報を協調のオーバーヘッドを 小化するために、それぞれのデバイス上にキャッシュしている点で、 Naiad に も近い。SparkやNaiadと同じように、TensorFlowは、クラスターの中に計算の作業セットを保持する十分なRAMがあるときに、 もよく働く。

o TensorFlowでの繰り返しは、ハイブリッドなアプローチを使っている。同じデータフロー・グラフの複数のレプリカは、同じ変数の集合を共有しながら、同時に実行されるだろう。レプリカは、変数を通じて、非同期にデータの共有ができるし、あるいは、演算を同期させるのに、キューのようなグラフの同期メカニズムを利用することもできる。TensorFlowはまた、グラフ内の繰り返しをサポートしている。これは、CIELとNaiadのハイブリッドである。単純化のため、それぞれのノードは、その入力がすべて準備できたときに発火する(CIELのように)、しかし、効率性のために、そのグラフは静的でサイクリックなデータフローとして表現される(Niadのように)。

12 結論

o 我々は、TensorFlowを、柔軟なデータフロー・ベースのプログラミング・モデルとして述べてきた。また、単一マシンでも分散実装でも、このプログラミング・モデルは動くことも。このシステムは、先導的な研究と、Googleの製品とサービスの広い範囲の百以上のマシン・ラーニングのプロジェクトにそれを配備した実世界の経験から生まれた。我々は、オープンソース・バージョンのTensorFlowがある。生き生きとした共有されたコミュニティがTensorFlowの利用の周辺で育っていくことを望んでいる。我々は、Googleの外にいる人たちが、どのように自分の仕事でTensorFlowを使うかを見ることに、興奮している。

参考資料

o [1] Mart´ın Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo, Zhifeng Chen, Craig Citro, Greg S. Corrado, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghe-mawat, Ian Goodfellow, Andrew Harp, Geoffrey Irv- ing, Michael Isard, Yangqing Jia, Rafal Jozefowicz, Lukasz Kaiser, Manjunath Kudlur, Josh Levenberg, Dan Mane´, Rajat Monga, Sherry Moore, Derek Murray, Chris Olah, Mike Schuster, Jonathon Shlens, Benoit Steiner, IlyaSutskever, Kunal Talwar, Paul Tucker, Vincent Vanhoucke, Vijay Vasudevan, Fernanda Vie´gas, OriolVinyals, Pete Warden, Martin Wattenberg, Martin Wicke, Yuan Yu, and Xiaoqiang Zheng. TensorFlow: Large-scale machine learning on heterogeneous systems, 2015. Soft- ware available from tensorflow.org.

o [2] Anelia Angelova, Alex Krizhevsky, and Vincent Van-houcke. Pedestrian detection with a large-field-of-view deep network. In Robotics and Automation (ICRA), 2015 IEEE International Conference on, pages 704–711. IEEE, 2015. CalTech PDF.

o [3] Arvind and David E. Culler. Annual review of computer science vol. 1, 1986. chapterDataflow Architectures, pages 225–253. 1986. www.dtic.mil/cgi-bin/GetTRDoc?Location=U2&doc=GetTRDoc.pdf&AD=ADA166235.

o [4] Arvind and Rishiyur S. Nikhil. Executing a pro-gram on the MIT tagged-token dataflow architec- ture. IEEE Trans. Comput., 39(3):300–318, 1990. dl.acm.org/citation.cfm?id=78583.

o [5] Jimmy Ba, Volodymyr Mnih, and Koray Kavukcuoglu. Multiple object recognition with visual atten- tion.

arXiv preprint arXiv:1412.7755, 2014. arxiv.org/abs/1412.7755.

o [6] Franc¸oise Beaufays. Theneural networks behind GoogleVoicetranscription, 2015.

googleresearch.blogspot.com/2015/08/the-neural-networks-behind-google-voice.html.

o [7] James Bergstra, Olivier Breuleux, Fre´de´ric Bastien, Pas- cal Lamblin, Razvan Pascanu, Guillaume Desjardins, Joseph Turian, David Warde-Farley, and Yoshua Bengio. Theano: A CPU and GPU math expression compiler. In Proceedings of the Python for scientific computing con-ference (SciPy), volume 4, page 3. Austin, TX, 2010. UMontreal PDF.

o [8] Craig Chambers, Ashish Raniwala, Frances Perry, Stephen Adams, Robert R Henry, Robert Bradshaw, and Nathan Weizenbaum. FlumeJava: easy, effi-cient data-parallel pipelines. In ACM Sigplan No- tices, volume 45, pages 363–375. ACM, 2010. re-search.google.com/pubs/archive/35650.pdf.

o [9] Sharan Chetlur, Cliff Woolley, Philippe Vandermer-sch, Jonathan Cohen, John Tran, Bryan Catanzaro, and Evan Shelhamer. cuDNN: Efficient primitives for deep learning. arXiv preprint arXiv:1410.0759, 2014. arxiv.org/abs/1410.0759.

o [10] Trishul Chilimbi, Yutaka Suzue, Johnson Apacible, and Karthik Kalyanaraman. Project Adam: Building an efficient and scalable deep learning training system. In 11th USENIX Symposium on Operating Systems Design and Implementation (OSDI 14), pages 571–582, 2014. www.usenix.org/system/files/conference/osdi14/osdi14-paper-chilimbi.pdf.

o [11] Jack Clark. Google turning itslucrative web search over to AImachines, 2015.

www.bloomberg.com/news/articles/2015-10-26/google-turning-its-lucrative-web-search-over-to-ai-machines.

o [12] Cliff Click. Global code motion/global value number-ing. In ACM SIGPLAN Notices, volume 30, pages 246–257. ACM, 1995. courses.cs.washington.edu/courses/cse501/06wi/reading/click-pldi95.pdf.

o [13] Ronan Collobert, Samy Bengio, and Johnny Marie´thoz. Torch: A modular machine learning software library. Technical report, IDIAP, 2002. infoscience.epfl.ch/record/82802/files/rr02-46.pdf.

o [14] Jeffrey Dean, Gregory S. Corrado, Rajat Monga, Kai Chen, Matthieu Devin, Quoc V. Le, Mark Z. Mao, Marc’Aurelio Ranzato, Andrew Senior, Paul Tucker,Ke Yang, and Andrew Y. Ng. Large scale distributed deep networks. In NIPS, 2012. Google Research PDF.

o [15] Jack J Dongarra, Jeremy Du Croz, Sven Hammar-ling, and Iain S Duff. A set of level 3 basic lin-ear algebra subprograms. ACM Transactions on Mathematical Software (TOMS), 16(1):1–17, 1990. www.maths.manchester.ac.uk/˜sven/pubs/Level3BLAS-1-TOMS16-90.pdf.

o [16] Andrea Frome, Greg S Corrado, Jonathon Shlens, Samy Bengio, Jeff Dean, Tomas Mikolov, et al. DeVISE: A deep visual-semantic embedding model. In Advances in Neural Information Pro- cessing Systems, pages 2121–2129, 2013. re-search.google.com/pubs/archive/41473.pdf.

o [17] Javier Gonzalez-Dominguez, Ignacio Lopez-Moreno, Pe- dro J Moreno, and Joaquin Gonzalez-Rodriguez. Frame- by-frame language identification in short utterances using deep neural networks. Neural Networks, 64:49–58, 2015.

o [18] Otavio Good. How GoogleTranslate squeezes deep learning onto a

phone, 2015. googleresearch.blogspot.com/2015/07/how-google-translate-squeezes-deep.html.

o [19] Ian J. Goodfellow, Yaroslav Bulatov, Julian Ibarz, Sacha Arnoud, and Vinay Shet. Multi-digit number recognition from Street View imagery using deep convolutional neu- ral networks. In International Conference on Learning Representations, 2014. arxiv.org/pdf/1312.6082.

o [20] Georg Heigold, Vincent Vanhoucke, Alan Senior, Patrick Nguyen, Marc’Aurelio Ranzato, Matthieu Devin, and Jeffrey Dean. Multilingual acoustic models using dis-tributed deep neural networks. In Acoustics, Speech and Signal Processing (ICASSP), 2013 IEEE Interna-tional Conference on, pages 8619–8623. IEEE, 2013. re-search.google.com/pubs/archive/40807.pdf.

o [21] Geoffrey E. Hinton, Li Deng, Dong Yu, George E. Dahl, Abdel-rahman Mohamed, Navdeep Jaitly, An- drew Senior, Vincent Vanhoucke, Patrick Nguyen, Tara N. Sainath, and Brian Kingsbury. Deep neural networks for acoustic modeling in speech recognition: The shared views of four research groups. IEEE Signal Process. Mag., 29(6):82– 97, 2012.

www.cs.toronto.edu/˜gdahl/papers/deepSpeechReviewSPM2012.pdf.

o [22] Sepp Hochreiter and Ju¨rgen Schmidhuber. Long short- term memory. Neural computation, 9(8):1735–1780, 1997. ftp.idsia.ch/pub/juergen/lstm.pdf.

o [23] Sergey Ioffe and Christian Szegedy. Batch normaliza- tion: Accelerating deep network training by reducing internal covariate shift. CoRR, abs/1502.03167, 2015. arxiv.org/abs/1502.03167.

o [24] Michael Isard, Mihai Budiu, Yuan Yu, Andrew Birrell, and Dennis Fetterly. Dryad: distributed data-parallel programs from sequential building blocks. In ACM SIGOPS Operating Systems Review, volume 41, pages 59–72. ACM, 2007. www.michaelisard.com/pubs/eurosys07.pdf.

o [25] Benoˆıt Jacob, Gae¨l Guennebaud, et al. Eigen library for linear algebra. eigen.tuxfamily.org.

o [26] Yangqing Jia, Evan Shelhamer, Jeff Donahue, Sergey Karayev, Jonathan Long, Ross Girshick, Sergio Guadar- rama, and Trevor Darrell. Caffe: Convolutional archi- tecture for fast feature embedding. In Proceedings of the ACM International Conference on Multimedia, pages 675–678. ACM, 2014. arxiv.org/pdf/1408.5093.

o [27] Andrej Karpathy, George Toderici, Sachin Shetty, Tommy Leung, Rahul Sukthankar, and Li Fei- Fei. Large-scale video classification with con- volutionalneural networks. In Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Con- ference on, pages 1725–1732. IEEE, 2014. re-search.google.com/pubs/archive/42455.pdf.

o [28] A Krizhevsky. Cuda-convnet, 2014. code.google.com/p/cuda-convnet/.

o [29] Alex Krizhevsky. One weird trick for paralleliz-ing convolutional neural networks. arXiv preprint arXiv:1404.5997, 2014. arxiv.org/abs/1404.5997.

o [30] Alex Krizhevsky, Vinod Nair, and Geoffrey Hinton. The CIFAR-10 dataset. www.cs.toronto.edu/˜kriz/cifar.html.

o [31] Quoc Le, Marc’Aurelio Ranzato, Rajat Monga, Matthieu Devin, Greg Corrado, Kai Chen, Jeff Dean, and Andrew Ng. Building high-level features using large scale unsu- pervised learning. In ICML’2012, 2012. Google Research PDF

o [32] Yann LeCun, Corinna Cortes, and Christopher JC Burges. The MNIST database of handwritten digits, 1998. yann.lecun.com/exdb/mnist/.

o [33] Mu Li, Dave Andersen, and Alex Smola. Parameter server. parameterserver.org.

o [34] Chris J Maddison, Aja Huang, Ilya Sutskever, and David Silver. Move evaluation in Go using deep convolutional neural networks. arXiv preprint arXiv:1412.6564, 2014. arxiv.org/abs/1412.6564.

o [35] Tomas Mikolov, Kai Chen, Greg Corrado, and Jef- frey Dean. Efficient estimation of word representa-tions in vector space. In International Conference on Learning Representations: Workshops Track, 2013. arxiv.org/abs/1301.3781.

o [36] Derek G Murray, Frank McSherry, Rebecca Isaacs, Michael Isard, Paul Barham, and Mart´ın Abadi. Naiad: a timely dataflow system. In Proceedings of the Twenty-Fourth ACM Symposium on Operating Systems Princi-ples, pages 439–455. ACM, 2013. Microsoft Research PDF.

o [37] Derek G. Murray, Malte Schwarzkopf, Christopher Smowton, Steven Smit, Anil Madhavapeddy, and Steven Hand. Ciel: a universal execution engine for dis-tributed data-flow computing. In Proceedings of the Ninth USENIX Symposium on Networked Systems Design and Implementation, 2011. Usenix PDF.

o [38] Arun Nair, Praveen Srinivasan, Sam Blackwell, Cagdas Alcicek, Rory Fearon, Alessandro De Maria, Ve-davyas Panneershelvam, Mustafa Suleyman, Charles Beattie, Stig Petersen, et al. Massively parallel meth-ods for deep reinforcement learning. arXiv preprint arXiv:1507.04296, 2015. arxiv.org/abs/1507.04296.

o [39] CUDA Nvidia. Cublas library. NVIDIA Corpo-ration, Santa Clara, California, 15, 2008. devel-oper.nvidia.com/cublas.

o [40] Jonathan Ragan-Kelley, Connelly Barnes, Andrew Adams, Sylvain Paris, Fre´do Durand, and Saman Ama-rasinghe. Halide: A language and compiler for optimiz-ing parallelism, locality, and recomputation in image pro-cessing pipelines. ACM SIGPLAN Notices, 48(6):519–530, 2013. people.csail.mit.edu/fredo/tmp/Halide-5min.pdf.

o [41] Bharath Ramsundar, Steven Kearnes, Patrick Riley, Dale Webster, David Konerding, and Vijay Pande. Massively multitask networks for drug discovery. arXivpreprint arXiv:1502.02072, 2015. arxiv.org/abs/1502.02072.

o [43] Chuck Rosenberg. Improving Photo Search: A step across the semantic gap, 2013. googleresearch.blogspot.com/2013/06/improving-photo-search-step-across.html.

o [44] Christopher J Rossbach, Yuan Yu, Jon Currey, Jean-Philippe Martin, and Dennis Fetterly. Dandelion: a compiler and runtime for heterogeneous systems. In Proceedings of the Twenty-Fourth ACM Symposium on Operating Systems Principles, pages 49–68. ACM, 2013. research-srv.microsoft.com/pubs/201110/sosp13-dandelion-final.pdf.

o [45] David E Rumelhart, Geoffrey E Hinton, and Ronald J Williams. Learning representations by back-propagating errors. Cognitive modeling, 5:3, 1988. www.cs.toronto.edu/ hinton/absps/naturebp.pdf.

o [46] Has¸im Sak, Andrew Senior,KanishkaRao, Franc¸oise Beaufays, and Johan

Schalkwyk. Google Voice Search:faster and more accurate, 2015.

googleresearch.blogspot.com/2015/09/google-voice-search-faster-and-more.html.

o [47] Ilya Sutskever, Oriol Vinyals, and Quoc V. Le. Sequence to sequence learning with neural networks. In NIPS, 2014. papers.nips.cc/paper/5346-sequence-to-sequence- learning-with-neural.

o [48] Christian Szegedy, Wei Liu, Yangqing Jia, Pierre Ser- manet, Scott Reed, Dragomir Anguelov, DumitruEr- han, Vincent Vanhoucke, and Andrew Rabinovich. Go- ing deeper with convolutions. In CVPR’2015, 2015. arxiv.org/abs/1409.4842.

o [49] Seiya Tokui. Chainer: A powerful, flexible and intuitive framework of neural networks. chainer.org.

o [50] Vincent Vanhoucke. Speech recognition and deep learn- ing, 2015. googleresearch.blogspot.com/2012/08/speech-recognition-and-deep-learning.html.

o [51] Abhishek Verma, Luis Pedrosa, Madhukar Korupolu, David Oppenheimer, Eric Tune, and John Wilkes. Large-scale cluster management at Google with Borg. In Proceedings of the Tenth European Conference on Computer Systems, page 18. ACM, 2015. re-search.google.com/pubs/archive/43438.pdf.

o [52] O. Vinyals, L. Kaiser, T. Koo, S. Petrov, I. Sutskever, and G. Hinton. Grammar as a foreign language. Technical report, arXiv:1412.7449, 2014. arxiv.org/abs/1412.7449.

o [53] Oriol Vinyals, Meire Fortunato, and NavdeepJaitly. Pointer networks. In NIPS, 2015. arxiv.org/abs/1506.03134.

o [54] Dong Yu, Adam Eversole, Mike Seltzer, KaishengYao, Zhiheng Huang, Brian Guenter, Oleksii Kuchaiev, Yu Zhang, Frank Seide, Huaming Wang, et al. An introduction to computational networks and the com-putational network toolkit. Technical report, Tech. Rep. MSR, Microsoft Research, 2014, 2014. re-search.microsoft.com/apps/pubs/?id=226641.

o [55] Matei Zaharia, Mosharaf Chowdhury, Tathagata Das, Ankur Dave, Justin Ma, Murphy McCauley, Michael J Franklin, Scott Shenker, and Ion Stoica. Resilient distributed datasets: A fault-tolerant abstraction for in-memory cluster computing. In Proceedings of the 9th USENIX conference on Networked Systems De- sign and Implementation. USENIX Association, 2012. www.usenix.org/system/files/conference/nsdi12/nsdi12-final138.pdf.

o [56] Matthew D. Zeiler, Marc’Aurelio Ranzato, RajatMonga, Mark Mao, Ke Yang, Quoc Le, Patrick Nguyen, Andrew Senior, Vincent Vanhoucke, Jeff Dean, and Geoffrey E. Hinton. On rectified linear units for speech processing. In ICASSP, 2013. re-search.google.com/pubs/archive/40811.pdf.