23 May 2018, 02:54

fast.ai の機械学習講座を受けた

はじめに

fast.ai ジェレミーハワード氏の実践機械学習講座。

2017年に全世界で話題を呼んだ、Practical Deep Learning for CodersのMachine Learning版だ。

今回も kaggle はフル活用

fast.aiは課題の題材にkaggle のコンペを利用するところが面白い。

それは、教育の哲学が、Top-Downで実施することを重視しているからだ。 理論よりも、まずは手を動かすことによって、楽しむ。

今回も、以下のコンペが取り上げられる。

Random ForestとLogisticRegression

驚くことなかれ、Lesson1-7までずっとRandomForsetの解説がある。 一つの動画が1.5時間名て、10時間以上 RandomForestを解説する。 使い方から、仕組みまでさらい、さらにはスクラッチ実装まで。

それをこえると、今度はPyTorchによるLogisticRegressionの解説が、6時間くらいある。

Tree系、Linear系、合わせて16時間をCodeベースで丁寧に解説。

授業内容

シラバス

Train vs test
    Effective validation set construction
Trees and ensembles
    Creating random forests
    Interpreting random forests
What is ML? Why do we use it?
	What makes a good ML project?
	Structured vs unstructured data
	Examples of failures/mistakes
Feature engineering
	Domain specific - dates, URLs, text
	Embeddings / latent factors
Regularized models trained with SGD
	GLMs, Elasticnet, etc (NB: see what James covered)
Basic neural nets
	PyTorch
	Broadcasting, Matrix Multiplication
	Training loop, backpropagation
KNN
CV / bootstrap (Diabetes data set?)
	Ethical considerations

Lesson1

Random Forestをつかって、 Kaggleの Blue Book for Bulldozersコンペに挑戦。

Lesson2

Lesson1の続き。Random Forest の解説。決定木からバギングまで。

また、validationを利用した、パラメータチューニングについて。

また、Lesson2までを通じて一通りの機械学習コンペの作法を学ぶ。 kaggleからのデータダウンロード、前処理、Random Forest、提出。

Lesson3

Lesson1, 2で学んだ内容を、以下のコンペに適用してみる。 30thになれるので、モデルをどんどん改良してねとか。

Corporación Favorita Grocery Sales Forecasting - https://www.kaggle.com/c/favorita-grocery-sales-forecasting

残りの時間は、再びBulldozersコンペに戻り、解析結果の解釈方法について話される。 feature importance, feature selectionの話。

Lesson4

メモするの忘れた。まだ Random Forest.

Lesson5

Validation戦略、主にクロスバリデーションとか。

後半は、Random Forest のスクラッチ実装を開始。 RandomForestだけで、8時間くらいたっているのですが。。。

確認したら、Lesson6,7も RandomForestだ。みっちり10時間以上だな。

Lesson6

Machine Learningとは、という話がここでようやくでてくる。この記事の説明。 - https://www.oreilly.com/ideas/drivetrain-approach-data-products

その後、今まで説明した概念を振り返り説明する。

Lesson7

Random Forest のスクラッチ実装。 RandomForestの実装は簡単で実はそこに利用されてるDecisionTreeが難しい。

すみません、この動画は飛ばしてみました。

この回で、ようやく RandomForestは終わり。次は、ニューラルネット。

Lesson 8, 9, 10

ニューラルネットワークの説明。PyTorch登場。MNISTの一層のネットワークによる分類を実装。

yTorchをつかって、LogisticRegressionをスクラッチ実装していく。6時間。

コードの一行一行を丁寧に解説していく。正則化などのテクニックも合わせて紹介される。

しかし、この一連のPyTorchの実装は私は飛ばしました。

Lesson 11

前半は、PyTorchによるSDGの実装の振り返り。

後半は、時系列データに対する扱いをということでRossmanコンペの解説だ。

Lesson12

Rossmanコンペの解説。

表形式データに対して、昨今は ニューラルネットでのアプローチで あまりfeature enginneringしなくてもいい精度が出るとのこと。

