したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

CS 20SI: Tensorflow for Deep Learning Research

1karino2:2017/03/12(日) 20:15:17
http://web.stanford.edu/class/cs20si/index.html

TensorFlowのがっつりとした入門コースだが、そのまま結構新しめの機械学習の問題にも取り組む。
TensorFlowの入門が凄くしっかりと出来ていて、TensorFlowがどういう物か凄く良く分かる。

動画は無くて講義資料としてスライドとコードのみ公開だが、二日目くらいまで見た範囲ではこれだけで十分に思う。

2karino2:2017/03/12(日) 20:25:29
githubのコードを眺めていて気づいたが、

例えば 03_logistic_regression_mnist_starter.py が穴あきの問題文であり、
03_logistic_regression_mnist_sol.pyが回答のようだ。

3karino2:2017/03/12(日) 20:28:23
最初variableとplaceholderの違いが良く分からなかったが、variableは次のイテレーションまで値を維持したりトレーニング用の変数を表したりするものか。
PlaceHolderは単純に値を代入して実行する何かっぽいな。

4karino2:2017/03/12(日) 20:35:48
4日目のword2vecを見始め。
negative samplingとかnoise constrastive estimationとか知らない…

5karino2:2017/03/12(日) 22:19:09
この辺からは自分で書いてみたいなぁ、と思うが、環境作るのがかったるいのでとりあえず先に進む。

nn.embedding_lookupって単なる行列の掛け算じゃないの?と思いドキュメントを読む。
https://www.tensorflow.org/api_docs/python/tf/nn/embedding_lookup

なるほど、indexで分散される感じかしらね。
この辺はどっかでもうちょっと下の方勉強したいなぁ。

6karino2:2017/03/12(日) 22:39:39
word2vecは元論文を軽く読んだ事あるが、このスライドだけじゃ何やってるか良く分からんなぁ。
そしてコードも何を計算しているのか良く分からない。

せめてcenterとtargetが何か教えてくれよ、という気がする。
この辺は別の所で勉強して、コード例と割り切るくらいが良いかもなぁ。

7karino2:2017/03/13(月) 00:36:56
せっかくなのでword2vecの別のサイトも見るか、という事でまずdeeplearning4jを見てみる。
https://deeplearning4j.org/word2vec.html

そのあと深層学習の本も読んだが、けっきょくのところskip-gramを前提とすると、

1. 単語を適当な行列にかけてベクトルにする
2. ターゲットとなる教師データは前後n個の単語、その一つをzと置く
3. xとzの内積をソフトマックスしたものがzの表現確率となるとして、この値を最大化

という感じかなぁ(p237)。
xとzを得る所がばしっと書いて無いのがなんか不安になる所だが、元論文を読んでも隠れ層が無いニューラルネット、という書き方でバシっと式が書いて無い。
自分の理解では単に行列かけるだけ、と思う。

8karino2:2017/03/13(月) 00:41:05
お、lecture noteが良くかけているな。読んでみよう。

9karino2:2017/03/13(月) 00:47:55
そこからリンクされてたこのスライドがword2vecの入門には良いね。

http://web.stanford.edu/class/cs224n/lectures/cs224n-2017-lecture2.pdf

これにはcenterとかの定義が書いてある。なるほど。xがcenterでzがcontext wordね。

10karino2:2017/03/13(月) 01:17:13
このスライドのp19が素晴らしいな。これこそ自分の知りたかったバシッとした表現だ。
それにしてもこれはどの位大きなタブレット使っているのだろう?

11karino2:2017/03/13(月) 04:09:18
講義notesに戻って、そこからnegative samplingとかについてのリンクがあったので見ている。
http://sebastianruder.com/word-embeddings-softmax/index.html

うわぁ、これは全然知らない奴だ。
Importance Samplingとかを見てるが、こういうの見る時はMCMCやっててよかったって感じだね。
この手のサンプリングベースのやり方は、機械学習を真面目にやるなら、どこかで習熟する必要があるよなぁ。

12karino2:2017/03/13(月) 22:02:18
NCEが良く分からないので元論文を読む事に。

https://www.cs.toronto.edu/~amnih/papers/ncelm.pdf
A fast and simple algorithm for training neural probabilistic
language models

