28 Dec 2017, 02:07

JDLAのG検定、初試験で一発合格

JDLA(日本ディープラーニング協会)のG検定というのが12/16(土)に実施された。

遅ればせながらツイッターに流れてきて試験日を知り、12/4に申し込んだ。

結構難しくて、落ちたかなと思った。

なんとか?合格していました。今回は、受験者1448人、合格者823人。合格率にして57%。

対策日数は10日間だけれども、やったことを書く。

受験の動機

受験の動機は、ディープラーニングの知識を持っていることを資格を保持することで示したかったから。社内にAIを扱っているプロジェクトがあり、そこに移りたいと何度も上司に言っているのだが、受け入れてくれない。なので、資格を持つことで、ディープラーニングの知識を有していることを示したいと思った。

G検定とは

以下の通り

  • 目的:ディープラーニングに関する知識を有し、事業活用する人材(ジェネラリスト)の育成
  • 概要:ディープラーニングを事業に活かすための知識を有しているかを検定する
  • 試験概要:120分、100問(表示される問題数は232問)、多肢選択式、オンライン受験(自宅受験)
  • 受験料:12,960円(税込)
  • 試験日:2017/12/16(土) 13:00-15:00

受験料が高い。あとは、オンライン試験ということで、自宅で受けることが可能なところがポイント。100問とかかれているが、実際は232問出されて、とても分量が多い。私は20分くらい余ってようやく問題を解ききったが、さくさく解いていかないと、時間がなくなる。

シラバス(201712)

まずは、シラバスをチェック。

協会活動 | 一般社団法人 日本ディープラーニング協会 Japan Deep Learning Association

  • 人工知能(AI)とは(人工知能の定義)
  • 人工知能をめぐる動向
    • 探索・推論、知識表現、機械学習、深層学習
  • 人工知能分野の問題
    • トイプロブレム、フレーム問題、弱いAI、強いAI、身体性、シンボルグラウンディング問題、特徴量設計、チューリングテスト、シンギュラリティ
  • 機械学習の具体的手法
    • 代表的な手法、データの扱い、応用
  • ディープラーニングの概要
    • ニューラルネットワークとディープラーニング、既存のニューラルネットワークにおける問題、ディープラーニングのアプローチ、CPU と GPU
    • ディープラーニングにおけるデータ量
  • ディープラーニングの手法
    • 活性化関数、学習率の最適化、更なるテクニック、CNN、RNN
    • 深層強化学習、深層生成モデル
  • ディープラーニングの研究分野
    • 画像認識、自然言語処理、音声処理、ロボティクス (強化学習)、マルチモーダル
  • ディープラーニングの応用に向けて
    • 産業への応用、法律、倫理、現行の議論

実際、どこがでるかというと、まんべんなく出る。このシラバス通りに出る。不明なキーワードはすべて調べ、関連する話題も読んでおかないと、解けない。

自分の対策

推薦書籍は3つある。

  • AI白書 2017 (編)独立行政法人情報処理推進機構 AI白書編集委員会 角川アスキー総合研究所
  • 人工知能は人間を超えるか ディープラーニングの先にあるもの 角川EPUB選書 (著)松尾 豊 KADOKAWA
  • 深層学習 機械学習プロフェッショナルシリーズ (著)岡谷 貴之 講談社

申し込みから試験まで、10日しかなかったので、とりあえず推薦本の一つである、人工知能は人間を超えるかを丁寧に読んだ。

ディープラーニングは今年から勉強を開始したので、ディープラーニングや機械学習の問題が出てくれれば解けるだろうと思っていた。その憶測は正しかった。ディープラーニングや機械学習の問題は簡単だった。

IA白書を買ったのだが、これは分厚く、とても読めなかった。ここから出題された問題もいくつかあったが、正直これは捨て問だと思う。この厚い本を読んで、その一部の情報が記憶に残るとは思わない。

よって、機械学習やディープラーニングで点を稼ぎ、 AIの歴史は松尾本でここも落とさずに点数をとり、それ以外のほとんどの人がわからない問題は捨てる、という戦略が必要。

感想

難しい・・・というか、正確にいうと知らない問題は全く知らない。わかる問題は解ける。とにかく、問題数が多いのだ。オンライン試験なので、調べようと思えば調べられるが、その余裕を与えないための配慮だと思う。調べていたら、時間切れになるようにできている。