最後に、講座の振り返り。 Tree系はRandomForestsを、Linear系はLogisticRegressionをやったよね? フルスクラッチで実装もできたよね?じゃあ、大丈夫だ。

そして、最後の最後にMachine Learningと倫理についてのお話。ここは飛ばしました。

14 May 2018, 17:47

Deep Learningで出会い系アプリ tinder の画像判定をしてlikeを自動化する

はじめに

スケベとDeep Learningが出会うとき、技術の進化は訪れる!

ということで、出会い系アプリtinderをpythonからいじる pynderを試してみました。

そして、Deep Learningの無駄遣いをして、画像データを元に美人判定をして、 美人ならばlikeを、そうでなければnopeをすることをしてみました。

今回の記事は、以下の記事に触発されています。 - Deep Learning (Machine Learning) applied to Tinder – Philippe Remy – My Blog.

pynderをいじる

まずは、インストールから。 - https://github.com/charliewolf/pynder

$ pip install pynder

facebook トークンの取得

https://tinderface.herokuapp.com/ にアクセス。

GET STARTEDを押すことで、ガイドラインが表示されるので、それに従って tokenを取得する。

はじめの一歩

以下のようなサンプルソースを動かす。

import pynder
session = pynder.Session(facebook_auth_token) # 取得したaccess tokenを設定

for user in session.nearby_users():
    print(user.name)

名前が取得できました。

M
みっ
Charlene
はるな
詩羚
Yuki
Mi
Nattarawan
みなみ
Marina
かな

画像データを手に入れる

これでtinderのユーザの画像データが取得できました。

users = session.nearby_users()
user = next(users)

import urllib.request
 
url = user.thumbnails[0]
savename = "test.png"
 
png = urllib.request.urlopen(url).read()
with open(savename, mode="wb") as f:
    f.write(png)

like, nopeを送信する

like, dislikeのメソッドを呼び出すことで, likeとnopeを送信できます。

user.like
user.dislike

これで、pynderの調査は終わり。次は、Deep Learningです。

Deep Learningで美人判定

人工知能に美人かそうでないかを判定させるというのは、いかがなものかと思うのだが、 それは置いておいて、美人判定をする方法を調べました。

先行事例

SCUT-FBP5500 Dataset

SCUT-FBP Datasetというものがあった。 顔写真のデータと、その表情がどのくらい魅力的かどうかを5 段階評価でラベルづけされたもの。

美人かそうでないかの二値分類をするときの学習に使うためのラベルづけが大変そうだと思ったがか このデータセットを使って学習ができそうだ。1,2,3点の人はブス、4,5の人は美人と判定する。

実験

SCUT-FBP のデータセットを利用して、美人判定モデルを作成しました。 詳細は、gistに譲りますが、このモデルでは、85% の精度を達成できた。

以下、要点を列挙。

  • データセットの 女性だけを利用。2250枚。そのうちの1/5をvalidationとして利用。
  • fastai(PyTorch)ライブラリを利用。ResNet32をファインチューニング。
  • チューニング方法は過去記事参照。85%の精度。
  • targetラベルは、ratingを利用。3.0以下をnope, 3.0以上をlikeと分類するようにする。

tinder の画像から推論

画像データの取得、モデル作成とできたので、次は画像データを元に like/nopeを判定する。

like

nope

を、なかなかよさそうじゃんと思ったのだけれども、犬を美人判定にかけたらlikeと判定されてしまった。。 いやいや、犬は、好きではないのですが。。

まとめ

以下ができた。

  • pynder を利用して、tinderから画像データの取得
  • deep learning を利用して、美人判定モデルの構築
  • 美人判定モデルからの like/nope判定の自動化

美人判定モデルの精度がよかったら、ここから機械学習アプリの作成に移るところだった。 しかしながら、判定結果に不満があり、アプリ作成までは実施しないことにした。

