2019年1月23日水曜日

機械学習・組込系 Cythonを活用してPythonのスピードを改善

https://www.infoworld.com/article/3250299/python/what-is-cython-python-at-the-speed-of-c.html

Pythonの遅い部分をCythonに書き直して改善する方法が説明されてます。

Pythonが組込系機械学習ソフトに活用できますが、GPUが使えない場合があると思いますので興味深いです。

組込系ARM Chip用Pythonのソースコードの例はこちらです:ARM ML examples

2019年1月22日火曜日

Q-Learning vs. Policy Gradientのミソ Cartpole-V1の説明

ソースはこちらです:Policy Gradient のミソ

Algorithm ReinforceはMonte Carlo類ですのでエピソード終了後にトレーニングを行います。

TD(Temporal Difference)の場合、毎ステップトレーニングを行うところと異なります。

Cartpole-V1のStateは4つあります:カートの位置、カートの速度、ポールの角度、ポールの回転数

Actionは2つです:右に押す、左に押す

Policy GradientのSecret Sauce:

1.model.add(Dense(self.action_size, activation='softmax', kernel_initializer='glorot_uniform'))

Softmax activationを使うことでAction-sizeが2の場合、[0.51 0.49]のように右に押す確率、左に押す確率が
出力されます。

DQNの最終層のActivationはSoftmaxではなくLinearでしたのでQ-valueを出力できました。

2.Def get_action()を見てください。

# using the output of policy network, pick action stochastically
    def get_action(self, state):
        policy = self.model.predict(state, batch_size=1).flatten() ←ネットワークにて確率を取得
        print("get_action policy", policy)
        return np.random.choice(self.action_size, 1, p=policy)[0] ←上記確率を利用してランダムにアクションを選択

3.Main内でエピソードが終了した時点でトレーニング開始

if done:
                # every episode, agent learns from sample returns
                agent.train_model()

4.def train_model(self):内にてModel.fit()をコールしてBackpropogationを行います。

for i in range(episode_length):
            #copying states array to update_inputs
            update_inputs[i] = self.states[i] #start from state zero
            #print("update_inputs[{}]".format(i), update_inputs[i])
            #filling in squashed rewards into advantages for each action at each state
            advantages[i][self.actions[i]] = discounted_rewards[i]
            #print("advantages 2D", advantages[i][self.actions[i]])
            #print("\n\nupdate_inputs final", update_inputs)
            #print("\n\nadvantages final {}".format(advantages))
        #(training data=states, targets=advantages which is like the action-value)
        self.model.fit(update_inputs, advantages, epochs=1, verbose=0)←ここです。
        #clear out states, actions, rewards for next episode
        self.states, self.actions, self.rewards = [], [], []

5.近日中に以下を和訳します。

 # Using categorical crossentropy as a loss is a trick to easily
        # implement the policy gradient. Categorical cross entropy is defined
        # H(p, q) = sum(p_i * log(q_i)). For the action taken, a, you set
        # p_a = advantage. q_a is the output of the policy network, which is
        # the probability of taking the action a, i.e. policy(s, a).
        # All other p_i are zero, thus we have H(p, q) = A * log(policy(s, a))
        model.compile(loss="categorical_crossentropy", optimizer=Adam(lr=self.learning_rate))

強化学習アルゴリズムにコーチングをして早く学習させる

https://blog.openai.com/deep-reinforcement-learning-from-human-preferences/

上記の研究ではバックフリップを教えるのに人間が1時間コーチングをした事に対してコーチング無しでバックフリップさせるReward Functionをコーディングするには2時間掛かりましたが、結果的にコーチングした方がよりElegantにバックフリップをできたそうです。

Reward Functionにバグが組み込まれている場合には人命にも危機を与える行動を取る可能性が発生しますので、コーチングは必須かもしれません。


2019年1月20日日曜日

Bertが出力するベクトルを機械翻訳に使える?

https://github.com/hanxiao/bert-as-serviceを使えば、Bertが出力するベクトルを選択した層から入手できます。

このベクトルはContextualやSemantic的情報が組み込まれているためにELMOからFeature Extractionを実施するようにBERTからもできます。

しかし、通常のSeqtoSeqモデルに上記ベクトルをInput Sentence入力してもLSTMがStateをEncoderからDecoderに渡す時点で情報量が減少してしまうので違うモデルを検討中です。

BERTを逆さにしたモデルを構築できるかどうか調べてみたいです。

