fuzzy study

仕事・趣味で勉強したことのメモ

2018年の振り返り(AI・AWS・AR)と今年の目標

2018年を振り返って、取り組んだこと、学んだこと、などを、技術観点で棚卸ししておこうと思います。

AI編

AIブームにあやかり、昨年に引き続きAI系の仕事に関わってきました。
AIっていうけど要は機械学習のPoCです。

2017年の夏ごろから2018年の3月までは、Tensorflowを使って基本的なMLPAPI化したり、 AutoEncoderやLSTMを使ったデータ分析の勉強をしたりしていました。
2018年4月からは、chainerで実装された画像認識系モデルを使って推論かけたりしていました。

主に技術的要素について経験したことを振り返ります。

機械学習

最小二乗法からはじまり、DeepLearningについてもMLP、CNN、RNN、AutoEncoderの基礎理論の勉強と実装をしました。
もともと画像認識系のことを大学院の研究で行っていたこともあり、ある程度は知っているつもりでしたが、だいぶ浅かったです。。
今年、仕事でも関わりつつ何冊か本を読んだので、入門書に載っている内容程度なら会話が成り立つくらいには経験できたと思います。

理論的なことでいまだに疑問がぬぐえていないのが、 ニューラルネットワークに入力するデータは、連続値データとカテゴリカルデータが混ざっているケースが多々あるが、それでよいのか、ということ。 これはやはり専門家に聞いてみたいものなのですが、例えばAutoEncoderで異常検知的なことをしたいとして、値域として0~10000を取る次元と、5パターンの値を取るカテゴリカルデータをone-hotにした次元(5つ)を、同じベクトルにくっつけて入力して、意味のある学習が行えるものなのか?ということです。
前処理として正規化したり、ニューラルネットワーク側でBatchNormalizationしたりはするとしても、どうも何とも言えない違和感があるんですよね。
特に最後に異常の度合いを測るとき、連続値とカテゴリカルデータは本来異なる定義が必要なのに単純に出力ベクトルのノルムで測りがちで、いいの?と思うんですよね。
なんかご存知の方いたら教えてほしいです。

しかし、こういった理論的なこと含め、新たなモデルを作るレベルの取り組みは、単に機械学習の基礎を理解してフレームワークで実装できる程度ではなく、より高度な理論背景理解と実装力が必要だと感じています。
自分のレベルだと、デファクトになっているモデルをリファレンス見ながら実装してみる程度までなので、最新の論文を理解してその通りに実装して効果を確かめるとかいったレベルに達するには継続的な勉強と経験が必要だと思いました。

機械学習関連で読んだ書籍

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

DeepLearning以前に機械学習の基本を学ぶために読みました。大変読みやすい文章で理解が進みました。 詳しい数式での解説はコラムに分けられているのも、レベルを調整しながら読めたので好印象でした。

まずはこの一冊から 意味がわかる統計解析 (BERET SCIENCE)

まずはこの一冊から 意味がわかる統計解析 (BERET SCIENCE)

ずっと前に統計を勉強しようと買った本だったのですがずっと積読していて、今だと思って読みました。 統計検定2級くらいの内容なのだと思います(受けてないけど)。検定とかあまり実務で使うことはないのでなかなか身にはつきにくいですが、この本のおかげでおおよそ統計の基礎を把握できました。

いわずと知れたDeepLearning入門書ですね。こういった、フレームワークを使わずにスクラッチで書くことで原理を理解するタイプの本は、しっかり理解したいトピックの入門には最適だと思います。
本書ではRNNには触れられていないので、続編のゼロから作るDeep Learning②ー自然言語処理編も読むとよさそうですね。私はまだ読んでません。

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

ニューラルネットワークの基礎理論に加え、AutoEncoder、CNN、RNN、ボルツマンマシンまで理論的に解説されています。
私はRNNまで頑張って数式を追って読んだものの、LSTMから数式がよくわからなくなり、ボルツマンマシンは挫折しました。。

画像認識 (機械学習プロフェッショナルシリーズ)

画像認識 (機械学習プロフェッショナルシリーズ)

画像認識として括られる物体認識や物体検出について、DeepLearning以前の手法からDeepLearningを用いた近年の手法まで順を追って説明されている良書でした。

