オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

ジロ・デ・イタリアはミラノに到達するのか?

 ジロ・デ・イタリアが少しヤバい感じになってきましたね. 既に,Jumbo VismaとMitchelton-Scottがレースから撤退しました. チーム内にCOVID-19の感染者が出た為です. チーム全体は撤退していませんが,Team Sunwebからも感染者が確認されています*1

 先日,EF Education Pro Cyclingがレース主催者に向けてレースの中止を訴えました*2. Lotto SoudalのTomas De Gendt選手も,レースを続けるのが怖いと発言しています*3. 「咳をしている選手がいる.家族を感染させてしまうかも知れない」と. 骨折をしても走り続ける選手達が,自らレースを去りたいと発言するのは極めて稀だと言えます.

 J Sportsのレース中継が無いので何とも言えませんが,観客の規制などはちゃんと行われているのでしょう. ツール・ド・フランスの成功を待って,開催している訳ですから. ツールも山岳ステージでは結構ヒヤヒヤしましたが,直前のドーフィネに比べれば*4,観客のマナーが向上したと感じました. それでも,あれだけの人込みの中でレースをして,選手の中に感染者が出なかったのは奇跡のような気がします. 出来過ぎの事例だったのでしょう.

 目下のところ,レースをするかしないかは選手側の判断に委ねられている様です. 英国が警戒レベルを引き上げた*5りしている中で,家に帰れなくなってしまう選手もいるでしょう. レースを去るという判断をする選手が出てくるかも知れません.

 上述したDe Gendt選手の発言から,一定数の選手が,レースよりも自身や家族の健康の方が大切だと考えている様です. ただ,全ての選手がそうでは無いのでしょう. 実際,レースが続けられているわけなので. 来季の契約が得られてなかったり,所得の低い選手ほど,レースをしないことが死活になります. その変の不公平さというか,空気間の差の様なものが,プロトンの中にも存在するのかも知れません.

 日本の外出規制期間中にも,Amazonの配達員やコンビニの店員は体を張って働いてくれていました. 僕の在宅勤務が成り立ったのは,彼らの存在があったからです. 彼らを弱者と呼ぶと逆に非礼になると思いますが,複雑な心境を抱えていらっしゃったと想像します. 海外のニュースが,「日本のサラリーマンは仕事狂いだから,(当時の)安倍首相が止めろと言わない限り,満員電車に取り続ける」と揶揄していました.

 どうすれば良いのかは,正直,判らないです. 勤め先が在宅勤務を禁止してしまったので,今は会社に通っています. バスに乗るのが怖いので,雨が降らない日は自転車で通勤しています. 強制されている感はありますが,大きくは無いです. 「リスクを負って外に出るくらいなら,会社を辞める」という程の,,,真剣度?,が僕には無いですね. 台風が近づいている時などにも騒がない質なんですが,それと同じ感覚です. テレビの言う事に一喜一憂するのは馬鹿々々しいです. 勿論,パンデミックの度合いに寄ると思います. でも,それで良いと思っています.

 選手とは全く立場が違いますが,僕も今シーズンのレースを走ることに決めました. 既に3戦して*6*7,明日も川崎マリンエンデューロを走ります. そうすることが自分にとって自然だからだと思います. 独身だから,というのも単純にあります. 勿論,僕がレースに出ることで,経済効果を遥かに超える程に他者を傷付けてしまうと感じたら,止めます. Zwiftでもレースは出来ますから.

 書き始めておいて何ですが,プロの世界で行われていることついて物言いすることはやはり出来ないです. 考えあぐねるだけでした. 言えることは,選手やチームの関係者,そのご家族の安全が守られて欲しいということだけです. レース主催者の冷静かつ人間味のある判断に期待するしかありません.

C code + CPU is the best choice for Tensorflow inference in general purpose Windows

This article is a translation of Japanese ver.
Original ver. is here*1.

 Hi, this is chang.

 Today, I wrote my personal opinion about how to implement Tensorflow for inference into general purpose Windows computers. To be honest, I wanted to say "general purpose OS". It's shame but I have no experience to develop for Andoroid and iOS. Thus, today's mention applies only for Windows.

0. Background knowledge

 It is common to use Python for developing deep learning, especially for its learning phase. It is because the libraries like Tensorflow or Chainer are published for Python.

 I introduced before that you could use both Python and C code to implement network trained with Linux into Windows computers*2*3*4. If you can set up the same developing environment in Linux, using Python is easier way to write inference. Today's topic is that C code is better if you have some more time for coding.

1. Python or C code

 Python's programing is easy compared to C code. You can reduce the length of source code by using useful libraries like numpy.

 This is good for researchers. Fact, I used script languages like Matlab when I was in University. Python was used in research...more libraries were published...it was used in research more and more... I think the culture "deep learning is written in Python" was established like this.

 By the way, Python is not always useful for software users because:

(1) it's requires complex and technical installation
(2) compatibility with libraries are so naive that long-term stability is difficult
(3) operations like commands are technical
(4) GUI is poor
(5) processing is not fast

 If a computer language is not user friendly, the language is also not friendly for software suppliers. I picked the difficulties of Python as one of software developers:

(A) Difficult to make installer

 It is related to (1) and (2) above. If you are a developer, I guess you can use commands of pip and install the environment via internet. But, for most of software users, it is common that what they have to do to use software is to double-click an installer. Younger people of smartphone era are not possible to know the word "installer." I think it is impossible to let users install Python using commands even if you ease the installation with requirements.txt.

 You can make an installer like Anaconda. Fact, the release of Anaconda I think increased the programmers of Python. Here, let us think about the conflicts with other software.