今後の課題は、

  • 人判定のモデルをつくる。Object Detection?? 犬をlikeと判定するようではダメだ。
  • 画像以外の特徴量もまぜる。紹介文とか。NLP。
  • データセットを多くする。自分でラベルづけをしていって、それを学習していく。

現在開催中のkaggleのavitoコンペがこのtinderの問題に似ている気がするので、 avitoコンペで培ったkaggle力を無駄に利用して取り組みたい。

また、調べてみると、arxivにもtinder関連のpaperがいくつかあるようだ(スケベめ)。これを読んでいこう。

04 May 2018, 09:48

fast.ai par1 lesson4 Tabularデータの攻略方法メモ

はじめに

この記事では、Tabular(表形式)データに対しての攻略方法についてメモする。

詳しくは、以下の参考記事を参照。

この記事では、オリジナルのデータに対してこの技をどうやって適用するか、 動画のなかでコメントされていたので、それを書く。

TabularデータにDeep Learningを適用するためのステップ

step1

カテゴリカルデータと、数値データのカラムを並べる。

cat_vars = ['Store', 'DayOfWeek', 'Year', 'Month', 'Day', 'StateHoliday', 'CompetitionMonthsOpen',
    'Promo2Weeks', 'StoreType', 'Assortment', 'PromoInterval', 'CompetitionOpenSinceYear', 'Promo2SinceYear',
    'State', 'Week', 'Events', 'Promo_fw', 'Promo_bw', 'StateHoliday_fw', 'StateHoliday_bw',
    'SchoolHoliday_fw', 'SchoolHoliday_bw']

contin_vars = ['CompetitionDistance', 'Max_TemperatureC', 'Mean_TemperatureC', 'Min_TemperatureC',
   'Max_Humidity', 'Mean_Humidity', 'Min_Humidity', 'Max_Wind_SpeedKm_h', 
   'Mean_Wind_SpeedKm_h', 'CloudCover', 'trend', 'trend_DE',
   'AfterStateHoliday', 'BeforeStateHoliday', 'Promo', 'SchoolHoliday']

step2

どのindexがvalidation setなのかを設定する。

train_ratiotrain_rat  = 0.75
train_size = int(samp_size * train_ratio); train_size
val_idx = list(range(train_size, len(df)))

step3

DataFrameから、dataオブジェクトを作成。

md = ColumnarModelData.from_data_frame(PATH, val_idx, df, yl.astype(np.float32), cat_flds=cat_vars, bs=128,
                                       test_df=df_test)

step4

embeddingするサイズを求める。