機械学習関連でお世話になったpythonパッケージ

  • numpy
    • fancy indexingが素敵でした。
  • pandas
    • データの前処理によく使う。
    • pandas plot と言われる、可視化機能も付いている。
  • matplotlib, seaborn
    • 可視化系は他にもbokeh, plotly, holoviewsなどなどたくさんあり、一長一短という感じ。肌に合うものを選ぶのがよさそう。
    • 参考:slideship.com
  • scikitlearn
  • Tensorflow
  • chainer
  • jupyter notebook

データ分析・可視化→データ前処理→学習→(モデル保存→モデルロード)→推論、の流れのどこに何を使うか、いろいろ試して使いやすいものに慣れていくと作業が楽になりそうです。

Tensorflow

DL実装技術として、Tensorflowに触れました。
TensorflowはGoogleが開発したフレームワークで、おそらく世界的に見て現在最もよく使われているDLフレームワークなのではないでしょうか。

Tensorflowは、業務ではv1.1を使い、その後v1.7くらいまでは追っていたけど使わなくなってからは追えてないです。
Tensorflowの低レベルAPIを一通り学んだあと、Kerasを使い始めましたが、 もうKerasを使わない実装は面倒すぎて考えられないです。 TensorflowはもともとDefine and Run の書き方でしたが、今後はDefine by Run で書けるようになるEager modeがデフォルトになるようなので、Kerasと組み合わせてより使いやすいフレームワークになっていくと期待しています。 データのロードや前処理などのモデル構築以外のAPIも整理されてきているみたいですし。
もうちょっと追いたいですが、最近は業務上あまり関りがない。。

chainerは読む程度に触れましたが、Tensorflowよりわかりやすくとっつきやすい印象がありました。 chainerは日本産のDLフレームワークで、Define by Run を最初期に採用したことで有名です。 研究やPoCではこちらのほうが使いやすいと思います。
プロダクション環境になると、Tensorflowのほうが盤石な印象。 Eager mode + Kerasで書きやすくなるなら、Tensorflowに分があるかもしれないですが。

他、pytorchも気になっていたもののほぼ触れることはありませんでした。流れてくる情報を見ていると、chainerをforkして開発されたのでDefine by Run で書きやすいとか、Tensorflowより実行速度が速いとか、いい噂をいろいろ聞くので、今後注目です。

Tensorflow関連で読んだドキュメント

当時はほとんど書籍も出ていなかったので公式ドキュメントばかり読んでいました。
ものすごい速さでアップデートされたので、ついていくのに精一杯どころか完全に置いて行かれました。

また、日本だとchainerの記事が多い中、Tensorflowによく言及されているこちらのブログをよく拝見しました。 Tensorflowに限らず、機械学習関連の情報をたくさん発信してくださっていて、参考になりました。

www.hellocybernetics.tech

python

2017年夏から本格的にpythonを勉強しました。

もともとC++, Javaなどの静的型付けのコンパイル言語*1しか十分には使えなかったので、pythonで初めてスクリプト言語にがっつり入門し、いろいろ衝撃を受けました。
詳しい内容は下記記事で。 fuzzy0.hatenablog.com

pythonとR

統計・機械学習分野の言語としてはpythonとRがほとんどなわけですが、

  • python : 汎用プログラミング言語なので応用幅が広い。文法がわかりやすく、読みやすい。Rに比べ処理が速いことが多い。
  • R : 統計等の数値計算に適した言語設計であり、特化すれば学びやすい。統計分野の既存ライブラリが充実している。環境構築が簡単。

といった特徴があると感じています。(Rは他人のお手伝いでほんのちょっと触っただけですけどね。。)
Rだとread.csv/write.csvによるcsv読み書きが遅いとか、 行ごとのfor文処理が遅いので行列演算を駆使すべしとかある*2ので、書き方には要注意です。

PypeRでpythonとRを連携

pythonに慣れると、Rを使いたくなる動機は「統計分野の既存ライブラリが充実している」のでそれを使いたい、というくらいになるのですが、 PypeRというpythonパッケージを使うと、pythonとRの間でデータ授受やスクリプト・関数の呼び出しができるようになります。 メインの処理をpythonで書いて、必要な関数をPypeRでRから呼ぶようにすると便利そうです。
ただし、R側でグラフを出力するなどの描画処理をしている場合は、以下どちらかの方法を採る必要がありそうです。

  • 描画に必要なデータをpython側へ持ってきてpythonで描画(持ってくるときにR知識が結構必要になるかも)
  • R側で描画したデータを画像として保存