例えば英語版BERTに和訳したい文章を通して、日本語訳文をMultilingual BERTを通して出力したベクトルを何かしらのNNの目標ベクトルと設定してトレーニングを実施すれば、後は逆さのMultilingual Bertにこのベクトルを通せば最終段階の「Reverse Tokenizer」にて日本語訳文が出力されるはずです。こんな事が可能でしょうか。

課題ができました。




2019年1月18日金曜日

古いパソコンでディープラーニング

Google Colabを活用してGPUを無料で使える事を覚えました。

Google Colab

UIの言語はブラウザの言語に設定してありますので、RuntimeメニューからChange Runtime Typeを選択してGPUまたはTPUを選択して席が空いてましたらすぐに使えます。

初めて使った際に一度だけ「Busy」が出ましたが、次のトライで即使えました。

今、Atari BreakoutDeterministic-V4のトレーニング中ですが、平凡なDQNなのでDouble  Q-Learning、Prioritized Experience Replay及びDueling Networksを取り入れてやり直そうと思います。

しかし、テストとしてもう少しトレーニングを続けます:




5万エピソードほどトレーニングが必要らしいですが、中々スコアがあがりません。

完了した時点で更新します。

2019年1月17日木曜日

KerasとTensorflowを組み合わせて使おう!

Kerasの公式ブログ
Githubのリンクも掲載されていますので是非上記を確認してみてください。

Qiitaやスタックオーバーフローも良いですが、これからは公式サイトを先に見る事にしました。

Google BERTはNMTのTransfer Learningを実現?

Google Research BERT on Github:  BERT


BERT is a method of pre-training language representations, meaning that we train a general-purpose "language understanding" model on a large text corpus (like Wikipedia), and then use that model for downstream NLP tasks that we care about (like question answering). BERT outperforms previous methods because it is the first unsuperviseddeeply bidirectional system for pre-training NLP.

凄すぎますね!
Pre-training is fairly expensive (four days on 4 to 16 Cloud TPUs), but is a one-time procedure for each language (current models are English-only, but multilingual models will be released in the near future). We are releasing a number of pre-trained models from the paper which were pre-trained at Google. Most NLP researchers will never need to pre-train their own model from scratch.

Cloud TPU4~16個をGoogle Cloudで借りて4日間で日本語版を作成できる?もっと凄いですね!

と思いましたら、なんと既にMultilingual Modelがありまして、日本語が含まれていました!

日本語!

Multilingual Modelはこちら:Multilingual Model

ちょっと嬉しい発見でしたので午後にまた続けます。午前はOpenai Gymに充てようと思います。

更新:

BERTの内部動作を解明


Conclusion:

Bert is able to use contextual info to map words in several locations based on context vs. Word2Vec which maps words to one spot regardless of context or differences in meaning, ie. right and left indicating direction or the political right and left.



Openai gym Atari BreakoutDeterministic-V4 にチャレンジ!DRQNのソースコード付き

まずはRNNの復習を終わったところでRNN及びLSTMをDeep Reinforcement Learningで使えるかどうか調べたら、このようなリサーチペーパーがありました:DRQN?!

. They have, however, struggled with learning policies that require longer term information. Recurrent neural network architectures have been used in tasks dealing with longer term dependencies between data points

比較的長時間に渡った情報を必要とするゲームに悩まされるDQNを強化するためにRNNを取り入れようと考えているそうです。

Attention機能・アルゴリズムまで取り入れたそうだが、Qbertでは逆効果があったそうです。

しかし、結果はかなりグッドでした!
後、図がありましたので構築できるかもしれません:


でもどうせですから「Github Repoありますか」的にメールを送りましたので返信待ちです。

更新:Stanford大学の学生(研究発表チーム員)からメールにて返信が有りました:

こちらのGithub RepoをForkして開発したそうです:https://github.com/carpedm20/deep-rl-tensorflow

次はHuber Lossについて説明したいと思います。原文はこちらです:Huber Lossについて

実はこちらフォークしたGithub Repo内のAtariBreakout DQNのPythonファイルにHuber Lossが入ってますが、何かわからずに困っていたところ偶然と説明分にあいましたのでとてもラッキーでした。

if a large error shows up, the network will change radically to try to minimize it, but since the network is trying to predict its own output, a radical change will mean that the target value will also change radically, and so we might not actually reduce the error as much as we would have if we had changed things more slowly.

