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

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

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

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

Python 3.x

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

機械学習

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

Python

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

Q&A

3回答

1377閲覧

『非計算グラフ』的なやり方は?

leilei

総合スコア39

深層学習

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

Python 3.x

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

機械学習

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

Python

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

1グッド

1クリップ

投稿2018/08/17 08:52

コード例からすれば、『計算グラフ』って、どんなAPPのプルグラムでもとっくにみんながやってきたようなものではと思いますね。。。

逆に、『非計算グラフ』的なやり方(コーディング)はどんなものでしょうか。

oookabe👍を押しています

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

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

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

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

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

gm300

2018/08/17 23:45

非計算グラフって何ですか? 非グラフ計算とは言わないものの、それっぽいものはありますよね。「グラフは使うが計算はしない」?掛け算をしないのであれば、「バイナリ(1ビット)でif-then-else で処理する」の例はたくさんあります。
leilei

2018/08/18 04:51 編集

御免なさい! 私が言っている『非計算グラフ』とは、計算するのに、『計算グラフ』的なやりかたではないやり方です。それはどんなやり方でしょうか。
guest

回答3

0

グラフ解析せずパラメーターの更新を行う方法にコスト関数の微分値(近似値)を計算した結果を用いることが考えられます。微分値は、与えられた値に対して極小値の加算、減算した2点から近似値が得られるので、あとはこの結果をもとにパラメーターを更新すれば求める結果が得られます。
ただこの方法はかなり原始的なので、効率的ではありません。誤差逆伝播に代表されるグラフ解析に基づく方法のほうがいいのでしょう。

少し変わったものとしてベイズ統計に基づくパラメーター推計というものもあります。この方法は、パラメーターの分布をMCMCを使ってサンプリングして推計するので、コスト関数そのものが必要なく、結果、グラフ解析も不用です。このアプローチはベイジアンネットワークとして進化しているので有望ではないかと思っています。tensorflowにも取り込まれるという話も聞いたので、そのうち実装例が公開されるかもしれません

投稿2018/09/03 04:16

R.Shigemori

総合スコア3376

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

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

leilei

2018/09/03 04:57 編集

貴重な解説本当にありがとうございます。 これに関して実はずっとはっきり分かっていない事があります。 つまり、グラフ的なやり方と『非』グラフ的なやり方は誰が決めるのでしょうか。 ★エンドプログラマーが某プログラミング様式(特殊な算法の表現スタイル)に従ってコーディングすれば、計算グラフが形成されるのでしょうか、それとも、TensorFlowを使えば、意識しなくても計算グラフが作られ、利用されるのでしょうか。
R.Shigemori

2018/09/05 12:18

tensorflowの場合でコメントします。 モデルの実体、コスト関数、パラメーター更新関数はユーザが定義する必要があります。つまり、グラフを形成する必要があると言えます。一方、誤差逆伝播に関するコードは全く意識する必要がありません。どのような順序でパラメーター更新するかはtensorflowが良きに計らってくれると言っていいと思います。 ちなみにtensorflowはコードの書き方が少し独特で初見の際、全く違う言語に思えました。chainerはpythonらしい書き方らしいので、グラフを意識することはほぼないのかもしれません
guest

0

ネットワーク構造を決め打ちして、重み更新の式を手計算で解いておいてハードコーディングするというパターンでしょうか?

多層パーセプトロンを実装してみた - Masaponto's Blog
誤差逆伝播法における行列演算まとめ

もう少し洗練された奴だと、自動微分のアルゴリズムを実装して層の数は増減できるようにしてみた・・・とかそんな感じでしょうか。
https://github.com/scikit-learn/scikit-learn/blob/f0ab589f/sklearn/neural_network/multilayer_perceptron.py#L40
(sklearnのは斜め読みしただけなので、内容を勘違いしているかも)

計算グラフ的なコーディングだと宣言的に書けるのが嬉しいのですが、もっと手続き的に書いていくというアプローチも当然あるでしょう。

当然ですが、どちらにせよ同じ理論にのっとって成立しているのであって、本質的に何か違うとかはありません。

投稿2018/08/18 13:41

hayataka2049

総合スコア30933

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

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

leilei

2018/08/18 14:03

hayataka2049さん お丁寧な解説ありがとうございます。 私はそもそも所謂『計算グラフ』と『計算グラフ』以外のやり方が区別できていません。 両者の間何が違うのでしょうか。
hayataka2049

2018/08/18 14:13

データ構造として計算グラフの何らかの表現を保持して、それを自動で処理するようになっていれば計算グラフ的なやり方と言って良いのでは それ以外はそれ以外以外のなにものでもないでしょうね
leilei