13karino2:2017/03/13(月) 22:46:25
途中まで論文を読んだあと、>>11 のブログ記事に戻ると、NCEがなんとなくわかった気がする。
ノーマライズを真面目に計算すると大変だから、勝手にノーマライズされるようにパラメータのトレーニングを細工する。

その為の細工の方法。
ユニグラムからサンプルされるノイズ単語とトレーニングセットで出てきた単語を混ぜて、それらを分類するロジスティック回帰を作る。
混ぜる比は1:k。
で、実際にこのロジスティック回帰を学習する時のコスト関数の期待値のうち、ノイズ側をkのサンプル結果の平均で近似する。

そしてこのロジスティック回帰を最大化するようにパラメータを学習すると、ちょうど都合よく最後のアウトプットの層がノーマライズされた値に近くなる。

感覚的にはImportance Samplingと似たように、ユニグラムからサンプリングしつつ
その重みを少し調整する訳だ。
その調整の具合はユニグラムの単語k個と実際のトレーニングデータ1個を見比べて、重みを調整していく。
この調整具合をロジスティック回帰で判断させるのだろうなぁ。

あんまりしっかりとは理解出来てないが、雰囲気は分かった。

14karino2:2017/03/13(月) 23:16:11
negative samplingの解釈はこっちの論文もどうぞ、とブログにあったので読んでみた。

https://arxiv.org/abs/1402.3722
word2vec Explained: deriving Mikolov et al.'s negative-sampling word-embedding method

こっちはすっきり分かる。大変わかりやすくて良いね。
そして自分の感覚的な解釈はかなりいい線いってた。よしよし。

15karino2:2017/03/13(月) 23:39:04
Noise Contrastive Estimationを理解したので、もう一度講義のコードを見てみる。

https://github.com/chiphuyen/tf-stanford-tutorials/blob/master/examples/04_word2vec_no_frills.py

おー、すげーよく分かるようになっている!
nce_weightとnce_biasが良く分からんが、inputをembedした物にこれらを掛けるとhになるのかなぁ。
どっちにせよ最終的にはこれ使わないんだよね、たぶん。

まぁこの位分かってブラックボックス感無く使えれば十分だろう。

16karino2:2017/03/13(月) 23:42:19
nce_lossのコードを読む。

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/nn_impl.py#L1154

>>15 の理解であってそうね>nce_weightsとnce_loss

17karino2:2017/03/15(水) 03:33:19
とりあえずCNNまでスライド見終わり。
スライドは良く出てきて大変わかりやすいが、ここからはさすがにコード書いて動かしてみないとなぁ。

どうしよっかなぁ。一応最後まで目は通しておくかなぁ。

18karino2:2017/03/15(水) 18:43:56
RNNを途中まで見たが、これはスライド見るだけではいまいち良く分からないな。
この辺でこのコースは終わりにするか。

19karino2:2017/03/16(木) 01:11:18
word2vecはこっちもいいぜ、と言われて、軽く読んでみた。

http://www-personal.umich.edu/~ronxin/pdf/w2vexp.pdf
word2vec Parameter Learning Explained

Skip GramやNegative Samplingの説明はいまいちだが、one-word contextの説明が詳しくて、入門には良いですね。
one-word contextだけ読んで他の文書に行くのが良い気がした。

20karino2:2017/05/23(火) 08:20:25
CS231nの課題を一通り終えたので、せっかくだからCS 20SIの課題も幾つかやってみようかな。

21karino2:2017/05/23(火) 10:05:59
一通りassignments/exerciseをipynb形式で終えた。良いね。
次はstyle transferでもやってみようかと思ったが、ちょっと大変そうなのでその前にexamplesの方のdeepdreamをやってみたい。

https://github.com/chiphuyen/tf-stanford-tutorials

22karino2:2017/05/23(火) 10:54:42
deepdreamは講義資料にはアルゴリズムの具体的な話が無さそう。
で、実装せよ、とソースには書いてある。
以前見たGoogleの間の層の可視化の話だよな。

https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html

とりあえずまずはコードをJupyter Notebookで触ってみるか。

