Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,098 views

Published on

マルレク12/22「機械学習技術の現在2」です。
資料として、TensolFlow のWhite Paperを翻訳しています。

Published in: Internet
  • Hey guys! Who wants to chat with me? More photos with me here 👉 http://www.bit.ly/katekoxx
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

  1. 1. 丸山不二夫 2015/12/22 機械学習技術の現在2
  2. 2. “Rule-based Information Extraction is Dead! ” --- Laura Chiticariu et al.
  3. 3. “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
  4. 4. "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
  5. 5. 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
  6. 6. Agenda o Google TensolFlowの登場 n Google TensolFlowとは何か? n TensorFlowのプログラミング・モデルと 基本的なコンセプト n TensorFlowプログラム サンプル1 線形回帰 n TensorFlowプログラム サンプル 2 手書き文字の認識 o TensolFlow White Paper (翻訳)
  7. 7. Watson API Watson APIは、IBMが提供する一群の ”Cognitive Computing” 向けのサービスの総体である。 それは、数年前に人間を破った「クイズ王」のWatson へのAPIではない。
  8. 8. http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/ Watson APIを構成するサービスの一覧 (1)
  9. 9. Watson APIを構成するサービスの一覧 (2) http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/
  10. 10. Watson APIを構成するサービスの一覧 (3) http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/
  11. 11. Watson vs. Watson これらのサービスの総体は、以前と同じものになるの だろうか? 筆者は、そこには大きな違いがあると考 えている。 以前のWatsonについては、前回のマルレクの資料 を参照してほしい。https://goo.gl/lKwiJG
  12. 12. 質問回答システムから対話システムに o 旧Watsonは、クイズ番組Jeopardy用にチューンされた 「質問回答システム」であった。一つの質問に対して一つ の答えを返す。そこで旧Watsonの基本的なサイクルは 閉じる。最初の質問と二番目の質問に、自然な連続した 会話のように、関連がありうることは、そもそも想定されて いない。 o 新しいWatson APIは、人間との自然言語による会話が できる対話システムを可能にする。それは、Google NowやSiriやCortana, Alexaと同じ方向である。旧 Watsonは、(テレビのデモではわからないが)「質問」は、 文字ベースだった。新しいWatsonは、発話を文字に変え (Speech to Text)、文字を発話に変える(Text to Speech)の能力を備えている。
  13. 13. 単独の無数の多様性を持ちうる「質問」と コンテキストを持つ特定パターンの「会話」 o 旧Watsonは、単独ではあるが、無数の多様性を持ちうる 「質問」に答えようとする。その為に、「質問文」を文法的 (基本的には、Slot Grammerの枠組みで)に解析して 質問のTopicを検出し、答えの候補を複数個仮定し、自 分の持つ「知識」を検索し、複数の独立した評価システム を総合して、答えを絞り込む。 o 新Watson APIで、新しく加わった「対話」機能の、「コン テキスト」は、あらかじめ人間によって設定されている。 「発話」の「意図」は、新Watson APIの中核の一つであ る”Natural Language Classifier” では、特定の「発 話」のパターンが、その「意図」と直接に結び付けられる。
  14. 14. 旧Watsonの行っていた処理
  15. 15. 対話機能の実装と、 「文法」へのアプローチ o 旧Watsonには、対話機能はない。ただし、文の文法的な 性質から情報を引き出す能力は持っていた。 o 新Watson APIでの対話のシナリオは、”Dialog”を通じ て、人間がプログラムする。このプログラミング作業で重 要なのは、あらかじめ「発話」を予想することであ り、”Dialog”の「文法」は、想定されたシナリオの元で、こ の予想の幅を広げる為の、正規表現(風な)による、文字 列マッチングでしかない。 o こうした「対話機能」が、パーソナル、ないしは、ビジネス・ アシスタント・システムとして役に立つことはあるだろう。 ただ、人間の知能の持つ重要な特質である「汎用性」を欠 いていることは、明らかだと思う。知能をプログラムするこ とと、知能を演ずることをプログラムすることは違うのだ。
  16. 16. “Automatic knowledge extraction from documents” http://goo.gl/MexfSl
  17. 17. 「知識」へのアプローチ o 旧Watsonは、自前で、「知識」を持っていた。 ネットに繋がっているわけではなく、閉じたものだったが、 Wikipediaを全部、暗記していると思っていい。 旧Watsonの力は、この「知識」を検索して、なんとか「質 問応答」に生かそうとする数々の手段の多様性によって 支えられていた。最終的には、それぞれのスコアの評価 システムで、答え一つに絞り込まれたとしても。 o 新Watson APIでは、こうした旧Watsonの魅力的な能 力は引き継がれていない。新Watsonは、裸のままでは 何のデフォールトの知識も持っていない。もちろん、新 Watsonに知識と評価システムを与えることはでき る。”Retriece and Rank” は、そういうものだが、僕に は、Solr/Lucene でしかないように見える。
  18. 18. “Finding needles in the haystack: Search and candidate generation” http://goo.gl/8O4s26
  19. 19. 機械学習技術の利用について o 旧Watsonでは、Neural Network/Deep Learning 的なアプローチは、ほとんで取られていない。もちろん、ス コアの評価には、統計的な手法が用いられているのだが。 o 新Watson APIで提供されるサービスの少なくないもの が、NN/Deep Learningの手法を取り入れている。これ は、新Watson APIの大きな特徴と言っていい。 o この分野のIBMの取り組みについては、前回のマルレク の資料の後半に、TruNorthチップとCoreletの紹介があ る。参照してほしい。
  20. 20. "A million spiking-neuron integrated circuit with a scalable communication network and interface” D.S.Modha et Al http://goo.gl/F27HGc
  21. 21. Natural Language Classifier Natural Language Classifierは、ある文が、 「何 についての文」であるかを判断する。 ただし、そのクラス分けの根拠は、文の文法的な解析 やシステムの持つ知識ではなく、人間が与えたそのク ラスに属するという複数の例文との類似に基づいてい る。(Amazon Alexaでの、文とIntentとの対応付け に近い)
  22. 22. Natural Language Classifier
  23. 23. 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
  24. 24. 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
  25. 25. 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
  26. 26. 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
  27. 27. 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
  28. 28. 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
  29. 29. 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
  30. 30. Structure of training data
  31. 31. Structure of training data
  32. 32. Natural Language Classifier o Watson APIの中心的なコンセプトは、"Natural Language Classifier"。 o このClassifierが、どのように学習されどのような応答が 行われるかは、 以下のquestions.csvとanswers.csv という二つのファイルとanserディレクトリーの中身を見れ ばわかる。
  33. 33. https://goo.gl/iubMNX
  34. 34. question.csv o question.csvでは、似たような質問が一つのクラスにま とめられ、そのクラスに名前が与えられる。ドキュメントで は、その名前を LabelIDと呼んでいる。図1の例では、関 連する似たような5つの質問に、 all_training_data_used という名前が与えられている。
  35. 35. question.csv
  36. 36. answer.csv o answer.csvは、LabelIDについて、一つの「代表的な」 質問を選んでいる。ここで、質問が、 all_training_data_used というカテゴリーに分類され たとしよう。そうすると、先に述べたディレクトリーanswer 以下に、all_training_data_used.html というファイル があるので、それを「答え」として利用すればいい。
  37. 37. answer.csv
  38. 38. answers ディレクトリー
  39. 39. Dialog Dialogは、対話型の会話の流れを(XMLで)プログラ ムする。人間の発話の揺れや冗長性に、柔軟な文字 列マッチングで対応しようとする。それを「文法」と呼ん でいる。(これは、W3Cの” Speech Recognition Grammar Specification” http://www.w3.org/TR/speech-grammar/ あたりの影響だと思う)
  40. 40. Dialog http://goo.gl/nBy5YK
  41. 41. Dialog demo http://goo.gl/mwHnsK
  42. 42. Dialog demo
  43. 43. Dialog demo
  44. 44. Dialog demo
  45. 45. Dialog demo
  46. 46. Dialog demo
  47. 47. Dialog demo
  48. 48. Dialog API https://goo.gl/jTccqJ
  49. 49. Dialog API https://goo.gl/jTccqJ
  50. 50. Dialogでの「会話」のプログラム 機械からの 呼びかけ 人間からの 入力取得 デフォールトでは、 「わかりません」と 答える ここが重要 http://goo.gl/xlUSs8
  51. 51. Dialogでの「会話」のプログラム Search タグ http://goo.gl/xlUSs8
  52. 52. Dialogでの「会話」のプログラム Search タグ http://goo.gl/xlUSs8
  53. 53. Dialogでの「会話」のプログラム Concept タグ これらは。 同じ意味を 持つ http://goo.gl/xlUSs8
  54. 54. Dialogでの「会話」のプログラム Grammer タグ http://goo.gl/xlUSs8
  55. 55. 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 ...
  56. 56. 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 ...
  57. 57. 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 ...
  58. 58. 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
  59. 59. Pizza demoの sourceの一部 https://goo.gl/3aGRjG
  60. 60. Cortana, Alexa との比較
  61. 61. helloGoodbye「こんにちは」 「さようなら」 <VoiceCommands ... <CommandSet ... <Command Name=“helloGoodbye"> <ListenFor ...> こんにちは </ListenFor> <Feedback> さようなら </Feedback> ... </Command> 音声入力 音声出力 音声コマンド 音声コマンドの定義ファイル MS Cortanaのスタイル
  62. 62. 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>
  63. 63. 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のスタイル
  64. 64. 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が割り当てられて いる。
  65. 65. Retrieve and Rank
  66. 66. Retrieve and Rank http://goo.gl/t09wXt
  67. 67. Apache Solr http://goo.gl/lX70zT
  68. 68. Retrieve and Rank Demo
  69. 69. Retrieve and Rank Demo
  70. 70. Retrieve and Rank Demo
  71. 71. Cranfield collection ?
  72. 72. Create Solr cluster http://goo.gl/9khkd5
  73. 73. List Solr configuration http://goo.gl/9khkd5
  74. 74. Index document http://goo.gl/9khkd5
  75. 75. Search Solr standard query http://goo.gl/9khkd5
  76. 76. Search and Rank http://goo.gl/9khkd5
  77. 77. Deep Learningでの 自然言語へのアプローチ ここでは、Cristopher Olahの ”Deep Learning, NLP, and Representations”に依拠して、Deep Learningの世界での自然言語へのアプローチのト ピックを紹介する
  78. 78. Deep Learning, NLP, and Representations Christpher Olah http://colah.github.io/posts/2014-07-NLP- RNNs-Representations/
  79. 79. Deep Learning, NLP, and Representations http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/
  80. 80. 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, ...)
  81. 81. 統計的言語モデル 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らは、ある語がコーパスの文中に現れる時、その 後に続く語の確率を、すべての語について、ニューラル・ ネットワーク・モデルで計算しようとした。
  82. 82. ニューラル・ネットを使った単語選択 o {to, two, too}という言葉は、発音はよく似ている。今、 次の文の下線部に、先の三つの単語{to, two, too}か ら、一つ選んで文章を作るという問題を考えよう。 For breakfast I ate _____eggs. 正解は、もちろんtwoである。多くの人は、two以外だと 文法的に正しくないし、意味が通らないと考えるだろう。 o ところが、ニューロ・ネットを使った単語選択の考え方は、 それとは異なる。沢山の用例を調べて、同じようなものが あれば、それを選ぶ。 次の例は、Andrew Ngの Machine LearningについてのCourseraの講義からの 抜粋。10億個のデータで学習させても、この簡単な例でも、 正解率は、100%に届かない。
  83. 83. It’s not who has the best algorithm that wins. It’s who has the most data. http://bit.ly/1qKh8ro 横軸が対数のグラフ 10億
  84. 84. ニューラルネットによる文章の学習 o Googleの Ilya Sutskeverは、文字数が5億文字にも のぼるテキストを長い時間をかけてRecurrent Neural Nets に学習させ、次のページのような文章を生成するこ とができた。 http://bit.ly/1qN5Pes
  85. 85. “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
  86. 86. “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
  87. 87. 画像認識と言語モデルの複雑さの比較 o 「ディープ・ニューラル・ネットワークの計算グラフは、きわ めて複雑なものになりうる。例えば、Googleの Inceptionモデル[48]に似た訓練用の計算グラフは、 ディープ・コンボリューション・ニューラル・ネットワークで、 2014年のコンテストで最高の分類パフォーマンスを示し たのだが、TensorFlowの計算グラフでは、36,000個以 上のノードを持っている。そして、言語モデルのための ディープ・リカレントLSTMモデルは、15,000以上のノード を持っている。」 “TensorFlow Whitepaper” 第9節から
  88. 88. 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も、この論文に注目して、共同の作業が始まる。
  89. 89. Word2Vecの登場 o Google Codeに、オープンソースとして公開され、 https://code.google.com/p/word2vec/ 大きな関 心を集める。 o ここで使われているモデルは、次の二つ。 n CBOW(Continuus Bag-of-Word”) モデル 複数の語の集まりから、一緒に出現しそうな一つの語 の確率を調べる。 n Skip-gram モデル 一つの語が与えられた時、一緒に出現しそうな複数の 語の確率を調べる。
  90. 90. http://arxiv.org/pdf/1301.3781.pdf “cat” “sat” “the” “mat” “on” “cat” “sat” “the” “mat” “song”
  91. 91. 語をベクトルに変換する関数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
  92. 92. t-SNE: 「語埋め込み」の可視化
  93. 93. t-SNE: visualizations of Words embeddings 先の出力の一部を拡大したもの
  94. 94. LeCunのLeNetによる手書き文字認識 学習用手書き文字データ MNISTを利用 http://yann.lecun.com/exdb/lenet/
  95. 95. t-SNEによる 学習されたMNIST データの可視化 https://lvdmaaten.github.io/tsne/
  96. 96. t-SNEによる 学習されたMNIST データの可視化 (3D版)
  97. 97. どんな語が、与えられた語の近くに 埋め込まれるか? Collobert et al. (2011) http://arxiv.org/pdf/1103.0398v1.pdf
  98. 98. どんな語が、与えられた語の近くに 埋め込まれるか? o 似た意味を持つ言葉は、似たベクトルを持つ。 o 似た言葉で置き換えても、正しい文は、正しい文に変わる。 “a few people sing well” 正しい文 “a couple people sing well” 正しい文 o 意味が似ていなくても、同じクラスの言葉で置き換えても、 正しい文は、正しい文に変わる。 “the wall is blue” “the ceiling is red”
  99. 99. 意味を変換するベクトルは共通? o Word Embeddingは、もっと面白い性質を持つ。下の図 のように、男性から女性へのベクトルがあるように見える。 o W(‘‘woman“)−W(‘‘man”) ≃ W(‘‘aunt“)−W(‘‘uncle”) W(‘‘woman")−W(‘‘man") ≃ W(‘‘queen")−W(‘‘king")
  100. 100. http://arxiv.org/pdf/1310.4546.pdf 国を首都に対応づけるベクトル
  101. 101. ベクトルで表現される関係の例 Mikolov et al (2013) http://arxiv.org/pdf/1301.3781.pdf
  102. 102. Mikalov et al http://arxiv.org/pdf/1301.3781.pdf 文法的関係を表すベクトルも存在する
  103. 103. 語が埋め込まれたベクトル空間を 様々な目的で共有する o いったん、ベクトル空間での語の表現 が出来上がれば、その表現を共有して 自然言語について、様々な処理が可能 となる。 o 例えば、 n 名前を持つ実体の認識 n 品詞の分類 n 構文解析 n 意味的役割のラベル付け http://nlp.stanford.edu/~lmthang/data/papers/conll13_morpho.pdf
  104. 104. 二ヶ国語の埋め込み o 二つの事なった言語を、同一のベクトル空間に埋め込む 事ができる。例えば、英語と中国語。 o 英語と中国語には、同じ意味の言葉 がある。二つの言語を埋め込む時、 我々が両方の意味を知っているもの については、同じ意味を持つものを、 できるだけ近くなるように調節する。 o そうすると、我々が知らない言葉で も、同じ意味を持つものは、近いと ころに埋め込まれる。 Socher, rt al http://goo.gl/DRt79o
  105. 105. Socher, rt al http://goo.gl/DRt79o
  106. 106. 言葉とイメージの埋め込み o 今度は、言葉と画像イメージを、同一のベクトル空間に埋 め込む取り組み。 o イヌの画像は、「イヌ」という言葉の 近くに、ウマの画像は、「ウマ」とい う言葉の近くに埋め込む。 o こうした時、ネコについて、特に訓 練しなくても、ネコの画像は、「ネコ」 という言葉の近くに見つかるという。 Socher et al. (2013b) http://goo.gl/TdFSuK
  107. 107. This was done by members of the Stanford group with only 8 known classes (and 2 unknown classes).
  108. 108. 画像と意味を埋め込んだモデル Frome et al http://goo.gl/QPAARB
  109. 109. 画像と意味を埋め込んだモデル Frome et al http://goo.gl/QPAARB
  110. 110. Recursive Neural Networks o Modular Networkは、固定 された数の入力しか持たない。 (この例では、5個) o この限界を、結合モジュール Aを導入する事で、克服できる。
  111. 111. Recursive Neural Networks o これは、“((the cat) (sat (on (the mat))” を、 結合モジュールを使って表したもの。 o こうしたモデルは、モジュールの出力が同じタイプのモ ジュールの入力となるので、 “recursive neural networks” と呼ばれる。また、 “tree-structured neural networks”とも呼ばれる。
  112. 112. 文 “This film does’nt care about cleverness wit or any other kind of intelligenct humor” の解析 Socher, et al. http://goo.gl/bPAQ68 文法構造をニューラル・ ネットで表現する!
  113. 113. Phraseの埋め込み http://arxiv.org/pdf/1406.1078v1.pdf
  114. 114. Google TensolFlowの登場 Google TensolFlowの発表は、2015年のAI/ML のシーンで、最大のトピックである。そのインパクトは 大きい。https://www.tensorflow.org/
  115. 115. http://download.tensorflow.org/paper/whitepaper2015.pdf
  116. 116. TensorFlowとは何か? o TensorFlow は、マシン・ラーニングのアルゴリズムを表 現するインターフェースである。 o TensorFlowは、同時に、そうしたアルゴリズムを実行す る実装である。 o Googleは、大規模な機械学習システムの第一世代とし てDistBeliefを構築していた(「Googleの猫」のマシン)。 TensorFlowは、大規模マシン・ラーニング・モデルの実 装と配備のための、第二世代のシステムだという。
  117. 117. TensorFlowとは何か? o TensorFlowがカバーする範囲は、AndroidやiOSといっ たモバイル・デバイス上での推論の実行から、数千の GPUを持つ数百台の特別のマシン上で走る大規模な訓 練システムに及んでいる。 o Googleは、TensorFlow APIと参照実装を 2015年の 11月に、Apache 2.0ライセンスの下でオープンソースに した。 www.tensorflow.org から利用可能である。
  118. 118. TensorFlowのプログラミング・モデルと 基本的なコンセプト
  119. 119. グラフとノードとテンソル p TensorFlow の計算は、ノードの集合からなる有向グラフ によって記述される。それぞれのノードは、入力と出力を持 ち、ある演算のインスタンスを表現している。 p グラフは、データフロー計算を表現している。グラフの中で、 流れる値はテンソルである。テンソルは、任意の次元を持 つ配列である。 p ただ、ある種類のノード(Variable等)にパーシステントな 状態の維持と更新を可能とし、また、グラフ内の分岐と ループの制御構造を持つように拡張している。 p クライアントは、サポートされたフロントエンドの言語(C++ または Python)を利用して計算グラフを構築する。
  120. 120. 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
  121. 121. 演算とカーネル o 演算は名前を持っていて抽象的な計算を表現する(例え ば、”matrix multiply”や “add”のように)。 o カーネルは、特別なタイプのデバイス(例えば、CPUか GPUか)の上で実行可能な、特別な演算の実装のことで ある。
  122. 122. 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, ...
  123. 123. TensorFlow の演算 o ニューラル・ネットワークの構成要素 SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool, ... o チェックポイント演算 Save, Restore o キューと同期の演算 Enqueue, Dequeue, MutexAcquire, MutexRelease, ..., o 制御の流れの演算 Merge, Switch, Enter, Leave, NextIteration
  124. 124. セッション o クライアントのプログラムは、セッションを生成することで TensorFlowのシステムと相互作用する。 o セッション・インターフェースによってサポートされている他 の重要なオペレーションは、 Runである。 o TensorFlowの利用の大部分では、いったんグラフでセッ ションをセットアップすると、そのあとは、Runの呼び出し を通じて、グラフ全体あるいは少数の部分グラフを数千な いしは数百万回実行する。
  125. 125. 変数(Variable) o 大部分の計算では、一つのグラフは複数回実行される。 大部分のテンソルは、グラフの一回の実行のあとにはい き残らない。しかし、変数は、グラフの実行を通じて生き残 るパーシステントな複製可能なテンソルへのハンドルを返 す特別な種類の演算である。
  126. 126. クライアントとマスターとスレーブ o TensorFlowシステムの主要なコンポーネントはクライア ントである。 o クライアントは、セッション・インターフェースを使ってマス ターと、さらに、一つ以上のワーカー・プロセスと通信する。 o それぞれのワーカー・プロセスは、一つ以上の計算デバイ ス(CPUコアとかGPUコアといった)へのアクセスの調停と マスターに指示されたデバイス上でのグラフ・ノードの実 行に責任を持っている。
  127. 127. 単一マシンと分散システムの構造
  128. 128. デバイス o デバイスは、TensorFlowの計算の心臓部分である。そ れぞれのワーカーは一つ以上のデバイスに責任を持って いる。 o それぞれのデバイスは、デバイスの型と名前を持っている。 デバイス名の例は、次のようになる。 "/job:localhost/device:cpu:0" "/job:worker/task:17/device:gpu:3".
  129. 129. テンソル o テンソルは、型付けられた多次元の配列である。 o TensorFlowは、多様なテンソル要素の型をサポートして いる。8bitから64bitのサイズの、符号付・符号なしの整 数。IEEEの浮動小数点と倍精度と複素数、文字列型(任 意のバイト配列)がある。 o テンソルの格納場所の適切なサイズは、テンソルが存在 するデバイス上で特有のアロケータ−によって管理される。
  130. 130. TensorFlowプログラム サンプル1 線形回帰
  131. 131. .... 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))
  132. 132. .... 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)) グラフの定義 アルゴリズム グラフの起動 グラフで訓練 繰り返し
  133. 133. まず、アルゴリズムを理解しよう ポイントは線形回帰と勾配降下法だが、それには、 次のサンプルでの説明がわかりやすい、 Andrew NgのCourseraのML講義に依拠 https://www.coursera.org/course/ml
  134. 134. ポートランドでの 実際の家の価格 これを予測の為の 訓練用データとして 利用する 面積 feet2 (x) 価格 千ドル単位 (y) 2104 460 1416 232 1534 315 852 178 … … 記号の意味: m = 訓練用データの数 x = “入力” 変数 / 特徴 y = “出力” 変数 / “ターゲット” 変数 m = 97 このサンプルは、何をしようとしているのか 家の面積から価格を予想する
  135. 135. 仮説: 面積 feet2 (x) 価格 千ドル単位 (y) 2104 460 1416 232 1534 315 852 178 … … 予測の為の 訓練用データ 家の価格hは、家の面積をxとした時、 上の式で表されると仮定する。 問題: この時、パラメーター は、どのように 選べばいいか?
  136. 136. 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を決める。
  137. 137. 誤差 誤差 誤差 誤差 先のアルゴリズム中の loss = tf.reduce_mean(tf.square(y - y_data)) は、誤差の尺度
  138. 138. 誤差を最小にするθ0 , θ1を求める o サンプル中のi 番目の点を (x(i), y(i))とすれ ば、点 x(i) での誤差は、hθ(x(i)) – y(i) となる。 o 誤差は、正負の値をとるので、単純に、誤差 の平均を取っても、打ち消しあって、全体とし ての誤差の大きさはわからなくなる。 o そこで、誤差の二乗をとって、その平均を最小 にすることを考える。 o θ0 , θ1の関数である、この誤差の二乗の平 均を、コスト関数と呼ぶことがある。
  139. 139. 仮説: パラメーター: コスト関数: 目標: 問題の整理
  140. 140. コスト関数 先のサンプルでは、Loss関数(損失関数)と呼ばれて いる。同じものである。次のプログラムは、Loss関数 を定義し、それをGradientDescentを使って最小の ものにせよということである。 loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)
  141. 141. コスト関数 J(θ0 , θ1)は、θ0 , θ1 につい ての関数なので、次のような形をしている
  142. 142. θ1 θ0 J(θ0,θ1) コスト関数 J(θ0 , θ1)の別の例
  143. 143. (for fixed , this is a function of x) (function of the parameters )
  144. 144. (for fixed , this is a function of x) (function of the parameters )
  145. 145. (for fixed , this is a function of x) (function of the parameters )
  146. 146. (for fixed , this is a function of x) (function of the parameters )
  147. 147. Gradient descent 勾配降下法 Gradient descent 勾配降下法は、ニューラル・ネッ トワークのパラメーター更新の基本的な手段である。 TensorFlowでは、 Gradient descent が、標準的 な関数として、あらかじめ組み込まれている。先のア ルゴリズムでは、optimizer = tf.train.GradientDescentOptimizer(0.5) の形で利用されている。
  148. 148. ある関数があって その値を最小にしたい 基本的な考え方: • ある からはじめる。 • の値を、 が減少するように 変化させる。 • 最小値になるまで、繰り返す。 Gradient descent(勾配降下法)
  149. 149. 簡単にするために、二次元のグラフで考え よう。ある点から始めて、その点から極小 点に近ずくためには、どうすればいいか? 二つの場合がある。 その点が極小点の右側にある場合には、 その点のx座標を少し減らせばいい。 その点が極小点の左側にある場合には、 その点のx座標を少し増やせばいい。 その点が、極小点の右にあるか左にある かは、その点での接戦の傾きが、正である か負であるかでわかる。 よって、α を正の数値とすれば、次の式が、 より近づいた点の位置を与える。 直感的な説明
  150. 150. 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)という。
  151. 151. Gradient descentは、アルファが固定されて いても、極小値に収束できる。 局所的な最小値に近づくに つれ、gradient descent は、自動的に小さなステップ を取るようになるので、繰り 返しアルファを小さくしてゆく 必要はない。
  152. 152. θ1 θ0 J(θ0,θ1)
  153. 153. θ0 θ1 J(θ0,θ1) ある場合には、最小値ではなく、局所的な 極小値に、入り込むことがある。
  154. 154. http://arxiv.org/pdf/1210.0811v2.pdf gradient descent method
  155. 155. .... 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))
  156. 156. TensorFlowプログラム サンプル2 手書き文字の認識
  157. 157. .... # 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
  158. 158. .... # 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
  159. 159. 線形回帰とクラス分類との比較 変数の定義部分 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がつくのは当然である。 線形回帰 クラス分類
  160. 160. 線形回帰とクラス分類との比較 アルゴリズムの定義部分 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関数が最小になるように、ステップごとにパラ メーターを変化させていくという考え方は、共通である。 線形回帰 クラス分類
  161. 161. ニューラル・ネットワークの “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
  162. 162. Google TensorFlow White Paper http://download.tensorflow.org/paper/white paper2015.pdf
  163. 163. Abstract
  164. 164. o TensorFlow [1] は、マシン・ラーニングのアルゴリズム を表現するインターフェースであり、同時に、そうしたアル ゴリズムを実行する実装である。TensorFlowを用いて表 現される計算は、携帯電話やタブレットといったモバイル・ デバイスから、数百のマシンと数千のGPUカードのような 計算デバイスを持つ大規模分散システムにいたる、広い 範囲の多様なヘテロなシステムで、ほとんど、あるいは、 全く変更なしで実行することができる。
  165. 165. o このシステムは、柔軟で、ディープ・ニューラル・ネットワー クのための訓練と推論のアルゴリズムを含む、広い範囲 の多様なアルゴリズムを表現するために利用できる。また、 このシステムは、先導的研究のために、また、マシン・ラー ニング・システムをコンピュータ・サイエンスやその他の分 野の数十の領域をまたいで、生産の場に配備するために 使われてきた。これらの中には、音声認識、コンピュータ・ ビジョン、ロボット工学、情報抽出、自然言語処理、地理 情報抽出、コンピュータによる薬品の発見といった領域が 含まれている。
  166. 166. o この論文は、TensorFlowのインターフェースと、我々が Googleで構築した、このインターフェースの実装につい て述べたものである。TensorFlow APIと参照実装は、 2015年の11月に、Apache 2.0 ライセンスで、オープン ソース・パッケージとして公開された。 www.tensorflow.org から利用可能である。
  167. 167. 論文の構成 1. イントロダクション 2. プログラミング・モデルと基本的なコンセプト 3. 実装 4. 拡張 5. 最適化 6. 現状と経験 7. よく使われるプログラミング上のイディオム 8. パフォーマンス 9. ツール 10.将来の仕事 11.関連した仕事 12.結論
  168. 168. 1. イントロダクション
  169. 169. o Google Brain プロジェクトは、研究とGoogle製品での 利用の両面で、非常に大規模なディープ・ニューラル・ネッ トワークの利用を開拓するために、2011年に開始された。 このプロジェクトの初期の仕事の一部として、我々は、ス ケーラブルな分散訓練推論システム[14]の第一世代とし てDistBeliefを構築した。そして、このシステムは、我々 に非常に役立った。 我々とGoogleの他のメンバーは、 DistBeliefを使って、広い範囲の多様な研究を遂行して きた。これらには、次の仕事が含まれる。教師なし学習 [31], 言語の表現 [35, 52], イメージ分類と対象検出 のモデル [16, 48], ビデオの分類 [27], 音声認識 [56, 21, 20],シーケンスの予測 [47], 碁の指し手の 選択 [34], 歩行者の検出 [2], 強化学習 [38], そして、 その他の領域 [17, 5]。
  170. 170. o それに加えて、しばしばGoogle Brainチームと密接に連 携して、Googleと、その他のAlphabetの会社の50以上 のチームがDistBeliefを使って、ディープ・ニューラル・ ネットワークを、広い範囲の多様な製品に配備してきた。 その中には、Google Search [11], 我々の広告製品, 我々の音声認識 [50, 6, 46], Google Photos [43], Google Maps と StreetView [19], Google Translate [18], YouTube, その他多くのものが含ま れている。
  171. 171. o DistBeliefでの我々の経験と、ニューラル・ネットワークの 訓練と利用にとって望ましいシステムの特性と要請のより 完全な理解に基づいて、我々は、TensorFlowを構築し た。それは、大規模マシン・ラーニング・モデルの実装と配 備のための、我々の第二世代のシステムである。 TensorFlowは、データフローに似たモデルを利用して記 述される計算を使う。そして、それを広い範囲の多様な異 なったハードウェア・プラットフォーム上にマップする。その 範囲は、AndroidやiOSといったモバイル・デバイス上で の推論の実行から、一つあるいは多数のGPUカードを含 んだ単一のマシンを利用した中規模の訓練と推論のシス テム、さらには、数千のGPUを持つ数百台の特別のマシ ン上で走る大規模な訓練システムに及んでいる。
  172. 172. o これほどの広い範囲のプラットフォームをまたぐ単一のシ ステムを持つことは、実世界でのマシン・ラーニング・シス テムの利用を大幅に単純化する。我々が見いだしたよう に、大規模な訓練用のシステムと小規模な配備といった 別々のシステムを持つことは、メンテナンスに大きな負荷 をもたらし、抽象のレベルでも漏れを引き犯しやすいから だ。TensorFlowの計算は、(第2節でもっと詳しく述べる が)状態を持ったデータフロー・グラフで表現される。我々 は、システムが、研究目的で新しいモデルを素早く実験す るのにも十分柔軟で、また、製品用のマシン・ラーニング・ モデルの訓練と配備でも十分に高パフォーマンスで頑健 でとなることにフォーカスしてきた。
  173. 173. o ニューラル・ネットワークの訓練を大規模な配備にスケー ルさせるために、TensorFlowは、データフロー・グラフの コア・モデルのレプリケーションとパラレル実行を行うこと で、クライアントが容易に沢山の種類のパラレル処理を表 現することを可能にする。そこでは、多くの異なった計算 デバイスが全て協調して、共有パラメータ、その他の状態 の集合を更新する。計算の記述のあまり大きくない変更 で、広い範囲の異なったアプローチのパラレル処理への 移行が達成され、少ない労力でそれを試すことが可能に なる。 [14, 29, 42].
  174. 174. o TensorFlowのある利用では、パラメーターの更新の整 合性に関して、柔軟な対応が可能になる。大規模な配備 のある場合には、我々は、こうした同期の条件の緩和を 簡単に表現し、その利点を利用できる。 DistBeliefと比 較すると、TensorFlowのプログラミング・モデルは、もっ と柔軟であり、パフォーマンスははるかに良い。また、広 い範囲の多様なヘテロなハードウェア・プラットフォーム上 の広いモデルの訓練と利用をサポートしている。
  175. 175. o 我々内部の数十のDistBeliefの利用者は、すでに TensorFlowへの切り替えを終えている。これらの利用者 は、研究でも製品でもTensorFlowを信頼している。これ らの仕事は、モバイル・フォーンでのコンピュータ・ビジョ ン・モデルのための推論の実行から、数百のマシンを用い 数千億のサンプル・データ上で数千億のパラメーターを持 つ大規模なディープ・ニューラル・ネットワークの訓練まで、 多岐にわたっている。
  176. 176. o これらのアプリケーションは、特に、マシン・ラーニングと ディープ・ニューラル・ネットワークに集中しているのだが、 我々は、TensorFlowの抽象が、他の種類のマシン・ラー ニング・アルゴリズムや可能的には他の種類の数値計算 を含む、他の多様な領域においても有用となることを期待 している。我々は、TensorFlow APIと参照実装を 2015 年の11月に、Apache 2.0ライセンスの下でオープン ソースにしてきた。 www.tensorflow.org から利用可 能である。
  177. 177. o この論文の残りの部分では、もっと詳しくTensorFlowに ついて述べる。第2節は、TensorFlowインターフェース のプログラミング・モデルと基本的なコンセプトについて述 べる。第3節は、単一のマシンと分散実装の双方について 述べる。第4節は、基本的なプログラミング・モデルの拡張 について述べる。第5節は、基本的な実装の最適化につ いて述べる。第6節は、TensorFlowを使った我々の経験 を述べる。第7節は、我々が見つけたTensorFlowを使う ときに有用なイディオムについて述べる。第9節は、コアの TensorFlowの周辺で我々が構築した補助ツールについ て述べる。第10節と第11節は、それぞれ将来と関連した 仕事について述べる。第12節は、結論的な考えを提供し ている。
  178. 178. 2. プログラミング・モデルと 基本的なコンセプト p 演算とカーネル p セッション p 変数
  179. 179. o TensorFlow の計算は、ノードの集合からなる有向グラ フによって記述される。グラフは、データフロー計算を表現 している。ただ、 Naiad [36] と同じようなスタイルで、あ る種類のノードにパーシステントな状態の維持と更新を可 能とし、また、グラフ内の分岐とループの制御構造を持つ ように拡張している。
  180. 180. o クライアントは、典型的には、サポートされたフロントエンド の言語(C++ または Python)を利用して計算グラフを 構築する。 o Pythonをフロントエンドに使ったTensorFlowグラフの構 築と実行のサンプルの一部を図1に示す。図2は、結果と しての計算グラフである。
  181. 181. 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
  182. 182. o TensorFlowグラフでは、それぞれのノードは、ゼロ以上 の入力とゼロ以上の出力を持ち、ある演算のインスタンス を表現している。グラフの中で、通常のエッジに沿って(入 力から出力へ)流れる値はテンソルである。テンソルは、 任意の次元を持つ配列で、それを構成する要素の型は、 グラフ作成時に指定されるか推論される。
  183. 183. o コントロール従属と呼ばれる特殊なエッジもグラフの中に 存在できる。このエッジに沿ってはどんなデータも流れな いが、コントロール従属の出発点のノードは、コントロール 従属の終点のノードでの実行が始まる前に実行を終えて いなければいけないことを示している。我々のモデルは、 複製可能な状態を含んでいるので、コントロール従属は、 関係の前に起きるべきことをクライアントが直接に強制す るのに利用できる。我々の実装では、次のような場合にも コントロール従属を挿入することがある。例えば、メモリー 使用のピークをコントロールする場合に、通常では独立な 演算の間に順序を強制するような場合である。
  184. 184. 演算とカーネル o 演算は名前を持っていて抽象的な計算を表現する(例え ば、”matrix multiply”や “add”のように)。演算は、属 性を持つことができる。この属性は、ノードが演算を実行 するようにインスタンス化されるためには、グラフ構築時に 与えられるか推論されなければならない。属性の、一つの 共通な使い方は、テンソルの異なった要素の型の上に演 算がポリモルフィックであるようにすることである(例えば、 浮動小数点型の二つのテンソルを加算すると、int32型 の二つのテンソルを加算するといった)。
  185. 185. o カーネルは、特別なタイプのデバイス(例えば、CPUか GPUか)の上で実行可能な、特別な演算の実装のことで ある。TensorFlowのバイナリーは、演算と利用可能な カーネルの集合を、レジストレーションのメカニズムを通じ て定義する。この集合は、追加の演算/カーネルの定義 /レジストレーションとリンクすることで拡張できる。次の テーブル1は、コアなTensorFlowライブラリーに組み込 まれている演算の一部である。
  186. 186. 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, ...
  187. 187. TensorFlow の演算の型 o ニューラル・ネットワークの構成要素 SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool, ... o チェックポイント演算 Save, Restore o キューと同期の演算 Enqueue, Dequeue, MutexAcquire, MutexRelease, ..., o 制御の流れの演算 Merge, Switch, Enter, Leave, NextIteration
  188. 188. セッション o クライアントのプログラムは、セッションを生成することで TensorFlowのシステムと相互作用する。計算グラフを生 成するためにセッションのインターフェースは、 Extend メソッドをサポートしている。これによって、セッションに よって管理されているグラフに追加のノードやエッジを増 やす。(セッションによって生成される、一番最初のグラフ は空である)
  189. 189. o セッション・インターフェースによってサポートされている他 の重要なオペレーションは、 Runである。Runは、計算さ れる必要のある出力の集合の名前と、ノードのある種の 出力の代わりにグラフに与えられるべきオプショナルなテ ンソルを引数に取る。Runの引数を利用することで、 TensorFlowの実装は、要求されている出力を計算する ために実行されるべきすべてのノードの推移的クロージャ の計算が可能となる。また、その時、その従属性に応じて 適切なノードを順番に実行するためのアレンジも可能にな る。(詳しくは、3.1で述べる) o 我々のTensorFlowの利用の大部分では、いったんグラ フでセッションをセットアップすると、そのあとは、Runの呼 び出しを通じて、グラフ全体あるいは少数の部分グラフを 数千ないしは数百万回実行する。
  190. 190. 変数 o 大部分の計算では、一つのグラフは複数回実行される。 大部分のテンソルは、グラフの一回の実行のあとにはい き残らない。しかし、変数は、グラフの実行を通じて生き残 るパーシステントな複製可能なテンソルへのハンドルを返 す特別な種類の演算である。これらのパーシステントな複 製可能なテンソルへのハンドルは、 Assignや AssignAdd (+=に等しい)といった、参照されたテンソル を複製する少数の特別な演算に渡されることができる。 TensorFlowのマシン・ラーニングのアプリケーションでは、 そのモデルのパラメーターは、典型的には、変数に保持さ れたテンソルに格納され、モデルのグラフの訓練のRun の一部として更新される。
  191. 191. 3. 実装
  192. 192. 3. 実装 o デバイス o テンソル o 3.1 単一のデバイスでの実行 o 3.2 複数のデバイスでの実行 o 3.2.1 ノードの配置 o 3.2.2 デバイス間のコミュニケーション o 3.3 分散実行 o 対障害性
  193. 193. o TensorFlowシステムの主要なコンポーネントはクライア ントである。それは、セッション・インターフェースを使って マスターと、さらに、一つ以上のワーカー・プロセスと通信 する。それぞれのワーカー・プロセスは、一つ以上の計算 デバイス(CPUコアとかGPUコアといった)へのアクセスの 調停とマスターに指示されたデバイス上でのグラフ・ノード の実行に責任を持っている。
  194. 194. o 我々は、ローカル実装と分散実装という、TensorFlowイ ンターフェースの二つの実装を持っている。ローカル実装 は、クライアント、マスター、ワーカーがすべて一つのマシ ン上で一つのOSのプロセスのコンテキストの中で走る。 (可能的には、例えば、一つのマシンに沢山のGPUカード がインストールされていて、複数のデバイスの場合もあ る)。分散実装は、ローカル実装と大部分のコードを共有 している。ただし、クライアント、マスター、ワーカーが、す べて異なるマシンの異なるプロセスでありうるような環境 をサポートするように拡張されている。
  195. 195. o 我々の分散環境では、これらの異なったタスクは、クラス ター・スケジューリング・システム[51]. によって管理され たジョブの中のコンテナーである。これらの異なったモード を次の図3に示す。この節の残りの大部分は、両方の実 装にとって共通な問題を議論している。3.3節は、分散実 装に特有の問題を議論している。
  196. 196. 単一マシンと分散システムの構造
  197. 197. デバイス o デバイスは、TensorFlowの計算の心臓部分である。そ れぞれのワーカーは一つ以上のデバイスに責任を持って いる。それぞれのデバイスは、デバイスの型と名前を持っ ている。デバイスの名前は、デバイスの型とワーカーの中 でのデバイスのインデックスと、我々の分散設定では、 ワーカーのジョブとタスクを指定するものから構成される。 (プロセスに対してデバイスがローカルな場合には、 localhostが用いられる) デバイス名の例は、次のようになる。 "/job:localhost/device:cpu:0" "/job:worker/task:17/device:gpu:3".
  198. 198. o 我々は、CPUとGPUについてのデバイス・インターフェー スの実装を持っている。その他のデバイス型についての 新しいデバイスの実装は、レジストレーションのメカニズム を通じて与えることができる。それぞれのデバイス・オブ ジェクトは、デバイスのメモリーの割り当てと解放、 TensorFlow実装のより高いレベルで要求される任意の カーネルの実行のアレンジに責任を持っている。
  199. 199. テンソル o 我々の実装では、テンソルは、型付けられた多次元の配 列である。我々は、多様なテンソル要素の型をサポートし ている。8bitから64bitのサイズの、符号付・符号なしの 整数。IEEEの浮動小数点と倍精度と複素数、文字列型 (任意のバイト配列)がある。テンソルの格納場所の適切 なサイズは、テンソルが存在するデバイス上で特有のアロ ケータ−によって管理される。テンソルの格納場所のバッ ファーは、参照数がカウントされ、参照が残ってないなら 解放される。
  200. 200. 3.1 単一デバイスでの実行 o 最初に、一番簡単な実行シナリオ、すなわち、一つのデバ イスを持った単一のワーカー・プロセスをを考えてみよう。 グラフのノードは、ノード間の従属性を尊重するように、順 に実行される。特に、まだ実行されていないノードの従属 性の数を、我々は、ノード毎にカウントし追跡している。 いったん、このカウントがゼロに落ちると、そのノードは実 行に適格とみなされ、準備OKのキューに追加される。こ の準備キューは、時には特定されない順番で処理される ことがある。ノードのデバイス・オブジェクトに対してカーネ ルの実行が特別に指定されることがあるのだ。ノードは、 実行が終わると、終了したノードに依存している全ての ノードのノードのカウントを一つ減らす。
  201. 201. 3.2 複数のデバイスでの実行 o システムが複数デバイスの場合、主に二つほど厄介なこ とがある。一つは、グラフ上のそれぞれのノードについて どのデバイスを実行配置につかさせるかを決定することで あり、もう一つは、その後で、この配置決定によって導か れるデバイスの境界をまたいで要求されるデータ通信を 管理することである。
  202. 202. 3.2.1 ノードの配置 o 計算グラフが与えられた時、TensorFlow実装の主要な 責任は、計算を利用可能なデバイスの上に対応づけるこ とである。このアルゴリズムの単純なバージョンを以下に 述べる。このアルゴリズムでサポートされた拡張について は4.3節を参照のこと。
  203. 203. o 配置アルゴリズムへの一つの入力は、コスト・モデルであ る。それは、それぞれのグラフ・ノードに対しての入力と出 力のサイズ(バイト数での)の評価を含んでいる。さらに、 入力テンソルが与えられた時、それぞれのノードに要求さ れる計算時間の評価が行われる。このコスト・モデルは、 ある場合には、異なる演算のタイプに関連したヒューリス ティックに基づいて静的に評価され、ある場合には、以前 のグラフの実行での実際の配置決定の集合に基づいて 計測される。
  204. 204. o 配置アルゴリズムは、最初に、そのグラフ実行のシミレー ションを走らせる。このシミレーションは以下に述べるが、 グラフ中のそれぞれのノードについて、 greedy heuristics を使って一つのデバイスを選択して終わる。 このシミレーションで生成された、ノードのデバイスへの配 置は、実際の実行での配置でも利用される。
  205. 205. o 配置アルゴリズムは、計算グラフの出発点から始まり、進 行につれてシステムのそれぞれのデバイス毎に活動をシ ミレートする。この横断によって到達されるそれぞれの ノードで、可能性のあるデバイスが検討される。(あるデバ イスは、もしもそのデバイスで特定の演算を実装したカー ネルが提供されていないならば、可能性を持たないことに なるかもしれない)。複数の可能性を持つデバイスを持つ ノードについては、配置アルゴリズムはgreedy heuristic 経験的総当り法を用いる。それは、可能なデ バイス全てについて、そのノードに配置した時に、ノードの 実行完了時間への影響を検査する。
  206. 206. o この経験的方法は、コスト・モデルから評価あるいは計測 されたこのデバイスのタイプの実行時間を考慮に入れる。 同時に、他のデバイスから想定されたデバイスに対してこ のノードに入力を送るために必要とされる全ての通信コス トが含められる。
  207. 207. o ノードの演算が最も早く終わるであろうデバイスが、その 演算のデバイスとして選ばれる。そして配置のプロセスは グラフの中の他のノードの配置決定へと前進を続ける。そ の一方で下流のノードたちは、自身のシミレーション実行 の準備を整える。4.3節は、ユーザーに配置アルゴリズム を導くヒントや部分的な制約条件を与えることを可能にす るいくつかの拡張について述べている。配置アルゴリズム は、システム内で開発が進行中の領域である。
  208. 208. 3.2.2 デバイス間通信 o いったんノードの配置が計算されると、グラフはデバイス ごとに部分グラフの集合に分割される。xからyへの全て のデバイスをまたぐエッジは削除され、xからxの部分グラ フ内の新しいSendノードへのエッジに、また、対応する Receiveノードからyの部分グラフ内のyへのエッジに置き 換えられる。このグラフの変形については、図4を見てほ しい。
  209. 209. Send/Receive ノードの挿入の前後
  210. 210. o 実行時は、SendとReceiveの実装は、デバイス間の データ転送のために協調して動作する。このことは、 SendとReceiveの実装の内部の通信を全て隔離するこ とを可能にし、実行時の他の部分を簡単にする。
  211. 211. o SendとReceiveノードを挿入した時、我々は、特定のデ バイス上の特定のテンソルの全ての利用者は、特定のデ バイスの下流の利用者ごとに一つのReceiveノードでは なく、単一のReceiveノードを利用するように正規化する。 このことによって、必要なテンソルのデータは、一度だけ、 出発点のデバイスから終点のデバイスのペアに送信され ることが保証される。終点のデバイス上のそのテンソルの メモリーは、複数回ではなく一度だけ割り当てられる。(例 えば、図4でのノード b, c を見よ)
  212. 212. o こうした仕方で通信をハンドルすることで、異なったデバイ ス上のグラフの個々のノードのスケジューリングを、ワー カーへと分散化することが可能となる。すなわち、Sendと Rceiveのノードは、異なったワーカーとデバイス間で必要 な同期を自ら行うので、マスターは、それぞれのワーカー に対して、ワーカーがグラフのどんなノードを持っていたと しても、グラフ実行の度に一つのRunリクエストを発行す る必要があるだけである。全てのノード間、あるいは、全 てのデバイス間の通信のスケジューリングに、マスターが 巻き込まれることはない。このことは、システムをもっとス ケーラブルなものにし、スケジューリングがマスターによっ て強制的に行われるよりも、細かな粒度でのノードの実行 が可能になる。
  213. 213. 3.3 分散実行 o グラフの分散実行は、複数のデバイスでの実行に、とても よく似ている。デバイスの配置後に、デバイスごとに部分 グラフが生成される。ワーカープロセスをまたいで通信す るSend/Receiveノードのペアは、マシン境界をまたいで データを移動するのに、TCPまたはRDMAといったリモー ト通信のメカニズムを利用する。
  214. 214. 耐障害性 o 分散実行での失敗は、様々なところで検出が可能である。 我々が依拠している主要なものは、 (a) SendとReceiveノードペア間での通信の失敗 (b) マスタープロセスから全てのワーカープロセスへの 定期的な健康チェックである。 o 失敗が検出されると全てのグラフ実行は中断され、最初 から処理が始められる。ただし、変数ノードは、グラフの実 行をまたいでパーシステントであるので、テンソルを参照 していることに注意。
  215. 215. o 我々は、整合的なチェックポイントと再起動時にその状態 から回復することをサポートしている。特に、それぞれの 変数ノードは、Saveノードに接続されている。これらの Saveノードは、定期的に、例えばN回の繰り返しの後一 度とかN分ごとに一度とか、実行される。これが実行され ると、変数の内容は、例えば分散ファイルシステムのよう な、パーシステントなストレージに書き出される。同様に、 全ての変数ノードは、再起動後の最初の繰り返しでのみ 利用可能なRestoreノードに接続されている。4.2節に、 どのようにして、あるノードでグラフのある実行のみが可 能になるかについて詳しく触れている。
  216. 216. 4 拡張 この節では、2節で導入された基本的なプログラミン グ・モデルの、さらに進んだいくつかの特徴について 述べる。
  217. 217. 4 拡張 o 4.1 勾配計算 o 4.2 部分的な実行 o 4.3 デバイスの制約条件 o 4.4 制御の流れ o 4.5 入力演算 o 4.6 キュー o 4.7 コンテナー
  218. 218. 4.1 勾配計算 o 多くの最適化アルゴリズムは、マシン・ラーニングの訓練ア ルゴリズムでよく使われている確率的な勾配降下法[45]を 含めて、入力の集合に対するコスト関数の勾配の計算が 行われる。こうした計算へのニーズはとても高いので、 TensorFlowでは、自動的な勾配計算を組み込みでサ ポートしている。もしも、あるTensorFlowのグラフの中の テンソルCが、おそらくは複雑な計算を通じて、あるテンソ ルの集合{Xk}に従属しているのなら、組み込み関数は {dC/dXk}を返すだろう。勾配テンソルは、他のテンソルと 同じように、次のような手続きを持ちいてTensorFlowグラ フを拡張することで計算される。
  219. 219. o TensorFlowが、テンソルCの、Cが依存しているあるテン ソルIについての勾配を計算する必要があったとしよう。ま ず最初に、計算グラフの中でIからCへの経路を見つける。 それから、CからIへと逆向きに辿る。そしてTensorFlow のグラフに対して、この逆向きの経路上の全ての演算に ノードを追加する。チェイン・ルール(結合ルール)を利用 して逆向きの経路にそって部分的な勾配を構成する。新し く追加されたノードは、もとの前向きの経路で対応する演 算の「勾配関数」を計算する。勾配関数は、いずれかの演 算によって登録されているかもしれない。
  220. 220. o この関数は入力として、逆方向の経路に沿ってすでに計 算された部分的な勾配を取るだけでなく、オプションとして 順方向の演算の入力と出力を取る。図5は、図2の例で、 コストに対する勾配を計算している様子を示している。灰 色の矢印は、特定の演算については利用されなかった勾 配関数へのオプションとして可能な入力を表している。図 1に対する追加で必要なことは、次のような勾配を計算す ることである。 [db,dW,dx] = tf.gradients(C, [b,W,x])
  221. 221. 図2のグラフで計算される勾配
  222. 222. o 一般的に、演算は複数の出力を持つ。Cは、それらの幾 つかにだけ依存しているのかもしれない。例えば、演算O は二つの出力 y1とy2を持っていて、Cはy2のみに依存 しているとしよう。この時Oの勾配関数への最初の入力は 0 にセットされる。なぜなら、dC/dy1 = 0 だから。 o 自動的な勾配計算は、最適化、特にメモリー利用の最適 化を複雑なものにする。「前向き」に計算の部分グラフを 実行している時、すなわち、それはユーザーによって明示 的に構成されたものなのだが、グラフが構成された順序を 観察することでどのノードが次に実行されるかを決定する という意味のある経験則は、うまく働かない。
  223. 223. o このことは、一般的には次のことを意味する。一時的な出 力は構成されてただちに消費されるので、そのメモリーは すぐに再利用される。経験則が効率的でない時には、 ユーザーはグラフの構築の順序を変えたり、第5節で述べ るようにコントロール従属を追加できる。勾配ノードが自動 的にグラフに追加される時には、ユーザのコントロールは 小さいものになり、経験則も効かなくなる。特に、勾配は 前向きの計算順序をひっくり返すので、勾配計算の最後 のあたりで、グラフの実行で以前に使われていたテンソル が、再び必要になることがしばしば起きる。
  224. 224. o こうしたテンソルは、乏しいGPUのメモリーを大量に押さえ て、計算のサイズを不必要に制限する可能性がある。 我々は、こうした場合をよりよく扱うことのできる改良のた めに積極的に働いている。それらには、次のものが含ま れている。グラフ実行の順序を決めるもっと洗練された経 験則、テンソルをメモリーに保持するのではなく再計算す ること、 長生きなテンソルをGPUメモリーからもっと大量 にあるホストCPUのメモリーにスワップすること。
  225. 225. 4.2 部分的な実行 o クライアントは、実行グラフの全体ではなく、部分グラフだ けを実行したいことがよくある。これをサポートするために、 クライアントがセッションに計算グラフを一度セットアップす れば、Runメソッドが全体のグラフの任意の部分グラフを 実行することを可能にする。また、グラフのエッジに沿って 任意のデータを挿入できるし、グラフの中のどんなエッジ にそって流れるデータも取り出すことができる。 o グラフの中のそれぞれのノードは名前を持っている。そし て、ノードのそれぞれの出力は、ソース・ノードの名前と0 から番号付けられた出力ポートで同定される。(例え ば、”bar:0”は、”bar”ノードの最初の出力を指 し、”bar:1”は、二番目の出力を指す。等々。)
  226. 226. o Run呼び出しの二つの引数が、計算グラフの実行される べき正確な部分グラフを定義するのを助けることができる。 第一に、Run呼び出しは、 “name:port”という名前でテ ンソルの値を与えられたオプショナルなマッピングを、入 力として受けつける。第二に、Run呼び出しは、 output_namesを受け取る。それは、出力の名前 [:port]で指定されたリストで、どのノードが実行されるべ きかを示している。もしもport部分が名前にあれば、Run 呼び出しが成功裏に終わった時、そのノードの特別な出 力テンソルの値がクライアントに返されるべきである。
  227. 227. o グラフは、入力と出力に与えられた値を元に変形される。 入力で指定されたnode:portは、feedノードに置き換え られる。それは、Run呼び出しで利用される Rendezvousオブジェクトの特別に初期化されたエント リーから、与えられた入力テンソルをピックアップするだろ う。同様に、それぞれのポート付きの出力の名前は、特別 のFetchノードに接続される。それは、出力テンソルを保 存のために整理して、Run呼び出しが終了した時、クライ アントにそれを返す。最終的には、グラフがこれらの特別 なfeed, fetchノードの挿入で書き換えられた時、
  228. 228. o 実行するノードの集合は、次のようにして決定される。全 ての出力で名前が付けられた全てのノードからスタートし て、グラフの従属性を利用してグラフを逆向きに進んで、 書き換えられたグラフの中で出力を計算するために、必ず 実行されるべきノードの完全な集合を決める。図6は、元 のグラフが左側にある。変形されたグラフは、入力 =={b} で、出力=={f:0}で、Runが呼び出された時 の結果である。我々は、ノードfの出力の計算のみが必要 なので、ノードd や e を実行しない。なぜなら、それらはf の出力には寄与していないからである。
  229. 229. 4.2 Partial Execution
  230. 230. 4.3 デバイスの制約条件 o TensorFlowのクライアントは、ノードについて、どのデバ イスが実行可能かについての部分的な制約条件を与える ことで、デバイス上のノードの配置をコントロールできる。 例えば、”このノードは、GPUタイプのデバイス上にのみ置 くこと” とか “このノードは、 /job:worker/task:17 内 の任意のデバイス上に置くことができる” とか “このノード は、variable13 という名前のノードと同じマシン上に置く こと” 等々。
  231. 231. o こうした制約条件の範囲の中で、配置アルゴリズムはノー ドのデバイスへの割り当ての選択に責任を持っている。そ れは、計算の高速な実行を提供し、グラフノードのサブ セットを実行するためにデバイス上で必要とされるメモ リーの総量を制限するといったような、デバイス自身に よって課せられた、様々な制約条件を満たす。
  232. 232. o こうした制約条件を想定することは、3.2.1節で述べた配 置アルゴリズムの変更を要求する。我々は、まず、それぞ れのノードにとって可能なデバイスの集合を計算し、つい で、グラフのcollocationの制約条件にunion-findのア ルゴリズムを使って、一緒に配置されるべきグラフの要素 を計算する。こうした要素全てについて、可能なデバイス の集合の共通部分を計算する。ノードごとに計算された可 能なデバイスの集合は、容易に、配置アルゴリズムのシミ レーターに適合する。
  233. 233. 4.4 Control Flow o いかなる明示的な制御の流れの構造を持たないデータフ ロー・グラフは、非常に表現力が高いのだが、条件式や ループがサポートされている方が、もっと簡潔で効率的な マシン・ラーニング・アルゴリズムの表現へと導く多くの ケースを観察してきた。
  234. 234. o 多くは、Arvind [3]で記述されたデータフロー・マシンの アプローチと同じように、我々は、プリミティブなコントロー ル・フローの小さなセットをTensorFlowに導入し、 TensorFlowをサイクルを持つグラフもハンドルできるよう に一般化した。SwitchとMergeの演算は、ブール値を持 つテンソルの値に基づいて、ある部分グラフ全体の実行 をスキップすることを可能にする。Enter, Leave, NextIteration 演算は、繰り返しを表現することを可能 にする。高級言語での、if 条件式や while ループは、こ うしたコントロール・フロー演算を持つデータフロー・グラフ に、簡単にコンパイルされうる。
  235. 235. o TensorFlow のランタイムは、タグとフレームの概念を実 装している。概念的には、 MIT Tagged-Token machine [4] に似ている。ループの繰り返しはタグに よってユニークに名前が与えられ、その実行状態は frameで表現される。入力は、それが利用可能になった 時いつでも繰り返しに入ることができ、こうして複数の繰り 返しがコンカレントに実行されうる。
  236. 236. o TensorFlow は、コントロール・フローを持ったグラフを実 行するのに、分散協調メカニズムを利用する。一般的に 言って、ループは、沢山のことなったデバイスに割り当て られたノードを含むことができる。それゆえ、ループの状態 を管理することは、分散終了検出の問題になる。 TensorFlowのソリューションは、グラフの書き換えに基 づいている。グラフの分割の間に、我々は自動的にその 分割された部分のそれぞれにコントロール・ノードを追加 する。これらのノードは、小さな状態マシンを実装していて、 それぞれの繰り返しの開始と終了をオーケストレートし、 ループの終了を決定する。それぞれの繰り返しで、ループ の終了条件を所有するデバイスは、全ての参加している デバイスに小さなコントロール・メッセージを送る。
  237. 237. o 以上で説明したように、我々は、しばしば、マシン・ラーニ ング・モデルを勾配降下法で訓練する。そして、勾配の計 算をデータフロー計算の一部として表現する。モデルがコ ントロール演算を含む時、我々はモデルに対応する勾配 計算について説明する必要がある。例えば、if条件式を 持ったモデルは、この分岐に勾配のロジックを適用する時 に、条件のどの分岐が取られたかを知る必要がある。同 様に、While-loopを持ったモデルの勾配計算では、何回 の繰り返しが行われたかを知る必要があり、これらの繰り 返しの間に計算された中間の値にも依拠する必要がある。 基本的なテクニックは、グラフを書き換えて勾配計算に必 要な値を記憶することである。この幾分複雑なコードの詳 細については割愛した。
  238. 238. 4.5 入力演算 o 計算への入力データは、feedノードによって与えられるの だが、大規模なマシン・ラーニング・モデルの訓練で、よく 用いられるもう一つのメカニズムは、グラフの中に、特別 な入力演算ノードを持つことである。それは典型的には ファイル名の集合で設定されて、それが実行されるたびに ファイルの集合に格納されたデータから、一つまたはそれ 以上のサンプルを含んだテンソルを生み出す。このことで、 配下のストレージ・システムから、直接にマシンのメモリー にデータを読み込むことが可能になる。マシンは、引き続 いて、そのデータ上で処理を実行する。
  239. 239. o 設定の段階では、クライアントのプロセスはワーカーのプ ロセスから切り離されている。もしもデータが与えられた時 には、典型的には、余分なネットワークのホップが必要に なるかもしれない。(ストレージ・システムからクライアント へ、クライアントからワーカーへ。それに対して、入力ノー ドを使う場合には、ストレージ・システムから、直接、ワー カーにいく)
  240. 240. 4.6 キュー o キューは、我々がTensorFlowに追加した、有用な特徴 である。それは、グラフのことなった部分を、非同期に実 行することを可能にする。可能的には、ことなったリズムで の実行も。また、Enqueue, Dequeue演算を通じてデー タを手放すことも可能である。 Enqueue 演算は、キュー の中でスペースが利用可能になるまでブロックされ、 Dequeue 演算では、キューの中で期待される際少数の 要素が利用可能になるまでブロックされる。
  241. 241. o キューの一つの使い方は、以前に投入されたバッチ・デー タが、マシン・ラーニング・モデルの一部で、引き続き処理 中であっても、入力データのディスク・ファイルからの先読 みを可能にすることである。 キューはまた、大規模なバッ チ処理で、より複雑な勾配の組み合わせを計算するため に、たくさんの勾配を蓄積するような、データのグルーピン グにも、リカレント言語モデルで、様々に異なった入力文 を、処理を効率的に行うために、ほぼ同じ長さの文をまと めてグルーピングするさいの置き場としても利用される。
  242. 242. o 通常のFIFOキューに加えて、我々は、シャフリング・ キューも実装した。これは、その要素を大きなメモリー上 のバッファーでランダムにシャッフルするものである。この シャフリングの機能は、マシン・ラーニングのアルゴリズム にとって、例えば、サンプルを処理する際にその順序をラ ンダムに変えたい時に役に立つ。
  243. 243. 4.7 コンテナー o コンテナーは、TensorFlowの内部で長時間にわたって 生き続ける複製可能な状態を管理するためのメカニズム である。Variableの保存場所は、コンテナーの中にある。 デフォールトのコンテナーは、プロセスが終了するまで永 続する。ただ、我々は、他の名前を持つコンテナーも認め ている。 o コンテナーは、その内容を完全にクリアすることでリセット されうる。コンテナーを使うことで、異なるセッションに関連 付けられた完全に分離されている計算グラフをまたいでさ えも、状態を共有することは可能である。
  244. 244. 5 最適化 この節では、パフォーマンスとシステムのリソースの 利用を改善する、TensorFlow実装での幾つかの最 適化について述べる。
  245. 245. 5 最適化 o 5.1 共通の部分表現の削除 o 5.2 データ通信とメモリー使用をコントロールする o 5.3 非同期カーネル o 5.4 カーネル実装での最適化ライブラリー o 5.5 損失のある圧縮
  246. 246. 5.1 共通の部分表現の削除 o 計算グラフの構築は、クライアント・コードでは、多くの異 なった抽象のレイヤーで行われるので、計算グラフは、容 易に同じ計算の冗長なコピーを含むことになる。この問題 をハンドルするために、 Click [12] で記述されたのと似 たアルゴリズム、共通部分表現パスを実装した。これは、 計算グラフ上で走って、同じ入力と同じ演算の型を持つ複 数の演算のコピーを、ただ一つに正規化する。そして、こ の正規化を反映するように、エッジを適切にリダイレクトす る。
  247. 247. 5.2 データ通信とメモリー使用を コントロールする o TensorFlow演算の注意深いスケジューリングは、特に データ転送とメモリー利用に関しては、システムのより良 いパフォーマンスに結果する。特に、スケジューリングは その間、演算間の中間結果がメモリーに保持される時間 枠と、それゆえ、ピーク時のメモリー消費をを削減できる。 この削減は、メモリーが乏しいGPUデバイスでは特に重 要である。さらに、デバイスをまたいだデータ通信の協調 はネットワーク・リソースにとって、衝突を削減する。
  248. 248. o スケジューリングの最適化には多くの好機があるのだが、 ここでは我々は、特に必要で効果的なものであると我々 が見出したものにフォーカスする。それは、リモートの値を 読むReceiveノードのスケジューリングに関係している。 もし、何も事前の警告がなかったとすると、これらのノード は、必要になるずっと前から開始される。可能的には実行 がスタートした時に一斉に。 ORの世界ではよく知られて いる、可能な限り限り早く,可能な限り遅くという (ASAP/ALAP) 計算を実行した。我々は、いつReceive ノードをスタートさせるべきかを評価するためにグラフのク リティカルな経路を分析した。その後、その結果が必要に なるその直前までこれらのノードのスタートを遅らせるとい う狙いをもって、コントロール・エッジを挿入した。
  249. 249. 5.3 非同期カーネル o Computeメソッドの最後に実行を終了させる、通常の同 期型のカーネルに加えて、我々のフレームワークは、ブ ロックしないカーネルもサポートしている。こうしたノンブ ロッキングなカーネルは、 Computeメソッドは、カーネル の実行が終わった時に起動すべきcontinuationを渡さ れるという点で、少し違ったインターフェースを利用してい る。これは、沢山のアクティブなスレッドが走っていて、メモ リーの使用やその他のリソースの点で、比較的に高価で ある環境への最適化である。これによって、IOや他のイ ベントが起きるのをひたすら待つ間、実行スレッドを際限 のない時間、縛り付けるのを避けることを可能にする。
  250. 250. o 非同期カーネルの例としては、Receive カーネルと Enqueue, Dequeue カーネルがある。 (もし、キュー のスペースに空きがない場合や、読まれるべきデータが ない場合には、ブロックする必要があるのだが)
  251. 251. 5.4 カーネル実装の最適化ライブラリー o 我々は、ある演算のカーネルについては、既存の高度に 最適化された数値計算ライブラリーを、しばしば利用して いる。例えば、異なったデバイス上で行列の掛け算を行う 最適化されたライブラリーは多数存在している。 BLAS [15], cuBLAS [39] がある。ディープ・ニューラル・ネッ トワークでのコンボリューションの為のGPUライブラリーと しては、 cuda-convnet [28] や cuDNN [9] がある。 我々のカーネル実装の多くは、こうした最適化されたライ ブラリーへの比較的薄い層からなるラッパーである。
  252. 252. o 我々は、システムのカーネル実装の多くで、オープンソー スの Eigen linear algebra library [25]を、かなり積 極的に利用している。TensorFlow開発の一部として、 我々のチームは( Benoit Steinerを中心とする)、オー プンソースのEigenライブラリーを、任意の次元のテンソ ル操作をサポートするように拡張してきた。

×