(B) Conflict with other software

 In general purpose OS, not only one developer's software but also other developer's software are installed. They can use Python. It is highly possible that an installer from others will change the version of Python or libraries and in the result the developer's software cannot work.

 If you develop software for general purpose OS, you have to make an installer that can set up all the resources for operating your software. In addition, the resources from your installer must not be used from others. The exception is .Net framework. But, it's the platform that is provided from Microsoft, the supplier of operation system. I don't think that Python, open source, will be the general platform like .Net framework. I have no intention to use Python as background environment of my software.

(C) Difficult to create GUI

 It is related to (3) and (4) above. If you use kivy etc., you can create GPU app using Python. But it is not good for complex app. I guess in many cases it is hard to develop the whole part of your software only with Python. I mean you have to operate Python from C or C#. It is possible but a little complicated.

(D) Difficult to speed up

 Python is a interpreter type language, so it's processing is not fast. It is a little weird that the language used in state-of-art researches is slow, but actually I sometimes use C code for accelerating heavy processing like image loading*5.

 In my personal view, the speed that researches deal with is not absolute value for uses but relative value to other researches. You can see the phrase like "our research is faster than other researches" in academic papers. In addition, many researches use the high spec GPU of millions yen.

 I heard that researchers in Tokyo University still use FORTRAN. Researches are always run outside user's perspective.

In short...

 Python is not a language designed for users. On the other hand, inference with C code (and tensorflow.dll), I previously introduced*6, can solve the problems abobe. I think this is the only choice.

2. GPU or CPU

 GPU is necessary for learning of neural network. I often have troubles for establishing the developing environment*7. In many cases, the problem is about the drivers of NVIDIA. There is strict compatibilities among deep learning libraries (tensorflow), NVIDIA libraries(CUDA and cudnn), and NVIDIA driver. I have some experiences like my environment suddenly do not work after no-intentional update.

 Window's update is possible to automatically update NVIDIA drivers. Furthermore, users can update drivers or libraries manually to use GPU in other software.

 When the GPU environment is broken, I guess it is very hard to let users rebuild it. It doesn't make a fool of users. Sometimes, it takes me a whole day to recover a broken environment. Imagine that your app is used in the production line and it suddenly stop... You sweat with fear, don't you?

 I wrote that the inference time with CPU and C code for U-Net (256 x 256) was about 500 ms*8. I think it is well for many cases.

 If it is required to speed up inference, you have to let users not use GPU in other software. It means that your app occupy the computer.

3. Inference using embedded or cloud platform

 Although it is self-denial,,, but I can say that it is inappropriate to implement inference in general purpose Window computers. Embedded computers like Rasberry PI as a dedicated resource is more suitable.

 It is also good to use cloud like Google Cloud Platform. Assuming that Google has a strategy to operate large-scale data analysis in cloud, it is natural that environment or information for inference in Windows is poor.