23karino2:2017/05/23(火) 11:50:22
この課題は自分で解いてみる、というより、問題と解答の差分の所を見て、アルゴリズムを理解する、という感じだな。
Jupyter Notebookに移してTensorflowの最新バージョン用にちょこちょこコード直して動かすのはあっさり動く。
間の中間変数などをprintしたりして挙動を調べる。

24karino2:2017/05/23(火) 12:07:03
まずGraphDefという物があって、これがメモリ上にグラフ構造を保持する為のデータ構造っぽい。
それをimport_graph_defとやると、現在のグラフとして読み込む。この時にPlaceholderに値をフィードするっぽいが、入力の名前がたぶんこのモデルは"input"なのかな。
これはimageから117引いた結果としている。

で、間のレイヤーのweightを取り出して、このweightのmeanに対するinput_imageのgradientを求めている。
つまり、入力のピクセルをちょっとずらしたらweightの平均がどう反応するか、というのを見ている訳だ。
で、以下のようにしているのだから、

image_gradient /= image_gradient.std() + 1e-8
image += image_gradient * step_scale

勾配を登っていく訳だから、より画像をちょっと動かすと重みが増えるように画像を更新していく訳だ。
一番良く重みが反応するような画像、というのはどういう意味かなぁ。


いや、違うな。scoreが増えていっているという事は、 get_layer(layer)[:, :, :, channel]の結果は重みじゃなくて、それを適用した結果のテンソルか。
それの平均が最大って事は、このレイヤーまで来た値が最も強く反応するような画像を生成している訳か。

25karino2:2017/05/23(火) 14:26:04
style transferやるぞ!(゚Д゚)ゴルァ!

26karino2:2017/05/23(火) 14:43:52
avgpoolを実装せい、と言われる。ふむ、言われてみるとどう実装したらいいんじゃろ?
と見てみると普通にavg_poolあるじゃん。
これを呼ぶだけで良いのは分かるのだが、せっかくなので実装も覗いてみるかな。

27karino2:2017/05/23(火) 14:45:16
覗いてみたが、gen_nn_ops._avg_poolが呼ばれているだけで

https://github.com/tensorflow/tensorflow/blob/r1.1/tensorflow/python/ops/nn_ops.py

こいつは自動生成されるスタブらしい。

https://stackoverflow.com/questions/41147734/looking-for-source-code-of-from-gen-nn-ops-in-tensorflow

じゃあここから先を追う気は起こらないな。

28karino2:2017/05/23(火) 14:56:45
vgg_model_sols.pyの方に答えが書いてあるのか。
自分の結果と比べるとスコープとかを使っているね。
ふむ、以後真似しよう。

29karino2:2017/05/23(火) 16:21:04
答えをチラ見しつつcreate_summaryまでは順調に来た所で、summaryってなんぞ?と手が止まる。

Managing experiments and process dataの所のスライドにありそうだな。

30karino2:2017/05/23(火) 16:21:56
後半はほとんど写経になってしまったが、一応一通り理解はした。
さて、このまま実行すればいいのだろうけど、やっぱりnotebookで実行したいので移していくかなぁ。

31karino2:2017/05/23(火) 17:33:32
notebookで一通り動かしてみた。
10分くらいかかったかもしれないが、まぁこの位ならCPUでいいか、という所。

いろいろ触って大分経験値は上がったな。よしよし。

32karino2:2017/05/23(火) 21:56:24
さて、中をちゃんと追っておこう。
vgg_model.pyのload_vggでは、vgg_layersにモデルのパラメータを読み込み、この値をconstとして、同じ作りのネットワークを作っている。

次にlossの方を見ると、なんだか分からず我らが実装させられたのは、特定のレイヤーのアウトプットである事がわかる。
スタイルっぽいレイヤの値を、STYLE_LAYERSに入ってる名前のレイヤーの中間出力とみなす。
コンテント自身はconv4_2の中間出力をそれとみる。

さて、中間層の値は三回predictを実行する事で得る。

1. input_image
2. style_image
3. generated_image (これはN回)

1の中間層の値と2の中間層の値にいい感じに一致するようにgenerated_imageをいじっていく。
これはAdamOpmizerで更新される(!!!)

こんな感じか。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板