質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

469閲覧

『Computational Graphs』という言葉に翻弄されたか?

oookabe

総合スコア126

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2グッド

2クリップ

投稿2018/09/14 00:45

編集2018/09/15 05:42

[追伸] ※ 純粋にプログラマーとする方は読むのは時間的に無駄で、わけが分からなくなるので、数理系やAI関係の方にのみお願いします。

長い間ソフト開発に関わってきましたが、ぶっちゃけ『Computational Graphs』を知るのはごく最近の事です。
すごい新しい技術または概念だと思って、グラフ理論に関する書籍を調べたが、出ません。
★ ショックな事に, 今の時点(2018-9)<Wekipedia>にさえないのです。

ネットでいろいろ『Computational Graphs』に関する説明例を調べたら、どうも『Computational Graphs』そのものは四則計算が発明された時点に存在したはずだと感じました。【そうでしょ?

単に、Neural network分野では四則計算の連続を『Computational Graphs』と名付けて、そのシーケンスの構造を解析し、Neural networkに対応するLibrary/Frameworkによって自動微分を実現してくれるということですね。【そうでしょ?

当然、同じ『Computational Graphs』構造を持っても、解析せず、自動微分を実現してくれない Neural network Library/Framework も存在するはず。【そうでしょ?

要は『Computational Graphs』という言葉が新しいものの、
その自体は新しい技術や概念ではないのです。

##上記【そうでしょ?】の処について皆様のご見解をお伺いしたいのです。

どうぞ宜しくお願い致します。

【追加】同じforward 計算式に対して、非自動微分と自動微分LIBのコーディング様式の比較
![イメージ説明]

OOZAWA, leilei👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oookabe

2018/09/14 03:26

特殊な分野かもしれません。 一定の見識のある方しか理解できないかと思います。
Zuishin

2018/09/14 04:29

計算グラフというのはこれのことではありませんか? https://chainerfan.jimdo.com/chainer-v3-%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A8%B3/visualization-of-computational-graph/ 四則計算が発明されたのは人類文明発祥までさかのぼります。なぜ同時期に発生したと考えるのか、また当時の計算グラフはどのようなものであったと考えているのか追記をお願いします。
Zuishin

2018/09/14 04:31

何をもって計算グラフと呼ぶのか、また最初期の計算グラフはどういうものなのかを明確にすることは、一番目の「そうでしょ?」に回答するのに必要な情報です。
leilei

2018/09/14 06:04

『複数のユーザーから「問題・課題が含まれていない質問」という意見がありました』------視野の狭さに恥ずかしい
Zuishin

2018/09/14 06:53

ヘルプが読める人の方が主観で判断する人より視野が広いと思います。https://teratail.com/help/avoid-asking 問題・課題が含まれていない質問=teratailは困っている人の質問を解決するサービスです。そのため、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。 何か困っている理由があり、最適解を見つける為の知見を得たい場合は、その理由や何が知りたいのかを明確に記述してください。
hayataka2049

2018/09/14 07:37

質問とあまり関係ない話題で申し訳ないのですが、前から薄々思っていたのですが、oookabeさんとleileiさんは同一人物なのですか?
oookabe

2018/09/14 09:10 編集

皆さんお返答有難うございます。トッピ主です。 視野が狭いかどうかという表現が好きではないです。 ただ、『漠然とした興味から票を募るような質問や、意見の主張をすることを目的』と言う表現にも非常に疑問です。 票を頂いたのは名誉な事ですが、我々は忙しい社会人で、沢山の文字と時間を費やしてここで『票』を取得しようとする方はいるのでしょうか。 分野によって、比較的に抽象的な概念や思想、方法論的な事は非常に大切です。 『漠然』であるかどうかに関してはその人の専門や経験、知識によって感覚が違ってくるのです。 同様に、質問者が何が問題として出されたかについても、分野外の人などに理解しにくい事も良くあります。 批判される側として、それなりの権利もあるかと思いますので、あえてここで解釈しました。   ◆批判行為自体に堅く擁護します。 (もちろん、技術問題自体に対するコメントいただくほうはもっと建設的だと思います。)
oookabe

2018/09/14 09:12

