未経験から機械学習エンジニアになって1年目にやったこと(今からエンジニアになろうとしてる人へ)

Yutaka_kun
LSC PSD
Published in
Jul 13, 2020

最近エンジニアの養成スクールの宣伝がやたら多くて、、、自分も手に職をつけるためにやってみようかなーと思ってる人もおおいと思います。
私は未経験(以前は病院勤務)でIT企業に転職しました。就業して1年とちょっとが経ちましたが、これまでの道のりがどんなものだったのか少し振り返ってみようと思います。これを読んで順をおって手を動かしていけば普通に誰でも機械学習エンジニアになれる、、、はず、、たぶん、、、

あとAIには興味あるんだけど、ぶっちゃけどんなものなのか、、どんなことができるのかよくわからない人はなんとなく触りがわかると思います。
一応画像系の機械学習を主に扱っているので、画像寄りの内容になってしまいますが悪しからず。

この1年でしてきたことをざっくり書くと
C#研修

kaggleのコンペに参加


手書き文字認識AI作成

犬猫画像分類(classification)AI作成

メンバーで技術ブログ開設

メンバーでGitHub上で共同開発

論文翻訳
です

入社1〜2週間でC#を習う

機械学習をやるのにpythonという言語を使います。でもその前に研修としてC#という言語を用いてif文やfor文、配列の基本的な扱い方を習いました。WindowsのVisualStudioというアプリケーションを使ってひたすら画像処理の問題をときました。画像をグレースケールにしたり、フィルターをかけて画像の縦のラインや横のラインを強調する画像を作成したり。とにかく一日中画像をいじくりまわしました。

カラー画像→グレースケール→横強調画像

ちなみにVisualStudioはWindowsのパソコンにはデフォルトで入っていないらしいので自分でインストールが必要です。このインストールが結構面倒くさいらしいのですが、上司のパソコンを譲り受けたので最初から入ってました。

kaggleに参加してみる

kaggleとは世界中の機械学習・データサイエンスに携わっている約40万人が集まるコミニティーです。最大の目玉は「Competetion(コンペ)」で、企業や政府がコンペ形式(競争形式)で課題を提示し、賞金と引き換えに最も精度の高い分析モデルを買い取るという、最近でいう一種のクラウドファンディングに近いような仕組みになっています。私はkaggleの入門編に当たる
Titanic : Machine Learning from Disaster
(意訳:タイタニック号:災害からの機械学習)
のコンペ挑戦しました。

ちなみにこのタイタニックのコンペは機械学習は使わずにif文の条件分岐だけで挑みました。細かくif文で条件を設定してあげるだけで80%の精度をクリアできます。(確か「女の人が生き残って、男の人は死亡」という条件分岐だけでも70%をクリアできたはずです)

pythonでミニマムなAIを作ってみる

研修が終わって上司から「じゃあpythonを使ってkerasの中に入っているMNIST手書き文字を認識できるAIを作れ」と言われました。
おそらくみなさん何を言っているのかちんぷんかんぷんだと思いますが、、、安心してください、私もちんぷんかんぷんでした。

まず最初にやったのはpythonを扱える環境がなかったので、その環境構築からです。私はAnacondaを使いました。これは解説ページなどを読んでやれば比較的簡単にインストールできると思います。ただ少し容量が大きいのであまり容量を取られたくないということであればminicondaがおすすめです。
無事インストールができたら、AIの動作に必要なモジュール(道具)を適宜コマンドライン(よくハッカーとかが使ってそうな黒い画面のやつ)でインストールしていきます。使い方はネットで調べれば簡単にわかります。

環境が整ったら実際にAIを作っていきます。ここで初めて数学の知識(数Ⅲ Cで出てくるような偏微分や行列)が必要になりました。ニューラルネットワークについても色々勉強しましたが、誤差逆伝播法の理解に1番時間が(約1ヶ月)かかりましたね。この辺の奮闘記は

MNIST文字認識ニューラルネットワークを手書きでゴリゴリ書いてみる

誤差逆伝播(back_propagation)って手書きで書いたらどうなんの???

にまとまってます。ソースコードもGitHubに載せてあるのでAnacondaにコピペして実行すれば実際に動かすことができます。

ミニマムAIを作って感じたこと

巷では2045年までに量子コンピューターの発達によって計算速度が早くなり、ディープラーニングによってシンギュラリティが起きてコンピューターが人間の頭脳を超えると言われていますが、、、、果たしてそうなのか??と
コンピューターは計算機であって計算機ができるのは数学用語を用いてできることだけに限られるわけで、、、、
数学ができるのは論理と確率と統計だけなので、その3つを使って人間の脳を還元することはできないんじゃないかと感じました。

犬猫画像を分類してみる

kerasやtensroflowというライブラリを使って犬猫画像を分類(classification)しました。kerasやtensroflowとはディープラーニングのベースとなっている数学的理論の部分をゼロから開発せずとも、比較的短いソースコードで実装することができます。
MNISTの手書き文字認識の時に何百行と書いたコードがたった数行でかけます。手順がpython初心者が作る、犬猫認識AIに載せてあります。こちらもコピペすれば動かすことができます。