4. Afterwork

 I feel the future that enforces the use of Python in inference(=users' side). Today's article is a personal warning against it. I will investigate for Andoroid and iOS.

汎用WindowsマシンでのTensorflow推論は,C言語 + CPUの一択

 こんにちは.changです.

 今回は,汎用のWindowsマシンにTensorflowの推論を実装する方法についての自論を書きます. 本当は汎用OSとしたいのですが,情けないことにAndoroidやiOSでソースを書いたことがありません(汗). ですので,今回はWindows限定です.

 結論から言うと,C言語 + CPUの一択です.

0. 予備知識

 ディープ・ラーニング開発,特にその学習フェーズには,Pythonを用いるのが一般的です. TensorflowやChainerなどのライブラリがPython用になっている為です.

 以前に,Linuxで作った学習済みネットワークをWindowsで使う場合,Pythonを使った方法とC言語を使う方法があることを紹介しました*1*2*3Linux側と同じ開発環境をWindows上に構築できるならば,推論にもPythonを使う方が簡単です. 敢えて手間をかけてでもC言語で推論するべき,というのが今日の主題です.

1. Python or C言語

 Pythonは,C言語と比較するとかなり簡単に書くことが出来ます. numpy等のライブラリが豊富で,ソースが短くて済みます.

 この事は研究者にとって都合が良いです. 僕自身も,大学で研究していた頃にはMatlab等のスクリプト言語を使っていました. 研究者に受け入れられる→Pythonライブラリが公開される→更に多くの研究者に受け入れられる...という仕方で,「ディープ・ラーニングはPythonで書く」文化が定着したと思います.

 ところが,Pythonはソフトウェアを使うユーザ側の立場からすると,必ずしも便利ではありません. 理由には下記が挙げられます.

(1) インストール方法が専門的
(2) ライブラリとの互換性がシビアで,永続的に安定動作させるのが難しい
(3) コマンド実行などの操作が専門的
(4) GUIが陳腐
(5) 動作が遅い

 ユーザーフレンドリーで無いという事は,ユーザにソフトウェアを提供する側にとってもフレンドリーでは無いという事です. ソフトウェア提供者の端くれとして,Pythonの使い難さを挙げてみます.

(A) インストーラが作り難い

 上記の(1)(2)に関わる問題です. 開発者であれば,コマンド操作でpip等を使い,Web経由でインストールすれば良いです. 一方,ソフトウェアユーザにとって,ソフトはインストーラを叩くだけで使える様になるのが当たりです. スマホ世代の若者には,「インストーラ」という概念すら無いでしょう. コマンド操作でのインストールは非常にハードルが高いと感じます(requirements.txtなどを使ってインストールを簡素化したとしても).

 Anacondaみたいな汎用インストーラを作る手も考えられます. 実際,Anacondaの登場がPythonを身近にさせたと感じます. ただ,問題になり得るのが,次項の他ソフトとの干渉です.

(B) 他ソフトとの干渉

 汎用OSでは,自身が提供したソフトウェアだけではなく,他者が作ったソフトウェアも動いています. その中には,Pythonを使うソフトだってあるでしょう. 他者のインストーラPythonやライブラリのver.を変えてしまった結果,自身のアプリが動かなくなる可能性は大いにあります. その逆も然りです.

 汎用OSで動かすソフトウェアでは,自身のアプリを動かすための資源を全て自分のインストーラからセットアップでき,かつその資源が他で使われないことが鉄則です. .Net frameworkなどはその例外になりますが,これはOSを提供するMicrosoftが半ば使用を義務付けているものです. オープンソースであるPythonが,.Net frameworkの様な共有プラットフォームになるとは考え難いです. 個人的には,自身のアプリのバックグラウンドでPythonを使うことはあり得ないと思っています.

(C) GUIが作り難い

 上記の(3)(4)に関わる問題です. kivyなどを使えば,PythonでもGPUアプリを作る事は出来ます. ですが,複雑なアプリを作るのには向きません. アプリの全体を,Python + kivyだけで作ることが難しいケースが多いでしょう. C言語C#から,Pythonを操作することになります. 出来なくは無いんですが,,,面倒です.

(D) 高速化するのが大変

 最先端の研究で使われている言語が遅いというのは,違和感があるんですが... 実際,先日紹介した恐竜の種類判定でも画像の読み込み部分にはC言語を使いました*4

 私見ですが,研究で問われるのはユーザ目線に立った速度では無く,他の研究に対する相対値です. 「誰々の論文より,何秒速くなった」という考え方ですね. また,数百万のGPU環境を惜しみなく使ったりもしていると思います.

 東大の研究者が未だにFortranを書いているという話を聞いたことがあります. 研究と言うのは,使用者の目線から外れたところで展開されるのが常ですね.

要するに...

 パイソンはユーザを想定した言語では無いのです. 一方,以前に紹介したC言語での推論*5であれば,tensorflow.dllを自身のインストーラから入れることで上述してきた問題を解決できます. これ一択では無いでしょうか.

2. GPU or CPU

 Tensorflowの学習にはGPUが必須です. 開発環境の構築にはしばしば苦戦しますが*6,その殆どがNVIDIAのドライバ関係です. 使用するライブラリ(例えば,Tensorflow)と,NVIDIAのライブラリ,NVIDIAのドライバのver.互換がシビアであり,不意のアップデートで環境が動かなくなることがよくあります.

 Windowsアップデートで,NVIDIAドライバが勝手に更新される可能性があります. また,ユーザの操作でドライバやライブラリが更新されることも多いでしょう. GPUソースは他者のソフトウェアから使用される可能性が非常に高いからです.

 動かなくなったとき,ユーザ自身が環境を再セットアップするのは非常に困難でしょう. ユーザを馬鹿にする訳ではありません. 僕自身も,壊れた環境を復旧するのに丸一日かかったりします. もし,自分の作ったアプリが生産ラインの中で使われていて,それが動かなくなったら...と考えると,青ざめてしまいます.

 以前の記事で,CPU( + C言語)を使ったU-Net(画像サイズ256×256)の推論が500 ms位と書きました*7. 使える用途は多いのではないでしょうか.

 もし,もっと速く推論を動かす必要があるなら,自身のアプリからしGPUを使わない様な運用をユーザにお願いするしか無いでしょう. 専用パソコンになっちゃいますね(汗).

3. 組み込みやクラウドへの実装

 ここに来て全否定ですが,汎用Windowsに推論を実装するのは適切では無いと言えるでしょう. ラズベリーパイなどを専用基盤として使うのが無難だと思います.

 Google Cloud Platformなどを使って,クラウド上に専用スペースを作るのも良いと思います. 大規模なデータ解析はクラウド上で行うのが当たり前になるという意味では,推論側の環境や情報が陳腐なのも納得かもですね.

4. 結び

 推論側にもPythonをゴリ押しする風潮を感じたので,書いてみました. その方向に行くのでしょうね... パソコンの中にPythonが沢山入っている様な時代が来るかもです. 今度,AndoroidやiOSについても調べてみようと思います.

箱根ヒルクライム 年代別23位(48分48秒)

 箱根ヒルクライムに参加しました. 結果は48分48秒で年代別23位. 悪くはないんですが,,,手放しでは喜べない感じだなぁ^_~)

f:id:changlikesdesktop:20201005193147p:plain:w400
スタート前の大観山にて

0. またも雨のレースか???

 車で会場に向かう途中,軽い雨が降り始めました. 数日前の天気予報では全く雨の気配が無かったので安心していたのですが...予報は変わっていた様です. 下山用に防水のウィンドブレーカーは持っていましたが,本格的な雨対策はしていません. 若干の不安を感じながら,会場に向かいます.

 ゴール地点の大観山に無事に着くものの,やはり雨が降っています. 一時,本降りになりました. チェーンを濡らしたくないので,バイクを車から降ろさずに待機しました. 「空が明るいので止むだろう」と自分に言い聞かせて,耐えました.

 幸いなことに,下山時刻に余裕を残して雨は止みます. アップがてらで駐車ポイント-大観山展望台間を2往復して,下山列に並びました.