とにかく、出題範囲が広いのと問題数が多いのが特徴。という意味で、難しい。

半分くらいはディープラーニングではなくて、その関連知識の問題だった。歴史についてだったりAIについての考え方だったり。このあたりは、知らない問題はまったく手が出せずに捨てた。AI白書を読めば載っていることだろうが、あの本は分厚いので読む気にはならない。機械学習とディープラーニングの問題は優しく、ここで点数を稼いだ。

E検定に向けて

G検定が受かったので、次はE検定を目指す。こちらは、推薦書籍の3つ目が中心に出題されることが予想される。

しかし、この本難しいので、自分は最近発売された以下の本を中心にまずは進めようと考えている。

それとともに、E検定では実技試験が課せられる。これはコーディングをするということなのだろうか?現時点での情報では、そこまでは読み取れないが。とはいえ、なんらかのフレームワークを使って実装するスキルを磨いておきたいところだ。

最近注目してる、PyTorchを学習することにする。チュートリアルやUdemyの動画で学習を進めていく。

12 Aug 2017, 09:51

fast.aiの Cutting Edge Deep Learning For Coders, Part 2を受けた

fast.aiが提供する ディープラーニングのオンライン無料講座、Cutting Edge Deep Learning for Coders を受けたのだが、難しくて後半から挫折。。

とてもいい講座なので、布教のためにも講座の紹介と、各レクチャーの内容を書いておくことにする。

これは、fast.aiが提供するDeep Learning コースの Part2に当たる。Part1の感想は以下。

講座の紹介

紹介記事: Cutting Edge Deep Learning for Coders—Launching Deep Learning Part 2 · fast.ai

Cutting Edge(最先端)の意味〜論文を読め!

Part1のPracticalのテーマは、Kagglerになれ、ということだった。

Part2では、Cutting Edge = 最先端の手法が紹介される。Cutting Edgeとはなにか?それは、

論文を読め!! ということだ。

そのため、最先端を追いかけるために、arXivの論文を読むことが課題として課せられる。論文を読み、その内容を実装できるスキルをみにつけることが求められる。

論文というものに今まで触れたことがないので、かなりびっくりだ。

Kerasのバックエンドが theanoからTensorFlowに変更、PyTouchも使おう

Part1と同様に、Part2も丁寧に書かれたJupyter Notebookが提供されて、それにそってレクチャーが進む。

このJupyter Notebook, Keras と PyTouch の両方で実装されている。

なので、PyTouchを使いたいひとは、そっちを使うことができる。

Part1より難しい・・・

Part1には、充実したwikiがあったのだが、Part2にはWikiがない。

さらには、英語字幕もない。自分は、英語があまり聞き取れないので、Part1での勉強スタイルは、動画で雰囲気を掴んだあと、wikiを熟読してなんとか理解するものだった。今回、それができない。

また、内容的にも難しさが上がっている。Part1でやったことはすべてわかっている前提ではじまるので、Part1を飛ばしてPart2からやるのは厳しいと思う。

目安は100時間以上

正直、Lesson12くらいからよくわからなくなったのと、急いで終わらせる必要が出てきたので、、後半はあまり時間をかけなかった。

それでも、100時間はかかった。真面目にやったら150時間?はかかると思う。

ちなみに、Part1は真面目にやって100時間かかった。

レクチャーメモ

Lesson 8: Artistic Style

まずは、Part1でやったことの紹介と、これからやるPart2の紹介から始まる。

Part2では、最先端を追いかけるために論文を読め!と言われる。Mendeleyという論文管理ソフトが紹介される。

そしてStyle Transferの論文が紹介されてこれを理解するように、という課題が出される。

はじめから意味不明なコードとハイレベルな難易度で戸惑う。

やってけるかな??もうダメだ!と思ったら、丁寧な日本語解説記事を見つけて救われる\(^o^)/

これらも参考になる。

なんとか実装した。

Lesson9: GENERATIVE MODELS

Perceptual Losses for Real-Time Style Transferという論文の内容が説明される。この技術は、Super-Resolutionという画質を良くする技術と、Real-Time Style Transfer という Neural Style Transferを高速化した技術の、両方に応用できる。

講義では、Super-Resolutionが取り上げられる。課題は、論文を読んで理解し、Fast Style Transferを実装せよとのこと。またもやもうダメだと思ったら、解説記事を発見。

なんとか実装した。

