ツイートがバズった時の統計データを晒してみる(荒ぶるパン生地)

恥ずかしながら、以下のようなツイートを何の気なしに投稿したら、1.5万リツイート、8.5万いいねとかまでバズってしまったのですが、


 
ツイートがバズった時の統計データ(Twitterのページで見られるやつ)って、あまり見かけたことないな、と思ったので、何かの役に立つ人もいるかもなので晒してみます。

f:id:kanbayashi:20200511082050p:plain
荒ぶるパン生地ツイートの統計データ

なお、どれぐらいリツイートされるとバズったと言うのか基準は良く分からないですが、とりあえず、ねとらぼさんには取り上げてもらったので、バズったと言ってもいいのではないかと思っています。

nlab.itmedia.co.jp


以上です!

ディープラーニングは、ほんま職人芸やなーという話


(このTweetのスレッドをご参照下さい)

深層強化学習なエージェントでFXシストレのシミュレーションというやつの現状報告(2020/03/14)

以下のTweetからはじまるスレッドを参照ください。

【Need Help!】Keras(TensorFlowバックエンド)でのマルチコア・マルチプロセッサ並列化、GPU並列化はどんな実装になっているのだろう?

Keras(TensorFlowバックエンド)でのマルチコア・マルチプロセッサGPU(単体)での並列化によるアクセラレーションについてです。
 
モデルのサイズによっては効果が無い、どころか遅くなる場合もあるというのは経験がある(Google Corabolatoryにて)のですが、では、どのパラメータをどのように変えることで大体同じ結果を、より速く得る(= アクセラレーションの恩恵を受けられるモデルのサイズにしつつ、イテレーションは減らす)ことができるのか、を考えたいのですが、そのためには内部動作を知らないとどうにもならない、と考えています。

個人的には、以下のような実装になってるのではないか、と推測しているのですがどうなんでしょう?
(調べてはみたのですが、TF内の概念レベルのアーキテクチャなんかは公式にあったものの、具体的にどうやってるねんというのは見つけられず・・・。探し方が悪いのかもしれないですが・・・)
 
考えている範囲は、fit関数を呼び出して終わるまでの処理です。
基本的にはミニバッチの単位で並列処理しているのだと推測。
ただ、1ミニバッチずつ渡すのは効率が悪いので、ミニバッチ群のデータ自体は並列処理する主体にそれぞれ担当分を最初にどかっと渡しておくのではないかと。
 
■CPU内のコアもしくは、マルチプロセッサを活用するためのプロセス並列
マスタとワーカがいて、ワーカは担当するミニバッチの勾配の計算が終わったら、その勾配の情報をマスタに送って、マスタはNNの重みを更新して、更新したあとのNNの重みデータをワーカに送って、以降その繰り返し。
通信はプロセス間通信をしているのか、プロセス間で共有メモリを作ってよろしくやってたりするのか不明。
 
GPU 1枚を使った並列化
最初にCPU上のプロセスが、GPUメモリ上に重みデータを展開およびGPU上での実行プログラムを転送。
その後は、GPU上で各ワーカ的な何かが担当するミニバッチ群を処理していく。
1ミニバッチが終わったら、GPUメモリ上に置いてあるデータのロックをとって更新して、次のミニバッチの計算に進む。
一度必要なデータをGPUに転送したら、一回のfitを処理している最中はCPUとのやりとりは基本的に不要。
渡されたミニバッチ群を、指定されたepochだけ処理したら、GPU上のマスタプロセス的存在は、CPU上のプロセスに終了を通知し、CPU上のプロセスがGPU上のメモリを主記憶にコピー(CUDAの使い方の記憶は曖昧なので、最後に結果を得るあたりの記述は特に自信ありません)。
 
 
などと考えましたが、ナイーブな(深層学習の)並列化アルゴリズムを前提とすると、このような実装をした場合、どれかのワーカがNNの重みデータを更新した場合、古い重みデータを使って計算しているワーカの計算中の結果って破棄しないとダメ、つまりバッチ単位で並行に実行するって実装はNGなんですな。
 