1. レース展開

 一巡目で下山した関係で,最前列からのスタートになりました. 例年と違ってゲストが喋るでも無く,ドローンが飛ぶでも無くで,粛々とスタートを待つ感じでした. この辺はコロナ渦の影響があったのかもですね.

 スタート後は去年*1と同様に淡々と5倍を刻む展開に. 食らいついて行きたかったんですが,無理をすれば去年の二の舞です. 5分を過ぎた位でマイペースに切り替えました.

 勾配がきつくてドラフティングは利きませんが,一人になると気持ちが折れます. 加えて,後半の下りセクションで不利になります. 周りを見て,所々で協調しながら登りました.

 サイコンの操作をミスってスタートからの走行距離が分からかったのですが,3回目の出場でコースも知っているので怖さは無かったです. パワーも出ていたので「去年よりも遅いことは無かろう」と,リラックスして走れました.

 下り区間には同じ30代クラスの選手1名と突入しました. 途中,前でスタートしていた20代の選手も加わります. 先頭交代をしてガンガン加速するという感じでは無かったものの,少し脚を休めることができました.

 ゴールスプリントでまくられて着順は一つ落ちましたが,グロスタイムでは上回っていた様です. 結果は48分48秒. 昨年から丁度1分速くなりました. 順位は20位から23位に落ちたので,周りのレベルが高かったのですね. 実力通りの結果だったと思います.

2. パワー分析

一昨年 昨年 今年
タイム 54分41秒 49分42秒 48分48秒
順位 39位 20位 23位
平均速度 14.5 kph 16.2 kph 16.3 kph
平均パワー 198 W 223 W 233 W
パワーウェイトレシオ 3.9 4.3 4.5
平均ペダリング効率 - 55.0 % 56.8 %

 着々とステップアップしているんですが,,,やはり先頭集団はハイレベルですね(汗). トップ10入りするには,5倍が必須という感じです. 何とか30代のうちに成し遂げたいなぁ...

 嬉しかったのが,去年と比較してペダリング効率が改善したことです. 昨年の冬から始めたオフロードの成果が出たのかも(^^). コロナ渦でローラーばかりやっていたのが,怪我の巧妙になった可能性もありますね.

3. 結び

 今年最初で今年最後のヒルクライムレースになるでしょう. 今年はもうレースが無いと思っていたので,参加できて良かったです. イベント会社のスタッフの方々,外出規制中に自粛を貫いた自転車乗りの方々に感謝です.

 次は10/18に川崎マリンエンデューロを走ります.

Dig data does not make AI smarter

This article is a translation of Japanese ver.
日本語版はこちら*1

 Hi, this is chang.

 Today, I introduce my personal opinion about AI: Learning big data does not make AI smarter.

f:id:changlikesdesktop:20200918132205p:plain:w300

0. What is Big data?

 Wikipedia shows that "big data is a field that treats ways to analyze, systematically extract information from, or otherwise deal with data sets that are too large or complex to be dealt with by traditional data-processing application software*2." I guess it was about 10 years ago when people started to use the word.

 If the size of data is huge, it is difficult to understand its whole contents. For example, I heard that there are 129,864,880 of the books in the world*3. No one can read all of them. About 400 years ago, Rene Descartes already said: "No one can understand all the knowledge exiting in the world. Only god can do that." Sorry for my poor translation.

 In view of books, paper was the first innovative technology for realizing big data. Human memory often become vague or vanish in a long run. On the other hand, the information recorded on paper remains the same. For the last several decades, hard disc and internet were newly invented. They made the size of information bigger and bigger.

 The ability of human brain is limited. The huge information of which the size is always far beyond the human ability exists in real. I think it cause some kinds of fear. In fact, I feel it is difficult to follow the new words and concepts generated in daily life. When I read the newspaper, I check the overviews like "Oh, cloud is awesome!" but in many case I do not try to understand deeply. I feel the endless. I just became old..? Also in the society, many people, especially the young, make use of internet search rather than study with books.

 That's because AI attracts people's attentions. When they try to judge something, it is difficult to check all the related information and find the neutral answer. So the help of AI is required.

1. Data set: image of dinosaur

 I picked Google's image search as the example of big data. Dinosaurs, that is my favorite creature, is today's material. I developed the deep learning for judging the type of dinosaurs.

 I gathered images with the following keywords:

  • tyrannosaurus
  • triceratops
  • brachiosaurus
  • stegosaurus
  • iguanodon
  • ornithomimus
  • pteranodon

 The below is the part of the images. I pixelated the images to avoid copyright issues.

f:id:changlikesdesktop:20200918100129p:plain:w600
Dinosaur image:
Academic illustrations are most, but skeleton photographs, stuffed toys, CD jackets etc. are also included.

2. Learning

 From each type of dinosaur images, 50 images were randomly selected as test data. Next, 100 images were randomly selected from the remaining 400 images for learning data. The number of training images was 700 (100x7), and that of the test images was 350 (50x7).

 The network structure was almost the same to mnist samples. It took a long to read images because of the number and bytes of RGB images. So I used c language to load images.

 The inference accuracy is shown:

Type Accuracy[%]
Tyrannosaurus 32.0
Triceratops 24.0
brachiosaurus 40.0
stegosaurus 32.0
iguanodon 32.0
ornithomimus 16.0
pteranodon 10.0

 The average of the 7 types was 26.7%.

 The cause of the poor accuracy is clear. Looking at the learning transition, there is a typical overfitting: the accuracy increased for the learning data but not for the test data.

f:id:changlikesdesktop:20200918100944p:plain:w300
Learning transition:
The accuracy increased for training data, but not for test data.

