Style Transfer

Style Transfer を Stanford機械学習クラスの CS 20SI の課題で実装してみた。Style Transfer とは絵画の写真から作風を特徴として、別の画像にその作風を適用するもの。Style Loss と Content Loss の和を最小化する方向で画像を生成するのが面白い。しかしながら一方でレイヤーの構造とかもろもろ職人芸的で自分で一から構築できる自信がない。課題のコードはこの辺

その1




その2



Chatbot tweet listener と reply worker を分離した

prediction の際に時々落ちる。そのたびに落ちないように修正しているが、まだまだ未知のものがありそう。落ちてしまうと reply できないままに情報が失われてしまう。これを改善するためにプロセスを分けて

  • listener: user stream を listen して tweet を serialize して sqlite に保存
  • reply worker: sqlite から1つずつ処理して predict & reply

とするようにした。

「1手詰ハンドブック」完了

詰将棋を始めて続けることが今年の目標の一つ。1日3問ずつ解いてようやく1手詰ハンドブック終わった。当初の目的である脳内ワーキングメモリの増量効果はまだ感じていない。
次は 3手詰ハンドブック〈2〉 やる。

seq2seq の chatbot を日本語で動かしてみた

最近ずっと NN/CNN/RNN/LSTM などで遊んでいたのだけど Seq2Seq の encoder/decoder と word embeddings を理解したかったので Seq2Seq の chatbot を動かしてみた。Keras でフルスクラッチで書いていたのだけど上手く動かず。論文読んでもわからないところがあったので https://github.com/1228337123/tensorflow-seq2seq-chatbot を自分なりに読み解いてプロセスが別れてわかりやすいように書き換えた。同時に日本語に対応させて Twitter Bot として動くようにした。

会話例



seq2seq

Google 翻訳などでも利用されている seq2seq というタイプの Neural Networks を利用しています。入力も出力も時系列データ。例えば会話とか翻訳とかに使えます。入力側に Encoder、出力側に Decoder という 2個のネットワークがあるのが特徴です。


Layer Size=256, Num Layers=3, Max Vocabulary=50000 で training しました。twittertweet/reply のペアをおよそ 17 万個が training data です。

試してみたい人

https://twitter.com/higepon_bot に話しかけてみてください。Macbook Pro で動いているボットが返事をするかもしれません。(多分数日後にはオフラインになります)

動かしてみたい人

https://github.com/higepon/tensorflow_seq2seq_chatbot にあります。
Python3 や Tensorflow を入れて README.md のとおりにスクリプトを実行して下さい。Twitter の会話データ(=訓練データ)は自分で取得する必要があります。詳しくは README.mdを見てください。

Fluent Python を読んだ

Jupyter 上でよく Keras + Python を書くようになってきたので読んだ。omo さんが読んでいたから真似したともいう。Python に関する知識は「インデントの言語」、「numpy すごい」程度。見よう見まねでコードを書いていた状態だった。

読んで一番良かったのは Python というか Guido の思想がよく分かったこと。__ からはじまる一連の method をクラスに実装することですんなりと Python らしい動きのクラスになるさまはとても美しいと思った。


またタイミングよく Keras でメモリにのらないデータを Train するメソッドを使おうとしているときに、generator の章を読んでいて理解が深まった。


正直適当に読み進めた章もある。Coroutine、async IO、annotation、meta programming のあたりはだいたいこんな感じねでスキップした。必要になれば読み返せるし、他の言語でやったしね。

Fluent Python
Fluent Python
posted with amazlet at 17.04.15
Luciano Ramalho
Oreilly & Associates Inc
売り上げランキング: 14,522

Seq2Seq の疑問を解決するために論文を読む

疑問1 encoder の input について

Seq2Seq encoder に sentence を input するときに Word Embeddings をするのだけど、input が [word_vec1, word_vec2, ..., word_vecn] のように word vector の sequence になるような気がするが自信なし。
Decoder/Encoder を提案した https://arxiv.org/abs/1406.1078 | Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation を読むと。"We used rank-100 matrices, equivalent to learning an embedding of dimension 100 for each word." と書いてあるから合っているっぽい。


追記
"Each word of the source phrase is embedded in a 500-dimensional vector space: e(xi) ∈ R500." と書いてあるから正解。

疑問2: encoder / decoder の間でやり取りする c について

C は fixed vector であるという記述と、encoder の hidden state そのものが decoder に渡ると読めるものもある。どちらだろうか。前述のオリジナル論文だと "The encoder is an RNN that reads each symbol of an input sequence x sequentially. As it reads each symbol, the hidden state of the RNN changes according to Eq. (1). After reading the end of the sequence (marked by an end-of-sequence sym- bol), the hidden state of the RNN is a summary c of the whole input sequence.
The decoder of the proposed model is another RNN which is trained to generate the output se- quence by predicting the next symbol yt given the hidden state h⟨t⟩." とかいてあるから hidden state h と C は同じものを指しているような気がする。

追記
c = tanh Vh⟨N⟩ だった。

疑問3: decoder の output も word_vector なの?

decoder を train するときに y として与えられる正解データの sentence/word もやはり word_vector なんだろうか?それとも vector of (index of word)?
"e(y)" として論文の後半に出てくるから embedding だ。


ただし decoder の出力自体は j 番目の word の probability を計算しているので全 vocabulary から選んでる?(まだわからない)

unk の扱いについて

unk は vector でどこに存在するのか?