ミニバッチの中のサンプル単位(単純には、ミニバッチに含まれるサンプルをワーカごとに均等に分けて割り振る)で並列化しないとダメ・・・?
 
もしくは↓のリンク先のように、並列化を想定したNNの重み更新アルゴリズムを用いるか。
 
togetter.com

 
しかし、それだと並列化することによって結果が変わっちゃったりするそうなんですよね。
普通にfit呼び出して、KerasだとGPUが載ってると自動的に使ってくれますが、それで、CPUだけで計算した場合と結果が変わってしまったら問題ですし、これはないですかね。
 
良い情報ソースをご存じの方がいれば教えていただければ幸いです ●刀乙
 
ちなみに、私が今いじっている以下のプログラムをfit_generatorを使って、マルチコア並列(8コア)させてみた時は、少し速くなったかな?程度でした。
ただ、ミニバッチのサイズが8(コア数に合わせたわけではなく元からこの値でした)と小さ過ぎたためで、ミニバッチのサイズをせめて64程度まで大きくすれば違ったのかも。
 
qiita.com

深層学習は特徴量を勝手に学習してくれると言われて出てきたけれどRBM・DBNやAuto Encoderとか皆使ってる?

追記:
有識者の知人曰く、正則化処理、オプティマイザ、活性化関数などの開発が進んだおかげで、この手のものを使わなくても多層化が可能となって、あまり使われることが無くなったのだろう、とのことでした。
ディープラーニングブームが起きてからも、結構変化があったんですねー。

(ここから最初の記事)
自分が深層学習ってなんぞやって思って、最初に調べた時にRBMだとか調べたなーと思って、下の記事をふと読んでいたんですが(これはちょうど深層学習にパンビーでも手を出し始めるるようになった頃の記事ですかね)、
RBMや、その派生系、オートエンコーダとかって、私は使ったことがない(オートエンコーダは、これで画像圧縮できるんじゃね!とか言って少し触ったことはありますが)し、NNの最上段に学習済みのものを置くのが当たり前ってなプラクティスもないような気がするんですが、知らないだけで、ガチKagglerとかガチのモデル作ってる人とかは使ってるもんなんですかねー(タスクの都合上、NN内部に組み込む必要があるものは除く)。
 
有識者の方のコメントお待ちしております ●刀乙

qiita.com

【メモ】どうやって過学習を防ぐか、汎化性能を上げるか、勾配爆発・消失を防ぐか

・自分で検索する時のタグ的なもの
深層学習、ディープラーニング機械学習
勾配爆発、勾配発散、勾配消失、汎化性能


個人的なリンク集のようなものです。
 
実装はKetasのSequencialモデルベースを基本的には想定

・基本
TensorFlow公式の解説
"過学習と学習不足について知る"
過学習と学習不足について知る  |  TensorFlow Core