上記はMSEの場合、大きいエラーが発生しましたらネットワークがそれを急激に最小化使用とした際に目標値(Target Q)も急激に変化してしまうために徐々にエラーを最小化する場合より日効果的だそうです。

そこでエラーが小さい場合はMSEを活用、大きい場合は無差別にエラーを扱うMAEを活用した方が効率的らしいです。

Huber Lossを調べたきっかけはこちらフォークしたGithub:DQN, DDQN、A2C, A3C等 のAtari BreakoutDeterministic-V4のDQNファイルに載っているからです。

Cartpole-V1のプログラムよりHyperparameterも倍くらい多いので少々時間かかりそうですが、Huber Lossが理解できましたので実施してみます。

以上でした。

2019年1月16日水曜日

テレビアニメ「シンプソンズ」(Simpsons)の台本をRNNニューラルネットワークで作成 part 2

ソースコードはこちらから:https://nyck33.github.io/Simpsons-script-generator/ 

既存する台本から全く新しい台本を作成するにはプログラムに最初の1単語「Prime Word」を入力して、Word Embedding(Word2Vecモデル集のうちのSkip-Gram Modelを使用)のアルゴリズムがその単語を囲む単語の確率をベクトル(全単語を含む)として出力するので、np.random.choice(上記のベクトル)にてランダムに次の単語を選択して出力する事を繰り返せばできあがり。

もちろん、その他にsub-samplingやnegative sampling等と出力した台本を改善するアルゴリズムを適用する(詳しくは上記のSkip-Gram Modelのリンク先を照覧)。

ソースはTensorflowで書かれているが近日中にKerasで書き直す予定。

後、自然言語処理のRNN型ニューラルネットワークはLSTM cellで構造されているので一番下のNLP関連のリンクを照覧してください。

ここまで復習するのに三日かかってしまいましたが、ちょっとDeep RLを忘れたのでまたOpenai Gymを実施しようと思ってます。

NLP系翻訳ソフトの開発の為にMecabのインストールをしましたが、Training Dataを探すのがちょっと面倒な一面がありますのでこちらもあせらずに徐々に開発したいと思います。
そこで今ひらめいた͡͡事ですがそれは次回NMT(Neural Machine Translation)について話したいと思います。

2019年1月12日土曜日

テレビアニメ「シンプソンズ」(Simpsons)の台本をRNNニューラルネットワークで作成 part 1

ソースはこちら:https://github.com/nyck33/RNN-for-NLP/blob/master/dlnd_tv_script_generation.ipynb

作業の順序:

1.既存する台本を読み込む。https://www.kaggle.com/wcukierski/the-simpsons-by-the-data

Dataset Stats
Roughly the number of unique words: 11492 (固有単語数)
Number of scenes: 262 (シーン数)
Average number of sentences in each scene: 15.248091603053435 (1文の平均単語数)
Number of lines: 4257 (行数)
Average number of words in each line: 11.50434578341555 (1行の平均単語数)

2.句読点のトークン化

 token_to_alpha={'.':'<PERIOD>', 
                    ',':'<COMMA>', 
                    '"':'<QUOTATION_MARK>',
                    ';':'<SEMICOLON>',
                   '!':'<EXCLAMATION_MARK>', 
                    '?':'<QUESTION_MARK>',
                    '(':'<LEFT_PAREN>', 
                    ')':'<RIGHT_PAREN>',
                   '--':'<DASH>', 
                    '\n':'<RETURN>'}

3.参照テーブルの作成。ニューラルネットワークに単語を入力するのは不可能なので、単語を数値に変換する。

ここから