2018/08/18 21:03 編集

貴重なヒント有難うございます。 頭が鈍くて御免なさいね。 > データ構造として計算グラフの何らかの表現を保持して、 これは誰がやるのでしょうか-----プログラマ? それとも計算グラフをサポートするライブラリ? あるいは計算グラフをサポートするプログラミング言語? 例えば、「計算グラフ的なやり方」と非「計算グラフ的なやり方」で下式を計算したい場合、プログラマーとして、コーディングデザイン際の違いは何でしょうか。 f(x,y ) := x*y + cosy * sinx
hayataka2049

2018/08/19 09:25

どこまでソフトに委ねてどこからプログラマが触るかは割と恣意的に決定できる話だと思いますが f(x,y ) := x*y + cosy * sinx は、たとえばこのまま取り扱うのはさすがに面倒なのでS式で(+ (* x y) (* (cos y) (sin x)))と書いたとして、これくらいのものをinputすれば自動で計算してくれるというのがたぶん「計算グラフ的なやり方」でしょう この例だと、「非計算グラフ的なやり方」はアセンブリになっちゃいそう
leilei

2018/08/19 13:20 編集

ご回答ありがとうございます。 面白いです。そうしたら、コンパイラーの仕事(E.g, 逆ポーランド変換)も「計算グラフ的な考え方」を利用していることですね。 つまり、「計算グラフ的なやり方」は、プログラマーが意識して設計するのではなく、解釈側や利用しているLIB側がそういう風にしてくれるという事でしょうか。
hayataka2049

2018/08/19 13:32

>コンパイラーの仕事(E.g, 逆ポーランド変換)も「計算グラフ的な考え方」を利用していることですね そこまで飛躍するのはさすがに違うと思いますが・・・その数式に当てはめて説明するならそういう感じにするしかないでしょうという話です DNNフレームワークで計算グラフを利用する、といえば、計算グラフ(もっと行けばネットワーク構造)を記述すれば後はよしなにやってくれる(アルゴリズムの選択や細かい設定はともかくとして)ということを指すのが普通ではないでしょうか
IS.SEKI

2018/08/20 10:00 編集

hayataka2049さん ご解説ありがとうございます。 『計算グラフ』って、プログラマーサイドのやり方として、『計算グラフ』以外の計算法のコーディングとの違いをまったく感じません。➡ 恐らく、LIB提供側が勝手に『計算グラフ』という概念でやっているのでしょうね。
guest

0

グラフ解析を行わずに、「闇雲に行列計算を行う」っていうのはどうでしょう?
多分、期待と違いますよね。計算量に比べ計算器が非常に非力だった時代は、数桁くらい減らしてしてもしかたがなかったので、あきらめていたような気がします。さらに逆拡散を使わずにSAとか、GAとか使ったものは「隠れ層があって、..」みたいな層数が少なかった古い論文探せば見つかる気もします。
SA = simulated annealing です。
私は、SAは考え方として汎用的ではあったのですが、収束速度が遅く実用的では無い、さらに冷却方法に任意性が高すぎて性能評価でさえ怪しい と考えています。

投稿2018/08/18 06:08

gm300

総合スコア580

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

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

oookabe

2018/08/18 09:32

横から失礼します。 例えば、x*(cosx*sinx + exp(x)) を計算したい場合、 計算グラフ的な計算のためのコーディング様式と「非計算グラフ」で計算するコーディング様式をそれぞれのコードで示していただけませんか(どんな計算機言語でもOK) 宜しくお願い致します。
gm300

2018/08/19 02:03

うーん、「計算グラフ」という言葉の理解が私には足りないみたいです。 そういった、単純な前向き方向の計算だけで計算できるものは、すでに「計算グラフ」ではないのでは?y = a*b+a*c+b*c みたいな式があって、それは、y = (a*b)+(a*c)+(b*c)みたいな順序で計算すると認識した時点で初歩のグラフ的な分析ができ、さらに、後段の計算から、b = 0 or c = 0 の時のみ、yが使われるという分析がなされ、y = a*(b+c) => y = a*b or y = a*c だよね。そうであれば、y=の前のxの計算ももっと楽になる みたいな分析を自動で行うのが高度な計算グラフ的な処理では?
oookabe

2018/08/19 04:10

gm300さま ご回答ありがとうございます。 「計算グラフ」自身はあくまで設計図みたいもので、実際、仰るようなやり方を実現するには、所謂『design and run』と言う仕組みでしょうか。
leilei

2018/08/20 04:41

>『design and run』と言う仕組みでしょうか。 実現する仕組みとして"遅延評価"のほうは適切かと思いますね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問