ノートPCの webcamから動画を取り込んで、fast style transfer で変換して、再度出力するということをやったが、ノートPCの非力なCPUでは、リアルタイムでは行かなかった。

Lesson10: MULTI-MODAL & GANS

DeViSEという論文の紹介と実装。

画像から関連する単語を抽出する試み。ResNetとword2vecを組み合わせる。

あまり理解していない。

Pythonで大規模データ(996433個の画像!)を扱うTipsとかも紹介される。ImageNetの大量画像データをスレッドやbcolzを使ってリサイズしたりする。あまりやりたくなかったので、これはJupyter Notebookを読むだけにした。

後半は、GANの説明。オリジナルのGAN, DCGANが説明される。あまりよい結果が出ない。そこで、WGANが紹介される。WGANはPyTorchで実装も公開されているとのことで、ここでPyTorch登場。

課題は、与えられたPyTouchのWGANを修正して、改善を加えること。

PyTorchとWGANという大きな課題を前に、途方にくれる。

まずは、GAN, DCGAN として、WGANというステップを踏んで学習することにした。

WGANに進んで論文読み始めたけど、この論文難しい。。数式とその証明が難しい。レクチャーでも、この論文は難しいと言っていた。先を急ぐので、WGANは後回しにすることにした。

Lecture11: MEMORY NETWORKS

前半は、最新の研究成果を追うためには論文を読むことを改めて強調される。そして、最近の研究成果を元にCNNを改良するためのたくさんのTipsとpaperが紹介される。

そのあと、k-means、Mean shiftというクラスタリング手法について説明がある。なんでここでクラスタリングなのかなと思ったら、PyTorchを使ってGPUの恩恵を受け、計算を高速化する方法が紹介される。

PyTorchはNumpyのようにデータを扱えるがブロードキャスト機能がないとのこと。そうなんだと思っていたら、v0.2.0で昨日追加された模様!link

最後に、Memory Network。これは、Facebook発のシンプルな自動応答のアルゴリズム。詳しい日本語の解説記事があった。

Lecture11から先は、明確なassignmentsがなくなり、課題としてなにをすればいいか悩む。正直、後半は完璧な理解は求めず、流しつつ進めた。とりあえず、与えられたJupyter Notebookと論文を読んで理解することにした。

Lecture12: ATTENTIONAL MODELS

k-meansの説明から始まる。Tensorflowでk-meansを実装する説明。k-meansについてよく理解していないので、ここの動画は飛ばしてしまった。(40分)

Attentional Modelsの説明とkeras実装が紹介される。はじめにencoder-decoderモデルを紹介して、これでは長文になるにつれて精度がでないねといって、Attentionモデルが出てくる。RNNや Embeddingsを忘れてしまったので、よくわからなかった。そういう人は、Lesson4,5,6を復習してねとのこと。まいったな。いよいよ 詳解 ディープラーニングを読んでみようかな。評判いいし。

(話は脇道にそれて、このDLコースのPart3はないよ、強化学習はやらない。代わりに、Part0を作って Practical machine learningをやるかも、とのこと。期待)

次は、いよいよCutting-Edgeな技術、ニューラル翻訳。予告編として、以下の論文が紹介される。

Lecture13: NEURAL TRANSLATION

ニューラル翻訳、英語からフランス語への翻訳、実はUdacityのDLNDで同じ課題をやったことがあるのだった。このときは、TensorFlowをつかった。TensorFlowは Seq2Seqのライブラリが充実していて、なんかよくわからないまま、講義のコピペで実装できてしまった。

fast.aiでは、KerasとPyTorch両方の実装が提供されている。よし学び直そうと思ったけど、やっぱり理解できなかったorz。とばし。

後半は、 Densenetの紹介。

Lecture14: TIME SERIES & SEGMENTATION

Final Lecture!

Kaggleのコンペを使って時系列データの扱いを学ぶ。Part1は主に画像データの扱いがメインだった。カグルマスターのKaggle攻略法講座が久しぶりに帰ってきた!!・・・が、真似できる気がしなかった。こうやって、カグルマスターは前処理をするのかと思った。

カテゴリカルデータをembeddingを使ってニューラルネットにぶち込む手法が参考になった。これを参考にして、自分は入門コンペのTitanicとか、House Prediction とかからはじめよう。Taxiコンペは Bengioさんが論文かいて手法を解説しているとか。