3. Improvement A: Increasing data

 In order to improve the inference accuracy, I tried to increase the number of learning data. 200 more images had been added to the learning data. The number of learning images was 2100 (300 x 7).

 I showed the accuracy obtained using the enlarged training data and the same source codes.

Type Accuracy[%]
Tyrannosaurus 48.0
Triceratops 28.0
brachiosaurus 34.0
stegosaurus 42.0
iguanodon 32.0
ornithomimus 28.0
pteranodon 10.0

 The accuracy was 31.7% and did not change much.

 The overfitting was observed in the learning transition as well as paragraph 2.

f:id:changlikesdesktop:20200918101641p:plain:w400
Learning transition:
Even if the training data was increased, the accuracy for the test data was not improved.

 Due to the nature of statistics, if the population contains variation, sample contains the same variation no matter from where it is extracted. If you increase the number of images from 100 to 300, the variation does not decrease. Therefore, increasing training data does not necessarily improve the accuracy of deep learning.

f:id:changlikesdesktop:20200918114746p:plain:w300
Image of picking a certain sample from the population
It contains the same variation no matter from where it is extracted.

4. Improvement B: Reduce the variation of image

 The result of paragraph 3 shows that t is necessary to reduce the variation of learning data to improve the accuracy. It's hard to check hundreds of images one by one. So, today I used some techniques.

 Google's image search finds images that are well-known and frequently viewed at the top of the search. Please looking at the images along the ranking. You can see that many academic images are at the top and minor images like stuffed toys are at the bottom. Therefore, I tried to use the top 50 images as test data and the following 300 images as learning data. This makes it possible to minimize the variation in the test data.

 This is the obtained accuracy with the reconfigured test data.

Type Accuracy[%]
Tyrannosaurus 38.0
Triceratops 34.0
brachiosaurus 60.0
stegosaurus 68.0
iguanodon 28.0
ornithomimus 46.0
pteranodon 32.0

 The accuracy was improved to 43.7%. I think it is a good value considering it was obtained from raw images of Google's image search.

f:id:changlikesdesktop:20200918162314p:plain:w300
Learning transition
Overfitting was reduced a little

5. Consideration

(1) Characteristics of big data

 First of all, I would like to say that the deep learning I wrote today took a quite rough approach. Images have so much variation, for example, face photographs, full-body photographs, and group photographs. There are also variations in shooting angles. In general, it is in appropriate to learn them together. A good example is the classification of persons. As introduced in many cases*4*5, first the face part is extracted from the image and then classified. In other words, they use the two types of AI. In short, images with just a keyword "dinosaurs" are inappropriate to acquire the high accuracy.

 I dared to adopt this method because the purpose of today is not to pursue the accuracy of deep learning. From the result of paragraph 2, it was found that neural network does not become smart no matter how much the scattered data is learned. But big data is often scattered. There is nothing good about inputting big data into AI if the data were gathered with no clear intention. This is the today's topic.

 To put it in detail, variation has variation in it. For example, if Google's image search finds only academic illustrations, skeleton photographs, and stuffed toys, increasing data is possible to improve the accuracy. But the minor images like CD jackets, plastic models, deformed illustrations tends to be found near the bottom ranking. I think it is the reason why the accuracy does not improve even if the data is increased.

 I hear a salesman who deals cloud-based services say something like "store log and do deep learning in the future." You shouldn't trust it. I think the problem is that "big data" and "AI" are individually featured and their performances are egocentrically pursued. Data and algorithm should be matched from the beginning. It is important to collect data with a clear strategy about the analysis and result to be obtained. Otherwise, the data will be wasted. No matter how much you collect. In the first place, the applicable field of deep learning is very narrow. In my opinion, image processing is the only chance. The salesman's talk symbolizes the unjustified divergence between data and algorithms.

 Japanese government says it will subsidize the businesses in big data and AI. It shows that the fields are not easy to expect profits without subsidies. I guess in a few years many people will understand that learning big data produce only predictable results. That will be the end of AI boom.

(2) AI for AI → endless loop

 In paragraph 4, I used the characteristic of Google's image search, that assigns famous images to the top ranking. So to speak, I made use of another AI to improve the accuracy of deep learning.

 If you want to improve the accuracy further, it is recommended to add AI to whiten the background other than the dinosaurs. It is also a option to pick only academic illustrations before classification. Introducing other AI to make AI smarter... this will be an endless loop. Sooner or later, humans must manually prepare images.

 There was a reason for selecting dinosaurs as today's material. Dinosaurs have died in ancient times, so no perfect images for them exist. In addition, the shapes of dinosaurs have been changed as researches progressed. In my childhood, it was common for Tyrannosaurus to stand upright like Godzilla. Nowadays, it is common for Tyrannosaurus to walk with its tail extended and keep its body horizontal. Recently, feathered dinosaurs are trendy. The material "dinosaur", which makes learning difficult due to its unique ambiguity, was perfect for today's trial.

 Connecting multiple AIs to confront big data is a way. But I think this is not only way.

(3) AI does not become GOD

 I'm not saying there is no point in using data or AI. As I wrote in a past article, deep learning is a very powerful algorithm for image processing. I think learning composite photos*6 is one of the ways to utilize deep learning.

 In general, I think it is important to clarify the purpose and make use of data in simple way. AI will never become GOD as Descartes called. AI will never generate an idea beyond human imaginations. In fact, Amazon's recommendations is very simple itself, isn't it?