皆さんお返答有難うございます。トッピ主です。 視野が狭いかどうかという表現が好きではないです。 ただ、『漠然とした興味から票を募るような質問や、意見の主張をすることを目的』と言う表現にも非常に疑問です。票を貰うのは名誉な事だと認めますが、我々は忙しい大人です。沢山の文字と時間を費やしてここで『票』を取得しようとする方はいるのでしょうか。 分野によって、比較的に抽象的な概念や思想、方法論的な事は非常に大切です。『漠然』であるかどうかに関してはその人の専門や経験、知識によって感覚が違ってきます。 誤解や不理解で批判をなさっても宜しいが、批判される側としてそれなりの権利もあるかと思いますのであえてここで解釈します。  ◆批判行為自体に堅く擁護します。 もちろん、技術問題自体に対するコメントのほうはもっと建設的だと思います。
Zuishin

2018/09/14 09:17

多くの人から漠然とした疑問だと思われているのは間違いありません。そうでないと言うなら、どんな問題解決のために答えが必要なのかを示す必要があります。
oookabe

2018/09/14 10:15 編集

もっと多くの専門の方が「漠然とした疑問」ではないと思われるかもしれません! 誰でも理解できる問題でもないし、そういう期待はしておりません。関心の気持ちに感謝しますが、悩まれなくても宜しいです。 すでにこの分野に造詣のある有識者から納得のいく回答を得ております。
Zuishin

2018/09/15 00:00

すでにこの分野に造詣のある有識者から納得のいく回答を得ているなら速やかにベストアンサーを決めて解決済みにしてください。
Zuishin

2018/09/15 03:21

すでにこの分野に造詣のある有識者から納得のいく回答を得ているなら速やかにベストアンサーを決めて解決済みにしてください。
guest

回答2

0

計算グラフは計算の過程をグラフによって可視化したもの、くらいの理解でいいのではないでしょうか。つまり、計算グラフそのものは計算に何も影響せず、あくまでも、ユーザのコードの理解を促すものという理解です。
結構有名な書籍「ゼロから作るdeeplearning」の中で誤差逆伝播法を解説に計算グラフが用いられています。その際、「視覚的に理解してもらいたいのでこの方法を使った」という主旨が本文に記載されています。ここからも上記の見解はそれほど違っていないと考えます

こう考えると概ねのご質問はイエスでいいかと思います。

ひとつ、コメントすると誤差逆伝播を使わないフレームワークってあるのかな?と感じています。数値微分はかなり計算に時間を要するので誤差逆伝播がデフォルトと考えます。すると、解析的アプローチを取らざるを得ないのではないかと考えます

投稿2018/09/14 07:40

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oookabe

2018/09/14 09:38 編集

お返答有難うございます。 >計算グラフは計算の過程をグラフによって可視化したもの そうですね。そういう風に理解しようとしていますが、tiitoiさまが書かれたように、計算機の世界では、『データ構造』として理解するほうはもっと良いと思われますね。 恐らく、『データ構造』で計算式を保存し、将来偏微分を求めるために"symbolic 数式微分"の手法で実現するのでしょうね。。。  訂正:TensorFlowの場合そうではなく、tiitoi様の回答に従います。
R.Shigemori

2018/09/14 10:21

tensorflowの実装は未確認ですが、「ゼロから作るdeeplearning」だと、forwardとbackwardがあらかじめ関数として実装されています。つまり、乗算ならこうする、対数なら・・・、と決められた方法で計算します。これがtiitoiさんが「解析的に」と表現する所以です。 誤差逆伝播のすごいところは、何層にも渡る複雑な計算式をパーツごとの微分を逆方向に行うと結果的に全体の微分なることです。これによって、モデルの計算式全体を把握する必要がなくなります。つまり、モデルの計算式全体をデータ構造として保持したり、symblicな表現をする必要もなくなります
oookabe

2018/09/15 00:06

なるほど、、有難うございます。
guest

0

ベストアンサー

Q1

1ネットでいろいろ『Computational Graphs』に関する説明例を調べたら、どうも『Computational Graphs』そのものは四則計算が発明された時点に存在したはずだと感じました。【そうでしょ?】

計算グラフは理論というより、プログラミングで出てくるスタックやリストなどと同様、データ構造 にあたります。

Wikipedia

1データ構造(データこうぞう、英: data structure)は、計算機科学において、 2データの集まりをコンピュータの中で効果的に扱うため、 3一定の形式に系統立てて格納するときの形式のことである。

計算グラフは演算や値をノード、データの流れをエッジで表したというだけの話です。そのようなデータ構造にすると、順伝搬、逆伝搬を行う計算ライブラリの設計がしやすいのです。

Q2