次に、segmentation(画像データをセグメントでわける処理)を学ぶ。これは、DenseNetを改良した、Transfer Learningに似たネットワークが使われる。

最後に、さらなる高みを目指して

  • コードを書こう!
  • Paperを読もう!
  • ブログを書こう!

と言われる。

ここまで、長い長い旅だった。英語力がもう少しあればと思うときが何度もあった。このPart2で得られた最も多きな、恩恵は、PyTorchと論文に触れたことだった。未消化な部分や飛ばした部分がPart2は多いので、復習しよう。

Part2で読んだPapers

論文はMendeleyで管理するのがすごく便利。

他にも、たくさん論文が紹介されたのだけれども、後半紹介された論文は、あまり読んでない。。。

07 Aug 2017, 11:58

PyTorchでDCGAN

PyTorchとMNISTをつかって、DCGANで手書き数字を生成してみた。

前回のつづき。

GANでは、あまりよい結果が得られなかったので、DCGANの論文を読んで、実装してみた。

Deep Convolutional Networkを GANに使うにあたって、以下の改良点が提案されていた。

  • すべてのプーリングレイヤを strided convolutions(discriminator)と fractional-stirided convolutions(generator)に変更する。
  • generator と discriminator に batchnormを使う。
  • 全結合隠れ層を取り除く。
  • ReLU 活性関数を generatorで使う。ただし、output層は tanhを使う。
  • LeakyReLU活性関数をdiscriminatorのすべての層で使う。

もとい!

PyTorchのチュートリアルに DCGANの実装コードが公開されているので、それを参考に実装する。

結果

GANよりも、数字がくっきり浮き出た!

結果その2

ぺけぺけ女優10000人の顔写真をDMMからスクレイピングして収集し、それを題材にDCGANで顔写真の生成をしてみた。

スクレイピングは、この記事を参考にしました。

やっぱりぺけぺけ女優なので、モザイクがかかっています。

06 Aug 2017, 07:36

PyTorchを初めて使ってみた!GANを実装

fast.ai Lesson10のテーマはGAN.

課題は、PyTorchで書かれたWGANを改善せよとのこと。さすがは、Cutting Edgeだ。GANもDCGANも通り越して、WGANに行ってしまう。

PyTorchもGANもよくわからない自分にはツライ。まずは、WGANの前にPyTorchとGANからはじめることにした。

まずは、GANの開祖である以下の論文に目を通した。

PyTorch first inpression

軽くPyTorchのチュートリアルと fast.aiの Jupyter Notebookを眺めたあと、PyTorchに挑戦!numpyを扱うみたいで書きやすい。

PyTouchの特徴は以下のようだ。

Kerasだと、簡単に書くために細かい部分はライブラリに覆い隠されているけれども、PyTorchは多少なりともむき出しになっているので、細かいカスタマイズがしやすそうない印象を受けた。Kerasと PyTorch、両方使えるようになりたい。

GANを実装してみる

GANの実装は、Kerasバージョンがfast.aiから提供されている。

これをPyTorchに置き換える。パラメータを参考にしつつ、また 公式の DCGANチュートリアルの実装も参考にしつつ、実装してみた。

ぜんぜんダメじゃん、ジェレミー先生!

これを mode collapse というらしい。

なんど試してみても、損失関数の D値が0に収束、G値が大きくなっている。

Dは Discriminaterを表し、GのGeneratorが生成したものが本物か偽物かを判定する役割があるのだが、今起こっている状況は、Generator が生成した画像がほとんどの確率で偽物と判定されている。

GANを改善してみる

How to Train a GANというNIPS2016での発表があって、ここにGANの改善方法がまとまっている。