6. Afterword

 It was fun to write what I always wanted to. In the near future, I will try to classify dinosaurs using composite images.

 Today's source codes is here*7. As I wrote in README, if you have troubles to prepare data, please download from here*8.

秋のしもふさクリテリウム 54位

 秋のしもふさクリテリウム 2h エンデューロに参加しました. 結果は54位 (出走110人). 惨敗だぁ...

0. コース

 千葉県の下総総合運動公園で開催されました. 自身で走ったのは初めてでしたが,店長選手権*1の動画で概要は知っていました.

 気になっていたのはゴールラインに向かう登りです. 一応,クライマーなので...

f:id:changlikesdesktop:20200922171902p:plain:w400
ゴールラインに向かう登り

 試走してみると勾配は緩く,長さも短いので軽量クライマーに有利になるような登りでは無かったです. むしろ,コース中盤の右カーブからの登り返しの方がトリッキーでした. (多くの選手がここで踏んでいて,実際に自分も中切れしそうになりました)

f:id:changlikesdesktop:20200922171748p:plain:w400
コース図

画像の出典*2

 決して得意なコースでは無いのですが,競技時間が長いのでWAKLRIDEのクリテリウムよりはマシな筈! COVID-19の影響を人並みには受けましたが,ローラーでパワー強化をしてきたつもりです. 少しでも先頭集団に食らいつこうと,意気込んで参加しました.

1. レース展開

 スタートリストから多少は分かっていたのですが,有力選手がかなり参加していた様です. 優勝された選手などは,ツール・ド・沖縄の上位常連ですよね. 今回一人で参加していた事もあって多少ビビりつつ,スタートラインに立ちます.

 長時間のレースの場合,アクチュアルスタート直後にハイペースのふるいが掛かるのが定石です. 備えていたつもりだったんですが,メチャクチャ早くてきつい... 20分位で,あっさりと千切れてしまいます. 「悔しい」という感情が芽生えない位,圧倒的な力の差があったように思います.

 千切れた後は,追走集団で先頭交代をしながら走りました. Matrixの選手や安原監督が入ってくれた時間帯もあって,楽しかったです. ただ,先頭集団に追い抜かれる度に,集団がバラバラになります. 途中から良く解らなくなってしまったんですが,結局,追走集団からも千切れたのだと思います.

 その後,同じタイミングで千切れた若者と二人で回ったりした記憶があります. 追いついたり,追いつかれたりがパラパラとありましたが,協調してペースを上げることが難しかったです.

2. Cyclo-Sphereのデータを見てみる

f:id:changlikesdesktop:20200922171327p:plain:w400
ワークアウト解析

 おそらく,今までで最も出たと思います. 2h の平均パワーが(実走で) 200Wを超えたのは初めてです. 2hのTSSが197.5というのも,我ながら追い込んだと思います. それでもこの結果だという事ですね.

f:id:changlikesdesktop:20200922171522p:plain:w400
ラップ記録

 ラップ記録を見ると,やはり前半が速いですね. でも,大会公式記録を見ると1~4位の選手の平均速度が43.68 km/hなので,彼らはほぼ初速のまま走り切っているのです. 凄いな...

4. 改善点

 自分にとってベストなパワーが出ていたのに,何故この結果になったかを考えると:

  1. FTPに根本的な差がある
  2. 集団走行が下手
  3. バイクコントロールが下手

 1. は...勿論トレーニングするんですが,どうしようも無い部分もあります. 先頭にいた選手達は,皆さん300 W前後のFTPをお持ちなのでしょう. 僕の体格では,どう頑張ってもFTP 300Wは無理です. PWR 5.0で260W,5.5でも286Wですので(><). (ちなみに今は4.5倍位). 高校生の時は60 kg位あったんですが,アラフォーにった今,当時の筋肉量に内臓が付いていけるとは思えません. 身体の反応を見ながら,方向性を探るしか無いと思います.

 2. は,経験を積むしか無いですね. 今日も少し並ぶタイミングが遅れて,集団中程からのスタートでした. もっと図々しくやってみようかな.

 3. は潜在的にあるんですが,今日のレースでは改善したと感じました. 昨年はコーナーで苦戦することが多かったのですが,今日は前の選手から離れることなくコーナーを曲がれました. 周囲の選手たちとの距離感も怖く無かったです. オフロード練の成果が少し出たのかも(^^). 引き続き改善していきたいです.

5. 結び

 何はともあれ,シーズンが開けました. 何レース走れるか分かりませんが,せっかくなので貪欲にやっていこうと思います.

 ちなみに今日,自転車に乗っている安原監督を初めてみました. 凄く速くて,格好良かったです. j sportsでの屈折した愛情表現は,やはり世を忍ぶ仮の姿なのでしょうか?

おまけ: 宮ケ瀬クリテリウム

 一昨日,宮ケ瀬クリテリウムもこっそり走りました. 結果は19位(出走35人). 去年と同じく,整列時点でレースが終わってしまいました(泣).

 落車の多いレースだったので,これで良かったとも思います. 残念な事に,同じクラスを走っていたチームメートが落車で大きな怪我を負ってしまいました. 復帰後にまた一緒に走れるように,コンディションを整えていこうと思います.

ビッグデータでAIは賢くならない,という話

 こんにちは.changです.

 今回は,僕が考えるAIの実際について話そうと思います. ビッグデータを学習させてもディープ・ラーニングは賢くならない,という事についてです.

f:id:changlikesdesktop:20200918132205p:plain:w300