MLOps

機械学習を軸としたシステムの運用を回す取り組みや仕組みを、DevOpsに倣いMLOpsというらしいです。
今後はPoCにとどまらず、実際にシステム導入して運用を検討するフェーズに入る企業も多いことと思いますので、 MLOpsに関する話題はこれから増えていくと思います。

個人的に今後MLOpsで議論のポイントになりそうだなあと思うことは以下の点です。

  • オンプレとクラウドどちらを採るか
    • ことDeepLearningはマシンリソースが大きくなりがち、かつGPUの高可用性設計などこなれていないノウハウが必要となるので、オンプレはハードルが高い印象。
    • セキュリティ面の懸念をクリアし、クラウドにシフトしていく流れが主流になるのではないか。
  • 学習データと学習済みモデルの管理の仕組み
    • どの期間のデータを使って、どのくらいの頻度で、どのくらいの時間をかけて学習するのか。学習済みデータの保持期間はどうするか。精度が悪いときはフォールバックできるようにするのか。などなど
    • 各システム個別の一番のチューニングポイントになりそう。
    • 機械学習アルゴリズム・性質も理解していないと設計できないポイントなので、高い技術が求められそう。

AWSなどクラウドサービスでは、機械学習関連機能をAPI的に使えるサービスに加え、 自前のモデルを学習してサービスとしてAPI提供する基盤を作るところまでを一気通貫に効率化するサービスも提供しています。(AWSのSageMakerなど)
自前でやるのはめんどうなので魅力的なサービスだと思っています。

その他の取り組み

AWS

AWSの資格であるAWSソリューションアーキテクトプロフェッショナル(AWS SAP)を取得しました。

AWSについては本格的な仕事で関わったことがあるわけではないのですが、社内のちょっとした取り組みで使ったのと、 もともとインフラエンジニアとして仮想化基盤周りに関わっていたので、興味があったという感じです。

AWS、というかクラウドは、今特に話題なのはハイブリッドとサーバレスだと思います。
AWSのいいところはアプリ開発者目線でインフラをよく知らなくても組めるサービスが次々と出てくるところで、 特にサーバレスアーキテクチャはほぼインフラを気にする必要なくシステムが組めるのでワクワクします。 私は主にインフラエンジニアとして業務に関わってきましたが、 今後はフロントエンドもちゃんとやってサーバレスでシステムくみたいですね…

今、サーバレス関連で下記書籍を読んでいます。学んだことをブログにも随時上げていきたいと思っています。

VR/AR

これもAWSと同じで本格的な仕事で関わったことがあるわけではなく、社内のちょっとした取り組みでUnityとHololens、ARCoreに触れました。

HololensについてはHoloAcademyで一通り操作を学びました。

docs.microsoft.com

Unityは以下の本で学びました。

Unityの教科書 Unity 2017完全対応版

Unityの教科書 Unity 2017完全対応版

作ったアプリは

です。

Unityの基本的な使い方は把握できました。
学生のときはOpenGLOpenCVARToolkitとか使ってC++で頑張ってアプリ作ってたので、Unityの高機能さには驚きました。いい時代です。

振り返りまとめ

来年も機械学習に関わっていくかはわかりませんが、機械学習理論と実装の基礎を身につけられたし、AIに対する市場の期待感や開発環境面の事情を体感することもできたので、いい経験ができた一年でした。

クラウドついては、AWSに限らず関わっていきたいです。特にサーバレスアーキテクチャはしっかり取り組んで身につけたいです。

ARはエンタープライズとしてはまだ市場が見えないですが、趣味で薄く長く取り組んで行きたいです。ちょっとしたゲームとか作りたいな。

今年の目標

  • TOEIC 800点
  • ブログを月8本書く
  • Androidアプリを作れるようになる
    • ストアに上げられるようなアプリを2つ作る
  • MLOpsについて掘り下げて要素技術を身に着ける
    • きっと掘り下げていくとサーバレスやマイクロサービスに行き着くはず
  • 読書を月1冊し、感想を書く

がんばります。

*1:型については「強い型付け」「弱い型付け」って言葉を知った! – Chomado – Madoka Chiyodaが詳しかったです。

*2:これはpythonでnumpyやpandas使ったりしても同じですが、「遅い」のスケールが違いました