1単に、Neural network分野では四則計算の連続を『Computational Graphs』と名付けて、そのシーケンスの構造を解析し、Neural networkに対応するLibrary/Frameworkによって自動微分を実現してくれるということですね。 2当然、同じ『Computational Graphs』構造を持っても、解析せず、自動微分を実現してくれない Neural network Library/Framework も存在するはず。

微分の計算ができなければ、バックプロパゲーションができないので、ニューラルネットワークのライブラリに限れば、すべて自動微分できると思います。

Q3

1要は『Computational Graphs』という言葉が新しいものの、 2その自体は新しい技術や概念ではないのです。

Google トレンドを見ると、以前から言葉としてはあったように思いますが、TensorFlow が世に出てから目にするようになったと思います。

イメージ説明


質問に対する追記1

TensorFlowの場合、四則計算の構成を『データ構造』に表現しておくというのは、四則計算を単に数値計算するのみならず、将来微分計算するために数式構造を保存してsymbolic数式的に解析しようとするのでしょうね?

バックプロパゲーションを行うのに、順伝搬時に計算した値が必要なので、保存しておく必要があります。
演算をノードで表現して、計算した値を保持しておく設計にしておくのは理にかなっていると思います。

つまり、数値微分ではなく、Neural network のLIBはsymbolic数式で偏微分を求めていくと考えて大丈夫でしょうか。

バックプロパゲーションで計算される値は数値解ではなく、解析解であるのは確かです。
しかし、微分を mathmatica や sympy でできるようなシンボル操作で行い、解析解を求めているわけではないです。予め、微分の解析解を計算する関数を用意しています。
例えば、シグモイド関数を例に考えると、f(x) = 1/(1+exp(-x)) なので、微分すると、d/dx f(x) = f(x)*(1-f(x)) になりますよね。
なので、シグモイドを計算する「ノード」では、f(x) と f'(x) を計算する処理を両方定義してあります。

python

1class Sigmoid: 2 def __init__(self): 3 self.out = None # 逆伝搬用に出力を保持しておく 4 5 def forward(self, x): 6 out = 1 / (1 + np.exp(-x)) 7 self.out = out 8 9 return out 10 11 def backward(self, dout): 12 dx = dout * (1.0 - self.out) * self.out 13 14 return dx

DNNライブラリがどうなってるのか興味がお有りなら、他の回答者さんも進めていますが「ゼロから作る Deep Learning」という本を見てみるとよいですよ。

質問に対する追記2

ユーザ定義の数式にはやはり構造を解析して初めて解析形式の微分結果を得るでしょう。例えば、 y = x*x + z*x*exp(z) + z*sin(x) exe(z) と sin(x) に関する導関数を予め用意できても、関数yの導関数が予め用意できないですから、、、?

symbolic 操作を行う必要はありません。
上記の例の場合、構成要素である「multiply(x, y)」「add(x, y)」「exp(x)」「sin(x)」の4つの演算について、微分の計算が定義されていれば、「連鎖律」を用いて、「合成関数 y」の微分の計算値を得ることができます。

納得できないようであれば、次の手順で勉強してみてください。

  • (多変数関数の)連鎖律について理解する。
  • 連鎖律を用いた逆伝播法 (バックプロパゲーション) について理解する。

バックプロパゲーションと計算グラフの関係は次の参考リンクを貼っておきます。

質問に対する追記3

Python では、C++ の演算子オーバーロードと同様のことができます。
公式リファレンス を見てください。
もし演算子オーバーロードができないと numpy 配列で普通にやっている演算とかもわざわざ np.add(array1 + array2) などとしなくてはいけなくなりますよね。

python

1class Point: 2 def __init__(self, x, y): 3 self.x = x 4 self.y = y 5 6 def __add__(self, other): 7 return Point(self.x + other.x, 8 self.y + other.y) 9 10 def __repr__(self): 11 return "({}, {})".format(self.x, self.y) 12 13a = Point(1, 2) 14b = Point(2, 3) 15print(a + b) # (3, 5)

投稿2018/09/14 04:07

編集2018/09/15 04:01
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leilei

2018/09/14 05:59

素晴らしい回答ですね!
oookabe

2018/09/14 08:14 編集