・weight decay (正則化
[DL]weight decayって何? - Qiita
How to Use Weight Decay to Reduce Overfitting of Neural Network in Keras

・勾配クリッピング(これは過学習の抑制につながるのかは現状理解してない)
DNNの基礎知識についてのまとめ - Deep Learning 脱初心者めざして
↑ベージ全体もキーワードを拾う感じで、目を通しておきたい
How to Avoid Exploding Gradients With Gradient Clipping

・以下はLSTMの話
How to use Dropout and BatchNormalization in LSTM Networks (Keras) - Stack Overflow
python - Where do I call the BatchNormalization function in Keras? - Stack Overflow

LSTMだと、LSTMレイヤの中でのdropoutを指定するキーワード引数がある。
あと、BatchNormalizationはLSTMに限らないが、Denseなどの場合は、Activaion関数のレイヤを分けて、その間に入れるのが正しい?
BatchNormalizationをモデルに組み込む - Qiita

・勾配爆発・消失
勾配消失問題と勾配爆発問題~原因と解決策~ | マサムネの部屋

・その他参考
BatchNormalizationの解説と、Dropoutなども併せて考えた時にどう使うとよさそうか
Deep LearningにおけるBatch Normalizationの理解メモと、実際にその効果を見てみる - Qiita

過学習抑制「Weight Decay」はSGDと相性が良く、Adamと良くない?/Neural Network Consoleの使い方 - "BOKU"のITな日常
誰でもわかるニューラルネットワーク:正則化をテンソルフロープレイグラウンドで試してみた - Qiita
Batch Normalization:ニューラルネットワークの学習を加速させる汎用的で強力な手法 - DeepAge
各種正則化から転移学習まで。tensorflowソースコードで見るDL性能改善手法 まとめ(ver 2) - Qiita
今更聞けないディープラーニングの話【ユニット・層・正則化・ドロップアウト】 - HELLO CYBERNETICS

【Need Help!】深層強化学習(DQNもどき)のNNにLSTMを組み込むもうまくいかず

※記事最下部に追記あり

DQNもどき*1でFXシステムトレードシミュレーションというのをやっているのですが(下の記事からはまた幾分変化しています)、
 
qiita.com

これに、LSTMを導入してみましたが、残念ながうまくいっていません。
以下はその問題についての記述です。
 
学習時は学習データである時系列データを1足ずつなめながら何周もして、一足ごとにランダムreplayをしていたのですが、当該replayの処理をいじって、要素数32で、過去の時系列上で連続した [state, reward, 他] を memory から引っ張ってきて、特徴量データのリストと、教師データのリストを同じ要素数で作るようにして、epoch=1、batch_size=32 で fit するってな感じにしたんですが、全然収束しません。。。
(元々バッチサイズ32で1epoch fitするというような実装でした)

LSTM導入前は、一分もしたら0.0xxxぐらいのlossになっていたのですが(今のパラメータだと、1イテレーション、つまりテストデータを一周なめるのに15分ぐらいかかってる感じです)、LSTM版は6時間ぐらい経ってもlossは30から20ぐらいをうろちょとするばかり。
 なお、loss functionは huber損失関数。オプティマイザはAdam。学習率は小さすぎると時間かかるかと思って0.01とかにしています*2
 
で、気になっているのはネットワーク構成の話と入力データ(特徴量、outputに対する教師データの両方を含む)で、そこの実装を説明すべく、少しコードも交えつつ今の実装について整理すると以下のような感じなのですが、

■前提
入力データは、 特徴量10個のリストを一要素とするリスト、教師データ: 3つのアクションの報酬値(実数値)のリストを一要素とするリスト

■ネットワーク構成
        self.model = Sequential()
        self.model.add(LSTM(32, activation='relu', input_shape=(state_size, 1))
        self.model.add(RepeatVector(1))
        self.model.add(LSTM(32, activation='relu', return_sequences=True))
        self.model.add(TimeDistributed(Dense(action_size, activation='linear'))
        self.optimizer = Adam(lr=learning_rate)
        self.model.compile(optimizer=self.optimizer, loss=huberloss)

■fitの呼び出し(batch_sizeは32)
self.model.fit(x, y, epochs=1, verbose=1, batch_size=batch_size)
xとyはfitに渡す前によろしくreshapeして

x -> (32, 10, 1)
y -> (32, 3, 1)

にしている。
シェイプから分かる通り、xとyの要素数は同じにしてある


replay時の1バッチで見ると、データは時系列で並んでいるのですが、ランダムreplayをベースに実装したのもあって、次のreplay(次の足で行われる)では、違う時点での時系列上で連続なデータという形になっています。
 
もしかして、そもそもLSTMって、このようなやり方ではダメで、(学習データの期間の終わりに到達しない限り)ずっと連続なデータを渡す必要があるという話があったりするのでしょうか?


LSTMのKerasでの実装としては、手元には↓のページを参考にさせて頂いて実装した、
sweng.web.fc2.com

 
為替データを使った予測プログラムがあり、そのコードは期待通りの動作をすることを確認しており、このプログラムでの実装を取り込んだという形です。
github.com


ただ、FXシステムトレードシミュレーションのプログラムは単純に、時系列データをずらして、よろしくするといった類のものではないである点と、出力が複数要素になっている点(参考記事を参照してもらうと分かるのですが、ベースとしているコードは、複数データが出力されはしますが、個々の要素はスカラか、スカラ 1個を含む1次元リスト)、ネットワーク構成はこれでいいのか・・・という感じで悩んでいます。
 
現状のコードはこんな感じです。
github.com
 
environmentが返す stateは 32 x 10(2次元配列のリストとしては data[0-31][0-9] 的な感じ)のリストになっていて、memoryに格納する際は、その処理の前の時点で、

state = np.reshape(state, [32, 10])

と reshapeしてあります。
 
fitするためのデータを作っている箇所は以下の行のあたりです。
github.com
 
また、学習がうまくいくかどうか以前に、一番腑に落ちないのは、今のネットワークだと、10個の特徴量が32個並んだリストを与えて predict すると1個の出力(3要素のリスト)が得られるだけなのですが、学習時には32個の出力に対応する教師データを渡していて(そうでないと、fitを呼び出したときに入力と出力の array の要素数が違うぞ、とエラーになる)、そうすると、どうやってlossを計算してるのか、というのが良く分からない点。
 
そこで、ネットワーク構成のパラメータをいじって、32個出力がされるようにしたろ、と思っていろいろ試したものの、Keras(Tensorflowバックエンド)がエラーを吐いてうまくいかず。。。
唯一、RepeatVectorの引数を 1 から、出力1つの要素数である 3 にした時だけは動作して3個の出力(action数3に対応する3要素のリストが3個)が出るようになりましたが、それもおかしな話だ、と思い、実装としては採用していません。
 
=========================

以上、つらつら書いてみました。
 
根本的にLSTMの理解が誤っている可能性も大ではあるのですが、識者の方のアドバイスが頂ければ幸いです。
よろしくお願いいたします。●刀乙

追記 (2020/02/24):
Reshpeレイヤを最後に追加して、テンソルのshapeをよろしく合わせてやることで、RepeatVectorの引数をバッチサイズにして、出力されるpredictの結果を入力した教師データの数と一致させることができました。学習結果も順調です!
fx_systrade/dqn_fx_trade_tensorflow_lstm.py at 9f43ae89002cfc773ace17c788271296b554384f · ryogrid/fx_systrade · GitHub
fx_systrade/agent_fx_environment_lstm.py at 9f43ae89002cfc773ace17c788271296b554384f · ryogrid/fx_systrade · GitHub

*1:Actionによる遷移先でのMax報酬を時間割引率ガンマをかけて、足すという、更新式を使わずに、脇から別の方法で未来の報酬を過去に波及させていくというようなことをしている

*2:0.001等のLSTM採用前に用いていたパラメータでは少なくとも数十分待っても収束してく気配がなかったので

同じ処理をしているコード(DDQN)のはずなのにタスクが解けるコードと解けないコードがあって混乱

Open AI gym の 倒立振り子の課題を DQN(DDQN)で解けるか確認しているのですが、以前、解けることを確認したコードでは解けるのに、WinMergeで差分を確認するまでした、開発中のFXトレードシミュレーション用のコードをベースにその課題を解くように修正したもの(元を辿れば先祖返りしてるんですが)だと解けない。パラメータやら何やらかんやらも同じにしたのに。
わけがわからないです・・・・。
 
・解ける方
https://github.com/ryogrid/fx_systrade/blob/165dc936a2877f9dde903f628ecb88cbecfc5f91/ddqn_cartpole_tensorflow_runnable_win10.py
・解けない方
https://github.com/ryogrid/fx_systrade/blob/165dc936a2877f9dde903f628ecb88cbecfc5f91/dqn_fx_trade_tensorflow_testing_with_cartpole.py
 
実行しているvirtualenvも同じ、というか、同じコマンドプロンプトで同じpythonコマンドで実行している。
ディレクトリも一緒。
なお、実行環境はWIndows10。
 
もう呪われているか、gymがローカルにソースファイルごとに何かのデータをキャッシュしてるか、とかしか思いつかないです・・・。

以前Unityで作った3D壁打ちゲームをOculus Quest & Rift, Rift S(VR)対応させました

以前Unityで作った↓の3D壁打ちゲームを、UnityのVR対応の設定等もろもろを行って、Oculus Quest対応させました。
unityroom.com


ちと手間ですが、↓の野良apkを開発者モードでPCからインストールしてやれば遊べます。
www.dropbox.com


インストール参考
vr-maniacs.com

 
【操作】
Aボタン: 球を発射。前のボールが生きてる時は出ません。また、ラケットが画面中央にあるとひっかかる場合があるのでラケットはよけといてください・・・。
ジョイスティック: 利き手の設定によって変わったりするようですが、右か左のジョイスティックでラケットを移動できます

よかったらお試しください。
 
なお、VR(Oculus Questのみ)対応ですが、Unity自体がVRのソフトウェアを作れるようになっていて、かつ、元々単純な3Dゲームだったので(2Dのものを3Dな感じに作り変えるような作業は本質的に必要ない)、実質一日弱程度の工数で対応させることができました。
 
しかし、Oculus Link出たし、Rift Sに対応させた方が試してもらえる人は増えるのかー。
でも、なんか、対応のための作業がそこそこ違うっぽいんだよな・・・。
 
補足:
ソースコード
github.com
 
追記:
Rift, Rift S 用のビルドも作れました。
(Oculus LinkでPCに接続したQuestでも動くので、Oculus Linkを使っている方はこちらのビルドを試す方がラクかと思います)

PCのOculus管理用ソフト(?)で以下のところの"提供元不明"というやつをONにして、

f:id:kanbayashi:20200128182641p:plain
Oculus PCアプリで提供元不明のプログラムを実行可に
 
以下のZipをPCにダウンロード・展開して実行すれば動くかと思います(Oculusの管理用ソフトは起動しておく)。
www.dropbox.com

強化学習を以前やっていたFXシステムトレーディングプログラムに取り込む方法について悩んでいる

以前、FXのシステムトレードのプログラムを書いたのだけど、

qiita.com

 
このプログラムは為替予測は機械学習によって作ったモデルで行うけれども、それに基づく売買ロジックは自分でなんかいい感じだったものにしていたりしました。
 
で、そこも機械学習の枠組みの中でやれたらいいなあと思っていたところで、少し前に株の売買を強化学習の手法でやる、という記事を読んで、
 
qiita.com

なるほど強化学習という手もあったか、と思い、ひとまず単純な設計はどんな感じになるか考えているが、N足後の為替を見た時に利益が出るようにポジションを持つようアクションしたら報酬を与える、とかしたら、自分がやった為替予測と同じようなモデルができるだけだろうし、それでポジションを買う時のモデルは作れたとしても、ポジションを決済する時のモデルの作り方が思いつかない。
  
どうするのがいいのかなー。
 
あとは元々やってた為替予測の結果を特徴量(環境の状態)として入力してやるという風に2段構成にするのか、一段で(ポジションを持っている状態と、持っていない状態で2つ作ることにはなるかもしれないが)全部やってしまうかも、どっちがいいのかよくわからん。
 
まあ、2段構成にするとして、為替の予測結果以外に何の特徴量を入れるのかって話もあるのだが・・・(為替予測のモデルに入力している特徴量を入れることはできるが、意味があるのか、とか)。
 
参考(に読もうかなと思っている記事):
www.ie110704.net
blog.takuya-andou.com