AI関連 開発メモ

■学習日記 2018〜2019年

2018.8.2

機械に学習させる前に、人間が学習しなければならない、というのが人工知能分野の逆説的な常識ですが、遅々として進んでいません。
実装的な面を中心に進めたいのですがなかなか時間がとれず、食事や電車に乗っている時間などを使って書籍を読むことの方が多く、理論的な方が中心になっています。
書籍は基本的に図書館で借り、気に入ったものは購入、という感じ。
これまで購入した書籍は上記の通り。
書評についてはAmazonを参考にした方がいいと思いますが、私個人的な感想を書いておきます。

2018.11.21

Tensorflow+GPUで額面通りにやろうとするとうまくいかず、同様のエラーで苦労をしている人をたくさん見かける。
自分なりにわかったのは、原因がバージョンの不一致にある。(正確に言うと、様々なパッケージがあり、それぞれのパッケージが要求するバージョンが異なり、最新版が最善とは限らない)

Tensorflowが現時点で要求するのはCUDA 9.0であり、それに従ってインストールすべきなのだが、Tensorflowサイトからのリンク先がNVIDIAのサイトであり、そこで最適な情報を(Tensorflowにとって)提供していないことが問題となっている。

うまくいったので、そのときの条件を記しておきます。
Windows7 64bit
NVIDIA GeForce 1080
Python 3.5.2
pip3 install tensorflow-gpu==1.11(これ以外のバージョンでもOKだと思うが未調査)
CUDA 9.0 (downloadしたものは cuda_9.0.176_windows.exe)
cuDNN (downloadしたものは cudnn-9.0-windows7-x64-v7.4.1.5.zip)

Visual Studio Integrationをインストールしないとか、クリーナーソフトを使ってNVIDIA関連すべてアンインストールとかは一切不要です。
エラーで苦しんでいる人の参考になれば。

で、実際にGPUを使って計算させてみましたが、CPUだと数時間かかったものがたったの数分で終わった!むちゃくちゃ速い。(ただ、消費電力が凄い)

2019.1.30

当初の予定より半年以上遅れてしまいましたが、wxPythonとTensorflowでCNNを使った映像切り分け用のテストアプリがもう少しで動きそう。
個人的にいくつかのテレビ番組をCMカットしてHDDに保存していますが、最低でもその作業が自動化できることが最初の目標です。これで実用的だと判断できればその適用範囲を広げ、汎用的なものが作れたらと思います。そうなればCNNに関してはとりあえず完了にするつもり。
その次はRNNとか色々とやりたいことがある。

2019.2.11

ようやく学習が実行できるようになった。
バッチサイズを100にして、3万フレームほどの画像を学習させようとしたけど、非常に時間がかかる!
学習データを選別する必要がある。
しかし、消費電力を見ると200W程度もあり、お陰でエアコンをかけなくてもいい。
電気代をかけて学習させるわけだから学習した状態を保存しようと思ったら、TensorflowのEstimatorは保存できない??そんなはずはないだろうけど、ググっても見つからない?→なんてことはない、Estimatorの作成時にmodel_dirを指定していれば自動的に保存・復元するのでした。

2019.2.12

TensorflowのCNN Estimatorを使って学習、評価を行ってみたが、特定の部分にはaccuracy=1.0と高精度なのにそれ以外はaccuracy=0.0となる(??)
学習に必要な時間は100frame当たり約2分!!(1frame当たり1.2秒)
これまで学習させたのは4時間くらい?だとすると実時間で8分間の映像?
それでもCMと番組を見分けるだけの性能はあると思うのだが。。
15フレームおきに学習するように変更して評価してみる。20分の番組なので40分程度で学習は完了するはず。
checkpointのデータをクリアして再度やり直してみたけど、predictを行うと、すべて同じlabelになってしまう(???)

2019.2.13

入力データを確認してみたけど間違いは無さそう。28x28に縮小してしまうと似たような映像になってしまい、区別できなくなってしまうのだろうか?だったら、学習パターンの多い方に偏っても良さそうだが。
解像度を上げてやってみて、結果が変わらなければEstimatorによる方法はこの程度にして、カスタマイズできる方式に移行しようかと思う。

2019.4.15

PCが非常に不安定になり、ログインしてしばらくするとSystem Driveがフリーズ状態になってしまう。
原因が特定できないためOSから再インストール。それに伴い各バージョンも上げた。
Windows7 64bit
NVIDIA GeForce 1080
Python 3.7.3
Visual Studio 2015
pip3 install tensorflow-gpu (version=1.13.1)
CUDA 10.0 (downloadしたものはcuda_10.0.130_411.31_windows.exe、GeForce Experienceはインストールせず)
cuDNN 10.0 (downloadしたものは cudnn-10.0-windows7-x64-v7.5.0.56.zip)

※前述のとおり、CUDA, cuDNNは最新版をインストールしてはいけない。Tensorflowが指定するバージョンをインストールしないと、"DLL load failed"が出る。(要求するバージョンを表示すれば嵌る人が減るだろうに)

2019.5.21

またしばらく間が開いてしまいましたが、GeForceをセットした開発用PCがなぜか突然不安定になり、いきなりBlueScreenという症状が頻発したため、開発用PCを新たに購入(6core/12thread!)、これまで使用していた不安定なPCをAI専用マシンにしました。(たまにBlueScreenで落ちるけど、使えないというほど不便ではなくなった)

2019.2.13の日記でうまくいっていない、みたいなことを書いたけど、コードを確認しながら整理していたら、実は何も問題はなく正常に動作していた。そこで、

やってみたこと:
・25分ほどのテレビ番組映像を教材に利用
・CMと非CM映像を学習
・15フレームおきに100フレームほど学習(素材の先頭から50秒分だけ学習)
・268x158のmp4ファイルを56x56に縮小した画像を学習データに使用

わかったこと:
・たったこれだけの学習であるにもかかわらず、意外とちゃんと認識してくれる
・15フレームおきにかかわらず、フレーム間の映像で予測させてもほぼ正しく認識してくれる!
・学習させていない映像は認識率がかなり落ちる