[https://www.youtube.com/embed/X1mUN6dD8uE]

以下を試してみた。

  • ReLU の 代わりにLeakyReLUを使う。
  • BatchNormalizationを使う。
  • Adam の 学習率を小さくする。
  • ノイズは正規分布からサンプリングする。
  • ネットワークのニューロン数を変更する。

結果。

おっ、それらしく古代文字っぽいものが浮き出てきたぞ。

単純なGANだと、あまり成果がでないことはわかっているので、実験は早めに切り上げて次のステップ DCGANに進むことにする。

04 Aug 2017, 08:38

Real-Time(Fast) Style TransferでノートPCのWEBカメラからの動画にゴッホのスタイルをとらんすふぁー

fast.ai cutting-edge-dl-for-coders-part2の Lesson9の課題で、Fast Style Transferを実装した。

[https://www.youtube.com/embed/tEUtFeF4v8Q?ecver=1]

はじめに

前回の続きです。Lesson8ではStyle Transferを試した。

今回は、その続き。

Lesson9の課題は、Perceptual Losses for Real-Time Style Transferという論文を読んで理解し、Fast Style Transferを実装せよとのこと。

概要

前回のNeural Style Transferでは、学習に時間がかかることが問題だった。

この論文で書かれた手法をつかうと、学習したネットワークに画像を入力すると、順伝搬のみの計算でStyle Transferができる。GPUだと一瞬で(CPUだと一瞬じゃなかった)できる。なので、Real-Timeな画像処理=動画作成ができる。

これはすごい!

ネットワークの全体像は以下のような感じ。論文より引用。

Image Transform NetworkLoss Network の2つのネットワークを組み合わせる。

Image Transform Networkのアーキテクチャは、以下のサブドキュメントが詳しい。

Loss Networkは、VGG-16を用いる(全結合層をとったもの)。Content Loss と Style Lossを足しあわせ(これを Perceptual Lossと定義している)、損失関数とする。やっていることは、Lesson8のStyle Transferに似ている。

この損失関数を使って Image Transform Networkを 誤差逆伝播法で最適化する。Loss Networkは学習させない(公開済みの重みを使う)、Image Transform Networkのみ学習させる。

学習には、MS COCOという画像データを論文では利用していたが、Lesson9では、ImageNetからの抜粋画像(http://files.fast.ai/data/)を利用した。

ちょっと言葉足らずなので、詳しくは以下の記事を参考に。とても詳しく書いてあって参考になった。感謝。

結果

今回も、与えられたJupyter Notebookをコピペして作成。コードの意味が理解できていないという情けない状況。がんばろう

ノートPCの webcamから動画を取り込んで、fast style transfer で変換して、再度出力するということをやったが、ノートPCの非力なCPUでは、リアルタイムでは行かなかった。

02 Aug 2017, 04:34

Neural Style Transerで京都渡月橋の写真にゴッホのスタイルをとらんすふぁー

fast.ai Part2

fast.ai の Cutting Edge Deep Learning for Coders を始めた。

Lesson8のテーマは Artistic Transfer。いわゆる Style Transfer。絵のスタイルをディープラーニングで抽出して、別の画像に転移させるというもの。

Part1は Practical(実践) という題名だった。その意味するところは、Kagglerになれ というものだった。

Part2は、Cutting Edge(最先端)という題名だ。その意味するところがわかった。それは、論文を読め ということだった。Part2では、論文を読んでそれを実装するというのが課題として課せられるようだ。英語も数学もツライのに、論文なんて読んだことないから、無理だよ!!挫折しそう。

Neural Algorithm of Artistic Style

Lesson8では、アート系のディープラーニングの先駆けになった論文、A Neural Algorithm of Artistic Styleを読んで、再実装して、さらには結果をブログに書いてねという課題が出された。

というわけで、実装してみた。

元となるコードはちゃんと提供されている。それを写経しただけ。Keras版と PyTouch版がある。

理論の方は、素晴らしく解説された記事があるので、それを紹介。

コンテンツとスタイルの特徴抽出

このNeural Style Transferという方法は、異なる画像からコンテンツとスタイルを別々に特徴抽出して、それらを足しあわせて一枚の画像を生成する。

まずは、元となるコンテンツ画像。京都嵐山の渡月橋。去年旅行で行ってきた。

このコンテンツ画像からコンテンツの特徴を抽出したものが以下。

スタイル画像は、定番のゴッホの星月夜。

スタイルの特徴を抽出した画像が以下。

結果

そして最後に、コンテンツとスタイルを合成した画像が以下。

おまけ

こんなこともできる。

27 Jul 2017, 15:30

Deep Learning に挑んだ半年間、そして今後の勉強計画について

はじめに

半年くらい前、まだ機械学習についてなにも知らなかったときに、書いた記事が炎上してとても恥ずかしい思いをした(記事は非公開にしました)。

この記事はただの日記です。

この半年で取り組んだこと

この半年で、機械学習の勉強はせずに、ディープラーニングと強化学習の勉強をした。

3月〜7月

上記記事を書いてモチベーションを高め、さあ機械学習のための数学をやろうと意気込んでいたのだけれども、すぐに気が変わって、機械学習の王道を進まずにディープラーニングに突っ込んでいった。なぜなら、Udacity で Deep Learning Nanodegree Foundationという4ヶ月の講座を受講し始めたからだ。

この講座に 3月から7月までの4ヶ月間取り組むことによって、

  • Deep Learningという学問分野の概要を学んだ(NN, CNN, RNN, GAN)
  • TensorFlowで実装できるようになった。

このDLND、超初心者向けな講座で、手取り足取り Deep Learningを教えてくれた。なので、数学が必要なかった(笑) あれ、おかしいな、ディープラーニングって、もしかして数学あんまり必要ない??統計とかほとんど出てこないよ。

4月〜5月

また、同時進行で Fast.aiのPractical Deep Learning for Coderという講座も受講したのだが、これがまたすごくいい講座。

この講座の理念は、Deep Learningの敷居を下げて、誰もがDeep Learningを簡単に使えるようにすること。もちろん、ここでも難しい数学は抜き!そして、ここで Keras という Deep Learningをおそろしく簡単にするライブラリを知ってしまう。これをしったら、numpyの実装はおろか、tensorflowですら面倒に感じてしまう。この講座によって、

  • Kerasでバリバリコーディングできるようになった。
  • Kaggler としてデビューし、画像系コンペなら、いい結果を出せるようになった。

というわけで、この2つの講座によって、この半年でバリバリのディープラーニングコーダーになったのだった。

6月〜7月

しかし転機はまたやってきた(コロコロ変わる…)。会社にAIの勉強をしてます!といったら、「うちにはAIの仕事はまったくないよ!」といわれ、さらには「そんな役に立たない勉強よりも、Javaの資格とらないとクビにするよ」という脅しまでされたのだった。

というわけで、AIとの付き合い方について、考えを見直さざるを得なくなってしまった。今の会社は、組込みソフトの受託開発がメインだ。組込みソフトと AIがどう関係するのだ???うーん、と悩んだところ、2つの答えにたどりついだ。

  • 強化学習
  • ロボティクス

というわけで、強化学習の勉強とLEGO Mindstormsを使ったロボット制御の勉強をはじめた。

これにより、

  • OpenAI Gymデビューし、強化学習問題が解けるようになった。
  • 強化学習やロボット制御の理論を LEGO Mindstormsで試すことができた。

これから取り組むこと

数学の苦手意識を克服

この半年間で、理論よりは実践重視でバリバリコーディングしてきたのだけれども、ディープラーニングが趣味レベルで中途半端にできるだけでは、仕事には生かせないし、なにもできない!!

そもそも、である。機械学習に興味を持った理由は、数学を使って現実問題を解決するところがかっこいいと思った憧れからである。そのために、大学では数学を専攻したはずだった。

大学を卒業して10年くらい経った。大学は情報系の専攻で、卒業研究は、情報理論 を学んだのだが(学部卒)、10年も経って数学から離れていたらすっかり忘れてしまった。なので、大学の数学を一から学び直したい。

また、やっぱり数学が壁で挫折したことが、この半年間でたくさんあった。

数学で撃沈した思いでをつらつらと並べたい。

  • 誤差逆伝播法が理解できず挫折。(これはデーィプラーニングがわかる数学という本によってようやく理解できた)
  • Udacity: Artificial Intelligence for Roboticsや確率ロボティクスでベイズ統計や確率が理解できず挫折。
  • Deep Learning Nanodegreeで学んだことの先にいこうとすると、論文を読んでいかないといけない。しかし、論文を開くと数式の羅列に意味が分からずフリーズ。
  • 深層学習(イルカ本)挫折。
  • Deep Learning Javaプログラミング 深層学習の理論と実装、挫折。生成モデル??
  • Siraj Ravalの The Math of Intelligence 挫折。

というわけで、数学、やります!

プログラミングのための30代からのやり直し数学である。

勉強の方針

大学生のころは、理学系だったので、数学の勉強は定理と証明の繰り返しだった。ソフトウェア開発者になると、数学に対する姿勢は工学系よりになる。

  • 理論よりも応用を考える
  • この定理がどう役に立つかを考える
  • 抽象性よりも、具体的イメージを
  • 証明の厳密性はほどほどに(理解できることに越したことはないが)

大学1,2年生の数学の復習

機械学習で必要な数学とはなにか、それは情報系の大学生が1,2年生で習う数学で十分という意見が多い。私は、情報系の専攻だったのだけれども、そこで習った数学は以下の4つ。

  • 線形代数
  • 解析学
  • 統計学
  • 離散数学

離散数学は、TopCoderなどのアルゴリズムコンテストにとても役に立ちそうな分野だ。機械学習との関係は、よくわからなかった。集合や代数的な知識は、線形代数を勉強することで、身につけられそう。離散数学の勉強は保留で。

基礎固めのための参考書はマセマで

やり直し数学ということで、最近大学生の間で評判の高いマセマシリーズで基礎固めをすることにした。高校数学から大学数学への考え方の移行がスムーズにいける、定理の証明に手を抜いていないのでガチ、コメントが多くページを遡って読みなおす必要がなく読みやすい、などの印象を受けた。

基礎ということで、以下の3つをすすめることにした。これで、まずは、大学の初等数学を復習する。

  • 線形代数
  • 微分積分
  • 統計学

基礎の補強と応用へ

マセマは数学をとても簡単に(でも手を抜かずに)書かれているけれども、知識を厚くし、また別の角度から知識を補強したい。そこで選んだのが「プログラミングのための〜」のシリーズ。

解析系がこのシリーズにないので、代わりに最適化数学をメニューに組み込む。また、機械学習ではベイズ統計が使われるので、メニューに組み込む。

  • プログラミングのための線形代数
  • プログラミングのための確率統計
  • これなら分かる最適化数学
  • Pythonで体験するベイズ推論 PyMCによるMCMC入門

数学を復習したら機械学習へ

数学力を強化したら、もともとの目標である機械学習の勉強に着手したい。まずは、はじパタから。

理論よりも実践を重視したいので、なるべくPythonとJupyter Notebookでプログラミングできる教材を使って勉強していきたい。

ココらへんまで来たら、Kaggleにもガンガン挑戦していきたい。Deep Learningの手法のみに頼らずに、いろんな手法から最適な方法を取捨選択できるようになりたい。

その他、情報理論を勉強したい。この本は、情報理論的な立場から機械学習を捉えているらしいので、気になっている。

読みたい本

目指すは、機械学習の登竜門、パターン認識と機械学習(PRML)

また、確率ロボティクスも挫折したので、数学力をつけて再挑戦したい。

その他の勉強

Deep Learning

今後はDeep Learningの勉強は抑えて他の勉強にリソースを割り当てる。

ただし、fast.aiの Deep Learning のオンライン講座 Cutting Edge Deep Learning for Coders は進める。この講座はほんとうによい講座なので、引き続き受講する。

Deep Learning Book の 本が翻訳されたら、勉強を再開しよう。

ロボティクスと強化学習

仕事で AI を活用するためには、この2つの分野の学習が必要なので、ここに力点をいれていく。

具体的には、Udacity Robotics Nanodegreeを半年間に渡って受講します。おそらく、これはかなりの負荷になるので、他のことをやる時間がとれなくなるかもしれない。

また、強化学習は 次期 MLPシリーズで発売が予定されているので、その本が発売されたら勉強を再開したい。

まとめ: 今年やること

まとめると、今年の残りの予定は以下の3つだ。

  • 機械学習のための数学力強化
  • Udacity Robotics Nanodegree
  • fast.ai Cutting Edge Deep Learning for Coders

11 Jul 2017, 14:02

正弦曲線にしたがう為替の値動きについてDQNでバックテストをしてみた

DQNを勉強しているので、以下の記事に触発されて自分もFXでDQNをしてみたくなった。

2年前、OANDAでのシステムトレードで5万円を損した屈辱を今こそ晴らすのだ!

まずは、GMOの記事でも実施しているように、正弦曲線に従う為替の値動きについて、

DQNを適用してバックテストを行ってみた。

今回のJupyter Notebookは Gistにあげました。

正弦曲線

以下のような正弦曲線について、DQNでバックテストを試みる。

MDP

  • 状態
    • (-1.0, 1.0) の範囲の値
    • 売買のステータス(SELL, NONE, BUY)
  • 行動
    • SELL
    • HOLD
    • BUY
  • 報酬
    • 売買の即時報酬

コード

`import enum
class Action(enum.Enum):
    SELL = 2
    HOLD = 0
    BUY  = 1

class Position():
    def __init__(self):
        self.NONE = 0
        self.BUY = 1
        self.SELL = 2

        self.bid = 0.0
        self.pos_state = self.NONE

    def state(self):
        return np.array([self.bid, self.pos_state])

    def change(self, action, bid):
        self.bid = bid
        self.pos_state = action

    def close(self, action, bid):
        if self.pos_state == action:
            return 0

        self.pos_state = self.NONE
        if action == Action.BUY.value:
            reward = (bid - self.bid) * 1000
        else:
            reward = (self.bid - bid) * 1000
        return reward`

keras-rl を利用するために、環境を OpenAI gym ライクで作成する。

`import gym
import gym.spaces

class FXTrade(gym.core.Env):
    def __init__(self):
        self.action_space = gym.spaces.Discrete(3)
            high = np.array([1.0, 1.0])
            self.observation_space = gym.spaces.Box(low=-high, high=high)

            self._position = Position()

            self._sin_list = []
            for t in np.linspace(0, 48, 240):
                self._sin_list.append(np.sin(t))
            self.cur_id = 0

    def _step(self, action):
        bid = self._sin_list[self.cur_id]
        self.cur_id +=1
        done = True if self.cur_id == 240 else False

        if action == Action.HOLD.value:
            reward = 0
        else:
            if self._position.pos_state == self._position.NONE:
                self._position.change(action, bid)
                reward = 0
            else:
                reward = self._position.close(action, bid)
        return np.array([bid, self._position.pos_state]), reward, done ,{}

    def _reset(self):
        self.cur_id = 0
        self._position = Position()
        return np.array([0.0, 0.0])`

keras-rlの登場

強化学習を笑っちゃうほど簡単に実施するために Keras-rlをつかう。

このライブラリは抽象度が高すぎてもはやなにをやっているのかわからない。

exampleを参考にして、それっぽいコードを書いてみる。

`from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.optimizers import Adam

from rl.agents.dqn import DQNAgent
from rl.policy import BoltzmannQPolicy
from rl.memory import SequentialMemory

nb_actions = env.action_space.n

model = Sequential()
model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(nb_actions))
model.add(Activation('linear'))
model.summary()

# DQNに必要な Experience Replayのためのメモリ
memory = SequentialMemory(limit=50000, window_length=1)
# ボルツマン分布に従うポリシー
policy = BoltzmannQPolicy()
# DQN Agentの生成
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory,
               target_model_update=1e-2, policy=policy)
# optimizersはAdam, 損失関数は 平均二乗誤差
dqn.compile(Adam(lr=1e-3), metrics=['mae'])

# トレーニングを開始。同じ正弦曲線を9600 = 240 x 400回 回す。
dqn.fit(env, nb_steps=9600, visualize=False, verbose=1)

# トレーニング結果を確認
dqn.test(env, nb_episodes=5, visualize=False)

`

おお、rewardがプラスだ。。

`Testing for 5 episodes ...
Episode 1: reward: 603.962, steps: 240
Episode 2: reward: 603.962, steps: 240
Episode 3: reward: 603.962, steps: 240
Episode 4: reward: 603.962, steps: 240
Episode 5: reward: 603.962, steps: 240`

おわりに

  • 理論を抑えていないので何をやっているのかがいまいちわからないのだけれども、おそらく上がり調子のときは報酬もたくさんもらえるので、買い注文を多くしているのだと思う。
  • keras-rlは非常に強力なライブラリだけれども、抽象度が高すぎてなにやってるのかよくわからない。理解を深めるために numpyで実装してみるのもありかもしれない。
  • 状態は、その時の値のみを扱ったが、過去5bin分の状態を考慮にいれたらどうなるだろうか?いわゆるwindowの概念を強化学習にいれてみると、結果がよくなるだろうか?

09 Jul 2017, 08:58

CartPole問題にDQN(numpy only)で挑戦したけど解けなかった

前回の続き。

前回は、Kerasを利用したのだが、今回は numpyだけで実装してみた。ゼロから作るDeepLearningを大いに参考にした。

  • Kerasと同じことを実装はずなのに、結果が同じにならない。
  • エピソードを重ねても生存率が頭打ちになって、伸びない。
  • 調子のいいときと調子の悪いときがある。エピソードの開始時に運良く生存すると、その後の生存率が上がる。

結果

解けなかった。

https://gym.openai.com/evaluations/eval_iNrsSMkNSxW1wGF0b1lspg

コード

05 Jul 2017, 15:56

Deep Q-Network(DQN)リンク集

日本語

英語

course