0. ビッグデータ

 ビッグデータとは,「データの収集,取捨選択,管理及び処理に関して,一般的なソフトウェアの能力を超えたサイズのデータ集合」だそうです*1. 10年程前から使われる様になった概念だと思います.

 データが大量になると,データを読み解くことが大変になります. 例えば,世界の全書籍数は1億2986万4880冊だそうです*2. 一生かけても読み切れないですね. 既に400年前に,デカルトが言っています. 素人の意訳で恐縮ですが,「世の中に存在する全ての知識を把握することは到底出来ない.それができるのは神だけだ」と.

 書籍の話をしましたが,ビッグデータを支える最初の技術革命が「紙」であったと言えるでしょう. ヒトの記憶は年月と共に曖昧になったり,消えたりします. 一方,紙に記録された情報は長い年月を不変に残り続けます. このことが,情報量の拡大をもたらしました. 直近の数十年で,「ハードディスク」「インターネット」という技術革命が新たに起きます. これにより,世の中に実在するデータ量は更に膨大になりました.

 ヒトの脳が処理する情報量には限界があります. それを遥かに凌駕する大量の情報がこの世の中には存在します. これが,一種の恐怖を産んでいるのではないでしょうか. 実際,僕も今の時代を生きていて,日々発生する新しい言葉や概念に追従していくことが難しいと感じます. 新聞を読んで,「クラウドってのが在るのか...」程度の浅い情報把握はしますが,深く勉強しようとしなくなりました. 「キリがない」感じがしてしまいます. 単に年だからかも知れないけど... 会社で仕事をしていても,本を読んで勉強するより,スマホとネット検索を使いこなす方が評価されるように思います.

 そんな世の中なので,AIが注目されます. 何かを判断しようとしたとき,関連する情報の全てをヒトが把握してニュートラルな答えを出すことが難しいので,人工知能に助けて貰おうという訳ですね.

1. データセット: 恐竜画像

 ビッグデータの一例として,Googleの画像検索を取り上げます. 個人的に大好きな恐竜を題材に選びました.

 以下のキーワードで検索して,それぞれで500枚の画像を集めました. 収集した画像を使って,恐竜の種類を判定するディープ・ラーニングを作ります.

  • tyrannosaurus
  • triceratops
  • brachiosaurus
  • stegosaurus
  • iguanodon
  • ornithomimus
  • pteranodon

※ 上から,ティラノサウルストリケラトプスブラキオサウルス,ステゴサウルス,イグアノドン,オルニトミムス,プテラノドン

 集めた画像の一部です. 著作権が問題になることを避けるためにボカシてします.

f:id:changlikesdesktop:20200918100129p:plain:w600
恐竜画像:
学者の方が描いたと思われるイラストが多いが,骨格写真やぬいぐるみ,同名のバンドのジャッケット等も混ざり込んでいる

2. 学習

 各種類の恐竜画像について,先ず50枚をテストデータとしてランダムに選出しました. 次に,残りの400枚の中から100枚をランダムに選んで学習画像としました. 学習画像が100×7で700枚,テスト画像が50×7で350枚ということです.

 ネットワーク構造はmnistのサンプルとほとんど変わりません. 画像が多い & カラー画像を使っている所為でデータの読み込みに時間がかかったので,この部分のみをC言語で書きました.

 こんな正解率になりました.

種類 正解率[%]
ティラノサウルス 32.0
トリケラトプス 24.0
ブラキオサウルス 40.0
ステゴサウルス 32.0
イグアノドン 32.0
オルニトミムス 16.0
プテラノドン 10.0

 7種類を平均すると正解率26.7%でした.

 正解率が悪い原因は明らかです. 学習過程を見ると,学習画像については正解率が上がるが,テスト画像については上がらない,典型的な過学習が起こっています.

f:id:changlikesdesktop:20200918100944p:plain:w300
学習過程:
学習データについては正解率が上がるが,テスト画像については上がらない

3. 精度向上トライA: データを増やす

 分類の精度を上げる為に,学習データを増やしてみます. 2.で作った学習データに更に200個を追加しました. 学習画像は300×7=2100枚になります.

 このデータを同じソースで学習させた正解率です.

種類 正解率[%]
ティラノサウルス 48.0
トリケラトプス 28.0
ブラキオサウルス 34.0
ステゴサウルス 42.0
イグアノドン 32.0
オルニトミムス 28.0
プテラノドン 10.0

 正解率は大きく変わらず,31.7%でした.

 学習過程も2.と同様の過学習になっていることがわかります.

f:id:changlikesdesktop:20200918101641p:plain:w400
学習過程:
学習データを増やしても,テスト画像についての正解率は上がらない

 統計学の性質から,ばらつきを含むデータはそのどこを取り出しても同様のばらつきを含みます. 100枚でも300枚でも,含まれるばらつきの大きさは変わりません. つまり,学習データを増やしても,ディープ・ラーニングの精度が向上するとは限らないのです.

f:id:changlikesdesktop:20200918114746p:plain:w300
母集団から一定領域をピックするイメージ
どこを取っても同等のばらつきを含んでいる

4. 精度向上トライB: 画像のばらつきを減らす

 3.の結果から,分類の精度を上げるためには学習データのばらつきを減らす必要があることがわかりました. 何百枚もの画像を一枚一枚見ていくのは大変です. そこで,今回は少し工夫をしてみます.

 Googleの画像検索では,検索の上位に有名で,頻繁に閲覧される画像が見つかります. 検索順に画像を見てみると,上位には精巧なイラストが多く,下位になるほどぬいぐるみ等の粗悪な画像が多くなります. そこで,上位50件をテスト画像に,それに続く300件を学習画像にしてみました. これによって,テスト画像のばらつきを最小限に近づけることが出来ます.

 このデータを使って学習させた結果がこれです.

