私の勉強の振り返り
なぜ勉強しようと思ったか
仕事の勉強は以前からしてましたが、その範囲を超えて色々勉強しようと思った理由の1つは、「自分の能力にすごく危機感を覚えた」ことが理由です。
このご時世、今の会社がこれからどうなるか分かりませんし、もしかしたら会社がなくなって転職しなければいけなくなるかもしれません。
そこで「自分ってエンジニア(開発者)として対外的に評価されるような能力、価値があるだろうか」と考えてみたときに、「Yes」どころか「No」という答えしか思い浮かばず、これではいかん、ということで広く勉強をするようになりました。
勉強したこと(時系列順に。仕事関係は含めてません)
シミュレーション技術
勉強しはじめのころは、C言語以外に使えるものを作りたいと思い、Python を覚えるための題材として、あとシミュレーション(主に物理)に興味があったので、シミュレーションに関することを勉強してました。
勉強の結果、数値計算、バネマスダンパ系や熱などの簡単なシミュレーションを Python で作れるようになりましたが、「よく考えたらシミュレーションが出来た所で、こんな技術すでに巷にたくさんあるしなぁ」と思い、別の勉強に移りました。
データ分析
次は流行りでもあったデータ分析を勉強しようということでデータ分析の本を買ったり Kaggle に挑戦したりしてました。
ここでは、Pythonでデータを扱う方法や、機械学習の概要と使い方、評価方法などが学べましたが、正直用意されたデータで分析するのが面白くなくなってきたのがあって別の勉強に移りました(笑)
異常検知
データ分析技術の用途で色々本やWebで調べて面白そうだなと思ったのが異常検知でした。「分析手法を異常を見分けることに使うってとても面白いじゃん!」と思い、データ分析から異常検知に移りました。
異常検知は行列計算とか数式が難しかったんですが、当時はそれを頑張って手計算やPythonでコーディングしてみたりして勉強を進めてました。あと時系列分析もここで勉強しました。
この時は統計学とか基礎的な知識が少なかったこともあり、何となくの理解で終わらせたものもあったのですが、ここで学んだことがこの後色々な所で現れ、「あの時のアレはこういうことだったのか!」と遅まきながら理解したものもありました。
ディープラーニング
ディープラーニングについては、「今流行りだし、勉強しといた方が良いかなぁ」とは思いつつも、イマイチ自分のなかで興味が盛り上がらずに手を付けていなかったのですが、Webか何かを読んでた時に「生成系ディープラーニング」なるものを知り、これだ!!と思ってディープラーニングの勉強を始めました。
きっかけが生成系だったので GAN の技術や超解像などを中心に勉強しました(その時使ってたのは Keras です。Chainer もちょこっと触ってたのですがKerasの方が簡単で使いやすかったのですぐ辞めちゃいました、笑)
暗号理論と疑似乱数
ここは本当思いつきです(笑)。Webか何かで知って「ちょっと面白そうだから勉強してみよう」という感じで始めました。
疑似乱数は線形合同法、線形帰還シフトレジスタ、XorShift、暗号理論はRSA暗号、ElGamal暗号、楕円曲線暗号などは一通り実装できるようになったんですが、この分野の悩ましい所は「実装したとして、その性能を評価することが実装以上に難しい」ことですね。
例えば疑似乱数なんて、実装したものが「本当に性能面でも正しく実装出来てるか」なんて分からないわけですよ。いや、乱数検定というものはあるんですが、そこまで手を出したらとても大変!ということで、実装して「へぇ~、こんな風に実装するんだ」を楽しんだ程度で終わりました
データベースとネットワーク
これまでの勉強はアルゴリズムや理論にかなり偏ってたんですが、そのアルゴリズムを使えるようになるまでの所も勉強しようと思い立ち、データベースとネットワークを勉強しました。(ネットワークに関しては、業務で必要になったというのもありました)
ここでRDBMSの概要、SQL(SQLite, PostgreSQL)、ネットワークの基礎知識を学びました。
特にネットワークは、これまで業務でパケットキャプチャとか使ったことがあるにもかかわらず、基本的なことが全然分かってなくて、TCP/IPを理解するのにも苦労しました(笑)
統計学(記述統計学、推測統計学、ベイズ統計学)
データ分析や異常検知を通して統計の知識は多少持っていたんですが、統計学をちゃんと勉強したことはなく、異常検知もなんとなく分かった、や、分からんけどこういうものか、で済ませてた部分があったなぁということで、統計学を勉強しました。
ベイズ統計学は計算が大変で少し敬遠してた部分がありましたが、簡単な部分を手計算で解くことから始め、MCMC法(ギブスサンプリング、メトロポリス法)を実装しながら勉強しましたが、やはりベイズは大変で難しいです!(笑)
フィルタリング
フィルタリングとは、カルマンフィルタやパーティクルフィルタなどのことです。
きっかけはロボティクスに関する情報を見ていた時で、逐次的に推定する仕組みが面白いし有用そうだなと思って勉強を始めました。
しかし勉強するとまぁ大変。パーティクルフィルタの発展手法の所で挫折した感があります。
でもここを勉強したおかげで、潜在変数とか状態方程式、時系列分析の考え方が理解できました。(状態方程式はホント偉大です!)
FPGA と Verilog
ここを学ぼうと思った理由は2つあります。1つは処理をハードで記述する術を学ぶと、処理(機能)を実現する選択肢が増えていいかなと思ったこと。もう一つは、FPGA設計の需要はどんどん増えていくという話を聞き、メシを食うタネを増やしとこうという理由でした(笑)
会社で回路を担当している人に使っている言語を聞いたら Verilog ということだったので Verilog をお勉強。
Verilog は他の言語とかとは少し雰囲気が違ってはじめは苦労しましたが、一応は簡単なものだったら書けるようにはなりました。
IoT
今までの勉強は、点として学んでた感じが強かったんですが、他の人に自分の技術を説明(アピール)する際にバラバラで話すよりも軸があった方が良いだろうということで、総まとめ的な感じで IoT の勉強を行いました。
。。。とは言ってもIoTの各技術要素は大体勉強したものなので、復習 + IoTとして体系的に整理し直した感じです。
まとめ
さて、自分がこれまでどんなことを勉強してきたのかをざっと書いてみました。
これを書こうと思った理由は、自分のこれまでの勉強を振り返ってみたかったからですが、ちゃんと文字にしてみるのは良いですね。(まぁただ勉強した、ってだけの話なんですけどね、笑)
これからも気が向いたら自分のこれまでを振り返って何か書けたらなと思います。