お返答ありがとうございます! 確かに素晴らしいですね。 ネット上の説明例を見て、四則計算の構成やプロセスを絵に描いたのは『Computational Graphs』だと理解していますが、四則計算の構成やプロセスを計算機的に表現するには『データ構造』になりますね。 TensorFlowの場合、四則計算の構成を『データ構造』に表現しておくというのは、四則計算を単に数値計算するのみならず、将来微分計算するために数式構造を保存してsymbolic数式的に解析しようとするのでしょうね? つまり、数値微分ではなく、Neural network のLIBはsymbolic数式で偏微分を求めていくと考えて大丈夫でしょうか。
tiitoi

2018/09/14 08:44

コメントに関する回答を追記しました。
oookabe

2018/09/14 10:02 編集

【解析過程をしないが、予め相応の解析解の形式が用意されていて、それで計算すれば、精確になる】 ーーーーーーーーーすっきりですね! でも、既定の初等関数、例えばsin,con,exe tan等はLIB側が予めその導関数を用意できるものの、 ユーザ定義の数式にはやはり構造を解析して初めて解析形式の微分結果を得るでしょう。 例えば、 y = x*x + z*x*exe(z) + z*sin(x); exe(z) とsin(x)に関する導関数を予め用意できても、関数yの導関数が予め用意できないですから、、、? もし、yの導関数が利用者自身が予め定義しておかなければならないのであれば、計算グラフの意味がなくなりますよね。 どうでしょうか。
tiitoi

2018/09/14 12:35 編集

追記を記載しました。 ユーザーが定義した関数でも、すでに定義済みの演算を利用してその関数を作ったのであれば、作成した関数のノードを定義しておく必要はありません。 バックプロパゲーションで解析解が計算されます。
tiitoi

2018/09/14 12:37

Tensorflow、Caffe、Chainer など自分の知るDNNライブラリにおいて、微分をバックプロパゲーション以外で行っているライブラリは聞いたことがありません。(おそらく、ないでしょう) なぜなら、バックプロパゲーションに比べて、効率が悪いからです。
oookabe

2018/09/15 05:22 編集

ご丁寧な解説ありがとうございます。 tiitoiさまが書かれました: >上記の例の場合、構成要素である「multiply(x, y)」「add(x, y)」「exp(x)」「sin(x)」の4つの演算について、微分の計算が定義されていれば、「連鎖律」を用いて、「合成関数 y」の微分の計算値を得ることができます。 これに関連してちょっと不思議な実例(画像)を添付します(Stanford University School of Engineering Lecture 8 | Deep Learning Software より)。 {私が最初に質問を出したウィンドウの後ろに:【追加】同じforward 計算式に対して、非自動微分と自動微分LIBのコーディング様式の比較} [参照link] https://www.youtube.com/watch?v=6SlgtELqOWc&feature=youtu.be&t=1 この例では、計算符号:+,-,*,/ はNumpyと同じ、Python言語のそのものを利用しています。 それにTensorFlowにしても、PytorchにしてもLIBであって、言語ではないため、 『+,-,*,/』操作に対するPython言語以外の余分的なシンボル操作や解釈はないはずですね( = 自分の前の考え方は間違った)。 これらのoperatorをLIBの関数化した版「multiply(x, y)」「add(x, y)」等にすれば、 確かに対応する導関数が予め用意できます。 つきましては、 表面上、TensorFlowとPytorchがNumpyと同じoperator『+,-,*,/』を利用していても、 実はTensorFlowとPytorchがこれらのoperatorが"密かに"再定義されたのでしょうか。 【即ち、C++演算子オーバーロードのようなやり方で実現しました?】
tiitoi

2018/09/15 04:05 編集

回答を追記しました。 > 即ち、C++演算子オーバーロードのようなやり方で実現しました? 答えはそうです。 例えば、Tensorflow の[Tensor](https://www.tensorflow.org/api_docs/python/tf/Tensor) クラスのリファレンスでは、オーバーロードされた演算子は全部書かれてます。 Chainer や Tensorflow などオープンソースのライブラリは Github でコードが見れるので、気になるようでしたら実際確認してください。
oookabe

2018/09/15 05:30

いい勉強になりました。 感謝の気持ちがいっぱいです! もう意味がないと思われるかも知れませんが、 自分が見せたい画面をようやく表示に成功しました↓ (^_^:; 私が最初に質問を出したウィンドウの後ろに: {【追加】同じforward 計算式に対して、非自動微分と自動微分LIBのコーディング様式の比較}で示している画像です。
tiitoi

2018/09/15 05:46

納得されたようでよかったです。 解決でしたら、この質問は Close していただけますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問