cat_sz = [(c, len(joined_samp[c].cat.categories)+1) for c in cat_vars]
emb_szs = [(c, min(50, (c+1)//2)) for _,c in cat_sz]

step5

学習モデルの作成

mm  =  md.get_learner(emb_szs, len(df.columns)-len(cat_vars),
	            0.04, 1, [1000,500], [0.001,0.01], y_range=y_range)

step6

学習

m.fit(lr, 5, metrics=[exp_rmspe], cycle_len=1)

03 May 2018, 20:53

fast.ai Practical Deep Learning for Corders 2018

はじめに

今年のGWにまとめてfast.aiの Practical Deep Learning for Coders 2018 を受けました。

去年の記事はこちら。

講座の特徴

主に、2017との比較から

  • フレームワークがKerasからPyTorchへ
  • 最強のノウハウがつまったfastaiライブラリ

講座で扱うKaggleコンペ

fast.aiといえば、Kaggleコンペの実践的な攻略が魅力。 2018でも、以下のKaggleコンペが扱われました

各Lessonの内容メモ

Lesson1

受講したときから時間が経ってしまったので、忘れてしまいました。この記事とかが詳しい。

Lesson2

別記事にまとめました。

Lesson3

CNNの仕組み、ConvolutionのExcelによる解説。このあたりは、去年と同じなので飛ばしました。

半分の時間をつかって、Kaggleコンペの衛生写真からの多ラベル画像分類。

Lesson4

Structured Deep Learnng. 構造化データに対する DLのアプローチにを紹介。 なんでも、これをつかうと黒魔術的な特徴量設計をせずとも、いい精度がでるとか。

1時間弱、みっちり語られる。Kaggle の Rossmmanコンペがみっちり紹介される。

残りの時間でRNNのイントロと、強調フィルタリンクイントロ。

Lesson5

折り返し地点。今までは、faataiライブラリを中心に、高レベルから外観を俯瞰して全体像を眺めてきた。 ここからは、PyTorchをつかって、がっつりコーディングの解説が入る。

この回では、前半をつかって 強調フィルタリングの PyTorchによる実装が解説される。

また、後半は、Excelをつかった 最適化手法のデモ。

Lesson6

強調フィルタリングの解説が続く。その後、Rossmannの解説。

後半は、がっつり RNN。PyTorchでスクラッチから実装してみてねとのこと。 今回は時間がしないので この課題はパス。

Lesson7

前半は、RNN、とくに GRUの解説。これも code ベースでの説明。

後半は、CNNへ戻ってくる。PyTorchを使った、ResNetsのスクラッチ実装解説。題材は、CIFAR10.

最後に、Part2はもっと難しいので、Part1の内容を理解してから望んでねとのこと。はい、ムズいのは知ってます。

03 May 2018, 14:45

fast.ai part1 lesson2 画像分類コンペでのゴールデンルール

はじめに

fast.aiの Lesson2の動画をみているのだけれども、これがいい。

次から次へと新しい手法が紹介され、 それらはすべてfast.aiライブラリに実装されているとのこと。

そして、画像分類コンペのゴールデンルールが示される。

  1. Enable data augmentation, and precompute=True
  2. Use lr_find() to find highest learning rate where loss is still clearly improving
  3. Train last layer from precomputed activations for 1-2 epochs
  4. Train last layer with data augmentation (i.e. precompute=False) for 2-3 epochs with cycle_len=1 Unfreeze all layers
  5. Set earlier layers to 3x-10x lower learning rate than next higher layer
  6. Use lr_find() again
  7. Train full network with cycle_mult=2 until over-fitting

参考:

あまり理解していないので間違っていることを書くかもしれなけれども、 講座で紹介されたテクニックのメモ。

ゴールデンルールで使われているテクニック

学習率(learning rate)のサーチ

learning rate, 学習率を決定するための Practicalな方法。 学習率は、感覚で最適な値を探すことが多いが、もっと系統立てて探そうよという取り組み。

この論文が元になっている。

Learning Rate Schedulerという機能によって、はじめは小さい値からはじめて次第に大きくしていく。 このとき、Lossの変化をplotしていくことで、変化の極小値の値を採用する。

fast.aiライブラリでは、lr_findというメソッドに実装されている。

cyclic LR schedule

Cyclic LR scheduleは、学習率をcosine曲線にそって変更することで鞍点を抜け出す。

differential learning rate

fine-tuneするときの学習率を、 はじめのレイヤは小さく、おわりのレイヤは大きく設定することで、学習を最適化する。

cyclic_melt

Cyclic LR scheduleの学習率の変化を、epochが増えるに従って緩やかにしていく。 Cyclicの周期を1epock, 2epock, 4epockと変えていく。

Test Time Augmentation (TTA)

Data Augmentationを 推論フェーズでも使おうということ。 これによって、validationセットに対して Data Augumentaitionを適用して 予測をし、 たとえば一つの画像を4つに増やしたとき、精度はその平均をとることになる。

まとめ

まとめると、以下の手法が紹介された。

  • LR find
  • Cyclic LR
  • differential LR
  • Test Time Augmentation

ゴールデンルールにしたがえばworld-classな精度が簡単にでるよとのこと。

fast.ai Part1 lesson2では、以下のKaggleコンペが例題として登場し、解説される。

手頃なKaggle画像コンペに参加して、腕試しをしてみたい。

12 Apr 2018, 23:20

ソフトバンク光でチャンネル競合を解消した

はじめに

家のwifi, 最近だろうか、とても遅くてイライラしていた。

ついに原因を突き止めたかもしれないのでそのレポートです。

バッファローの USB Wifi

購入したものは、こちら。バッファローの USB Wifi. wi-u3-866ds

これを使っていたのだけれども、とにかく回線が不安定。 しょっちゅうブツブツ切れてしまう。 とくに、外出先から自宅サーバに乗り込んでいるときに、通信がとだえることが何度もある。 とてもストレスがたまるので調査することにした。

原因はチャンネルの競合

あまりネットワークについての知識はなのだけれどもどうやらチャンネルの競合が怪しい。

集合住宅に住んでいるので、隣人もwifiを利用している。どうも、その電波と競合を起こしているよう。

具体的には、Linuxだとiwlistでチャンネルの競合をしらべることができる。

$ sudo iwlist (interface name) scan | grep Freq
                    Frequency:2.412 GHz (Channel 1)
                    Frequency:2.412 GHz (Channel 1)
                    Frequency:2.432 GHz (Channel 5)
                    Frequency:2.437 GHz (Channel 6)
                    Frequency:2.442 GHz (Channel 7)
                    Frequency:2.442 GHz (Channel 7)
                    Frequency:2.437 GHz (Channel 6)
                    Frequency:2.437 GHz (Channel 6)
                    Frequency:2.457 GHz (Channel 10)
                    Frequency:2.457 GHz (Channel 10)
                    Frequency:2.462 GHz (Channel 11)
                    Frequency:2.462 GHz (Channel 11)
                    Frequency:2.462 GHz (Channel 11)
                    Frequency:2.462 GHz (Channel 11)
                    Frequency:5.18 GHz (Channel 36)
                    Frequency:5.22 GHz (Channel 44)
                    Frequency:5.24 GHz (Channel 48)
                    Frequency:5.6 GHz (Channel 120)

これで空いているチャンネル番号を選んで、ルータに設定しなおしたら途切れることがなくなった(気がする)。

うちはソフトバンク光なので、ルータにログインして、チャンネル設定から チャンネルを40を選択するように指定した。

参考情報

11 Apr 2018, 23:28

Futirismo Blogを WordPressから Hugoに移行しました

このブログは、WordPress と 賢威テンプレートでながらく運営してきたのだけれども、 不意にべつのブログエンジンに乗り換えたくなってきた。

  • WordPressよりもモダンな感じがいい、シンプルな感じがいい
  • Markdownで書きたい
  • デプロイとかコマンド一つでやってのけて、かっこよくふんぞり返りたい
  • PHPとかMySQLとか、一世代前なもののような気がしている
  • 100年続くブログを作りたいので、DBにデータがあるよりかは、プレーンテキストで処理したいところだ。

静的サイトジェネレータというものがWordPressのような 動的サイトの対抗馬として人気を集めているらしい。 動的サイトは、閲覧者の要求によって、DBアクセスをして情報を収集して、ページをその場で生成するので、時間がかかる。 それに対して、静的サイトはあらかじめ生成されたものを表示するだけなので、早い。

静的サイトジェネレータに移行を検討してみた。以下が候補。 - Hexo - Hugo - Jekyll - Octopress

Hugo がよさそう。2018年もっとも勢いがありそうなので。

また、Hugoの特徴としては、Go 言語でかかれていて、 他のテンプレートエンジンに比べてとても高速なようだ。

また、Gitで記事を管理して、pushと共にサイトにdeployするしくみを導入したい。 しらべてみると、netlifyがイケてる。 netlifyはデプロイ先の場所を無料で提供してくれるWebサービス。

というわけで、Hugo と Github とNetlifyという組み合わせでのサイト構築をしてみた。

途中のカスタマイズは記事に書くのは省略するが、なんとか移行完了。

大きな課題は、過去記事の多くをWordPressのPluginの助けを借りていたため、 Markdownに変換してもうまく情報を引き継げない。

これは手動で修正していくしかないかな。。。

30 Mar 2018, 16:27

xgboostの学習をtensorboardで可視化してみた

はじめに

Google の TensorBoardは、TensorFlowの学習をクールに可視化する。今回、xgboostや scikit-learnの学習結果を、TensorBoardで可視化できないかなと調べたところ、方法を見つけた。

tensorboard_logger

tensorboard_loggerをつかうと、tensorboardで表示できる形式でログ出力できる。

これとxgboostの callbacksの機能を利用して学習の結果を可視化する。

https://gyazo.com/9da25151162b5e5db0106a55439ef647

26 Mar 2018, 20:38

Emacsでデータサイエンス用環境構築(Python)

はじめに

肥大化してデブになった emacs設定を一旦捨て去り、一から作り直すことにした。

デブは自分のお腹だけで十分だ!(名言)

Motivation

以前は、こんな感じの設定ファイルを作っていたのだけれども、複雑になりすぎた。

また、データサイエンスをやるにつれて、以下のようなことがあり、Emacsを使いたくなってきた。

  • 自宅サーバにsshで自習室からつないで作業することが多いので、Pycharm使えない。
  • Jupyter Notebookを使うことが多いが、Jupyter Notebookでは、スクリプトかけない。
  • 今まで素の Emacsでしのいできたのだけれども、辛くなってきた。
  • ターミナルかっこいい\(o)/

目指す姿

  • データサイエンス、もっと言えばPythonに特化した環境を作りたい
  • 軽い環境を作りたい
  • できるだけシンプルにしたい

Environment

  • Ubuntu 16.04
  • Python 3.6(Anaconda)
  • Emacs 25.x

最新版Emacsを投入

まずは、Ubuntuに25系のversionをインストールする。

sudo add-apt-repository ppa:kelleyk/emacs
sudo apt-get update
sudo apt-get install emacs25
sudo update-alternatives --config emacs

リポジトリ & 設定ファイルを作成

.emacs.dを gitで世代管理して、githubにバックアップしたい。まずは、emacs用のリポジトリを作成。

init.elも作成。ここを参考にして、カスタムディレクトリを起点に起動できるように記述。

(when load-file-name
  (setq user-emacs-directory (file-name-directory load-file-name)))

続いて、このリポジトリを利用して起動するためのスクリプトを作成して、パスの通ったところに置く。

#!/bin/bash                                                                                                                                                                                                          
emacs -nw -q -l /home/tsu-nera/dotemacs-for-data-science/init.el $1

パッケージ管理をどうするか?

以前はuse-packageを使っていた。しかし、今回はシンプルにしたいので、デフォルトで搭載されているパッケージ管理ツール package.elを使うことにする。以下の記事によると、25.1からはインストールされたパッケージが package-selected-package 変数に保持されるようになったらしい。

以下の設定を inti.elに書くことで、custom.elに設定を吐き出すようにする。

(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file)
  (load custom-file))

package-installでインストールできるパッケージを増やすために、リポジトリを追加する。

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(fset 'package-desc-vers 'package--ac-desc-version)
(package-initialize)

Python開発環境

ここからが本番! データサイエンスのために Python開発環境を整える。過去記事を参考に(古くてあまり参考にならないですが)、設定を書いていく。

python-mode - メジャーモード

メジャーモードはデフォルトの pythonパッケージではなく、python-modeをつかう。なんとなく。

(require 'python-mode)
(add-to-list 'auto-mode-alist '("\\\.py\\\'" . python-mode))
(add-to-list 'interpreter-mode-alist '("python" . python-mode))

flycheck, flake8 – 静的解析

Pythonの静的解析ツールとして flake8, それをつかうためのインタフェース flycheckを入れる。

pip install flake8

python-modeのときだけ有効。

(defun tnoda/turn-on-flycheck-mode ()
  (flycheck-mode 1))
(add-hook 'python-mode-hook 'tnoda/turn-on-flycheck-mode)

jedi – 自動補完

jedi は pythonのための 自動補完ツール。

pip install jedi


(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)

jedi は Emacsの補完ツール , auto-completeを使っているので、その設定もしておく。

(require 'auto-complete-config)
(ac-config-default)
(global-auto-complete-mode t)

yapf – 自動フォーマット

自動でいい感じに整形してくれるツールを入れる。autopep8という古参なツールもあるけれども、新しい方を採用。

pip install yapf


;; py-yapf - auto format                                                                                                                                                                                             
(require 'py-yapf)
(add-hook 'python-mode-hook 'py-yapf-enable-on-save)

ひとまず完成した init.el

04 Mar 2018, 10:41

Futurismoブログ6周年〜今までの振り返り

はじめに

このブログをはじめて6年が立ちました。6年というと、一つの区切りのような気がします。そこで、今回は6年間の興味の移り変わりと成長を過去記事とともに振り返ってみようと思います。では、どうぞ。

2012年3月 〜 2013年3月 ソフトウェア開発者としての幕開け

2012年3月10に、初めてブログを立ち上げました。

立ち上げたきっかけは、あまり覚えていないのだけれども、たぶんアフィリエイトで一発あててウハウハしたかった気がした(笑)。睡眠やファッションや食事に関するアフィリエイトブログが先に立ち上がって、Wordpressでゴニョゴニョしたことをまとめるためのブログだった気がする。このブログは、賢威というアフィリエイト界隈では有名なWordPressのテーマを使って作成している。賢威を買ってとりあえず立ち上げてみた、そんなところだろう。

しかし、この立ち上げが、技術ブログとして細く長く続いて今日に至るとは、誰も想像だにしなかった。この技術ブログを立ち上げることで、自分のエンジニアとしての意識が改革され、Outputをすることを意識して、継続的にInputをする習慣がついたのだった。

新卒で働きはじめてからブログをはじめるまで、家で技術的なことを学んだり、プログラミングをしなかった。家でそういうことをすることは、社畜だと思っていた。プライベートはなんか気晴らしをしてリフレッシュするのが良いと考えていた。

しかし、ブログをはじめてから、少しずつだけれどもプライベートでも技術的なことを学び始めた。時間ができると、プログラミングの勉強などをするようになった。これは0が1になった、とても大きな心の変化だ。きっかけがWordPressの保守という瑣末なことだったけれども、これがなかったら、自分の今までの変化はなかった。ちょっと大げさだが、このブログのはじまりが、自分のソフトウェア開発者のはじまりだった と言える。

この年に夢中になったこととして、iRemocon Hack というものがある。

今、Google Homeや Amazon Alexaなどのスマートスピーカーが売れているが、その当時、スマートホームというものがまだ流行っていないときに、自分のお家ハックをして楽しんでいた。

もうひとつ、夢中になったことがある。それは、TDDだ。当時、まだC言語しか知らなかったけれども、C言語でテスト駆動開発をする本に巡りあい、熱心に読んだ。

この記事、はてなブックマークではじめてバズッた記事だった。少しびっくりした。これをきっかけに、TDDを実務で試してみたいという気持ちが高まり、Google TestやGoogle MockというOSSを調べ始めた。OSSに触れたのもここが初めて。

2013年4月 〜 2014年3月 MOOCをはじめる

Jenkinsや、Eclipse、Cygwinといった、開発環境周りに興味を持ち始める。Eclipse関連の記事が多め。このころは、まだEmacsはあまり使っていなかった。githubを使い始めたのも、この年が初めて。

これをきっかけに、dotfilesをいじることにだんだん興味が移り始める。zshやら、cygwinやらscreeenなどのターミナル環境がカッコいいと思い始める。

このころ、vmwareに CentOSやUbuntuを入れて、Linuxをいじり始める。普段使いは、Windowsなのだったけれども、ターミナルへの興味を元に、コマンドラインの世界へと入っていく。年が明けると、Linux愛が深まり、ついにはWindowsと Linuxのデュアルブートに踏み切るまで至る。

また、TopCoderを知り、SRMに少しずつ参加を始める。アルゴリズムとデータ構造をC++で学び、C言語しかデキない人から、脱却をスべく、C++を学び始める。

MOOCとの出会いが、自分の勉強を加速させる。TopCoderがきっかけとなり、アルゴリズムを学ぶために、courseraの Algorismsと C++の講義を取る。

これらはとても難しかったのだけれども、このレベルのものを海外の学生は勉強していることを知り、焦りを覚える。そして、コンピュータ・サイエンスをMOOCを通じて学び直そうということを計画しはじめる。この決意がなければ、今日30以上のMOOCを受講することもなかっただろう。そして、この決断がなければ、険しい道を進むこともなく、貧弱プログラマになっていただろう。

この年は、C++, Java, Rubyを学んだ。もう、C言語しかできないひよっ子プログラマではない。

2014年4月 〜 2015年3月 Emacsが好きになる

ターミナル環境がすっかり気に入り、Emacsへの愛が高まる。Emacs好きならば誰もが思うように?、Emacsから出たくなくなり、何でもEmacsでやろうとし始める。Linuxへの愛も感極まり、ついにはLinuxマニアの大本命、Arch Linuxをインストールする(そして、これはアップデートでぶっ壊れてUbuntuに落ち着く)

また、この年もMOOCを貪欲に受講した。MOOCを通じて、新しいプログラミング言語を 2ヶ月に1つは挑戦するという、ちょっとおかしな状況。

仕事でJavaをやらせてもらい、デザインパターンを次々にマスターしはじめる。仕事と普段の勉強が相互に刺激しあい、新しいことをよく吸収することができた。

2015年4月 〜 2016年3月挫折、そして燃え尽き症候群

MOOCの勉強に陰りがみえはじめる。いろいろと講座を受けるのだが、難しくて途中でやめてしまうことが多いのだ。そして、趣味プログラミングもなかなかうまくハマることができない。悪い方向へ傾き始めると、どんどんうつが進行していった。自分のプログラマとしてのアイデンティティが揺るぎ始めた。

そして、12月、ついに倒れる。うつ病で休職。

ゲームオーバー、つらい。

唯一、この年でハマったことがあった。PythonによるFXシステムトレード。これによって、5万損したのだけれども、この取り組みは今考えてもとてもおもしろかったと思う。

2016年4月 〜 2017年3月 プログラミングから離れた一年

倒れたあとは、プログラミング恐怖症になってしまい、プログラミングから離れていた。なにをやっていたかというと、TOEICの勉強ばかりしていた。勉強時間を振り返ると、およそ1700時間、凄すぎ、暇すぎ。

2017年4月 〜 2018年3月 AIブームに便乗して復活

復職するためには、プログラミングともう一度向き合う必要があり、少しずつプログラミングの勉強をはじめた。世は、第4時機械学習ブーム到来。私も、世の中の流れに乗って、機械学習を勉強し始めた。有り余る時間を使って、MOOCでディープラーニングを勉強した。それでも時間があまり、強化学習をしたり、データサイエンスしたり、Kaggleや DeepAnalyticsをした。

8月、ようやく復職。なんとか、復活しました。復職後は、窓際な仕事でまったり過ごすかと思ったら、うつ病をぶり返しかねない激務な環境に放り込まれる。データサイエンティスト養成講座に通って、ほそぼそとデータサイエンスの勉強は続ける。仕事がはじまったら、忙しさに飲み込まれてほとんど勉強できてない。

おわりに

まとめると、成長のためのイベントは3つあったと思う。

  • ブログをはじめたこと
  • MOOCをはじめたこと
  • 休職したこと

プログをはじめたことで、勉強の習慣ができた。MOOCをはじめてコンピュータ・サイエンスをがむしゃらに勉強することで、遅れてスタートしたキャリアがなんとか人並みに追いつくことができた?そして、休職して復職したことで、方向性を変え、今までなんのために勉強してきたのかを振り返り、目的を持って勉強するようになった。

どうすれば成長できるかは、将来の事なんてわからないし、その時の運もあると思うけれども、恐れずにこれからも頑張っていきたい。努力することだけは忘れずにしたい。