{0: '<period>', 1: '<return>', 2: '<comma>', 3: '<left_paren>', 4: '<right_paren>', 5: 'the', 6: 'i', 7: 'you', 8: '<exclamation_mark>', 9: 'moe_szyslak:', 10: '<question_mark>', 11: 'a', 12: 'homer_simpson:', 13: 'to', 14: 'and', 15: 'of', 16: 'my', 17: 'it', 18: 'that', 19: 'in', 20: '<quotation_mark>', 21: 'me', 22: 'is', 23: 'this', 24: "i'm", 25: 'for',

ここまで

 6741: 'patented', 6742: 'coma', 6743: 'show-off', 6744: 'muscles', 6745: 'engraved', 6746: 'richard:', 6747: 'audience:', 6748: 'ref', 6749: 'issuing', 6750: 'warning', 6751: 'rasputin', 6752: 'referee', 6753: 'permitting', 6754: 'smitty:', 6755: 'squabbled', 6756: 'washed', 6757: 'refreshment', 6758: 'trustworthy', 6759: 'sharing', 6760: 'birthplace', 6761: 'roy', 6762: 'scum-sucking', 6763: 'pus-bucket', 6764: 'eyeballs', 6765: 'often', 6766: 'bull', 6767: 'connection', 6768: 'lighten', 6769: 'ironic', 6770: 'snotty', 6771: 'sister-in-law', 6772: 'picky', 6773: 'blur', 6774: 'decided', 6775: 'happiness', 6776: 'pancakes', 6777: 'disdainful', 6778: 'heals', 6779: 'wounds'

作成されてます。






C言語とFreeglutのライブラリで書いた簡単なゲーム

昨年の夏、カナダの大学で作成しましたが、僕が書いた部分は「Task 1 ~ 5」です。

Github: https://github.com/nyck33/mondroids_game_C

近日中に操作するShipにCollision Detectionを付けたいと思いますが、最近Unityのオンライン講座をUdemyで始めたので多分そちらの方でより近代的な作品を作った方が楽しそう、と思ってしまいます。

実際に動かしてみるとこんな感じです。




深層強化学習(Deep RL)のDQNとVPGをOpenaiのCartpole-V1にて比較

Deep Q Networkを改善してCartpole-V1を140エピソードで攻略しました(最寄りのスコア10個の平均値が500を達成した時点で終了)。

ソースコードは借りたものですが、Experience Replay用のBufferが十分に埋まるまでEpsilon値を削らないようにアレンジしましたら元のコードより20エピソード早く終了できました。

ソースはこちらです:https://github.com/nyck33/reinforcement-learning/blob/master/2-cartpole/1-dqn/cartpole_dqn.py

学習率をグラフにしたらこんな感じでした。


DQNはOff-Policyですが、上記ソースコードにてModelとTarget_Modelがありますが、Target_Modelはエピソードが終了した時点で更新することによって目標がエピソード中に固定されているのでModelの更新がより確実的・効率的に実施されます。

Off-policyですとEpsilon-greedyにてActionを選択しますが、目標の更新はGreedy Policyを活用します。

次はVPG(Vanilla Policy Gradient及びREINFORCE)ですが、こちらは800エピソード以上かかりました。


VPGはエピソードが終了するまでパラメータを更新できませんので、ここがネックだと思います。借りたソースコードではRewardをMeanとStdにてNormalizeしてます:

 #discount the rewards array and reversed
        discounted_rewards = self.discount_rewards(self.rewards)
        #minus mean so here disc_rewards is somewhat = advantage
        #print("\nnp.mean(discounted_rewards)\n{}\n".format(np.mean(discounted_rewards)))
        discounted_rewards -= np.mean(discounted_rewards) #minus the mean
        #print("\nminus mean disc rewards \n {} \n".format(discounted_rewards))
        #std = sqrt(mean(abs(x - x.mean())**2)).  rewards are multiple of std. dev.
        discounted_rewards /= np.std(discounted_rewards)

しかし、TD ErrorがAdvantageをEstimateするのに十分らしいのでDQNのソースコードからTD errorの計算する部分を借りてVPGにコピペしてみます。多分ここがネックっぽいです。

後、Cartpoleの場合、[良いエピソード」、[悪いエピソード」の判定をどうすれば分かりません。Previous 10のTotal RewardのMeanより高ければ現エピソードは「良い」として+1AdvantageをLabelとして学習させることも考えましたが、両方トライしてみます。



2019年1月11日金曜日

犬の画像を入力して犬種を判断するCNNニューラルネットワーク

ローカルでの動作確認しか実施してませんが、一応100%的な活躍をしてます。

こちらです:https://github.com/nyck33/dog-breed-classifier-cnn

実際に動作させますと、こんな感じで結果が出ます:




DLエンジニアを目指してます

2017年1月にカナダの大学(英語ネイティブ、カナダ国籍)でプログラミングを習い始めましたが、現在はジョージア工科大学のオンライン大学院(OMSCS)にて機械学習を専攻する予定です(2019年夏から)。授業が始まるまでにはUdacity.comにて得たディープラーニングの知識(Deep Learning Nanodegree卒業)を復習してますが、最も興味がある分野はOpenai Gym及びOpenai Gym Retroの「Deep Learningでゲームを攻略する」です。


Nobutaka Kim

My Github repo

In case anyone is interested:   https://github.com/nyck33