ただし、、簡単に書くことはできますがハイパーパラメータ(学習させる前の初期設定みたいなもの)の設定は自分でやらないといけません。これをうまくやらないとAIがちゃんと学習してくれません。いまだに私はここの調整が苦手です。最近はoptunaという自動でハイパーパラメータの調整をしてくれるものも開発されていますが、自分で調整できるに越したことはないですね。

Outoutを意識しながら知識をInputしていく

私が所属する部署で
「Outputを想定しないとちゃんとしたInputはできない」
という話になり、このLSC Tech Blogが始まりました。メンバー全員が2週間に1回、技術ブログを更新しています。必ず記事にしなきゃいけないという制限があると、Inputの真剣さが違いますね。
2週間に1記事とはいえ結構きついです。まずは他の人が食いつきそうなネタ(もとい、他の人にとって有益な情報)を探してきて、そのネタを深堀りし、理解した後でだれにでもわかりやすい記事にまとめるというのはなかなか骨が折れる作業です。

GitHubを使って開発を始める

メンバーで話し合い
「誰でも簡単にAIを触れるようなモデルを作る」
ことになりました。
それがGitHub上で作成したModeLIbです。

【LSCのGitHubのページに移動したら、まず何も考えずに右上の★ボタンを押しましょう!きっと幸せになれるはずです

kerasの使い方はこちら
pytorchの使い方はこちら
にのっています。

GitHub上で複数人での共同開発はメンバー全員がかなり手こずりました。なぜなら、まず最初にGitHub用語をわかっていないとGitHubの操作法を読んでも意味が理解できないからです。”リポジトリ”、”クローン”、”フォーク”、”プッシュ”、”プルリクエスト”、”マージ”などなど、、、、
そしてコマンドプロンプトを用いてGitHubサーバーに自分パソコン上で作成したコードをアップロードするのですが、その操作法も最初はちんぷんかんぷんです。ちなみに僕はコマンドプロンプトでやる方法は諦めました。コマンドラインを使わずにファイルをアップロードするにはGitHubDesktopというアプリケーションを使うことでも可能です。
ただそれでも慣れるまでに1回は発狂します。

GitHubDesktopの使い方はここにまとめておきました。

論文読解

まだまだ読む量は少ないですが、一本論文を読破するだけでも全然景色が変わります。多くの開発者があの手この手で既存の物を改善しようとしているのがよくわかります。いつもお手軽に使っているライブラリーの中身がちゃんと理解できるので、絶対読んだ方がいいです。
私が論文を翻訳してわかりやすく記事にしたので、以下もぜひのぞいてみてください。

ResNetの論文翻訳
ResNeXtの論文翻訳
Xceptionの論文翻訳
DenseNetの論文翻訳

最後に

合間合間に他社様からの受託開発案件もやってはいたんですが、大筋はこんなところです。優秀な皆さんなら気合いさえあればもっと短期間で独学でいけるはずです。
またエンジニアに転職を考えてる人に参考になったかわかりませんが、以下の点も追加で伝えておきたいと思います。

・一日中だれとも会話することなくパソコンに向かっているのが苦にならない
(パソコン作業中心で、他人との会話はチャットで済ますことが多い)
(バグにはまってしまうと1週間全く進まないこともある)

・基本プログラミングは独学で勉強していくことを覚悟すること
(大学までの授業のように知識を体系的に吸収していくというよりかは、いま自分が作成したいプログラムに必要な部分をとにかく勉強して完璧に使いこなしていくイメージ)
(会社によって異なるが、研修プログラムを長期で計画してくれるところは少なく、何より新人をそんなにゆうちょに育ててられない。基本ほったらかし)

・数学的考え方ができる
(いろんな処理をする関数をいくつも組み立てていくので、ある程度の骨組みが頭の中でイメージできる)
(最終目的地から逆算して、必要な道具(関数やライブラリ)を考え、無駄のないようになるべくシンプルで早い処理を心がける)

また上司によると、やはりプログラミングには少なからずセンス(プログラミング適性)みたいなものがあって、それがないとどうにもならない人がいるみたいです。プログラムを教える講師の方が

『プログラミングの面白いところは、、授業を毎回最前列で聞いてノートをとっている人が最終的に上達するわけではないんです。ぼーっと聞いてる人がある日突然ものすごいスピードでできるようになったりするんです』

とおっしゃっていました。真面目に取り組めばできるようになるってものでもないのかもしれません。
なので勢いでこの世界に飛び込む前にプログラミングスクールなんかに行って、一度自分の適性を見たほうがよさそうです。

そして一番伝えたいのはエンジニアというのは

好きじゃないと、、しんどい

です。
それを理解したうえで、IT方面の転職は考えた方がいいです。
つたない文章で読みにくく申し訳ありませんが、私からは以上になります。
幸運を。

--

--

Yutaka_kun
LSC PSD
Editor for

Microbiology technician,Machine learning engineer(beginner)