種類 正解率[%]
ティラノサウルス 38.0
トリケラトプス 34.0
ブラキオサウルス 60.0
ステゴサウルス 68.0
イグアノドン 28.0
オルニトミムス 46.0
プテラノドン 32.0

 正解率は43.7%になりました. 検索画像をそのまま分類させたにしては,優秀だと思います.

 学習過程は相変わらず過学習ですが,若干マシになりました.

f:id:changlikesdesktop:20200918162314p:plain:w300
学習過程
過学習が少し改善される

5. 考察

(1) ビッグデータの性質

 はじめに,今回作ったディープ・ラーニングがかなり乱暴なやり方を採っていることを名言します. 一言に画像と言っても,顔写真,全身写真,集合写真などと色々あります. 撮影されるアングルも様々です. 一般的に,それらを一同に学習させることはしません. 人物の分類が良い例です. 多くの例*3*4で紹介されているように,画像の中から顔部分だけを抜き出し,その後で分類します. 2重にAIを使うという事です. 「恐竜」という括りの画像を一同に学習させた今回のやり方は,学習精度を上げるにはそもそも不適切なのです.

 敢えてこの方法を採ったのは,今回の目的がディープ・ラーニングの精度を追求することでは無いからです. 2.の結果から,ばらついたデータをいくら学習させても,ネットワークが賢くならないことがわかりました. 乱暴な方法ではありますが,ビッグデータというのは得てしてこういうものです. 無作為に集められた大量のデータをAIに丸投げしても何も良いことはありません. これを理解することが,今回の目的です.

 細かい事を言うと,ばらつきにも色々があります. 例えば,Google検索がイラスト,骨格,ぬいぐるみしか見つけないならば,データを増やすことで精度が高くなるでしょう. 実際のGoogle検索では,検索の下位になるほど,CDジャケット,プラモデル,デフォルメされたイラスト,全く関係性の無い画像...と,検索上位とは分類ごと異なる様な粗悪画像が混入します. このことが,データを増やしても学習精度が向上しない原因になっていると考えられます.

 クラウド系のサービスを扱う営業マンが,「ログデータを貯めて,将来的にはディープ・ラーニングしましょう」みたいな事を言うのを聞きます. 信用するべきではありません. 誤解が生まれる原因の一つに,「ビッグデータ」と「AI」がそれぞれ個別にフィーチャーされ,それぞれの都合で性能を追求していることにあると感じます. データとそれを解析するアルゴリズムは,一蓮托生であるべきです. 「このアルゴリズムでこういう結果を導こう」といった明確な目的を伴って収集しない限り,データは無駄になるでしょう. 例え,どんなに大量に集めたとしてもです. そもそも,ディープ・ラーニングはほぼ画像処理にしか使えません. 先刻の営業マンの言葉は,データ-アルゴリズム間の不当な乖離を象徴していると言えます.

 政府がビッグデータやAI関係の事業に補助金を出すと言っています. 裏返せば,補助金でも出ないと利益を見込めない分野なのです. 何年かすると「ビッグデータを学習させても当たり前のことしか分からなかった」事例が山積みになると予想しています. そのとき,本格的にAIビームが終焉するでしょう.

(2) AIを賢くする為のAI→無限ループ

 4.では,Googleの画像検索が有名な画像を上位に割り当てる性質を利用しました. 謂わば,ディープ・ラーニングを高精度化するために,別のAIの力を借りた訳です.

 更に分類精度を上げるには,恐竜以外の背景を白抜きしたり,イラストだけを取り出す様なAIを導入すれば良いでしょう. AIを賢くする為にAIを導入する...この連鎖は無限ループになります. どこかで,ヒトが手作業で画像を振り分けたり,画質を整えることになるでしょう.

 今回,素材を恐竜に選んだことには理由があります. 太古に滅んだ恐竜には,絶対的な正解写真がありません. 年月と共に研究も進み,イラストも変わります. 僕が子供の頃には,ゴジラの様に直立し,尻尾を引きずって歩くティラノサウルスが一般的でした. 昨今では,尻尾を伸ばして上体を水平に保ちながら歩くティラノサウルスが一般的です. また,羽毛をまとった恐竜像も台頭しています. 独自の曖昧さで学習を困難にする「恐竜」という素材が,今回の検証にはピッタリでした.

 ビッグデータに対峙する為に複数のAIを連ねるのは,一つの手段としては有効です. でも,別のアプローチもあるのではないでしょうか.

(3) AIは神にはならない

 データやAIを使う意味が無いと言うつもりはありません. 以前に申し上げたように,ディープ・ラーニングは画像処理のアルゴリズムの一つとしては非常に強力です. この特性を生かした合成画像からの学習が*5,ディープ・ラーニングを活かす方向性だと思っています.

 AI全般に関しては,目的を明確にして,シンプルにデータを使うことが成功につながると考えます. AIは,デカルトの言う「神」にはなれません. 膨大なデータから想像もしなかったアイディアを創出してくれることは有り得ないのです. 実際,Amazonのリコメンド等もやっている事自体はシンプルですよね. (AI運用に限りませんが)やりたいことのイメージの具体的に持つ事が重要だと思います.

6. むすび

 ずっと書きたかった内容に触れられて楽しかったです. 近いうちに,合成画像を学習に用いた恐竜の分類にトライするつもりです.

 今回書いたソースはここです*6.READMEにも書きましたが,学習データを作るのが煩わしければここ*7からダウンロードして下さい.