丸山不二夫 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
Agenda
o Watson API
n Watson vs. Watson
n Natural Language Classifier
n Dialog
n Cortana, Alexa との比較
n Retrieve and Rank
o Deep Learningでの自然言語へのアプローチ
n Deep Learning, NLP, and Representations
Agenda
o 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 Al
http://goo.gl/F27HGc
Natural Language Classifier
Natural Language Classifierは、ある文が、 「何
についての文」であるかを判断する。
ただし、そのクラス分けの根拠は、文の文法的な解析
やシステムの持つ知識ではなく、人間が与えたそのク
ラスに属するという複数の例文との類似に基づいてい
る。(Amazon Alexaでの、文とIntentとの対応付け
に近い)
Natural Language Classifier
Natural Language Classifier
Demo
o Is it hot outside?
o Natural Language Classifier is 98% confident
that the question submitted is talking about
'temperature’.
Classification: temperature
Confidence: 98%
http://goo.gl/hGByud
Natural Language Classifier
Demo
o What is the expected high for today?
o Natural Language Classifier is 98% confident
that the question submitted is talking about
'temperature’.
Classification: temperature
Confidence: 98%
http://goo.gl/hGByud
Natural Language Classifier
Demo
o Will it be foggy tomorrow morning?
o Natural Language Classifier is 68% confident
that the question submitted is talking about
‘conditions’.
Classification: conditions
Confidence: 68%
http://goo.gl/hGByud
Natural Language Classifier
Demo
o Will it be foggy tomorrow morning?
o Natural Language Classifier is 68% confident
that the question submitted is talking about
‘conditions’.
Classification: conditions
Confidence: 68%
http://goo.gl/hGByud
Natural Language Classifier
Demo
o Will it be foggy tomorrow morning?
o Natural Language Classifier is 68% confident
that the question submitted is talking about
‘conditions’.
Classification: conditions
Confidence: 68%
http://goo.gl/hGByud
Natural Language Classifier
Demo
o Should I prepare for sleet?
o Natural Language Classifier is 91% confident
that the question submitted is talking about
‘conditions’.
Classification: conditions
Confidence: 91%
http://goo.gl/hGByud
Natural Language Classifier
Demo
o Will there be a storm today?
o Natural Language Classifier is 98% confident
that the question submitted is talking about
‘conditions’.
Classification: conditions
Confidence: 98%
http://goo.gl/hGByud
Structure of training data
Structure of training data
Natural Language Classifier
o Watson APIの中心的なコンセプトは、"Natural
Language Classifier"。
o このClassifierが、どのように学習されどのような応答が
行われるかは、 以下のquestions.csvとanswers.csv
という二つのファイルとanserディレクトリーの中身を見れ
ばわかる。
https://goo.gl/iubMNX
question.csv
o question.csvでは、似たような質問が一つのクラスにま
とめられ、そのクラスに名前が与えられる。ドキュメントで
は、その名前を LabelIDと呼んでいる。図1の例では、関
連する似たような5つの質問に、
all_training_data_used という名前が与えられている。
question.csv
answer.csv
o 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 dialog
o Can you tell me about a dialog
o What is it
o is
o a dialog
o ...
Grammerタグ内の Wild Card 文字
Hash sign (#)
o “# is dialog”は、次のものにマッチする。
o What is a Dialog
o Can you tell me what Dialog is
o Is this thing I'm looking at a Dialog
o 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 Cortana
Voice Commandの定義サンプル
<VoiceCommands
xmlns="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 hello
HelloWorldIntent say hello world
HelloWorldIntent hello
HelloWorldIntent say hi
HelloWorldIntent say hi world
HelloWorldIntent hi
HelloWorldIntent how are you
HelpIntent help
HelpIntent help me
HelpIntent what can I ask you
HelpIntent get help
HelpIntent to help
HelpIntent to help me
intentName 発話
cortanaのListenFor
と同じ働きをする。それぞ
れの発話に、intent
Nameが付けられている。
“say hello”と“how are
you”は、同じintent
Nameが割り当てられて
いる。
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 Olah
http://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 pasteured
with 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 halfsuit
defending 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 WordGoog
Representations
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 Networks
o Modular Networkは、固定
された数の入力しか持たない。
(この例では、5個)
o この限界を、結合モジュール
Aを導入する事で、克服できる。
Recursive Neural Networks
o これは、“((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 460
1416 232
1534 315
852 178
… …
記号の意味:
m = 訓練用データの数
x = “入力” 変数 / 特徴
y = “出力” 変数 / “ターゲット” 変数
m
= 97
このサンプルは、何をしようとしているのか
家の面積から価格を予想する
仮説:
面積 feet2
(x)
価格 千ドル単位
(y)
2104 460
1416 232
1534 315
852 178
… …
予測の為の
訓練用データ
家の価格hは、家の面積をxとした時、
上の式で表されると仮定する。
問題:
この時、パラメーター は、どのように
選べばいいか?
0
1
2
3
0 1 2 3
0
1
2
3
0 1 2 3
0
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 model
x = 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 optimizer
y_ = tf.placeholder("float", [None, 10])
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01)¥
.minimize(cross_entropy)
# Train
tf.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 model
x = 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 optimizer
y_ = tf.placeholder("float", [None, 10])
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01)¥
.minimize(cross_entropy)
# Train
tf.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/te
nsorflow/models/image/mnist/convolutional.py
Google TensorFlow
White Paper
http://download.tensorflow.org/paper/white
paper2015.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 Flow
o いかなる明示的な制御の流れの構造を持たないデータフ
ロー・グラフは、非常に表現力が高いのだが、条件式や
ループがサポートされている方が、もっと簡潔で効率的な
マシン・ラーニング・アルゴリズムの表現へと導く多くの
ケースを観察してきた。
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, Ilya
Sutskever, Kunal Talwar, Paul Tucker, Vincent
Vanhoucke, Vijay Vasudevan, Fernanda Vie´gas, Oriol
Vinyals, 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. chapter
Dataflow 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. The
neural networks behind Google Voice
transcription, 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 its
lucrative web search over to AI
machines, 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 Google Translate
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- volutional
neural 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. arXiv
preprint 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,Kanishka
Rao, 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, Dumitru
Er- 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 Navdeep
Jaitly. Pointer networks. In NIPS, 2015.
arxiv.org/abs/1506.03134.
o [54] Dong Yu, Adam Eversole, Mike Seltzer, Kaisheng
Yao, 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, Rajat
Monga, 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.

機械学習技術の現在+TensolFlow White Paper