汎用的なCM・非CM判定AIを作ろうとしたら膨大な学習が必要だろうし、どれだけ学習させても100%は不可能だと思う。しかし、特定の番組であればCMは大体同じであるし、必要な学習量はかなり減るはず。個人レベルであればこれで十分。目的は録画した番組からCMを除きたい、なので、仮に5分かかっていた作業が自動化で(人間のやる作業が)1分になるのなら気分的にうれしい。「気分的に」というのは、AIの構築と学習作業、自動化のための様々なscript作成作業を含めると実は時間短縮になっていないという現実があるから。

汎用的なビジネスで使えるようなレベルのAIを作るにはかなりの労力が必要だが、個人レベルなAIだと意外と簡単にできるという知見が得られた。こういうのは書籍、インターネット上では見つからない。やはり実際にやってみないとわからないことはあるね。
これを非AI、つまり普通の画像処理でやろうとしたらロジックを作るだけで何か月かかるかわからない。(いやいや自分のAIを動かすまでこの日記だけでも1年近くかかっているが(笑)

2019.5.26

適当な学習データがあればそれなりに期待通りの予測結果を出してくれることが分かったので、予測結果をもとに非CMを切り出し、動画ファイルを作成する自動処理スクリプトを作る。ただ学習の成果を確認しながらになるので、しばらくは半自動的になる。
しかしここで気が付いたのだが、フレームごとにCM,non-CMの判断を行っているが、非常に遅い!25分の番組を解析するのにその倍以上かかる!?!?
全自動化できれば自分の手間はほとんどないようなものだが、自分がやれば2分程度で終わる作業がかなりの時間(と電気エネルギー)が必要となる。なんだかAIって微妙な気がしてきた…

今は私の学習段階でもあるので、そこはあまり考えずに進めることにするが、果たしてこんなに効率の悪いAIを最終的に使うのかどうか考えてしまう。

現在対象にしている番組は5カ所ほどしか変化点がないのに、全フレームを判断対象にしているので非常に効率が悪い。私人間はどこに変化点があるのか大体わかっているのでAIよりは遥かに速く作業ができる。AIにもそれを学習させ…というよりはアルゴリズムを改善することで私人間ほどではないが、速くはなる。というか、ここにこそAIに頑張って欲しいところだが、ここは人間が手をかけてやらないと速くはできない。結局AIなんて人間が教えたことしかできない。しかし世間はAIが人間を超える、などと妄想ばかりが先走っている。
もし特異点を迎えた暁には、私がやっている作業をAIの方々には2分以内に処理していただきたい。(笑)

2019.6.2

これまで少ない学習量でうまくいくじゃん、って思ったけど実は違った。学習させるほど精度が下がる部分がある。ここはもう少しやって見極める必要がありそう。
学習用のGUI(wxPythonで作ってる)の完成度は少しずつ上がり、学習内容と予測結果が容易に比較できるようになった。AIの完璧な予測は最終的にも無理だと思うので、予測結果を微修正してEDL出力できるようになればAI部分はほぼ完成になるはず。(修正した内容を再学習するとどうなるか、とかAI的な課題はあるけど)

EDL出力した内容に従って自動編集処理をする部分も作成した。
pyautogui を使って自動処理するプログラムを作ったが、なんとUSキーボードを前提にしたコードがあり、コロンが入力できない!
Pythonは基本的によくできていると思うが、まさかこんなところに落とし穴があるとは…
回避策は見つからず、pyautoguiを直接変更するしか無かった。
あとShiftt+PageDownが入力できないというのもよくわからない。

予測処理に意外と時間がかかる問題はskip frameすることで解決。

全体の処理は出来つつある。今一番の課題は、一番肝心のAIの学習。
バッチ処理を一回やっただけだと精度は高いのだが、二回目を行うと極端に悪くなる。なぜだろう。。

2019.6.3

やはりバッチサイズを学習サイズと同じ大きさにして同じデータで予測させるとほぼ完璧な結果を出すのに、バッチサイズを小分けにすると極端に認識率が下がる。
何か間違っているのだろう…

2019.6.5

同じデータを二回バッチ処理→問題なし。バッチ処理内に問題はなさそう
一度だけバッチ処理、一旦学習アプリを終了して再起動後同じデータをバッチ処理→問題なし
と言うことは、連続して二回目以降のバッチ処理のデータに問題あり?そうは見えないのだが・・・
さらに、同じデータを二回のバッチ処理に分けた場合はどうなるか?→ダメ
あるデータを一度学習、アプリ再起動後異なるデータを学習→ダメ
一体何が悪いんだ?
もしコードが正しいとすると、データが100個あり、
それを一度のバッチ処理(100個分)→OK(同じデータで予測するとほぼ100%)
それを二つに分割してバッチ処理(50個ずつ)→ダメ
同じデータを二回バッチ処理(100個分)→OK
つまり、端的に言うと、
バッチ処理を二回以上行うと、学習データが異なるときに限り認識率が極端に下がる
というのがCNNの性質と言うことになる。
まぁ初回の学習は特殊な処理をしているとすれば納得できるが、二回以上のバッチ処理で極端に認識率が下がり、そこから認識率を上げるには一体何をすればいいのか?
そもそも学習したデータで評価すると言うこと自体が間違っているのだろうか??
汎化する過程で当然あり得ること、であればmnistのサンプルで試してみよう。
学習に使ったデータの認識率が悪いのであればそういうものだと言うことになる。
しかし、同じデータで何度も学習していけば認識率は確実に上がるとは思うのだがどうなのだろう?
一般的には過学習に悩むだろうけど、今回の場合は逆過学習。学習させたことがさっぱり、というパターン。そんなの聞いたこと無い。
教えたことはよくわからないけど、そのよくわからなさ加減がどんな文字でも同じ程度、って何だかAIじゃない昔のできの悪いパターン認識っぽいんだけど・・・
AI expoertの人からしたらアホなことを言っているとしか見えないのでしょうが。。

まぁあと数週間もがけばわかるかな。

2019.6.15

cnn_mnist.pyでやってみると、同様の結果だった。そういうものなんか・・・
では、mnistの全データを学習させた場合はどうなるのだろうか?
認識率は変わらない。ということは、二回目の学習で認識率が下がるのは仕方なく、重要なのはそれ以降の学習でも認識率が下がらないところがポイントだろうか。
当初感覚的には二回目の学習で極端に下がるのでは無く、徐々に下がるけど全体的な(未学習のデータも含めて)認識率は向上する、というのを期待していたけどそうではないらしい。

さて、納得できないところはあるけど、そういう特性があるということで進めることが出来る。
ただ、汎化させることも重要だが、学習したデータを使っても認識率が低いのは気になる・・・

2019.7.7

同じデータ全体で二回学習を行い、学習したデータを予測させた。
cnn_mnist.pyで試したところ、やはり認識率は下がる。
一回だけ学習させた場合:
[4.2422849e-07 8.9969944e-06 1.3426103e-02 1.2557615e-01 8.0972532e-06
3.5863333e-05 1.0984513e-08 8.3966821e-01 6.1406329e-04 2.0662060e-02]
同じデータでもう一度学習させた場合:
[1.1715127e-07 2.0444281e-06 1.0113746e-02 3.4783185e-01 1.2486497e-06
1.1044477e-05 4.5680670e-10 6.3561618e-01 1.1067595e-04 6.3131601e-03]

やはりそういうものなのか・・・

2019.7.13

とりあえず、(最適かどうかわからないけど)自分が作ったCNNに自分が用意した学習データを毎日学習させている。GPUを使っても非常に時間がかかる。さてどういう結果になるか。
ここは機械的な作業なのでPCに任せ、それ以外のモデルのAIを使って色々と(私自身が)学習中。。

ただ、GPUを載せたPCはやはり不安定。Blue Screenやらアプリの異常終了が多い。
(一日に一回程度だが、学習やり直しになるので無駄が多い)
なのでplatformをWindowsからLinuxに変えようかと思っている。

2019.7.15

Linux用にSSDを購入し、OSをWindowsからLinuxに変更。
(500GBも必要ないが、一番割安なので)

まずはUbuntu16をinstallして不安定ならUbuntu18のつもりだったが、Ubuntu16は古くてすんなりとはいかない。
が、とりあえず動き始めたみたい。しばらく様子を見ることにする。

2019.7.16

Linuxにしたら今のところ安定している。きっとWindowsの何かしらのドライバーに問題があるのだろう。
ただ、Pythonのバージョンも違うし、色んなもののバージョンが違うのでまだ結論は出せない。
もうしばらくやって問題なければUbuntu18にしてみようと思う。

2019.7.21

pip install tensorflow-gpu
でインストールしたはずなのに、どうもGPUを使わずに動いているらしい。(原因不明)

この問題を解決するのに時間をかけるより、Ubuntu18にしてみることに。
しかし、これもまた素直に行かない。
GoogleのTensorFlow HPにあるインストール手順をそのままやっても動かない!
Linuxあるあるだが、一体こういう原始時代はいつまで続くのか・・・

2019.7.26

Ubuntu18.4にはPython 3.6が入っているのだが、3.7にしようとしたところ、日本語のページは色んな苦労をされている方が多い。
英語のサイトに行けば簡単にできる方法が記載されているのでここに記しておきます。
sudo apt install python3.7
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
sudo update-alternatives --config python3
ここで選択する(たぶんそのままEnter)
python3 -V
で確認
すごく簡単。
→それより、anaconda3をインストールすれば何も考えずにすべてうまくいくらしい

7.21に発生していた問題は、
sudo apt-get install --no-install-recommends nvidia-driver-410
で「壊れた変更禁止パッケージがあります」だったが、
sudo apt install aptitude
sudo aptitude install nvidia-driver-410
で解決するそうだが、かなり激しい変更が伴うみたい。
案の定、実行したらUbuntuが起動しなくなったよ!!
なんだかなぁ
Linuxは相変わらず面倒くさい。
Windowsのほうがtensorflowは安定しているから戻したいけど、Windows Driverあたりに問題があるから戻せない。。
AIへの道のりは非常に遠い。。
誰かTensorFlowがちゃんと動くPCを用意してくれ。
そんなものが世の中に存在するのかと疑ってしまう。。

こちらにある手順でもダメ。

2019.7.28

何度もUbuntu18.4をインストールし、ようやく動いた。
TensorFlow HPではCUDA 10.0 での使用を勧めているが、手順の一番最後にある
sudo apt-get install libnvinfer-dev=5.1.5-1+cuda10.0
ここで、どうしてもcuda10.1のinstallしか出来ないと言ってくる。しかたなく、
sudo apt-get install libnvinfer-dev
でやったところ、CUDA 10.1 関連のファイルが大量にインストール。
ほかにもいくつか躓いたけど、なんとかGPUで動くようになった。
TensorFlow@Ubuntuに限った話だが、すんなりいかない。

2019.8.31

間が空いたけど、確実に進めている。
これまでTensorFlowのtutorialにあるEstimatorでやっていたけど、そもそもこのsampleはよろしくなかった、ということが色々やっていて解った。
現在はKeras+tensorflowでやっており、グラフ出力などできるようにしたら色んなことが解るようになった。(疑問も解消)
今までのEstimatorはepochが指定されていないため、そもそも深層学習にはなっていない(と思う)。
AIの勉強はそこら辺に転がっている、野良コードを色々試してみる、っていうのも一つの手かもしれない。
その中から使えそうなものを自分なりにカスタマイズ、っていうのもありかと。

現時点やっているのは、動画ファイルからクラス分類のための学習だが、時間がかかるのは学習そのものより動画から学習用データを作るところにかなり時間がかかっている。ここに時間がかかっていては、いつになっても最適なパラメータは見つけられない。→データ入力の高速化、とか本来の学習とは関係のないところで工夫が必要。

AI専用のLinuxマシンにSSD 100GBを割り当てていたけど、(かなり)少なかったかもしれない。(SSD自体は全部で500GB)

2019.9.11

再び行き詰まった。
なかなか学習結果が期待通りにならず、evaluateによるloss/accuが十分な値でないとしても、現実の認識結果はどうなるのか、そのためにpredictを行わせようとしたところ、よくわからないエラーが出る。

ValueError: Layer sequential_1 was called with an input that isn't a symbolic tensor. Received type: <class 'numpy.ndarray'>. Full input: [array([[[[ 59, 62, 63],

Kerasは非常に簡単に利用できるけど、エラーが出るとどこに問題があるのかまったくわからない。
Kerasの使い方が悪いのかと思い、入力データをcifarにすると問題ない。となると、入力データの形式なのかと思い、shapeを確認すると問題なさそう。ググってもよくわからない。

もうちょっと頑張って解らなければKerasによるCNNは一旦諦める。trainingとevaluationはできるけど、predictができないって意味がないでしょ。

2019.9.14

諦めずに調べていったら、ようやく解った。非常につまらない間違い。

model.predict(data)

とすべきところを

model(data)

になっていた。(実際はこんな単純ではないのでぱっと見解らない)

こんな間違いをする奴はいないだろうから、ググっても出てこないわけだ・・・
一週間もかけるくらいなら放置しておけば良かった。(こういうへぼミスは何かのきっかけで見つかるもの)

2019.9.23

keras cnnにはまだ致命的な間違いがあり修正したが、やはりlossの値が2.1なんていう使い物にならない値になる。
パラメータを色々と変えて試行錯誤するしかない。
その試行錯誤を自動的にやりたいが、時々"Segmentation Failure"が発生する。
Windows Driverの問題を避けるためにLinuxにしたが、ハード側に問題があるのかもしれない。。

Yolo v3

Yolov3のサイトを参考に自分が持っている静止画の認識をやってみたが、意外と(?)認識率が高い。
これは使えそうなので、独自の学習をさせてみたいと思う。(例えば"Person"という認識ではなく、男女の判別とか)

2019.9.25

多分ですが、いきなり自分なりのAIを作ろうとしたのがいけなかったかもしれない。
Google, IBM, Microsoftなどが学習済みのモデルを公開しており、それを使えば一般的な判別処理はかなりの精度でできそうだとわかった。が、「これが犬」「これが猫」とか、っていうのは自分が必要としているAIには必要のない能力。
なのでやはり自分なりに学習させたAIを作るのは間違っていないと思う。
ただ、期待通りのAIを作るにはそれなりに努力が必要、というのもわかってきた。

ビジネスになるのであれば、独自にデータを収集して学習すればいずれ売り上げがあるのかもしれないけど、個人レベルでAIを使う場合、大手IT企業が無償で提供しているような学習済みモデルは基本的に使い道がない。
個人的にやりたいのはもっと細かい粒度の学習済みモデルが必要。

AIブームと言われているが、盛り上がっているのはビジネスサイド。
プログラマーのレベルでもいいので、「このモデルがあればこういうことができて便利」というツールとしての用途が見つかればいい。
しかし、今はそういう兆候は見えない。

2019.9.26

データの読み込みに時間がかかっていたが、原因の90%はnumpyのappend()だった。

2019.9.29

マシン自体が不安定という問題があるものの、プログラム自体はかなり安定してきたので、パラメータを色々と調整してCNNの学習とはどういうものか試している。
学習に使っている画像素材はおよそ8万枚、deep learningをやるには十分な数だとは思う。
パラメータをちょっと変えただけでlossの値が大きく変わり、一体が何が最適なのか暗中模索状態。
今のところ入力画像が268x148x3(color)、epoch=50, batch size=50,あたりが最適。だが、その根拠がどこにもまったく無い。
こんな感じ。
loss=6.32826 accuracy=0.600257 ←約1万枚学習後
loss=5.76766 accuracy=0.639953 ←約5万枚学習後
loss=1.89181 accuracy=0.881987 ←約7万枚学習後
loss=1.04564 accuracy=0.934771 ←約8万枚学習後
学習を重ねるほど収束している感じ。(この値ではまだ実用的ではないが)

これをさらに10万枚の学習データを用意したらどうなるのだろう?
ちなみにepoch=50, batchsize=100にするとこんな感じ。
loss=5.08986 accuracy=0.675893
loss=2.10695 accuracy=0.868469
loss=1.96447 accuracy=0.877266
loss=1.8032 accuracy=0.887244
これだと最終的なlossは1.8032で良くないけど、あと10万枚学習すると最終的に1.0未満になるかもしれないし、先ほどの最適な場合は発散するかもしれない。。
もう少しパラメータをいじってみて、限界を感じたらちょっと一息ついた方が良いかもしれない。

そもそもだけど、CNNでの応用は基本的に画像の中にある特定の物体の識別。今自分がやっているのは画像の「雰囲気」からCMかどうかの識別なので、ちょっと違うかもしれない。
「雰囲気」というのはかなり曖昧な表現だが、人間ならその「雰囲気」でCMかどうかは識別出来るが、CNNでは無理なのだろうか?
例えば「建もの探訪」だと渡辺篤史が出ていればnon-CMとか、オブジェクトを個別に認識すればある程度精度は上がるが、渡辺篤史が映っていなくてもnon-CMのときがある。何らかの家具が映っていればnon-CMと識別出来たとしても、家具のCMがあれば途端に識別能力が低下する可能性が高い。そもそも個別のオブジェクトの学習はさせていないのでそういう考え方ではなく、CNNは何らかの特徴を捉えて学習しているはず。だが、どれを採用しているのか解らない。それがパラメータ次第で最適になるという理屈がもしあるとしたらますます理解出来ない。。

そろそろ行き詰まり感があるので、Kaggleあたりでどういう学習済みモデルがあるのか、それを参考に改良した方が良いかもしれない。
もし個別のオブジェクトを学習してから、なんていうのが現在のAIだったら使い物にならないかもしれないなぁ。。

たぶんだけど、今のAIは面白いんだけどできることが限られていて、その限られた範囲の中で与えられた命題をどのように解決するのか、っていうのが今のAI engineerに求められるスキルではないかと思う。(シンギュラティなんていうSFちっくなものとはかけ離れているのが現実)

2019.10.4

パラメータを色々変えているけど使えるレベルにはほど遠い。
Kaggleを眺めているけど、「特徴量エンジニアリング」という奴が機械学習においてかなり重要らしい。
半年くらいかけて(真面目に)Kaggleをやってみた方がよさそう。

2019.10.7

How to Win a Data Science Competition: Learn from Top Kagglers (以下HWDSC) を始めた。上級コースだけあって一週目で早速躓いてます。

2019.10.9

TSUKUBA OCW・機械学習 も始めた。機械学習全般を網羅的・理論的に学習できる。第5回の途中まで受講したけど、ここまではほぼ復習だったので簡単。それに説明もわかりやすい。お勧めです。
(必要スキル:理系大学1〜2年程度の数学知識、特に線形代数。ここでは情報処理系三年生を対象にしているみたい)
参考になった点:
特徴量の捉え方があり、観測しやすいものを選ぶ、影響があるものを選ぶ、属性を考える。
これはまさにKaggleの基本ですね。
それと、Neural Networkは特徴量の変換も含めたものを学習する、と言っていたので、Kaggleで要求される特徴量エンジニアリングというのはNeural Networkでは必要ない?Kaggleでは限られたリソースで最良の結果を出す必要があるので、十分な学習データを必要とするNeural Network(Deep Learning)は敬遠されるのかも?
(それが正しいとすると自作AIの何に問題があるのかわからなくなる・・・)
自分が目指すのはKaggle competitionで勝つことではないので、果たしてHWDSCで学ぶことが正しいのか?と思うが、明らかに必要ないと思うまでは学習を続けてみよう。

しばらくHWDSCとTSUKUBA OCWの二本立てで学習するつもり。

HWDSCは一週目のプログラミング課題をクリアしたところ。pandasを使ったことがなかったのでちょっと厳しかった。

2019.10.11

TSUKUBA COW・機械学習は半分まで来た。線形回帰からロジスティックス回帰まで学習したけど、数式で表すと基本形は同じでどのような組み合わせでモデルを作るのか。今まで全く異なるモデルだと思ったら意外と共通点が多いと言うことが解った。
しかし、今のところSVMとかは使う予定はないかな。。線形回帰とか単純なものならわざわざ学習させてやるようなものは個人レベルではないような気がする。(ビジネスレベルならあるとは思うけど)

2045年にsingularityがやってくると言われているが、今のAIは人間がかなり手をかけて学習させないとまともなAIができないという残念なレベル。自作AIについては一体何が悪いのか解らない。何が悪いのかAIが判断出来るようになったらいよいよsingularityもあるかもしれないけど、そんなのは現時点ではSF。今のAIは人間が教えたとおりにしか動けないので、人間が賢くなるしか道はない。

自分が目指しているのは少しでも自分の肩代わりになれるものを作れたら、と思っているが、意外とそうでもないかもしれない。
ちょっと期待感が強すぎたのか?AIに頼るより、自分でプログラムを作った方が早いような気がしている今日この頃。

2019.10.13

今の流行は大量のデータを使って何とかしようという発想が強い。しかし、AIとは言えない回帰クラスのものは技術的には必要だとしても、わざわざ統計的な処理をしなくても純粋にプログラミングをすれば実現出来ることが多いような気がする。
というか、deep learningが流行ったお陰で機械学習全般が注目されたわけだけど、線形回帰なんて何十年も前から存在していたことだし、なんで今さら勉強し直さなければいけないのかと思う。
Kaggleで出されている問題は今時のdeep learningを使わなくても解ける問題が多く、一昔前、二昔前の技術を使えば解ける問題が多いような気がする。
流行に乗ってHWDSCの講座を受講したけど、知識の幅を広げることはできても、自分にとってはあまり意味が無いような気がする。
(英語の勉強という意味ではいいけど。HWDSCの講師はロシア・東欧系?なので聞きにくい)

個人的に思うのはKaggleで良いスコアを取ったところであまり役に立てる場面はあまり無いような気がする。
せいぜい言えるのは特徴量エンジニアリングと、最適な(低レベルの)モデリングの技術を身につけられるくらいだろうか。

やっぱりKaggleで勝負したいとは思わない。
(お金を払った以上は最後までやり遂げる、というモチベーションだけ)

2019.10.16

今年の6月から疑問に思っている、2回目以降のバッチ処理で極端に誤差が増える問題。
そういうものか、ということで進めていたが、実はそれだけでは無かった。
2回以上のbatch処理を行うと、誤差の値に再現性が無いと言うこと。同じ入力画像を学習やり直すたびに誤差が違う!
きっとどこかの重みがランダムに初期化されているから、と思い、
batchsize=50 → 30 に変更すると、2回どころか10回程度までは再現性がある!?しかし、15回くらいになると再現性が無くなる!?!?
自分のPCが不安定なのでそのせいかと思ったけど、別のPCでCPUで計算しても同じ。
もうさっぱりわかりません!

ちなみに24coreのXeon(ES-2630 v2 @ 2.60GHz)で計算しましたが、GPU(GTX1080)に比べると遙かに遅い。

再現性が無いと言っても、1%くらいの違いなら我慢出来るが、10倍以上違うときもある!こんなのまったく使い物にならない!
似たような人がいるかとググってみたけどいない。
となると自分のプログラムに間違いがあるのだろうか?
cifar10に戻って詳細な動作を確認するしか無いな。。

2019.10.22

再現性の問題についてはいまだ原因わからず。
CourseraのHWDSCは遅れ気味。2週目のData Leakageに来たけど、プログラミング課題で再び躓いている。
前提としているスキルが自分には無いものなのでかなり厳しい。(講義をしっかり理解できても解けない)
TSUKUBA OCWについては視聴済み。
たまたまリンクに出ていたCourseraの機械学習が無料っぽいので始めた。全部で11週間という長丁場、その1週目なのでなんとも言えないけど、HWDSCに比べるとかなり簡単なので楽ちん。ただ講師が早口でぼそぼそと言うので聞きにくい。(字幕は出るけど時々間違っているし)・・・途中で気がついたけど、この講義をすべて終了するにはMatlabかOctavegが必要なんだって!そこまでやる余裕はないので、適当なところで止めた方が良いかも。

Kaggleに手を付けてしまったため機械学習の学習を始めたけど、必要なのはそっち方面じゃないので、HWDSCをマスターするか挫折したら基本路線に戻るかな。

2019.10.29

こちらにある野良cifarをやってみたが、やはり再現性がない!?!?
何が原因なんだろうか?重みを乱数で初期化しているから?野良だからと言って間違いがあるようには見えないし。。もしかして私のPCの何かしらの不具合??
random.seed(0)
np.random.seed(0)
tf.set_random_seed(0)
をやってみたらかなり改善されたけど、微妙にlossの値が異なる。
で、調べていったら、ここにGPUを使うと同じ結果にはならないよ、と書いてある。
This is due to the randomness of the order of collecting the partial results from all threads, and this can lead to very small difference within machine accuracy at the beginning and then this tiny tiny difference gets amplified during iterations.
GPUって意外とアバウトな存在だった??
コメントがいっぱいあるので、後ほど最後まで読んでみる。

dropoutで乱数を使うのは当然として、乱数によってlossの値が大きく異なるというのは当たり前のこととして受け入れなければならないこと?それとも、乱数によって再現性が大きく異なると言うことは、まったく学習ができていないということ?学習が出来ていないというのは、何が悪い?学習データは十分あるはず、という仮定が正しいとすると異なるクラスの学習データの相関が強すぎてAIが識別出来ない?
いや〜人間はしっかりと識別出来ているんですけど・・・
となると、学習モデルが悪い?もっと深い構造にしないとダメ?
も〜さっぱりわかりません。。

2019.10.30

再現性問題。さらに調べていくと、、、
YouTubeGitHub
再現性は本質的な問題で、速度を優先にしているらしい。
しかもこの話題は比較的新しいもので、それまでは黙認されていた?
ググってもなかなか出てこなかったのは誰も気がついてないとか?ないよね〜

2019.11.14

courseraのHWDSCは時間がなくて学習できず、継続更新はキャンセル。
courseraの機械学習は(無料なので?)継続しているけど第6週目のテストではまって先に進まず。
第6週目のテストに「neural networkでpredictionはいいけど、cross validationが良くないときはtraining sampleを増やせ - それは正しい?」みたいな問題があり、まさに現在直面している問題が出題されていたけど、自分自身が困っているので正解が解らない。(講義にそんなのあったっけ?)
私が取り組んでいるAIはoverfittingしている可能性があり、理論的にはtraining sampleを増やせば良いと思っているけど、現在の感触ではそうでもなさそう。(courseraの正解が知りたい)

2019.11.15

courseraの機械学習をやっていますが、それからみるとどうやら今の私のAIはhigh varianceなのかもしれない。
いわゆるoverfitting状態だと言うことになるけど、学習データを増やせば良いのだろうか?
でも十分だと思うんだけどなぁ。。
自分がやろうとしていることは難しい問題なのだろうか?それとも自分の初歩的なミスなのだろうか?それがさっぱりわからない。

2019.11.26

自前のCNNは6層あるのですが、それを4層に減らしたら損失がかなり減った。(と言っても0.2程度)
これ以上の向上は難しいので、やはり学習データを増やしてみようかと思う。
実用レベルになるには損失が0.1未満だと思っている。

2019.11.27

ハイパーパラメータ調整をやっているところですが、入力画像の解像度を32x32から112x112に増やしたらとんでもなく損失が増えてしまった。。
MNISTのような単純な数字認識だったらその程度がちょうど良いかもしれないけど、CM判定だと32x32は人間でもちょっと難しくなる?
とはいえ、112x112だとかなりの情報量のはずなので、学習データを増やさないといけないはず。
このあたりの最適化をしないといけないのかもしれない。
CNNは何を学習しているのか解らないから調整が必要なんだよね。。

2019.11.30

色んな書籍などで学習してきてだいたいAI関連のことがわかってきたけど、現在自分がやろうとしていることはググっても出てこない。
やろうとしていることは単純で映像データからCM判定というもの。
マニアな人はアニメを録画してCMをカットした映像を残したい、という需要は強烈にあると思うんだけど、AI分野でやっている人は今のところ見かけない。なぜだろう?そういうアプリがないから?すでに確立している?
AIをやっている人は世界中にかなり多いはずなので、その中でマイナーな存在だというのは嬉しい。

2019.12.1

「人工知能」をキーワードにテレビの録画予約をしているのでそれに関連する一般的なニュースなどが色々と入ってくるのですが、たいていは知っているものばかり、せいぜい松尾豊先生が出てくる番組はちょっと面白いくらい。その中で最近衝撃的だったのが、「ゑびや」という飲食店業(?)の会社が独自にAIを活用して業務効率を大幅に改善した、という話。
素人同然の社員にAIを勉強させて2年もかからず結果を出せたと。その番組内では高専の学生が2週間で有用なAIを作り上げたとか。
本当の専門家から見たらクオリティの差があるかもしれませんが、素人が自前でできてしまう、それくらいAIは普及が進み、一般的な技術になりつつあるんだと感じた。実際、Kerasとか使えばモデルの作成と簡単な検証はできるし、重要になるのはデータ。データさえ的確に処理出来れば、誰でも使える技術になっていると思う。
自分は理論的なところから学んだけどそんなことはあとでもいいと思う。
「こういうデータがあったら何ができるか、何をしたいのか」が明確になればそれほど難しくないと思う。
別に理系大学を出なくても、プログラマーでなくても、英語がわからなくても、目的がシンプルであれば誰でもできそうな気がする。

適当な引用が見つかりませんが、例えばこんな感じ

で、ここのHPの目的にも書いているとおり、AI技術を職業にする、とかビジネスにする、というつもりはまったくないのでどうでもいいことなのですが、特定の分野ではそこまで浸透しているというのは衝撃的でした。

2019.12.6

現在受講中のクラスはこれ。courseraのImproving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
受講と言ってもプログラミング課題はすっ飛ばし、講義もながら聴き。(この先生の発音は聞きにくいので字幕を見ないとほとんど理解出来ないのですが。しかも字も汚い)
だいたい理解出来ているはずなのですが、テストを受けると意外と自分の理解が曖昧だったと言うことが解る。(それが狙い)
2週目のテストを受けてみたら30%!!(合格は80%)
三度目で100%になったのでギリ合格という感じですが、自分の理解度の低さを実感。
これは有料だと思うので1週間の無料期間内に辞退して、手持ちの教材でしっかりと学習しようかと思う。
学生と違って時間が取れないのが難点。

courseraの機械学習も7週目まで到達しましたが、SVMとか今自分が目指している方向とは違ってきたので一時休止状態。(無料だから放置?)

機械学習全般はほんわかとわかってきたので、あとは時間をかけてじっくりやればマスターレベルになると思うけど、とにかく時間が取れない。

ただ、こういう講義を聴いて良かったのは、確実にこの分野の英語力が上がっていること。自分は海外の大学等に行ったことがないので専門英語の連発にやや抵抗があったけど、何度もやっていると慣れてくるもんだね。

2019.12.9

AI用のPCの電源FANから突然異音が。グリルと接触しているようだ。
たぶん10年近くも使っていたからFANにガタが来たのだろう。

ハイパーパラメータを調整して試行錯誤が続いていますが、どんなに頑張ってもlossが0.4程度。
DLの書籍を読みながら色々と考えていたら閃いた。学習するデータの順番に関係あるんじゃないだろうか?
データを先頭から順番に学習させると、同じラベルが長く続く。これがいけないのでは?
そこでデータをランダムに並び替えたところなんか良さそう。(AIはランダムがお好き?)
これからcross validationして検証する。

2019.12.10

データをランダムに並び替えたら確かに良くなった。が、0.40→0.39の改善しか無かった。
検証データによっては0.8になったりするのがあり、それが足を引っ張っている。やはり学習データが少ないのだろうか?
まだ現時点でやっていないことは、
・batch normalization
・epochを100以上
・学習率
・正則化
検証誤差が0.8にもなるということは、epochや学習率はたぶん関係ないだろう。

AIはパラメータや方法がたくさんあり、しかも結果を出すまでに結構時間がかかるので手間がかかる。
(GPUを使わなかったら途方もない時間がかかっていた)
AI用のPCがあと2〜3台欲しい。GCPとかでやったほうがいいかなぁ
初めてのことなので、色々といじって実験するしかない。

しかし、仕事でやっている人はどうしているのだろうか。。一人数台のPCでやってるのかなぁ?羨ましい

2019.12.11

batch normalizationを仕込んでみたけど、何故かエラーになってしまう。
これは一旦諦め、正則化をやってみる。

それと、epochは(お試し期間中は)10回でも十分かもしれない。進行状況を見ていると最初の数回でacc=0.99、loss=0.01程度になるので、比較評価の時はepoch=10で十分かも。(それとも学習率が高すぎるのか、hidden layerが少ないのか、でもその程度でaccuracyが高いのはoverfitなのか??)
しかし、やはりoverfittingしているような気がする。そうなると正則化が有効かもしれない。(それがダメだと一体どうすれば??学習データを増やす以外にない)

今日は気温が高いので、暖房機となっているAIマシンの暖房が効きすぎる。

2019.12.12

正則化も効果なし、epochを100にしても悪くなる。(overfitting?)
逆にepoch=10だとloss=0.30という過去最高点が出た。
学習率はまだやっていないけど、関係ないだろう。。

ということで残るは学習データを増やすしかない。(現在実行中)

それと平行して、久しぶりに予測処理をやってみた。
多少誤認識があるものの、そこそこ優秀な結果になっている。
「ここは間違いなく100%CMだ!」と主張しているところはその通りになっています。
ただ、学習データをテストデータとして使っているので思いっきり怪しいのですが・・・
(逆に学習データで予測しても100%できないのか!と叱責したいところですが・・・弟子を持つ師匠の気分?)

多少のブレはあるものの、これに条件を追加すれば実用的なレベルになるのではないかと。
例えば、15秒未満のCMはない、30分番組でCMとnon-CMが入れ替わるのは10回未満、など。
(ただ、15秒未満はない、とすると14秒であっても本当はCMだったというのもあるので、その当たりの調整は必要)
この当たりのロジックを作り込むのと、学習データを増やしてどういう傾向が出るのかの確認作業を進めてみる。

2019.12.13

学習データを増やしたらかなり改善され、loss=0.14なんていう数値になった!
これくらいになれば、あとはさらなる学習データと微調整でほぼ実用的なレベルになるはず!?

まだわからないのは、CMとnon-CMの境界でばたつくことがある。実は自動化の上で一番大事なのはここ。
大雑把なところは技術で逃げられるけど、境界で迷いがあるとロジックでは対応が難しい(はず)
CMとnon-CMは人間から見ると明らかに違うはずなのに、なぜバタつくことがあるのか理解できない。
逆にそれ以外の部分はほぼ安定している。ということは、non-CMの映像が続いていてもCM映像かもしれない、という迷いがほとんど無い。それだけ自信があるのになぜ境界で迷うのか?動画では無く静止画として学習させているので、境界付近かどうかはAIは知らないはず。(境界付近にCM-nonCMの微妙な映像があるというのなら別だがそれはまったくない)
ただ今回は学習映像を順番に学習させているので、もしCNNには学習順序まで学習する能力があるとしたら、やはり学習データはランダムに並び替えた方が良いかもしれない。(これはどこかで実証されている?)

余談:張本智和と世界一位の許マとの試合は凄かった〜(卓球) 張本のレベルがまた一段と上がった感じ。それに対して許マは第4ゲームから押されていた。彼はやはり16歳の怪物だ。

2019.12.14

現在の誤差は0.14ほどで(accuracy=0.987)、実際に予測させてみるとどうなるのか。

だいたいうまくいっていることがわかる。(もちろん、学習に使っていないデータでの予測結果)
CMの部分はほぼ完璧に「これはCMだ!」と判断しているが、実際の番組内容では毎回異なるので迷いが多い。
しかし、知りたいのは「だいたいの変化点」では無く、正確な変化点。
(継続している中での)数フレーム程度の誤認識であれば明らかな誤認識として除外できるが、変化点の付近でそれを繰り返すと自動的に判断ができない。
となるとその部分は手作業で調整する必要があるが、だったらAIなど使わず最初から手作業でやった方が早い。

もう少しパラメータ調整と学習データ増強をやってみるけど、これ以上大きな改善が見込めなければこのプロジェクトは終了。

最終的な結果ではないにしろ、現在のAIがこの程度だとすると、人間の考え・行動を入力とした場合、その出力が使えるのは最終的に人間になるのかなと。それは当然のことなんだけど、ある程度の曖昧さが許せるものにしか使えないのかなと。(自分が求めるものとは違う)

ただ面白いのは、入力データの画素数が56x56だということ。現在の地デジは1920x1080(だったっけ?)の画素数があり、CMかどうかの判断にそこまでいらないとしても、56x56というかなり粗い画像であってもAIは判断できる。もちろんそれより大きな112x112とかそれ以上もやってみたが、誤差はほとんど変わらない。56x56の映像なんて人間から見ると逆にCMかどうかの判断が難しくなるのにAIは逆なんだよね。。そのあたりにCNNの改善のヒントがあったりするのだろうか?56x56という低解像度でAIは何を学習しているのだろうか?
建もの探訪に限れば右上の字幕だけ使えばほぼ100%の判断はできるのだが、CNNにそれを認識させることはできるのだろうか?
一旦終わりにするとは言え、まだまだ疑問点がたくさんあるような気がする。

2019.12.17

CNNはできるところまではやったので、次はRNN。
RNNで何をやるかと言ったら相場予測(笑)
アイデアは色々とあるのだけど、普通にLSTMを使ってどういう結果になるのかやってみる。
ネット上にも「やってみた」系の記事はあるのだけど、自分が持っているイメージとちょっと違うので自分でやってみたい。
相場予測がRNNでできるのなら、天気予報も同様にできるはず、なのでこれもやってみたい。
(気象予報士レベルの知識はあるのでそれは無理、というのは知っているけど)

2019.12.18

やってみた系の中でもまともだったのは、@ITのこの記事
入力データが差分値の対数というのは確かに良いかもしれない。
それと、1日後の予測というのはあまり実用的ではないので、5営業日後まで考慮している点は当然のところではないかと思う。
→しかしエラーで止まる??

こんな時が来るだろうと思い、私自身が溜め込んだ相場情報が5年間ほど、1分足と1時間足がある。
このデータとありきたりのAIを使ってしばらくどんなものか見てみようかと思う。
相場予測はそもそも過去の値動きデータだけでできるものではないので、AIとしては(データ量と言うより)特徴量不足なので、実用的なものは無理だと思う。(プロで相場予測AIをやっている人は色んな材料を集めて評価していることだと思う)

当面の予定:
・今週末にでもLSTMを使った予測システムを作ってみる
・さらには時々刻々と学習&予測するシステム
・色んなパラメータで複数の出力
・そして、これらからアンサンブルできそうなものはどれか?

と言ったところを見てみたいと思う。
これでどんなものか見えてきたら、その次は心理的な要素も加えようかと思う。
相場の動きは大衆心理によるものが大きいので、特徴量としては有効だと思う。

それでも限界が見えてきたら、CNNを相場予測に追加してみようかと思う。なぜなら多くの投資家はチャートを見てトレードしているから。RNN系よりこちらのほうが有効ではないかという気がするけど、実際はどうだろうか。。

それでも限界が見えてきたら・・・そのときに考える。
同じようなことを考えている人は世界中にたくさんいる気がするし、やり尽くして卒業した人もいそうだなぁ

そしたらKaggleのコンペで賞金稼ぎ?

2019.12.29

前回にあった株価予測が動くようになった!(原因はデータが正しくなかった - データとコードを両方修正)
しかしまだ疑問点があり、
・GPUを使っていない?(CPUコア数の多い方が速い)

また、正答率をみると非常に低い = 0.3
準正答率も0.5
これだと予測不可能ということだ。

オリジナルのコードを見ると、気になるところがある。
len_seq = x_data.shape[0] - maxlen + 1 # +1はいらないんじゃ?
data = []
target = []
for i in range(0, len_seq):
  data.append(x_data[i:i+maxlen, :])
  target.append(t_data[i+maxlen-1, :]) # ←indexがover
ここで、
x_data.shape[0] > t_data.shape[0]
だと思っているのだが、それを前提にすると t_data[i+maxlen-1, :] でindexがoverしてしまう。
筆者が使用しているデータが不明なため、データの作り方に工夫が必要なのかもしれないが、筆者のコード化データに何か間違いがあるのでは無いかと勘ぐってしまう。

2019.12.31

パラメータを見直していたところ、対数値に変換する際、記事では100倍だったが自分のところでは10,000倍にしていた。それを100倍にしたところ、なんと、
正答率:0.53
準正答率:0.53
と良い値になった。(正答率=準正答率なので、まだ怪しいが)

予測結果を見たら、すべて -1% < r < 0% だった。なんだかな〜
もう少し詳しく見ると、
-1% < r < 0% : 0.5台
0% < r < 1% : 0.4台
平均値の付近をずっと出し続けているだけで、これだったらAIなど使わなくても出せるレベル。


連絡先: